element-plus
Version:
A Component Library for Vue 3
1 lines • 10.3 kB
Source Map (JSON)
{"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 = () => {\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; 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 ) => {\n const checkedKeySet = checkedKeys.value\n const children = node.children\n if (!props.checkStrictly && 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 && 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) {\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?.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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"}