ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 28.9 kB
Source Map (JSON)
{"version":3,"file":"tree-store.mjs","sources":["../../../../../../src/components/ivue-tree/store/tree-store.ts"],"sourcesContent":["import { hasOwn, isObject } from '@vue/shared';\r\nimport Node from './node';\r\nimport { getNodeKey } from '../utils';\r\n\r\n// type\r\nimport type {\r\n TreeKey,\r\n TreeStoreOptions,\r\n TreeData,\r\n TreeStoreNodesMap,\r\n TreeOptionProps,\r\n LoadFunction,\r\n TreeNodeData,\r\n FilterValue,\r\n FilterNodeMethodFunction,\r\n} from '../types/tree';\r\n\r\n// tree 存储数据对象\r\nexport default class TreeStore {\r\n // 当前节点的key\r\n currentNodeKey: TreeKey;\r\n // 当前节点\r\n currentNode: Node;\r\n // 根节点数据\r\n root: Node;\r\n // tree 数据\r\n data: TreeData;\r\n // 每个树节点用来作为唯一标识的属性,整棵树应该是唯一的\r\n key: TreeKey;\r\n // 存储tree子节点\r\n nodesMap: TreeStoreNodesMap;\r\n // 是否懒加载子节点,需与 load 方法结合使用\r\n lazy: boolean;\r\n // tree 配置选项\r\n props: TreeOptionProps;\r\n // 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法\r\n checkBoxStrictly: boolean;\r\n // 加载子树数据的方法\r\n load: LoadFunction;\r\n // 默认勾选的节点的 key 的数组\r\n defaultCheckedKeys: TreeKey[];\r\n // 默认展开的节点的 key 的数组\r\n defaultExpandedKeys: TreeKey[];\r\n // 展开子节点的时候是否自动展开父节点\r\n autoExpandParent: boolean;\r\n // 是否默认展开所有节点\r\n defaultExpandAll: boolean;\r\n // 对树节点进行筛选时执行的方法, 返回 false 则表示这个节点会被隐藏\r\n filterNodeMethod: FilterNodeMethodFunction;\r\n\r\n constructor(options: TreeStoreOptions) {\r\n // 当前节点的key\r\n this.currentNodeKey = null;\r\n // 当前节点\r\n this.currentNode = null;\r\n\r\n // 将外部值赋值给属性\r\n for (const name in options) {\r\n // 检测是否属性是否拥有\r\n if (hasOwn(options, name)) {\r\n // 赋值给当前 class 属性\r\n this[name] = options[name];\r\n }\r\n }\r\n\r\n // 存储tree子节点\r\n this.nodesMap = {};\r\n }\r\n\r\n // 初始化数据\r\n initialize() {\r\n this.root = new Node({\r\n data: this.data,\r\n store: this,\r\n });\r\n\r\n // 初始化节点属性\r\n this.root.initialize();\r\n\r\n // 是懒加载节点 && 有加载子树数据的方法\r\n if (this.lazy && this.load) {\r\n this.load(this.root, (data) => {\r\n this.root.createChildren(data);\r\n\r\n // 初始化默认勾选节点\r\n this.initDefaultCheckedNodes();\r\n });\r\n }\r\n // 其他节点\r\n else {\r\n // 初始化默认勾选节点\r\n this.initDefaultCheckedNodes();\r\n }\r\n }\r\n\r\n // 注册节点\r\n registerNode(node: Node): void {\r\n const key = this.key;\r\n\r\n // 没有节点 || 没有节点数据\r\n if (!node || !node.data) {\r\n return;\r\n }\r\n\r\n // 当前树没有唯一key\r\n if (!key) {\r\n // 用节点的id去存储节点\r\n this.nodesMap[node.id] = node;\r\n }\r\n // 有定义key\r\n else {\r\n const nodeKey = node.key;\r\n\r\n if (nodeKey !== undefined) {\r\n // 存储tree子节点\r\n this.nodesMap[node.key] = node;\r\n }\r\n }\r\n }\r\n\r\n // 点击当前节点\r\n setCurrentNode(currentNode: Node): void {\r\n // 上一个点击的节点\r\n const preCurrentNode = this.currentNode;\r\n\r\n // 初始化上一个节点数据\r\n if (preCurrentNode) {\r\n preCurrentNode.isCurrent = false;\r\n }\r\n\r\n // 设置当前节点\r\n this.currentNode = currentNode;\r\n this.currentNode.isCurrent = true;\r\n }\r\n\r\n // 获取选中的节点\r\n getCheckedNodes(\r\n leafOnly = false,\r\n includeHalfChecked = false\r\n ): TreeNodeData[] {\r\n // 选中的节点数组\r\n const checkedNodes: TreeNodeData[] = [];\r\n\r\n // 递归遍历子节点\r\n const traverse = (node: TreeStore | Node) => {\r\n // 获取子节点数组\r\n const childNodes = (node as TreeStore).root\r\n ? (node as TreeStore).root.childNodes\r\n : (node as Node).childNodes;\r\n\r\n childNodes.forEach((child) => {\r\n if (\r\n // 选中 || 是不确定的选中状态\r\n (child.checked || (includeHalfChecked && child.indeterminate)) &&\r\n // 不是叶子节点 || 是叶子节点\r\n (!leafOnly || (leafOnly && child.isLeaf))\r\n ) {\r\n checkedNodes.push(child.data);\r\n }\r\n\r\n traverse(child);\r\n });\r\n };\r\n\r\n traverse(this);\r\n\r\n return checkedNodes;\r\n }\r\n\r\n // 获取选中节点的key\r\n getCheckedKeys(leafOnly = false): TreeKey[] {\r\n return this.getCheckedNodes(leafOnly).map((data) => (data || {})[this.key]);\r\n }\r\n\r\n // 获取半选中节点\r\n getHalfCheckedNodes(): TreeNodeData[] {\r\n const halfCheckedNodes: TreeNodeData[] = [];\r\n\r\n // 递归遍历子节点\r\n const traverse = (node: TreeStore | Node) => {\r\n // 获取根节点数据的子项 || 子节点数据的子项\r\n const childNodes = (node as TreeStore).root\r\n ? (node as TreeStore).root.childNodes\r\n : (node as Node).childNodes;\r\n\r\n childNodes.forEach((child) => {\r\n // 有半选中状态\r\n if (child.indeterminate) {\r\n halfCheckedNodes.push(child.data);\r\n }\r\n\r\n // 递归遍历子节点\r\n traverse(child);\r\n });\r\n };\r\n\r\n // 递归遍历子节点\r\n traverse(this);\r\n\r\n return halfCheckedNodes;\r\n }\r\n\r\n // 获取不确定选中节点key\r\n getHalfCheckedKeys(): TreeKey[] {\r\n return this.getHalfCheckedNodes().map((data) => (data || {})[this.key]);\r\n }\r\n\r\n // 初始化默认勾选节点\r\n initDefaultCheckedNodes(): void {\r\n const defaultCheckedKeys = this.defaultCheckedKeys || [];\r\n\r\n const nodesMap = this.nodesMap;\r\n\r\n defaultCheckedKeys.forEach((checkedKey) => {\r\n // 获取默认勾选节点\r\n const node = nodesMap[checkedKey];\r\n\r\n // 设置勾选\r\n if (node) {\r\n node.setChecked(true, !this.checkBoxStrictly);\r\n }\r\n });\r\n }\r\n\r\n // 初始化默认勾选节点\r\n initDefaultCheckedNode(node: Node): void {\r\n const defaultCheckedKeys = this.defaultCheckedKeys || [];\r\n\r\n // 激活当前节点\r\n if (defaultCheckedKeys.includes(node.key)) {\r\n node.setChecked(true, !this.checkBoxStrictly);\r\n }\r\n }\r\n\r\n // 设置目前勾选的节点,使用此方法必须提前设置 node-key 属性\r\n setCheckedNodes(array: Node[], leafOnly = false): void {\r\n const key = this.key;\r\n const checkedKeys = {};\r\n\r\n // 创建多选框key\r\n array.forEach((item) => {\r\n checkedKeys[(item || {})[key]] = true;\r\n });\r\n\r\n // 设置多选框key\r\n this._setCheckedKeys(key, leafOnly, checkedKeys);\r\n }\r\n\r\n // 设置目前选中的节点\r\n setCheckedKeys(keys: TreeKey[], leafOnly = false): void {\r\n const key = this.key;\r\n const checkedKeys = {};\r\n\r\n // 默认勾选的节点的\r\n this.defaultCheckedKeys = keys;\r\n\r\n keys.forEach((key) => {\r\n checkedKeys[key] = true;\r\n });\r\n\r\n // 设置多选框key\r\n this._setCheckedKeys(key, leafOnly, checkedKeys);\r\n }\r\n\r\n // 设置多选框key\r\n _setCheckedKeys(\r\n key: TreeKey,\r\n leafOnly = false,\r\n checkedKeys: { [key: string]: boolean }\r\n ): void {\r\n const allNodes = this.getAllNodes().sort((a, b) => b.level - a.level);\r\n // 父级数据的key\r\n const parentKeys = {};\r\n // 外部传入的key\r\n const keys = Object.keys(checkedKeys);\r\n\r\n // 先取消所有多选框选中\r\n allNodes.forEach((node) => {\r\n node.setChecked(false, false);\r\n });\r\n\r\n for (let i = 0; i < allNodes.length; i++) {\r\n // 节点\r\n const node = allNodes[i];\r\n // 节点key\r\n const nodeKey = node.data[key].toString();\r\n // 匹配外部传入是否选中\r\n const checked = keys.includes(nodeKey);\r\n\r\n // 取消选中\r\n if (!checked) {\r\n // 激活了 && 不是父级数据的子节点\r\n if (node.checked && !parentKeys[nodeKey]) {\r\n node.setChecked(false, false);\r\n }\r\n\r\n continue;\r\n }\r\n\r\n let parent = node.parent;\r\n\r\n // 父级层级 > 0\r\n while (parent && parent.level > 0) {\r\n // 父级数据的key\r\n parentKeys[parent.data[key]] = true;\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n // 叶子节点 || 是否严格的遵循父子不互相关联的做法\r\n if (node.isLeaf || this.checkBoxStrictly) {\r\n // 选中\r\n node.setChecked(true, false);\r\n\r\n continue;\r\n }\r\n\r\n // 选中\r\n node.setChecked(true, true);\r\n\r\n // 叶子节点\r\n if (leafOnly) {\r\n // 取消选中\r\n node.setChecked(false, false);\r\n\r\n // 遍历子节点\r\n const traverse = (node: Node): void => {\r\n const childNodes = node.childNodes;\r\n\r\n childNodes.forEach((child) => {\r\n // 不是叶子节点 取消选中\r\n if (!child.isLeaf) {\r\n child.setChecked(false, false);\r\n }\r\n\r\n traverse(child);\r\n });\r\n };\r\n\r\n traverse(node);\r\n }\r\n }\r\n }\r\n\r\n // 获取所有节点\r\n getAllNodes(): Node[] {\r\n const allNodes: Node[] = [];\r\n const nodesMap = this.nodesMap;\r\n\r\n for (const nodeKey in nodesMap) {\r\n // 检测是否属性是否拥有\r\n if (hasOwn(nodesMap, nodeKey)) {\r\n allNodes.push(nodesMap[nodeKey]);\r\n }\r\n }\r\n\r\n return allNodes;\r\n }\r\n\r\n // 设置数据\r\n setData(value: TreeData): void {\r\n // 数据不一样\r\n const instanceChanged = value !== this.root.data;\r\n\r\n if (instanceChanged) {\r\n this.root.setData(value);\r\n\r\n // 初始化默认勾选节点\r\n this.initDefaultCheckedNodes();\r\n } else {\r\n // 更新子节点\r\n this.root.updateChildren();\r\n }\r\n }\r\n\r\n // 更新子节点\r\n updateChildren(key: TreeKey, data: TreeData): void {\r\n // 获取对应的节点\r\n const node = this.nodesMap[key];\r\n\r\n if (!node) {\r\n return;\r\n }\r\n\r\n const childNodes = node.childNodes;\r\n\r\n // 删除节点 -> 从后向前找\r\n for (let i = childNodes.length - 1; i >= 0; i--) {\r\n const child = childNodes[i];\r\n\r\n this.remove(child.data);\r\n }\r\n\r\n // 添加节点\r\n for (let i = 0, j = data.length; i < j; i++) {\r\n const child = data[i];\r\n\r\n this.append(child, node.data);\r\n }\r\n }\r\n\r\n // 删除节点\r\n remove(data: TreeNodeData | Node): void {\r\n // 获取节点\r\n const node = this.getNode(data);\r\n\r\n // 有节点 && 有父节点\r\n if (node && node.parent) {\r\n // 清除当前节点\r\n if (node === this.currentNode) {\r\n this.currentNode = null;\r\n }\r\n\r\n node.parent.removeChild(node);\r\n }\r\n }\r\n\r\n // 添加节点\r\n append(data: TreeNodeData, parentData: TreeNodeData | TreeKey | Node): void {\r\n // 是否有父节点\r\n const parentNode = parentData ? this.getNode(parentData) : this.root;\r\n\r\n if (parentNode) {\r\n parentNode.insertChild({ data });\r\n }\r\n }\r\n\r\n // 获取节点\r\n getNode(data: TreeKey | TreeNodeData): Node {\r\n if (data instanceof Node) {\r\n return data;\r\n }\r\n\r\n // 获取节点的key\r\n const key = isObject(data) ? getNodeKey(this.key, data) : data;\r\n\r\n // 存储的树节点\r\n return this.nodesMap[key] || null;\r\n }\r\n\r\n // 注销节点\r\n deregisterNode(node: Node): void {\r\n const key = this.key;\r\n if (!key || !node || !node.data) {\r\n return;\r\n }\r\n\r\n // 递归调用\r\n node.childNodes.forEach((child) => {\r\n this.deregisterNode(child);\r\n });\r\n\r\n // 删除存储的树节点\r\n delete this.nodesMap[node.key];\r\n }\r\n\r\n // 设置默认勾选的节点的 key 数组\r\n setDefaultCheckedKey(value: TreeKey[]): void {\r\n if (value !== this.defaultCheckedKeys) {\r\n this.defaultCheckedKeys = value;\r\n\r\n // 初始化默认勾选节点\r\n this.initDefaultCheckedNodes();\r\n }\r\n }\r\n\r\n // 设置默认展开的节点的 key 的数组\r\n setDefaultExpandedKeys(keys: TreeKey[]) {\r\n keys = keys || [];\r\n\r\n this.defaultExpandedKeys = keys;\r\n\r\n keys.forEach((key) => {\r\n // 获取节点\r\n const node = this.getNode(key);\r\n\r\n // 设置展开\r\n if (node) {\r\n node.expand(null, this.autoExpandParent);\r\n }\r\n });\r\n }\r\n\r\n // 设置当前激活的key\r\n setCurrentNodeKey(\r\n // 待被选节点的 key, 如果为 null, 取消当前选中的节点\r\n key?: TreeKey,\r\n // 是否自动展开父节点\r\n shouldAutoExpandParent = true\r\n ): void {\r\n // 没有key\r\n if (key === null || key === undefined) {\r\n // 重置当前选中的节点\r\n this.currentNode && (this.currentNode.isCurrent = false);\r\n this.currentNode = null;\r\n\r\n return;\r\n }\r\n\r\n // 获取节点\r\n const node = this.getNode(key);\r\n\r\n // 有节点\r\n if (node) {\r\n // 点击当前节点\r\n this.setCurrentNode(node);\r\n\r\n // 有自动展开 && 节点层级 > 1\r\n if (shouldAutoExpandParent && this.currentNode.level > 1) {\r\n // 展开\r\n this.currentNode.parent.expand(null, true);\r\n }\r\n }\r\n }\r\n\r\n // 设置节点为选中状态\r\n setUserCurrentNode(\r\n // 待被选中的节点\r\n node: Node,\r\n // 是否自动展开父节点\r\n shouldAutoExpandParent = true\r\n ): void {\r\n // 传入节点的key\r\n const key = node[this.key];\r\n\r\n // 获取到当前节点\r\n const currNode = this.nodesMap[key];\r\n\r\n // 点击当前节点\r\n this.setCurrentNode(currNode);\r\n\r\n // 有自动展开 && 节点层级 > 1\r\n if (shouldAutoExpandParent && this.currentNode.level > 1) {\r\n this.currentNode.parent.expand(null, true);\r\n }\r\n }\r\n\r\n // 过滤所有树节点,过滤后的节点将被隐藏\r\n filter(value: FilterValue): void {\r\n const filterNodeMethod = this.filterNodeMethod;\r\n const lazy = this.lazy;\r\n\r\n const traverse = (node: TreeStore | Node) => {\r\n // 子节点\r\n const childNodes = (node as TreeStore).root\r\n ? (node as TreeStore).root.childNodes\r\n : (node as Node).childNodes;\r\n\r\n // 循环子节点\r\n childNodes.forEach((child) => {\r\n child.visible = filterNodeMethod.call(child, value, child.data, child);\r\n\r\n // 继续循环获取子节点\r\n traverse(child);\r\n });\r\n\r\n // 没有隐藏 && 有子节点\r\n if (!(node as Node).visible && childNodes.length) {\r\n let allHidden = true;\r\n // 是否符合隐藏全部条件\r\n allHidden = !childNodes.some((child) => child.visible);\r\n\r\n // 跟节点\r\n if ((node as TreeStore).root) {\r\n // 隐藏根节点\r\n (node as TreeStore).root.visible = allHidden === false;\r\n }\r\n // 隐藏子节点\r\n else {\r\n (node as Node).visible = allHidden === false;\r\n }\r\n }\r\n\r\n // 没有输入\r\n if (!value) {\r\n return;\r\n }\r\n\r\n // 隐藏了子节点 && 不是叶子节点 && 不是懒加载节点\r\n if ((node as Node).visible && !(node as Node).isLeaf && !lazy) {\r\n // 展开节点\r\n (node as Node).expand();\r\n }\r\n };\r\n\r\n // 遍历子节点\r\n traverse(this);\r\n }\r\n\r\n // 插入到节点前面\r\n insertBefore(data: TreeNodeData, refData: TreeKey | TreeNodeData): void {\r\n // 获取节点\r\n const refNode = this.getNode(refData);\r\n\r\n // 插入到节点\r\n refNode.parent.insertBefore({ data }, refNode);\r\n }\r\n\r\n // 插入到节点后面\r\n insertAfter(data: TreeNodeData, refData: TreeKey | TreeNodeData): void {\r\n // 获取节点\r\n const refNode = this.getNode(refData);\r\n\r\n // 插入到节点\r\n refNode.parent.insertAfter({ data }, refNode);\r\n }\r\n\r\n // 设置节点是否被选中, 使用此方法必须设置 node-key 属性\r\n setChecked(\r\n // 要选中的节点的 key 或者数据\r\n data: TreeKey | TreeNodeData,\r\n // 一个布尔类型参数表明是否选中\r\n checked: boolean,\r\n // 一个布尔类型参数表明是否递归选中子节点\r\n deep: boolean\r\n ): void {\r\n // 获取节点\r\n const node = this.getNode(data);\r\n\r\n // 设置选中\r\n if (node) {\r\n node.setChecked(!!checked, deep);\r\n }\r\n }\r\n\r\n // 返回当前被选中节点的数据\r\n getCurrentNode(): Node {\r\n return this.currentNode;\r\n }\r\n}\r\n"],"names":["key","node"],"mappings":"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"}