@@ -16,46 +16,62 @@ export function getElementByCustomAttr(id: string): HTMLElementType {
16
16
export function generateTreeId ( id ?: string ) : string {
17
17
return `mo_treeNode_${ id } ` ;
18
18
}
19
+ export const FileTypes = {
20
+ FILE : 'file' ,
21
+ FOLDER : 'folder'
22
+ }
23
+ export type FileType = 'file' | 'folder' ;
19
24
20
25
export interface ITreeNodeItem {
21
- key ?: string | number ;
22
- title ?: React . ReactNode | string ;
23
26
name ?: string ;
24
- type ?: 'folder' | 'file' ;
25
- contextMenu ?: IMenuItem [ ] ;
27
+ type ?: FileType ;
28
+ contextMenu ?: IMenuItem [ ] ; // custom contextMenu
26
29
children ?: ITreeNodeItem [ ] ;
27
30
readonly id ?: string ;
28
31
icon ?: string | React . ReactNode ;
32
+ modify ?: boolean ; // Edit status
29
33
className ?: string ;
30
34
}
31
35
export interface ITreeProps extends TreeProps {
32
36
data : ITreeNodeItem [ ] ;
33
37
onSelectFile ?: ( IMenuItem ) => void ;
38
+ newFileItem ?: ( fileData : ITreeNodeItem , type : FileType ) => void ;
39
+ updateFile ?( fileData : ITreeNodeItem , newName : string , index : number ) : void ;
40
+ reName ?( fileData : ITreeNodeItem ) : void ;
41
+ onDropTree ?( treeNode ) : void ;
34
42
className ?: string ;
35
43
}
36
44
const TreeView : React . FunctionComponent < ITreeProps > = ( props : ITreeProps ) => {
37
- const { className, data, ...others } = props ;
38
- const [ treeData , setTreeData ] = useState < ITreeNodeItem [ ] > ( data ) ;
45
+ const { className, data,
46
+ newFileItem, updateFile, reName,
47
+ onDropTree,
48
+ ...others } = props ;
39
49
const [ activeData , setActiveData ] = useState < ITreeNodeItem > ( { } ) ;
40
-
41
- const getContextMenuList = ( type ?: 'folder' | 'file' ) => {
50
+ // const [value, setValue] = useState<string>('')
51
+ const getContextMenuList = ( type ?: FileType ) => {
42
52
let contextMenu : IMenuItem [ ] = [ ] ;
43
53
if ( type === 'folder' ) {
44
54
contextMenu = [
45
55
{
46
56
id : 'newFile' ,
47
57
name : 'New File' ,
48
58
onClick : ( e , active ) => {
49
- console . log ( 'New File Click' , active ) ;
59
+ newFileItem && newFileItem ( activeData , FileTypes . FILE as FileType )
50
60
} ,
51
61
} ,
52
62
{
53
63
id : 'newFolder' ,
54
64
name : 'New Folder' ,
65
+ onClick : ( e , active ) => {
66
+ newFileItem && newFileItem ( activeData , FileTypes . FOLDER as FileType )
67
+ } ,
55
68
} ,
56
69
{
57
70
id : 'rename' ,
58
71
name : 'Rename' ,
72
+ onClick : ( e , active ) => {
73
+ reName && reName ( activeData )
74
+ } ,
59
75
} ,
60
76
{
61
77
id : 'delete' ,
@@ -71,6 +87,9 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
71
87
{
72
88
id : 'rename' ,
73
89
name : 'Rename' ,
90
+ onClick : ( e , active ) => {
91
+ reName && reName ( activeData )
92
+ } ,
74
93
} ,
75
94
{
76
95
id : 'delete' ,
@@ -93,7 +112,6 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
93
112
} ) ;
94
113
}
95
114
return function cleanup ( ) {
96
- console . log ( 'cleanup' ) ;
97
115
contextViewMenu ?. dispose ( ) ;
98
116
} ;
99
117
} , [ data , activeData ] ) ;
@@ -116,16 +134,16 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
116
134
}
117
135
} ) ;
118
136
} ;
119
- const data = [ ...treeData ] ;
137
+ const treeData = [ ...data ] ;
120
138
121
139
let dragObj ;
122
- loopTree ( data , dragKey , ( item , index , arr ) => {
140
+ loopTree ( treeData , dragKey , ( item , index , arr ) => {
123
141
arr . splice ( index , 1 ) ;
124
142
dragObj = item ;
125
143
} ) ;
126
144
127
145
if ( ! info . dropToGap ) {
128
- loopTree ( data , dropKey , ( item ) => {
146
+ loopTree ( treeData , dropKey , ( item ) => {
129
147
item . children = item . children || [ ] ;
130
148
item . children . push ( dragObj ) ;
131
149
} ) ;
@@ -134,14 +152,14 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
134
152
info . node . props . expanded &&
135
153
dropPosition === 1
136
154
) {
137
- loopTree ( data , dropKey , ( item ) => {
155
+ loopTree ( treeData , dropKey , ( item ) => {
138
156
item . children = item . children || [ ] ;
139
157
item . children . unshift ( dragObj ) ;
140
158
} ) ;
141
159
} else {
142
160
let ar ;
143
161
let i ;
144
- loopTree ( data , dropKey , ( item , index , arr ) => {
162
+ loopTree ( treeData , dropKey , ( item , index , arr ) => {
145
163
ar = arr ;
146
164
i = index ;
147
165
} ) ;
@@ -151,24 +169,34 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
151
169
ar . splice ( i + 1 , 0 , dragObj ) ;
152
170
}
153
171
}
154
- console . log ( 'data ' , data ) ;
155
- setTreeData ( data ) ;
172
+ console . log ( 'treeData ' , treeData ) ;
173
+ onDropTree && onDropTree ( treeData )
156
174
} ;
157
-
158
175
const renderTreeNodes = ( data ) =>
159
- data ?. map ( ( item ) => {
176
+ data ?. map ( ( item , index ) => {
177
+ const {
178
+ modify, name, id, icon, children
179
+ } = item ;
160
180
return (
161
181
< TreeNode
162
- data-id = { generateTreeId ( item . id ) }
182
+ data-id = { generateTreeId ( id ) }
163
183
data = { item }
164
- title = { item . name }
165
- key = { item . key }
166
- icon = { < Icon type = { item . icon } /> }
184
+ title = { modify ? < input
185
+ autoComplete = 'off'
186
+ onBlur = { ( e ) => {
187
+ updateFile && updateFile ( item , e . target . value , index )
188
+ } }
189
+ onChange = { ( e ) => {
190
+ } }
191
+ /> : name }
192
+ key = { id }
193
+ icon = { modify ? '' : < Icon type = { icon } /> }
167
194
>
168
- { item . children && renderTreeNodes ( item . children ) }
195
+ { children && renderTreeNodes ( children ) }
169
196
</ TreeNode >
170
197
) ;
171
198
} ) ;
199
+
172
200
return (
173
201
< div className = { classNames ( prefixClaName ( 'tree' ) , className ) } >
174
202
< div className = { prefixClaName ( 'tree' , 'sidebar' ) } >
@@ -181,14 +209,14 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
181
209
setActiveData ( node . data ) ;
182
210
} }
183
211
onSelect = { ( selectedKeys , e : any ) => {
184
- console . log ( 'select' , selectedKeys , e ) ;
185
- const isFile = e . node . data . type === 'file' ;
186
- if ( isFile && props . onSelectFile ) {
212
+ const isFile = e . node . data . type === FileTypes . FILE ;
213
+ const idModify = e . node . data . modify ;
214
+ if ( isFile && ! idModify && props . onSelectFile ) {
187
215
props . onSelectFile ( e . node . data ) ;
188
216
}
189
217
} }
190
218
>
191
- { renderTreeNodes ( treeData ) }
219
+ { renderTreeNodes ( data ) }
192
220
</ Tree >
193
221
</ div >
194
222
</ div >
0 commit comments