UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

635 lines (634 loc) 17.6 kB
import type React from 'react'; import type { CommonProps } from '../util'; import type { VirtualListProps } from '../virtual-list'; import type { Tree } from './view/tree'; import type { TreeNode } from './view/tree-node'; import type { DataSourceItem } from '../select'; export type Key = string; export type KeyEntities = Record<Key, DataNode>; export type IconType = string | React.ReactNode; export type NodeInstance = InstanceType<typeof TreeNode>; export interface BasicDataNode { checkable?: boolean; disabled?: boolean; checkboxDisabled?: boolean; icon?: IconType; isLeaf?: boolean; selectable?: boolean; draggable?: boolean; editable?: boolean; className?: string; style?: React.CSSProperties; } export type FieldDataNode<T, ChildFieldName extends string = 'children'> = BasicDataNode & T & Partial<Record<ChildFieldName, FieldDataNode<T, ChildFieldName>[]>>; export type DataNode = FieldDataNode<{ key: Key; label?: React.ReactNode; illegalFlag?: boolean; node?: NodeElement; size?: number; posinset?: number; children?: DataNode[] | NodeElement; pos?: string; level?: number; isLastChild?: boolean[]; }>; export type TreeDataNode = FieldDataNode<{ key: Key; label?: React.ReactNode; }>; /** * @api Tree.Node */ export interface NodeProps extends CommonProps { /** * 树节点 * @en chidren */ children?: React.ReactNode; /** * 节点文本内容 * @en Label of the node * @defaultValue '---' */ label?: React.ReactNode; /** * 单独设置是否支持选中,覆盖 Tree 的 selectable * @en Whether the node is selectable or not (overrides Tree's selectable) */ selectable?: boolean; /** * 单独设置是否出现复选框,覆盖 Tree 的 checkable * @en Whether the node has a checkbox or not (overrides Tree's checkable) */ checkable?: boolean; /** * 单独设置是否支持编辑,覆盖 Tree 的 editable * @en Whether the node is editable or not (overrides Tree's editable) */ editable?: boolean; /** * 单独设置是否支持拖拽,覆盖 Tree 的 draggable * @en Whether the node is draggable or not (overrides Tree's draggable) */ draggable?: boolean; /** * 是否禁止节点响应 * @en Whether the node is disabled or not * @defaultValue false */ disabled?: boolean; /** * 是否禁止勾选节点复选框 * @en Whether the checkbox is disabled or not * @defaultValue false */ checkboxDisabled?: boolean; /** * 是否是叶子节点,设置loadData时生效 * @en Whether the node is a leaf node or not */ isLeaf?: boolean; /** * 点击文本是否可以勾选 * @en Whether the node can be checked by clicking the text * @skip */ clickToCheck?: boolean; /** * 无障碍化属性:aria-setsize * @en The number of items in the set of the list that the user is currently accessing * @skip */ size?: number; /** * 无障碍化属性:aria-posinset * @en The position or index of the item in the list that the user is currently accessing * @skip */ posinset?: number; /** * 父组件实例 * @en Parent component instance * @skip */ root?: Tree & { props: TreeProps; }; /** * eventKey * @en eventKey * @skip */ eventKey?: string; /** * pos * @en pos * @skip */ pos?: string; /** * expanded * @en expanded * @skip */ expanded?: boolean; /** * selected * @en selected * @skip */ selected?: boolean; /** * checked * @en checked * @skip */ checked?: boolean; /** * indeterminate * @en indeterminate * @skip */ indeterminate?: boolean; /** * dragOver * @en drayOver * @skip */ dragOver?: boolean; /** * dragOverGapTop * @en drayOverGapTop * @skip */ dragOverGapTop?: boolean; /** * dragOverGapBottom * @en drayOverGapBottom * @skip */ dragOverGapBottom?: boolean; /** * _key * @en _key * @skip */ _key?: string; /** * level * @en level * @skip */ level?: number; /** * isLastChild * @en isLastChild * @skip */ isLastChild?: boolean[]; /** * 自定义图标,可以使用 Icon 的 type,也可以使用组件 `<Icon type="icon type" />` * @en Custom Icon * @skip */ icon?: IconType; /** * onKeyDown * @en onKeyDown * @skip */ onKeyDown?: (event: React.KeyboardEvent) => void; /** * className * @en className * @skip */ className?: string; /** * key * @en key * @skip */ key?: Key; /** * style * @en style * @skip */ style?: React.CSSProperties; /** * value * @en value * @skip */ value?: DataSourceItem; } export type NodeElement = React.ReactElement<NodeProps>; export interface NodeState { label: NodeProps['label']; loading: boolean; editing: boolean; } export interface TreeState<TreeDataType extends DataNode | BasicDataNode = DataNode> { _k2n: KeyEntities; _p2n: KeyEntities; _keyList: string[]; dataSource: TreeDataType[]; willReceiveProps: boolean; expandedKeys: string[]; selectedKeys: string[]; checkedKeys: string[]; indeterminateKeys: string[]; focusedKey: string | null | undefined; dragOverNodeKey?: string | null | undefined; } type HTMLAttributesWeak = Omit<React.HTMLAttributes<HTMLElement>, 'onDragEnd' | 'onDragEnter' | 'onDragLeave' | 'onDragOver' | 'onDragStart' | 'onDrop' | 'onSelect'>; /** * @api Tree */ export interface TreeProps<TreeDataType extends BasicDataNode = FieldDataNode<{ key: Key; label?: React.ReactNode; }>> extends HTMLAttributesWeak, CommonProps { /** * 树节点 * @en chidren of the tree component */ children?: React.ReactNode; /** * 数据源,该属性优先级高于 children * @en Data source of the tree component * @remarks item 中多余的属性会传递给 tree node 内的 <li></li> 节点 - extra attributes in item are passed to the <li></li> node in the tree node. */ dataSource?: TreeDataType[]; /** * 是否显示树的线 * @en Show line or not * @defaultValue false */ showLine?: boolean; /** * 是否支持选中节点 * @en Selectable nodes or not * @defaultValue false */ selectable?: boolean; /** * (用于受控)当前选中节点 key 的数组 * @en Selected keys array (controlled) */ selectedKeys?: string[]; /** * (用于非受控)默认选中节点 key 的数组 * @en Default selected keys array * @defaultValue [] */ defaultSelectedKeys?: string[]; /** * 选中或取消选中节点时触发的回调函数 * @en Callback function when selected or unselected a node * @defaultValue () =\> \{\} * @param selectedKeys - 选中节点key的数组 - Array of selected keys * @param extra - 额外参数 - Extra parameters * @returns 空 - void */ onSelect?: (selectedKeys: string[], extra: { selectedNodes: Array<NodeInstance>; node: NodeInstance; selected: boolean; event: React.KeyboardEvent | React.MouseEvent; }) => void; /** * 是否支持多选 * @en Multiple selectable * @defaultValue false */ multiple?: boolean; /** * 是否支持勾选节点的复选框 * @en Checkable nodes or not * @defaultValue false */ checkable?: boolean; /** * (用于受控)当前勾选复选框节点 key 的数组或 `{checked: Array, indeterminate: Array}` 的对象 * @en Checked keys array or `{checked: Array, indeterminate: Array}` object (controlled) */ checkedKeys?: { checked: string[]; indeterminate: string[]; } | string[]; /** * (用于非受控)默认勾选复选框节点 key 的数组 * @en Default checked keys array (uncontrolled) * @defaultValue [] */ defaultCheckedKeys?: { checked: string[]; indeterminate: string[]; } | string[]; /** * 勾选节点复选框是否完全受控(父子节点选中状态不再关联) * @en Whether the checkbox is fully controlled (parent-child node selection status is no longer associated) * @defaultValue false */ checkStrictly?: boolean; /** * 定义选中时回填的方式 * @en Define how to fill the checked state when selected * @defaultValue 'all' */ checkedStrategy?: 'all' | 'parent' | 'child'; /** * 勾选或取消勾选复选框时触发的回调函数 * @en Callback function when checked or unchecked a checkbox * @defaultValue () =\> \{\} * @param checkedKeys - 勾选复选框节点key的数组 - Array of checked keys * @param extra - 额外参数 - Extra parameters * @returns 空 - void */ onCheck?: (checkedKeys: string[], extra: { checkedNodes: Array<NodeInstance>; checkedNodesPositions: Array<NodeInstance>; indeterminateKeys: string[]; node: NodeInstance; checked: boolean; key: Key; }) => void; /** * (用于受控)当前展开的节点 key 的数组 * @en Expanded keys array (controlled) */ expandedKeys?: string[]; /** * (用于非受控)默认展开的节点 key 的数组 * @en Default expanded keys array (uncontrolled) * @defaultValue [] */ defaultExpandedKeys?: string[]; /** * 是否默认展开所有节点 * @en Whether to expand all nodes by default * @defaultValue false */ defaultExpandAll?: boolean; /** * 是否自动展开父节点 * @en Whether to automatically expand parent nodes * @defaultValue true */ autoExpandParent?: boolean; /** * 展开或收起节点时触发的回调函数 * @en Callback function when expanded or collapsed a node * @defaultValue () =\> \{\} * @param expandedKeys - 展开节点key的数组 - Array of expanded keys * @param extra - 额外参数 - Extra parameters * @returns 空 - void */ onExpand?: (expandedKeys: string[], extra: { node: NodeInstance; expanded: boolean; }) => void; /** * 是否支持编辑节点内容 * @en Editable nodes or not * @defaultValue false */ editable?: boolean; /** * 编辑节点内容完成时触发的回调函数 * @en Callback function when edit finish * @defaultValue () =\> \{\} * @param key - 编辑节点 key - Node key * @param label - 编辑节点完成时节点的文本 - Node label * @param node - 当前编辑的节点 - Node instance * @returns 空 - void */ onEditFinish?: (key: Key, label: string, node: NodeInstance) => void; /** * 是否支持拖拽节点 * @en Draggable nodes or not * @defaultValue false */ draggable?: boolean; /** * 开始拖拽节点时触发的回调函数 * @en Callback function when drag start * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void * */ onDragStart?: (info: { event: React.MouseEvent; node: NodeInstance; expandedKeys: string[]; }) => void; /** * 拖拽节点进入目标节点时触发的回调函数 * @en Callback function when drag enter * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onDragEnter?: (info: { event: React.MouseEvent; node: NodeInstance; expandedKeys: Array<string>; }) => void; /** * 拖拽节点在目标节点上移动的时候触发的回调函数 * @en Callback function when drag over * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onDragOver?: (info: { event: React.MouseEvent; node: NodeInstance; }) => void; /** * 拖拽节点离开目标节点时触发的回调函数 * @en Callback function when drag leave * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onDragLeave?: (info: { event: React.MouseEvent; node: NodeInstance; }) => void; /** * 拖拽节点拖拽结束时触发的回调函数 * @en Callback function when drag end * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onDragEnd?: (info: { event: React.MouseEvent; node: NodeInstance; }) => void; /** * 拖拽节点放入目标节点内或前后触发的回调函数 * @en Callback function when drop * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onDrop?: (info: { event: React.MouseEvent; node: NodeInstance; dragNode: NodeInstance; dragNodesKeys: Array<string>; dropPosition: number; }) => void; /** * 节点是否可被作为拖拽的目标节点 * @en Whether the node can be a target node for drag * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 是否可以被当作目标节点 - Whether can be a target node */ canDrop?: (info: { event?: React.MouseEvent; node: NodeInstance; dragNode: NodeInstance; dragNodesKeys: Array<string>; dropPosition: number; }) => boolean; /** * 异步加载数据的函数 * @en Asynchronous load data function * @param node - 被点击展开的节点 - Node instance */ loadData?: (node: NodeInstance) => Promise<unknown>; /** * 按需筛选高亮节点 * @en Highlight the node * @param node - 待筛选的节点 - Node instance * @returns 是否被筛选中 - Whether is filtered */ filterTreeNode?: (node: NodeInstance) => boolean; /** * 右键点击节点时触发的回调函数 * @en Callback function when right click a node * @defaultValue () =\> \{\} * @param info - 额外参数 - Extra parameters * @returns 空 - void */ onRightClick?: (info: { event: React.MouseEvent; node: NodeInstance; }) => void; /** * 设置节点是否占满剩余空间,一般用于统一在各节点右侧添加元素(借助 flex 实现,暂时只支持 ie10+) * @en Whether the node occupies the remaining space * @defaultValue false */ isLabelBlock?: boolean; /** * 设置节点是否占满一行 * @en Whether the node occupies a line * @defaultValue false */ isNodeBlock?: boolean | Record<string, unknown>; /** * 是否开启展开收起动画 * @en Whether to open the animation * @defaultValue true */ animation?: boolean; /** * 当前获得焦点的子菜单或菜单项 key 值 * @en Current focused submenu or menu item key */ focusedKey?: Key; /** * 渲染子节点 * @en Render child nodes * @param nodes - 所有的子节点 - All child nodes * @returns 子节点 - Child nodes */ renderChildNodes?: (nodes: NodeElement[]) => React.ReactNode; /** * 渲染单个子节点 * @en Render a single child node * @param node - 节点数据 - Node data * @returns 返回节点 - Return node * @version 1.25 */ labelRender?: (node: Record<string, unknown>) => React.ReactNode; /** * 是否是不可变数据 * @en Whether it is immutable data * @defaultValue false * @version 1.23 */ immutable?: boolean; /** * 是否开启虚拟滚动 * @en Whether to open virtual scrolling * @defaultValue false */ useVirtual?: boolean; /** * VirtualList透传参数 * @skip */ virtualListProps?: VirtualListProps; /** * 点击文本是否可以勾选 * @defaultValue false * @skip */ clickToCheck?: boolean; /** * focusable * @en focusable * @skip */ focusable?: string; /** * 自定义样式 * @en Custom style * @skip */ style?: React.CSSProperties; /** * onItemKeyDown * @en onItemkeyDown * @skip */ onItemKeyDown?: (key: string | null | undefined, item: NodeInstance, e: React.KeyboardEvent) => void; /** * onItemFocus * @en onItemFocus * @skip */ onItemFocus?: (key: string | null | undefined, e: React.KeyboardEvent) => void; /** * onBlur * @en onBlur * @skip */ onBlur?: (e: React.FocusEvent) => void; /** * autoFocus * @skip */ autoFocus?: boolean; /** * className * @skip */ className?: string; /** * dir * @skip */ dir?: string; } export {};