import { DateRange, Matcher } from 'react-day-picker'; import { CSSValueWithLength } from '../../styles'; import { InputSize } from '../input/types'; import { DisabledTimes, TimePickerProps } from '../time-picker'; import { FocusType } from './v1/DateRangeInput'; export type DisplayMode = 'popover' | 'bottomSheet' | 'calendar'; export type DisplayTimeFormat = 'hourMinute' | 'hourMinuteSecond'; export type CaptionLabelType = 'month' | 'year'; export interface DateTimePickerProps extends Omit { defaultTime?: { hour: number; minute: number; }; /** * 날짜를 선택하지 않은 경우 TimePicker를 비활성화하고 툴팁을 표시합니다. * * @default false */ disabledTooltip?: boolean; /** * TimePicker가 비활성화된 상태에서 표시될 툴팁 텍스트 * * @default '날짜를 먼저 선택해주세요.' */ disabledTooltipText?: string; } export interface DatePickerBaseProps { /** * Input 너비를 지정할 수 있습니다. * * @default '100%' */ width?: CSSValueWithLength; /** @default 'medium' */ size?: InputSize; error?: boolean; disabled?: boolean; className?: string; /** * Input 우측 입력한 value를 지울 수 있는 remove 버튼 사용 유무 * - 입력된 value가 없다면 기본 달력 아이콘이 노출됩니다. * - 입력된 value가 있다면 마우스 호버시 remove 버튼이 노출됩니다. * * @default false */ showRemoveButton?: boolean; /** * @deprecated 더 이상 지원하지 않는 기능입니다. */ opened?: boolean; onOpen?: () => void; onClose?: () => void; /** @default getZIndex('picker') */ zIndex?: number; /** * 달력이 노출되는 모드를 지정할 수 있습니다. * - 'bottomSheet'일 경우 Footer 영역(취소/확인)은 고정 노출됩니다. * * @default 'popover' */ displayMode?: DisplayMode; /** * 지정해서 보여지는 개월의 개수를 임의로 조정할 수 있습니다. * - displayMode 'bottomSheet'인 경우 numberOfMonths는 1로 고정입니다. * - displayMode 'popover'인 경우 numberOfMonths는 최소 2개 이상 이여야 합니다. * * @default 1 */ numberOfMonths?: number; /** * 프리셋이나 props로 전달된 값에 대해서 validation을 진행하지 않도록 합니다. 대신, 사용자가 * 수정하는 순간 validation을 진행합니다. * 레거시 datepicker v1과 같은 동작을 지원하기 위해 제공하는 플래그입니다. 기존 동작을 지원하기 * 위해 true로 지정되어 있습니다. * @default true */ tolerateInvalidValues?: boolean; } export interface DatePickerProps extends DatePickerBaseProps { /** @default '날짜를 선택하세요.' */ placeholder?: string; value?: Date; /** * 선택 불가능한 날짜를 지정할 수 있습니다. * unit이 month인 경우 disabledDays는 함수만 지원합니다. * [Matcher](https://github.com/gpbl/react-day-picker/blob/master/packages/react-day-picker/src/types/Matchers.ts#L52) */ disabledDays?: Matcher | Matcher[]; /** * 달력 하단 버튼 사용 유무 * - TimePicker 사용시: '지금' 버튼 (날짜 + 시간 설정) * - TimePicker 미사용시: '오늘' 버튼 (오늘 날짜 설정) * * @default true */ showTodayButton?: boolean; /** * 타임 노출이 필요한 경우 포멧을 지정할 수 있습니다. * - 'hourMinute'일 경우 yyyy.MM.dd HH:mm * - 'hourMinuteSecond' 일 경우 yyyy.MM.dd HH:mm:ss * - showTimePicker 속성이 true일 경우 displayTimeFormat은 'hourMinute'로 기본 적용됩니다. */ displayTimeFormat?: DisplayTimeFormat; /** * 달력 하단 TimePicker를 노출합니다. onChange value에 시간 정보를 포함하여 전달합니다. * * @default false */ showTimePicker?: boolean; /** * TimePicker 사용시 Footer 영역(취소/확인)은 고정 노출됩니다. * * @default false */ showFooter?: boolean; unit?: 'month'; onChange?: (value: Date | null) => void; /** * 캘린더 선택 시 호출되는 함수 * onChange와는 다르게 날짜 선택 시 항상 호출되는 함수입니다. * @deprecated 더 이상 지원하지 않는 기능입니다. */ onSelect?: (value: Date | null) => void; timePickerProps?: DateTimePickerProps; } export interface DateMultiPickerProps extends DatePickerBaseProps { /** @default '날짜를 선택하세요.' */ placeholder?: string; dates?: Date[]; /** * 선택 불가능한 날짜를 지정할 수 있습니다. * [Matcher](https://github.com/gpbl/react-day-picker/blob/master/packages/react-day-picker/src/types/Matchers.ts#L52) */ disabledDays?: Matcher | Matcher[]; onChange?: (dates: Date[]) => void; } export type DatePresetItem = { id: number; label: string; range: [Date, Date]; disabled?: boolean; }; export type DatePreset = DatePresetItem[]; export type Dates = DateRange; export interface DateRangeTimePickerProps extends Omit { disabledTime?: (value: Date | null, range?: 'from' | 'to') => DisabledTimes; defaultTime?: { start: { hour: number; minute: number; }; end: { hour: number; minute: number; }; }; } export interface DateRangePickerProps extends Omit { /** * 좌측 팝오버 DatePreset 사용 유무 * * @default false */ showDatePreset?: boolean; /** * RadioGroup DatePreset 사용 유무 * * @default false */ showRadioGroupDatePreset?: boolean; /** * TodayButton 사용 유무 * - displayMode 'bottomSheet' 인 경우 false * - showDatePreset true 인 경우 false * * @default true */ showTodayButton?: boolean; /** * [Dates Type](https://github.com/gpbl/react-day-picker/blob/master/packages/react-day-picker/src/types/Matchers.ts#L73) */ dates?: Dates; minDate?: Date; maxDate?: Date; /** * MaxRange 범위를 지정할 수 있습니다. * - [keyof Duration](https://github.com/date-fns/date-fns/blob/main/src/types.ts#L19) */ maxRange?: [number, keyof Duration]; /** * DatePreset 타입에 맞는 사용자 지정 preset을 사용할 수 있습니다. */ customDatePreset?: DatePreset; /** * 선택 불가능한 날짜를 지정할 수 있습니다. */ disabledDays?: (date: Date) => boolean; /** * 선택된 날짜 사이에 선택 불가능한 날짜가 존재할 수 있는지 여부를 지정합니다. * * @default false */ allowDisabledDaysInRange?: boolean; /** * 지정해서 보여지는 개월의 개수를 임의로 조정할 수 있습니다. * - displayMode 'bottomSheet'인 경우 numberOfMonths는 1로 고정입니다. * - displayMode 'popover'인 경우 numberOfMonths는 최소 2개 이상 이여야 합니다. * * @default 2 */ numberOfMonths?: number; onChange?: (start: Dates['from'], end: Dates['to']) => void; /** * 캘린더 선택 시 호출되는 함수 * onChange와는 다르게 날짜 선택 시 항상 호출되는 함수입니다. * @deprecated 더 이상 지원하지 않는 기능입니다. */ onSelect?: (start: Dates['from'], end: Dates['to'], focused: FocusType) => void; /** * 선택 완료시 자동으로 캘린더 선택 창을 닫습니다. * - displayMode 'bottomSheet'인 경우 적용이 불가합니다. * - displayMode 'popover'인 경우 하단의 footer 영역의 취소/확인 버튼은 노출되지 않습니다. * * @default true */ autoCloseable?: boolean; disabled?: boolean | [boolean, boolean]; /** * 타임 노출이 필요한 경우 포멧을 지정할 수 있습니다. * - 'hourMinute'일 경우 yyyy.MM.dd HH:mm * - 'hourMinuteSecond' 일 경우 yyyy.MM.dd HH:mm:ss * - showTimePicker 속성이 true일 경우 displayTimeFormat은 'hourMinuteSecond'로 기본 적용됩니다. */ displayTimeFormat?: DisplayTimeFormat; /** * 달력 하단 TimePicker를 노출합니다. onChange value에 시간 정보를 포함하여 전달합니다. * numberOfMonths는 1로 고정됩니다. * * @default false */ showTimePicker?: boolean; timePickerProps?: DateRangeTimePickerProps; /** * NowButton disabled 유무 * * @default false */ disabledNowButton?: boolean; } export interface DateUnitPickerProps extends Omit { unit: 'day' | 'week' | 'month'; /** * [Dates Type](https://github.com/gpbl/react-day-picker/blob/master/packages/react-day-picker/src/types/Matchers.ts#L73) */ dates?: Dates; minDate?: Date; maxDate?: Date; onChange?: (start: Dates['from'], end: Dates['to']) => void; /** * 선택 완료시 자동으로 캘린더 선택 창을 닫습니다. * - displayMode 'bottomSheet'인 경우 적용이 불가합니다. * - displayMode 'popover'인 경우 하단의 footer 영역의 취소/확인 버튼은 노출되지 않습니다. * * @default true */ autoCloseable?: boolean; disabled?: boolean | [boolean, boolean]; /** * 주의 시작요일을 지정합니다 기본값은 1(월요일)입니다. * * @default 1 * @deprecated 더 이상 지원하지 않는 기능입니다. */ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6; }