Как добавить «очистить» в качестве опции в меню диапазонов? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую плагин jQuery daterangepicker (http://www.daterangepicker.com/)) и хотел бы узнать, добавил ли кто-нибудь или может выяснить, как добавить параметр «Очистить» в меню диапазонов, который при выборе, очищает введенное значение?

Используя основной текстовый ввод:

<input type="text" name="txtDateRange" id="txtDateRange" value="" />

С этим кодом реализации:

    $('#txtDateRange').daterangepicker({
        startDate:  moment().subtract(29, 'days'),
        endDate: moment(),
        ranges: {
           'Today': [moment(), moment()],
           'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
           'Last 7 Days': [moment().subtract(6, 'days'), moment()],
           'Last 30 Days': [moment().subtract(29, 'days'), moment()],
           'This Month': [moment().startOf('month'), moment().endOf('month')],
           'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
           'Clear' : []
        }
    });

Создает этот результат:

enter image description here

Как я могу привязаться к любому событию, которое использует плагин, когда опция менювыбран, так что я могу просто установить значение ввода текста в пустую строку, когда выбран пункт меню «Очистить»?

== ОБНОВЛЕНИЕ ==

Обязательноиспользуйте обновленное решение в выбранном ответе. Отлично работает!

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете использовать функцию обратного вызова (второй необязательный параметр), чтобы очистить ввод, если start и end являются недопустимыми датами, и передать в массиве два значения, которые недопустимы для moment.js:

$('#txtDateRange').daterangepicker({
  startDate: moment().subtract(29, 'days'),
  endDate: moment(),
  ranges: {
    'Today': [moment(), moment()],
    'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
    'Last 7 Days': [moment().subtract(6, 'days'), moment()],
    'Last 30 Days': [moment().subtract(29, 'days'), moment()],
    'This Month': [moment().startOf('month'), moment().endOf('month')],
    'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
    'Clear': ['', '']
  }
}, function (start, end) {
  if (!start._isValid && !end._isValid) {
    setTimeout(() => {
      $('#txtDateRange').val('').trigger('change');
    })
  }
});
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />

<input type="text" name="txtDateRange" id="txtDateRange" value="" />

Вы можете использовать любые два недопустимых значения в качестве даты: [null,null], но не [undefined,undefined], так как момент undefined по умолчанию равен moment(), то есть now, поэтому ._isValid.

Вы можете увидеть использование обратного вызова на странице примеров .


Обновление. Лучший UX и общая производительность (метки):

$('#txtDateRange').daterangepicker({
  startDate: moment().subtract(29, 'days'),
  endDate: moment(),
  ranges: {
    'Today': [moment(), moment()],
    'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
    'Last 7 Days': [moment().subtract(6, 'days'), moment()],
    'Last 30 Days': [moment().subtract(29, 'days'), moment()],
    'This Month': [moment().startOf('month'), moment().endOf('month')],
    'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
    'Clear': [,]
  }
}, function (start, end, label) {
  if (label === 'Clear')
    setTimeout(() => {
      this.setEndDate(this.endDate[
        this.endDate.valueOf() - this.startDate.valueOf() > 1440 ? 'subtract' : 'add'
      ](1,'days'));
      $(this.element).val('');
    })  
});
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />

<input type="text" name="txtDateRange" id="txtDateRange" value="" />
...