{"version":3,"file":"useCheck.mjs","sources":["../../../../../../packages/components/tree/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  /** 更新选中的节点 */\n  const updateCheckedKeys = () => {\n    // || props.checkStrictly\n    if (!tree.value || !props.showCheckbox) {\n      return\n    }\n    const { levelTreeNodeMap, maxLevel } = tree.value\n    const checkedKeySet = checkedKeys.value\n    const indeterminateKeySet = new Set<TreeKey>()\n    // 从最深的节点开始遍历树可以更容易确定半选中状态\n    // 叶子节点没有半选中状态并且可以被跳过\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) return\n\n        // 子节点是否被全部选中\n        let allChecked = true\n        // 子节点是否被部分选中\n        let hasChecked = false\n\n        for (let i = 0; i < children.length; ++i) {\n          const childNode = children[i]\n          const key = childNode.key\n          // 子节点被选中或半选中\n          if (checkedKeySet.has(key) || indeterminateKeySet.has(key)) {\n            hasChecked = true\n          } else {\n            allChecked = false\n          }\n        }\n        const { checkStrictly } = props\n\n        if (hasChecked) {\n          indeterminateKeySet.add(node.key)\n        }\n\n        if (!checkStrictly) {\n          if (allChecked) {\n            checkedKeySet.add(node.key)\n          } else {\n            checkedKeySet.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      children &&\n        (nodeClick || !props.checkStrictly) &&\n        children.forEach(childNode => {\n          if (!childNode.disabled) {\n            toggle(childNode, checked)\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 { nodes: checkedNodes, keys: checkedKeys } = getChecked()\n    const { nodes: halfCheckedNodes, keys: halfCheckedKeys } = getHalfChecked()\n    emit(NODE_CHECK, node.data, {\n      checkedNodes,\n      checkedKeys,\n      halfCheckedNodes,\n      halfCheckedKeys\n    })\n    emit(NODE_CHECK_CHANGE, node.data, checked)\n  }\n\n  // TODO除了keys和Nodes还应该返回一个半选中的节点\n  function getChecked(leafOnly = false) {\n    const nodes: TreeNodeData[] = []\n    const keys: TreeKey[] = []\n\n    if (!tree.value || !props.showCheckbox) {\n      return { keys, nodes }\n    }\n\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        nodes.push(node.data)\n      }\n    })\n    return {\n      keys,\n      nodes\n    }\n  }\n\n  /** 获取半选中的节点 */\n  function getHalfChecked() {\n    const nodes: TreeNodeData[] = []\n    const keys: TreeKey[] = []\n\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) return\n        keys.push(key)\n        nodes.push(node.data)\n      })\n    }\n    return {\n      nodes,\n      keys\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  /** TODO 还没有完成， 暂时这样写  */\n  function setCheckedAll() {\n    if (!tree?.value) return\n    const { treeNodeMap } = tree.value\n    for (let entry of treeNodeMap) {\n      const node = treeNodeMap.get(entry[0])!\n      toggleCheckbox(node, true, false)\n    }\n  }\n\n  return {\n    updateCheckedKeys,\n    toggleCheckbox,\n    isChecked,\n    isIndeterminate,\n    setChecked,\n    setCheckedKeys,\n    getChecked,\n    getHalfChecked,\n    setCheckedAll\n  }\n}\n"],"names":["isChecked","node","checkedKeys"],"mappings":"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"}