Skip to content

Commit c5823fd

Browse files
committed
adding node.collapsed support
1 parent 896f4e3 commit c5823fd

File tree

4 files changed

+37
-19
lines changed

4 files changed

+37
-19
lines changed

example/app.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var App = React.createClass({
1414
module: 'react-ui-tree',
1515
children: [{
1616
module: 'dist',
17+
collapsed: true,
1718
children: [{
1819
module: 'node.js'
1920
}, {
@@ -63,10 +64,13 @@ var App = React.createClass({
6364
},
6465

6566
renderNode(node) {
66-
return <span className={cx({
67-
'node': true,
68-
'is-active': node === this.state.active
69-
})} onClick={this.onClickNode.bind(null, node)}>{node.module}</span>;
67+
return (
68+
<span className={cx('node', {
69+
'is-active': node === this.state.active
70+
})} onClick={this.onClickNode.bind(null, node)}>
71+
{node.module}
72+
</span>
73+
);
7074
},
7175

7276
onClickNode(node) {
@@ -83,10 +87,12 @@ var App = React.createClass({
8387
paddingLeft={20}
8488
tree={this.state.tree}
8589
onChange={this.handleChange}
90+
isNodeCollapsed={this.isNodeCollapsed}
8691
renderNode={this.renderNode}
8792
/>
8893
</div>
8994
<div className="inspector">
95+
<button onClick={this.updateTree}>update tree</button>
9096
<pre>
9197
{JSON.stringify(this.state.tree, null, ' ')}
9298
</pre>
@@ -99,6 +105,14 @@ var App = React.createClass({
99105
this.setState({
100106
tree: tree
101107
});
108+
},
109+
110+
updateTree() {
111+
var tree = this.state.tree;
112+
tree.children.push({module: 'test'});
113+
this.setState({
114+
tree: tree
115+
});
102116
}
103117
});
104118

lib/node.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ var Node = React.createClass({
88
var index = this.props.index;
99

1010
if(index.children && index.children.length) {
11+
var collapsed = index.node.collapsed;
12+
1113
return (
1214
<span
13-
className={cx('collapse', {
14-
'caret-right': index.collapsed,
15-
'caret-down': !index.collapsed
16-
})}
15+
className={cx('collapse', collapsed ? 'caret-right' : 'caret-down')}
1716
onMouseDown={function(e) {e.stopPropagation()}}
1817
onClick={this.handleCollapse}>
1918
</span>
@@ -30,7 +29,7 @@ var Node = React.createClass({
3029

3130
if(index.children && index.children.length) {
3231
var childrenStyles = {};
33-
if(index.collapsed) childrenStyles.display = 'none';
32+
if(index.node.collapsed) childrenStyles.display = 'none';
3433
childrenStyles['paddingLeft'] = this.props.paddingLeft + 'px';
3534

3635
return (

lib/react-ui-tree.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ module.exports = React.createClass({
66
displayName: 'UITree',
77

88
propTypes: {
9-
tree: React.PropTypes.object,
9+
tree: React.PropTypes.object.isRequired,
1010
paddingLeft: React.PropTypes.number,
11-
renderNode: React.PropTypes.func
11+
renderNode: React.PropTypes.func.isRequired
1212
},
1313

1414
getDefaultProps() {
@@ -22,13 +22,15 @@ module.exports = React.createClass({
2222
},
2323

2424
componentWillReceiveProps(nextProps) {
25-
if(!this._update) this.setState(this.init(nextProps));
26-
else this._update = false;
25+
if(!this._updated) this.setState(this.init(nextProps));
26+
else this._updated = false;
2727
},
2828

2929
init(props) {
3030
var tree = new Tree(props.tree);
31+
tree.isNodeCollapsed = props.isNodeCollapsed;
3132
tree.renderNode = props.renderNode;
33+
tree.changeNodeCollapsed = props.changeNodeCollapsed;
3234
tree.updateNodesPosition();
3335

3436
return {
@@ -207,18 +209,21 @@ module.exports = React.createClass({
207209
},
208210

209211
change(tree) {
210-
this._update = true;
212+
this._updated = true;
211213
if(this.props.onChange) this.props.onChange(tree.obj);
212214
},
213215

214-
toggleCollapse: function(nodeId) {
216+
toggleCollapse(nodeId) {
215217
var tree = this.state.tree;
216218
var index = tree.getIndex(nodeId);
217-
index.collapsed = !index.collapsed;
219+
var node = index.node;
220+
node.collapsed = !node.collapsed;
218221
tree.updateNodesPosition();
219222

220223
this.setState({
221224
tree: tree
222225
});
226+
227+
this.change(tree);
223228
}
224229
});

lib/tree.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ proto.updateNodesPosition = function() {
99

1010
root.top = top++;
1111
root.left = left++;
12-
walk(root.children, root, left, root.collapsed);
12+
walk(root.children, root, left, root.node.collapsed);
1313

1414
function walk(children, parent, left, collapsed) {
1515
var height = 1;
@@ -24,14 +24,14 @@ proto.updateNodesPosition = function() {
2424
}
2525

2626
if(node.children && node.children.length) {
27-
height += walk(node.children, node, left+1, collapsed || node.collapsed);
27+
height += walk(node.children, node, left+1, collapsed || node.node.collapsed);
2828
} else {
2929
node.height = 1;
3030
height += 1;
3131
}
3232
});
3333

34-
if(parent.collapsed) parent.height = 1;
34+
if(parent.node.collapsed) parent.height = 1;
3535
else parent.height = height;
3636
return parent.height;
3737
}

0 commit comments

Comments
 (0)