You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
7.1 KiB

1 month ago
  1. {"ast":null,"code":"import { ref, computed } from 'vue';\nimport { isFunction } from '@vue/shared';\nfunction useFilter(props, tree) {\n const hiddenNodeKeySet = ref(/* @__PURE__ */new Set([]));\n const hiddenExpandIconKeySet = ref(/* @__PURE__ */new Set([]));\n const filterable = computed(() => {\n return isFunction(props.filterMethod);\n });\n function doFilter(query) {\n var _a;\n if (!filterable.value) {\n return;\n }\n const expandKeySet = /* @__PURE__ */new Set();\n const hiddenExpandIconKeys = hiddenExpandIconKeySet.value;\n const hiddenKeys = hiddenNodeKeySet.value;\n const family = [];\n const nodes = ((_a = tree.value) == null ? void 0 : _a.treeNodes) || [];\n const filter = props.filterMethod;\n hiddenKeys.clear();\n function traverse(nodes2) {\n nodes2.forEach(node => {\n family.push(node);\n if (filter == null ? void 0 : filter(query, node.data, node)) {\n family.forEach(member => {\n expandKeySet.add(member.key);\n });\n } else if (node.isLeaf) {\n hiddenKeys.add(node.key);\n }\n const children = node.children;\n if (children) {\n traverse(children);\n }\n if (!node.isLeaf) {\n if (!expandKeySet.has(node.key)) {\n hiddenKeys.add(node.key);\n } else if (children) {\n let allHidden = true;\n for (const childNode of children) {\n if (!hiddenKeys.has(childNode.key)) {\n allHidden = false;\n break;\n }\n }\n if (allHidden) {\n hiddenExpandIconKeys.add(node.key);\n } else {\n hiddenExpandIconKeys.delete(node.key);\n }\n }\n }\n family.pop();\n });\n }\n traverse(nodes);\n return expandKeySet;\n }\n function isForceHiddenExpandIcon(node) {\n return hiddenExpandIconKeySet.value.has(node.key);\n }\n return {\n hiddenExpandIconKeySet,\n hiddenNodeKeySet,\n doFilter,\n isForceHiddenExpandIcon\n };\n}\nexport { useFilter };","map":{"version":3,"names":["useFilter","props","tree","hiddenNodeKeySet","ref","Set","hiddenExpandIconKeySet","filterable","computed","isFunction","filterMethod","doFilter","query","_a","value","expandKeySet","hiddenExpandIconKeys","hiddenKeys","family","nodes","treeNodes","filter","clear","traverse","nodes2","forEach","node","push","data","member","add","key","isLeaf","children","has","allHidden","childNode","delete","pop","isForceHiddenExpandIcon"],"sources":["../../../../../../../packages/components/tree-v2/src/composables/useFilter.ts"],"sourcesContent":["import { computed, ref } from 'vue'\nimport { isFunction } from '@element-plus/utils'\nimport type { Ref } from 'vue'\nimport type { Tree, TreeKey, TreeNode, TreeProps } from '../types'\n\n// When the data volume is very large using filter will cause lag\n// I haven't found a better way to optimize it for now\n// Maybe this problem should be left to the server side\nexport function useFilter(props: TreeProps, tree: Ref<Tree | undefined>) {\n const hiddenNodeKeySet = ref<Set<TreeKey>>(new Set([]))\n const hiddenExpandIconKeySet = ref<Set<TreeKey>>(new Set([]))\n\n const filterable = computed(() => {\n return isFunction(props.filterMethod)\n })\n\n function doFilter(query: string) {\n if (!filterable.value) {\n return\n }\n const expandKeySet = new Set<TreeKey>()\n const hiddenExpandIconKeys = hiddenExpandIconKeySet.value\n const hiddenKeys = hiddenNodeKeySet.value\n const family: TreeNode[] = []\n const nodes = tree.value?.treeNodes || []\n const filter = props.filterMethod\n hiddenKeys.clear()\n function traverse(nodes: TreeNode[]) {\n nodes.forEach((node) => {\n family.push(node)\n if (filter?.(query, node.data, node)) {\n family.forEach((member) => {\n expandKeySet.add(member.key)\n })\n } else if (node.isLeaf) {\n hiddenKeys.add(node.key)\n }\n