Skip to content

Commit 81e1b5d

Browse files
authored
feat(catalogue): change some utils method (#608)
* feat(catalogue): change some utils method re #607 * feat(catalogue): change method name and jsdoc
1 parent 6108294 commit 81e1b5d

File tree

5 files changed

+108
-74
lines changed

5 files changed

+108
-74
lines changed

src/catalogue/demos/async.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect } from 'react';
22
import { Catalogue } from 'dt-react-component';
33
import { useTreeData } from 'dt-react-component/catalogue/useTreeData';
4-
import { insertChildIntoNode } from 'dt-react-component/catalogue/utils';
4+
import { insertChildrenToNode } from 'dt-react-component/catalogue/utils';
55

66
interface DataNode {
77
title: string;
@@ -30,7 +30,7 @@ const App: React.FC = () => {
3030
return;
3131
}
3232
setTimeout(() => {
33-
const newData = insertChildIntoNode(treeData.data, key, [
33+
const newData = insertChildrenToNode(treeData.data, key, [
3434
{ title: 'Child Node', key: `${key}-0` },
3535
{ title: 'Child Node', key: `${key}-1` },
3636
]);

src/catalogue/demos/config.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { cloneDeep } from 'lodash-es';
88
import shortid from 'shortid';
99

1010
import {
11-
appendNodeByKey,
1211
findNodeByKey,
1312
findParentNodeByKey,
13+
insertChildrenToNode,
1414
removeEditNode,
1515
removeNodeByKey,
1616
updateTreeNodeEdit,
@@ -83,7 +83,13 @@ export default () => {
8383

8484
const handleAdd = (key: ITreeNode<IData>['key']) => {
8585
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
86-
const data = appendNodeByKey<IData>(treeData.data, key);
86+
const data = insertChildrenToNode<IData>(treeData.data, key, [
87+
{
88+
key: 'new_',
89+
title: '',
90+
edit: true,
91+
},
92+
]);
8793
if (!newExpandedKeys?.includes(key)) {
8894
newExpandedKeys.push(key);
8995
}

src/catalogue/demos/drag.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { cloneDeep } from 'lodash-es';
88
import shortid from 'shortid';
99

1010
import {
11-
appendNodeByKey,
1211
findNodeByKey,
1312
findParentNodeByKey,
13+
insertChildrenToNode,
1414
removeEditNode,
1515
removeNodeByKey,
1616
updateTreeNodeEdit,
@@ -77,7 +77,9 @@ export default () => {
7777

7878
const handleAdd = (key: ITreeNode<IData>['key']) => {
7979
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
80-
const data = appendNodeByKey<IData>(treeData.data, key);
80+
const data = insertChildrenToNode<IData>(treeData.data, key, [
81+
{ key: 'new_', title: '', edit: true },
82+
]);
8183
if (!newExpandedKeys?.includes(key)) {
8284
newExpandedKeys.push(key);
8385
}

src/catalogue/demos/operator.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { cloneDeep } from 'lodash-es';
77
import shortid from 'shortid';
88

99
import {
10-
appendNodeByKey,
1110
findNodeByKey,
1211
findParentNodeByKey,
12+
insertChildrenToNode,
1313
removeEditNode,
1414
removeNodeByKey,
1515
updateTreeNodeEdit,
@@ -130,7 +130,9 @@ export default () => {
130130

131131
const handleAdd = (key: ITreeNode<IData>['key']) => {
132132
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
133-
const data = appendNodeByKey<IData>(treeData.data, key);
133+
const data = insertChildrenToNode<IData>(treeData.data, key, [
134+
{ key: 'new_', title: '', edit: true },
135+
]);
134136
if (!newExpandedKeys?.includes(key)) {
135137
newExpandedKeys.push(key);
136138
}

src/catalogue/utils.tsx

Lines changed: 90 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
22
import { FolderFilled, FolderOpenedFilled } from '@dtinsight/react-icons';
33

4-
import { CatalogueProps } from './components/catalogue';
54
import { ITreeNode } from './useTreeData';
65

76
export const getIcon: ITreeNode['icon'] = ({ selected, expanded }) => {
@@ -15,12 +14,10 @@ export const getIcon: ITreeNode['icon'] = ({ selected, expanded }) => {
1514
};
1615

1716
/**
18-
* @description 轮询 Tree 数据,赋值搜索标识和leafIcon
17+
* @description 轮询 data 数据,赋值搜索标识和leafIcon
1918
*/
20-
export const loopTree = <T extends Record<string, any>>(
21-
data: CatalogueProps<T>['treeData']
22-
): CatalogueProps<T>['treeData'] => {
23-
return data?.map((item) => {
19+
export const loopTree = <T extends Record<string, any>>(data: ITreeNode<T>[]): ITreeNode<T>[] =>
20+
data?.map((item) => {
2421
if (item.children) {
2522
return {
2623
icon: getIcon,
@@ -34,13 +31,12 @@ export const loopTree = <T extends Record<string, any>>(
3431
children: undefined,
3532
};
3633
});
37-
};
3834

3935
/**
40-
* 查找 key 对应的节点
41-
* @param data 遍历的数组
42-
* @param key 当前 key 值
43-
* @returns 找到的对应节点
36+
* @description 查找 key 对应的节点
37+
* @param {ITreeNode<U>[]} data - 遍历的数组
38+
* @param {ITreeNode<U>['key']} key - 当前 key 值
39+
* @returns {ITreeNode<U> | null}找到的对应节点
4440
*/
4541
export const findNodeByKey = <U,>(
4642
data: ITreeNode<U>[],
@@ -59,16 +55,16 @@ export const findNodeByKey = <U,>(
5955
};
6056

6157
/**
62-
* 更新 key 对应节点为编辑状态
63-
* @param data 遍历的数组
64-
* @param key 当前 key 值
65-
* @returns 更新之后 data
58+
* @description 更新 key 对应节点为编辑状态
59+
* @param {ITreeNode<U>[]} data - 遍历的数组
60+
* @param {ITreeNode<U>['key']} key - 当前 key 值
61+
* @returns {ITreeNode<U>[]} 更新之后 data
6662
*/
6763
export const updateTreeNodeEdit = <U,>(
6864
data: ITreeNode<U>[],
6965
key: ITreeNode<U>['key']
70-
): ITreeNode<U>[] => {
71-
return data.map((node) => {
66+
): ITreeNode<U>[] =>
67+
data.map((node) => {
7268
if (node.key === key) {
7369
return { ...node, edit: true };
7470
}
@@ -77,13 +73,12 @@ export const updateTreeNodeEdit = <U,>(
7773
}
7874
return node;
7975
});
80-
};
8176

8277
/**
83-
* 查找 key 对应的父级节点
84-
* @param data 遍历的数组
85-
* @param key 当前 key 值
86-
* @returns 当前找到父级节点
78+
* @description 查找 key 对应的父级节点
79+
* @param {ITreeNode<U>[]} data - 遍历的数组
80+
* @param {ITreeNode<U>['key']} key - 当前 key 值
81+
* @returns {ITreeNode<U> | null}当前找到父级节点
8782
*/
8883
export const findParentNodeByKey = <U extends { edit?: boolean }>(
8984
data: ITreeNode<U>[],
@@ -103,39 +98,16 @@ export const findParentNodeByKey = <U extends { edit?: boolean }>(
10398
};
10499

105100
/**
106-
* 在 key 节点中添加子节点
107-
* @param data 遍历的数组
108-
* @param key 当前 key 值
109-
* @returns 插入新数据之后的 data
110-
*/
111-
export const appendNodeByKey = <U extends { edit?: boolean }>(
112-
data: ITreeNode<U>[],
113-
key: ITreeNode<U>['key']
114-
): ITreeNode<U>[] => {
115-
const newNode = { key: 'new_', title: '', edit: true };
116-
return data.map((node) => {
117-
if (node.key === key) {
118-
const updatedChildren = node.children ? [...node.children, newNode] : [newNode];
119-
return { ...node, children: updatedChildren };
120-
}
121-
if (node.children) {
122-
return { ...node, children: appendNodeByKey(node.children, key) };
123-
}
124-
return node;
125-
});
126-
};
127-
128-
/**
129-
* 移除 key 节点
130-
* @param data 遍历的数组
131-
* @param key 当前 key 值
132-
* @returns 删除数据之后的 data
101+
* @description 移除 key 节点
102+
* @param {ITreeNode<U>[]} data - 遍历的数组
103+
* @param {ITreeNode<U>['key']} key - 当前 key 值
104+
* @returns {ITreeNode<U>[]} 删除数据之后的 data
133105
*/
134106
export const removeNodeByKey = <U,>(
135107
data: ITreeNode<U>[],
136108
key: ITreeNode<U>['key']
137-
): ITreeNode<U>[] => {
138-
return data
109+
): ITreeNode<U>[] =>
110+
data
139111
.filter((node) => node.key !== key)
140112
.map((node) => {
141113
if (node.children) {
@@ -146,46 +118,98 @@ export const removeNodeByKey = <U,>(
146118
}
147119
return node;
148120
});
149-
};
150121

151122
/**
152-
* 移除 edit 为 true 的节点
153-
* @param treeData
154-
* @returns 移除之后的数据
123+
* @description 移除 edit 为 true 的节点
124+
* @param {ITreeNode<U>[]} treeData - 遍历的数组
125+
* @returns {ITreeNode<U>[]} 移除之后的数据
155126
*/
156127
export const removeEditNode = <U extends { edit?: boolean }>(
157128
treeData: ITreeNode<U>[]
158-
): ITreeNode<U>[] => {
159-
return treeData
129+
): ITreeNode<U>[] =>
130+
treeData
160131
.filter((node) => !node.edit)
161132
.map((node) => ({
162133
...node,
163134
children: node.children ? removeEditNode(node.children) : undefined,
164135
}));
165-
};
166136

167137
/**
168-
*
138+
* @description 在指定节点的子节点列表中添加一组子节点,可以选择添加在开头或结尾
139+
* @param {ITreeNode<U>[]} treeData - 要操作的树节点数组
140+
* @param {ITreeNode<U>['key']} key - 要添加子节点的目标节点 key
141+
* @param {ITreeNode<U>[]} children - 要添加的子节点数组
142+
* @param {boolean} [insertBefore=true] - 是否将子节点添加到现有子节点之前,true 表示添加到开头,false 表示添加到结尾
143+
* @returns {ITreeNode<U>[]} 更新后的树节点数组
169144
*/
170-
171-
export const insertChildIntoNode = <U extends { edit?: boolean }>(
145+
export const insertChildrenToNode = <U extends { edit?: boolean }>(
172146
treeData: ITreeNode<U>[],
173147
key: ITreeNode<U>['key'],
174-
children: ITreeNode<U>[]
175-
): ITreeNode<U>[] => {
176-
return treeData.map((node) => {
148+
children: ITreeNode<U>[],
149+
insertBefore = true
150+
): ITreeNode<U>[] =>
151+
treeData.map((node) => {
177152
if (node.key === key) {
153+
const updatedChildren = insertBefore
154+
? [...children, ...(node.children || [])]
155+
: [...(node.children || []), ...children];
178156
return {
179157
...node,
180-
children,
158+
children: node.children ? updatedChildren : children,
181159
};
182160
}
183161
if (node.children) {
184162
return {
185163
...node,
186-
children: insertChildIntoNode(node.children, key, children),
164+
children: insertChildrenToNode(node.children, key, children, insertBefore),
187165
};
188166
}
189167
return node;
190168
});
169+
170+
/**
171+
* @description 在树节点数组中查找指定 key 的节点索引
172+
* @param {ITreeNode<U>[]} treeData - 要搜索的树节点数组
173+
* @param {ITreeNode<U>['key']} key - 要查找的节点 key
174+
* @returns {number} 找到的节点索引,如果未找到则返回 -1
175+
*/
176+
export const findChildIndex = <U extends { edit?: boolean }>(
177+
data: ITreeNode<U>[],
178+
key: ITreeNode<U>['key']
179+
): number => data.findIndex((item) => item.key === key);
180+
181+
/**
182+
* @description 在树节点数组中,根据指定的 key 找到目标节点,并将新节点插入到目标节点之前或之后。
183+
* @param {ITreeNode<U>[]} treeData - 要操作的树节点数组。
184+
* @param {ITreeNode<U>['key']} currentKey - 目标节点的 key。
185+
* @param {ITreeNode<U>} node - 要插入的新节点。
186+
* @param {boolean} [insertBefore=true] - 是否将新节点插入到目标节点之前。true 表示之前,false 表示之后。
187+
* @returns {ITreeNode<U>[]} 更新后的树节点数组。
188+
*/
189+
export const insertNodeAtKey = <U extends { edit?: boolean }>(
190+
treeData: ITreeNode<U>[],
191+
currentKey: ITreeNode<U>['key'],
192+
node: ITreeNode<U>,
193+
insertBefore = true
194+
): ITreeNode<U>[] => {
195+
const newTreeData: ITreeNode<U>[] = [];
196+
for (const item of treeData) {
197+
if (item.key === currentKey) {
198+
if (insertBefore) {
199+
newTreeData.push(node);
200+
newTreeData.push(item);
201+
} else {
202+
newTreeData.push(item);
203+
newTreeData.push(node);
204+
}
205+
} else {
206+
newTreeData.push({
207+
...item,
208+
children: item.children
209+
? insertNodeAtKey(item.children, currentKey, node, insertBefore)
210+
: item.children,
211+
});
212+
}
213+
}
214+
return newTreeData;
191215
};

0 commit comments

Comments
 (0)