shineout
Version:
Shein 前端组件库
300 lines (280 loc) • 10 kB
text/typescript
import * as React from 'react'
import { RegularAttributes, ResultItem, KeygenResult, ValueItem } from '../@types/common'
import DatumTree, { TreeModeType } from '../Datum/Tree'
import { GetInputBorderProps } from '../hoc/Props'
import { GetInputableProps } from '../Form/Props'
import { TreeProps } from '../Tree/Props'
import { GetTableConsumerProps } from '../Table/Props'
import { AbsoluteProps } from '../AnimationList/Props'
type ReactNode = React.ReactNode
export type FilterFormType = 'blur' | 'edit'
export type TreeSelectValueType = KeygenResult | KeygenResult[]
/**
* @title TreeSelectRef
* @isDetail true
*/
export interface ComponentRef<DataItem, Value> {
/**
* @en Get the data corresponding to the value
* @cn 获取 value 对应的 data
*/
getDataByValues: (values: Value) => Value extends any[] ? ResultItem<DataItem>[] : ResultItem<DataItem>
}
export type ExtendsTreePropsKey =
| 'mode'
| 'data'
| 'datum'
| 'defaultExpanded'
| 'defaultExpandAll'
| 'disabled'
| 'expanded'
| 'keygen'
| 'loader'
| 'onExpand'
| 'renderItem'
| 'line'
| 'parentClickExpand'
| 'childrenKey'
| 'expandIcons'
export type SetTreePropsKey = ExtendsTreePropsKey | 'value' | 'onChange' | 'onClick' | 'renderItem' | 'active'
type ExtendsTreeProps<Item, Value> = Pick<TreeProps<Item, Value extends any[] ? Value : Value[]>, ExtendsTreePropsKey>
export type SetTreeProps<Item, Value> = Partial<
Pick<TreeProps<Item, Value extends any[] ? Value : Value[]>, SetTreePropsKey>
>
// 重写
export interface OriginTreeSelectProps<DataItem, Value>
extends Pick<AbsoluteProps, 'absolute' | 'zIndex'>,
Omit<ExtendsTreeProps<DataItem, Value>, 'data'> {
datum: DatumTree<DataItem>
/**
* @en placeholder when value is empty
* @cn value 为空时的占位符
*/
placeholder?: ReactNode
/**
* @en when compressed is True,the comptessedBound can limit the numbers of multiple selected item's label
* @cn 开启多选后,指定允许展示标签数量,超过后将折叠
*/
compressedBound?: number
/**
* @en If clearable is true, show clear value icon
* @cn 是否可清除值
* @default false
*/
clearable?: boolean
/**
* @en size
* @cn 尺寸
* @override union
* @default 'default'
*/
size?: RegularAttributes.Size
filterText?: string
result: ResultItem<DataItem>[]
/**
* @en ender unmatched value
* @cn 渲染未匹配值的方式
*/
renderUnmatched?: (data: ValueItem<Value>) => ReactNode
/**
* @en inner title
* @cn 内嵌标题
*/
innerTitle?: ReactNode
/**
* @en data source
* @cn 数据源
* @default []
*/
data?: DataItem[]
/**
* @en Some methods of getting components Currently only support getDataByValue
* @cn 获取组件的一些方法 目前只支持 getDataByValues
*/
getComponentRef?: ((ref: ComponentRef<DataItem, Value>) => void) | { current?: ComponentRef<DataItem, Value> }
onFilter?: (text: string, from: FilterFormType) => void
/**
* @en Placeholder content when there is no data
* @cn 无数据时的占位内容
*/
empty?: React.ReactNode
/**
* @en if it is true, it will be multiple selection
* @cn 是否是多选
* @default false
*/
multiple?: boolean
/**
* @en callback function of blur event
* @cn blur 事件回调函数
*/
onBlur: (e?: any) => void
/**
* @en callback function of focus event
* @cn focus 事件回调函数
*/
onFocus: (e?: any) => 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 为 true 时,所有节点禁用选择,为函数时,根据函数返回结果确定是否禁用
* @default false
*/
disabled?: ((data: DataItem) => boolean) | boolean
/**
* @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?: (data: DataItem) => React.ReactNode
/**
* @en mode 0: Returns only the fully selected node including the parent node. 1: Returns all selected nodes and semi-selected nodes. 2: Return only the selected child nodes. 3: If the parent node is full selected, only return the parent node. 4: What you choose is what you get.
* @cn 选中值模式,未设置值为单选 0: 只返回完全选中的节点,包含父节点 1: 返回全部选中的节点和半选中的父节点 2: 只返回选中的子节点 3: 如果父节点选中,只返回父节点 4: 所选即所得
* @default 1
*/
mode?: TreeModeType
/**
* @en The height of list
* @cn 列表高度
* @default 300
*/
height?: number
/**
* @en option collapse callback
* @cn 下拉列表展开/收起回调
*/
onCollapse?: (collapse: boolean) => void
/**
* @en Popup Position
* @cn 弹出位置
*/
position?: 'drop-up' | 'drop-down'
/**
* @en Expand option list while enter press
* @cn 回车触发下拉框展开的时候调用
*/
onEnterExpand?: (e: React.KeyboardEvent<HTMLDivElement>) => boolean
/**
* @en value is your picker now
* @cn 参数 为 当前选中值
*/
onChange: (value: Value, selected?: DataItem, path?: (string | number)[]) => void
/**
* @en onChange additional parameters (current is the data of the clicked node, data is the currently selected data, checked is whether it is selected or canceled in the multi-select state)
* @cn onChange 额外参数 (current 为点击的节点的数据, data 为当前选中的数据, checked 为多选状态下是选中还是取消)
*/
onChangeAddition?: (
params: {
current?: DataItem
checked?: 0 | 1 | 2
data?: DataItem[] | DataItem | null
}
) => void
/**
* @en In the Form, the value will be taken over by the form and the value will be invalid.
* @cn 选中的 key (受控),多选时必须为array
*/
value?: Value
/**
* @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'
}
export interface ResultProps<Item, Value>
extends Pick<
OriginTreeSelectProps<Item, Value>,
| 'keygen'
| 'data'
| 'innerTitle'
| 'renderUnmatched'
| 'compressedBound'
| 'compressed'
| 'placeholder'
| 'multiple'
| 'datum'
| 'disabled'
| 'result'
| 'onFilter'
| 'filterText'
> {
renderResult: (d: Item) => ReactNode
setInputReset: (fn: () => void) => void
focus: boolean
onRemove: (data: ResultItem<Item>) => void
onClear?: () => void
}
export interface InputProps {
onFilter?: (text: string, from?: string) => void
focus: boolean
multiple?: boolean
updatAble: boolean
setInputReset: (fn: () => void) => void
text: React.ReactNode
}
type TreeSelectPropsWithAbsolute<Item, Value> = GetTableConsumerProps<OriginTreeSelectProps<Item, Value>>
export type TreeSelectPropsWithTied<Item, Value> = Omit<TreeSelectPropsWithAbsolute<Item, Value>, 'expandIcons'> & {
onAdvancedFilter: boolean
rawData: Item[]
}
export type TreeSelectPropsWithFilter<Item, Value> = Omit<
TreeSelectPropsWithTied<Item, Value>,
'filterText' | 'result' | 'rawData' | 'onFilter'
> & {
/**
* @en By default, the value of the cache corresponds to the label. If the data changes, set noCache = true
* @cn 默认会缓存 value 对应 label, 如果 data 会变化需要设置 noCache = true
*/
noCache?: boolean
/**
* @en Whether to show the descendant nodes of the hit node after filtering
* @cn 筛选后是否展示命中节点的后代节点
* @default false
*/
showHitDescendants?: boolean
/**
* @en ms. The delay of user input triggering filter events
* @cn 毫秒。用户输入触发 fitler 事件的延时
* @default 400
*/
filterDelay?: number
/**
* @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.
* @cn onFilter 不为空时,可以输入过滤数据。 onFilter 如果返回一个函数,使用这个函数做前端过滤。 如果不返回,可以自行做后端过滤
*/
onFilter?: (text: string, from: FilterFormType) => ((data: Item) => boolean) | void
}
export type TreeSelectPropsWithAdvancedFilter<Item, Value> = Omit<
TreeSelectPropsWithFilter<Item, Value>,
'onAdvancedFilter'
> & {
/**
* @en In the advanced filter mode, you can switch between the filter results and the original data for the current level by pressing the button
* @cn 高级筛选模式,可针对当前层级在筛选结果和原始数据间切换
*/
onAdvancedFilter?: (text: string, from: FilterFormType) => (data: Item) => boolean
}
export type TreeSelectPropsWithDatum<Item, Value> = Omit<TreeSelectPropsWithAdvancedFilter<Item, Value>, 'datum'> & {
/**
* @en render unmatch value
* @cn 是否展示data中不存在的值
* @default true
*/
unmatch?: boolean
}
type TreeSelectPropsWithBorder<Item, Value> = Omit<
GetInputBorderProps<TreeSelectPropsWithDatum<Item, Value>>,
'autoFocus'
>
type TreeSelectPropsWithInputable<Item, Value> = GetInputableProps<TreeSelectPropsWithBorder<Item, Value>, Value>
/**
* @title TreeSelect
*/
export type TreeSelectProps<Item, Value extends TreeSelectValueType> = TreeSelectPropsWithInputable<Item, Value>
export declare class TreeSelectClass<
Item = any,
Value extends TreeSelectValueType = TreeSelectValueType
> extends React.Component<TreeSelectProps<Item, Value>, {}> {
render(): JSX.Element
}
export type TreeSelectType = typeof TreeSelectClass