Если календарь нужен прямо на странице, без поля, — берите CdsDatePicker. Для одного только времени — CdsTimePicker, для выбора из готового списка — CdsSelect.
Анатомия
Поле собрано на CdsTextInput, поэтому лейбл, описание, сообщения, очистка и валидация работают так же. Иконка календаря занимает зону prepend-inner и открывает меню — как и клик по самому полю.
Вариации
Значение и формат
Дата приходит в v-model строкой в формате mask. Placeholder по умолчанию показывает саму маску, так что подсказывать формат отдельно не нужно.
display-format меняет только то, что видит пользователь: в модели остаётся строка в mask. Принимает маску (D MMMM YYYY) или функцию, которая получает нативный Date. Если нужно хранить дату иначе — например в ISO, — меняйте mask: он задаёт и хранение, и разбор ручного ввода.
Дата и время
with-time добавляет под календарь CdsTimePicker и дописывает время в маску: DD.MM.YYYY превращается в DD.MM.YYYY HH:mm (with-seconds — в DD.MM.YYYY HH:mm:ss). Значение остаётся одной строкой, календарь и часы меняют в ней свои части. Настройки тайм-пикера доступны прямо на поле — now-btn, format12h, allowed-hours, allowed-minutes — либо целиком через time-picker-props.
Со временем меню не закрывается по клику на дату: пользователь ещё выбирает часы. Если нужен явный финал, добавьте :hide-actions="false" — кнопки встанут под тайм-пикером.
Несколько дат и период
multiple разрешает отметить несколько дат — модель становится массивом строк. range переключает календарь на выбор периода: значение приходит объектом { from, to }, а меню остаётся открытым, пока не выбраны обе границы. Общего времени у набора дат и диапазона нет, поэтому with-time с ними не работает.
Кнопки подтверждения
По умолчанию выбранная дата применяется сразу, а меню закрывается. Передайте :hide-actions="false" — и выбор станет черновиком: он попадёт в модель только после кнопки «ОК», а «Отмена» вернёт прежнее значение. Компонент испускает save и cancel.
Слот actions заменяет пару кнопок своей: он получает save, cancel и isPristine — признак того, что в календаре ничего не меняли.
Ручной ввод
update-on задаёт момент, когда набранное значение разбирается и попадает в модель: по умолчанию это blur и enter. Строка, которая не разбирается по mask (или по строковому display-format), игнорируется — поле возвращает прежнее значение. Пустой массив запрещает ввод с клавиатуры и оставляет только календарь.
Маску ввода компонент не навязывает — добавьте её директивой, например лёгкой (2,5 КБ) библиотекой Maska.
Ограничения дат
Пропсы календаря доступны прямо на поле: allowed-dates оставляет доступными только нужные дни, min-year-month и max-year-month не выпускают навигацию за пределы диапазона.
Состояния
disabled блокирует и поле, и календарь, readonly запрещает изменения, но оставляет фокус и копирование, error-messages показывает ошибку под полем.
Календарь и меню
picker-props передаёт настройки календарю — например шапку с итогом выбора, menu-props и location управляют выпадающим меню.
Рекомендации
Сценарии использования
Отчётный период
Период живёт в одном поле: range даёт { from, to }, :hide-actions="false" превращает выбор в черновик, а кнопки-пресеты пишут в ту же модель — календарь подхватывает их значение.
Дата доставки
Ограничения работают вместе: allowed-dates оставляет только будни, min-year-month и max-year-month — ближайшие два месяца. Ручной ввод здесь выключен намеренно: набрать недоступный день невозможно, а display-format показывает дату словами.
Дата в форме
Поле участвует в CdsForm наравне с остальными: rules получают то же строковое значение, что лежит в модели, поэтому проверка «не в прошлом» — обычная функция. Ограничение навигации через min-year-month подстраховывает правило, а не заменяет его.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
active | boolean | undefined | — | Активное состояние поля |
activeColor | string | undefined | — | Цвет компонента, когда он находится в активном состоянии |
allowedDates | TCalendarAllowedDates | undefined | — | Массив дат, которые будут отображаться в календаре. При использовании функции, функция получает дату в формате YYYY/MM/DD и должна вернуть true или false. |
allowedHours | number[] | undefined | — | Позволяет настроить какие часы доступны для выбора. |
allowedMinutes | number[] | undefined | — | Позволяет настроить какие минуты доступны для выбора. |
allowedSeconds | number[] | undefined | — | Позволяет настроить какие секунды доступны для выбора. |
allowedTime | ((hr: number | null, min: number | null, sec: number | null) => boolean) | undefined | — | Позволяет настроить какое время доступно для выбора. |
appendIcon | IconValue | undefined | — | Иконка в слоте append после контента |
appendInnerIcon | IconValue | undefined | — | Иконка во внутреннем слоте append после содержимого поля |
autocomplete | string | undefined | — | Помогает влиять на предложения браузера. Значение «suppress» изменяет атрибут name полей, а значение «off» полагается на то, что браузер по собственной инициативе перестанет предлагать значения. Любое другое значение передается встроенной функции автозаполнения для соответствующего элемента. |
autofocus | boolean | undefined | — | Включает автофокус |
baseColor | string | undefined | — | Цвет неактивного компонента |
bgColor | string | undefined | — | Цвет фона компонента |
centerAffix | boolean | undefined | — | Выровнять по вертикали элементы appendInner, prependInner, clearIcon и label по центру. |
clearable | boolean | undefined | — | Отображать кнопку очистки значения |
clearIcon | IconValue | undefined | 'remove' | Иконка кнопки очистки |
color | string | undefined | — | Цвет компонента |
counter | string | number | boolean | undefined | — | Счетчик символов. Принимает булево значение, число или строку |
counterValue | number | ((value: any) => number) | undefined | — | Пользовательское значение счетчика. Может быть числом или функцией вычисления от текущего значения |
defaultDate | string | undefined | — | Используемая дата по-умолчанию, когда модель не заполнена (в формате YYYY/MM/DD). |
defaultYearMonth | string | undefined | — | Отображаемый год/месяц в формате YYYY/MM. По-умолчанию это текущий год/месяц если не указана v-model. |
description | string | undefined | — | Описание компонента, отображаемое под меткой |
dirty | boolean | undefined | — | Признак того, что значение поля было изменено пользователем |
disabled | boolean | null | undefined | null | Заблокированное состояние |
displayFormat | string | ((date: Date) => string) | undefined | — | Формат отображения даты в поле ввода. Маска ('D MMMM YYYY') или функция,
получающая нативный Date и возвращающая строку. По умолчанию значение показывается как есть — в маске mask. |
emitImmediately | boolean | undefined | — | Эмитировать событие update:modelValue при смене месяца и года сразу. Недоступно при multiple и range. |
error | boolean | undefined | — | Состояние ошибки |
errorMessages | string | readonly string[] | null | undefined | [] | Отображает компонент в состояние ошибки и передает пользовательские сообщения об ошибках.
Будет объединяться с любыми проверками, заданными в свойстве rules.
Это поле не запускает валидацию. |
events | TCalendarEvents | undefined | — | Список событий, которые будут отображаться в календаре. Формат: YYYY/MM/DD. |
eventsColor | TCalendarEventsColor | undefined | 'default' | Цвет событий в календаре. |
firstDayOfWeek | string | number | undefined | 1 | Первый день недели (понедельник по-умолчанию). |
focused | boolean | undefined | — | Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение. |
format12h | boolean | undefined | — | Отображает время в 12-часовом формате AM/PM. |
header | boolean | undefined | — | Отображать шапку календаря |
hideActions | boolean | undefined | true | Скрыть кнопки подтверждения под календарём — выбранная дата применяется сразу. |
hideDetails | boolean | "auto" | undefined | — | Скрытие блока с деталями (сообщениями и подсказками). При значении 'auto' блок скрывается, если нет сообщений |
hideMessages | boolean | undefined | — | Скрыть сообщения под полем ввода |
hideSiblingMonth | boolean | undefined | — | Скрыть дни соседних месяцев в календаре. |
hint | string | undefined | — | Текст подсказки, отображаемый под полем ввода |
iconColor | string | boolean | undefined | — | Цвет иконки. Принимает булево значение или строку с цветом |
id | string | undefined | — | Уникальный идентификатор компонента |
label | string | undefined | — | Текст метки (label) компонента |
loading | string | boolean | undefined | — | Индикатор загрузки для компонента |
locale | string | TDateLocale | undefined | — | Локаль для дат. Имя локали ('ru' | 'en') или объект TDateLocale.
По умолчанию берётся текущая локаль из useLocale, иначе ru. |
location | Anchor | undefined | 'bottom start' | Положение выпадающего календаря относительно поля ввода. |
mask | string | undefined | 'DD.MM.YYYY' | Формат даты/времени |
maxErrors | string | number | undefined | 1 | Максимальное число отображаемых ошибок при валидации |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
maxYearMonth | string | undefined | — | Запретить навигацию в календаре после указанной максимальной даты в формате YYYY/MM. |
menu | boolean | undefined | — | Состояние выпадающего календаря (v-model:menu). |
menuProps | CdsMenuProps | undefined | — | Пропсы, пробрасываемые в компонент CdsMenu выпадающего календаря. |
messages | string | readonly string[] | undefined | [] | Сообщения для отображения под полем ввода |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
minYearMonth | string | undefined | — | Запретить навигацию в календаре до указанной минимальной даты в формате YYYY/MM. |
modelModifiers | Record<string, boolean> | undefined | — | Модификаторы v-model, переданные Vue для обработки значения поля |
modelValue | TDateInputValue | undefined | null | Значение поля: строка в маске mask, объект диапазона { from, to } или их массив при multiple/range. |
multiple | boolean | undefined | — | Разрешает множественный выбор дат. v-model должна быть массивом. |
name | string | undefined | — | Имя поля ввода |
noUnset | boolean | undefined | — | Запретить сброс даты в календаре. |
nowBtn | boolean | undefined | — | Отображает кнопку "Сейчас". |
persistentClearable | boolean | undefined | — | Всегда отображать кнопку очистки, а не только при наведении или фокусе |
persistentCounter | boolean | undefined | — | Всегда отображать счетчик, а не только при взаимодействии с полем |
persistentHint | boolean | undefined | — | Всегда отображать подсказку, а не только при фокусе |
persistentPlaceholder | boolean | undefined | — | Всегда отображать placeholder, а не скрывать его при взаимодействии с полем |
pickerProps | CdsDatePickerProps | undefined | — | Пропсы, пробрасываемые в компонент CdsDatePicker. Побеждают одноимённые пропсы самого поля. |
placeholder | string | undefined | — | Текст-заполнитель, отображаемый в пустом поле |
prefix | string | undefined | — | Текстовый префикс, отображаемый перед значением поля |
prependIcon | IconValue | undefined | — | Иконка в слоте prepend перед контентом |
prependInnerIcon | IconValue | undefined | 'calendar' | Иконка во внутреннем слоте prepend перед содержимым поля |
range | boolean | undefined | — | Разрешает выбор диапазона дат. v-model должна быть массивом. |
readonly | boolean | null | undefined | null | Только для чтения |
reverse | boolean | undefined | — | Обратный порядок расположения элементов внутри поля |
role | string | undefined | — | ARIA-роль для нативного элемента ввода |
rules | readonly ValidationRule[] | undefined | [] | Принимает массив, состоящий из элементов различных типов: функций, логических значений и строк. Функции принимают входное значение в качестве аргумента и должны возвращать либо true / false, либо строку, содержащую сообщение об ошибке. Поле ввода перейдет в состояние ошибки, если функция возвращает значение false (или любое значение в массиве содержит false) либо является строкой. |
size | number | "xs" | "sm" | "md" | "lg" | "xl" | undefined | 'md' | Размер компонента |
suffix | string | undefined | — | Текстовый суффикс, отображаемый после значения поля |
textColor | string | undefined | — | Цвет текста компонента |
theme | string | undefined | — | Тема компонента |
timePickerProps | CdsTimePickerProps | undefined | — | Пропсы, пробрасываемые в компонент CdsTimePicker. Побеждают одноимённые пропсы самого поля. |
todayBtn | boolean | undefined | — | Отображать кнопку "Сегодня" в шапке календаря |
type | string | undefined | 'text' | Тип нативного поля ввода |
updateOn | ("enter" | "blur")[] | undefined | ['blur', 'enter'] | События, по которым применяется вручную введённое значение. Пустой массив запрещает ручной ввод — поле становится readonly. |
validateOn | ValidateOn | undefined | — | Изменяет тип события, при котором запускается валидация |
validationValue | any | — | Значение, используемое при применении правил валидации |
view | "Calendar" | "Years" | "Months" | undefined | 'Calendar' | Вид календаря по-умолчанию. Возможные значения: 'Calendar', 'Years', 'Months'. |
width | string | number | undefined | — | Ширина компонента |
withSeconds | boolean | undefined | — | Добавляет секунды в выбор времени. |
withTime | boolean | undefined | — | Добавляет под календарь выбор времени (CdsTimePicker) и дописывает время в маску.
Работает только для одиночной даты — с multiple и range игнорируется. |
События
| Имя | Тип | Описание |
|---|---|---|
cancel | [] | Выбор отменён кнопкой отмены. |
navigation | [payload: { year: number | undefined; month: number | undefined; }] | Переход к другому месяцу или году в календаре. |
rangeEnd | [payload: { from: Partial<IRawDate>; to: Partial<IRawDate>; }] | Окончание выбора диапазона дат. |
rangeStart | [value: Partial<IRawDate>] | Начало выбора диапазона дат. |
save | [value: TDateInputValue] | Значение подтверждено — выбором в календаре или кнопкой сохранения. |
update:focused | [focused: boolean] | Изменение состояния фокуса поля (v-model:focused). |
update:menu | [value: boolean] | Изменение состояния выпадающего календаря (v-model:menu). |
update:modelValue | [value: TDateInputValue] | Изменение значения поля (v-model). |
Слоты
| Имя | Тип | Описание |
|---|---|---|
actions | CdsDateInputActionsSlot | Кнопки подтверждения под календарём (актуально при hide-actions="false"). |
append | CdsInputSlot | Добавляет элемент после поля ввода |
append-inner | CdsInputDefaultSlot | Слот, добавляемый в конце инпута ввода |
clear | CdsInputDefaultSlot & { props: Record<string, any>; } | Слот для пользовательского иконки очистки (отображается, когда свойство clearable имеет значение «true»). |
description | { description: string | undefined; props: Record<string, any>; } | Слот по умолчанию для компонента CdsDescription |
details | CdsInputSlot | Слот для ввода пользовательских данных, позволяющее настраивать отображение сообщений |
label | { label: string | undefined; props: Record<string, any>; } | Слот по умолчанию для компонента CdsLabel |
loader | LoaderSlotProps | Слот для пользовательского загрузчика (отображается, если свойство loading имеет значение true). |
message | CdsMessageSlot | Слот для настройки содержания сообщения |
messages | CdsInputSlot | Слот для ввода пользовательских данных, позволяющее настраивать отображение сообщений |
picker-description | { year: string | number | undefined; } | Описание шапки календаря. |
picker-title | { date: string; } | Заголовок шапки календаря. |
prepend | CdsInputSlot | Добавляет элемент до поля ввода |
prepend-inner | CdsInputDefaultSlot | Слот, добавляемый в начало инпута ввода |
Exposed
| Имя | Тип | Описание |
|---|---|---|
cancel | () => void | Отменяет выбор, возвращает предыдущее значение и закрывает всплывающее окно. |
controlRef | HTMLElement | undefined | Ref-ссылка на контролл поля ввода |
fieldIconColor | string | undefined | Цвет иконки |
isDirty | boolean | Является ли поле ввода "грязным" |
isDisabled | boolean | Является ли поле ввода заблокированным |
isPure | boolean | Является ли поле ввода "чистым" |
isReadonly | boolean | Является ли поле ввода только для чтения |
isValid | boolean | null | Является ли поле ввода валидным |
isValidating | boolean | Является ли поле ввода в процессе валидации |
reset | () => Promise<void> | Функция сброса поля ввода в исходное состояние |
resetValidation | () => Promise<void> | Функция сброса валидации поля ввода |
save | () => void | Подтверждает выбранную в календаре дату и закрывает всплывающее окно. |
validate | (silent?: boolean) => Promise<string[]> | Функция валидации поля ввода |