UNPKG

tdesign-vue-next

Version:
1 lines 77.8 kB
{"version":3,"file":"dep-5803e9fd.mjs","sources":["../../../common/js/table/tree-store.ts","../../../components/table/hooks/useTreeDataExpand.ts"],"sourcesContent":["import { isUndefined, get, set } from 'lodash-es';\n/* eslint-disable class-methods-use-this */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-use-before-define */\nimport { isRowSelectedDisabled } from './utils';\nimport { PrimaryTableCol, TableRowState, TableRowValue, TableRowData } from './types';\nimport log from '../log';\n\nexport type TableTreeDataMap = Map<string | number, TableRowState>;\n\nexport interface TableRowModel<T> extends TableRowState<T> {\n setData?: (key: string | number, data: T) => void;\n}\n\nexport interface KeysType {\n rowKey: string;\n childrenKey: string;\n}\n\nexport interface SwapParams<T> {\n current: T;\n target: T;\n currentIndex: number;\n targetIndex: number;\n}\n\nexport const TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL = {\n code: 1001,\n reason: 'The same level of rows can not be swapped.',\n};\n\n/**\n * 获取行唯一标识\n * @param row 行数据\n * @param colKey 列字段\n * @param rowIndex 行下标\n * @param level 层级\n */\nexport function getUniqueRowValue(row: TableRowData, colKey: string, rowIndex: number = 0, level: number = 0) {\n const rowValue = get(row, colKey);\n return rowIndex || level ? `${rowValue}_${rowIndex || 0}_${level || 0}}` : rowValue;\n}\n\n/**\n * 表格树形结构处理器\n * Vue 和 React 可以通用\n * 关键函数有以下几个\n * @toggleExpandData 处理树形结构展开收起\n * @setData 更新当行数据\n * @getData 获取单行数据\n * @remove 移除行数据,及其子节点\n * @appendTo 追加子节点到末尾\n */\nclass TableTreeStore<T extends TableRowData = TableRowData> {\n /** 树形结构 Map 存储 */\n treeDataMap: TableTreeDataMap = new Map();\n\n expandAllRowIndex: 0;\n\n constructor() {\n this.treeDataMap = new Map();\n }\n\n /**\n * 初始化 treeDataMap,不会改变 dataSource\n * @param dataSource 树形数据源\n * @param columns 列配置\n * @param keys 字段别名\n */\n initialTreeStore(dataSource: T[], columns: PrimaryTableCol[], keys: KeysType) {\n this.treeDataMap?.clear();\n this.initialTreeDataMap(this.treeDataMap, dataSource, columns.find((col) => col.colKey === 'row-select'), keys);\n }\n\n /**\n * 获取所有节点的唯一标识\n */\n getAllUniqueKeys(data: T[], keys: KeysType, arr: T[] = []) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n arr.push(getUniqueRowValue(item, keys.rowKey));\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.getAllUniqueKeys(children, keys, arr);\n }\n }\n return arr;\n }\n\n getExpandedChildrenKeys(data: T[], keys: KeysType, arr: (string | number)[] = []) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n const rowValue = getUniqueRowValue(item, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n if (rowState.expanded) {\n arr.push(rowValue);\n }\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.getExpandedChildrenKeys(children, keys, arr);\n }\n }\n return arr;\n }\n\n expandTreeNode(rowList: (string | number)[], dataSource: T[], keys: KeysType) {\n if (!rowList.length) return dataSource;\n rowList.forEach((rowValue) => {\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState) return;\n this.toggleExpandData({ row: rowState.row as T, rowIndex: rowState.rowIndex }, dataSource, keys, 'expand');\n });\n return dataSource;\n }\n\n foldTreeNode(rowList: (string | number)[], dataSource: T[], keys: KeysType) {\n if (!rowList.length) return dataSource;\n rowList.forEach((rowValue) => {\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState) return;\n this.toggleExpandData({ row: rowState.row as T, rowIndex: rowState.rowIndex }, dataSource, keys, 'fold');\n });\n return dataSource;\n }\n\n toggleExpandData(p: { rowIndex: number; row: T }, dataSource: T[], keys: KeysType, type?: 'expand' | 'fold') {\n if (!p) {\n log.error('EnhancedTable', 'the node toggleExpanded doest not exist in `data`');\n return dataSource;\n }\n const rowValue = get(p.row, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return [];\n }\n const childrenNodes = get(p.row, keys.childrenKey);\n // childrenNodes = true,表示懒加载,直接返回,暂时不做展开处理\n if (childrenNodes === true) return dataSource;\n const r = this.treeDataMap.get(rowValue);\n if (type === 'expand' && r.expanded) return dataSource;\n if (type === 'fold' && !r.expanded) return dataSource;\n r.rowIndex = r.rowIndex ?? p.rowIndex;\n r.expanded = !r.expanded;\n this.treeDataMap.set(rowValue, r);\n return this.updateExpandRow(r, dataSource, keys);\n }\n\n updateExpandRow(changeRow: TableRowState, dataSource: T[], keys: KeysType): T[] {\n const { row, rowIndex, expanded } = changeRow;\n const { treeDataMap } = this;\n const childrenNodes = get(row, keys.childrenKey);\n if (!row || !childrenNodes) return dataSource;\n if (expanded) {\n updateChildrenRowState(treeDataMap, changeRow, expanded, keys);\n updateRowExpandLength(treeDataMap, row, childrenNodes.length, 'expand', keys);\n // eslint-disable-next-line\n dataSource.splice.apply(dataSource, [rowIndex + 1, 0].concat(childrenNodes));\n } else {\n updateChildrenRowState<T>(treeDataMap, changeRow, expanded, keys);\n const len = changeRow.expandChildrenLength || childrenNodes.length;\n updateRowExpandLength(treeDataMap, row, -1 * len, 'fold', keys);\n dataSource.splice(rowIndex + 1, len);\n }\n // 展开或收起后,会影响后续节点的 rowIndex,需同步更新\n updateRowIndex(treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: rowIndex + 1,\n });\n return dataSource;\n }\n\n /**\n * 获取当前行全部数据\n * @param key 行唯一标识\n * @returns {TableRowState} 当前行数据\n */\n getData(key: TableRowValue): TableRowState {\n return this.treeDataMap.get(key);\n }\n\n /**\n * 更新当前行数据,并返回当前行下标\n * @param rowValue 当前行唯一标识值\n * @param newRowData 新行数据\n * @returns {number} rowIndex 设置的行下标\n */\n updateData(rowValue: TableRowValue, newRowData: T, dataSource: T[], keys: KeysType): number {\n const newRowValue = getUniqueRowValue(newRowData, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n // Map 没有查询到,或者查询到的 rowIndex 值为 -1,均表示当前数据不在 dataSource 列表中,未显示在页面中\n if (!rowState || rowState.rowIndex === -1) {\n updateRowData(dataSource, rowValue, newRowData, {\n rowKey: keys.rowKey,\n childrenKey: keys.childrenKey,\n });\n return -1;\n }\n\n // 懒加载处理:children 为 true,则需清空子元素在 map 中的值,而后方便重新加载\n if (get(newRowData, keys.childrenKey) === true) {\n const oldChildren = get(rowState.row, keys.childrenKey);\n if (oldChildren?.length) {\n for (let i = 0, len = oldChildren.length; i < len; i++) {\n const rowValue = getUniqueRowValue(oldChildren[i], keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n if (state) {\n this.treeDataMap.delete(rowValue);\n }\n }\n }\n }\n\n const currentRowIndex = rowState.rowIndex;\n rowState.row = newRowData;\n rowState.id = newRowValue;\n\n // 更新父元素中存储的当前元素值\n if (rowState.parent) {\n // 更新直接子元素数组\n const siblings = get(rowState.parent.row, keys.childrenKey);\n const index = siblings.findIndex((item: T) => getUniqueRowValue(item, keys.rowKey) === rowValue);\n siblings[index] = newRowData;\n }\n\n this.treeDataMap.set(newRowValue, rowState);\n // rowValue 也发生了变化,需移除 旧 rowValue 数据\n if (rowValue !== newRowValue) {\n this.treeDataMap.delete(rowValue);\n }\n return currentRowIndex;\n }\n\n /**\n * 移除指定节点\n * @param key 行唯一标识\n */\n remove(key: TableRowValue, dataSource: T[], keys: KeysType): T[] {\n const r = this.treeDataMap.get(key);\n if (r && r.rowIndex >= 0) {\n // 移除当前节点时,展开的节点的子节点需同步移除\n const removeNumber = (r.expandChildrenLength || 0) + 1;\n dataSource.splice(r.rowIndex, removeNumber);\n\n if (r.parent) {\n const siblings = get(r.parent.row, keys.childrenKey);\n const index = siblings.findIndex((item: TableRowData) => get(item, keys.rowKey) === key);\n siblings.splice(index, 1);\n updateRowExpandLength(this.treeDataMap, r.parent.row, -1 * removeNumber, 'delete', keys);\n }\n\n this.treeDataMap.delete(key);\n\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: r.rowIndex,\n rowKey: keys.rowKey,\n type: 'remove',\n });\n } else {\n log.warn('EnhancedTable', 'Can not remove this node, which is not appeared.');\n }\n return dataSource;\n }\n\n /**\n * 清除子节点\n * @param key\n * @param dataSource\n * @param keys\n */\n removeChildren(key: TableRowValue, dataSource: T[], keys: KeysType): T[] {\n const r = this.treeDataMap.get(key);\n if (r && r.rowIndex >= 0) {\n const removeNumber = r.expandChildrenLength || 0;\n if (removeNumber) {\n dataSource.splice(r.rowIndex + 1, removeNumber);\n }\n if (r.parent) {\n updateRowExpandLength(this.treeDataMap, r.parent.row, -1 * removeNumber, 'delete', keys);\n }\n r.expandChildrenLength = 0;\n r.expanded = false;\n set(r.row, keys.childrenKey, undefined);\n this.treeDataMap.set(key, r);\n // 更新 rowIndex 之后的下标\n if (removeNumber) {\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: r.rowIndex + 1,\n rowKey: keys.rowKey,\n type: 'remove',\n });\n }\n } else {\n log.warn('EnhancedTable', 'Can not remove this node\\'s children, which is not appeared.');\n }\n return dataSource;\n }\n\n /**\n * 为当前节点添加子节点,默认添加到最后一个节点。允许添加单个或多个\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n appendTo(rowValue: string | number, newData: T | T[], dataSource: T[], keys: KeysType): T[] {\n const state = this.treeDataMap.get(rowValue);\n if (!this.validateDataExist(state, rowValue)) return dataSource;\n const children: T[] = get(state.row, keys.childrenKey);\n // 子节点不存在,则表示为叶子节点\n const isShowNewNode = state.expanded || !children?.length;\n // 添加多个子节点时,需去除重复子节点\n const tmpData = newData instanceof Array ? newData : [newData];\n const newChildrenData: T[] = [];\n const newChildrenStates: TableRowState[] = [];\n let firstNewChildrenIndex = -1;\n for (let i = 0, len = tmpData.length; i < len; i++) {\n const oneData = tmpData[i];\n const newRowValue = getUniqueRowValue(oneData, keys.rowKey);\n const mapState = this.treeDataMap.get(newRowValue);\n if (!this.validateDataDoubleExist(mapState, newRowValue)) {\n log.warn('Table', `Duplicated Data \\`${newRowValue}\\` has been removed.`);\n } else {\n const rowIndex = isShowNewNode ? state.rowIndex + (state.expandChildrenLength || 0) + (i + 1) : -1;\n if (i === 0) {\n firstNewChildrenIndex = rowIndex;\n }\n const newState = {\n id: newRowValue,\n row: oneData,\n rowIndex,\n level: state.level + 1,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n path: [...state.path],\n parent: state,\n };\n newState.path = newState.path.concat(newState);\n newChildrenData.push(oneData);\n newChildrenStates.push(newState);\n this.treeDataMap.set(newRowValue, newState);\n }\n }\n if (!newChildrenData.length) return dataSource;\n\n if (children?.length) {\n state.row[keys.childrenKey] = state.row[keys.childrenKey].concat(newChildrenData);\n } else {\n state.row[keys.childrenKey] = newChildrenData;\n state.expanded = true;\n }\n\n // 如果当前节点为展开状态,则需要继续处理\n if (isShowNewNode) {\n dataSource.splice(firstNewChildrenIndex, 0, ...newChildrenData);\n // 更新父元素及祖先元素展开子节点的数量\n const newChildrenCount = newChildrenData.length || 1;\n updateRowExpandLength(this.treeDataMap, state.row, newChildrenCount, 'insert', {\n rowKey: keys.rowKey,\n childrenKey: keys.childrenKey,\n });\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: firstNewChildrenIndex + newChildrenData.length - 1,\n rowKey: keys.rowKey,\n type: 'add',\n count: 1,\n });\n }\n\n return dataSource;\n }\n\n appendToRoot(newData: T | T[], dataSource: T[], keys: KeysType) {\n const newDataSource = dataSource.concat(newData);\n const tmpNewData = newData instanceof Array ? newData : [newData];\n const dataSourceLen = dataSource.length;\n for (let i = 0, len = tmpNewData.length; i < len; i++) {\n const rowValue = get(tmpNewData[i], keys.rowKey);\n if (!rowValue) {\n log.error('Table', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n continue;\n }\n const state: TableRowState = {\n id: rowValue,\n row: tmpNewData[i],\n rowIndex: dataSourceLen + i,\n level: 0,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n };\n state.path = [state];\n this.treeDataMap.set(rowValue, state);\n }\n return newDataSource;\n }\n\n /**\n * 在当前节点后,插入一个兄弟节点\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n insertAfter(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType): T[] {\n return this.insert(rowValue, newData, dataSource, keys, 'after');\n }\n\n /**\n * 在当前节点前,插入一个兄弟节点\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n insertBefore(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType): T[] {\n return this.insert(rowValue, newData, dataSource, keys, 'before');\n }\n\n insert(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType, type: 'before' | 'after') {\n const state = this.treeDataMap.get(rowValue);\n if (!this.validateDataExist(state, rowValue)) return dataSource;\n const newRowValue = get(newData, keys.rowKey);\n const mapState = this.treeDataMap.get(newRowValue);\n if (!this.validateDataDoubleExist(mapState, newRowValue)) return dataSource;\n const rowIndex = type === 'after' ? state.rowIndex + 1 : state.rowIndex;\n const newState = {\n id: newRowValue,\n row: newData,\n rowIndex,\n level: state.level,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n path: state.path.slice(0, -1),\n parent: state.parent,\n };\n newState.path = newState.path.concat(newState);\n const dataIndex = type === 'after' ? state.rowIndex + (state.expandChildrenLength + 1) : state.rowIndex;\n dataSource.splice(dataIndex, 0, newData);\n const distance = type === 'after' ? 1 : 0;\n if (state.parent) {\n const childrenIndex = state.parent.row[keys.childrenKey].findIndex(\n (t: TableRowData) => rowValue === get(t, keys.rowKey),\n );\n state.parent.row[keys.childrenKey].splice(childrenIndex + distance, 0, newData);\n updateRowExpandLength(this.treeDataMap, state.parent.row, 1, 'insert', keys);\n }\n this.treeDataMap.set(newRowValue, newState);\n\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: state.rowIndex + 1,\n type: 'add',\n });\n\n return dataSource;\n }\n\n /**\n * 交换数据行\n * @returns 交换失败返回 false\n */\n swapData(\n dataSource: T[],\n params: SwapParams<T>,\n keys: KeysType,\n ): { dataSource: T[]; result: boolean; code?: number; reason?: string } {\n const startIndex = params.currentIndex;\n const endIndex = params.targetIndex;\n if (startIndex === endIndex) return { dataSource, result: true };\n const startRowValue = get(params.current, keys.rowKey);\n const endRowValue = get(params.target, keys.rowKey);\n const startState = this.treeDataMap.get(startRowValue);\n const endState = this.treeDataMap.get(endRowValue);\n if (startState.level !== endState.level) {\n return {\n dataSource,\n result: false,\n code: TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL.code,\n reason: TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL.reason,\n };\n }\n const startLastIndex = startIndex + startState.expandChildrenLength + 1;\n const endLastIndex = endIndex + endState.expandChildrenLength + 1;\n const startRowList = dataSource.slice(startIndex, startLastIndex);\n const endRowList = dataSource.slice(endIndex, endLastIndex);\n if (startIndex > endIndex) {\n const middleRowList = dataSource.slice(endLastIndex, startIndex);\n const allSwapList = startRowList.concat(endRowList, middleRowList);\n dataSource.splice(endIndex, allSwapList.length);\n dataSource.splice(endIndex, 0, ...allSwapList);\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: endIndex,\n maxRowIndex: startLastIndex,\n });\n } else {\n const middleRowList = dataSource.slice(startLastIndex, endIndex);\n const allSwapList = middleRowList.concat(endRowList, startRowList);\n dataSource.splice(startIndex, allSwapList.length);\n dataSource.splice(startIndex, 0, ...allSwapList);\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: startIndex,\n maxRowIndex: endLastIndex,\n });\n }\n\n // 交换父元素中的两个元素位置\n if (startState.parent) {\n const children = startState.parent.row[keys.childrenKey];\n let count = 0;\n let targetIndex = -1;\n let currentIndex = -1;\n for (let i = 0, len = children.length; i < len; i++) {\n if (get(children[i], keys.rowKey) === startRowValue) {\n currentIndex = i;\n count += 1;\n }\n if (get(children[i], keys.rowKey) === endRowValue) {\n targetIndex = i;\n count += 1;\n }\n if (count >= 2) break;\n }\n // 向后拖拽\n if (currentIndex < targetIndex) {\n children.splice(targetIndex + 1, 0, params.current);\n children.splice(currentIndex, 1);\n } else {\n // 向前拖拽\n children.splice(currentIndex, 1);\n children.splice(targetIndex, 0, params.current);\n }\n }\n\n return { dataSource, result: true };\n }\n\n /**\n * 展开所有节点\n */\n expandAll(dataSource: T[], keys: KeysType) {\n this.expandAllRowIndex = 0;\n const newData: T[] = [];\n const expandLoop = (\n dataSource: T[],\n keys: KeysType,\n parent: TableRowState = null,\n ) => {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n const children = get(item, keys.childrenKey);\n state.rowIndex = this.expandAllRowIndex;\n // children = true is async load\n if (children !== true && children?.length) {\n state.expanded = true;\n }\n state.expandChildrenLength = children?.length || 0;\n this.expandAllRowIndex += 1;\n newData.push(item);\n this.treeDataMap.set(rowValue, state);\n if (children?.length) {\n // 同步更新父元素的展开数量\n let tmpParent = parent;\n while (tmpParent?.row) {\n tmpParent.expandChildrenLength += children.length;\n this.treeDataMap.set(tmpParent.id, tmpParent);\n tmpParent = tmpParent.parent;\n }\n // 继续子元素\n expandLoop(children, keys, state);\n }\n }\n };\n expandLoop(dataSource, keys);\n return newData;\n }\n\n /**\n * 收起所有节点\n */\n foldAll(dataSource: T[], keys: KeysType) {\n const newData: T[] = [];\n let index = 0;\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n state.rowIndex = state.level === 0 ? index : -1;\n state.expanded = false;\n state.expandChildrenLength = 0;\n if (state.level === 0) {\n newData.push(item);\n index += 1;\n }\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.foldAll(children, keys);\n }\n }\n return newData;\n }\n\n /** 获取整个树形结构 */\n getTreeNode(dataSource: T[], keys: KeysType): T[] {\n // let isStarted = false;\n const treeData: T[] = [];\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n // 只需要压入第一层数据\n if (state.level === 0) {\n treeData.push(item);\n }\n }\n return treeData;\n }\n\n /**\n * 获取展开的树形节点\n * @param dataSource 平铺的树形结构数据\n * @param keys 行唯一标识和子节点的字段名\n * @param type 'unique' 标识获取展开节点的行唯一标识值,'data' 表示获取展开节点的数据,'all' 表示获取行节点包含展开状态的全部数据\n * @returns 展开的树形节点\n */\n getTreeExpandedRow(dataSource: T[], keys: KeysType, type: 'unique' | 'data' | 'all' = 'data') {\n const arr: (T | any)[] = [];\n dataSource.forEach((item) => {\n const rowValue = get(item, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState.expanded) return;\n if (type === 'unique') {\n arr.push(rowValue);\n } else if (type === 'data') {\n arr.push(item);\n } else {\n arr.push(rowState);\n }\n });\n return arr;\n }\n\n /**\n * 初始化树形结构 Map\n * @param treeDataMap 树形结构 Map\n * @param dataSource 数据源\n * @param column 树形结构列\n * @param keys 字段映射关系\n * @param level 层级\n * @param parent 父元素\n * @returns void\n */\n initialTreeDataMap(\n treeDataMap: TableTreeDataMap,\n dataSource: T[],\n column: PrimaryTableCol,\n keys: KeysType,\n level = 0,\n parent: TableRowState = null,\n ) {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = getUniqueRowValue(item, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return;\n }\n const children = get(item, keys.childrenKey);\n const state: TableRowState = {\n id: rowValue,\n row: item,\n rowIndex: level === 0 ? i : -1,\n level,\n expanded: false,\n expandChildrenLength: 0,\n disabled: isRowSelectedDisabled(column, item, i),\n parent,\n };\n state.path = parent ? parent.path.concat(state) : [state];\n treeDataMap.set(rowValue, state);\n if (children?.length) {\n this.initialTreeDataMap(treeDataMap, children, column, keys, level + 1, state);\n }\n }\n }\n\n // column.checkProps 和 column.disabled 会影响行的禁用状态,因此当列发生变化时,需要重置禁用状态\n updateDisabledState(dataSource: T[], column: PrimaryTableCol, keys: KeysType) {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return;\n }\n const state = this.treeDataMap.get(rowValue);\n state.disabled = isRowSelectedDisabled(column, item, i);\n this.treeDataMap.set(rowValue, state);\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.updateDisabledState(children, column, keys);\n }\n }\n }\n\n /**\n * 校验数据合法性\n */\n validateDataExist(state: TableRowState, rowValue: string | number) {\n if (!state) {\n log.warn('EnhancedTable', `${rowValue} does not exist.`);\n return false;\n }\n return true;\n }\n\n /**\n * 校验数据是否已存在\n */\n validateDataDoubleExist(state: TableRowState, rowValue: string | number) {\n if (state) {\n log.warn('EnhancedTable', `Duplicated Key. ${rowValue} already exists.`);\n return false;\n }\n return true;\n }\n}\n\nexport default TableTreeStore;\n\n/**\n * 更新展开的子节点数量\n * @param rowSate 行数据和状态\n * @param distance 需要调整的展开子节点长度数量,展开时增加,收起时减少。值为负数,表示减\n * @param expanded 展开/收起\n */\nexport function updateRowExpandLength(\n treeDataMap: TableTreeDataMap,\n row: TableRowData,\n distance: number,\n type: 'expand' | 'fold' | 'delete' | 'insert',\n keys: KeysType,\n) {\n let tmp = row;\n while (tmp) {\n const state = treeDataMap.get(get(tmp, keys.rowKey));\n const expandLen = (state.expandChildrenLength || 0) + distance;\n state.expandChildrenLength = Math.max(0, expandLen);\n tmp = state?.parent?.row;\n }\n // 如果是收起状态,子节点需全部收起,清空子节点展开行数量,设置 expandChildrenLength 为 0\n if (type === 'fold') {\n clearRowExpandLength(treeDataMap, row, keys);\n }\n}\n\nexport function clearRowExpandLength<T>(treeDataMap: TableTreeDataMap, row: T, keys: KeysType) {\n const children = get(row, keys.childrenKey);\n if (children?.length) {\n children.forEach((item: T[]) => {\n const state = treeDataMap.get(get(item, keys.rowKey));\n if (!state) return;\n state.expandChildrenLength = 0;\n clearRowExpandLength(treeDataMap, state.row, keys);\n });\n }\n}\n\n/**\n * 更新子节点行状态,行数据、父节点、层级、路径等数据\n * @param rowState 行状态数据\n * @param expanded 展开或收起\n * @param keys\n */\nexport function updateChildrenRowState<T>(\n treeDataMap: TableTreeDataMap,\n rowState: TableRowState,\n expanded: boolean,\n keys: KeysType,\n) {\n const { row, rowIndex } = rowState;\n const childrenNodes = get(row, keys.childrenKey);\n childrenNodes.forEach((item: T, kidRowIndex: number) => {\n const rowValue = get(item, keys.rowKey);\n const index = expanded ? rowIndex + 1 + kidRowIndex : -1;\n const curState = treeDataMap.get(rowValue);\n const newState: TableRowState = {\n ...curState,\n row: item,\n rowIndex: index,\n expanded: false,\n parent: rowState,\n };\n treeDataMap.set(rowValue, newState);\n // 父节点展开,子节点不一定展开;父节点收起,则所有子节点收起\n if (!expanded) {\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n updateChildrenRowState(\n treeDataMap,\n {\n ...newState,\n rowIndex: -1,\n expanded: false,\n } as any,\n expanded,\n keys,\n );\n }\n }\n });\n}\n\nexport function updateRowData<T extends TableRowData = TableRowData>(\n data: T[],\n key: string | number,\n newData: T,\n keys: KeysType,\n) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n if (get(item, keys.rowKey) === key) {\n // eslint-disable-next-line no-param-reassign\n data[i] = newData;\n return;\n }\n const children: T[] = get(item, keys.childrenKey) || [];\n if (children?.length) {\n updateRowData(children, key, newData, keys);\n }\n }\n}\n\nexport function updateRowIndex<T>(\n treeDataMap: TableTreeDataMap,\n dataSource: T[],\n extra: {\n rowKey: string;\n minRowIndex?: number;\n maxRowIndex?: number;\n type?: 'add' | 'remove';\n count?: number;\n },\n) {\n const start = extra.minRowIndex || 0;\n const end = extra.maxRowIndex || dataSource.length;\n for (let rowIndex = start; rowIndex < end; rowIndex++) {\n const item = dataSource[rowIndex];\n const state = treeDataMap.get(get(item, extra.rowKey));\n if (!state) {\n log.warn('Table', 'tree map went wrong');\n }\n state.rowIndex = rowIndex + (extra?.count || 1) - 1;\n }\n}\n\nexport function diffExpandedTreeNode(\n newExpandedNode: (number | string)[] = [],\n oldExpandedNode: (number | string)[] = [],\n) {\n const removedList: (number | string)[] = [];\n const addedList: (number | string)[] = [];\n const newExpandedNodeMap: Map<any, boolean> = new Map();\n const oldExpandedNodeMap: Map<any, boolean> = new Map();\n for (let i = 0, len = newExpandedNode.length; i < len; i++) {\n newExpandedNodeMap.set(newExpandedNode[i], true);\n }\n for (let i = 0, len = oldExpandedNode.length; i < len; i++) {\n oldExpandedNodeMap.set(oldExpandedNode[i], true);\n }\n for (let i = 0, len = newExpandedNode.length; i < len; i++) {\n if (!oldExpandedNodeMap.get(newExpandedNode[i])) {\n addedList.push(newExpandedNode[i]);\n }\n }\n for (let i = 0, len = oldExpandedNode.length; i < len; i++) {\n if (!newExpandedNodeMap.get(oldExpandedNode[i])) {\n removedList.push(oldExpandedNode[i]);\n }\n }\n return {\n removedList,\n addedList,\n };\n}\n\nexport type TreeDataMapType = InstanceType<typeof TableTreeStore>['treeDataMap'];\n","import { ComputedRef, nextTick, ref, Ref, toRefs, watch } from 'vue';\nimport { TdEnhancedTableProps, TableRowData } from '../type';\nimport { useDefaultValue } from '@tdesign/shared-hooks';\nimport TableTreeStore, { diffExpandedTreeNode, getUniqueRowValue } from '@tdesign/common-js/table/tree-store';\nimport { TableTreeExpandType } from '../types';\n\nexport function useTreeDataExpand(\n props: TdEnhancedTableProps,\n params: {\n store: Ref<InstanceType<typeof TableTreeStore>>;\n dataSource: Ref<TdEnhancedTableProps['data']>;\n rowDataKeys: ComputedRef<{ rowKey: string; childrenKey: string }>;\n },\n) {\n const { store, dataSource, rowDataKeys } = params;\n const { data, expandedTreeNodes, tree } = toRefs(props);\n\n const isDefaultExpandAllExecute = ref(false);\n const isDefaultExpandedTreeNodesExecute = ref(false);\n const [tExpandedTreeNode, setTExpandedTreeNode] = useDefaultValue(\n expandedTreeNodes,\n props.defaultExpandedTreeNodes,\n props.onExpandedTreeNodesChange,\n 'expandedTreeNodes',\n );\n\n const changedExpandTreeNode = ref<{\n type?: TableTreeExpandType;\n row?: TableRowData;\n rowIndex?: number;\n }>({ type: 'props-change' });\n\n /**\n * 对外暴露的组件实例方法,展开所有节点\n */\n function expandAll(type: 'expand-all' | 'default-expand-all' = 'expand-all', list?: TableRowData[]) {\n const newData = list || data.value;\n dataSource.value = store.value.expandAll(newData, rowDataKeys.value);\n const expandedNode = dataSource.value.map((t) => getUniqueRowValue(t, rowDataKeys.value.rowKey));\n setTExpandedTreeNode(expandedNode, {\n row: undefined,\n rowState: undefined,\n rowIndex: undefined,\n type: 'expand',\n trigger: type,\n });\n changedExpandTreeNode.value.type = 'expand-all';\n }\n\n /**\n * 对外暴露的组件实例方法,收起所有节点\n */\n function foldAll() {\n dataSource.value = [...store.value.foldAll(dataSource.value, rowDataKeys.value)];\n setTExpandedTreeNode([], {\n row: undefined,\n rowState: undefined,\n rowIndex: undefined,\n type: 'fold',\n trigger: 'fold-all',\n });\n }\n\n function onExpandFoldIconClick(\n p: { row: TableRowData; rowIndex: number },\n trigger?: 'expand-fold-icon' | 'row-click',\n ) {\n const { row, rowIndex } = p;\n changedExpandTreeNode.value = {\n type: 'user-reaction-change',\n ...p,\n };\n const rowValue = getUniqueRowValue(row, rowDataKeys.value.rowKey);\n const rowState = store.value.treeDataMap.get(rowValue);\n let expandedNodes = [...tExpandedTreeNode.value];\n if (rowState.expanded) {\n const expandedChildrenKeys = store.value.getExpandedChildrenKeys([row], rowDataKeys.value);\n for (let i = 0, len = expandedNodes.length; i < len; i++) {\n const nodeValue = expandedNodes[i];\n if (expandedChildrenKeys.includes(nodeValue)) {\n expandedNodes[i] = undefined;\n }\n }\n expandedNodes = expandedNodes.filter(Boolean);\n } else {\n expandedNodes.push(rowValue);\n }\n const params = {\n row,\n rowIndex,\n rowState,\n trigger,\n };\n setTExpandedTreeNode(expandedNodes, {\n ...params,\n type: rowState.expanded ? 'fold' : 'expand',\n });\n props.onTreeExpandChange?.(params);\n }\n\n function updateExpandState(\n data: TableRowData[],\n tExpandedTreeNode: (string | number)[],\n oldExpandedTreeNode: (string | number)[] = [],\n ) {\n const { addedList, removedList } = diffExpandedTreeNode(tExpandedTreeNode, oldExpandedTreeNode);\n store.value.expandTreeNode(addedList, data, rowDataKeys.value);\n store.value.foldTreeNode(removedList, data, rowDataKeys.value);\n return [...data];\n }\n\n watch([tExpandedTreeNode, data], ([tExpandedTreeNode], [oldExpandedTreeNode]) => {\n if (!store.value.treeDataMap.size || !data.value.length) return;\n if (changedExpandTreeNode.value.type === 'user-reaction-change') {\n const { row, rowIndex } = changedExpandTreeNode.value || {};\n dataSource.value = [...store.value.toggleExpandData({ row, rowIndex }, [...dataSource.value], rowDataKeys.value)];\n } else if (changedExpandTreeNode.value.type === 'props-change') {\n updateExpandState(dataSource.value, tExpandedTreeNode, oldExpandedTreeNode);\n }\n changedExpandTreeNode.value.type = 'props-change';\n });\n\n const updateExpandOnDataChange = (data: TableRowData[]) => {\n if (tree.value?.defaultExpandAll && !isDefaultExpandAllExecute.value) {\n expandAll('default-expand-all', [...data]);\n isDefaultExpandAllExecute.value = true;\n } else if (tExpandedTreeNode.value?.length) {\n nextTick(() => {\n dataSource.value = updateExpandState([...data], tExpandedTreeNode.value, []);\n });\n }\n };\n\n return {\n tExpandedTreeNode,\n isDefaultExpandAllExecute,\n isDefaultExpandedTreeNodesExecute,\n expandAll,\n foldAll,\n onExpandFoldIconClick,\n updateExpandOnDataChange,\n };\n}\n\nexport default useTreeDataExpand;\n"],"names":["TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL","code","reason","getUniqueRowValue","row","colKey","rowIndex","arguments","length","undefined","level","rowValue","get","concat","TableTreeStore","_classCallCheck","_defineProperty","Map","treeDataMap","_createClass","key","value","initialTreeStore","dataSource","columns","keys","_this$treeDataMap","clear","initialTreeDataMap","find","col","getAllUniqueKeys","data","arr","i","len","item","push","rowKey","children","childrenKey","getExpandedChildrenKeys","rowState","expanded","expandTreeNode","rowList","_this","forEach","toggleExpandData","foldTreeNode","_this2","p","type","_r$rowIndex","log","error","isUndefined","childrenNodes","r","set","updateExpandRow","changeRow","updateChildrenRowState","updateRowExpandLength","splice","apply","expandChildrenLength","updateRowIndex","minRowIndex","getData","updateData","newRowData","newRowValue","updateRowData","oldChildren","state","currentRowIndex","id","parent","siblings","index","findIndex","remove","removeNumber","warn","removeChildren","appendTo","newData","validateDataExist","isShowNewNode","tmpData","Array","newChildrenData","newChildrenStates","firstNewChildrenIndex","oneData","mapState","validateDataDoubleExist","newState","disabled","path","_toConsumableArray","newChildrenCount","count","appendToRoot","newDataSource","tmpNewData","dataSourceLen","insertAfter","insert","insertBefore","slice","dataIndex","distance","childrenIndex","t","swapData","params","startIndex","currentIndex","endIndex","targetIndex","result","startRowValue","current","endRowValue","target","startState","endState","startLastIndex","endLastIndex","startRowList","endRowList","middleRowList","allSwapList","maxRowIndex","expandAll","_this3","expandAllRowIndex","expandLoop","tmpParent","_tmpParent","foldAll","getTreeNode","treeData","getTreeExpandedRow","_this4","column","isRowSelectedDisabled","updateDisabledState","tmp","_state$parent","expandLen","Math","max","clearRowExpandLength","kidRowIndex","curState","_objectSpread","extra","start","end","diffExpandedTreeNode","newExpandedNode","oldExpandedNode","removedList","addedList","newExpandedNodeMap","oldExpandedNodeMap","useTreeDataExpand","props","store","rowDataKeys","_toRefs","toRefs","expandedTreeNodes","tree","isDefaultExpandAllExecute","ref","isDefaultExpandedTreeNodesExecute","_useDefaultValue","useDefaultValue","defaultExpandedTreeNodes","onExpandedTreeNodesChange","_useDefaultValue2","_slicedToArray","tExpandedTreeNode","setTExpandedTreeNode","changedExpandTreeNode","list","expandedNode","map","trigger","onExpandFoldIconClick","_props$onTreeExpandCh","expandedNodes","expandedChildrenKeys","nodeValue","includes","filter","Boolean","onTreeExpandChange","call","updateExpandState","oldExpandedTreeNode","_diffExpandedTreeNode","watch","_ref","_ref2","_ref3","_ref4","size","_ref5","updateExpandOnDataChange","_tree$value","_tExpandedTreeNode$va","defaultExpandAll","nextTick"],"mappings":"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