/** * @author Hanz * @date 2021/10/18 下午4:20 * @description tree interface */ import { ReactNode } from 'react'; import { TreeProps as RcTreeProps } from 'rc-tree'; import { DataNode, EventDataNode, Key } from 'rc-tree/lib/interface'; import { EmptyProps } from '../Empty'; import { ParaRequestConfig as RequestConfig } from '@paraview/lib/http/interface'; type HasAction = (nodeData: DataNode) => boolean; type ActionItem = boolean | { text: string; icon?: ReactNode; show?: HasAction; } | HasAction; export type CustomActionItem = { action: string; text: string; icon: ReactNode; show?: HasAction; }; export type ActionType = 'add' | 'edit' | 'enable' | 'del' | string; export type { DataNode }; export type IActions = boolean | { /** 新增 */ add?: ActionItem; /** 编辑 */ edit?: ActionItem; /** 启用 */ enable?: ActionItem; /** 删除 */ del?: ActionItem; /** 自定义actions */ customizeActions?: CustomActionItem[]; }; export type ICheckedKeys = Key[] | { checked: Key[]; halfChecked: Key[]; }; export interface TreeProps extends Omit { /** 是否展示连接线 */ showLine?: boolean | { showLeafIcon: boolean; }; /** className */ className?: string; /** 是否支持多选 */ multiple?: boolean; /** 是否自动展开父节点 */ autoExpandParent?: boolean; /** Checkable状态下节点选择完全受控(父子节点选中状态不再关联)*/ checkStrictly?: boolean; /** 节点前添加 Checkbox 复选框 */ checkable?: boolean; /** 将树禁用 */ disabled?: boolean; /** 默认展开所有树节点 */ defaultExpandAll?: boolean; /** 默认展开父节点 */ defaultExpandParent?: boolean; /** 默认展开指定的树节点 */ defaultExpandedKeys?: Key[]; /**(受控)展开指定的树节点 */ expandedKeys?: Key[]; /**(受控)选中复选框的树节点 */ checkedKeys?: ICheckedKeys; /** 默认选中复选框的树节点 */ defaultCheckedKeys?: Key[]; /**(受控)设置选中的树节点 */ selectedKeys?: Key[]; /** 默认选中的树节点 */ defaultSelectedKeys?: Key[]; /** 是否可选中 */ selectable?: boolean; /** 按需筛选树节点(高亮),返回 true */ filterTreeNode?: (node: TreeNodeProps) => boolean; /**(受控)已经加载的节点,需要配合 loadData 使用*/ loadedKeys?: Key[]; /** 加载节点 loadedKey 回调 */ onLoadedKey?: (key: Key, node?: DataNode) => void; /** 设置节点可拖拽(IE>8) */ draggable?: ((node: DataNode) => boolean) | boolean; /** 自定义样式*/ style?: React.CSSProperties; /** 是否展示 TreeNode title 前的图标,没有默认样式,如设置为 true,需要自行定义图标相关样式 */ showIcon?: boolean; /** 自定义树节点图标 */ icon?: ((nodeProps: TreeNodeProps) => ReactNode) | ReactNode; /** 自定义树节点的展开/折叠图标 */ switcherIcon?: React.ReactElement; /** 子元素 */ children?: ReactNode; /** 是否节点占据一行 */ blockNode?: boolean; /** 是否显示节点内置的操作按钮 */ showActions?: IActions; /** 节点内置操作按钮的回调,showActions 开启时有效 */ actionsCallback?: (nodeData: DataNode, type: ActionType, evt?: React.MouseEvent) => void; /** 请求url */ url?: string; /** 请求上下文 */ ctx?: string; /** 请求头 */ headers?: RequestConfig['headers']; /** 请求参数 */ params?: Object | null; /** 请求方法*/ method?: 'GET' | 'POST' | 'Get' | 'Post' | 'get' | 'post'; /** 请求成功后的回调 */ requestCallback?: (treeData: any) => any; /** 刷新组件 */ refresh?: number; /** 自定义节点 title、key、children、parentId、loadKey 的字段 */ replaceFields?: { /** 标题 */ title?: string; /**子节点 */ children?: string; /** 节点key */ key?: string; /** 父节点id */ parentId?: string; /** 懒加载时key */ loadKey?: string; }; /** 节点前添加 Radio 单选框 */ radioable?: boolean; /** 是否显示 radio 单选框,radioable 为 true 时有效 */ showRadio?: boolean; /** 点击复选框触发 */ onCheck?: (checkedKeys: Key[], info: any, halfCheckedKeys?: Key[]) => void; /** 展开/收起节点时触发 */ onExpand?: (expandedKeys: Key[], info: { node: EventDataNode; expanded: boolean; nativeEvent: MouseEvent; }) => void; /** 是否异步加载数据,开启后不要传递 loadData 属性,需把数据请求放在组件内部执行 */ asyncLoad?: boolean; /** 是否开启数据分页,asyncLoad 为 true 时,pagination 属性控制是否分页,分页数据格式 {list,page,size,total} */ pagination?: boolean; /** 异步加载数据 */ loadData?: (node: DataNode) => Promise; /** 分页参数, pagination 为 true 时有效 */ pageSize?: { page?: number; size?: number; }; /** 是否开启本地数据过滤 */ localFilter?: boolean; /** 本地数据过滤参数,localFilter 为 true 时有效 */ localParams?: { /** 过滤字段名 */ searchKey: string; /** 过滤字段值 */ searchValue: string; }; /** 本地数据过滤回调,localFilter 为 true 时有效 */ onFilter?: (data: DataNode[]) => DataNode[]; /** 自定义加载更多节点,asyncLoad 为 true 且 pagination 为 true 时有效 */ loadMoreNode?: ReactNode; /** 请求之前参数的回调 */ paramsCallback?: (params: { [name: string]: any; }) => any; /** 空状态容器样式 */ emptyClassName?: string; /** 空状态属性 */ emptyProps?: EmptyProps; /** 自定义空数据节点 */ notFoundContent?: ReactNode; /** wrapperClassName */ wrapperClassName?: string; /** wrapperStyle */ wrapperStyle?: React.CSSProperties; /** 接口请求时显示loading */ showLoading?: boolean; /** 接口请求时显示loading的节点*/ loadingNode?: ReactNode; /** 提示最大宽度 */ tipMaxWidth?: number | string; [key: string]: any; } export interface TreeNodeProps { className?: string; checkable?: boolean; disabled?: boolean; disableCheckbox?: boolean; title?: ReactNode; key?: Key; eventKey?: string; isLeaf?: boolean; checked?: boolean; expanded?: boolean; loading?: boolean; selected?: boolean; selectable?: boolean; icon?: ((treeNode: TreeNodeProps) => ReactNode) | ReactNode; children?: ReactNode; [key: string]: any; } export interface PageInfo { /*** * 当前页数 */ page: number; /*** * 每页条数 */ size: number; /*** * 总条数 */ total: number; }