Работа с фильтрацией дат в Flatpickr строится вокруг механизма
ограничения доступного диапазона, динамического исключения отдельных
дней и программного управления списками разрешённых значений. В основе
лежит система конфигураций enable, disable, а
также методы изменения состояния экземпляра после инициализации.
Фильтрация в Flatpickr реализуется через декларативные правила, задаваемые при инициализации календаря. Основные параметры:
minDate — минимально допустимая датаmaxDate — максимально допустимая датаdisable — список запрещённых дат и правилenable — список разрешённых дат и правилМинимальный и максимальный диапазон часто используется как первый уровень фильтрации:
flatpickr("#input", {
minDate: "2026-01-01",
maxDate: "2026-12-31"
});
Такой подход ограничивает выбор только заданным интервалом, исключая все остальные даты без дополнительной логики.
Параметр disable позволяет явно исключать отдельные дни
или диапазоны. Он поддерживает разные форматы: строки, массивы и
функции.
flatpickr("#input", {
disable: [
"2026-01-10",
"2026-01-15",
"2026-01-20"
]
});
flatpickr("#input", {
disable: [
{
from: "2026-02-01",
to: "2026-02-10"
}
]
});
Наиболее гибкий вариант — передача функции:
flatpickr("#input", {
disable: [
function(date) {
return date.getDay() === 0 || date.getDay() === 6;
}
]
});
В данном случае исключаются выходные дни, вычисляемые динамически на
основе объекта Date.
Если требуется определить не исключённые, а строго разрешённые даты,
используется enable. Этот режим инвертирует логику:
flatpickr("#input", {
enable: [
"2026-03-01",
"2026-03-05",
"2026-03-10"
]
});
При использовании enable все даты, не попавшие в список,
автоматически блокируются.
Функциональный вариант:
flatpickr("#input", {
enable: [
function(date) {
return date.getDate() % 2 === 0;
}
]
});
Здесь доступны только чётные числа месяца.
При одновременном использовании приоритет обычно отдаётся
disable. Это позволяет задать базовый разрешённый набор и
дополнительно исключить проблемные даты.
flatpickr("#input", {
enable: [
{
from: "2026-01-01",
to: "2026-12-31"
}
],
disable: [
"2026-05-01"
]
});
Такой подход часто применяется в системах бронирования, где существует общий сезонный диапазон и отдельные исключения.
Фильтрация может изменяться после инициализации. Для этого
используется метод setOptions:
const fp = flatpickr("#input", {
minDate: "today"
});
fp.set("disable", [
"2026-06-10",
"2026-06-11"
]);
Изменение конфигурации не требует пересоздания экземпляра, что важно для интерфейсов с частыми обновлениями правил доступности.
Функциональные фильтры позволяют реализовывать сложные сценарии:
flatpickr("#input", {
disable: [
function(date) {
const day = date.getDay();
const dateNum = date.getDate();
const isWeekend = day === 0 || day === 6;
const isFirstTenDays = dateNum <= 10;
return isWeekend || isFirstTenDays;
}
]
});
const holidays = ["2026-01-01", "2026-12-31"];
flatpickr("#input", {
disable: [
function(date) {
const iso = date.toISOString().slice(0, 10);
return holidays.includes(iso);
}
]
});
Такой подход часто применяется в корпоративных календарях и системах планирования ресурсов.
Фильтрация может зависеть от данных, получаемых из API:
fetch("/api/unavailable-dates")
.then(res => res.json())
.then(disabledDates => {
flatpickr("#input", {
disable: disabledDates
});
});
При изменении данных календарь автоматически адаптируется к актуальному состоянию доступности.
При больших наборах дат использование функций без оптимизации может приводить к снижению производительности. Эффективный подход — предварительная подготовка множества:
const disabledSet = new Set([
"2026-01-10",
"2026-01-11",
"2026-01-12"
]);
flatpickr("#input", {
disable: [
function(date) {
const iso = date.toISOString().slice(0, 10);
return disabledSet.has(iso);
}
]
});
Проверка через Set обеспечивает константную сложность
доступа.
Фильтрация часто комбинируется с выбором диапазона дат:
flatpickr("#input", {
mode: "range",
disable: [
function(date) {
const day = date.getDay();
return day === 0;
}
]
});
В этом случае система предотвращает выбор диапазона, содержащего запрещённые дни.
Для визуальной фильтрации без полного блокирования используется
onDayCreate:
flatpickr("#input", {
onDayCreate: function(dObj, dStr, fp, dayElem) {
const date = dayElem.dateObj;
if (date.getDay() === 0) {
dayElem.classList.add("disabled-visual");
}
}
});
Этот механизм позволяет отделить визуальные ограничения от логики выбора.
При построении сложных фильтров важно учитывать порядок обработки:
minDate / maxDateenabledisableФактический результат определяется пересечением всех условий, где любое запрещающее правило имеет приоритет над разрешающим.
При работе с тысячами дат используется предварительная агрегация данных:
function createDateKey(date) {
return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate();
}
const disabledMap = {
"2026-07-01": true,
"2026-07-02": true
};
flatpickr("#input", {
disable: [
function(date) {
return disabledMap[createDateKey(date)];
}
]
});
Такая схема снижает нагрузку при рендеринге календаря и ускоряет интерактивную работу интерфейса.
При изменении бизнес-условий требуется обновление фильтров без перезапуска компонента:
function updateAvailability(fp, newDisabled) {
fp.set("disable", newDisabled);
fp.redraw();
}
Метод redraw обновляет отображение календаря,
синхронизируя визуальное состояние с новой логикой.
Фильтрация может зависеть от текста в инпуте или других элементов интерфейса:
const fp = flatpickr("#input", {});
document.querySelector("#type").addEventListener("change", (e) => {
const type = e.target.value;
fp.set("disable", [
function(date) {
return type === "weekdays" && (date.getDay() === 0 || date.getDay() === 6);
}
]);
});
Такая модель используется в системах бронирования с несколькими режимами выбора.
Фильтрация на уровне календаря не заменяет серверную валидацию. Часто используется дублирование логики:
function validate(date) {
const d = new Date(date);
return d.getDay() !== 0;
}
Совпадение логики обеспечивает устойчивость к обходу клиентских ограничений.