{"version":3,"file":"useFilter.mjs","names":[],"sources":["../../../../../../../packages/components/tree-v2/src/composables/useFilter.ts"],"sourcesContent":["import { computed, ref } from 'vue'\nimport { isFunction } from '@element-plus/utils'\n\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            member.expanded = true\n          })\n        } else {\n          node.expanded = false\n          if (node.isLeaf) {\n            hiddenKeys.add(node.key)\n          }\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            // If all child nodes are hidden, then the expand icon will be hidden\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\n  function isForceHiddenExpandIcon(node: TreeNode): boolean {\n    return hiddenExpandIconKeySet.value.has(node.key)\n  }\n\n  return {\n    hiddenExpandIconKeySet,\n    hiddenNodeKeySet,\n    doFilter,\n    isForceHiddenExpandIcon,\n  }\n}\n"],"mappings":";;;;AASA,SAAgB,UAAU,OAAkB,MAA6B;CACvE,MAAM,mBAAmB,oBAAkB,IAAI,IAAI,EAAE,CAAC,CAAC;CACvD,MAAM,yBAAyB,oBAAkB,IAAI,IAAI,EAAE,CAAC,CAAC;CAE7D,MAAM,aAAa,eAAe;AAChC,SAAO,WAAW,MAAM,aAAa;GACrC;CAEF,SAAS,SAAS,OAAe;AAC/B,MAAI,CAAC,WAAW,MACd;EAEF,MAAM,+BAAe,IAAI,KAAc;EACvC,MAAM,uBAAuB,uBAAuB;EACpD,MAAM,aAAa,iBAAiB;EACpC,MAAM,SAAqB,EAAE;EAC7B,MAAM,QAAQ,KAAK,OAAO,aAAa,EAAE;EACzC,MAAM,SAAS,MAAM;AACrB,aAAW,OAAO;EAClB,SAAS,SAAS,OAAmB;AACnC,SAAM,SAAS,SAAS;AACtB,WAAO,KAAK,KAAK;AACjB,QAAI,SAAS,OAAO,KAAK,MAAM,KAAK,CAClC,QAAO,SAAS,WAAW;AACzB,kBAAa,IAAI,OAAO,IAAI;AAC5B,YAAO,WAAW;MAClB;SACG;AACL,UAAK,WAAW;AAChB,SAAI,KAAK,OACP,YAAW,IAAI,KAAK,IAAI;;IAG5B,MAAM,WAAW,KAAK;AACtB,QAAI,SACF,UAAS,SAAS;AAEpB,QAAI,CAAC,KAAK,QACR;SAAI,CAAC,aAAa,IAAI,KAAK,IAAI,CAC7B,YAAW,IAAI,KAAK,IAAI;cACf,UAAU;MAEnB,IAAI,YAAY;AAChB,WAAK,MAAM,aAAa,SACtB,KAAI,CAAC,WAAW,IAAI,UAAU,IAAI,EAAE;AAClC,mBAAY;AACZ;;AAGJ,UAAI,UACF,sBAAqB,IAAI,KAAK,IAAI;UAElC,sBAAqB,OAAO,KAAK,IAAI;;;AAI3C,WAAO,KAAK;KACZ;;AAEJ,WAAS,MAAM;AACf,SAAO;;CAGT,SAAS,wBAAwB,MAAyB;AACxD,SAAO,uBAAuB,MAAM,IAAI,KAAK,IAAI;;AAGnD,QAAO;EACL;EACA;EACA;EACA;EACD"}