UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 8.77 kB
{"version":3,"file":"node.mjs","sources":["../../../../../../packages/components/cascader-panel/src/node.ts"],"sourcesContent":["import { isFunction } from '@vue/shared'\nimport { capitalize, isUndefined, isEmpty } from '@element-plus/utils/util'\nimport type { VNode } from 'vue'\n\nexport type CascaderNodeValue = string | number\nexport type CascaderNodePathValue = CascaderNodeValue[]\nexport type CascaderValue =\n | CascaderNodeValue\n | CascaderNodePathValue\n | (CascaderNodeValue | CascaderNodePathValue)[]\nexport type CascaderConfig = Required<CascaderProps>\nexport enum ExpandTrigger {\n CLICK = 'click',\n HOVER = 'hover',\n}\nexport type isDisabled = (data: CascaderOption, node: Node) => boolean\nexport type isLeaf = (data: CascaderOption, node: Node) => boolean\nexport type Resolve = (dataList?: CascaderOption[]) => void\nexport type LazyLoad = (node: Node, resolve: Resolve) => void\nexport type RenderLabel = ({\n node: Node,\n data: CascaderOption,\n}) => VNode | VNode[]\nexport interface CascaderOption extends Record<string, unknown> {\n label?: string\n value?: CascaderNodeValue\n children?: CascaderOption[]\n disabled?: boolean\n leaf?: boolean\n}\n\nexport interface CascaderProps {\n expandTrigger?: ExpandTrigger\n multiple?: boolean\n checkStrictly?: boolean\n emitPath?: boolean\n lazy?: boolean\n lazyLoad?: LazyLoad\n value?: string\n label?: string\n children?: string\n disabled?: string | isDisabled\n leaf?: string | isLeaf\n hoverThreshold?: number\n}\n\nexport type Nullable<T> = null | T\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 checked = false\n indeterminate = false\n loading = false\n\n constructor(\n readonly data: Nullable<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 }\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 : !(Array.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 (Array.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(event: string, ...args: unknown[]) {\n const handlerName = `onParent${capitalize(event)}`\n this.children.forEach((child) => {\n if (child) {\n // bottom up\n child.broadcast(event, ...args)\n child[handlerName] && child[handlerName](...args)\n }\n })\n }\n\n emit(event: string, ...args: unknown[]) {\n const { parent } = this\n const handlerName = `onChild${capitalize(event)}`\n if (parent) {\n parent[handlerName] && parent[handlerName](...args)\n parent.emit(event, ...args)\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.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('check', checked)\n this.setCheckState(checked)\n this.emit('check')\n }\n }\n}\n\nexport default Node\n"],"names":[],"mappings":"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"}