import { FormatOptions } from 'date-fns'; import { QA } from '../common'; import { HTMLAttributes } from 'react'; import { DayProps } from './Days/Day'; import { DropdownItem } from './Dropdown/types'; export declare enum CalendarMode { /** Дата */ Single = "single", /** Период */ Range = "range" } export declare enum CalendarFreezeRange { /** Без выбора начала периода */ Start = "start", /** Без выбора окончания периода */ End = "end" } export type CalendarDay = 0 | 1 | 2 | 3 | 4 | 5 | 6; export type CalendarDisableDates = (date: Date) => boolean; export type CalendarTooltip = React.FC; export type CalendarValue = Date | undefined; export type BaseCalendarValue = [CalendarValue, CalendarValue]; export type RangeCalendarValue = BaseCalendarValue; export type BaseCalendarProps = { /** Режим календаря дата|период */ mode: CalendarMode | `${CalendarMode}`; /** Выбранная дата|период */ value: BaseCalendarValue; /** Обработчик смены даты|периода */ onChange: (newValue: BaseCalendarValue) => void; /** Фокус-дата */ viewDate?: Date; /** Обработчик смены фокус-даты */ onChangeViewDate?: (newViewDate: Date) => void; /** Левая граница */ minDate?: Date; /** Правая граница */ maxDate?: Date; /** * Обработчик недоступных дат * * Не влияет на отключение выбора месяца и года, т.к. пересчет происходит по 2 ближайшим месяцам */ disabledDates?: CalendarDisableDates; /** Неделя начинается с указанного дня */ weekStartsOn?: CalendarDay; /** * Кол-во выводимых календарей * * Обычно применяется при выборе периода */ blocks?: number; /** Запретить смену начала|конца периода */ freezeRange?: CalendarFreezeRange | `${CalendarFreezeRange}`; /** Обрабочик тултипов для дат */ tooltips?: CalendarTooltip; /** Перегружаемые компоненты */ components?: CalendarComponents; /** Локаль для функций date-fns */ locale?: FormatOptions['locale']; } & QA & Pick, 'className'>; export type RangeCalendarProps = Omit & { /** Выбранный период */ value: Date[] | RangeCalendarValue | undefined; }; export type CalendarProps = { /** Выбранная дата */ value: CalendarValue | undefined; /** Обработчик смены даты */ onChange: (newValue: CalendarValue) => void; } & Omit; export type CalendarContextProps = { years: DropdownItem[]; months: DropdownItem[]; weekDays: CalendarDay[]; hoverDate: Date | undefined; setHoverDate: (newHoverDate: Date | undefined) => void; } & Omit & Required>; /** Перегружаемые компоненты */ export type CalendarComponents = { /** Дата */ day?: React.FC; /** Неделя * * Использовать CalendarContext */ week?: React.FC; /** Заголовок * * Использовать CalendarContext */ header?: React.FC; };