You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 regels
3.6 KiB

  1. (function ($) {
  2. // register namespace
  3. $.extend(true, window, {
  4. "Slick": {
  5. "RowMoveManager": RowMoveManager
  6. }
  7. });
  8. function RowMoveManager(options) {
  9. var _grid;
  10. var _canvas;
  11. var _dragging;
  12. var _self = this;
  13. var _handler = new Slick.EventHandler();
  14. var _defaults = {
  15. cancelEditOnDrag: false
  16. };
  17. function init(grid) {
  18. options = $.extend(true, {}, _defaults, options);
  19. _grid = grid;
  20. _canvas = _grid.getCanvasNode();
  21. _handler
  22. .subscribe(_grid.onDragInit, handleDragInit)
  23. .subscribe(_grid.onDragStart, handleDragStart)
  24. .subscribe(_grid.onDrag, handleDrag)
  25. .subscribe(_grid.onDragEnd, handleDragEnd);
  26. }
  27. function destroy() {
  28. _handler.unsubscribeAll();
  29. }
  30. function handleDragInit(e, dd) {
  31. // prevent the grid from cancelling drag'n'drop by default
  32. e.stopImmediatePropagation();
  33. }
  34. function handleDragStart(e, dd) {
  35. var cell = _grid.getCellFromEvent(e);
  36. if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
  37. _grid.getEditorLock().cancelCurrentEdit();
  38. }
  39. if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) {
  40. return false;
  41. }
  42. _dragging = true;
  43. e.stopImmediatePropagation();
  44. var selectedRows = _grid.getSelectedRows();
  45. if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) {
  46. selectedRows = [cell.row];
  47. _grid.setSelectedRows(selectedRows);
  48. }
  49. var rowHeight = _grid.getOptions().rowHeight;
  50. dd.selectedRows = selectedRows;
  51. dd.selectionProxy = $("<div class='slick-reorder-proxy'/>")
  52. .css("position", "absolute")
  53. .css("zIndex", "99999")
  54. .css("width", $(_canvas).innerWidth())
  55. .css("height", rowHeight * selectedRows.length)
  56. .appendTo(_canvas);
  57. dd.guide = $("<div class='slick-reorder-guide'/>")
  58. .css("position", "absolute")
  59. .css("zIndex", "99998")
  60. .css("width", $(_canvas).innerWidth())
  61. .css("top", -1000)
  62. .appendTo(_canvas);
  63. dd.insertBefore = -1;
  64. }
  65. function handleDrag(e, dd) {
  66. if (!_dragging) {
  67. return;
  68. }
  69. e.stopImmediatePropagation();
  70. var top = e.pageY - $(_canvas).offset().top;
  71. dd.selectionProxy.css("top", top - 5);
  72. var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
  73. if (insertBefore !== dd.insertBefore) {
  74. var eventData = {
  75. "rows": dd.selectedRows,
  76. "insertBefore": insertBefore
  77. };
  78. if (_self.onBeforeMoveRows.notify(eventData) === false) {
  79. dd.guide.css("top", -1000);
  80. dd.canMove = false;
  81. } else {
  82. dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
  83. dd.canMove = true;
  84. }
  85. dd.insertBefore = insertBefore;
  86. }
  87. }
  88. function handleDragEnd(e, dd) {
  89. if (!_dragging) {
  90. return;
  91. }
  92. _dragging = false;
  93. e.stopImmediatePropagation();
  94. dd.guide.remove();
  95. dd.selectionProxy.remove();
  96. if (dd.canMove) {
  97. var eventData = {
  98. "rows": dd.selectedRows,
  99. "insertBefore": dd.insertBefore
  100. };
  101. // TODO: _grid.remapCellCssClasses ?
  102. _self.onMoveRows.notify(eventData);
  103. }
  104. }
  105. $.extend(this, {
  106. "onBeforeMoveRows": new Slick.Event(),
  107. "onMoveRows": new Slick.Event(),
  108. "init": init,
  109. "destroy": destroy
  110. });
  111. }
  112. })(jQuery);