(function($) { // register namespace $.extend(true, window, { "Slick": { "RowMoveManager": RowMoveManager } }); function RowMoveManager() { var _grid; var _canvas; var _dragging; var _self = this; function init(grid) { _grid = grid; _canvas = _grid.getCanvasNode(); _grid.onDragStart.subscribe(handleDragStart); _grid.onDrag.subscribe(handleDrag); _grid.onDragEnd.subscribe(handleDragEnd); } function destroy() { _grid.onDragStart.unsubscribe(handleDragStart); _grid.onDrag.unsubscribe(handleDrag); _grid.onDragEnd.unsubscribe(handleDragEnd); } function handleDragStart(e,dd) { var cell = _grid.getCellFromEvent(e); if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) { return false; } _dragging = true; e.stopImmediatePropagation(); var selectedRows = _grid.getSelectedRows(); if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) { selectedRows = [cell.row]; _grid.setSelectedRows(selectedRows); } var rowHeight = _grid.getOptions().rowHeight; dd.selectedRows = selectedRows; dd.selectionProxy = $("
") .css("position", "absolute") .css("zIndex", "99999") .css("width", $(_canvas).innerWidth()) .css("height", rowHeight*selectedRows.length) .appendTo(_canvas); dd.guide = $("") .css("position", "absolute") .css("zIndex", "99998") .css("width", $(_canvas).innerWidth()) .css("top", -1000) .appendTo(_canvas); dd.insertBefore = -1; return $("").appendTo(_canvas); } function handleDrag(e,dd) { if (!_dragging) { return; } e.stopImmediatePropagation(); var top = e.pageY - $(_canvas).offset().top; dd.selectionProxy.css("top",top-5); var insertBefore = Math.max(0,Math.min(Math.round(top/_grid.getOptions().rowHeight),_grid.getDataLength())); if (insertBefore !== dd.insertBefore) { var eventData = { "rows": dd.selectedRows, "insertBefore": insertBefore }; if (_self.onBeforeMoveRows.notify(eventData) === false) { dd.guide.css("top", -1000); dd.canMove = false; } else { dd.guide.css("top",insertBefore*_grid.getOptions().rowHeight); dd.canMove = true; } dd.insertBefore = insertBefore; } } function handleDragEnd(e,dd) { if (!_dragging) { return; } _dragging = false; e.stopImmediatePropagation(); dd.guide.remove(); dd.selectionProxy.remove(); if (dd.canMove) { var eventData = { "rows": dd.selectedRows, "insertBefore": dd.insertBefore }; // TODO: _grid.remapCellCssClasses ? _self.onMoveRows.notify(eventData); } } $.extend(this, { "onBeforeMoveRows": new Slick.Event(), "onMoveRows": new Slick.Event(), "init": init, "destroy": destroy }); } })(jQuery);