draggable.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. (function ($)
  2. {
  3. window['gridDraggable'] = function (leftGrid, rightGrid)
  4. {
  5. var g = leftGrid, p = leftGrid.options;
  6. g.rowDroptip = $("<div class='l-drag-rowdroptip' style='display:none'></div>").appendTo('body');
  7. g.gridbody.add(g.f.gridbody).ligerDrag({ revert: true, animate: false,
  8. proxyX: 0, proxyY: 0,
  9. proxy: function (draggable, e)
  10. {
  11. var src = g._getSrcElementByEvent(e);
  12. if (src.row)
  13. {
  14. var content = p.draggingMessage.replace(/{count}/, draggable.draggingRows ? draggable.draggingRows.length : 1);
  15. if (p.rowDraggingRender)
  16. {
  17. content = p.rowDraggingRender(draggable.draggingRows, draggable, g);
  18. }
  19. var proxy = $("<div class='l-drag-proxy' style='display:none'><div class='l-drop-icon l-drop-no'></div>" + content + "</div>").appendTo('body');
  20. return proxy;
  21. }
  22. },
  23. onRevert: function () { return false; },
  24. onRendered: function ()
  25. {
  26. this.set('cursor', 'default');
  27. g.children[this.id] = this;
  28. },
  29. onStartDrag: function (current, e)
  30. {
  31. if (e.button == 2) return false;
  32. if (g.colresizing) return false;
  33. if (!g.columns.length) return false;
  34. this.set('cursor', 'default');
  35. var src = g._getSrcElementByEvent(e);
  36. if (!src.cell || !src.data || src.checkbox) return false;
  37. var ids = src.cell.id.split('|');
  38. var column = g._columns[ids[ids.length - 1]];
  39. if (src.rownumberscell || src.detailcell || src.checkboxcell || column == g.columns[0])
  40. {
  41. if (g.enabledCheckbox())
  42. {
  43. this.draggingRows = g.getSelecteds();
  44. if (!this.draggingRows || !this.draggingRows.length) return false;
  45. }
  46. else
  47. {
  48. this.draggingRows = [src.data];
  49. }
  50. this.draggingRow = src.data;
  51. g.rowDropIn = -1;
  52. this.set('cursor', 'move');
  53. g.rowdragging = true;
  54. this.validRange = {
  55. top: rightGrid.gridbody.offset().top,
  56. bottom: rightGrid.gridbody.offset().top + rightGrid.gridbody.height() + 20,
  57. left: rightGrid.grid.offset().left - 10,
  58. right: rightGrid.grid.offset().left + rightGrid.grid.width() + 10
  59. };
  60. }
  61. else
  62. {
  63. return false;
  64. }
  65. },
  66. onDrag: function (current, e)
  67. {
  68. var rowdata = this.draggingRow;
  69. if (!rowdata) return false;
  70. var rows = this.draggingRows ? this.draggingRows : [rowdata];
  71. if (g.colresizing) return false;
  72. if (g.rowDropIn == null) g.rowDropIn = -1;
  73. var pageX = e.pageX;
  74. var pageY = e.pageY;
  75. var visit = false;
  76. var validRange = this.validRange;
  77. if (pageX < validRange.left || pageX > validRange.right
  78. || pageY > validRange.bottom || pageY < validRange.top)
  79. {
  80. g.rowDropIn = -1;
  81. g.rowDroptip.hide();
  82. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes l-drop-add").addClass("l-drop-no");
  83. return;
  84. }
  85. for (var i in rightGrid.rows)
  86. {
  87. var rd = rightGrid.rows[i];
  88. var rowid = rd['__id'];
  89. if (rowdata == rd) visit = true;
  90. if ($.inArray(rd, rows) != -1) continue;
  91. var isAfter = visit ? true : false;
  92. if (g.rowDropIn != -1 && g.rowDropIn != rowid) continue;
  93. var rowobj = rightGrid.getRowObj(rowid);
  94. var offset = $(rowobj).offset();
  95. var range = {
  96. top: offset.top - 4,
  97. bottom: offset.top + $(rowobj).height() + 4,
  98. left: rightGrid.grid.offset().left,
  99. right: rightGrid.grid.offset().left + rightGrid.grid.width()
  100. };
  101. if (pageX > range.left && pageX < range.right && pageY > range.top && pageY < range.bottom)
  102. {
  103. var lineTop = offset.top;
  104. if (isAfter) lineTop += $(rowobj).height();
  105. g.rowDroptip.css({
  106. left: range.left,
  107. top: lineTop,
  108. width: range.right - range.left
  109. }).show();
  110. g.rowDropIn = rowid;
  111. g.rowDropDir = isAfter ? "bottom" : "top";
  112. if (p.tree && pageY > range.top + 5 && pageY < range.bottom - 5)
  113. {
  114. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-yes").addClass("l-drop-add");
  115. g.rowDroptip.hide();
  116. g.rowDropInParent = true;
  117. }
  118. else
  119. {
  120. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-add").addClass("l-drop-yes");
  121. g.rowDroptip.show();
  122. g.rowDropInParent = false;
  123. }
  124. return;
  125. }
  126. else if (g.rowDropIn != -1)
  127. {
  128. g.rowDropIn = -1;
  129. g.rowDropInParent = false;
  130. g.rowDroptip.hide();
  131. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes l-drop-add").addClass("l-drop-no");
  132. }
  133. }
  134. g.rowDropIn = null;
  135. g.rowDropInParent = true;
  136. g.rowDroptip.hide();
  137. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-add").addClass("l-drop-yes");
  138. },
  139. onStopDrag: function (current, e)
  140. {
  141. var rows = this.draggingRows;
  142. for (var i = 0; i < rows.length; i++)
  143. {
  144. var children = rows[i].children;
  145. if (children)
  146. {
  147. rows = $.grep(rows, function (node, i)
  148. {
  149. var isIn = $.inArray(node, children) == -1;
  150. return isIn;
  151. });
  152. }
  153. }
  154. function formatRecord(rows)
  155. {
  156. $.each(rows, function ()
  157. {
  158. g.formatRecord(this);
  159. if (this.children)
  160. formatRecord(this.children);
  161. });
  162. }
  163. g.rowDroptip.hide();
  164. g.rowdragging = false;
  165. if (g.rowDropIn != -1)
  166. {
  167. var newrows = [];
  168. $.each(rows, function ()
  169. {
  170. var newrow = $.extend(true, {}, this);
  171. newrows.push(newrow);
  172. });
  173. formatRecord(newrows);
  174. g.removeRange(rows);
  175. if (p.tree)
  176. {
  177. var neardata, prow;
  178. if (g.rowDropInParent)
  179. {
  180. prow = rightGrid.getRow(g.rowDropIn);
  181. }
  182. else
  183. {
  184. neardata = rightGrid.getRow(g.rowDropIn);
  185. prow = rightGrid.getParent(neardata);
  186. }
  187. rightGrid.appendRange(newrows, prow, neardata, g.rowDropDir != "bottom");
  188. rightGrid.trigger('rowDragDrop', {
  189. rows: newrows,
  190. parent: prow,
  191. near: neardata,
  192. after: g.rowDropDir == "bottom"
  193. });
  194. }
  195. else
  196. {
  197. rightGrid.moveRange(newrows, g.rowDropIn, g.rowDropDir == "bottom");
  198. rightGrid.trigger('rowDragDrop', {
  199. rows: rows,
  200. parent: prow,
  201. near: rightGrid.getRow(g.rowDropIn),
  202. after: g.rowDropDir == "bottom"
  203. });
  204. }
  205. }
  206. g.rowDroptip.hide();
  207. this.set('cursor', 'default');
  208. }
  209. });
  210. }
  211. })(jQuery)