Skip to content

CdsDatePicker

Календарь для выбора даты — одной, нескольких или диапазона. Живёт прямо на странице или в выпадающем меню у поля ввода; значение — строка в заданном формате (DD.MM.YYYY по умолчанию), которую удобно хранить и передавать на сервер.

Storybook GitLab Figma
Покрытие тестами: 95% — хорошее покрытие
API в спеках
35 / 35 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
79 юнит · 2 браузерных
Известные баги
14 зафиксированы тестом it.fails
Покрытие кода
94.6% строк · 83% ветвей замер v4.0.0-alpha.13
A11y (axe)
32 рекомендаций в 16 историях замер v4.0.0-alpha.11

Если календарю нужно поле ввода, берите готовый CdsDateInput — он собирает то же самое из поля, меню и этого календаря, добавляя ручной ввод и время. Для выбора одного только времени есть CdsTimePicker.

Анатомия ​

Календарь состоит из необязательной шапки с итогом выбора, навигации по месяцу и году, сетки дней и зоны действий. Шапку включает header, кнопку «Сегодня» — today-btn, а действия добавляются в слот по умолчанию.

Вариации ​

Значение и формат ​

Выбранная дата приходит в v-model строкой в формате mask — по умолчанию DD.MM.YYYY. Повторный клик по выбранному дню снимает выбор; no-unset запрещает такой сброс, а hide-sibling-month скрывает дни соседних месяцев.

Sandbox Storybook

Шапка ​

header включает шапку с итогом выбора: заголовок показывает дату или число выбранных дней, описание — год. Тексты заменяются пропсами title и description либо одноимёнными слотами. today-btn добавляет кнопку возврата к текущему дню.

Sandbox Storybook

Диапазон дат ​

range переключает календарь на выбор периода: первый клик фиксирует начало (событие range-start), второй — конец (range-end), значение приходит объектом { from, to }. В паре с multiple можно выбрать несколько периодов.

Sandbox Storybook

Несколько дат ​

multiple разрешает отмечать отдельные даты — модель становится массивом строк.

Sandbox Storybook

События ​

events отмечает даты точками: принимает массив дат в формате YYYY/MM/DD или функцию-предикат. Цвет точки задаёт events-color — строкой либо функцией от даты, если типов событий несколько.

Sandbox Storybook

Доступные даты ​

allowed-dates ограничивает выбор: массив дат либо функция, которая получает дату YYYY/MM/DD и возвращает, можно ли её выбрать. Остальные дни отключаются.

Sandbox Storybook

Границы навигации ​

min-year-month и max-year-month (формат YYYY/MM) не дают уйти за пределы диапазона — стрелки на границе отключаются. За переходами между месяцами следите по событию navigation.

Sandbox Storybook

Стартовый вид ​

view открывает календарь сразу со списка месяцев (Months) или лет (Years) — удобно для дат, далёких от текущей. default-year-month задаёт стартовый месяц, когда модель пуста.

Sandbox Storybook

Локализация ​

locale принимает имя локали (ru | en) или собственный объект переводов; без пропа используется локаль приложения. first-day-of-week задаёт первый день недели — для en это обычно воскресенье.

Sandbox Storybook

Состояния ​

disabled отключает календарь и приглушает его, readonly сохраняет обычный вид, но блокирует и выбор, и навигацию.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Поле с датой ​

Чаще всего календарь живёт не на странице, а в меню у текстового поля. Для этого есть CdsDateInput — он уже собран из поля, меню и календаря, разбирает ручной ввод и принимает все свойства календаря напрямую. Собирайте контрол сами, только если нужна нестандартная схема: из CdsTextInput, CdsMenu с activator="parent" и календаря — так вам остаются доступны все свойства и слоты поля и меню. Маску ввода в этом случае добавьте сами: рекомендуем лёгкую (2,5 КБ) библиотеку Maska.

Sandbox Storybook

Отчётный период ​

Слот по умолчанию добавляет действия под календарём. Здесь выбранный диапазон — черновик: в отчёт он попадает только после кнопки «Применить», а «Сбросить» возвращает календарь к исходному состоянию.

Sandbox Storybook

Дата доставки ​

Ограничения работают вместе: allowed-dates оставляет только будни, а min-year-month и max-year-month не выпускают за пределы ближайших двух месяцев — недоступные варианты даже не приходится объяснять.

