{"version":3,"file":"tree.mjs","sources":["../../../../../../src/components/ivue-table/store/tree.ts"],"sourcesContent":["import { ref, getCurrentInstance, computed, unref, watch } from 'vue';\r\nimport { getRowIdentity, walkTreeNode } from '../utils';\r\n\r\nimport { throwError } from '../../../utils/error';\r\n\r\n// ts\r\nimport type { WatcherPropsData } from './index';\r\nimport type { Table, TableProps, TreeNode } from '../table/defaults';\r\n\r\nfunction useTree(watcherData: WatcherPropsData) {\r\n  const vm = getCurrentInstance() as Table;\r\n\r\n  // data\r\n\r\n  // 展示树形数据时，树节点的缩进\r\n  const indent = ref<number>(16);\r\n\r\n  // 是否懒加载子节点数据\r\n  const lazy = ref<boolean>(false);\r\n\r\n  // 树数据\r\n  const treeData = ref<TreeNode>({});\r\n\r\n  // 懒加载子节点数据\r\n  const lazyColumnIdentifier = ref<string>('hasChildren');\r\n\r\n  // 子节点数据\r\n  const childrenColumnName = ref<string>('children');\r\n\r\n  // 懒加载节点\r\n  const lazyTreeNodeMap = ref<any>({});\r\n\r\n  // 以通过该属性设置 Table 目前的展开行\r\n  const expandRowKeys = ref<string[]>([]);\r\n\r\n  // computed\r\n\r\n  // 格式化数据\r\n  const normalizedData = computed(() => {\r\n    // 行数据的Key\r\n    if (!watcherData.rowKey.value) {\r\n      return {};\r\n    }\r\n\r\n    // 原始数据\r\n    const data = watcherData.data.value || [];\r\n\r\n    // 格式化数据\r\n    return normalize(data);\r\n  });\r\n\r\n  // 格式化懒加载节点\r\n  const normalizedLazyNode = computed(() => {\r\n    const rowKey = watcherData.rowKey.value;\r\n\r\n    const keys = Object.keys(lazyTreeNodeMap.value);\r\n\r\n    const res = {};\r\n\r\n    // 没有数据\r\n    if (!keys.length) {\r\n      return res;\r\n    }\r\n\r\n    keys.forEach((key) => {\r\n      // 有懒加载节点\r\n      if (lazyTreeNodeMap.value[key].length) {\r\n        const item = {\r\n          children: [] as string[],\r\n        };\r\n\r\n        lazyTreeNodeMap.value[key].forEach((row) => {\r\n          // 获取rowKey对应的数据\r\n          const currentRowKey: string = getRowIdentity(row, rowKey);\r\n\r\n          item.children.push(currentRowKey);\r\n\r\n          // 是否嵌套的懒加载节点\r\n          if (row[lazyColumnIdentifier.value] && !res[currentRowKey]) {\r\n            res[currentRowKey] = {\r\n              children: [],\r\n            };\r\n          }\r\n        });\r\n\r\n        res[key] = item;\r\n      }\r\n    });\r\n\r\n    return res;\r\n  });\r\n\r\n  // methods\r\n\r\n  // 格式化数据\r\n  const normalize = (data) => {\r\n    // 行数据的Key\r\n    const rowKey = watcherData.rowKey.value;\r\n\r\n    const res = {};\r\n\r\n    walkTreeNode(\r\n      data,\r\n      (parent, children, level) => {\r\n        // 获取rowKey对应的数据\r\n        const rowKeyData = getRowIdentity(parent, rowKey);\r\n\r\n        // 数组\r\n        if (Array.isArray(children)) {\r\n          res[rowKeyData] = {\r\n            // 获取rowKey对应的数据\r\n            children: children.map((row) => getRowIdentity(row, rowKey)),\r\n            // 层级\r\n            level,\r\n          };\r\n        }\r\n        // 懒加载节点\r\n        else {\r\n          // 当 children 不存在且 lazy 为 true，该节点即为懒加载的节点\r\n          res[rowKeyData] = {\r\n            children: [],\r\n            lazy: true,\r\n            level,\r\n          };\r\n        }\r\n      },\r\n      // 子节点\r\n      childrenColumnName.value,\r\n      // 懒加载子节点数据\r\n      lazyColumnIdentifier.value\r\n    );\r\n\r\n    return res;\r\n  };\r\n\r\n  // 树形数据与懒加载\r\n  const loadOrToggle = (row) => {\r\n    // 检查 rowKey 是否存在\r\n    vm.store.assertRowKey();\r\n\r\n    // 获取当前行key\r\n    const rowKey = watcherData.rowKey.value;\r\n\r\n    // 获取rowKey对应的数据\r\n    const id = getRowIdentity(row, rowKey);\r\n\r\n    const data = treeData.value[id];\r\n\r\n    // 懒加载 | 没有加载完成\r\n    if (lazy.value && data && 'loaded' in data && !data.loaded) {\r\n      loadData(row, id, data);\r\n    }\r\n    // 子节点\r\n    else {\r\n      toggleTreeExpansion(row, undefined);\r\n    }\r\n  };\r\n\r\n  // 懒加载数据\r\n  const loadData = (row: any, key: string, treeNode) => {\r\n    const { load } = vm.props as unknown as TableProps;\r\n\r\n    // 加载子节点数据的函数 && 没加载完成\r\n    if (load && !treeData.value[key].loaded) {\r\n      // 加载中\r\n      treeData.value[key].loading = true;\r\n\r\n      // 当前行数据 ｜ 节点数据\r\n      load(row, treeNode, (data) => {\r\n        // 不是数组\r\n        if (!Array.isArray(data)) {\r\n          throw new TypeError('[Table] data must be an array');\r\n        }\r\n\r\n        // 取消loading\r\n        treeData.value[key].loading = false;\r\n        // 加载完成\r\n        treeData.value[key].loaded = true;\r\n        // 展开数据\r\n        treeData.value[key].expanded = true;\r\n\r\n        // 有数据\r\n        if (data.length) {\r\n          lazyTreeNodeMap.value[key] = data;\r\n        }\r\n\r\n        vm.emit('on-expand-change', row, true);\r\n      });\r\n    }\r\n  };\r\n\r\n  // 更新树数据\r\n  const updateTreeData = (\r\n    ifChangeExpandRowKeys = false,\r\n    ifExpandAll = vm.store?.states.defaultExpandAll.value\r\n  ) => {\r\n    // 格式化后的数据\r\n    const nested = normalizedData.value;\r\n\r\n    // 懒加载节点\r\n    const normalizedLazyNode_ = normalizedLazyNode.value;\r\n\r\n    // 格式化数据值\r\n    const keys = Object.keys(nested);\r\n\r\n    // 树节点数据\r\n    const newTreeData = {};\r\n\r\n    // 格式化数据值\r\n    if (keys.length) {\r\n      const oldTreeData = unref(treeData);\r\n\r\n      const rootLazyRowKeys: string[] = [];\r\n\r\n      // 是否展开行\r\n      const getExpanded = (oldValue, key) => {\r\n        // 展开行键是否改变了\r\n        if (ifChangeExpandRowKeys) {\r\n          // 可以通过该属性设置 Table 目前的展开行\r\n          if (expandRowKeys.value) {\r\n            // 展开全部 || 找到对应值\r\n            return ifExpandAll || expandRowKeys.value.includes(key);\r\n          }\r\n          // 是否展开全部\r\n          else {\r\n            return !!(ifExpandAll || oldValue?.expanded);\r\n          }\r\n        }\r\n        // 没有改变展开\r\n        else {\r\n          // 展开全部 || 可以通过该属性设置 Table 目前的展开行\r\n          const included =\r\n            ifExpandAll ||\r\n            (expandRowKeys.value && expandRowKeys.value.includes(key));\r\n\r\n          return !!(oldValue?.expanded || included);\r\n        }\r\n      };\r\n\r\n      // 合并 expanded 与 display，确保数据刷新后，状态不变\r\n      // [3]:{\r\n      //   children: [31, 32]\r\n      //   level: 0\r\n      // }\r\n      // 父节点值 [3]\r\n      keys.forEach((key: string) => {\r\n        // 上一个子节点的值\r\n        const oldValue = oldTreeData[key];\r\n        // 最新子节点的值\r\n        //   children: [31, 32]\r\n        //   level: 0\r\n        const newValue = { ...nested[key] };\r\n\r\n        // 当前子节点是否展开行\r\n        newValue.expanded = getExpanded(oldValue, key);\r\n\r\n        // 是否懒加载子节点数据\r\n        if (newValue.lazy) {\r\n          const { loaded = false, loading = false } = oldValue || {};\r\n\r\n          // 已加载\r\n          newValue.loaded = !!loaded;\r\n          // 加载中\r\n          newValue.loading = !!loading;\r\n\r\n          rootLazyRowKeys.push(key);\r\n        }\r\n\r\n        // 树节点数据\r\n        // children: ['31', '32']\r\n        // expanded: true\r\n        // level: 0\r\n        newTreeData[key] = newValue;\r\n      });\r\n\r\n      // 根据懒加载数据更新 treeData\r\n      const lazyKeys = Object.keys(normalizedLazyNode_);\r\n\r\n      // 是否有懒加载后的数据\r\n      if (lazy.value && lazyKeys.length && rootLazyRowKeys.length) {\r\n        lazyKeys.forEach((key) => {\r\n          // 上一个子节点的值\r\n          const oldValue = oldTreeData[key];\r\n\r\n          // 懒加载后的数据\r\n          const lazyNodeChildren = normalizedLazyNode_[key].children;\r\n\r\n          // 是否是当前节点\r\n          if (rootLazyRowKeys.includes(key)) {\r\n            // 懒加载的 root 节点，更新一下原有的数据，原来的 children 一定是空数组\r\n            if (newTreeData[key].children.length !== 0) {\r\n              throwError('ivue-table', 'children must be an empty array');\r\n            }\r\n\r\n            // 更新当前懒加载节点数据\r\n            newTreeData[key].children = lazyNodeChildren;\r\n          }\r\n          // 其他节点数据\r\n          else {\r\n            const { loaded = false, loading = false } = oldValue || {};\r\n\r\n            // 修改节点状态\r\n            newTreeData[key] = {\r\n              lazy: true,\r\n              loaded: !!loaded,\r\n              loading: !!loading,\r\n              expanded: getExpanded(oldValue, key),\r\n              children: lazyNodeChildren,\r\n              level: '',\r\n            };\r\n          }\r\n        });\r\n      }\r\n    }\r\n\r\n    // 树数据\r\n    treeData.value = newTreeData;\r\n\r\n    // 更新y轴滚动高度\r\n    vm.store?.updateTableScrollY();\r\n  };\r\n\r\n  // 切换树节点展开\r\n  const toggleTreeExpansion = (row, expanded?: boolean) => {\r\n    // 检查 rowKey 是否存在\r\n    vm.store.assertRowKey();\r\n\r\n    // 获取当前行key\r\n    const rowKey = watcherData.rowKey.value;\r\n\r\n    // 获取rowKey对应的数据\r\n    const id = getRowIdentity(row, rowKey);\r\n\r\n    // 子节点的数据\r\n    const data = id && treeData.value[id];\r\n\r\n    // 有展开\r\n    if (id && data && 'expanded' in data) {\r\n      const oldExpanded = data.expanded;\r\n\r\n      // 重新赋值\r\n      expanded = typeof expanded === 'undefined' ? !data.expanded : expanded;\r\n\r\n      // 切换展开\r\n      treeData.value[id].expanded = expanded;\r\n\r\n      // 展开有改变\r\n      if (oldExpanded !== expanded) {\r\n        vm.emit('on-expand-change', row, expanded);\r\n      }\r\n\r\n      // 更新y轴滚动高度\r\n      vm.store.updateTableScrollY();\r\n    }\r\n  };\r\n\r\n  // 更新树节点展开\r\n  const updateTreeExpandKeys = (value: string[]) => {\r\n    expandRowKeys.value = value;\r\n\r\n    updateTreeData();\r\n  };\r\n\r\n  // watch\r\n\r\n  // 监听格式化后的数据\r\n  watch(\r\n    () => normalizedData.value,\r\n    () => {\r\n      updateTreeData();\r\n    }\r\n  );\r\n\r\n  // 监听以通过该属性设置 Table 目前的展开行\r\n  watch(\r\n    () => expandRowKeys.value,\r\n    () => {\r\n      updateTreeData(true);\r\n    }\r\n  );\r\n\r\n  // 监听格式化懒加载节点\r\n  watch(\r\n    () => normalizedLazyNode.value,\r\n    () => {\r\n      updateTreeData();\r\n    }\r\n  );\r\n\r\n  return {\r\n    loadOrToggle,\r\n    updateTreeData,\r\n    updateTreeExpandKeys,\r\n    toggleTreeExpansion,\r\n    states: {\r\n      indent,\r\n      lazy,\r\n      treeData,\r\n      lazyColumnIdentifier,\r\n      childrenColumnName,\r\n      lazyTreeNodeMap,\r\n    },\r\n  };\r\n}\r\n\r\nexport default useTree;\r\n"],"names":["_a"],"mappings":"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"}