Если календарю нужно поле ввода, берите готовый CdsDateInput — он собирает то же самое из поля, меню и этого календаря, добавляя ручной ввод и время. Для выбора одного только времени есть CdsTimePicker.
Анатомия
Календарь состоит из необязательной шапки с итогом выбора, навигации по месяцу и году, сетки дней и зоны действий. Шапку включает header, кнопку «Сегодня» — today-btn, а действия добавляются в слот по умолчанию.
Вариации
Значение и формат
Выбранная дата приходит в v-model строкой в формате mask — по умолчанию DD.MM.YYYY. Повторный клик по выбранному дню снимает выбор; no-unset запрещает такой сброс, а hide-sibling-month скрывает дни соседних месяцев.
Шапка
header включает шапку с итогом выбора: заголовок показывает дату или число выбранных дней, описание — год. Тексты заменяются пропсами title и description либо одноимёнными слотами. today-btn добавляет кнопку возврата к текущему дню.
Диапазон дат
range переключает календарь на выбор периода: первый клик фиксирует начало (событие range-start), второй — конец (range-end), значение приходит объектом { from, to }. В паре с multiple можно выбрать несколько периодов.
Несколько дат
multiple разрешает отмечать отдельные даты — модель становится массивом строк.
События
events отмечает даты точками: принимает массив дат в формате YYYY/MM/DD или функцию-предикат. Цвет точки задаёт events-color — строкой либо функцией от даты, если типов событий несколько.
Доступные даты
allowed-dates ограничивает выбор: массив дат либо функция, которая получает дату YYYY/MM/DD и возвращает, можно ли её выбрать. Остальные дни отключаются.
Границы навигации
min-year-month и max-year-month (формат YYYY/MM) не дают уйти за пределы диапазона — стрелки на границе отключаются. За переходами между месяцами следите по событию navigation.
Стартовый вид
view открывает календарь сразу со списка месяцев (Months) или лет (Years) — удобно для дат, далёких от текущей. default-year-month задаёт стартовый месяц, когда модель пуста.
Локализация
locale принимает имя локали (ru | en) или собственный объект переводов; без пропа используется локаль приложения. first-day-of-week задаёт первый день недели — для en это обычно воскресенье.
Состояния
disabled отключает календарь и приглушает его, readonly сохраняет обычный вид, но блокирует и выбор, и навигацию.
Рекомендации
Сценарии использования
Поле с датой
Чаще всего календарь живёт не на странице, а в меню у текстового поля. Для этого есть CdsDateInput — он уже собран из поля, меню и календаря, разбирает ручной ввод и принимает все свойства календаря напрямую. Собирайте контрол сами, только если нужна нестандартная схема: из CdsTextInput, CdsMenu с activator="parent" и календаря — так вам остаются доступны все свойства и слоты поля и меню. Маску ввода в этом случае добавьте сами: рекомендуем лёгкую (2,5 КБ) библиотеку Maska.
Отчётный период
Слот по умолчанию добавляет действия под календарём. Здесь выбранный диапазон — черновик: в отчёт он попадает только после кнопки «Применить», а «Сбросить» возвращает календарь к исходному состоянию.
Дата доставки
Ограничения работают вместе: allowed-dates оставляет только будни, а min-year-month и max-year-month не выпускают за пределы ближайших двух месяцев — недоступные варианты даже не приходится объяснять.
Дата и время
Календарь не выбирает время — поставьте рядом CdsTimePicker с общей моделью и одинаковой маской DD.MM.YYYY HH:mm: каждый компонент меняет свою часть строки. В поле ввода то же самое включается одним пропом — with-time у CdsDateInput.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
allowedDates | TCalendarAllowedDates | undefined | — | Массив дат, которые будут отображаться в календаре. При использовании функции, функция получает дату в формате YYYY/MM/DD и должна вернуть true или false. |
defaultYearMonth | string | undefined | — | Отображаемый год/месяц в формате YYYY/MM. По-умолчанию это текущий год/месяц если не указана v-model. |
description | string | undefined | — | Описание календаря. Отображается в шапке календаря. |
disabled | boolean | null | undefined | null | Заблокированное состояние |
emitImmediately | boolean | undefined | — | Эмитировать событие update:modelValue при смене месяца и года сразу. Недоступно при multiple и range. |
events | TCalendarEvents | undefined | — | Список событий, которые будут отображаться в календаре. Формат: YYYY/MM/DD. |
eventsColor | TCalendarEventsColor | undefined | 'default' | Цвет событий в календаре. |
firstDayOfWeek | string | number | undefined | 1 | Первый день недели (понедельник по-умолчанию). |
header | boolean | undefined | — | Отображать шапку календаря |
hideSiblingMonth | boolean | undefined | — | Скрыть дни соседних месяцев в календаре. |
locale | string | TDateLocale | undefined | — | Локаль для дат. Имя локали ('ru' | 'en') или объект TDateLocale.
По умолчанию берётся текущая локаль из useLocale, иначе ru. |
mask | string | undefined | 'DD.MM.YYYY' | Формат даты/времени |
maxYearMonth | string | undefined | — | Запретить навигацию в календаре после указанной максимальной даты в формате YYYY/MM. |
minYearMonth | string | undefined | — | Запретить навигацию в календаре до указанной минимальной даты в формате YYYY/MM. |
modelValue | string | TDatetimeValueRange | (string | TDatetimeValueRange)[] | null | undefined | null | Значение модели |
multiple | boolean | undefined | — | Разрешает множественный выбор дат. v-model должна быть массивом. |
noUnset | boolean | undefined | — | Запретить сброс даты в календаре. |
range | boolean | undefined | — | Разрешает выбор диапазона дат. v-model должна быть массивом. |
readonly | boolean | null | undefined | null | Только для чтения |
theme | string | undefined | — | Тема компонента |
title | string | undefined | — | Заголовок календаря. Отображается в шапке календаря. |
todayBtn | boolean | 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). Передаёт значение, причину изменения и детали даты. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Дополнительные кнопки под календарём. |
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 | Переключает режим отображения календаря: дни, месяцы или годы. |