{"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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"}