draggable.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. (function ($)
  2. {
  3. window['treeDraggable'] = function (leftTree, rightTree)
  4. {
  5. var g = leftTree, p = leftTree.options;
  6. g.nodeDroptip = $("<div class='l-drag-nodedroptip' style='display:none'></div>").appendTo('body');
  7. g.tree.ligerDrag({ revert: true, animate: false,
  8. proxyX: 20, proxyY: 20,
  9. proxy: function (draggable, e)
  10. {
  11. var src = g._getSrcElementByEvent(e);
  12. if (src.node)
  13. {
  14. var content = "dragging";
  15. if (p.nodeDraggingRender)
  16. {
  17. content = p.nodeDraggingRender(draggable.draggingNodes, draggable, g);
  18. }
  19. else
  20. {
  21. content = "";
  22. var appended = false;
  23. for (var i in draggable.draggingNodes)
  24. {
  25. var node = draggable.draggingNodes[i];
  26. if (appended) content += ",";
  27. content += node.text;
  28. appended = true;
  29. }
  30. }
  31. var proxy = $("<div class='l-drag-proxy' style='display:none'><div class='l-drop-icon l-drop-no'></div>" + content + "</div>").appendTo('body');
  32. return proxy;
  33. }
  34. },
  35. onRevert: function () { return false; },
  36. onRendered: function ()
  37. {
  38. this.set('cursor', 'default');
  39. g.children[this.id] = this;
  40. },
  41. onStartDrag: function (current, e)
  42. {
  43. if (e.button == 2) return false;
  44. this.set('cursor', 'default');
  45. var src = g._getSrcElementByEvent(e);
  46. if (src.checkbox) return false;
  47. if (p.checkbox)
  48. {
  49. var checked = g.getChecked();
  50. this.draggingNodes = [];
  51. for (var i in checked)
  52. {
  53. this.draggingNodes.push(checked[i].data);
  54. }
  55. if (!this.draggingNodes || !this.draggingNodes.length) return false;
  56. }
  57. else
  58. {
  59. this.draggingNodes = [src.data];
  60. }
  61. this.draggingNode = src.data;
  62. this.set('cursor', 'move');
  63. g.nodedragging = true;
  64. this.validRange = {
  65. top: rightTree.tree.offset().top,
  66. bottom: rightTree.tree.offset().top + rightTree.tree.height() + 20,
  67. left: rightTree.tree.offset().left,
  68. right: rightTree.tree.offset().left + rightTree.tree.width()
  69. };
  70. },
  71. onDrag: function (current, e)
  72. {
  73. var nodedata = this.draggingNode;
  74. if (!nodedata) return false;
  75. var nodes = this.draggingNodes ? this.draggingNodes : [nodedata];
  76. if (g.nodeDropIn == null) g.nodeDropIn = -1;
  77. var pageX = e.pageX;
  78. var pageY = e.pageY;
  79. var visit = false;
  80. var validRange = this.validRange;
  81. if (pageX < validRange.left || pageX > validRange.right
  82. || pageY > validRange.bottom || pageY < validRange.top)
  83. {
  84. g.nodeDropIn = -1;
  85. g.nodeDroptip.hide();
  86. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes l-drop-add").addClass("l-drop-no");
  87. return;
  88. }
  89. for (var i = 0, l = rightTree.nodes.length; i < l; i++)
  90. {
  91. var nd = rightTree.nodes[i];
  92. var treedataindex = nd['treedataindex'];
  93. if (nodedata['treedataindex'] == treedataindex) visit = true;
  94. var isAfter = visit ? true : false;
  95. if (g.nodeDropIn != -1 && g.nodeDropIn != treedataindex) continue;
  96. var jnode = $("li[treedataindex=" + treedataindex + "] div:first", rightTree.tree);
  97. var offset = jnode.offset();
  98. var range = {
  99. top: offset.top,
  100. bottom: offset.top + jnode.height(),
  101. left: rightTree.tree.offset().left,
  102. right: rightTree.tree.offset().left + rightTree.tree.width()
  103. };
  104. if (pageX > range.left && pageX < range.right && pageY > range.top && pageY < range.bottom)
  105. {
  106. var lineTop = offset.top;
  107. if (isAfter) lineTop += jnode.height();
  108. g.nodeDroptip.css({
  109. left: range.left,
  110. top: lineTop,
  111. width: range.right - range.left
  112. }).show();
  113. g.nodeDropIn = treedataindex;
  114. g.nodeDropDir = isAfter ? "bottom" : "top";
  115. if (pageY > range.top + 7 && pageY < range.bottom - 7)
  116. {
  117. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-yes").addClass("l-drop-add");
  118. g.nodeDroptip.hide();
  119. g.nodeDropInParent = true;
  120. }
  121. else
  122. {
  123. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-add").addClass("l-drop-yes");
  124. g.nodeDroptip.show();
  125. g.nodeDropInParent = false;
  126. }
  127. return;
  128. }
  129. else if (g.nodeDropIn != -1)
  130. {
  131. g.nodeDropIn = -1;
  132. g.nodeDropInParent = false;
  133. g.nodeDroptip.hide();
  134. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes l-drop-add").addClass("l-drop-no");
  135. }
  136. }
  137. g.nodeDropIn = null;
  138. g.nodeDropInParent = true;
  139. g.nodeDroptip.hide();
  140. this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-add").addClass("l-drop-yes");
  141. },
  142. onStopDrag: function (current, e)
  143. {
  144. var nodes = this.draggingNodes;
  145. g.nodedragging = false;
  146. if (g.nodeDropIn != -1)
  147. {
  148. for (var i = 0; i < nodes.length; i++)
  149. {
  150. var children = nodes[i].children;
  151. if (children)
  152. {
  153. nodes = $.grep(nodes, function (node, i)
  154. {
  155. var isIn = $.inArray(node, children) == -1;
  156. return isIn;
  157. });
  158. }
  159. }
  160. function removeAttr(node)
  161. {
  162. delete node['treedataindex'];
  163. delete node['__status'];
  164. var children = node.children;
  165. if (children)
  166. {
  167. $.each(children, function ()
  168. {
  169. removeAttr(this);
  170. });
  171. }
  172. }
  173. for (var i in nodes)
  174. {
  175. var node = nodes[i];
  176. var newnode = $.extend(true, {}, node);
  177. removeAttr(newnode);
  178. if (g.nodeDropInParent)
  179. {
  180. g.remove(node);
  181. rightTree.append(g.nodeDropIn, [newnode]);
  182. }
  183. else
  184. {
  185. g.remove(node);
  186. rightTree.append(rightTree.getParent(g.nodeDropIn), [newnode], g.nodeDropIn, g.nodeDropDir == "bottom")
  187. }
  188. }
  189. g.nodeDropIn = -1;
  190. }
  191. g.nodeDroptip.hide();
  192. this.set('cursor', 'default');
  193. }
  194. });
  195. }
  196. })(jQuery)