11import React from 'react' ;
22import { FolderFilled , FolderOpenedFilled } from '@dtinsight/react-icons' ;
33
4- import { CatalogueProps } from './components/catalogue' ;
54import { ITreeNode } from './useTreeData' ;
65
76export 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 */
4541export 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 */
6763export 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 */
8883export 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 */
134106export 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 */
156127export 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