Search code examples
jqueryjqgridjquery-ui-draggablejquery-droppable

Is there a way to drag a row from a JQGrid to a droppable textfield using the gridDnD plugin?


I would like to drag a row from a JQGrid to a text input field and add a column's text from the dropped row to the end of the text in the input.

Obviously this is a long way from the answer, but dragging a row from a grid with this set up on it (where #inputTextField is a 'droppable' text field) results in the JavaScript error this.p is undefined:

$("#searchResultsGrid").jqGrid('gridDnD',
    {
         connectWith:   '#inputTextField"
    }
);

This is because the destination is obviously not a JQGrid and does not have this.p defined. I've tried a few different things...maybe there is a way I can 'trick' the drop event into working? Thank you so much for any help :)


Solution

  • I figured it out!! First, make the grid rows draggable (this function should be called in your gridComplete grid event handler):

    function makeGridRowsDraggable() {
    
            var $searchResultsGrid  =   $("#searchResultsGrid"),
                $searchResultsRows =    $("#searchResultsContainer .ui-row-ltr");
    
            $searchResultsRows.css("cursor","move").draggable("destroy").draggable({
                revert:     "false",
                appendTo:   'body',
                cursor:     "move",
                cursorAt:   {
                                top: 10,
                                left: -5
                            },
                helper:     function(event) {
    
                                //get a hold of the row id
                                var rowId = $(this).attr('id');
    
                                //use the row id you found to get the column text; by using the getCell method as below, 
                                //the 'unformatter' on that column is called; so, if value was formatted using a
                                //formatter, this method will return the unformatted value 
                                //(as long as you defined an unformatter/using a built-in formatter)
                                var theValue = $searchResultsGrid.jqGrid('getCell', rowId, 'desiredValue');
    
                                //set the data on this to the value to grab when you drop into input box
                                $(this).data('colValue', theValue);
    
                                return $("<div class='draggedValue ui-widget-header ui-corner-all'>" + theValue+ "</div>");
                            },
                start:      function(event, ui) {
                                //fade the grid
                                $(this).parent().fadeTo('fast', 0.5);
                            },
                stop:       function(event, ui) {
                                $(this).parent().fadeTo(0, 1);
                            }
            });
        }
    

    Then, create droppable elements:

    function createDroppableElements() {
    
        $("#inputFieldOne, #inputFieldTwo").droppable({
            tolerance:  'pointer',
            hoverClass: 'active',
            activate:   function(event, ui) {
                            $(this).addClass("over");
                        },
            deactivate: function(event, ui) {
                            $(this).removeClass("over");
                        },
    
            drop:       function(event, ui) {
                            var theValue = ui.draggable.data('colValue');
                            theValue = theValue .replace(/<br>/gi,'; ');
                            console.log("dropped value: " + theValue );  
    
                            updateText($(this), theValue);
                        }
        });
    }
    

    Create a helper method to append text to text field (appending a trailing ';'):

    function updateText(txtTarget, theValue) {
    
        var currentValue = txtTarget.val().trim();
    
        if (currentValue.length > 0 
            && currentValue.substr(currentValue.length-1) !== ";") 
            currentValue = currentValue + '; ';
    
        currentValue += theValue;
    
    
        txtTarget.val(currentValue);
    }