Sandbox Storybook

Дата и время ​

Календарь не выбирает время — поставьте рядом CdsTimePicker с общей моделью и одинаковой маской DD.MM.YYYY HH:mm: каждый компонент меняет свою часть строки. В поле ввода то же самое включается одним пропом — with-time у CdsDateInput.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
allowedDatesTCalendarAllowedDates | undefined—Массив дат, которые будут отображаться в календаре. При использовании функции, функция получает дату в формате YYYY/MM/DD и должна вернуть true или false.
defaultYearMonthstring | undefined—Отображаемый год/месяц в формате YYYY/MM. По-умолчанию это текущий год/месяц если не указана v-model.
descriptionstring | undefined—Описание календаря. Отображается в шапке календаря.
disabledboolean | null | undefinednullЗаблокированное состояние
emitImmediatelyboolean | undefined—Эмитировать событие update:modelValue при смене месяца и года сразу. Недоступно при multiple и range.
eventsTCalendarEvents | undefined—Список событий, которые будут отображаться в календаре. Формат: YYYY/MM/DD.
eventsColorTCalendarEventsColor | undefined'default'Цвет событий в календаре.
firstDayOfWeekstring | number | undefined1Первый день недели (понедельник по-умолчанию).
headerboolean | undefined—Отображать шапку календаря
hideSiblingMonthboolean | undefined—Скрыть дни соседних месяцев в календаре.
localestring | TDateLocale | undefined—Локаль для дат. Имя локали ('ru' | 'en') или объект TDateLocale. По умолчанию берётся текущая локаль из useLocale, иначе ru.
maskstring | undefined'DD.MM.YYYY'Формат даты/времени
maxYearMonthstring | undefined—Запретить навигацию в календаре после указанной максимальной даты в формате YYYY/MM.
minYearMonthstring | undefined—Запретить навигацию в календаре до указанной минимальной даты в формате YYYY/MM.
modelValuestring | TDatetimeValueRange | (string | TDatetimeValueRange)[] | null | undefinednullЗначение модели
multipleboolean | undefined—Разрешает множественный выбор дат. v-model должна быть массивом.
noUnsetboolean | undefined—Запретить сброс даты в календаре.
rangeboolean | undefined—Разрешает выбор диапазона дат. v-model должна быть массивом.
readonlyboolean | null | undefinednullТолько для чтения
themestring | undefined—Тема компонента
titlestring | undefined—Заголовок календаря. Отображается в шапке календаря.
todayBtnboolean | undefined—Отображать кнопку "Сегодня" в шапке календаря
view"Calendar" | "Years" | "Months" | undefined'Calendar'Вид календаря по-умолчанию. Возможные значения: 'Calendar', 'Years', 'Months'.

События

ИмяТипОписание
navigation[payload: { year: number | undefined; month: number | undefined; }]Переход к другому месяцу или году (срабатывает и при изменении модели извне).
rangeEnd[payload: { from: Partial<IRawDate>; to: Partial<IRawDate>; }]Окончание выбора диапазона дат.
rangeStart[value: Partial<IRawDate>]Начало выбора диапазона дат.
update:modelValue[value: string | TDatetimeValueRange | (string | TDatetimeValueRange)[] | null, reason: string, details: Partial<IRawDate>]Изменение значения (v-model). Передаёт значение, причину изменения и детали даты.

Слоты

ИмяТипОписание
defaultanyДополнительные кнопки под календарём.
description{ year: string | number | undefined; }Описание заголовка.
title{ date: string; }Заголовок календаря.

Exposed

ИмяТипОписание
offsetCalendar(type: "year" | "month", descending: number) => voidЛистает календарь на шаг вперёд или назад по месяцам либо годам.
setCalendarTo(year: number, month: number) => voidПерематывает календарь на указанные год и месяц, не меняя выбранное значение.
setEditingRange(from: IRawDate, to: IRawDate) => voidЗадаёт подсвечиваемый диапазон дат в режиме range без подтверждения выбора.
setToday() => voidВыбирает сегодняшнюю дату и перематывает календарь на текущий месяц.
setView(viewMode: "Calendar" | "Years" | "Months") => voidПереключает режим отображения календаря: дни, месяцы или годы.