Системы бронирования строятся вокруг точного управления временными интервалами, предотвращения конфликтов и визуального отображения доступности ресурсов. Flatpickr в подобных сценариях применяется как слой пользовательского выбора дат, интегрированный с серверной логикой резервирования. Основная задача — синхронизация состояния календаря с актуальными данными о занятых периодах, правилами доступности и ограничениями бизнес-логики.
Для бронирования наиболее характерен выбор диапазона дат. В Flatpickr
это реализуется через режим range, позволяющий пользователю
задать начальную и конечную дату резервирования.
flatpickr("#booking", {
mode: "range",
dateFormat: "Y-m-d"
});
Режим диапазона формирует непрерывный интервал, который далее интерпретируется системой бронирования как единая заявка. При этом внутренняя модель Flatpickr хранит две даты: старт и финиш, что упрощает сериализацию и передачу на сервер.
В системах резервирования критически важна блокировка недоступных
периодов. Flatpickr предоставляет параметры minDate и
maxDate, задающие границы доступного календаря.
flatpickr("#booking", {
mode: "range",
minDate: "today",
maxDate: "2026-12-31"
});
Использование относительного значения "today" формирует
динамическое ограничение, исключающее выбор прошедших дат. В сценариях
бронирования ресурсов это предотвращает создание невалидных заявок
задним числом.
Наиболее важный слой логики резервирования — блокировка уже занятых
интервалов. Flatpickr поддерживает параметр disable,
принимающий массив дат или функцию-валидатор.
const bookedDates = [
"2026-06-10",
"2026-06-11",
"2026-06-15"
];
flatpickr("#booking", {
mode: "range",
disable: bookedDates
});
При статическом наборе данных календарь просто исключает указанные даты из выбора. Однако в реальных системах данные чаще формируются динамически и поступают с сервера.
Функциональная форма disable позволяет реализовать
сложную бизнес-логику проверки доступности.
flatpickr("#booking", {
mode: "range",
disable: [
function(date) {
const iso = date.toISOString().slice(0, 10);
return bookedDatesSet.has(iso);
}
]
});
Такая модель обеспечивает гибкость при обработке пересекающихся диапазонов, сезонных ограничений и временных блокировок.
В системах резервирования данные о занятости обычно загружаются асинхронно. Flatpickr инициализируется после получения информации, либо обновляется через повторную инициализацию.
fetch("/api/bookings")
.then(res => res.json())
.then(data => {
const disabled = data.flatMap(booking => {
return expandRange(booking.start, booking.end);
});
flatpickr("#booking", {
mode: "range",
disable: disabled
});
});
Функция expandRange в подобных архитектурах преобразует
диапазоны в дискретные даты, поскольку Flatpickr работает на уровне
отдельных значений календаря.
При наличии интервалов бронирования сервер часто возвращает не отдельные даты, а диапазоны. Их обработка требует нормализации:
function expandRange(start, end) {
const result = [];
let current = new Date(start);
while (current <= new Date(end)) {
result.push(new Date(current).toISOString().slice(0, 10));
current.setDate(current.getDate() + 1);
}
return result;
}
Такой подход формирует плоскую структуру, пригодную для прямого
использования в disable.
Flatpickr предоставляет хук onChange, который
используется для контроля корректности выбранного интервала. В системах
бронирования он служит для проверки пересечений и
бизнес-ограничений.
flatpickr("#booking", {
mode: "range",
onChange: function(selectedDates) {
const [start, end] = selectedDates;
if (start && end) {
validateRange(start, end);
}
}
});
Функция валидации может учитывать:
В сценариях аренды или записи на услуги часто вводится ограничение на
длину интервала. Flatpickr не содержит встроенного лимита диапазона, но
логика реализуется через проверку в onChange.
const MAX_DAYS = 7;
flatpickr("#booking", {
mode: "range",
onChange: function(dates) {
if (dates.length === 2) {
const diff = (dates[1] - dates[0]) / 86400000;
if (diff > MAX_DAYS) {
this.clear();
}
}
}
});
Механизм очистки состояния календаря используется как способ отката некорректного выбора.
Flatpickr поддерживает хук onDayCreate, позволяющий
модифицировать каждую ячейку календаря. Это используется для визуального
обозначения занятости.
flatpickr("#booking", {
mode: "range",
onDayCreate: function(dObj, dStr, fp, dayElem) {
const date = dayElem.dateObj.toISOString().slice(0, 10);
if (bookedDatesSet.has(date)) {
dayElem.classList.add("booked");
}
}
});
CSS-классы позволяют отделить визуальную логику от данных, формируя слой представления доступности.
В сложных системах бронирования ресурсы могут быть доступны только в
определённые временные окна. Flatpickr в комбинации с
enable и кастомными проверками позволяет ограничить выбор
дат по расписанию.
flatpickr("#booking", {
mode: "range",
enable: [
function(date) {
const day = date.getDay();
return day >= 1 && day <= 5;
}
]
});
Таким образом формируется календарь, зависящий от рабочих дней или расписания объекта.
При расширении бронирования до уровня времени активируется
enableTime. Это добавляет точность выбора до минут.
flatpickr("#booking", {
enableTime: true,
time_24hr: true,
dateFormat: "Y-m-d H:i"
});
В системах аренды почасовых ресурсов это позволяет переходить от дневной модели к интервальной.
Ключевой аспект резервирования — предотвращение гонок состояния. Flatpickr отвечает только за выбор, но не за подтверждение. После выбора диапазона данные проходят серверную проверку на актуальность.
Типовая схема включает:
При обнаружении конфликта сервер возвращает обновлённый список
занятых дат, который повторно применяется к disable.
Flatpickr допускает уничтожение и повторное создание экземпляра для обновления данных.
function refreshCalendar(disabledDates) {
instance.destroy();
instance = flatpickr("#booking", {
mode: "range",
disable: disabledDates
});
}
Такой подход используется при изменении глобального состояния доступности без перезагрузки страницы.
В реальных системах ограничения комбинируются:
Flatpickr в этом контексте выступает как слой отображения, где все
правила сводятся к функциям disable, enable,
onChange и onDayCreate, формируя единый
механизм управления выбором дат без встроенной бизнес-логики.