{"version":3,"file":"useCheck.mjs","names":[],"sources":["../../../../../../../packages/components/tree-v2/src/composables/useCheck.ts"],"sourcesContent":["import { getCurrentInstance, nextTick, ref, watch } from 'vue'\nimport {\n  NODE_CHECK,\n  NODE_CHECK_CHANGE,\n  SetOperationEnum,\n} from '../virtual-tree'\n\nimport type { CheckboxValueType } from '@element-plus/components/checkbox'\nimport type { Ref } from 'vue'\nimport type { Tree, TreeKey, TreeNode, TreeNodeData, TreeProps } 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, () => props.defaultCheckedKeys],\n    () => {\n      return nextTick(() => {\n        _setCheckedKeys(props.defaultCheckedKeys!)\n      })\n    },\n    {\n      immediate: true,\n    }\n  )\n\n  const updateCheckedKeys = (deep = false) => {\n    if (!tree.value || !props.showCheckbox || (props.checkStrictly && !deep)) {\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; level >= 1; --level) {\n      const nodes = levelTreeNodeMap.get(level)\n      if (!nodes) continue\n      nodes.forEach((node) => {\n        const children = node.children\n        let isEffectivelyChecked =\n          !node.isLeaf || node.disabled || checkedKeySet.has(node.key)\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 (const childNode of children) {\n            const key = childNode.key\n            if (!childNode.isEffectivelyChecked) {\n              isEffectivelyChecked = false\n            }\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        node.isEffectivelyChecked = isEffectivelyChecked\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: CheckboxValueType,\n    nodeClick = true,\n    immediateUpdate = true,\n    deep = false\n  ) => {\n    const checkedKeySet = checkedKeys.value\n    const children = node.children\n    if ((!props.checkStrictly || deep) && nodeClick && children?.length) {\n      isChecked = children.some((node) => !node.isEffectivelyChecked)\n    }\n\n    const toggle = (node: TreeNode, checked: CheckboxValueType) => {\n      checkedKeySet[checked ? SetOperationEnum.ADD : SetOperationEnum.DELETE](\n        node.key\n      )\n      const children = node.children\n      if ((!props.checkStrictly || deep) && children) {\n        children.forEach((childNode) => {\n          if (!childNode.disabled || childNode.children) {\n            toggle(childNode, checked)\n          }\n        })\n      }\n    }\n    toggle(node, isChecked)\n    if (immediateUpdate) {\n      updateCheckedKeys()\n    }\n    if (nodeClick) {\n      afterNodeCheck(node, isChecked)\n    }\n  }\n\n  const afterNodeCheck = (node: TreeNode, checked: CheckboxValueType) => {\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    indeterminateKeys.value.clear()\n    nextTick(() => {\n      _setCheckedKeys(keys)\n    })\n  }\n\n  function setChecked(key: TreeKey, isChecked: boolean, deep?: boolean) {\n    if (tree?.value && props.showCheckbox) {\n      const node = tree.value.treeNodeMap.get(key)\n      if (node) {\n        toggleCheckbox(node, isChecked, false, undefined, deep)\n      }\n    }\n  }\n\n  function _setCheckedKeys(keys: TreeKey[]) {\n    if (tree?.value) {\n      const { treeNodeMap } = tree.value\n      if (props.showCheckbox && treeNodeMap && keys?.length > 0) {\n        for (const key of keys) {\n          const node = treeNodeMap.get(key)\n          if (node && !isChecked(node)) {\n            toggleCheckbox(node, true, false, false)\n          }\n        }\n        updateCheckedKeys()\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"],"mappings":"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"}