@@ -8,30 +8,23 @@ import { watchPropertyChange, IDGenerator } from '../../libs/utils';
8
8
import CollapseTransition from './CollapseTransition' ;
9
9
import Checkbox from '../checkbox' ;
10
10
11
- type Props = {
12
- nodeModel : Object ,
13
- renderContent ?: Function ,
14
- context : Object
15
- } ;
16
11
17
- function NodeContent ( props : Props ) {
18
- const { nodeModel, renderContent , context } = props ;
12
+ function NodeContent ( { context , renderContent } ) {
13
+ const { nodeModel, treeNode } = context . props ;
19
14
20
15
if ( typeof renderContent === 'function' ) {
21
- return renderContent ( Object . freeze ( context ) ) ;
16
+ return renderContent ( nodeModel , nodeModel . data , treeNode . store ) ;
22
17
} else {
23
18
return < span className = "el-tree-node__label" > { nodeModel . label } </ span > ;
24
19
}
25
20
}
26
21
27
22
NodeContent . propTypes = {
28
- nodeModel : PropTypes . object . isRequired ,
29
23
renderContent : PropTypes . func ,
30
24
context : PropTypes . object . isRequired
31
25
} ;
32
26
33
27
type State = {
34
- expanded : boolean ,
35
28
childNodeRendered : boolean ,
36
29
isShowCheckbox : boolean
37
30
} ;
@@ -43,7 +36,6 @@ export default class Node extends Component {
43
36
super ( props ) ;
44
37
45
38
this . state = {
46
- expanded : false ,
47
39
childNodeRendered : false ,
48
40
isShowCheckbox : false
49
41
} ;
@@ -128,40 +120,64 @@ export default class Node extends Component {
128
120
this . oldIndeterminate = indeterminate ;
129
121
}
130
122
131
- handleClick ( ) : void {
132
- this . props . treeNode . setCurrentNode ( this ) ;
123
+ getNodeKey ( node : any , otherwise : number ) {
124
+ const nodeKey = this . props . nodeKey ;
125
+ if ( nodeKey && node ) {
126
+ return node . data [ nodeKey ] ;
127
+ }
128
+ return otherwise ;
133
129
}
134
130
135
- handleExpandIconClick ( event : SyntheticEvent ) : void {
136
- let target = event . target ;
137
- const { nodeModel, onNodeClicked } = this . props ;
138
- if ( target instanceof HTMLElement ) {
139
- if (
140
- ( target . tagName . toUpperCase ( ) !== 'DIV' &&
141
- target . parentNode &&
142
- target . parentNode . nodeName . toUpperCase ( ) !== 'DIV' ) ||
143
- target . nodeName . toUpperCase ( ) === 'LABEL'
144
- )
145
- return ;
146
- if ( this . state . expanded ) {
147
- nodeModel . collapse ( ) ;
148
- this . setState ( { expanded : false } , ( ) =>
149
- this . refs . collapse . triggerChange ( ) ) ;
150
- } else {
151
- nodeModel . expand ( ( ) => {
152
- this . setState ( { expanded : true , childNodeRendered : true } , ( ) =>
153
- this . refs . collapse . triggerChange ( ) ) ;
154
- } ) ;
155
- }
156
131
157
- onNodeClicked ( nodeModel . data , nodeModel , this ) ;
132
+ handleClick ( evt : ?SyntheticEvent ) : void {
133
+ if ( evt ) evt . stopPropagation ( ) ;
134
+ const { nodeModel, treeNode } = this . props ;
135
+
136
+ treeNode . setCurrentNode ( this ) ;
137
+ if ( treeNode . props . expandOnClickNode ) {
138
+ this . handleExpandIconClick ( )
158
139
}
159
140
}
160
141
142
+ handleExpandIconClick ( evt : ?SyntheticEvent ) : void {
143
+ if ( evt ) evt . stopPropagation ( ) ;
144
+
145
+ const { nodeModel, parent } = this . props ;
146
+ const { onNodeCollapse, onNodeExpand} = this . props . treeNode . props ;
147
+
148
+ if ( nodeModel . isLeaf ) return ;
149
+
150
+ if ( nodeModel . expanded ) {
151
+ nodeModel . collapse ( )
152
+ this . refresh ( )
153
+ onNodeCollapse ( nodeModel . data , nodeModel , this )
154
+ } else {
155
+ nodeModel . expand ( ( ) => {
156
+ this . setState ( { childNodeRendered : true } , ( ) => {
157
+ onNodeExpand ( nodeModel . data , nodeModel , this )
158
+ } ) ;
159
+ parent . closeSiblings ( nodeModel )
160
+ } ) ;
161
+ }
162
+ }
163
+
164
+ closeSiblings ( exclude : any ) {
165
+ const { treeNode, nodeModel} = this . props ;
166
+ if ( ! treeNode . props . accordion ) return ;
167
+ if ( nodeModel . isLeaf || ! nodeModel . childNodes || ! nodeModel . childNodes . length ) return ;
168
+
169
+ nodeModel . childNodes . filter ( e => e !== exclude ) . forEach ( e => e . collapse ( ) ) ;
170
+ this . refresh ( ) ;
171
+ }
172
+
173
+ refresh ( ) {
174
+ this . setState ( { } )
175
+ }
176
+
161
177
handleUserClick ( ) : void {
162
- const nodeModel = this . props . nodeModel ;
178
+ let { nodeModel, checkStrictly } = this . props . treeNode ;
163
179
if ( nodeModel . indeterminate ) {
164
- nodeModel . setChecked ( nodeModel . checked , true ) ;
180
+ nodeModel . setChecked ( nodeModel . checked , ! checkStrictly ) ;
165
181
}
166
182
}
167
183
@@ -170,47 +186,52 @@ export default class Node extends Component {
170
186
}
171
187
172
188
render ( ) : React . Element < any > {
173
- const { childNodeRendered, expanded } = this . state ;
189
+ const { childNodeRendered } = this . state ;
174
190
const { treeNode, nodeModel, renderContent, isShowCheckbox } = this . props ;
175
191
192
+ let expanded = nodeModel . expanded ;
193
+
176
194
return (
177
195
< div
178
196
onClick = { this . handleClick . bind ( this ) }
179
197
className = { this . classNames ( 'el-tree-node' , {
180
198
expanded : childNodeRendered && expanded ,
181
- 'is-current' : treeNode . getCurrentNode ( ) === this
199
+ 'is-current' : treeNode . getCurrentNode ( ) === this ,
200
+ 'is-hidden' : ! nodeModel . visible
182
201
} ) }
202
+ style = { { display : nodeModel . visible ? '' : 'none' } }
183
203
>
184
204
< div
185
205
className = "el-tree-node__content"
186
- style = { { paddingLeft : `${ nodeModel . level * 16 } px` } }
187
- onClick = { this . handleExpandIconClick . bind ( this ) }
206
+ style = { { paddingLeft : `${ ( nodeModel . level - 1 ) * treeNode . props . indent } px` } }
188
207
>
189
208
< span
190
209
className = { this . classNames ( 'el-tree-node__expand-icon' , {
191
210
'is-leaf' : nodeModel . isLeaf ,
192
211
expanded : ! nodeModel . isLeaf && expanded
193
212
} ) }
213
+ onClick = { this . handleExpandIconClick . bind ( this ) }
194
214
/>
195
215
{ isShowCheckbox &&
196
216
< Checkbox
197
217
checked = { nodeModel . checked }
198
218
onChange = { this . handleCheckChange . bind ( this ) }
199
219
indeterminate = { nodeModel . indeterminate }
220
+ onClick = { this . handleUserClick . bind ( this ) }
200
221
/> }
201
222
{ nodeModel . loading &&
202
- < span className = "el-tree-node__icon el-icon-loading" > </ span > }
223
+ < span className = "el-tree-node__loading-icon el-icon-loading" > </ span > }
203
224
< NodeContent
204
225
nodeModel = { nodeModel }
205
- renderContent = { renderContent }
226
+ renderContent = { treeNode . props . renderContent }
206
227
context = { this }
207
228
/>
208
229
</ div >
209
230
< CollapseTransition isShow = { expanded } ref = "collapse" >
210
231
< div className = "el-tree-node__children" >
211
232
{ nodeModel . childNodes . map ( ( e , idx ) => {
212
- let props = Object . assign ( { } , this . props , { nodeModel : e } ) ;
213
- return < Node { ...props } key = { idx } /> ;
233
+ let props = Object . assign ( { } , this . props , { nodeModel : e , parent : this } ) ;
234
+ return < Node { ...props } key = { this . getNodeKey ( e , idx ) } /> ;
214
235
} ) }
215
236
</ div >
216
237
</ CollapseTransition >
@@ -222,16 +243,13 @@ export default class Node extends Component {
222
243
Node . propTypes = {
223
244
nodeModel : PropTypes . object ,
224
245
options : PropTypes . object ,
225
- renderContent : PropTypes . func ,
226
246
treeNode : PropTypes . object . isRequired ,
227
247
isShowCheckbox : PropTypes . bool ,
228
248
onCheckChange : PropTypes . func ,
229
- onNodeClicked : PropTypes . func
230
249
} ;
231
250
232
251
Node . defaultProps = {
233
252
nodeModel : { } ,
234
253
options : { } ,
235
254
onCheckChange ( ) { } ,
236
- onNodeClicked ( ) { }
237
255
} ;
0 commit comments