1
+ import Dropdown , { MenuItem } from '@trendmicro/react-dropdown' ;
1
2
import PropTypes from 'prop-types' ;
2
3
import React , { PureComponent } from 'react' ;
3
- import InfiniteTree from '../src/InfiniteTree' ;
4
- import render from './render' ;
5
- import '../src/index.styl' ;
4
+ import InfiniteTree from '../src' ;
5
+ import TreeNode from './components/TreeNode' ;
6
+ import Toggler from './components/Toggler' ;
7
+ import Icon from './components/Icon' ;
8
+ import Clickable from './components/Clickable' ;
9
+ import Text from './components/Text' ;
10
+ import Label from './components/Label' ;
11
+ import Loading from './components/Loading' ;
12
+ import { generate } from './tree-generator' ;
6
13
7
- const generateData = ( ) => {
8
- const data = [ ] ;
9
- const source = '{"id":"<root>","name":"<root>","props":{"droppable":true},"children":[{"id":"alpha","name":"Alpha","props":{"droppable":true}},{"id":"bravo","name":"Bravo","props":{"droppable":true},"children":[{"id":"charlie","name":"Charlie","props":{"droppable":true},"children":[{"id":"delta","name":"Delta","props":{"droppable":true},"children":[{"id":"echo","name":"Echo","props":{"droppable":true}},{"id":"foxtrot","name":"Foxtrot","props":{"droppable":true}}]},{"id":"golf","name":"Golf","props":{"droppable":true}}]},{"id":"hotel","name":"Hotel","props":{"droppable":true},"children":[{"id":"india","name":"India","props":{"droppable":true},"children":[{"id":"juliet","name":"Juliet","props":{"droppable":true}}]}]},{"id":"kilo","name":"(Load On Demand) Kilo","loadOnDemand":true,"props":{"droppable":true}}]}]}' ;
10
- for ( let i = 0 ; i < 1000 ; ++ i ) {
11
- data . push ( JSON . parse ( source . replace ( / " ( i d | n a m e ) " : " ( [ ^ " ] * ) " / g, '"$1": "$2.' + i + '"' ) ) ) ;
12
- }
13
- return data ;
14
- } ;
14
+ const renderTreeNode = ( { node, tree, toggleState } ) => (
15
+ < TreeNode
16
+ selected = { node . state . selected }
17
+ depth = { node . state . depth }
18
+ onClick = { event => {
19
+ tree . selectNode ( node ) ;
20
+ } }
21
+ >
22
+ < Toggler
23
+ state = { toggleState }
24
+ onClick = { ( ) => {
25
+ if ( toggleState === 'closed' ) {
26
+ tree . openNode ( node ) ;
27
+ } else if ( toggleState === 'opened' ) {
28
+ tree . closeNode ( node ) ;
29
+ }
30
+ } }
31
+ />
32
+ < Clickable >
33
+ < Icon state = { toggleState } />
34
+ < Text > { node . name } </ Text >
35
+ </ Clickable >
36
+ { ( node . loadOnDemand && node . children . length === 0 && ! node . state . loading ) &&
37
+ < i className = "fa fa-fw fa-ellipsis-v" />
38
+ }
39
+ { node . state . loading && < Loading /> }
40
+ < Label style = { { position : 'absolute' , right : 5 , top : 6 } } >
41
+ { node . children . length }
42
+ </ Label >
43
+ < Dropdown
44
+ style = { { position : 'absolute' , right : 20 , top : 4 } }
45
+ pullRight
46
+ >
47
+ < Dropdown . Toggle
48
+ noCaret
49
+ btnSize = "xs"
50
+ btnStyle = "link"
51
+ style = { { padding : 0 } }
52
+ >
53
+ < i className = "dropdown fa fa-fw fa-cog" />
54
+ </ Dropdown . Toggle >
55
+ < Dropdown . Menu >
56
+ < MenuItem > { node . name } </ MenuItem >
57
+ </ Dropdown . Menu >
58
+ </ Dropdown >
59
+ </ TreeNode >
60
+ ) ;
15
61
16
62
class Tree extends PureComponent {
17
63
static propTypes = {
18
64
onUpdate : PropTypes . func
19
65
} ;
20
66
21
67
tree = null ;
22
- data = generateData ( ) ;
68
+ data = generate ( 1000 ) ;
23
69
24
70
componentDidMount ( ) {
25
- //this.tree.loadData(data);
26
-
27
71
// Select the first node
28
72
this . tree . selectNode ( this . tree . getChildNodes ( ) [ 0 ] ) ;
29
73
}
@@ -36,11 +80,26 @@ class Tree extends PureComponent {
36
80
style = { {
37
81
border : '1px solid #ccc'
38
82
} }
83
+ autoOpen
84
+ selectable
85
+ tabIndex = { 0 }
39
86
data = { this . data }
40
87
width = "100%"
41
88
height = { 400 }
42
89
rowHeight = { 30 }
43
- autoOpen = { true }
90
+ rowRenderer = { ( { node, tree } ) => {
91
+ const hasChildren = node . hasChildren ( ) ;
92
+
93
+ let toggleState = '' ;
94
+ if ( ( ! hasChildren && node . loadOnDemand ) || ( hasChildren && ! node . state . open ) ) {
95
+ toggleState = 'closed' ;
96
+ }
97
+ if ( hasChildren && node . state . open ) {
98
+ toggleState = 'opened' ;
99
+ }
100
+
101
+ return renderTreeNode ( { node, tree, toggleState } ) ;
102
+ } }
44
103
loadNodes = { ( parentNode , done ) => {
45
104
const suffix = parentNode . id . replace ( / ( \w ) + / , '' ) ;
46
105
const nodes = [
@@ -57,16 +116,18 @@ class Tree extends PureComponent {
57
116
done ( null , nodes ) ;
58
117
} , 1000 ) ;
59
118
} }
60
- selectable = { true } // Defaults to true
61
119
shouldSelectNode = { ( node ) => { // Defaults to null
62
120
if ( ! node || ( node === this . tree . getSelectedNode ( ) ) ) {
63
121
return false ; // Prevent from deselecting the current node
64
122
}
65
123
return true ;
66
124
} }
125
+ onKeyUp = { ( event ) => {
126
+ console . log ( 'onKeyUp' , event . target ) ;
127
+ } }
67
128
onKeyDown = { ( event ) => {
68
- const target = event . target || event . srcElement ; // IE8
69
- console . log ( 'onKeyDown' , target ) ;
129
+ console . log ( 'onKeyDown' , event . target ) ;
130
+
70
131
event . preventDefault ( ) ;
71
132
72
133
const node = this . tree . getSelectedNode ( ) ;
@@ -88,16 +149,32 @@ class Tree extends PureComponent {
88
149
console . log ( 'onContentWillUpdate' ) ;
89
150
} }
90
151
onContentDidUpdate = { ( ) => {
152
+ console . log ( 'onContentDidUpdate' ) ;
91
153
this . props . onUpdate ( this . tree . getSelectedNode ( ) ) ;
92
154
} }
155
+ onOpenNode = { ( node ) => {
156
+ console . log ( 'onOpenNode:' , node ) ;
157
+ } }
158
+ onCloseNode = { ( node ) => {
159
+ console . log ( 'onCloseNode:' , node ) ;
160
+ } }
93
161
onSelectNode = { ( node ) => {
162
+ console . log ( 'onSelectNode:' , node ) ;
94
163
this . props . onUpdate ( node ) ;
95
164
} }
96
- >
97
- { ( { node, tree } ) => {
98
- return render ( { node, tree } ) ;
99
- } }
100
- </ InfiniteTree >
165
+ onWillOpenNode = { ( node ) => {
166
+ console . log ( 'onWillOpenNode:' , node ) ;
167
+ } }
168
+ onWillCloseNode = { ( node ) => {
169
+ console . log ( 'onWillCloseNode:' , node ) ;
170
+ } }
171
+ onWillSelectNode = { ( node ) => {
172
+ console . log ( 'onWillSelectNode:' , node ) ;
173
+ } }
174
+ onScroll = { ( scrollOffset , event ) => {
175
+ console . log ( '## onScroll' , scrollOffset , event ) ;
176
+ } }
177
+ />
101
178
) ;
102
179
}
103
180
}
0 commit comments