EasyUI Forum
September 13, 2025, 04:20:18 PM *
Welcome, Guest. Please login or register.

Login with username, password and session length
News:
 
   Home   Help Search Login Register  
Poll
Question: how to make drag and drop perfectly for treegrid with multiple roots.
Treegrid - 0 (0%)
Drag and Drop - 0 (0%)
Total Voters: 0

Pages: [1]
  Print  
Author Topic: Drag and drop problem in treegrid.  (Read 8831 times)
kauser.ahmmed
Newbie
*
Posts: 3


View Profile Email
« on: December 03, 2014, 10:08:58 PM »

I want to implement drag and drop in treegrid like below:
 - 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
}]
}]
Logged
jarry
Administrator
Hero Member
*****
Posts: 2298


View Profile Email
« Reply #1 on: December 04, 2014, 06:59:11 PM »

Make sure you are using the newest 'treegrid-dnd.js' file. It can be downloaded from http://www.jeasyui.com/extension/treegrid_dnd.php.
Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines Valid XHTML 1.0! Valid CSS!