Концепция startRange и endRange

Механизм startRange и endRange в Pikaday используется для реализации выбора диапазона дат, где календарь перестаёт быть просто одиночным селектором и начинает работать как инструмент выделения интервала между двумя точками времени. Эта концепция лежит в основе range-режима и определяет поведение визуального выделения, логики выбора и внутренних состояний календаря.

Диапазон дат в Pikaday строится вокруг двух опорных значений:

  • начальная дата диапазона (startRange)
  • конечная дата диапазона (endRange)

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

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

Поведение startRange

startRange определяет левую границу диапазона. Это первая выбранная дата, с которой начинается построение интервала.

Основные свойства поведения:

  • фиксируется при первом клике пользователя по календарю
  • служит опорной точкой для дальнейшего расширения диапазона
  • визуально выделяется как начало интервала
  • может временно существовать без endRange

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

Внутренняя логика сравнения строится на проверке:

  • все даты после startRange считаются потенциальным продолжением диапазона
  • все даты до него — игнорируются в контексте расширения, но могут использоваться при изменении направления выбора

Поведение endRange

endRange определяет правую границу диапазона и завершает формирование интервала.

Основные свойства:

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

После установки endRange диапазон считается завершённым, и календарь переходит в состояние фиксированного выделения.

Отношение между startRange и endRange

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

Если пользователь выбирает дату раньше уже установленного startRange, логика может:

  • либо переназначить startRange
  • либо переместить границы местами
  • либо начать новый диапазон

Конкретное поведение зависит от реализации обработчика onSelect и дополнительных настроек логики диапазона.

Условная нормализация выглядит следующим образом:

  • если startRange > endRange, значения меняются местами
  • диапазон всегда приводится к виду: startRange ≤ endRange

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

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

Типичная визуальная логика включает три состояния ячеек:

  • дата совпадает с startRange — начало диапазона
  • дата совпадает с endRange — конец диапазона
  • дата находится между ними — промежуточное выделение

Дополнительно используется подсветка при наведении курсора, когда endRange ещё не задан. В этом случае вычисляется временный диапазон:

  • startRange фиксирован
  • текущая наведённая дата выступает как условный endRange

Это позволяет пользователю видеть предварительный результат выбора.

Алгоритм формирования диапазона

Процесс выбора диапазона можно описать последовательностью состояний:

  1. Первичный клик:

    • startRange = выбранная дата
    • endRange = null
  2. Наведение:

    • вычисляется временный диапазон
    • выполняется сравнение дат
    • подсвечиваются промежуточные элементы
  3. Второй клик:

    • endRange = выбранная дата
    • диапазон фиксируется
  4. Повторный старт:

    • при новом выборе состояние сбрасывается
    • начинается новый диапазон

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

Обработка пересечения дат

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

  • вычисляется минимальная дата → становится startRange
  • вычисляется максимальная дата → становится endRange

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

Интеграция с onSelect

Событие onSelect в Pikaday часто используется для синхронизации диапазона с внешним состоянием.

В контексте startRange и endRange оно позволяет:

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

Логика обработки обычно опирается на проверку:

  • если существует только startRange, выбор не завершён
  • если существуют обе границы, диапазон считается завершённым

Взаимодействие с CSS-классами

Для визуального разделения состояний используются классы, привязанные к диапазону:

  • класс для начала диапазона (start-range)
  • класс для конца диапазона (end-range)
  • класс для промежуточных дат (in-range)

Каждый класс назначается динамически при рендеринге ячеек, исходя из сравнения текущей даты с startRange и endRange.

Особенности работы с частично заданным диапазоном

Состояние, при котором установлен только startRange, является ключевым для интерактивности.

В этом режиме:

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

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

Типичные ошибки реализации

При работе с диапазоном часто возникают логические ошибки:

  • отсутствие нормализации порядка дат
  • смешивание логики хранения и отображения
  • неправильная обработка повторного выбора startRange
  • некорректная очистка состояния endRange

Корректная реализация требует строгого разделения:

  • состояние данных (startRange, endRange)
  • вычисление промежуточных дат
  • визуализация диапазона

Модель состояния диапазона

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

  • EMPTY — ни одна дата не выбрана
  • START_SELECTED — установлен startRange
  • RANGE_COMPLETE — установлены обе границы

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