FieldTime
Поле выбора времени. Базируется на FieldDecorator и @cloud-ru/ds-input-private, в качестве picker’а использует TimePickerDropdown из @cloud-ru/ds-calendar. Значение — объект TimeValue ({ hours, minutes, seconds }). Ввод идёт по сегментной маске чч:мм:сс (inputMode='numeric'), выбор — через дропдаун с барабанами времени.
Когда использовать
- Ввод точного времени в формах: расписание, дедлайны, окна обслуживания.
- Когда нужны и клавиатурный ввод по маске, и выбор мышью из дропдауна.
- Для ввода только часов и минут отключите секунды через
showSeconds={false}— маска станетчч:мм. - Для выбора даты используйте
FieldDate, для даты со временем — соответствующее поле, не FieldTime.
Анатомия
Сегментный ввод с клавиатуры
Поле редактируется посегментно: фокус (или клик) выделяет сегмент (чч, мм, сс), цифры заполняют его с автопереходом к следующему, ←/→ двигают по сегментам, Backspace очищает сегмент до плейсхолдера, ArrowDown открывает picker и переводит фокус на барабаны времени. Значения сегментов зажимаются к допустимым (часы ≤ 23, минуты/секунды ≤ 59).
Size (default m)
| Значение | Когда |
|---|---|
s | Плотные таблицы, inline-редактирование |
m | Стандартные формы (по умолчанию) |
l | Лендинги, primary-формы |
ValidationState (default default)
Управляет тонировкой acrylic-фона поля и иконкой подсказки. Проп error форсит error.
| Значение | Когда |
|---|---|
default | Нет валидации — нейтральный фон, текст подсказки textTertiary, без иконки валидации |
error | Поле не прошло валидацию — красная тонировка фона |
warning | Предупреждение, ввод допустим — жёлтая тонировка фона |
success | Подтверждение успешного ввода — зелёная тонировка фона |
Установка
pnpm add @cloud-ru/ds-fields
import { FieldTime } from '@cloud-ru/ds-fields'
import { TimeValue } from '@cloud-ru/ds-calendar'
Примеры использования
Базовое поле
tsx
import { TimeValue } from '@cloud-ru/ds-calendar';
import { FieldTime } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function TimeBasic() {
const [value, setValue] = useState<TimeValue | undefined>({ hours: 9, minutes: 30, seconds: 0 });
return (
<FieldTime label='Время' hint='Введите HH:MM:SS или выберите из дропдауна' value={value} onChange={setValue} />
);
}Без секунд
tsx
import { TimeValue } from '@cloud-ru/ds-calendar';
import { FieldTime } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function TimeShowSeconds() {
const [value, setValue] = useState<TimeValue | undefined>({ hours: 14, minutes: 25, seconds: 0 });
return (
<FieldTime
label='Время без секунд'
hint='showSeconds=false — маска HH:MM, picker без барабана секунд'
showSeconds={false}
value={value}
onChange={setValue}
/>
);
}Readonly с копированием
tsx
import { FieldTime } from '@cloud-ru/ds-fields';
export function TimeReadonly() {
return <FieldTime label='Время выполнения' readonly defaultValue={{ hours: 23, minutes: 59, seconds: 59 }} />;
}Props
Types
Props
FieldTimeProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
autoFocus | boolean | — | no | Автофокус. На mobile выключается адаптивно (см. `layoutPresets`) |
background | boolean | true | no | Фон поля (acrylic). |
caption | string | — | no | Вторичная подпись справа |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
closeOnApply | boolean | true | no | Закрыть picker после Apply. |
data-test-id | string | field-time | no | |
defaultValue | TimeValue | — | no | Дефолтное значение для uncontrolled-режима |
disabled | boolean | — | no | Поле выключено Отключено |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля |
hint | string | — | no | Подсказка |
id | string | — | no | HTML id |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
label | string | | no | Заголовок |
labelFor | string | — | no | HTML-атрибут `for` для `<label>` |
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` |
name | string | — | no | HTML name |
onBlur | ((event: FocusEvent<HTMLInputElement, Element>) => void) | — | no | Колбек блюра input |
onChange | ((value: TimeValue) => void) | — | no | Колбек смены значения |
onClearButtonClick | (() => void) | — | no | Колбек после клика по кнопке очистки. |
onCopyButtonClick | (() => void) | — | no | Колбек после копирования значения. |
onFocus | ((event: FocusEvent<HTMLInputElement, Element>) => void) | — | no | Колбек фокуса input |
onOpenChange | ((open: boolean) => void) | — | no | Колбек смены состояния открытия |
open | boolean | — | no | Открыт ли picker (controlled) |
placeholder | string | — | no | Плейсхолдер маски; по умолчанию `чч:мм:сс` или `чч:мм` в зависимости от `showSeconds`. |
readonly | boolean | — | no | Только для чтения |
required | boolean | — | no | Показать знак обязательности `*` |
showClearButton | boolean | true | no | Показывать кнопку очистки (видна при value && !readonly && !disabled). |
showCopyButton | boolean | true | no | Показывать кнопку копирования (видна при readonly && value && !disabled). |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
showSeconds | boolean | true | no | Показывать секунды в picker и в маске input. |
size | "l" | "m" | "s" | m | no | Размер |
validationState | "default" | "error" | "success" | "warning" | default | no | Состояние валидации |
value | TimeValue | — | no | Значение |