FieldDate
Поле выбора даты. Базируется на FieldDecorator и CalendarDropdown из @cloud-ru/ds-calendar. Триггер совмещает текстовый ввод с маской и кнопку календаря; календарь открывается в popover. Поддерживает три режима выбора, кнопки очистки и копирования.
Когда использовать
- Ввод одной даты в формах и фильтрах (
mode='date'). - Ввод даты вместе со временем (
mode='date-time'); секунды управляются пропомshowSeconds. - Выбор периода из двух дат (
mode='date-range') — два связанных поля с разделителем. - Только время без даты — используйте
FieldTime, не FieldDate.
Анатомия
Триггер собирается из:
iconBefore— иконка перед текстом ввода (по умолчанию контекст календаря несёт кнопка справа).- input(ы) с маской — одно поле в режимах
date/date-time, два связанных вdate-range. - кнопка очистки (
showClearButton) — крестик, активна при непустом значении и неdisabled/readonly. - кнопка копирования (
showCopyButton) — копирует значение в буфер, видна только вreadonlyпри непустом значении. - кнопка календаря — открывает popover с
CalendarDropdown.
Сегментный ввод с клавиатуры
В режимах date и date-time поле редактируется посегментно: фокус (или клик) выделяет сегмент (ДД, ММ, ГГГГ, …), цифры заполняют его с автопереходом к следующему, ←/→ двигают по сегментам, Backspace очищает сегмент до плейсхолдера, ArrowDown открывает календарь. Невалидные значения зажимаются к допустимым. Режим date-range использует обычный ввод по маске.
Mode (default date)
date— одна дата, маскаДД.ММ.ГГГГ.date-time— дата и время, маскаДД.ММ.ГГГГ, чч:мм:сс(секунды зависят отshowSeconds).date-range— период из двух дат, два поля через разделитель.
Size (default m)
| Значение | Когда |
|---|---|
s | Плотные таблицы, inline-редактирование |
m | Стандартные формы (по умолчанию) |
l | Лендинги, primary-формы |
ValidationState (default default)
Управляет цветом рамки и иконкой подсказки. Проп error форсит error.
| Значение | Когда |
|---|---|
default | Нет валидации — нейтральный baseline (рамка без цвета, без иконки подсказки) |
error | Поле не прошло валидацию |
warning | Предупреждение, ввод допустим |
success | Подтверждение успешного ввода |
ShowSeconds (default true)
Действует только в режиме date-time. При true маска и календарь включают секунды (чч:мм:сс), при false — только часы и минуты (чч:мм).
Установка
pnpm add @cloud-ru/ds-fields
import { FieldDate } from '@cloud-ru/ds-fields'
Примеры использования
Базовое поле
import { FieldDate } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function DateBasic() {
const [value, setValue] = useState<Date | undefined>(undefined);
return <FieldDate label='Дата' hint='Маска DD.MM.YYYY или выбор в календаре' value={value} onChange={setValue} />;
}Выбор периода
import { FieldDate } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function DateRange() {
const [value, setValue] = useState<[Date | undefined, Date | undefined]>([undefined, undefined]);
return (
<FieldDate
label='Период'
mode='date-range'
hint='Два поля — начало и конец периода'
value={value}
onChange={setValue}
/>
);
}Дата и время с секундами
import { FieldDate } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function DateTimeWithSeconds() {
const [value, setValue] = useState<Date | undefined>(undefined);
return (
<FieldDate
label='Дата и время'
mode='date-time'
showSeconds
hint='Маска DD.MM.YYYY, HH:MM:SS — секунды управляются showSeconds'
value={value}
onChange={setValue}
/>
);
}Readonly с копированием
import { FieldDate } from '@cloud-ru/ds-fields';
export function DateReadonly() {
return <FieldDate label='Дата создания' readonly defaultValue={new Date(2026, 4, 17)} />;
}Быстрые диапазоны и выходные
import { DATE_MODE, FieldDate } from '@cloud-ru/ds-fields';
import { useState } from 'react';
const today = new Date();
function shift(days: number): Date {
const date = new Date(today);
date.setDate(date.getDate() + days);
return date;
}
export function DatePresets() {
const [value, setValue] = useState<[Date | undefined, Date | undefined]>([undefined, undefined]);
return (
<FieldDate
label='Период'
hint='Быстрые диапазоны в шапке календаря, выходные подсвечены'
mode={DATE_MODE.DateRange}
showHolidays
presets={{
enabled: true,
items: [
{ id: 'last-7', label: 'Последние 7 дней', range: [shift(-6), today] },
{ id: 'last-30', label: 'Последние 30 дней', range: [shift(-29), today] },
{ id: 'next-7', label: 'Следующие 7 дней', range: [today, shift(6)] },
],
}}
value={value}
onChange={setValue}
/>
);
}Props
Types
FieldDateProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
autoFocus | boolean | — | no | Автофокус input при монтировании. На mobile выключается адаптивно (см. `layoutPresets`) |
background | boolean | true | no | Фон поля (acrylic) |
buildCellProps | (date: Date, viewMode: ViewMode) => { isDisabled?: boolean; isHoliday?: boolean } ; | — | no | Колбек установки свойств ячеек календаря. Вызывается на построение каждой ячейки. Принимает два параметра: <br> `Date` - дата ячейки <br> `ViewMode`: <br> - `month` отображение месяца, каждая ячейка - 1 день <br> - `year` отображение года, каждая ячейка - 1 месяц <br> - `decade` отображение декады, каждая ячейка - 1 год <br><br> Колб ек должен возвращать объект с полями, отвечающими за отключение и подкраску ячейки. |
caption | string | — | no | Вторичная подпись справа |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
closeOnApply | boolean | — | no | Закрыть dropdown после нажатия Apply. |
closeOnPopstate | boolean | — | no | Закрывать ли поповер при переходе по истории браузера |
data-test-id | string | — | no | |
defaultValue | DateValue | DateRangeValue | — | no | Неуправляемое значение по умолчанию |
disabled | boolean | — | no | Поле выключено Деактивировано |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля |
hint | string | — | no | Подсказка |
iconBefore | ReactNode | — | no | Иконка перед текстом (если не задано — `CalendarSVG`) |
id | string | — | no | HTML-атрибут `id` для input (и `for` у label) |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
label | string | — | no | Заголовок |
labelFor | string | — | no | HTML-атрибут `for` для `<label>` |
labelFrom | string | 'Начало периода' | no | `aria-label` поля начала периода (режим `date-range`). |
labelTo | string | 'Конец периода' | no | `aria-label` поля конца периода (режим `date-range`). |
labelTooltip | QuestionTooltipProps | — | no | Подсказка (question-tooltip) у заголовка |
layoutPresets | Partial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>> | — | no | Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`. |
length | FieldLength | — | no | Счётчик длины `current/max` |
locale | Intl.Locale | Проставляется в соответствие с языком в настройках браузера | no | Локаль, в соответствие с которой выставляется язык названий и первый день недели |
mode | "date" | "date-range" | "date-time" | — | no | Режим выбора даты. По умолчанию `'date'`. Режим выбора периода |
name | string | — | no | HTML-атрибут `name` для input |
onBlur | ((event: FocusEvent<HTMLInputElement, Element>) => void) | — | no | Колбек блюра input |
onChange | ((value: DateValue) => void) | ((value: DateRangeValue) => void) | — | no | Колбек смены значения |
onCopyButtonClick | (() => void) | — | no | Колбек после копирования значения в буфер |
onFocus | ((event: FocusEvent<HTMLInputElement, Element>) => void) | — | no | Колбек фокуса input |
onOpenChange | ((isOpen: boolean) => void) | — | no | Колбек отображения компонента. Срабатывает при изменении состояния open. |
open | boolean | — | no | Управляет состоянием показан/не показан. |
placeholder | string | — | no | Placeholder в триггере, когда нет значения |
placement | "bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start" | top | no | Положение поповера относительно своего триггера (children). |
presets | PresetsOptions | — | no | Настройки секции с пресетами быстрого выбора периода. Доступны только при mode === 'date-range' и отсутствии buildCellProps (временно PDS-3139) |
readonly | boolean | — | no | Только для чтения Read-only режим |
required | boolean | — | no | Показать знак обязательности `*` |
showClearButton | boolean | true | no | Показывать кнопку очистки значения (✕). Активна, когда есть значение и поле не disabled/readonly. |
showCopyButton | boolean | true | no | Показывать кнопку копирования значения (только при `readonly` и непустом значении). |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
showHolidays | boolean | — | no | Раскрашивает субботу и воскресенье |
showSeconds | boolean | true | no | Показывать секунды в режиме `date-time` (в маске и в выпадающем календаре). |
size | "l" | "m" | "s" | — | no | Размер |
today | number | Date | — | no | Дата сегодняшнего дня |
validationState | "default" | "error" | "success" | "warning" | — | no | Состояние валидации |
value | DateValue | DateRangeValue | — | no | Управляемое значение |