kendo-uikendo-gridkendo-draggablekendo-droptarget

Is it possible to drag row outside kendo grid and sort within at same time?


I'm able to drag rows within the kendo ui grid. Seperately able to drag rows outside the grid to another html element.

Is it possible to do both at same time?

For within grid:

Draggable within the grid:

grid.table.kendoSortable({
                    filter: ">tbody >tr",
                    cursor: "move",
                    hint: function(element) {
                        return $('<div class="k-grid k-widget"><table><tbody><tr>' + element.html() + '</tr></tbody></table></div>');
                    },
                    container: ".etr-watchlist_grid tbody",
                    change: function(e) {
                        let oldIndex = e.oldIndex,
                            newIndex = e.newIndex,
                            data = grid.dataSource.data(),
                            dataItem = grid.dataSource.getByUid(e.item.data("uid"));

                        grid.dataSource.remove(dataItem);
                        grid.dataSource.insert(newIndex, dataItem);
                    }
                });

Drag outside the Grid:

$(".myGrid table tbody > tr").kendoDraggable({
                    group: "gridGroup",
                    threshold: 100,
                    hint: function(e) {
                        return $('<div class="k-grid k-widget"><table><tbody><tr>' + e.html() + '</tr></tbody></table></div>');
                    }
                });


$(".dropHere").kendoDropTarget({
                                group: "gridGroup",
                                drop: function(e) { 
                                    e.draggable.hint.hide();

                                    var txt = '';
                                    $(e.draggable.element[0]).find("td").each(function(idx, td){
                                      txt += $(td).text() + '\n';
                                    });
                                    e.dropTarget.text(txt);
                                }
                            });


                    });

Solution

  • I have taken an example of row reordering via drag from the telerik forums: http://www.telerik.com/forums/drag-and-drop-reordering

    I have augmented the example to add dragging of rows outside the grid to multiple targets as well:

    DEMO

    var grid = $("#grid").kendoGrid({
        dataSource: dataSource,  
        selectable: true,    
        columns: ["id", "text", "position"]            
    }).data("kendoGrid");                  
    
    grid.table.kendoDraggable({
        filter: "tbody > tr",
        group: "gridGroup",
        threshold: 100,
        hint: function(e) {
            return $('<div class="k-grid k-widget"><table><tbody><tr>' + e.html() + '</tr></tbody></table></div>');
        }
    });
    
    grid.table.kendoDropTarget({
        group: "gridGroup",
        drop: function(e) {        
            e.draggable.hint.hide();
            var target = dataSource.getByUid($(e.draggable.currentTarget).data("uid")),
                dest = $(document.elementFromPoint(e.clientX, e.clientY));
    
            if (dest.is("th")) {
                return;
            }       
            dest = dataSource.getByUid(dest.parent().data("uid"));
    
            //not on same item
            if (target.get("id") !== dest.get("id")) {
                //reorder the items
                var tmp = target.get("position");
                target.set("position", dest.get("position"));
                dest.set("position", tmp);
    
                dataSource.sort({ field: "position", dir: "asc" });
            }                
        }
    });
    
    $(".dropTarg").kendoDropTarget({
        group: "gridGroup",
        drop: function(e) { 
          console.log(e.draggable)
            e.draggable.hint.hide();
    
            var txt = '';
            $(e.draggable.currentTarget).find("td").each(function(idx, td){
              txt += $(td).text() + '\n';
            });
            e.dropTarget.text(txt);
        }
    });