UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 11.5 kB
{"version":3,"file":"useTree.mjs","sources":["../../../../../../../packages/components/tree-v2/src/composables/useTree.ts"],"sourcesContent":["import { computed, nextTick, ref, shallowRef, watch } from 'vue'\nimport {\n NODE_CLICK,\n NODE_COLLAPSE,\n NODE_EXPAND,\n CURRENT_CHANGE,\n TreeOptionsEnum,\n} from '../virtual-tree'\nimport { useCheck } from './useCheck'\nimport { useFilter } from './useFilter'\nimport type {\n TreeProps,\n TreeNodeData,\n TreeKey,\n TreeNode,\n TreeData,\n Tree,\n} from '../types'\n\nexport function useTree(props: TreeProps, emit) {\n const expandedKeySet = ref<Set<TreeKey>>(new Set(props.defaultExpandedKeys))\n const currentKey = ref<TreeKey | undefined>()\n const tree = shallowRef<Tree | undefined>()\n\n watch(\n () => props.currentNodeKey,\n (key) => {\n currentKey.value = key\n },\n {\n immediate: true,\n }\n )\n\n watch(\n () => props.data,\n (data: TreeData) => {\n setData(data)\n },\n {\n immediate: true,\n }\n )\n\n const {\n isIndeterminate,\n isChecked,\n toggleCheckbox,\n getCheckedKeys,\n getCheckedNodes,\n getHalfCheckedKeys,\n getHalfCheckedNodes,\n setChecked,\n setCheckedKeys,\n } = useCheck(props, tree)\n\n const { doFilter, hiddenNodeKeySet, isForceHiddenExpandIcon } = useFilter(\n props,\n tree\n )\n\n const valueKey = computed(() => {\n return props.props?.value || TreeOptionsEnum.KEY\n })\n const childrenKey = computed(() => {\n return props.props?.children || TreeOptionsEnum.CHILDREN\n })\n const disabledKey = computed(() => {\n return props.props?.disabled || TreeOptionsEnum.DISABLED\n })\n const labelKey = computed(() => {\n return props.props?.label || TreeOptionsEnum.LABEL\n })\n\n const flattenTree = computed(() => {\n const expandedKeys = expandedKeySet.value\n const hiddenKeys = hiddenNodeKeySet.value\n const flattenNodes: TreeNode[] = []\n const nodes = (tree.value && tree.value.treeNodes) || []\n function traverse() {\n const stack: TreeNode[] = []\n for (let i = nodes.length - 1; i >= 0; --i) {\n stack.push(nodes[i])\n }\n while (stack.length) {\n const node = stack.pop()\n if (!node) continue\n if (!hiddenKeys.has(node.key)) {\n flattenNodes.push(node)\n }\n // Only \"visible\" nodes will be rendered\n if (expandedKeys.has(node.key)) {\n const children = node.children\n if (children) {\n const length = children.length\n for (let i = length - 1; i >= 0; --i) {\n stack.push(children[i])\n }\n }\n }\n }\n }\n traverse()\n return flattenNodes\n })\n\n const isNotEmpty = computed(() => {\n return flattenTree.value.length > 0\n })\n\n function createTree(data: TreeData): Tree {\n const treeNodeMap: Map<TreeKey, TreeNode> = new Map()\n const levelTreeNodeMap: Map<number, TreeNode[]> = new Map()\n let maxLevel = 1\n function traverse(\n nodes: TreeData,\n level = 1,\n parent: TreeNode | undefined = undefined\n ) {\n const siblings: TreeNode[] = []\n for (let index = 0; index < nodes.length; ++index) {\n const rawNode = nodes[index]\n const value = getKey(rawNode)\n const node: TreeNode = {\n level,\n key: value,\n data: rawNode,\n }\n node.label = getLabel(rawNode)\n node.parent = parent\n const children = getChildren(rawNode)\n node.disabled = getDisabled(rawNode)\n node.isLeaf = !children || children.length === 0\n if (children && children.length) {\n node.children = traverse(children, level + 1, node)\n }\n siblings.push(node)\n treeNodeMap.set(value, node)\n if (!levelTreeNodeMap.has(level)) {\n levelTreeNodeMap.set(level, [])\n }\n levelTreeNodeMap.get(level)?.push(node)\n }\n if (level > maxLevel) {\n maxLevel = level\n }\n return siblings\n }\n const treeNodes: TreeNode[] = traverse(data)\n return {\n treeNodeMap,\n levelTreeNodeMap,\n maxLevel,\n treeNodes,\n }\n }\n\n function filter(query: string) {\n const keys = doFilter(query)\n if (keys) {\n expandedKeySet.value = keys\n }\n }\n\n function getChildren(node: TreeNodeData): TreeNodeData[] {\n return node[childrenKey.value]\n }\n\n function getKey(node: TreeNodeData): TreeKey {\n if (!node) {\n return ''\n }\n return node[valueKey.value]\n }\n\n function getDisabled(node: TreeNodeData): boolean {\n return node[disabledKey.value]\n }\n\n function getLabel(node: TreeNodeData): string {\n return node[labelKey.value]\n }\n\n function toggleExpand(node: TreeNode) {\n const expandedKeys = expandedKeySet.value\n if (expandedKeys.has(node.key)) {\n collapse(node)\n } else {\n expand(node)\n }\n }\n\n function handleNodeClick(node: TreeNode) {\n emit(NODE_CLICK, node.data, node)\n handleCurrentChange(node)\n if (props.expandOnClickNode) {\n toggleExpand(node)\n }\n if (props.showCheckbox && props.checkOnClickNode && !node.disabled) {\n toggleCheckbox(node, !isChecked(node), true)\n }\n }\n\n function handleCurrentChange(node: TreeNode) {\n if (!isCurrent(node)) {\n currentKey.value = node.key\n emit(CURRENT_CHANGE, node.data, node)\n }\n }\n\n function handleNodeCheck(node: TreeNode, checked: boolean) {\n toggleCheckbox(node, checked)\n }\n\n function expand(node: TreeNode) {\n const keySet = expandedKeySet.value\n if (tree?.value && props.accordion) {\n // whether only one node among the same level can be expanded at one time\n const { treeNodeMap } = tree.value\n keySet.forEach((key) => {\n const node = treeNodeMap.get(key)\n if (node && node.level === node.level) {\n keySet.delete(key)\n }\n })\n }\n keySet.add(node.key)\n emit(NODE_EXPAND, node.data, node)\n }\n\n function collapse(node: TreeNode) {\n expandedKeySet.value.delete(node.key)\n emit(NODE_COLLAPSE, node.data, node)\n }\n\n function isExpanded(node: TreeNode): boolean {\n return expandedKeySet.value.has(node.key)\n }\n\n function isDisabled(node: TreeNode): boolean {\n return !!node.disabled\n }\n\n function isCurrent(node: TreeNode): boolean {\n const current = currentKey.value\n return !!current && current === node.key\n }\n\n function getCurrentNode(): TreeNodeData | undefined {\n if (!currentKey.value) return undefined\n return tree?.value?.treeNodeMap.get(currentKey.value)?.data\n }\n\n function getCurrentKey(): TreeKey | undefined {\n return currentKey.value\n }\n\n function setCurrentKey(key: TreeKey): void {\n currentKey.value = key\n }\n\n function setData(data: TreeData) {\n nextTick(() => (tree.value = createTree(data)))\n }\n\n return {\n tree,\n flattenTree,\n isNotEmpty,\n getKey,\n getChildren,\n toggleExpand,\n toggleCheckbox,\n isExpanded,\n isChecked,\n isIndeterminate,\n isDisabled,\n isCurrent,\n isForceHiddenExpandIcon,\n handleNodeClick,\n handleNodeCheck,\n // expose\n getCurrentNode,\n getCurrentKey,\n setCurrentKey,\n getCheckedKeys,\n getCheckedNodes,\n getHalfCheckedKeys,\n getHalfCheckedNodes,\n setChecked,\n setCheckedKeys,\n filter,\n setData,\n }\n}\n"],"names":[],"mappings":"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"}