import { FC, ReactNode, FocusEvent, MouseEvent } from 'react'; import { Popper } from '@befe/brick-comp-popper'; import dayjs, { Dayjs } from 'dayjs'; import { InputProps } from '@befe/brick-comp-input'; import { UiTimePanel, COL_NAMES } from '@befe/brick-comp-time-picker'; import { TypeModuleMonthPanel } from '../modules/create-month-panel'; import { TypeActionLink, TypeDatePickerMode, TypeDateValue, TypePickerSize, TypePickerStatus } from './prop-types'; import { CalendarIcon } from './partial-calender-icon'; import { QuickActions } from './create-quick-actions'; type InnerDatePickerPropsFromInput = Pick; export interface DatePickerProps extends InnerDatePickerPropsFromInput { /** * 自定义 class */ className?: string; /** * 选中的日期值 (控制属性) * * @type Date | DayJS | null */ value?: TypeDateValue; /** * 选中的日期值 (非控制属性) * * @type Date | DayJS | null */ defaultValue?: TypeDateValue; disabled?: boolean; /** * 整体大小控制 : xs, sm, md, lg, xl * 会影响 "输入框" & "面板" 的尺寸 */ size?: TypePickerSize; /** * 是否当前出于出错状态 */ status?: TypePickerStatus; /** * 选择器的取值类型 */ mode?: TypeDatePickerMode; /** * 用来将 value 格式化给 input 框, 以及从 input 框中还原 value * * 默认: * - date: 'YYYY-MM-DD' * - month: 'YYYY-MM' * - quarter: 'YYYY-\QQ' * * 可参考: * [基础 format 格式](https://github.com/iamkun/dayjs/blob/HEAD/docs/en/API-reference.md#format-formatstringwithtokens-string) * & [高级 format 格式](https://github.com/iamkun/dayjs/blob/66ce23f2e18c5506e8f1a7ef20d3483a4df80087/docs/en/Plugin.md#advancedformat) */ itemFormat?: string; renderItem?: (currentDate: Dayjs, today: Dayjs) => (JSX.Element | string | number); getDisabledItem?: (currentDate: Dayjs, today: Dayjs) => boolean; /** * 当日期面板打开时, 设置其 "显示的面板位置" * * 这个可能主要在当没有选择日期时, 用于确定面板月份的显示策略 ( 缺省方案是显示 "当月" 或 "当年" ) */ getDefaultDisplayDate?: (today: Dayjs) => Dayjs; /** * 只在 date 模式有意义, 是否允许选择时间 * * @default false */ showTime?: boolean; /** * 是否显示此刻 * * @default false */ hideNow?: boolean; /** * 是否显示时间 * * @default false */ showSecond?: boolean; /** * 某天中, 可选的时间范围 * * start, end 0 ~ 24 x 60 x 60 (一天的秒数), 如果为 null, 视为 无限制 */ getDisabledTime?: (currentDate: Dayjs) => ({ start: number | null; end: number | null; }); /** * 面板的显隐 (控制属性) */ open?: boolean | undefined; /** * 当选择器的面板显隐状态发生更改时, 会触发该回调 * 这个是提供给外部组件, 进行完全的 date picker 面板显隐控制用 * * @note: 如果你要接管 open 属性, 请务必确保这个 API 也实现了 * * @param openStatus */ onOpenChange?: (openStatus: boolean, value: Dayjs | null) => void; /** * 日期选择器 input 框的 placeholder */ placeholder?: string; style?: CSSStyleDeclaration; /** * 面板的附加 className */ popupClassName?: string; /** * @todo * * 面板的附加 style 控制 */ popupStyle?: CSSStyleDeclaration; /** * 当选择中一个日期时, 会触发该回调 * * @param selected */ onChange?: (selected: Dayjs | null) => void; /** * 自定义绘制 "面板的脚区域" */ renderFooter?: () => JSX.Element | TypeActionLink[]; /** * @todo * 自定义绘制面板的侧边快捷操作 */ renderQuickActions?: () => TypeActionLink[]; /** * 提供给日期 (date) 选择中, 快速切换月份时, 年份的起始范围 * * 默认: 已选中年或当前年的往前 12年 */ yearStart?: number; /** * 参见 yearStart, * * 默认: 已选中年或当前年的往后 12年 */ yearEnd?: number; /** * 是否支持清除已选值 */ clearable?: boolean; onFocus?: (e: FocusEvent) => void; onBlur?: (e: FocusEvent) => void; autoFocus?: boolean; onMouseEnter?: (e: MouseEvent) => void; onMouseLeave?: (e: MouseEvent) => void; iconSvg?: FC; iconNode?: ReactNode; } export interface DatePickerState { open: boolean; isZooming: boolean; inputValue: string; value: Dayjs | null; timeState: { hour: number | undefined; minute: number | undefined; second: number | undefined; }; displayedDate: Dayjs | null; zoomedDisplayedDate: Dayjs | null; isUserInput: boolean; userInputText: string; isHoverOverCalendar: boolean; } export interface Type_InnerDatePicker { changeValue: (selectedDate: (dayjs.Dayjs | null), opts?: { timeState?: DatePickerState['timeState']; onStateChanged?: () => void; }) => void; processOpenStatus: (opts: { open?: boolean; isUserInput?: boolean; }) => void; } export declare const preventPickerBlurred: (e: MouseEvent) => void; /** * @todo. @review. * 这个是之前为了 "luffy" (如流那边的使用场景) 预留的一种写法, 目前已经不应该这么写了... * 太过费劲... * 包括 => create input 的部分 * * @param customIconDefaultOption */ export declare function createInnerDatePicker(customIconDefaultOption?: CalendarIcon['opts']): { new (props: any): { componentLocale: import("@befe/brick-core").ComponentLocale<{ en_us: { get_year_month_title: (date: dayjs.Dayjs) => string; get_year_title: (date: dayjs.Dayjs) => string; get_month_text: (month: number) => string; get_week_day_text: (day: number) => string; }; /** * 自定义 class */ zh_cn: { get_year_month_title: (date: dayjs.Dayjs) => string; get_year_title: (date: dayjs.Dayjs) => string; get_month_text: (month: number) => string; get_week_day_text: (day: number) => string; }; }>; state: DatePickerState; userInput: { renderInput(): import("react/jsx-runtime").JSX.Element; formatInputValue: (value: dayjs.Dayjs | null) => string; readonly inputElem: HTMLInputElement | undefined; }; readonly inputElem: HTMLInputElement | undefined; readonly size: TypePickerSize | undefined; getWeekDayText: (day: number) => string; datePanel: { init(panelOpts: import("../modules/create-date-panel").TypeInitOpts, switcherOpts?: import("../modules/create-date-switcher").TypeDisplayedDateSwitcherInitOpts | undefined): void; getRenderElem(): { titleElem: import("react/jsx-runtime").JSX.Element; contentElem: import("react/jsx-runtime").JSX.Element; contentType: import("../module-defs/ui-types").TypePickerContentType; asideElem: undefined; }; renderPanel(): import("react/jsx-runtime").JSX.Element; }; getPanelTitle_year: (date: Dayjs) => string; getMonthText: (month: number) => string; zoomedDatePanel: TypeModuleMonthPanel; monthPanel: { init(opts: import("../modules/create-month-panel").TypeInitOpts): void; getRenderElem(): { titleElem: ReactNode; contentElem: ReactNode; asideElem: ReactNode; contentType: import("../module-defs/ui-types").TypePickerContentType; }; renderPanel(): import("react/jsx-runtime").JSX.Element; } & { setYearRangeAnchor: (yearAnchor: number) => void; syncAsideScroll: () => void; }; quarterPanel: { init(opts: import("../modules/create-quarter-panel").TypeInitOpts): void; renderPanel(): import("react/jsx-runtime").JSX.Element; } & { setYearRangeAnchor: (yearAnchor: number) => void; syncAsideScroll: () => void; }; inputWrapperElem: HTMLDivElement | null; panelWrapperElem: Popper | null; actionQueue: { pushAction(action: () => void, key?: string | undefined): void; execute(): void; }; listenerGroup: import("@befe/brick-utils").ListenerGroup; previousOpen: boolean | null; quickActions: QuickActions; refInputWrapper: (node: HTMLDivElement | null) => void; refPanelWrapper: (node: Popper | null) => void; syncDisplayDate: () => void; /** * 用于 `非控型组件` 进行取值设置 * * @param value */ setValue: (value: TypeDateValue) => void; /** * 用于提供给 `非控型组件` 的值获取 */ getValue: () => dayjs.Dayjs | null; focus(): void; componentDidUpdate(): void; componentDidMount(): void; componentWillUnmount(): void; readonly className: string; readonly popupClassName: string; readonly computedItemFormat: string; readonly computedItemValueExtractor: (text: string) => dayjs.Dayjs; changeValue: (selectedDate: Dayjs | null, opts?: { timeState?: DatePickerState['timeState']; onStateChanged?: () => void; }) => void; /** * - 确保打开时, scroll 到特定的年份 * - displayDate 被重置 */ processOpenStatus: (opts: { open?: boolean; isUserInput?: boolean; }) => void; /** * 如果涉及 value 更改, 务必将 value 传递过来 * @param open * @param value */ setOpen: (open: boolean, value?: Dayjs | null) => void; handleCalendarIconClick: () => void; changeDatePickerOpenStatus: (visible: boolean, value?: Dayjs | null) => void; refUITimePanel: UiTimePanel | null; tryScrollToSelectedTime: () => void; changeTime: (propName: (typeof COL_NAMES)[number], propValue: number) => void; setCurrentDateTime: () => void; confirmDateTime: () => void; renderTimeArea: () => import("react/jsx-runtime").JSX.Element; renderPanel: () => import("react/jsx-runtime").JSX.Element | null; render(): import("react/jsx-runtime").JSX.Element; context: import("@befe/brick-core").ConfigContextValue; getLocaleText(key: string, ...args: import("@befe/brick-core").LocaleTextReplacement[]): string; getThemeValue(themePropName: TN): import("@befe/brick-core").ThemeConfigWithDefaults[TN]; getDefaultValueUsingTheme(propName: N, themePropName: TN_1): Required[N] | import("@befe/brick-core").ThemeConfigWithDefaults[TN_1]; setState(state: DatePickerState | ((prevState: Readonly, props: Readonly) => DatePickerState | Pick | null) | Pick | null, callback?: (() => void) | undefined): void; forceUpdate(callback?: (() => void) | undefined): void; readonly props: Readonly & Readonly<{ children?: ReactNode; }>; refs: { [key: string]: import("react").ReactInstance; }; shouldComponentUpdate?(nextProps: Readonly, nextState: Readonly, nextContext: any): boolean; componentDidCatch?(error: Error, errorInfo: import("react").ErrorInfo): void; getSnapshotBeforeUpdate?(prevProps: Readonly, prevState: Readonly): any; componentWillMount?(): void; UNSAFE_componentWillMount?(): void; componentWillReceiveProps?(nextProps: Readonly, nextContext: any): void; UNSAFE_componentWillReceiveProps?(nextProps: Readonly, nextContext: any): void; componentWillUpdate?(nextProps: Readonly, nextState: Readonly, nextContext: any): void; UNSAFE_componentWillUpdate?(nextProps: Readonly, nextState: Readonly, nextContext: any): void; }; dayjs: typeof dayjs; displayName: string; defaultProps: DatePickerProps; getDerivedStateFromProps(nextProps: DatePickerProps, prevState: DatePickerState): Partial | null; contextType: import("react").Context; }; export type TypeInnerDatePicker = InstanceType>; export {};