JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://fb.me/react-with-addons-0.9.0.js"></script>
<script src="http://fb.me/JSXTransformer-0.9.0.js"></script>
<script src="http://fb.me/react-js-fiddle-integration.js"></script>
CSS
.folder_content {
background: #f7f7f7;
padding-bottom: 1px;
}
.itemBox {
padding: 2px 5px 35px 0px;
margin: 2px 5px 5px 0px;
border: black dotted 1px;
}
.folder_header {
line-height:35px;
height: 35px;
background: #B1D9E7;
position: relative;
padding-left: 44px;
margin-right:18px;
}
JavaScript 1.7
/** @jsx React.DOM */
var initialState = {
"folders": [
{
"name": "folder1",
"open": false,
"files": [{
"text": "content1 1"
}]
},
{
"name": "folder2",
"open": false,
"files": [{
"text": "content2 1"
}, {
"text": "content2 2"
}]
}
]
};
var Folder = React.createClass({
render: function() {
var items = [];
if( this.props.folderData.open ){
this.props.folderData.files.forEach(function(file) {
items.push( <div className="itemBox">{file.text}</div>);
});
}
return (
<div className="items_directory">
<div className="folder_header" onClick={this.props.onFolderClick}>{this.props.folderData.name}</div>
<div className="folder_content">
{items}
</div>
</div>
);
}
});
var FoldersManager = React.createClass({
getInitialState: function() {
return this.props.initialState;
},
render: function(){
var self = this;
var folderComponents = this.state.folders.map(function(folder,folderIndex) {
var onFolderClick = function() {
self.toggleFolder(folderIndex);
};
return <Folder folderData={folder} onFolderClick={onFolderClick}/>;
});
return (
<div>
<button onClick={this.toggleAll}>Toggle All</button>
<div>
{folderComponents}
</div>
</div>
);
},
toggleFolder: function(folderIndex) {
var newState = this.state;
newState.folders[folderIndex].open = !newState.folders[folderIndex].open;
this.setState(newState);
},
toggleAll: function(){
var newState = this.state;
var newOpenToSet =...