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'

Примеры использования

Базовое поле

Базовое полеControlled FieldDate в режиме date с маской и календарём.
tsx
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} />;
}

Выбор периода

Выбор периодаmode=date-range — два связанных поля начала и конца периода.
tsx
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}
    />
  );
}

Дата и время с секундами

Дата и время с секундамиmode=date-time + showSeconds — маска и календарь включают секунды.
tsx
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 с копированием

Readonly с копированиемReadonly FieldDate показывает кнопку копирования значения в буфер вместо очистки.
tsx
import { FieldDate } from '@cloud-ru/ds-fields';

export function DateReadonly() {
  return <FieldDate label='Дата создания' readonly defaultValue={new Date(2026, 4, 17)} />;
}

Быстрые диапазоны и выходные

Быстрые диапазоны и выходныеmode=date-range + presets — пресеты периода в шапке календаря, showHolidays подсвечивает субботу и воскресенье.
tsx
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

PropsFieldDateProps
PropTypeDefaultRequiredDescription
autoFocusbooleannoАвтофокус input при монтировании. На mobile выключается адаптивно (см. `layoutPresets`)
backgroundbooleantruenoФон поля (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> Колбек должен возвращать объект с полями, отвечающими за отключение и подкраску ячейки.
captionstringnoВторичная подпись справа
classNamestringnoCSS-класс CSS-класс корня `FieldDecorator`
closeOnApplybooleannoЗакрыть dropdown после нажатия Apply.
closeOnPopstatebooleannoЗакрывать ли поповер при переходе по истории браузера
data-test-idstringno
defaultValueDateValue | DateRangeValuenoНеуправляемое значение по умолчанию
disabledbooleannoПоле выключено Деактивировано
errorstringnoОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestringnoCSS-класс оболочки поля
hintstringnoПодсказка
iconBeforeReactNodenoИконка перед текстом (если не задано — `CalendarSVG`)
idstringnoHTML-атрибут `id` для input (и `for` у label)
innerRefRef<HTMLDivElement>noRef на корневой DOM-элемент
labelstringnoЗаголовок
labelForstringnoHTML-атрибут `for` для `<label>`
labelFromstring'Начало периода'no`aria-label` поля начала периода (режим `date-range`).
labelTostring'Конец периода'no`aria-label` поля конца периода (режим `date-range`).
labelTooltipQuestionTooltipPropsnoПодсказка (question-tooltip) у заголовка
layoutPresetsPartial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>>noПереопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
lengthFieldLengthnoСчётчик длины `current/max`
localeIntl.LocaleПроставляется в соответствие с языком в настройках браузераnoЛокаль, в соответствие с которой выставляется язык названий и первый день недели
mode"date" | "date-range" | "date-time"noРежим выбора даты. По умолчанию `'date'`. Режим выбора периода
namestringnoHTML-атрибут `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.
openbooleannoУправляет состоянием показан/не показан.
placeholderstringnoPlaceholder в триггере, когда нет значения
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"topnoПоложение поповера относительно своего триггера (children).
presetsPresetsOptionsnoНастройки секции с пресетами быстрого выбора периода. Доступны только при mode === 'date-range' и отсутствии buildCellProps (временно PDS-3139)
readonlybooleannoТолько для чтения Read-only режим
requiredbooleannoПоказать знак обязательности `*`
showClearButtonbooleantruenoПоказывать кнопку очистки значения (✕). Активна, когда есть значение и поле не disabled/readonly.
showCopyButtonbooleantruenoПоказывать кнопку копирования значения (только при `readonly` и непустом значении).
showHintIconbooleannoОтображение статус-иконки у подсказки (по умолчанию `true`)
showHolidaysbooleannoРаскрашивает субботу и воскресенье
showSecondsbooleantruenoПоказывать секунды в режиме `date-time` (в маске и в выпадающем календаре).
size"l" | "m" | "s"noРазмер
todaynumber | DatenoДата сегодняшнего дня
validationState"default" | "error" | "success" | "warning"noСостояние валидации
valueDateValue | DateRangeValuenoУправляемое значение

Types

FieldDateProps

Storybook

Figma