2015-09-11 16:25:45 +02:00
|
|
|
var React = require('react');
|
|
|
|
var connect = require('react-redux').connect;
|
|
|
|
var actions = require('../../store/actions');
|
2015-10-09 14:22:23 +02:00
|
|
|
var TreeItem = require('./tree-item.js');
|
2015-10-19 09:02:10 +02:00
|
|
|
var DropTarget = require('react-dnd').DropTarget;
|
|
|
|
var _ = require('lodash');
|
2015-09-11 16:25:45 +02:00
|
|
|
|
|
|
|
var TreeNode = React.createClass({
|
|
|
|
|
|
|
|
render: function() {
|
|
|
|
|
|
|
|
var data = this.props.data || {};
|
|
|
|
var subItems = data.items || [];
|
|
|
|
|
|
|
|
var listElements = subItems.map(function(subItem, i) {
|
|
|
|
return (
|
|
|
|
<li key={i} >
|
2015-09-16 17:26:56 +02:00
|
|
|
<TreeNode data={subItem}
|
|
|
|
selectedItem={this.props.selectedItem}
|
|
|
|
onItemClicked={this.props.onItemClicked}
|
|
|
|
onItemMoved={this.props.onItemMoved}
|
2015-10-10 18:44:31 +02:00
|
|
|
onItemRemoved={this.props.onItemRemoved}
|
2015-09-16 17:26:56 +02:00
|
|
|
theme={this.props.theme} />
|
2015-09-11 16:25:45 +02:00
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}.bind(this));
|
|
|
|
|
|
|
|
var appEntry = data.icon || data.label ?
|
2015-09-16 17:26:56 +02:00
|
|
|
this.renderTreeItem(data):
|
2015-09-11 16:25:45 +02:00
|
|
|
null
|
|
|
|
;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="tree-item">
|
|
|
|
{appEntry}
|
|
|
|
<ul>
|
|
|
|
{listElements}
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
|
2015-09-16 17:26:56 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
renderTreeItem: function(data) {
|
|
|
|
return (
|
|
|
|
<TreeItem data={data}
|
2015-11-03 17:45:37 +01:00
|
|
|
selected={data === this.props.selectedItem}
|
2015-09-16 17:26:56 +02:00
|
|
|
{...this.props} />
|
|
|
|
);
|
2015-09-11 16:25:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
var ProfileTree = React.createClass({
|
|
|
|
|
|
|
|
render: function() {
|
|
|
|
|
2015-10-19 09:02:10 +02:00
|
|
|
var connectDropTarget = this.props.connectDropTarget;
|
|
|
|
|
|
|
|
return connectDropTarget(
|
2015-09-11 16:25:45 +02:00
|
|
|
<div className="profile-tree">
|
2015-09-16 17:26:56 +02:00
|
|
|
{this.renderTreeNode(this.props.profile)}
|
2015-09-11 16:25:45 +02:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
2015-09-16 17:26:56 +02:00
|
|
|
renderTreeNode: function(data) {
|
|
|
|
return (
|
|
|
|
<TreeNode data={data}
|
|
|
|
selectedItem={this.props.selectedItem}
|
|
|
|
onItemClicked={this.onItemSelected}
|
|
|
|
onItemMoved={this.onItemMoved}
|
2015-10-10 18:44:31 +02:00
|
|
|
onItemRemoved={this.onItemRemoved}
|
2015-09-16 17:26:56 +02:00
|
|
|
theme={this.props.theme} />
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
2015-09-11 16:25:45 +02:00
|
|
|
onItemMoved: function(movedItem, targetItem) {
|
|
|
|
this.props.dispatch(actions.edit.moveProfileItem(movedItem, targetItem));
|
2015-09-16 17:26:56 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
onItemSelected: function(selectedItem) {
|
|
|
|
this.props.dispatch(actions.edit.selectProfileItem(selectedItem));
|
2015-10-10 18:44:31 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
onItemRemoved: function(selectedItem) {
|
|
|
|
this.props.dispatch(actions.edit.removeProfileItem(selectedItem));
|
2015-09-11 16:25:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
function select(state) {
|
|
|
|
return {
|
2015-09-16 17:26:56 +02:00
|
|
|
profile: state.profile,
|
2015-11-03 17:45:37 +01:00
|
|
|
theme: state.theme,
|
|
|
|
selectedItem: state.selectedItem
|
2015-09-11 16:25:45 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2015-10-19 09:02:10 +02:00
|
|
|
var dropTargetSpec = {
|
|
|
|
|
|
|
|
drop: function(props, monitor, component) {
|
|
|
|
if(!monitor.didDrop()) {
|
|
|
|
return props.profile;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
canDrop: function(props, monitor) {
|
|
|
|
var draggedItem = monitor.getItem();
|
|
|
|
return !_.isEqual(draggedItem, props.data);
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
function dragSourceCollect(connect, monitor) {
|
|
|
|
return {
|
|
|
|
connectDragSource: connect.dragSource(),
|
|
|
|
isDragging: monitor.isDragging()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function dropTargetCollect(connect, monitor) {
|
|
|
|
return {
|
|
|
|
connectDropTarget: connect.dropTarget(),
|
|
|
|
isOver: monitor.isOver(),
|
|
|
|
canDrop: monitor.canDrop()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = connect(select)(
|
|
|
|
DropTarget(['ITEM', 'NEW_ITEM'], dropTargetSpec, dropTargetCollect)(ProfileTree)
|
|
|
|
);
|