{"version":3,"file":"tree.mjs","sources":["../../../../../../../packages/components/table/src/store/tree.ts"],"sourcesContent":["import { ref, computed, watch, getCurrentInstance, unref } from 'vue'\nimport { walkTreeNode, getRowIdentity } from '../util'\n\nimport type { WatcherPropsData } from '.'\nimport type { Table, TableProps } from '../table/defaults'\n\nfunction useTree<T>(watcherData: WatcherPropsData<T>) {\n  const expandRowKeys = ref<string[]>([])\n  const treeData = ref<unknown>({})\n  const indent = ref(16)\n  const lazy = ref(false)\n  const lazyTreeNodeMap = ref({})\n  const lazyColumnIdentifier = ref('hasChildren')\n  const childrenColumnName = ref('children')\n  const instance = getCurrentInstance() as Table<T>\n  const normalizedData = computed(() => {\n    if (!watcherData.rowKey.value) return {}\n    const data = watcherData.data.value || []\n    return normalize(data)\n  })\n  const normalizedLazyNode = computed(() => {\n    const rowKey = watcherData.rowKey.value\n    const keys = Object.keys(lazyTreeNodeMap.value)\n    const res = {}\n    if (!keys.length) return res\n    keys.forEach((key) => {\n      if (lazyTreeNodeMap.value[key].length) {\n        const item = { children: [] }\n        lazyTreeNodeMap.value[key].forEach((row) => {\n          const currentRowKey = getRowIdentity(row, rowKey)\n          item.children.push(currentRowKey)\n          if (row[lazyColumnIdentifier.value] && !res[currentRowKey]) {\n            res[currentRowKey] = { children: [] }\n          }\n        })\n        res[key] = item\n      }\n    })\n    return res\n  })\n\n  const normalize = (data) => {\n    const rowKey = watcherData.rowKey.value\n    const res = {}\n    walkTreeNode(\n      data,\n      (parent, children, level) => {\n        const parentId = getRowIdentity(parent, rowKey)\n        if (Array.isArray(children)) {\n          res[parentId] = {\n            children: children.map((row) => getRowIdentity(row, rowKey)),\n            level,\n          }\n        } else if (lazy.value) {\n          // 当 children 不存在且 lazy 为 true，该节点即为懒加载的节点\n          res[parentId] = {\n            children: [],\n            lazy: true,\n            level,\n          }\n        }\n      },\n      childrenColumnName.value,\n      lazyColumnIdentifier.value\n    )\n    return res\n  }\n\n  const updateTreeData = (\n    ifChangeExpandRowKeys = false,\n    ifExpandAll = instance.store?.states.defaultExpandAll.value\n  ) => {\n    const nested = normalizedData.value\n    const normalizedLazyNode_ = normalizedLazyNode.value\n    const keys = Object.keys(nested)\n    const newTreeData = {}\n    if (keys.length) {\n      const oldTreeData = unref(treeData)\n      const rootLazyRowKeys = []\n      const getExpanded = (oldValue, key) => {\n        if (ifChangeExpandRowKeys) {\n          if (expandRowKeys.value) {\n            return ifExpandAll || expandRowKeys.value.includes(key)\n          } else {\n            return !!(ifExpandAll || oldValue?.expanded)\n          }\n        } else {\n          const included =\n            ifExpandAll ||\n            (expandRowKeys.value && expandRowKeys.value.includes(key))\n          return !!(oldValue?.expanded || included)\n        }\n      }\n      // 合并 expanded 与 display，确保数据刷新后，状态不变\n      keys.forEach((key) => {\n        const oldValue = oldTreeData[key]\n        const newValue = { ...nested[key] }\n        newValue.expanded = getExpanded(oldValue, key)\n        if (newValue.lazy) {\n          const { loaded = false, loading = false } = oldValue || {}\n          newValue.loaded = !!loaded\n          newValue.loading = !!loading\n          rootLazyRowKeys.push(key)\n        }\n        newTreeData[key] = newValue\n      })\n      // 根据懒加载数据更新 treeData\n      const lazyKeys = Object.keys(normalizedLazyNode_)\n      if (lazy.value && lazyKeys.length && rootLazyRowKeys.length) {\n        lazyKeys.forEach((key) => {\n          const oldValue = oldTreeData[key]\n          const lazyNodeChildren = normalizedLazyNode_[key].children\n          if (rootLazyRowKeys.indexOf(key) !== -1) {\n            // 懒加载的 root 节点，更新一下原有的数据，原来的 children 一定是空数组\n            if (newTreeData[key].children.length !== 0) {\n              throw new Error('[ElTable]children must be an empty array.')\n            }\n            newTreeData[key].children = lazyNodeChildren\n          } else {\n            const { loaded = false, loading = false } = oldValue || {}\n            newTreeData[key] = {\n              lazy: true,\n              loaded: !!loaded,\n              loading: !!loading,\n              expanded: getExpanded(oldValue, key),\n              children: lazyNodeChildren,\n              level: '',\n            }\n          }\n        })\n      }\n    }\n    treeData.value = newTreeData\n    instance.store?.updateTableScrollY()\n  }\n\n  watch(\n    () => expandRowKeys.value,\n    () => {\n      updateTreeData(true)\n    }\n  )\n\n  watch(\n    () => normalizedData.value,\n    () => {\n      updateTreeData()\n    }\n  )\n  watch(\n    () => normalizedLazyNode.value,\n    () => {\n      updateTreeData()\n    }\n  )\n\n  const updateTreeExpandKeys = (value: string[]) => {\n    expandRowKeys.value = value\n    updateTreeData()\n  }\n\n  const toggleTreeExpansion = (row: T, expanded?: boolean) => {\n    instance.store.assertRowKey()\n\n    const rowKey = watcherData.rowKey.value\n    const id = getRowIdentity(row, rowKey)\n    const data = id && treeData.value[id]\n    if (id && data && 'expanded' in data) {\n      const oldExpanded = data.expanded\n      expanded = typeof expanded === 'undefined' ? !data.expanded : expanded\n      treeData.value[id].expanded = expanded\n      if (oldExpanded !== expanded) {\n        instance.emit('expand-change', row, expanded)\n      }\n      instance.store.updateTableScrollY()\n    }\n  }\n\n  const loadOrToggle = (row) => {\n    instance.store.assertRowKey()\n    const rowKey = watcherData.rowKey.value\n    const id = getRowIdentity(row, rowKey)\n    const data = treeData.value[id]\n    if (lazy.value && data && 'loaded' in data && !data.loaded) {\n      loadData(row, id, data)\n    } else {\n      toggleTreeExpansion(row, undefined)\n    }\n  }\n\n  const loadData = (row: T, key: string, treeNode) => {\n    const { load } = instance.props as unknown as TableProps<T>\n    if (load && !treeData.value[key].loaded) {\n      treeData.value[key].loading = true\n      load(row, treeNode, (data) => {\n        if (!Array.isArray(data)) {\n          throw new Error('[ElTable] data must be an array')\n        }\n        treeData.value[key].loading = false\n        treeData.value[key].loaded = true\n        treeData.value[key].expanded = true\n        if (data.length) {\n          lazyTreeNodeMap.value[key] = data\n        }\n        instance.emit('expand-change', row, true)\n      })\n    }\n  }\n\n  return {\n    loadData,\n    loadOrToggle,\n    toggleTreeExpansion,\n    updateTreeExpandKeys,\n    updateTreeData,\n    normalize,\n    states: {\n      expandRowKeys,\n      treeData,\n      indent,\n      lazy,\n      lazyTreeNodeMap,\n      lazyColumnIdentifier,\n      childrenColumnName,\n    },\n  }\n}\n\nexport default useTree\n"],"names":[],"mappings":"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"}