Динамическое изменение ограничений

В Flatpickr система ограничений строится как набор реактивных параметров, которые могут изменяться во время жизни экземпляра календаря без его пересоздания. Это позволяет динамически управлять доступными датами в зависимости от внешнего состояния приложения, бизнес-логики, ответов сервера и взаимодействий между несколькими календарями.


Ключевая особенность Flatpickr — возможность обновления конфигурации после инициализации. Ограничения не фиксируются при создании экземпляра, а хранятся внутри объекта и могут быть изменены через API.

Наиболее часто изменяемые параметры:

  • minDate — минимально допустимая дата
  • maxDate — максимально допустимая дата
  • disable — список запрещённых дат или правил
  • enable — явное разрешение только определённых дат
  • enableTime / noCalendar — косвенно влияют на доступность выбора

Динамическое управление этими параметрами позволяет строить адаптивные интерфейсы календарей.


Обновление ограничений через set()

Основной механизм изменения конфигурации — метод set().

fp.set('minDate', '2026-01-01');
fp.set('maxDate', '2026-12-31');

После вызова происходит немедленное обновление состояния календаря без пересоздания DOM-инстанса. Это критически важно для производительности и сохранения текущего выбранного значения.

Изменение может быть как расширяющим, так и сужающим диапазон. В случае конфликта текущего выбранного значения с новыми ограничениями Flatpickr автоматически корректирует выбранную дату.


Динамическое управление minDate и maxDate

Изменение минимальной даты

fp.set('minDate', new Date());

Типичный сценарий — блокировка прошедших дат при оформлении заказа. При каждом открытии календаря значение может пересчитываться, например, на основе текущего времени или часового пояса пользователя.

Изменение максимальной даты

fp.set('maxDate', '2026-06-30');

Используется для ограничения горизонта планирования: бронирования, дедлайны, периоды отчетности.


Реактивное ограничение через внешние данные

Часто ограничения зависят от данных сервера. Например, API возвращает недоступные дни:

fetch('/api/unavailable-dates')
  .then(res => res.json())
  .then(data => {
    fp.set('disable', data.dates);
  });

В этом случае календарь становится отражением актуального состояния системы, а не статичной структуры.


Параметр disable: динамическое управление правилами

disable поддерживает не только массив дат, но и функции, что делает его мощным инструментом динамической фильтрации.

Обновление списка запрещённых дат

fp.set('disable', [
  '2026-05-10',
  '2026-05-11',
  '2026-05-12'
]);

Использование функции

fp.set('disable', [
  function(date) {
    return date.getDay() === 0; // блокировка воскресений
  }
]);

Функциональный подход позволяет учитывать сложные условия: праздники, загрузку ресурсов, пользовательские роли.


Динамическое переключение enable

В отличие от disable, параметр enable задаёт разрешённые даты. При изменении логики приложения может потребоваться полное переключение режима фильтрации.

fp.set('enable', [
  '2026-06-01',
  '2026-06-02',
  '2026-06-03'
]);

При наличии enable все остальные даты автоматически становятся недоступными, что позволяет реализовать whitelist-логику.


Пересчёт состояния после изменения ограничений

При изменении ограничений Flatpickr выполняет внутреннюю синхронизацию:

  • пересчитывается список доступных дней
  • обновляется навигация по месяцам
  • корректируется выбранная дата (если она стала недопустимой)
  • перерисовывается календарная сетка

Это происходит автоматически и не требует ручного обновления UI.


Сценарии зависимых календарей

Частый кейс — два связанных поля: дата начала и дата окончания.

startPicker.set('maxDate', endPicker.selectedDates[0]);
endPicker.set('minDate', startPicker.selectedDates[0]);

Такой подход предотвращает выбор некорректных диапазонов.

Дополнительно используется обработчик изменения:

startPicker.config.onChange.push((selectedDates) => {
  endPicker.set('minDate', selectedDates[0]);
});

Здесь ограничения одного календаря становятся функцией состояния другого.


Изменение ограничений при onChange

Событие onChange часто используется для каскадного обновления логики.

fp.config.onChange.push((selectedDates) => {
  const selected = selectedDates[0];

  if (selected) {
    const nextWeek = new Date(selected);
    nextWeek.setDate(selected.getDate() + 7);

    fp.set('maxDate', nextWeek);
  }
});

Таким образом ограничения становятся зависимыми от пользовательского выбора.


Динамическое управление через внешние контроллеры

В интерфейсах с фильтрами календарь часто управляется кнопками или селекторами:

document.querySelector('#reset').addEventListener('click', () => {
  fp.set('minDate', null);
  fp.set('maxDate', null);
  fp.set('disable', []);
});

Сброс ограничений возвращает календарь в исходное состояние, что полезно для сценариев поиска или фильтрации.


Комбинирование ограничений

Flatpickr допускает одновременное использование нескольких типов ограничений:

  • диапазон дат (min/max)
  • исключения (disable)
  • whitelist (enable)

При динамическом изменении важно учитывать приоритеты: если дата попадает в disable, она останется недоступной даже при наличии в enable.


Обновление без пересоздания экземпляра

Одно из ключевых преимуществ — отсутствие необходимости уничтожать календарь:

fp.destroy();
fp = flatpickr(input, config);

Вместо этого используется:

fp.set('minDate', '2026-01-01');

Такой подход снижает нагрузку на DOM и сохраняет состояние UI.


Работа с временными ограничениями

При включённом времени (enableTime) динамические ограничения распространяются и на часы/минуты:

fp.set('minTime', '09:00');
fp.set('maxTime', '18:00');

Это позволяет строить системы бронирования с учётом рабочего графика.


Ограничения на основе бизнес-логики

В реальных приложениях ограничения часто зависят от:

  • доступности ресурсов
  • лимитов пользователя
  • праздничных календарей
  • квот и расписаний

Пример динамической генерации:

function updateRestrictions(userType) {
  if (userType === 'premium') {
    fp.set('maxDate', '2027-01-01');
  } else {
    fp.set('maxDate', '2026-06-01');
  }
}

Таким образом календарь становится частью бизнес-логики, а не просто UI-компонентом.


Поведение при конфликте значений

Если новое ограничение делает текущую дату недопустимой:

  • выбранная дата автоматически сбрасывается
  • либо заменяется ближайшей допустимой (в зависимости от конфигурации)
  • UI обновляется без ошибок и исключений

Это обеспечивает устойчивость интерфейса при резких изменениях правил.


Производительность при частых обновлениях

При интенсивных обновлениях ограничений (например, при фильтрации) важно учитывать:

  • группировку вызовов set()
  • минимизацию повторных рендеров
  • использование debounce при внешних событиях

Flatpickr оптимизирован для частичных обновлений, но чрезмерные вызовы могут приводить к лишним перерисовкам календарной сетки.


Итоговая модель поведения динамических ограничений

Поведение системы можно представить как поток:

  1. изменение внешнего состояния
  2. вызов set() или обновление config
  3. пересчёт доступных дат
  4. коррекция выбранного значения
  5. перерисовка интерфейса

Эта модель делает календарь адаптивным компонентом, способным реагировать на изменения данных в реальном времени без потери состояния и без пересоздания экземпляра.