138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function ($) {
 | |
|   // register namespace
 | |
|   $.extend(true, window, {
 | |
|     "Slick": {
 | |
|       "RowMoveManager": RowMoveManager
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   function RowMoveManager(options) {
 | |
|     var _grid;
 | |
|     var _canvas;
 | |
|     var _dragging;
 | |
|     var _self = this;
 | |
|     var _handler = new Slick.EventHandler();
 | |
|     var _defaults = {
 | |
|       cancelEditOnDrag: false
 | |
|     };
 | |
| 
 | |
|     function init(grid) {
 | |
|       options = $.extend(true, {}, _defaults, options);
 | |
|       _grid = grid;
 | |
|       _canvas = _grid.getCanvasNode();
 | |
|       _handler
 | |
|         .subscribe(_grid.onDragInit, handleDragInit)
 | |
|         .subscribe(_grid.onDragStart, handleDragStart)
 | |
|         .subscribe(_grid.onDrag, handleDrag)
 | |
|         .subscribe(_grid.onDragEnd, handleDragEnd);
 | |
|     }
 | |
| 
 | |
|     function destroy() {
 | |
|       _handler.unsubscribeAll();
 | |
|     }
 | |
| 
 | |
|     function handleDragInit(e, dd) {
 | |
|       // prevent the grid from cancelling drag'n'drop by default
 | |
|       e.stopImmediatePropagation();
 | |
|     }
 | |
| 
 | |
|     function handleDragStart(e, dd) {
 | |
|       var cell = _grid.getCellFromEvent(e);
 | |
| 
 | |
|       if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
 | |
|         _grid.getEditorLock().cancelCurrentEdit();
 | |
|       }
 | |
| 
 | |
|       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 = $("<div class='slick-reorder-proxy'/>")
 | |
|           .css("position", "absolute")
 | |
|           .css("zIndex", "99999")
 | |
|           .css("width", $(_canvas).innerWidth())
 | |
|           .css("height", rowHeight * selectedRows.length)
 | |
|           .appendTo(_canvas);
 | |
| 
 | |
|       dd.guide = $("<div class='slick-reorder-guide'/>")
 | |
|           .css("position", "absolute")
 | |
|           .css("zIndex", "99998")
 | |
|           .css("width", $(_canvas).innerWidth())
 | |
|           .css("top", -1000)
 | |
|           .appendTo(_canvas);
 | |
| 
 | |
|       dd.insertBefore = -1;
 | |
|     }
 | |
| 
 | |
|     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); |