Параметр disableWeekends

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

При включении данного параметра календарь визуально сохраняет все дни месяца, однако выходные становятся неактивными. Это выражается в изменении их состояния: такие даты нельзя выбрать ни кликом мыши, ни с клавиатуры, а также они исключаются из логики автозаполнения и программного выбора даты.

Логика фильтрации выходных дней

Внутри Pikaday выходные определяются через стандартный механизм Date.getDay(), где:

  • 0 — воскресенье
  • 6 — суббота

Параметр disableWeekends фактически активирует проверку:

function isWeekend(date) {
    var day = date.getDay();
    return day === 0 || day === 6;
}

При установке disableWeekends: true библиотека добавляет этот фильтр в процесс рендеринга каждого дня календаря. Если дата попадает под условие выходного дня, она помечается как недоступная.

Базовое использование

Наиболее простой сценарий применения параметра заключается в передаче его при инициализации календаря:

var picker = new Pikaday({
    field: document.getElementById('date'),
    disableWeekends: true
});

В этом случае все субботы и воскресенья автоматически блокируются для выбора.

Влияние на интерфейс

При включённом disableWeekends изменяется поведение UI-компонента:

  • выходные дни получают визуальное состояние disabled;
  • курсор при наведении не активирует подсветку выбора;
  • клик по таким датам не вызывает событие onSelect;
  • навигация с клавиатуры пропускает недоступные дни.

В зависимости от CSS-стилей проекта, заблокированные даты могут отображаться с пониженной контрастностью, серым цветом или перечёркиванием, однако сама библиотека отвечает только за установку класса состояния, например is-disabled.

Взаимодействие с другими параметрами

minDate и maxDate

При совместном использовании с minDate и maxDate фильтрация работает последовательно. Сначала применяется ограничение диапазона, затем исключаются выходные:

var picker = new Pikaday({
    field: document.getElementById('date'),
    minDate: new Date(2026, 0, 1),
    maxDate: new Date(2026, 11, 31),
    disableWeekends: true
});

Если дата попадает в диапазон, но является субботой или воскресеньем, она остаётся недоступной.

disableDayFn

Параметр disableWeekends часто используется совместно с disableDayFn, который позволяет задавать произвольную логику блокировки дат. При наличии обеих опций логика объединяется:

  • disableWeekends автоматически блокирует субботу и воскресенье;
  • disableDayFn добавляет пользовательские условия.

Пример комбинирования:

var picker = new Pikaday({
    field: document.getElementById('date'),
    disableWeekends: true,
    disableDayFn: function(date) {
        // дополнительно блокируем 13 число каждого месяца
        return date.getDate() === 13;
    }
});

В результате недоступными становятся как выходные, так и указанные пользовательские даты.

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

Хотя логика определения выходных дней основана на ISO-стандарте (суббота и воскресенье), визуальное отображение календаря может меняться в зависимости от параметров локализации (i18n, firstDay).

Например, при установке первого дня недели на понедельник:

firstDay: 1

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

Поведение при программном выборе даты

При использовании метода setDate() или setDate(new Date()) библиотека не всегда блокирует установку выходного дня программно. Поведение зависит от конфигурации и версии:

  • при стандартной конфигурации дата может быть установлена даже если она является выходным;
  • UI при этом не выделяет её как выбранную в интерактивном смысле;
  • при последующем взаимодействии пользователь не сможет изменить выбор на выходной день.

Для строгой блокировки рекомендуется комбинировать disableWeekends с дополнительной проверкой перед установкой даты:

function safeSetDate(picker, date) {
    var day = date.getDay();
    if (day === 0 || day === 6) {
        return;
    }
    picker.setDate(date);
}

Кастомизация внешнего вида заблокированных дней

Pikaday добавляет CSS-классы к элементам календаря, что позволяет гибко управлять их отображением:

.is-disabled {
    opacity: 0.4;
    pointer-events: none;
}

Для выходных дней, заблокированных через disableWeekends, обычно применяется тот же класс, что и для других недоступных дат. Это упрощает стилизацию, так как не требуется различать причины блокировки.

Влияние на производительность рендера

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

  • вычисление getDay() является дешёвой операцией;
  • влияние на рендеринг минимально даже при больших диапазонах дат;
  • дополнительная нагрузка возникает только при сочетании с множеством пользовательских правил (disableDayFn).

Таким образом, disableWeekends не является значимым фактором замедления даже в высоконагруженных интерфейсах.

Типичные сценарии использования

Параметр часто применяется в следующих ситуациях:

  • корпоративные системы планирования встреч;
  • формы записи на услуги с рабочими днями;
  • бронирование ресурсов с ограниченной доступностью;
  • финансовые системы, где операции выполняются только в будни;
  • внутренние CRM-инструменты.

Во всех этих сценариях выходные считаются нерабочими периодами, и их исключение упрощает бизнес-логику на уровне интерфейса.

Ограничения подхода

Несмотря на удобство, использование disableWeekends имеет ряд ограничений:

  • не учитывает праздничные дни;
  • не адаптируется под региональные календари с нестандартными выходными;
  • требует дополнительных правил для сложных графиков работы;
  • не заменяет серверную валидацию даты.

Поэтому в системах с критичной логикой выбора даты этот параметр рассматривается как UI-уровень фильтрации, а не как полноценный механизм валидации данных.