@alifd/next
Version:
A configurable component library for web built on React.
524 lines (523 loc) • 17.7 kB
TypeScript
import type { CSSProperties, HTMLAttributes, InputHTMLAttributes, JSXElementConstructor, ReactNode } from 'react';
import type { Dayjs, ConfigType } from 'dayjs';
import type { CommonProps } from '../util';
import type { PopupProps } from '../overlay';
import type { InputProps } from '../input';
import type { ButtonProps } from '../button';
import type { Locale } from '../locale/types';
export interface DateInputProps extends Omit<InputCommonHTMLAttributes, 'disabled' | 'onInput'>, Omit<CommonProps, 'locale'> {
prefix?: string;
rtl?: boolean;
locale?: Locale['Input'];
value?: string | string[];
inputType?: InputType;
format?: string | ((v: Dayjs) => Dayjs);
isRange?: boolean;
hasClear?: boolean | null;
onInput?: (v: string | number | null | (string | number | null)[], evetType?: string) => void;
onInputTypeChange?: (v: number) => void;
autoFocus?: boolean;
readOnly?: boolean;
placeholder?: string;
size?: 'small' | 'medium' | 'large';
focus?: boolean;
hasBorder?: boolean;
onKeyDown?: InputProps['onKeyDown'];
onClick?: InputProps['onClick'];
separator?: ReactNode;
disabled?: boolean | boolean[];
inputProps?: InputProps;
label?: ReactNode;
state?: InputProps['state'];
defaultValue?: string | number | null | undefined;
onBlur?: InputProps['onBlur'];
className?: string;
}
export type InputType = 0 | 1;
export interface PresetType extends Omit<ButtonProps, 'value' | 'label'> {
label?: string;
value?: ConfigType | ConfigType[] | (() => ConfigType | ConfigType[]);
}
interface InputCommonHTMLAttributes extends Omit<React.InputHTMLAttributes<HTMLElement>, 'defaultValue' | 'onChange' | 'onKeyDown' | 'size' | 'maxLength' | 'value'> {
[key: `data-${string}`]: string;
}
interface HTMLAttributesWeak extends Omit<HTMLAttributes<HTMLElement>, 'onChange' | 'defaultValue'> {
}
interface TimeMenuPropsCommonHTMLAttributes extends Omit<InputHTMLAttributes<HTMLElement>, 'value' | 'onKeyDown' | 'size' | 'onInput' | 'disabled' | 'defaultValue'> {
}
export interface TimeMenuProps extends CommonProps, Omit<TimeMenuPropsCommonHTMLAttributes, 'title' | 'onSelect'> {
prefix?: string;
title?: ReactNode;
mode?: 'hour' | 'minute' | 'second';
step?: number;
activeIndex: number;
value?: Dayjs | null;
disabledItems?: (index: number) => boolean;
renderTimeMenuItems?: (list: Array<TimeMenuListItem>, mode: TimeMenuProps['mode'], value: TimeMenuProps['value']) => Array<TimeMenuListItem>;
onSelect?: (value: TimeMenuListItem['value'], mode: TimeMenuProps['mode']) => void;
disabled?: boolean;
}
export interface TimeMenuListItem {
label: ReactNode;
value: number;
}
export interface PanelProps extends Omit<CommonProps, 'locale'>, Pick<TimePickerProps, 'prefix' | 'locale' | 'hourStep' | 'minuteStep' | 'secondStep' | 'disabledHours' | 'disabledMinutes' | 'disabledSeconds' | 'renderTimeMenuItems' | 'locale'> {
/**
* 是否显示小时
*/
showHour: boolean;
/**
* 是否显示分钟
*/
showSecond: boolean;
/**
* 是否显示秒
*/
showMinute: boolean;
value?: ValueType;
/**
* 选择某个日期值时的回调
*/
onSelect: (value: Dayjs | Dayjs[], type: PannelType) => void;
className?: string;
isRange: boolean;
disabled: boolean;
}
export type PannelType = 'start' | 'end' | 'panel';
/**
* @api TimePicker
*/
export interface TimePickerProps extends HTMLAttributesWeak, CommonProps {
/**
* 按钮的文案
* @en Button text
*/
label?: ReactNode;
/**
* @deprecated use Form.Item name instead
* @skip
*/
name?: string;
/**
* 时间选择框的尺寸
* @en size of time picker
* @defaultValue 'medium'
*/
size?: 'small' | 'medium' | 'large';
/**
* 输入框状态
* @en input state
*/
state?: 'error' | 'success';
/**
* 是否允许清空时间
* @en whether to allow clearing time
* @defaultValue true
*/
hasClear?: boolean;
/**
* 时间的格式
* @en time format
* @remarks see https://Dayjsjs.com/docs/#/parsing/string-format/
* @defaultValue 'HH:mm:ss'
*/
format?: string;
/**
* 小时选项步长
* @en hour option step
*/
hourStep?: number;
/**
* 分钟选项步长
* @en minute option step
*/
minuteStep?: number;
/**
* 秒钟选项步长
* @en second option step
*/
secondStep?: number;
/**
* 渲染的可选择时间列表 [\{ label: '01', value: 1 \}]
* @en render the selectable time list
* @param list - 默认渲染的列表
* @param mode - 渲染的菜单 hour, minute, second
* @param value - 当前时间,可能为 null
* @returns 返回需要渲染的数据
*/
renderTimeMenuItems?: (list: Array<TimeMenuListItem>, mode: TimeMenuProps['mode'], value: TimeMenuProps['value']) => Array<TimeMenuListItem>;
/**
* 弹层是否显示(受控)
* @en popup layer display status (controlled)
*/
visible?: boolean;
/**
* 弹层默认是否显示(非受控)
* @en popup layer default display status (uncontrolled)
*/
defaultVisible?: boolean;
/**
* 弹层容器
* @en popup layer container
*/
popupContainer?: string | HTMLElement | ((target: HTMLElement) => HTMLElement);
/**
* 弹层对齐方式,详情见 Overlay 文档
* @en popup layer alignment, see Overlay documentation
* @defaultValue 'tl bl'
*/
popupAlign?: string;
/**
* 弹层触发方式
* @en popup layer trigger type
* @defaultValue 'click'
*/
popupTriggerType?: 'click' | 'hover';
/**
* 弹层展示状态变化时的回调
* @en callback when the popup layer display status changes
*/
onVisibleChange?: (visible: boolean, reason?: string) => void;
/**
* 弹层自定义样式
* @en popup layer custom style
*/
popupStyle?: CSSProperties;
/**
* 弹层自定义样式类
* @en popup layer custom style class
*/
popupClassName?: string;
/**
* 弹层属性
* @en popup layer property
*/
popupProps?: PopupProps;
/**
* 跟随触发元素
* @en follow trigger element
*/
followTrigger?: boolean;
/**
* 是否有边框
* @en Whether the input has border
* @defaultValue true
*/
hasBorder?: boolean;
/**
* 是否为预览态
* @en is preview
*/
isPreview?: boolean;
/**
* 预览态模式下渲染的内容
* @en content of preview mode
*/
renderPreview?: (value: ValueType, props: TimePickerProps) => ReactNode;
/**
* 自定义输入框属性
* @en custom input property
*/
inputProps?: InputProps;
/**
* 国际化
* @en internationalization
* @skip
*/
locale?: Locale['TimePicker'];
/**
* 弹层组件
* @en popup component
* @skip
*/
popupComponent?: JSXElementConstructor<PopupProps>;
/**
* 输入框提示
* @en input hint
*/
placeholder?: string;
/**
* 时间值(Dayjs 对象或时间字符串,受控状态使用)
* @en time value (Dayjs object or time string, controlled state use)
*/
value?: string | Dayjs | null | (Dayjs | null | string)[];
/**
* 时间初值(Dayjs 对象或时间字符串,非受控状态使用)
* @en time init value (Dayjs object or time string, uncontrolled state use)
*/
defaultValue?: string | Dayjs | (Dayjs | null)[];
/**
* 禁用小时的函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled hours function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledHours?: (index?: number) => boolean | number[];
/**
* 禁用分钟函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled minutes function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledMinutes?: (index?: number) => boolean | number[];
/**
* 禁用秒钟函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled seconds function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledSeconds?: (index?: number) => boolean | number[];
/**
* 时间值改变时的回调
* @en callback when the time value changes
*/
onChange?: (value: ValueType) => void;
/**
* 时间类型
* @en time type
* @skip
* @defaultValue 'time'
*/
type?: 'time' | 'range';
/**
* 预设值,会显示在时间面板下面
* @en Rreset values, shown below the time panel.
* Can be object or array of object, with the following properties.
* properties:
* label: shown text
* name: key of React element, can be empty, and index will become key instead
* value: date value
*/
preset?: PresetType | PresetType[];
/**
* 禁用
* @en disable
* @defaultValue false
*/
disabled?: boolean | boolean[];
}
export interface TimePickerState {
value?: ValueType;
visible?: boolean | undefined;
inputStr?: string | string[];
inputing?: boolean;
isRange?: boolean;
inputValue?: string | string[];
curValue?: ValueType;
preValue?: ValueType;
selecting?: boolean;
inputType?: InputType;
justBeginInput?: boolean;
}
export type ValueType = Dayjs | (Dayjs | null)[] | null;
/**
* @api TimePicker.RangePicker
*/
export interface RangePickerProps extends Omit<HTMLAttributesWeak, 'placeholder'>, CommonProps {
/**
* 按钮的文案
* @en Button text
*/
label?: ReactNode;
/**
* @deprecated use Form.Item name instead
* @skip
*/
name?: string;
/**
* 时间选择框的尺寸
* @en size of time picker
* @defaultValue 'medium'
*/
size?: 'small' | 'medium' | 'large';
/**
* 输入框状态
* @en input state
*/
state?: 'error' | 'success';
/**
* 是否允许清空时间
* @en whether to allow clearing time
* @defaultValue true
*/
hasClear?: boolean;
/**
* 时间的格式
* @en time format
* @remarks see https://Dayjsjs.com/docs/#/parsing/string-format/
* @defaultValue 'HH:mm:ss'
*/
format?: string;
/**
* 小时选项步长
* @en hour option step
*/
hourStep?: number;
/**
* 分钟选项步长
* @en minute option step
*/
minuteStep?: number;
/**
* 秒钟选项步长
* @en second option step
*/
secondStep?: number;
/**
* 渲染的可选择时间列表 [\{ label: '01', value: 1 \}]
* @en render the selectable time list
* @param list - 默认渲染的列表
* @param mode - 渲染的菜单 hour, minute, second
* @param value - 当前时间,可能为 null
* @returns 返回需要渲染的数据
*/
renderTimeMenuItems?: (list: Array<TimeMenuListItem>, mode: TimeMenuProps['mode'], value: TimeMenuProps['value']) => Array<TimeMenuListItem>;
/**
* 弹层是否显示(受控)
* @en popup layer display status (controlled)
*/
visible?: boolean;
/**
* 弹层默认是否显示(非受控)
* @en popup layer default display status (uncontrolled)
*/
defaultVisible?: boolean;
/**
* 弹层容器
* @en popup layer container
*/
popupContainer?: string | HTMLElement | ((target: HTMLElement) => HTMLElement);
/**
* 弹层对齐方式,详情见 Overlay 文档
* @en popup layer alignment, see Overlay documentation
* @defaultValue 'tl bl'
*/
popupAlign?: string;
/**
* 弹层触发方式
* @en popup layer trigger type
* @defaultValue 'click'
*/
popupTriggerType?: 'click' | 'hover';
/**
* 弹层展示状态变化时的回调
* @en callback when the popup layer display status changes
*/
onVisibleChange?: (visible: boolean, reason?: string) => void;
/**
* 弹层自定义样式
* @en popup layer custom style
*/
popupStyle?: CSSProperties;
/**
* 弹层自定义样式类
* @en popup layer custom style class
*/
popupClassName?: string;
/**
* 弹层属性
* @en popup layer property
*/
popupProps?: PopupProps;
/**
* 跟随触发元素
* @en follow trigger element
*/
followTrigger?: boolean;
/**
* 是否有边框
* @en Whether the input has border
* @defaultValue true
*/
hasBorder?: boolean;
/**
* 是否为预览态
* @en is preview
*/
isPreview?: boolean;
/**
* 预览态模式下渲染的内容
* @en content of preview mode
*/
renderPreview?: (value: ValueType, props: TimePickerProps) => ReactNode;
/**
* 自定义输入框属性
* @en custom input property
*/
inputProps?: InputProps;
/**
* 国际化
* @en internationalization
* @skip
*/
locale?: Locale['TimePicker'];
/**
* 弹层组件
* @en popup component
* @skip
*/
popupComponent?: JSXElementConstructor<PopupProps>;
/**
* 禁用小时的函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled hours function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledHours?: (index?: number) => boolean | number[];
/**
* 禁用分钟函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled minutes function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledMinutes?: (index?: number) => boolean | number[];
/**
* 禁用秒钟函数,TimePicker.RangePicker 时,函数需要返回 number[],且函数中没有 index 入参,非 TimePicker.RangePicker 时,函数需要返回 boolean,函数中有 index 入参
* @en For the disabled seconds function, if it's a TimePicker.RangePicker, the function should return a number[] and it shouldn't have an index parameter. If it's not a TimePicker.RangePicker, the function should return a boolean and it should have an index parameter.
*/
disabledSeconds?: (index?: number) => boolean | number[];
/**
* 时间类型
* @en time type
* @skip
* @defaultValue 'time'
*/
type?: 'time' | 'range';
/**
* 禁用
* @en disable
* @defaultValue false
*/
disabled?: boolean | boolean[];
/**
* 输入框提示
* @en input hint
*/
placeholder?: string | string[];
/**
* 时间值(Dayjs 对象或时间字符串,受控状态使用)
* @en time value (Dayjs object or time string, controlled state use)
*/
value?: Array<ConfigType>;
/**
* 时间初值(Dayjs 对象或时间字符串,非受控状态使用)
* @en time init value (Dayjs object or time string, uncontrolled state use)
*/
defaultValue?: Array<ConfigType>;
/**
* 时间值改变时的回调
* @en callback when the time value changes
*/
onChange?: (value: Array<Dayjs>) => void;
/**
* 确定按钮点击时的回调
* @en callback when the ok button is clicked
*/
onOk?: (value: Array<Dayjs>) => void;
/**
* 预设值,会显示在时间面板下面
* @en Rreset values, shown below the time panel.
* Can be object or array of object, with the following properties.
* properties:
* label: shown text
* name: key of React element, can be empty, and index will become key instead
* value: date value
*/
preset?: PresetType[];
}
export interface DisabledItems {
newDisabledHours: ((index: number) => boolean)[];
newDisabledMinutes: ((index: number) => boolean)[];
newDisabledSeconds: ((index: number) => boolean)[];
}
export {};