UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 7.43 kB
{"version":3,"file":"node.mjs","names":[],"sources":["../../../../../../packages/components/cascader-panel/src/node.ts"],"sourcesContent":["import { isArray, isEmpty, isFunction, isUndefined } from '@element-plus/utils'\n\nimport type {\n CascaderConfig,\n CascaderNodePathValue,\n CascaderNodeValue,\n CascaderOption,\n} from './types'\n\ntype ChildrenData = CascaderOption[] | undefined\n\nlet uid = 0\n\nconst calculatePathNodes = (node: Node) => {\n const nodes = [node]\n let { parent } = node\n\n while (parent) {\n nodes.unshift(parent)\n parent = parent.parent\n }\n\n return nodes\n}\n\nclass Node {\n readonly uid: number = uid++\n readonly level: number\n readonly value: CascaderNodeValue\n readonly label: string\n readonly pathNodes: Node[]\n readonly pathValues: CascaderNodePathValue\n readonly pathLabels: string[]\n\n childrenData: ChildrenData\n children: Node[]\n text: string\n loaded: boolean\n /**\n * Is it checked\n *\n * @default false\n */\n checked = false\n /**\n * Used to indicate the intermediate state of unchecked and fully checked child nodes\n *\n * @default false\n */\n indeterminate = false\n /**\n * Loading Status\n *\n * @default false\n */\n loading = false\n\n constructor(\n readonly data: CascaderOption,\n readonly config: CascaderConfig,\n readonly parent?: Node,\n readonly root = false\n ) {\n const { value: valueKey, label: labelKey, children: childrenKey } = config\n\n const childrenData = data[childrenKey] as ChildrenData\n const pathNodes = calculatePathNodes(this)\n\n this.level = root ? 0 : parent ? parent.level + 1 : 1\n this.value = data[valueKey] as CascaderNodeValue\n this.label = data[labelKey] as string\n this.pathNodes = pathNodes\n this.pathValues = pathNodes.map((node) => node.value)\n this.pathLabels = pathNodes.map((node) => node.label)\n this.childrenData = childrenData\n this.children = (childrenData || []).map(\n (child) => new Node(child, config, this)\n )\n this.loaded = !config.lazy || this.isLeaf || !isEmpty(childrenData)\n this.text = ''\n }\n\n get isDisabled(): boolean {\n const { data, parent, config } = this\n const { disabled, checkStrictly } = config\n const isDisabled = isFunction(disabled)\n ? disabled(data, this)\n : !!data[disabled]\n return isDisabled || (!checkStrictly && !!parent?.isDisabled)\n }\n\n get isLeaf(): boolean {\n const { data, config, childrenData, loaded } = this\n const { lazy, leaf } = config\n const isLeaf = isFunction(leaf) ? leaf(data, this) : data[leaf]\n\n return isUndefined(isLeaf)\n ? lazy && !loaded\n ? false\n : !(isArray(childrenData) && childrenData.length)\n : !!isLeaf\n }\n\n get valueByOption() {\n return this.config.emitPath ? this.pathValues : this.value\n }\n\n appendChild(childData: CascaderOption) {\n const { childrenData, children } = this\n const node = new Node(childData, this.config, this)\n\n if (isArray(childrenData)) {\n childrenData.push(childData)\n } else {\n this.childrenData = [childData]\n }\n\n children.push(node)\n\n return node\n }\n\n calcText(allLevels: boolean, separator: string) {\n const text = allLevels ? this.pathLabels.join(separator) : this.label\n this.text = text\n return text\n }\n\n broadcast(checked: boolean) {\n this.children.forEach((child) => {\n if (child) {\n // bottom up\n child.broadcast(checked)\n child.onParentCheck?.(checked)\n }\n })\n }\n\n emit() {\n const { parent } = this\n if (parent) {\n parent.onChildCheck?.()\n parent.emit()\n }\n }\n\n onParentCheck(checked: boolean) {\n if (!this.isDisabled) {\n this.setCheckState(checked)\n }\n }\n\n onChildCheck() {\n const { children } = this\n const validChildren = children.filter((child) => !child.isDisabled)\n const checked = validChildren.length\n ? validChildren.every((child) => child.checked)\n : false\n\n this.setCheckState(checked)\n }\n\n setCheckState(checked: boolean) {\n const totalNum = this.children.length\n const checkedNum = this.children.reduce((c, p) => {\n const num = p.checked ? 1 : p.indeterminate ? 0.5 : 0\n return c + num\n }, 0)\n\n this.checked =\n this.loaded &&\n this.children\n .filter((child) => !child.isDisabled)\n .every((child) => child.loaded && child.checked) &&\n checked\n this.indeterminate =\n this.loaded && checkedNum !== totalNum && checkedNum > 0\n }\n\n doCheck(checked: boolean) {\n if (this.checked === checked) return\n\n const { checkStrictly, multiple } = this.config\n\n if (checkStrictly || !multiple) {\n this.checked = checked\n } else {\n // bottom up to unify the calculation of the indeterminate state\n this.broadcast(checked)\n this.setCheckState(checked)\n this.emit()\n }\n }\n}\n\nexport default Node\n"],"mappings":"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"}