UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 23.6 kB
{"version":3,"file":"node.mjs","names":["isUndefined"],"sources":["../../../../../../../packages/components/tree/src/model/node.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport { isNil } from 'lodash-unified'\nimport {\n hasOwn,\n isArray,\n isBoolean,\n isFunction,\n isString,\n isUndefined,\n} from '@element-plus/utils'\nimport { NODE_KEY, markNodeData } from './util'\n\nimport type TreeStore from './tree-store'\nimport type { Nullable } from '@element-plus/utils'\nimport type {\n FakeNode,\n TreeKey,\n TreeNodeChildState,\n TreeNodeData,\n TreeNodeLoadedDefaultProps,\n TreeNodeOptions,\n} from '../tree.type'\n\nexport const getChildState = (node: Node[]): TreeNodeChildState => {\n let all = true\n let none = true\n let allWithoutDisable = true\n let isEffectivelyChecked = true\n for (let i = 0, j = node.length; i < j; i++) {\n const n = node[i]\n if (n.checked !== true || n.indeterminate) {\n all = false\n if (!n.disabled) {\n allWithoutDisable = false\n }\n }\n if (n.checked !== false || n.indeterminate) {\n none = false\n }\n if (!n.isEffectivelyChecked) {\n isEffectivelyChecked = false\n }\n }\n\n return {\n all,\n none,\n allWithoutDisable,\n half: !all && !none,\n isEffectivelyChecked,\n }\n}\n\nconst reInitChecked = function (node: Node): void {\n if (node.childNodes.length === 0 || node.loading) {\n node.isEffectivelyChecked = node.disabled || node.checked\n return\n }\n\n const { all, none, half, isEffectivelyChecked } = getChildState(\n node.childNodes\n )\n node.isEffectivelyChecked = isEffectivelyChecked\n if (all) {\n node.checked = true\n node.indeterminate = false\n } else if (half) {\n node.checked = false\n node.indeterminate = true\n } else if (none) {\n node.checked = false\n node.indeterminate = false\n }\n\n const parent = node.parent\n if (!parent || parent.level === 0) return\n\n if (!node.store.checkStrictly) {\n reInitChecked(parent)\n }\n}\n\nconst getPropertyFromData = function (node: Node, prop: string): any {\n const props = node.store.props\n const data = node.data || {}\n const config = (props as any)[prop]\n\n if (isFunction(config)) {\n return config(data, node)\n } else if (isString(config)) {\n return data[config]\n } else if (isUndefined(config)) {\n const dataProp = data[prop]\n return isUndefined(dataProp) ? '' : dataProp\n }\n}\n\nconst setCanFocus = function (childNodes: Node[], focus: boolean): void {\n childNodes.forEach((item) => {\n item.canFocus = focus\n setCanFocus(item.childNodes, focus)\n })\n}\n\nlet nodeIdSeed = 0\n\nclass Node {\n id: number\n text: string | null\n checked: boolean\n indeterminate: boolean\n data: TreeNodeData\n expanded: boolean\n parent: Node | null\n visible: boolean\n isCurrent: boolean\n store!: TreeStore\n isLeafByUser: boolean | undefined = undefined\n isLeaf: boolean | undefined = undefined\n canFocus: boolean\n\n level: number\n loaded: boolean\n childNodes: Node[]\n loading: boolean\n\n /**\n * Determines whether the current tree node is effectively checked.\n *\n * Rules:\n * 1. A disabled leaf node is always considered checked.\n * 2. A non-disabled leaf node reflects its actual checked state.\n * 3. A non-leaf node is considered checked only when:\n * - All of its child nodes are effectively checked, and\n * - Each child follows the same evaluation rules:\n * - Disabled leaf nodes follow rule #1.\n * - Non-leaf child nodes are recursively evaluated under this rule (#3).\n */\n isEffectivelyChecked: boolean = false\n\n constructor(options: TreeNodeOptions) {\n this.id = nodeIdSeed++\n this.text = null\n this.checked = false\n this.indeterminate = false\n this.data = null as unknown as TreeNodeData\n this.expanded = false\n this.parent = null as Node | null\n this.visible = true\n this.isCurrent = false\n this.canFocus = false\n\n for (const name in options) {\n if (hasOwn(options, name)) {\n this[name] = options[name]\n }\n }\n\n // internal\n this.level = 0\n this.loaded = false\n this.childNodes = []\n this.loading = false\n\n if (this.parent) {\n this.level = this.parent.level + 1\n }\n }\n\n initialize() {\n const store = this.store\n if (!store) {\n throw new Error('[Node]store is required!')\n }\n store.registerNode(this)\n\n const props = store.props\n if (props && typeof props.isLeaf !== 'undefined') {\n const isLeaf = getPropertyFromData(this, 'isLeaf')\n if (isBoolean(isLeaf)) {\n this.isLeafByUser = isLeaf\n }\n }\n\n if (store.lazy !== true && this.data) {\n this.setData(this.data)\n\n if (store.defaultExpandAll) {\n this.expanded = true\n this.canFocus = true\n }\n } else if (\n this.level > 0 &&\n store.lazy &&\n store.defaultExpandAll &&\n !this.isLeafByUser\n ) {\n this.expand()\n }\n if (!isArray(this.data)) {\n markNodeData(this, this.data)\n }\n if (!this.data) return\n\n const defaultExpandedKeys = store.defaultExpandedKeys\n const key = store.key\n\n if (\n key &&\n !isNil(this.key) &&\n defaultExpandedKeys &&\n defaultExpandedKeys.includes(this.key)\n ) {\n this.expand(null, store.autoExpandParent)\n }\n\n if (\n key &&\n store.currentNodeKey !== undefined &&\n this.key === store.currentNodeKey\n ) {\n store.currentNode && (store.currentNode.isCurrent = false)\n store.currentNode = this\n store.currentNode.isCurrent = true\n }\n\n if (store.lazy) {\n store._initDefaultCheckedNode(this)\n }\n\n this.updateLeafState()\n if (this.level === 1 || this.parent?.expanded === true) this.canFocus = true\n }\n\n setData(data: TreeNodeData): void {\n if (!isArray(data)) {\n markNodeData(this, data)\n }\n\n this.data = data\n this.childNodes = []\n\n let children\n if (this.level === 0 && isArray(this.data)) {\n children = this.data\n } else {\n children = getPropertyFromData(this, 'children') || []\n }\n\n for (let i = 0, j = children.length; i < j; i++) {\n this.insertChild({ data: children[i] })\n }\n }\n\n get label(): string {\n return getPropertyFromData(this, 'label')\n }\n\n get key(): TreeKey | null | undefined {\n const nodeKey = this.store.key\n if (this.data) return this.data[nodeKey]\n return null\n }\n\n get disabled(): boolean {\n return getPropertyFromData(this, 'disabled')\n }\n\n get nextSibling(): Nullable<Node> {\n const parent = this.parent\n if (parent) {\n const index = parent.childNodes.indexOf(this)\n if (index > -1) {\n return parent.childNodes[index + 1]\n }\n }\n return null\n }\n\n get previousSibling(): Nullable<Node> {\n const parent = this.parent\n if (parent) {\n const index = parent.childNodes.indexOf(this)\n if (index > -1) {\n return index > 0 ? parent.childNodes[index - 1] : null\n }\n }\n return null\n }\n\n contains(target: Node, deep = true): boolean {\n return (this.childNodes || []).some(\n (child) => child === target || (deep && child.contains(target))\n )\n }\n\n remove(): void {\n const parent = this.parent\n if (parent) {\n parent.removeChild(this)\n }\n }\n\n insertChild(child?: FakeNode | Node, index?: number, batch?: boolean): void {\n if (!child) throw new Error('InsertChild error: child is required.')\n\n if (!(child instanceof Node)) {\n if (!batch) {\n const children = this.getChildren(true)\n if (!children?.includes(child.data)) {\n if (isUndefined(index) || index < 0) {\n children?.push(child.data)\n } else {\n children?.splice(index, 0, child.data)\n }\n }\n }\n Object.assign(child, {\n parent: this,\n store: this.store,\n })\n child = reactive(new Node(child as TreeNodeOptions))\n if (child instanceof Node) {\n child.initialize()\n }\n }\n\n ;(child as Node).level = this.level + 1\n\n if (isUndefined(index) || index < 0) {\n this.childNodes.push(child as Node)\n } else {\n this.childNodes.splice(index, 0, child as Node)\n }\n\n this.updateLeafState()\n }\n\n insertBefore(child: FakeNode | Node, ref: Node): void {\n let index\n if (ref) {\n index = this.childNodes.indexOf(ref)\n }\n this.insertChild(child, index)\n }\n\n insertAfter(child: FakeNode | Node, ref: Node): void {\n let index\n if (ref) {\n index = this.childNodes.indexOf(ref)\n if (index !== -1) index += 1\n }\n this.insertChild(child, index)\n }\n\n removeChild(child: Node): void {\n const children = this.getChildren() || []\n const dataIndex = children.indexOf(child.data)\n if (dataIndex > -1) {\n children.splice(dataIndex, 1)\n }\n\n const index = this.childNodes.indexOf(child)\n\n if (index > -1) {\n this.store && this.store.deregisterNode(child)\n child.parent = null\n this.childNodes.splice(index, 1)\n }\n\n this.updateLeafState()\n }\n\n removeChildByData(data: TreeNodeData | null): void {\n const targetNode = this.childNodes.find((child) => child.data === data)\n\n if (targetNode) {\n this.removeChild(targetNode)\n }\n }\n\n expand(callback?: (() => void) | null, expandParent?: boolean): void {\n const done = () => {\n if (expandParent) {\n let parent = this.parent\n while (parent && parent.level > 0) {\n parent.expanded = true\n parent = parent.parent\n }\n }\n this.expanded = true\n if (callback) callback()\n setCanFocus(this.childNodes, true)\n }\n\n if (this.shouldLoadData()) {\n this.loadData((data) => {\n if (isArray(data)) {\n if (this.checked) {\n this.setChecked(true, true)\n } else if (!this.store.checkStrictly) {\n reInitChecked(this)\n }\n done()\n }\n })\n } else {\n done()\n }\n }\n\n doCreateChildren(\n array: TreeNodeData[],\n defaultProps: TreeNodeLoadedDefaultProps = {}\n ): void {\n array.forEach((item) => {\n this.insertChild(\n Object.assign({ data: item }, defaultProps),\n undefined,\n true\n )\n })\n }\n\n collapse(): void {\n this.expanded = false\n setCanFocus(this.childNodes, false)\n }\n\n shouldLoadData() {\n return Boolean(this.store.lazy === true && this.store.load && !this.loaded)\n }\n\n updateLeafState(): void {\n if (\n this.store.lazy === true &&\n this.loaded !== true &&\n typeof this.isLeafByUser !== 'undefined'\n ) {\n this.isLeaf = this.isLeafByUser\n this.isEffectivelyChecked = this.isLeaf && this.disabled\n return\n }\n const childNodes = this.childNodes\n if (\n !this.store.lazy ||\n (this.store.lazy === true && this.loaded === true)\n ) {\n this.isLeaf = !childNodes || childNodes.length === 0\n this.isEffectivelyChecked = this.isLeaf && this.disabled\n return\n }\n this.isLeaf = false\n }\n\n setChecked(\n value?: boolean | string,\n deep?: boolean,\n recursion?: boolean,\n passValue?: boolean\n ) {\n this.indeterminate = value === 'half'\n this.checked = value === true\n this.isEffectivelyChecked =\n !this.childNodes.length && (this.disabled || this.checked)\n\n if (this.store.checkStrictly && !deep) return\n\n if (!(this.shouldLoadData() && !this.store.checkDescendants)) {\n const handleDescendants = (): void => {\n if (deep) {\n const childNodes = this.childNodes\n for (let i = 0, j = childNodes.length; i < j; i++) {\n const child = childNodes[i]\n passValue = passValue || value !== false\n const isCheck =\n child.disabled && child.isLeaf ? child.checked : passValue\n child.setChecked(isCheck, deep, true, passValue)\n }\n const { half, all, isEffectivelyChecked } = getChildState(childNodes)\n if (!all) {\n this.checked = all\n this.indeterminate = half\n }\n this.isEffectivelyChecked = !this.childNodes.length\n ? this.disabled || this.checked\n : isEffectivelyChecked\n }\n }\n\n if (this.shouldLoadData()) {\n // Only work on lazy load data.\n this.loadData(\n () => {\n handleDescendants()\n reInitChecked(this)\n },\n {\n checked: value !== false,\n }\n )\n return\n } else {\n handleDescendants()\n }\n }\n\n const parent = this.parent\n if (!parent || parent.level === 0) return\n\n if (!recursion && !this.store.checkStrictly) {\n reInitChecked(parent)\n }\n }\n\n getChildren(forceInit = false): TreeNodeData | TreeNodeData[] | null {\n // this is data\n if (this.level === 0) return this.data\n const data = this.data\n if (!data) return null\n\n const props = this.store.props\n let children = 'children'\n if (props) {\n children = props.children || 'children'\n }\n\n if (isUndefined(data[children])) {\n data[children] = null\n }\n\n if (forceInit && !data[children]) {\n data[children] = []\n }\n\n return data[children]\n }\n\n updateChildren(): void {\n const newData = (this.getChildren() || []) as TreeNodeData[]\n const oldData = this.childNodes.map((node) => node.data)\n\n const newDataMap: Record<TreeKey, TreeNodeData> = {}\n const newNodes: TreeNodeData[] = []\n\n newData.forEach((item, index) => {\n const key = item[NODE_KEY]\n const isNodeExists =\n !!key && oldData.some((data) => data?.[NODE_KEY] === key)\n if (isNodeExists) {\n newDataMap[key] = { index, data: item }\n } else {\n newNodes.push({ index, data: item })\n }\n })\n\n if (!this.store.lazy) {\n oldData.forEach((item) => {\n if (!newDataMap[item?.[NODE_KEY]]) this.removeChildByData(item)\n })\n }\n\n newNodes.forEach(({ index, data }) => {\n this.insertChild({ data }, index)\n })\n\n this.updateLeafState()\n }\n\n loadData(\n callback: (data?: TreeNodeData[]) => void,\n defaultProps: TreeNodeLoadedDefaultProps = {}\n ) {\n if (\n this.store.lazy === true &&\n this.store.load &&\n !this.loaded &&\n (!this.loading || Object.keys(defaultProps).length)\n ) {\n this.loading = true\n\n const resolve = (children: TreeNodeData[]) => {\n this.childNodes = []\n\n this.doCreateChildren(children, defaultProps)\n this.loaded = true\n this.loading = false\n\n this.updateLeafState()\n if (callback) {\n callback.call(this, children)\n }\n }\n const reject = () => {\n this.loading = false\n }\n\n this.store.load(this, resolve, reject)\n } else {\n if (callback) {\n callback.call(this)\n }\n }\n }\n\n eachNode(callback: (node: Node) => void) {\n const arr: Node[] = [this]\n while (arr.length) {\n const node = arr.shift()!\n arr.unshift(...node.childNodes)\n callback(node)\n }\n }\n\n reInitChecked() {\n if (this.store.checkStrictly) return\n reInitChecked(this)\n }\n}\n\nexport default Node\n"],"mappings":"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"}