- A node of level n can be dropped to a node of level n-1.
problem is --
1. after i drop node function211 to process11. process11 node can not be moved to area2 node[which should be].
my code is --
Code:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Basic TreeGrid - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="themes/icon.css">
<link rel="stylesheet" type="text/css" href="CSS/demo.css">
<script type="text/javascript" src="Extension/jquery.min.js"></script>
<script type="text/javascript" src="Extension/jquery.easyui.min.js"></script>
<script type="text/javascript" src="Extension/treegrid-dnd.js"></script>
</head>
<body>
<h2>Project Estimation</h2>
<p>Show projects as treegrid.</p>
<div>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="edit()">Edit</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="save()">Save</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="cancel()">Cancel</a>
</div>
<div style="margin:20px 0;"></div>
<table id ="tg" class="easyui-treegrid" style="width:700px;height:250px"
data-options="
animate: true,
collapsible: true,
fitColumns: true,
url: 'Data/project_data.json',
method: 'get',
rownumbers: true,
idField: 'id',
treeField: 'name',
loadFilter: myLoadFilter,
onLoadSuccess: onLoadSuccess,
onDblClickCell: onDblClickCell
">
<thead >
<tr>
<th data-options="field:'name',width:'180',editor:'text'">Name</th>
<th data-options="field:'categoryid',
formatter: function(value,row){
return row.categoryname;
},
width:'180',
editor:{
type:'combobox',
options:{
valueField:'categoryid',
textField:'categoryname',
method:'get',
url:'Data/category.json',
required:true,
onSelect: onSelectCategoryName
}
}">Category
</th>
<th data-options="field:'department',width:'180',editor:'text'">Department</th>
<th data-options="field:'referenceSize',width:'180',editor:'text'">Reference Size</th>
</tr>
</thead>
</table>
<div id="mm" class="easyui-menu" style="width:120px;">
<div id="m-append" onclick="append()" data-options="iconCls:'icon-add'">Append</div>
<div id="m-removeIt" onclick="removeIt()" data-options="iconCls:'icon-remove'">Remove</div>
</div>
<script type="text/javascript">
var maxLeafLevel = 3;
$.extend($.fn.treegrid.methods, {
editCell: function(jq,param){
return jq.each(function(){
var opts = $(this).treegrid('options');
var fields = $(this).treegrid('getColumnFields',true).concat($(this).treegrid('getColumnFields'));
for(var i=0; i<fields.length; i++){
var col = $(this).treegrid('getColumnOption', fields[i]);
col.editor1 = col.editor;
if (fields[i] != param.field){
col.editor = null;
}
}
$(this).treegrid('beginEdit', param.index);
for(var i=0; i<fields.length; i++){
var col = $(this).treegrid('getColumnOption', fields[i]);
col.editor = col.editor1;
}
});
}
});
var appendVisible = true;
var removeVisible = true;
function onContextMenu(e, row){
e.preventDefault();
$(this).treegrid('select', row.id);
var currentLevel = getLevel(row);
if(currentLevel == maxLeafLevel){
if (appendVisible) {
var itemEl = $('#m-append')[0];
$('#mm').menu('hideItem', itemEl);
appendVisible = false;
}
}
else{
if(!appendVisible){
var itemEl = $('#m-append')[0];
$('#mm').menu('showItem', itemEl);
appendVisible = true;
}
}
$('#mm').menu('show',{
left: e.pageX,
top: e.pageY
});
}
$(function(){
$('#tg').treegrid({
onContextMenu: onContextMenu,
//onDragEnter: onDragEnter,
onDragOver: onDragOver,
//onDragLeave: onDragLeave,
onBeforeDrop: onBeforeDrop
//onDrop: onDrop,
//onBeforeDrag: onBeforeDrag
});
/*var id = row?row.id:null;
var target = this;
var state = $.data(this, 'treegrid');
state.disabledNodes = [];
var t = $(this);
var opts = state.options;
if (id){
var nodes = opts.finder.getTr(target, id);
var rows = t.treegrid('getChildren', id);
for(var i=0; i<rows.length; i++){
nodes = nodes.add(opts.finder.getTr(target, rows[i][opts.idField]));
}
} else {
var nodes = t.treegrid('getPanel').find('tr[node-id]');
}
nodes.draggable({}).droppable({
accept: 'tr[node-id]',
onDragOver: onDragOver,
//onDragLeave: onDragLeave,
onBeforeDrop: onBeforeDrop,
//onDrop: onDrop
});*/
});
function append(){
var tree = $('#tg');
var node = tree.treegrid('getSelected');
var currentLevel = getLevel(node);
if(currentLevel < maxLeafLevel){
var children = tree.treegrid('getChildren', node.id);
var childrenNo = children.length;
childrenNo++;
childId = node.id*10;
childLevel = currentLevel + 1;
tree.treegrid('append',{
parent: node.id,
data: [{
id: node.id*10 + childrenNo,
name: getNodeNameForLevel(childLevel) + node.id + '.' + childrenNo,
iconCls: getIconNameForLevel(childLevel)
}]
});
}
}
function removeIt(){
var node = $('#tg').treegrid('getSelected');
if(node){
$('#tg').treegrid('remove', node.id);
}
}
var editingId;
function edit(){
if(editingId != undefined){
$('#tg').treegrid('select', editingId);
return;
}
var row = $('#tg').treegrid('getSelected');
var currentLevel = getLevel(row);
if(row){
if(currentLevel == maxLeafLevel){
editingId = row.id;
$('#tg').treegrid('beginEdit', editingId);
enableEdit(editingId);
}
else{
onDblClickCell('name',row);
}
}
}
function save(){
if(editingId != undefined){
$('#tg').treegrid('endEdit', editingId);
editingId = undefined;
}
}
function cancel(){
if(editingId != undefined){
$('#tg').treegrid('cancelEdit', editingId);
editingId = undefined;
}
}
function endEditing(){
if (editingId == undefined){return true}
if ($('#tg').treegrid('validateRow', editingId)){
$('#tg').treegrid('endEdit', editingId);
editingId = undefined;
return true;
} else {
return false;
}
}
function onDblClickCell(field, row){
if (endEditing()){
var currentLevel = getLevel(row);
if(currentLevel == maxLeafLevel || field == 'name'){
$('#tg').treegrid('select', row.id)
.treegrid('editCell', {index:row.id,field:field});
editingId = row.id;
enableEdit(editingId);
$('#tg').treegrid('getPanel').bind('keyup',function(e){
if(e.keyCode == 27){
cancel();
}
});
}
}
}
function enableEdit(id){
if(id){
var t = $('#tg');
var eds = t.treegrid('getEditors',id);
for(var i=0;i<eds.length;i++){
$(eds[i].target).bind('mousedown',function(e){
e.stopPropagation();
});
}
}
}
function getLevel(row){
var currentLevel = $('#tg').treegrid('getLevel', row.id);
return currentLevel;
}
function onLoadSuccess(row, data){
$(this).treegrid('enableDnd', row?row.id:null);
for (var i = 0; i < data.length; i++) {
if(data[i].iconCls == undefined){
data[i].iconCls = getIconNameForNode(data[i]);
$('#tg').treegrid('refresh', data[i].id);
}
}
}
function getIconNameForNode(node){
currentLevel = getLevel(node);
return getIconNameForLevel(currentLevel);
}
function getIconNameForLevel(currentLevel){
var iconName;
switch(currentLevel){
case 1:
iconName = 'icon-add';
break;
case 2:
iconName = 'icon-edit';
break;
case 3:
iconName = 'icon-remove';
break;
default:
iconName = 'icon-blank';
break;
}
return iconName;
}
function onSelectCategoryName(param){
var row = $('#tg').treegrid('getSelected');
row.categoryid = param.categoryid;
row.categoryname = param.categoryname;
}
function myLoadFilter(data,parentId){
function setData(data){
var todo = [];
for(var i=0; i<data.length; i++){
todo.push(data[i]);
}
while(todo.length){
var node = todo.shift();
if (node.children && node.children.length){
node.state = 'closed';
node.children1 = node.children;
node.children = undefined;
todo = todo.concat(node.children1);
}
}
}
setData(data);
var tg = $(this);
var opts = tg.treegrid('options');
opts.onBeforeExpand = function(row){
if (row.children1){
tg.treegrid('append',{
parent: row[opts.idField],
data: row.children1
});
row.children1 = undefined;
tg.treegrid('expand', row[opts.idField]);
}
return row.children1 == undefined;
};
return data;
}
function getNodeNameForLevel(level){
var nodeName;
switch(level){
case 1:
nodeName = 'Area';
break;
case 2:
nodeName = 'Process';
break;
case 3:
nodeName = 'Function';
break;
default:
nodeName = 'blank';
break;
}
return nodeName;
}
function onDrop(targetRow,sourceRow,point){
sourceRow.parentId = targetRow.id;
$('#tg').treegrid('refresh', targetRow.id);
$('#tg').treegrid('refresh', sourceRow.id);
}
function onBeforeDrop(targetRow,sourceRow,point){
var tl = getLevel(targetRow);
var sl = getLevel(sourceRow);
if(tl == sl && point != 'append')
{
return true;
}
if(tl == sl-1 && point == 'append')
{
return true;
}
return false;
}
/*function onDragEnter(targetRow,sourceRow){
//return true;
var tl = getLevel(targetRow);
var sl = getLevel(sourceRow);
//if(tl == sl || tl == (sl-1))
if(tl == (sl-1))
{
return true;
}
return false;
}*/
function onDragOver(targetRow,sourceRow){
//return true;
//alert("on drag before");
var tl = getLevel(targetRow);
var sl = getLevel(sourceRow);
/*if(tl == sl || tl == (sl-1))*/
if(tl == (sl-1))
{
return true;
}
return false;
}
function onStopDrag(row){
//console.dir($._data($('#tg')[0]).data.treegrid.options);
var rl = getLevel(row);
}
function onDragLeave(targetRow, sourceRow){
tl = getLevel(targetRow);
sl = getLevel(sourceRow);
$('#tg').treegrid('refresh', targetRow.id);
$('#tg').treegrid('refresh', sourceRow.id);
}
function onBeforeDrag(row){
var state = $.data(this, 'treegrid');
console.log("on before drag : ");
console.dir(state);
}
</script>
</body>
</html>
-----------------
my data is ---
Code:
[{
"id":1,
"name":"Area1",
"children": [{
"id": 11,
"name": "Process11",
"parentId": 1,
"children": [{
"id": 111,
"name": "Function111",
"parentId": 11,
"categoryid": "1",
"categoryname": "Screen",
"department": "UX",
"referenceSize": "M"
}]
},
{
"id": 12,
"name": "Process12",
"parentId": 1
}]
},{
"id":2,
"name":"Area2",
"children": [{
"id": 21,
"name": "Process21",
"parentId": 2,
"children": [{
"id": 211,
"name": "Function211",
"parentId": 21,
"categoryid": "1",
"categoryname": "Screen",
"department": "UX",
"referenceSize": "M"
}]
},
{
"id": 22,
"name": "Process22",
"parentId": 2
}]
}]

