UNPKG

infogo-tree

Version:

A vue tree component using virtual list.

232 lines (231 loc) 9.54 kB
import TreeNode, { ITreeNodeOptions } from './tree-node'; import { TreeNodeKeyType, IgnoreType } from '../const'; interface ITreeStoreOptions { [key: string]: any; keyField: string; ignoreMode?: IgnoreType; filteredNodeCheckable?: boolean; cascade?: boolean; cascadeLoose?: boolean; defaultExpandAll?: boolean; load?: Function; expandOnFilter?: boolean; } interface IMapData { [key: string]: TreeNode; [key: number]: TreeNode; } export interface IEventNames { 'set-data': () => void; 'visible-data-change': () => void; 'render-data-change': () => void; 'expand': NodeGeneralListenerType; 'select': NodeGeneralListenerType; 'unselect': NodeGeneralListenerType; 'selected-change': (node: TreeNode | null, key: TreeNodeKeyType | null) => void; 'check': NodeGeneralListenerType; 'uncheck': NodeGeneralListenerType; 'checked-change': (nodes: TreeNode[], keys: TreeNodeKeyType[]) => void; } declare type NodeGeneralListenerType = (node: TreeNode) => void; export declare type ListenerType<T extends keyof IEventNames> = IEventNames[T]; export declare type FilterFunctionType = (keyword: string, node: TreeNode) => boolean; export default class TreeStore { private readonly options; /** 树数据 */ data: TreeNode[]; childStr: string; /** 扁平化的树数据 */ flatData: TreeNode[]; disabledFn: any; /** 树数据 map */ mapData: IMapData; /** 未加载但已选中的节点 key ,每次 flattenData 的时候进行检查,将加载的节点从此数组中剔除 */ private unloadCheckedKeys; /** 未加载但选中的单选节点 key */ private unloadSelectedKey; /** 当前单选选中节点 key */ private currentSelectedKey; /** 事件 listeners */ private listenersMap; constructor(options: ITreeStoreOptions); setData(data: ITreeNodeOptions[], selectableUnloadKey: string | number | null | undefined, checkableUnloadKeys: TreeNodeKeyType[] | null | undefined, childStr: string, disabledFn: any, replenishSelect: Boolean): void; /** * 设置单个节点多选选中 * @param key 设置的节点 key * @param value 是否选中 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发 `data-change` 事件以通知外部刷新视图 * @param filtering 是否正在过滤,如果是,则考虑 `filteredNodeCheckable` Prop,用于判断是否是用户点击节点触发的勾选 * @param isCheckAll 是否是全选 */ setChecked(key: TreeNodeKeyType, value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean, filtering?: boolean, isCheckAll?: boolean): void; /** * 设置单个未加载节点选中,不公开此 API */ private setUnloadChecked; /** * 批量选中/取消多选选中节点 * @param keys 选中的节点 key 数组 * @param value 是否选中 * @param triggerEvent 是否触发事件 */ setCheckedKeys(keys: TreeNodeKeyType[], value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean, isCheckAll?: boolean): void; /** * 多选勾选全部节点 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发视图刷新 */ checkAll(triggerEvent?: boolean, triggerDataChange?: boolean): void; /** * 清除所有多选已选 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发视图刷新 */ clearChecked(triggerEvent?: boolean, triggerDataChange?: boolean): void; /** * 触发 checked-change 的快捷方法 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发视图刷新 */ private triggerCheckedChange; /** * 设置单选选中 * @param key 选中节点 key * @param value 是否选中 * @param triggerEvent 是否触发事件 */ setSelected(key: TreeNodeKeyType, value: boolean, triggerEvent?: boolean, triggerDataChange?: boolean): void; /** * 设置未加载单选选中节点,不公开此 API */ private setUnloadSelected; /** * 清除当前单选选中 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发视图刷新 */ clearSelected(triggerEvent?: boolean, triggerDataChange?: boolean): void; /** * 设置节点展开 * @param key 节点 key * @param value 是否展开 * @param expandParent 展开节点时是否同时展开父节点 * @param triggerEvent 是否触发事件 * @param triggerDataChange 是否触发 `data-change` 事件以通知外部刷新视图 */ setExpand(key: TreeNodeKeyType, value: boolean, expandParent?: boolean, triggerEvent?: boolean, triggerDataChange?: boolean): void; /** * 批量设置节点展开/折叠 * @param keys 展开的节点 key 数组 * @param value 是否展开 */ setExpandKeys(keys: TreeNodeKeyType[], value: boolean, triggerDataChange?: boolean): void; setExpandAll(value: boolean, triggerDataChange?: boolean): void; /** * 获取多选选中节点 * @param ignoreMode 忽略模式,可选择忽略父节点或子节点,默认值是 CTree 的 ignoreMode Prop */ getCheckedNodes(ignoreMode?: "children" | "none" | "parents" | undefined): TreeNode[]; /** * 获取多选选中的节点 key ,包括未加载的 key * @param ignoreMode 忽略模式,同 `getCheckedNodes` */ getCheckedKeys(ignoreMode?: "children" | "none" | "parents" | undefined): TreeNodeKeyType[]; /** * 获取多选半选状态节点 */ getIndeterminateNodes(): TreeNode[]; /** * 获取当前单选选中节点 */ getSelectedNode(): TreeNode | null; /** * 获取当前单选选中节点 key ,有可能是未加载的选中项 */ getSelectedKey(): TreeNodeKeyType | null; /** * 获取未加载但多选选中的节点 */ getUnloadCheckedKeys(): TreeNodeKeyType[]; /** * 获取展开节点 */ getExpandNodes(): TreeNode[]; /** * 获取展开节点 keys */ getExpandKeys(): TreeNodeKeyType[]; /** * 根据节点 key 获取节点 * @param key 节点 key */ getNode(key: TreeNodeKeyType): TreeNode | null; insertBefore(insertedNode: TreeNodeKeyType | ITreeNodeOptions, referenceKey: TreeNodeKeyType): TreeNode | null; insertAfter(insertedNode: TreeNodeKeyType | ITreeNodeOptions, referenceKey: TreeNodeKeyType): TreeNode | null; append(insertedNode: TreeNodeKeyType | ITreeNodeOptions, parentKey: TreeNodeKeyType): TreeNode | null; prepend(insertedNode: TreeNodeKeyType | ITreeNodeOptions, parentKey: TreeNodeKeyType): TreeNode | null; /** * 删除节点 * @param removedKey 要删除的节点 key */ remove(removedKey: TreeNodeKeyType, triggerDataChange?: boolean): TreeNode | null; private getInsertedNode; /** * 将一个节点插入 store 记录中 * @param node 要插入的节点 * @param parentNode 要插入节点的父节点 * @param childIndex 如果有父节点,则需提供要插入的节点在同级节点中的顺序 * @param flatIndex 在 flatData 中的索引 * @param dataIndex 如果没有父节点,需要提供节点在 data 中的索引 */ private insertIntoStore; private updateMovingNodeStatus; /** * 过滤本地节点数据 * @param keyword 过滤关键词 * @param filterMethod 过滤方法 */ filter(keyword: string, filterMethod: FilterFunctionType): void; /** * 过滤未加载多选节点,对比最终勾选节点是否有变化并触发 checked-change 事件 * @param keys 全量选中节点 key 数组,包括加载与未加载选中节点 */ private setUnloadCheckedKeys; /** * 过滤未加载单选选中节点,对比是否有变化并触发 selected-change 事件 * @param key 节点 key */ private setUnloadSelectedKey; /** * 保存扁平化的节点数据 `flatData` 与节点数据 Map `mapData` * @param nodes 树状节点数据 * @param overrideSelected 是否根据数据设置 `selected` */ private flattenData; /** * 向下勾选/取消勾选节点,包括自身 * @param node 需要向下勾选的节点 * @param value 勾选或取消勾选 * @param filtering 是否正在过滤,如果是,则考虑 `filteredNodeCheckable` Prop */ private checkNodeDownward; /** * 向上勾选/取消勾选父节点,不包括自身 * @param node 需要勾选的节点 */ private checkNodeUpward; /** * 根据子节点的勾选状态更新当前父节点的勾选状态 * @param node 需要勾选的节点 */ private checkParentNode; /** * 搜索节点在指定数组中的位置 */ private findIndex; on<T extends keyof IEventNames>(eventName: T, listener: ListenerType<T> | Array<ListenerType<T>>): void; off<T extends keyof IEventNames>(eventName: T, listener?: ListenerType<T>): void; emit<T extends keyof IEventNames>(eventName: T, ...args: Parameters<IEventNames[T]>): void; } export {};