shineout
Version:
Shein 前端组件库
333 lines (332 loc) • 13.7 kB
TypeScript
import React, { ReactNode } from 'react';
import { KeygenResult, ObjectKey, RegularAttributes, KeygenType, ObjectType, StandardProps } from '../@types/common';
import { GetInputableProps } from '../Form/Props';
import DatumTree, { TreeDatumOptions } from '../Datum/Tree';
import { GetInputBorderProps } from '../hoc/Props';
import { AbsoluteProps, GetAbsoluteProps } from '../AnimationList/Props';
import { GetTableConsumerProps } from '../Table/Props';
import { InputTitleProps } from '../InputTitle/Props';
/**
* @title CascaderRef
* @isDetail true
*/
interface ComponentRef {
/**
* @en Close the drop-down box
* @cn 关闭下拉框
*/
close: (e?: MouseEvent) => void;
}
export declare type CascaderBaseValue = (string | number)[];
/** ------ filterHoc ------ * */
export interface FilterProps<DataItem> extends Pick<TreeDatumOptions<DataItem>, 'mode'> {
/**
* @en the key of the children data name
* @cn 指定子数据的属性名
* @default 'children'
*/
childrenKey?: ObjectKey<DataItem>;
data: DataItem[];
/**
* @en The delay in milliseconds before the filter event is triggered by user input.
* @cn 用户输入触发 fitler 事件的延时,单位为毫秒。
* @default 'children'
*/
filterDelay?: number;
keygen: KeygenType<DataItem>;
/**
*
* @en When the onFilter is not empty, you can filter data by input.
* If the onFilter returns a function, use this function as a front-end filter.
* If return undefined, you can do your own backend filtering.
* support in single selection state
*
* @cn onFilter 不为空时,可以输入过滤数据
* onFilter 如果返回一个函数,使用这个函数做前端过滤
* 如果不返回,可以自行做后端过滤
* 单选状态下支持
*/
onFilter?: (text: string) => ((data: DataItem) => boolean) | undefined | void;
}
export declare type GetFilterProps<Props, DataItem> = Omit<Props, 'filterText' | 'filterDataChange' | 'firstMatchNode' | 'onFilter' | 'childrenKey' | 'sourceData'> & Pick<FilterProps<DataItem>, 'onFilter' | 'childrenKey' | 'filterDelay'>;
export interface OriginCascaderProps<DataItem, Value extends CascaderBaseValue> extends Pick<AbsoluteProps, 'absolute' | 'zIndex'>, Pick<InputTitleProps, 'innerTitle'>, Pick<TreeDatumOptions<DataItem>, 'mode'>, Pick<StandardProps, 'style'> {
/**
* @inner 源数据
*/
sourceData?: DataItem[];
/**
* @en Form field, used with Form
* @cn 表单字段, 配合 Form 使用
*/
name?: string;
/**
* @en Only the last node can be selected
* @cn 单选只支持选末级节点
*/
final?: boolean;
/**
* @en Custom render dropdown
* @cn 自定义渲染下拉列表
*/
renderOptionList?: (list: React.ReactElement, info: {
loading: boolean;
}) => React.ReactElement;
/**
* @en Custom rendering unmatched values
* @cn 渲染未匹配值的方式
*/
renderUnmatched?: (data: any) => ReactNode;
inputFocus: boolean;
/**
* @en Set visible of cascader popup
* @cn 控制浮层显隐
*/
open?: boolean;
/**
* @en Selected key (controlled)
* @cn 选中的 key (受控)
*/
value?: Value;
/**
* @en data. The child node is children. If the children value is null or its length is 0, it is render as a leaf node
* @cn 数据,子节点为children,如果 children 值为 null 或 长度为 0 时,视为叶子节点
* @override any[]
*/
data?: DataItem[];
/**
* @en height of dropdown options
* @cn 下拉列表高度
* @default 300
*/
height?: number;
/**
* @en render unmatch value
* @cn 是否展示data中不存在的值
* @default true
*/
unmatch?: boolean;
/**
* @en If clearable is true, show clear value icon
* @cn 是否显示清除数据图标
* @default true
*/
clearable?: boolean;
/**
* @en Allows all possible matching options to be choosed
* @cn 开启 wideMatch 后,将筛选出所有可能的匹配项目
* @default false
*/
wideMatch?: boolean;
/**
* @en show dropdown arrow, only single select
* @cn 是否显示下拉箭头,仅针对单选情况
* @default true
*/
showArrow?: boolean;
/**
* @en close options after chose the final node
* @cn 选择末级节点后是否关闭选项列表
* @default false
*/
finalDismiss?: boolean;
/**
* @en Support single node deletion
* @cn 支持单个节点删除
*/
singleRemove?: boolean;
/**
* @en when compressed is True,the comptessedBound can limit the numbers of multiple selected item's label
* @cn 开启多选后,指定允许展示标签数量,超过后将折叠
*/
compressedBound?: number;
/**
* @en dropdown list loading state
* @cn 下拉列表加载状态
* @override boolean | ReactNode
*
*/
loading?: boolean | ReactNode;
/**
* @en size
* @cn 尺寸
* @override union
* @default 'default'
*/
size?: RegularAttributes.Size;
/**
* @en the key of the children data name
* @cn 指定子数据的属性名
* @default 'children'
*/
childrenKey: ObjectKey<DataItem>;
/**
* @en Merges selected values; the repeat value will not appear in the Popover when it is'no-repeat'
* @cn 将选中值合并。为'no-repeat'时弹出框中不重复展示值
* @default false
*/
compressed?: boolean | 'no-repeat';
/**
* @en options collapse callback
* @cn 下拉列表展开/收起回调
*/
onCollapse?: (collapse: boolean) => void;
/**
* @en If the loader attribute is a function, the node with no children is regarded as dynamically loaded node. Click expanded button to trigger the loader event. The children property is null or its length is 0 will be regarded as a leaf node.
* @cn 设置 loader 属性后,未定义 children 的节点视为动态加载节点,点击展开触发 loader 事件,children 为 null 或者长度为 0 视为叶子节点
*/
loader?: (key: KeygenResult, data: DataItem) => void;
/**
* @en When it is true, all nodes disable the selection; when it is a function, it determines whether it is disabled according to the return result of the function.
* @cn 当 disabled 为 true 时,禁用整个选择框。如果 disabled 为函数,根据函数反回结果禁用选项
* @default false
*/
disabled?: ((data: DataItem) => boolean) | boolean;
/**
* @en Expand mode
* @cn 节点展开触发方式
* @default 'click'
*/
expandTrigger?: 'click' | 'hover' | 'hover-only';
/**
* @en When the onChange property is set, the selection box is displayed. The parameter is the current selected value, which is related to the mode property.
* @cn 设置 onChange 属性时,显示 选择框。参数为当前选中值,和 mode 属性相关
*/
onChange: (value: Value, selected?: DataItem) => void;
/**
* @en When the onFilter is not empty, you can filter data by input.If the onFilter returns a function, use this function as a front-end filter.If return undefined, you can do your own backend filtering.support in single selection state.
* @cn onFilter 不为空时,可以输入过滤数据;onFilter 如果返回一个函数,使用这个函数做前端过滤;如果不返回,可以自行做后端过滤;单选状态下支持
*/
onFilter?: (text: string) => void;
/**
* @en Auxiliary method for generating key. When it is a function, use the return value of this function. When it is a string, use the data value corresponding to this string. For example, 'id' is the same thing as (d) => d.id.
* @cn 生成 key 的辅助方法, 为函数时,使用此函数返回值, 为 string 时,使用这个 string 对应的数据值。如 'id',相当于 (d) => d.id
* @default index
*/
keygen: ((data: DataItem, parentKey?: KeygenResult) => KeygenResult) | ObjectKey<DataItem>;
/**
* @en A reference to the binding component, you can call some component methods
* @cn 绑定组件的引用, 可以调用某些组件的方法
*
*/
getComponentRef?: ((comp: ComponentRef) => void) | {
current: ComponentRef | undefined;
};
/**
* @en When 'renderItem' is a string, it returns DataItem[string]. If it's a function, it returns the result of the function.
* @cn 当 renderItem 为 string 时,返回 DataItem\\[string]。 若为函数时,则返回函数结果
* @default d => d
*/
renderItem: ObjectKey<DataItem> | ((data: DataItem, active?: boolean, id?: Value[0]) => React.ReactNode);
/**
* @en The content displayed in the result after selecting, if not set, use renderItem. not show while return null, result is current selected
* @cn 选中后在结果中显示的内容,默认和 renderItem 相同
* @default renderItem
*/
renderResult?: ObjectKey<DataItem> | ((data: DataItem, row: DataItem[]) => React.ReactNode);
/**
* @inner 弹出位置
*/
position?: 'drop-up' | 'drop-down';
firstMatchNode: DataItem;
filterText: string;
filterDataChange: (data: DataItem) => boolean;
/**
* @en blur event
* @cn 失焦事件
*/
onBlur: (e?: MouseEvent) => void;
/**
* @en focus event
* @cn 聚焦事件
*/
onFocus: (e?: FocusEvent) => void;
/**
* @en placeholder
* @cn 占位符
*/
placeholder?: ReactNode;
/**
* @inner 内部属性
*/
trim?: boolean;
/**
* @en empty input after select value
* @cn 选中后是否清空输入框内容
* @default true
*/
emptyAfterSelect?: boolean;
}
/** ------ filterList ------ * */
export interface FilterListProps<DataItem, Value extends CascaderBaseValue> extends Pick<OriginCascaderProps<DataItem, Value>, 'wideMatch' | 'onFilter' | 'filterText' | 'zIndex' | 'data' | 'childrenKey' | 'renderItem' | 'filterDataChange' | 'height' | 'loading' | 'expandTrigger' | 'placeholder' | 'renderOptionList'> {
shouldFinal: boolean;
fixed: string;
focus: boolean;
parentElement: HTMLElement;
'data-id': string;
datum: DatumTree<DataItem>;
getRef: () => void;
onChange: (value: Value, Data?: DataItem) => void;
onPathChange: (key: Value[0], item: DataItem | null, keys: Value, is?: boolean) => void;
}
export interface FilterItemProps<DataItem, Value extends CascaderBaseValue> extends Omit<FilterListProps<DataItem, Value>, 'data' | 'childrenKey' | 'height' | 'loading' | 'wideMatch'> {
data: DataItem[];
}
export declare class FilterList<DataItem, Value extends CascaderBaseValue> extends React.Component<GetAbsoluteProps<FilterListProps<DataItem, Value>>, any> {
render(): JSX.Element;
}
export declare type FilterListType = typeof FilterList;
/** ------ CascaderList ------ * */
export interface CascaderListProps<DataItem, Value extends CascaderBaseValue> extends Pick<OriginCascaderProps<DataItem, Value>, 'renderItem' | 'keygen' | 'loader' | 'expandTrigger' | 'childrenKey' | 'data'> {
shouldFinal: boolean;
datum: FilterListProps<DataItem, Value>['datum'];
onChange: FilterListProps<DataItem, Value>['onChange'];
onPathChange: FilterListProps<DataItem, Value>['onPathChange'];
multiple: boolean;
text?: ObjectType;
id: Value[0];
parentId: Value[0];
path: Value;
}
/** ------ Node ------ * */
export interface NodeProps<DataItem, Value extends CascaderBaseValue> extends Omit<CascaderListProps<DataItem, Value>, 'data'> {
active: boolean;
data: DataItem;
}
/** ------ result ------ * */
export interface ResultProps<DataItem, Value extends CascaderBaseValue> extends Omit<OriginCascaderProps<DataItem, Value>, 'disabled'> {
datum: DatumTree<DataItem>;
onPathChange: FilterListProps<DataItem, Value>['onPathChange'];
showList: () => void;
focus: boolean;
handleRemove: (data: DataItem) => void;
onClear: () => void;
multiple: boolean;
bindInput: (Input: any) => void;
selectId: string;
emptyAfterSelect?: boolean;
}
export interface ResultItemProps<DataItem> {
children: ReactNode;
close: (data: DataItem, isPopover: boolean, e: Event) => void;
className: string;
data: DataItem;
isPopover: boolean;
singleRemove?: boolean;
click: (data: DataItem, isPopover: boolean) => void;
only: boolean;
isDisabled: boolean;
}
/** ------ CascaderProps ------ * */
declare type CascaderPropsWithTableConsumber<Item, Value extends CascaderBaseValue> = GetTableConsumerProps<OriginCascaderProps<Item, Value>>;
declare type CascaderPropsWithFilter<Item, Value extends CascaderBaseValue> = GetFilterProps<CascaderPropsWithTableConsumber<Item, Value>, Item>;
declare type CascaderPropsWithBorder<Item, Value extends CascaderBaseValue> = Omit<GetInputBorderProps<CascaderPropsWithFilter<Item, Value>>, 'autoFocus'>;
declare type CascaderPropsWithInput<Item, Value extends CascaderBaseValue> = GetInputableProps<CascaderPropsWithBorder<Item, Value>, Value>;
/**
* @title Cascader
*/
export declare type CascaderProps<Item, Value extends CascaderBaseValue> = CascaderPropsWithInput<Item, Value>;
export declare class CascaderClass<Item, Value extends CascaderBaseValue> extends React.Component<CascaderProps<Item, Value>, {}> {
render(): JSX.Element;
}
export declare type CascaderType = typeof CascaderClass;
export {};