Articles in this section
Category / Section

How to customize Drag and Drop operation of Tree Grid

4 mins read
This article explains how to customize the drag-and-drop operation of the Tree Grid

We can customize row Drag and Drop operation using events such as rowDrop ,rowDragStartHelper, rowDragStart of Tree Grid. 

Here is the list of customizations that we have used in Drag and Drop operation.

 

 

 

  1. Hide Drag Icon of particular row using rowDataBound event and prevent Drag using    rowDragStartHelper

 

This is demonstrated in the below sample code in which we have used the rowDataBound event to hide the Drag Icon by empty the corresponding td in the TreeGrid row. Also we have canceled the drag operation of this corresponding row by setting args.cancel as true.

 

JS

let treegrid: TreeGrid = new TreeGrid(
        {
            dataSource: dragData,
            allowRowDragAndDrop: true,
            allowPaging:true,
            pageSettings: { pageSize: 10, pageCount: 2, pageSizes: true },
            childMapping: 'subtasks',
            height: '400',
            allowSelection: true,
            treeColumnIndex: 1,
            selectionSettings: { type: 'Multiple' },
            columns: [
                { field: 'taskID', headerText: 'Task ID', isPrimaryKey: true, textAlign: 'Right', width: 100 },
                { field: 'taskName', headerText: 'Task Name', width: 250 },
                { field: 'startDate', headerText: 'Start Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'endDate', headerText: 'End Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'duration', headerText: 'Duration', textAlign: 'Right', width: 120 },
                { field: 'progress', headerText: 'Progress', textAlign: 'Right', width: 120 },
                { field: 'priority', headerText: 'Priority', textAlign: 'Left', width: 135 },
            ],
        });
        treegrid.appendTo('#TreeGrid');
        treegrid.rowDataBound = function (args) {
          if (args.data.taskID == 1) {
            args.row.querySelector('td').innerHTML = " ";     //hide the DragIcon(td element)
          }
        };
        treegrid.rowDragStartHelper = function (args) {
            if (args.data[0].taskID == 1) {
              args.cancel = 'true';                 //prevent Drag operations by setting args.cancel as true
      
           }       
        };

 

Output


DragIcon hides for first row

 

                                                   Fig 1: DragIcon hides for first row

 

  1. Dragged rows can only be dropped in specific locations using rowDrop event and show indicator using rowDrag.

 

This is demonstrated in the below sample code in which we have prevented the drop action for the specific location (for example, parent records) using rowDrop event of the TreeGrid. In this event, we have canceled the drop action for the parent row by setting args.cancel as true and displayed an alert message ‘Dropping disabled for parent row” when we drop the dragged rows on the parent row. Also, we have shown an indicator (no-drop icon) for the cloned element dynamically to indicate which records have been prevented from the drop action using the rowDrag event.


JS

let treegrid: TreeGrid = new TreeGrid(
        {
            dataSource: dragData,
            allowRowDragAndDrop: true,
            allowPaging:true,
            pageSettings: { pageSize: 10, pageCount: 2, pageSizes: true },
            childMapping: 'subtasks',
            height: '400',
            allowSelection: true,
            treeColumnIndex: 1,
            selectionSettings: { type: 'Multiple' },
            columns: [
                { field: 'taskID', headerText: 'Task ID', isPrimaryKey: true, textAlign: 'Right', width: 100 },
                { field: 'taskName', headerText: 'Task Name', width: 250 },
                { field: 'startDate', headerText: 'Start Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'endDate', headerText: 'End Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'duration', headerText: 'Duration', textAlign: 'Right', width: 120 },
                { field: 'progress', headerText: 'Progress', textAlign: 'Right', width: 120 },
                { field: 'priority', headerText: 'Priority', textAlign: 'Left', width: 135 },
            ],
        });
        treegrid.appendTo('#TreeGrid');
    treegrid.rowDrop: function(args) {
               var treeGridobj = document.getElementsByClassName("e-treegrid")[0].ej2_instances;
               var data = treeGridobj[0].getCurrentViewRecords()[args.dropIndex];
               if (data.hasChildRecords) {        //apply your own customized condition                           
                   args.cancel = 'true'
                   alert("dropping disabled for parent row")     //alert message while dropping on parent row
               }
          };
         treegrid.rowDrag: function(args) {
               let rowEle: Element = args.target ? args.target.closest('tr') : null;
               let rowIdx: number = rowEle ? (rowEle as HTMLTableRowElement).rowIndex : -1;
               let currentData: ITreeData = this.getCurrentViewRecords()[rowIdx];
               if (rowIdx !== -1) {
                   if (currentData.hasChildRecords)
                       this.rowDragAndDropModule.addErrorElem();       //shown (no drop) icon for the parent records
                  }
            }               

 Output

 

prevent Drop for specified location

                                             Fig 2: Drop operation prevented for parent record

 

3. Customize the clone element using rowDragStart event.

 

This is demonstrated in the below sample code, in which we can customize the clone element using rowDragStart event of TreeGrid. In this event, we have modified the font family of the dragged or cloned element.

 

  JS

let treegrid: TreeGrid = new TreeGrid(
        {
            dataSource: dragData,
            allowRowDragAndDrop: true,
            allowPaging:true,
            pageSettings: { pageSize: 10, pageCount: 2, pageSizes: true },
            childMapping: 'subtasks',
            height: '400',
            allowSelection: true,
            treeColumnIndex: 1,
            selectionSettings: { type: 'Multiple' },
            columns: [
                { field: 'taskID', headerText: 'Task ID', isPrimaryKey: true, textAlign: 'Right', width: 100 },
                { field: 'taskName', headerText: 'Task Name', width: 250 },
                { field: 'startDate', headerText: 'Start Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'endDate', headerText: 'End Date', textAlign: 'Right', width: 135, format: { skeleton: 'yMd', type: 'date' }},
                { field: 'duration', headerText: 'Duration', textAlign: 'Right', width: 120 },
                { field: 'progress', headerText: 'Progress', textAlign: 'Right', width: 120 },
                { field: 'priority', headerText: 'Priority', textAlign: 'Left', width: 135 },
            ],
        });
        treegrid.appendTo('#TreeGrid');
        treegrid.rowDragStart: function(args) {
              args.rows[0].classList.add('e-dragclonerow');         //customize the dragged row here
       }     

 

<style>
     .e-dragclonerow { 
          font-family: fantasy; 
      } 
</style>

 

Output

Customization shown on dragged row

                                              Fig 3: Customization shown for dragged row

 

Sample Links: 

 

JavaScript Platform: - JavaScriptDemo

React Platform: -  ReactDemo

Angular Platform:- AngularDemo

Vue Platform:-  Vue Demo

 

 

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please  to leave a comment
Access denied
Access denied