{"version":3,"file":"useCheck.mjs","sources":["../../../../../../../packages/components/tree-v2/src/composables/useCheck.ts"],"sourcesContent":["import { nextTick, ref, watch, getCurrentInstance } from 'vue'\nimport {\n  NODE_CHECK_CHANGE,\n  NODE_CHECK,\n  SetOperationEnum,\n} from '../virtual-tree'\nimport type { Ref } from 'vue'\nimport type { TreeProps, TreeKey, TreeNode, Tree, TreeNodeData } from '../types'\n\nexport function useCheck(props: TreeProps, tree: Ref<Tree | undefined>) {\n  const checkedKeys = ref<Set<TreeKey>>(new Set())\n  const indeterminateKeys = ref<Set<TreeKey>>(new Set())\n  const { emit } = getCurrentInstance()!\n\n  watch(\n    () => tree.value,\n    () => {\n      return nextTick(() => {\n        _setCheckedKeys(props.defaultCheckedKeys)\n      })\n    },\n    {\n      immediate: true,\n    }\n  )\n\n  const updateCheckedKeys = () => {\n    if (!tree.value || !props.showCheckbox || props.checkStrictly) {\n      return\n    }\n    const { levelTreeNodeMap, maxLevel } = tree.value\n    const checkedKeySet = checkedKeys.value\n    const indeterminateKeySet = new Set<TreeKey>()\n    // It is easier to determine the indeterminate state by\n    // traversing from bottom to top\n    // leaf nodes not have indeterminate status and can be skipped\n    for (let level = maxLevel - 1; level >= 1; --level) {\n      const nodes = levelTreeNodeMap.get(level)\n      if (!nodes) continue\n      nodes.forEach((node) => {\n        const children = node.children\n        if (children) {\n          // Whether all child nodes are selected\n          let allChecked = true\n          // Whether a child node is selected\n          let hasChecked = false\n          for (let i = 0; i < children.length; ++i) {\n            const childNode = children[i]\n            const key = childNode.key\n            if (checkedKeySet.has(key)) {\n              hasChecked = true\n            } else if (indeterminateKeySet.has(key)) {\n              allChecked = false\n              hasChecked = true\n              break\n            } else {\n              allChecked = false\n            }\n          }\n          if (allChecked) {\n            checkedKeySet.add(node.key)\n          } else if (hasChecked) {\n            indeterminateKeySet.add(node.key)\n            checkedKeySet.delete(node.key)\n          } else {\n            checkedKeySet.delete(node.key)\n            indeterminateKeySet.delete(node.key)\n          }\n        }\n      })\n    }\n    indeterminateKeys.value = indeterminateKeySet\n  }\n\n  const isChecked = (node: TreeNode) => checkedKeys.value.has(node.key)\n\n  const isIndeterminate = (node: TreeNode) =>\n    indeterminateKeys.value.has(node.key)\n\n  const toggleCheckbox = (\n    node: TreeNode,\n    isChecked: boolean,\n    nodeClick = true\n  ) => {\n    const checkedKeySet = checkedKeys.value\n    const toggle = (node: TreeNode, checked: boolean) => {\n      checkedKeySet[checked ? SetOperationEnum.ADD : SetOperationEnum.DELETE](\n        node.key\n      )\n      const children = node.children\n      if (!props.checkStrictly && children) {\n        children.forEach((childNode) => {\n          if (!childNode.disabled) {\n            toggle(childNode, checked)\n          }\n        })\n      }\n    }\n    toggle(node, isChecked)\n    updateCheckedKeys()\n    if (nodeClick) {\n      afterNodeCheck(node, isChecked)\n    }\n  }\n\n  const afterNodeCheck = (node: TreeNode, checked: boolean) => {\n    const { checkedNodes, checkedKeys } = getChecked()\n    const { halfCheckedNodes, halfCheckedKeys } = getHalfChecked()\n    emit(NODE_CHECK, node.data, {\n      checkedKeys,\n      checkedNodes,\n      halfCheckedKeys,\n      halfCheckedNodes,\n    })\n    emit(NODE_CHECK_CHANGE, node.data, checked)\n  }\n\n  // expose\n  function getCheckedKeys(leafOnly = false): TreeKey[] {\n    return getChecked(leafOnly).checkedKeys\n  }\n\n  function getCheckedNodes(leafOnly = false): TreeNodeData[] {\n    return getChecked(leafOnly).checkedNodes\n  }\n\n  function getHalfCheckedKeys(): TreeKey[] {\n    return getHalfChecked().halfCheckedKeys\n  }\n\n  function getHalfCheckedNodes(): TreeNodeData[] {\n    return getHalfChecked().halfCheckedNodes\n  }\n\n  function getChecked(leafOnly = false): {\n    checkedKeys: TreeKey[]\n    checkedNodes: TreeNodeData[]\n  } {\n    const checkedNodes: TreeNodeData[] = []\n    const keys: TreeKey[] = []\n    if (tree?.value && props.showCheckbox) {\n      const { treeNodeMap } = tree.value\n      checkedKeys.value.forEach((key) => {\n        const node = treeNodeMap.get(key)\n        if (node && (!leafOnly || (leafOnly && node.isLeaf))) {\n          keys.push(key)\n          checkedNodes.push(node.data)\n        }\n      })\n    }\n    return {\n      checkedKeys: keys,\n      checkedNodes,\n    }\n  }\n\n  function getHalfChecked(): {\n    halfCheckedKeys: TreeKey[]\n    halfCheckedNodes: TreeNodeData[]\n  } {\n    const halfCheckedNodes: TreeNodeData[] = []\n    const halfCheckedKeys: TreeKey[] = []\n    if (tree?.value && props.showCheckbox) {\n      const { treeNodeMap } = tree.value\n      indeterminateKeys.value.forEach((key) => {\n        const node = treeNodeMap.get(key)\n        if (node) {\n          halfCheckedKeys.push(key)\n          halfCheckedNodes.push(node.data)\n        }\n      })\n    }\n    return {\n      halfCheckedNodes,\n      halfCheckedKeys,\n    }\n  }\n\n  function setCheckedKeys(keys: TreeKey[]) {\n    checkedKeys.value.clear()\n    _setCheckedKeys(keys)\n  }\n\n  function setChecked(key: TreeKey, isChecked: boolean) {\n    if (tree?.value && props.showCheckbox) {\n      const node = tree.value.treeNodeMap.get(key)\n      if (node) {\n        toggleCheckbox(node, isChecked, false)\n      }\n    }\n  }\n\n  function _setCheckedKeys(keys: TreeKey[]) {\n    if (tree?.value) {\n      const { treeNodeMap } = tree.value\n      if (props.showCheckbox && treeNodeMap && keys) {\n        for (let i = 0; i < keys.length; ++i) {\n          const key = keys[i]\n          const node = treeNodeMap.get(key)\n          if (node && !isChecked(node)) {\n            toggleCheckbox(node, true, false)\n          }\n        }\n      }\n    }\n  }\n\n  return {\n    updateCheckedKeys,\n    toggleCheckbox,\n    isChecked,\n    isIndeterminate,\n    // expose\n    getCheckedKeys,\n    getCheckedNodes,\n    getHalfCheckedKeys,\n    getHalfCheckedNodes,\n    setChecked,\n    setCheckedKeys,\n  }\n}\n"],"names":[],"mappings":"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"}