DateRangeInput
Компонент для поля выбора диапазона дат, позволяет пользователю выбрать начальную и конечную дату как через ручной ввод, так и через календарь.
Применение компонента
Данный компонент представляет собой поле формы с возможностью вызова календаря.
Если вам нужен отдельный компонент календаря для выбора диапазона дат, то используйте CalendarRange.
Если вам нужно поле ввода одиночной даты и времени (со всплывающим календарём), то используйте DateInput.
Режим работы
Компонент поддерживает работу как в неконтролируемом режиме, так и контролируемом. Это стандартное поведение React-компонентов, прочитать про это можно в документации React ↗.
Для использования неконтролируемого режима достаточно просто не передавать value или передавать defaultValue, если
требуется задать значение по умолчанию.
Для контролируемого режима используйте связку свойств value/onChange для задания значения и его изменения.
// Неконтролируемое состояние
<DateRangeInput defaultValue={[new Date(2024, 2, 1), new Date(2024, 2, 10)]} accessible />;
// Контролируемое состояние
const [date, setDate] = React.useState([new Date(2024, 2, 1), new Date(2024, 2, 10)]);
<DateRangeInput value={date} onChange={setDate} accessible />;Состояния
disabled
Свойство disabled блокирует взаимодействие с компонентом и добавляет визуальную индикацию недоступности.
Валидация
Свойство status используется для визуализации валидации компонента - некорректности заполненного поля (значение "error")
или успешной валидации (значение "valid").
Тестирование (e2e)
Для тестирования компонента можно использовать следующие свойство определяющие data-testid атрибуты:
calendarTestsPropsstartDateTestsPropsendDateTestsPropsshowCalendarButtonTestIdclearButtonTestId
Подробности смотри в Свойства и методы.
Доступность (a11y)
Компонент обеспечивает базовую доступность, но по умолчанию компонент всё ещё сложно использовать пользователям ассистивных технологий. Мы доработали компонент так, чтобы сделать его доступным, но это потребовало ломающих изменений в визуальном поведении компонента.
Новое, доступное поведение можно включить с помощью нового свойства accessible.
Вот список изменений которые отличают поведение со свойством accessible от поведения по умолчанию:
- иконка календаря видна постоянно (раньше она была видна, только если в
DateRangeInputнет значения); - календарь открывается только по клику по иконке календаря, по клику на поле ввода и нажатию клавиши
<Space>, еслиDateRangeInputв фокусе (раньше он открывался сразу при фокусе наDateRangeInput); - при открытии календарь получает фокус. При закрытии календаря фокус возвращается на
DateRangeInput. Если нужно отключить это поведение, используйте свойствоdisableFocusTrap. Если нужно больше контроля над тем, куда возвращать фокус, используйте свойствоrestoreFocus.
Из-за особенности реализации DateRangeInput, если вкладывать его внутрь label, или связывать label и DateRangeInput через htmlFor,
то по клику на label фокус будет попадать на DateRangeInput, но текст label скринридером зачитываться в момент фокуса не будет.
Рекомендуем дублировать текст label в DateRangeInput, передавая в DateRangeInput текст через свойство aria-label.
<label>
Период проживания
<DateRangeInput aria-label="Период проживания" accessible />
</label><label htmlFor="date">Срок действия договора</label>
<DateRangeInput
id="date"
aria-label="Срок действия договора"
accessible
/><FormItem top="Период бронирования" htmlFor="date">
<DateRangeInput id="date" aria-label="Период бронирования" accessible />
</FormItem>Интернационализация (i18n)
Формат дат и их перевод задаётся с помощью средств браузера Intl.DateTimeFormat ↗. Тем не менее компонент, в том числе и календарь, имеют большое количество внутренних интерактивных элементов, которые должны иметь описание. Особенно важно для доступности (a11y), так как большинство подписей зрячему пользователю не видны, но критически важны пользователям скринридеров.
Ниже приведён список свойств, которые стоит использовать, если требуется перевести компонент на другой язык. Полный список ищите в таблице свойств компонента ниже.
changeDayLabel;changeMonthLabel;changeYearLabel;changeStartDayLabel;changeStartMonthLabel;changeStartYearLabel;changeEndDayLabel;changeEndMonthLabel;changeEndYearLabel;prevMonthLabel;nextMonthLabel;clearFieldLabel;showCalendarLabel;calendarLabel.
Свойства и методы
| Свойство | Описание |
|---|---|
accessible | booleanВключает режим в котором DateRangeInput доступен для ассистивных технологий. В этом режиме:
По умолчанию: - |
after | ReactNodeДобавляет иконку справа. Рекомендации:
По умолчанию: - |
afterAlign | FieldIconsAlignВертикальное выравнивание иконки справа. По умолчанию: - |
before | ReactNodeДобавляет иконку слева. Рекомендации:
По умолчанию: - |
beforeAlign | FieldIconsAlignВертикальное выравнивание иконки слева. По умолчанию: - |
calendarLabel | stringLabel для календаря. По умолчанию: Календарь |
calendarPlacement | PlacementWithAutoРасположение календаря относительно поля ввода. По умолчанию: bottom-start |
calendarTestsProps | CalendarRangeTestsPropsПередает атрибуты По умолчанию: - |
changeDayLabel | stringDeprecated: Since 7.4.0. Будет удалeно в VKUI v8. Использовалось для задания aria-label для контейнера дней в календаре. Теперь этот контейнер является таблицей (с помощью role=“grid”) и в aria-label рендерится текущий открытый в календаре месяц и год. По умолчанию: - |
changeEndDayLabel | stringLabel для ввода дня конечной даты. Делает доступным для ассистивных технологий. По умолчанию: День окончания |
changeEndMonthLabel | stringLabel для ввода месяца конечной даты. Делает доступным для ассистивных технологий. По умолчанию: Месяц окончания |
changeEndYearLabel | stringLabel для ввода года конечной даты. Делает доступным для ассистивных технологий. По умолчанию: Год окончания |
changeMonthLabel | string
По умолчанию: Месяц |
changeStartDayLabel | stringLabel для ввода дня начальной даты. Делает доступным для ассистивных технологий. По умолчанию: День начала |
changeStartMonthLabel | stringLabel для ввода месяца начальной даты. Делает доступным для ассистивных технологий. По умолчанию: Месяц начала |
changeStartYearLabel | stringLabel для ввода года начальной даты. Делает доступным для ассистивных технологий. По умолчанию: Год начала |
changeYearLabel | string
По умолчанию: Год |
clearButtonTestId | stringПередает атрибут По умолчанию: - |
clearFieldLabel | stringLabel для кнопки очистки. Делает доступным для ассистивных технологий. По умолчанию: Очистить поле |
closeOnChange | booleanАвтоматически закрывать календарь при изменениях. По умолчанию: true |
defaultValue | DateRangeType | nullНачальный промежуток при монтировании. По умолчанию: - |
disableCalendar | booleanОтключение открытия календаря. По умолчанию: false |
disableFocusTrap | booleanПозволяет отключить захват фокуса при появлении календаря. По умолчанию: - |
disableFuture | booleanЗапрещает выбор даты в будущем.
Применяется, если не задано По умолчанию: - |
disablePast | booleanЗапрещает выбор даты в прошлом.
Применяется, если не заданы По умолчанию: - |
disablePickers | booleanОтключает селекторы выбора месяца/года. По умолчанию: - |
endDateTestsProps | DateTestsPropsПередает атрибуты По умолчанию: - |
getRootRef | Ref<HTMLDivElement>По умолчанию: - |
mode | "default" | "plain"Режим отображения.
По умолчанию: - |
nextMonthIcon | ReactNodeКастомная иконка для кнопки следующего месяца. По умолчанию: - |
nextMonthLabel | string
По умолчанию: Следующий месяц |
onCalendarOpenChanged | ((opened: boolean) => void)Обработчик изменения состояния открытия календаря. По умолчанию: - |
onChange | ((value: DateRangeType) => void) | undefinedОбработчик изменения выбранного промежутка. По умолчанию: - |
prevMonthIcon | ReactNodeКастомная иконка для кнопки предыдущего месяца. По умолчанию: - |
prevMonthLabel | string
По умолчанию: Предыдущий месяц |
renderDayContent | ((day: Date) => ReactNode)Кастомизация отображения содержимого дня. По умолчанию: - |
restoreFocus | boolean | (() => boolean | HTMLElement)По умолчанию: true |
shouldDisableDate | ((value: Date) => boolean)Функция для проверки запрета выбора даты. По умолчанию: - |
showCalendarButtonTestId | stringПередает атрибут По умолчанию: - |
showCalendarLabel | stringLabel для кнопки открытия календаря. Делает доступным для ассистивных технологий. По умолчанию: Показать календарь |
startDateTestsProps | DateTestsPropsПередает атрибуты По умолчанию: - |
status | "default" | "error" | "valid"Статус отображения поля в форме. По умолчанию: - |
value | DateRangeType | nullТекущий выбранный промежуток. По умолчанию: - |
weekStartsOn | 0 | 1 | 2 | 3 | 4 | 5 | 6День недели, с которого начинается неделя. По умолчанию: - |