UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

346 lines (345 loc) 11.5 kB
import type React from 'react'; import type { Moment, MomentInput, Locale as MomentLocale } from 'moment'; import type { CommonProps } from '../util'; import { type Locale } from '../locale/types'; interface HTMLAttributesWeak extends Omit<React.HTMLAttributes<HTMLElement>, 'defaultValue' | 'select' | 'onSelect'> { } /** * @api */ export type CalendarMode = 'date' | 'month' | 'year'; /** * @api * @order 1 */ export interface CalendarProps extends Omit<HTMLAttributesWeak, 'onChange'>, Omit<CommonProps, 'locale'> { /** * 默认选中的日期(moment 对象) * @en Default selected date (moment object) */ defaultValue?: Moment | null; /** * 展现形态 * @en Display shape * @defaultValue 'fullscreen' */ shape?: 'card' | 'fullscreen' | 'panel'; /** * 选中的日期值 (moment 对象) * @en Selected date value (moment object) */ value?: Moment | null; /** * 面板模式 * @en Panel mode */ mode?: CalendarMode; /** * 是否展示非本月的日期 * @en Whether to show dates outside the current month * @defaultValue true */ showOtherMonth?: boolean; /** * 默认展示的月份 * @en Default displayed month */ defaultVisibleMonth?: () => Moment | null; /** * 面板模式变化时的回调 * @en Callback when the panel mode changes * @param mode - 对应面板模式 date, month, year */ onModeChange?: (mode: CalendarMode) => void; /** * 选择日期单元格时的回调 * @en Callback when selecting a date cell */ onSelect?: (value: Moment) => void; /** * 展现的月份变化时的回调 * @en Callback when the displayed month changes */ onVisibleMonthChange?: (value: Moment, reason: VisibleMonthChangeType) => void; /** * 自定义日期渲染函数 * @en Customize date rendering function * @defaultValue value =\> value.date() */ dateCellRender?: (value: Moment) => React.ReactNode; /** * 自定义月份渲染函数 * @en Customize month rendering function */ monthCellRender?: (calendarDate: Moment) => React.ReactNode; /** * 兼容 0.x yearCellRender * @deprecated use monthCellRender/dateCellRender instead * @skip */ yearCellRender?: (calendarDate: Moment) => React.ReactNode; /** * 不可选择的日期 * @en Disabled date */ disabledDate?: (calendarDate: Moment, view: CalendarMode) => boolean; /** * 面板可变化的模式列表,仅初始化时接收一次 * @en Panel mode list that can be changed, only received once at initialization * @defaultValue ['date', 'month', 'year'] */ modes?: CalendarMode[]; /** * 禁用更改面板模式,采用 dropdown 的方式切换显示日期 (暂不正式对外透出) * @en Disable changing panel mode, use the dropdown method to switch displayed dates * @defaultValue false * @skip */ disableChangeMode?: boolean; /** * 日期值的格式(用于日期 title 显示的格式) * @en Date value format(for date title display format) * @defaultValue 'YYYY-MM-DD' */ format?: string; /** * 多语言文案 * @en International text * @skip */ locale?: Locale['Calendar']; /** * 年份范围,[START_YEAR, END_YEAR] (只在 shape 为‘card’, 'fullscreen' 下生效) * @en Year range, [START_YEAR, END_YEAR] (only effective when shape is 'card', 'fullscreen') */ yearRange?: [start: number, end: number]; /** * @deprecated use disabledDate instead * @skip */ disabledMonth?: unknown; /** * @deprecated use disabledDate instead * @skip */ disabledYear?: unknown; /** * @deprecated use shape instead * @skip */ type?: CalendarProps['shape']; /** * @deprecated use onSelect instead * @skip */ onChange?: (options: { mode: CalendarMode; value: Moment; }) => void; /** * @deprecated use defaultVisibleMonth instead * @skip */ base?: MomentInput; } /** * @api Calendar.RangeCalendar * @order 2 */ export interface RangeCalendarProps extends HTMLAttributesWeak, Omit<CommonProps, 'locale'> { /** * 多语言文案 * @skip */ locale?: Locale['Calendar']; /** * 面板模式 * @en Panel mode * @defaultValue 'date' */ mode?: CalendarMode; /** * 禁用更改面板模式,采用 dropdown 的方式切换显示日期 (暂不正式对外透出) * @en Disable changing panel mode, use the dropdown method to switch displayed dates * @defaultValue false * @skip */ disableChangeMode?: boolean; /** * 日期值的格式(用于日期 title 显示的格式) * @en Date value format(for date title display format) * @defaultValue 'YYYY-MM-DD' */ format?: string; /** * 自定义日期渲染函数 * @en Customize date rendering function * @defaultValue value =\> value.date() */ dateCellRender?: (value: Moment) => React.ReactNode; /** * 选择日期单元格时的回调 * @en Callback when selecting a date cell */ onSelect?: (value: Moment) => void; /** * 展现的月份变化时的回调 * @en Callback when the displayed month changes */ onVisibleMonthChange?: (value: Moment, reason: VisibleMonthChangeType) => void; /** * 是否展示非本月的日期 * @en Whether to show dates outside the current month * @defaultValue true */ showOtherMonth?: boolean; /** * 开始日期(moment 对象) * @en Start date (moment object) */ startValue?: Moment | null; /** * 结束日期(moment 对象) * @en End date (moment object) */ endValue?: Moment | null; /** * 默认的开始日期(moment 对象) * @en Default start date (moment object) */ defaultStartValue?: Moment | null; /** * 默认的结束日期(moment 对象) * @en Default end date (moment object) */ defaultEndValue?: Moment | null; /** * 自定义月份渲染函数 * @en Customize month rendering function */ monthCellRender?: (calendarDate: Moment) => React.ReactNode; /** * 默认展示的月份 * @en Default displayed month */ defaultVisibleMonth?: () => Moment | null; /** * 兼容 0.x yearCellRender * @deprecated use monthCellRender/dateCellRender instead * @skip */ yearCellRender?: (calendarDate: Moment) => React.ReactNode; /** * 不可选择的日期 * @en Disabled date */ disabledDate?: (calendarDate: Moment, view: CalendarMode) => boolean; /** * 展现形态 * @en Display shape */ shape?: 'card' | 'fullscreen' | 'panel'; /** * 年份范围,[START_YEAR, END_YEAR] (只在 shape 为‘card’, 'fullscreen' 下生效) * @en Year range, [START_YEAR, END_YEAR] (only effective when shape is 'card', 'fullscreen') */ yearRange?: [number, number]; } export interface MomentLocaleLike extends Omit<MomentLocale, 'monthsShort' | 'months' | 'firstDayOfWeek' | 'weekdays' | 'weekdaysShort' | 'weekdaysMin'> { monthsShort: () => string[]; months: () => string[]; firstDayOfWeek: () => number; weekdays: () => string[]; weekdaysShort: () => string[]; weekdaysMin: () => string[]; } interface CommonTableProps { visibleMonth: Moment; today: Moment; momentLocale: MomentLocaleLike; } export interface DateTableProps extends Pick<Required<CalendarProps>, 'dateCellRender' | 'showOtherMonth' | 'format' | 'value' | 'locale'>, Pick<CalendarProps, 'disabledDate'>, Pick<RangeCalendarProps, 'startValue' | 'endValue'>, Omit<CommonProps, 'locale'>, CommonTableProps { onSelectDate: (value: Moment, e: React.MouseEvent<HTMLElement>) => void; } export interface DateTableHeadProps extends CommonProps { momentLocale: MomentLocaleLike; } export interface MonthTableProps extends Pick<Required<CalendarProps>, 'value' | 'locale'>, Pick<CalendarProps, 'disabledDate' | 'monthCellRender'>, Omit<CommonProps, 'locale'>, CommonTableProps { onSelectMonth: (value: Moment, mode: 'date') => void; } export interface YearTableProps extends Pick<Required<CalendarProps>, 'value' | 'locale'>, Pick<CalendarProps, 'yearCellRender' | 'disabledDate'>, Omit<CommonProps, 'locale'>, CommonTableProps { onSelectYear: (value: Moment, mode: 'month') => void; goPrevDecade: () => void; goNextDecade: () => void; } export interface CardHeaderProps extends Pick<Required<CalendarProps>, 'yearRange' | 'locale' | 'mode' | 'showOtherMonth'>, Omit<CommonProps, 'locale'> { yearRangeOffset?: number; momentLocale: MomentLocaleLike; changeMode: (mode: CalendarMode) => void; visibleMonth: Moment; changeVisibleMonth: (value: Moment, type: VisibleMonthChangeType) => void; } export interface RangePanelHeaderProps extends Pick<Required<RangeCalendarProps>, 'locale' | 'disableChangeMode'>, Pick<RangeCalendarProps, 'yearRange'>, Omit<CommonProps, 'locale'> { startVisibleMonth: Moment; endVisibleMonth: Moment; yearRangeOffset?: number; momentLocale: MomentLocaleLike; changeMode: (mode: CalendarMode, type: 'start' | 'end') => void; goNextMonth: () => void; goNextYear: () => void; goPrevMonth: () => void; goPrevYear: () => void; changeVisibleMonth: (value: Moment, type: VisibleMonthChangeType) => void; } export interface DatePanelHeaderProps extends Pick<Required<CalendarProps>, 'locale' | 'disableChangeMode' | 'yearRange' | 'showOtherMonth'>, Omit<CommonProps, 'locale'> { goNextMonth: () => void; goNextYear: () => void; goPrevMonth: () => void; goPrevYear: () => void; changeMode: (mode: CalendarMode, type: 'start' | 'end') => void; momentLocale: MomentLocaleLike; visibleMonth: Moment; yearRangeOffset: number; changeVisibleMonth: (value: Moment, type: VisibleMonthChangeType) => void; } export interface SelectMenuProps extends CommonProps { dataSource: { value: React.Key; label: React.ReactNode; }[]; onChange: (value: number) => void; value: string | number; className?: string; } export interface MonthPanelHeaderProps extends Pick<Required<CalendarProps>, 'locale'>, Omit<CommonProps, 'locale'> { goNextYear: () => void; goPrevYear: () => void; changeMode: (mode: CalendarMode) => void; visibleMonth: Moment; } export interface YearPanelHeaderProps extends Pick<Required<CalendarProps>, 'locale'>, Omit<CommonProps, 'locale'> { goPrevDecade: () => void; goNextDecade: () => void; visibleMonth: Moment; } /** * @api */ export type VisibleMonthChangeType = 'cellClick' | 'buttonClick' | 'yearSelect' | 'monthSelect'; export interface CalendarState { value: Moment | null; visibleMonth: Moment; mode: CalendarMode; MODES: CalendarMode[]; } export interface RangeCalendarState { startValue: Moment | null; startVisibleMonth: Moment; endValue: Moment | null; prevMode?: CalendarMode; mode?: CalendarMode; lastMode?: CalendarMode; activePanel?: 'start' | 'end'; lastPanelType: 'start' | 'end'; } export {};