index.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import GroupNode from './GroupNode';
  2. var DEFAULT_TOP_Z_INDEX = -1000;
  3. var DEFAULT_BOTTOM_Z_INDEX = -10000;
  4. var Group = /** @class */ (function () {
  5. function Group(_a) {
  6. var _this = this;
  7. var lf = _a.lf;
  8. this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
  9. this.nodeGroupMap = new Map();
  10. this.graphRendered = function (data) {
  11. // 如果节点
  12. if (data && data.nodes) {
  13. data.nodes.forEach(function (node) {
  14. if (node.children) {
  15. node.children.forEach(function (nodeId) {
  16. _this.nodeGroupMap.set(nodeId, node.id);
  17. });
  18. }
  19. });
  20. }
  21. };
  22. this.appendNodeToGroup = function (_a) {
  23. var data = _a.data;
  24. // 如果这个节点之前已经在group中了,则将其从之前的group中移除
  25. var preGroupId = _this.nodeGroupMap.get(data.id);
  26. if (preGroupId) {
  27. var preGroup = _this.lf.getNodeModelById(preGroupId);
  28. preGroup.removeChild(data.id);
  29. _this.nodeGroupMap.delete(data.id);
  30. preGroup.setAllowAppendChild(false);
  31. }
  32. // 然后再判断这个节点是否在某个group中,如果在,则将其添加到对应的group中
  33. var nodeModel = _this.lf.getNodeModelById(data.id);
  34. var bounds = nodeModel.getBounds();
  35. var group = _this.getGroup(bounds, data);
  36. if (!group)
  37. return;
  38. var isAllowAppendIn = group.isAllowAppendIn(data);
  39. if (!isAllowAppendIn) {
  40. _this.lf.emit('group:not-allowed', {
  41. group: group.getData(),
  42. node: data,
  43. });
  44. return;
  45. }
  46. group.addChild(data.id);
  47. _this.nodeGroupMap.set(data.id, group.id);
  48. group.setAllowAppendChild(false);
  49. // 如果这个节点是分组,那么将其子节点也记录下来
  50. if (nodeModel.isGroup) {
  51. data.children.forEach(function (nodeId) {
  52. _this.nodeGroupMap.set(nodeId, data.id);
  53. });
  54. _this.nodeSelected({ data: data, isSelected: false, isMultiple: false });
  55. }
  56. };
  57. this.deleteGroupChild = function (_a) {
  58. var data = _a.data;
  59. // 如果删除的是分组节点,则同时删除分组的子节点
  60. if (data.children) {
  61. data.children.forEach(function (nodeId) {
  62. _this.nodeGroupMap.delete(nodeId);
  63. _this.lf.deleteNode(nodeId);
  64. });
  65. }
  66. var groupId = _this.nodeGroupMap.get(data.id);
  67. if (groupId) {
  68. var group = _this.lf.getNodeModelById(groupId);
  69. group.removeChild(data.id);
  70. _this.nodeGroupMap.delete(data.id);
  71. }
  72. };
  73. this.setActiveGroup = function (_a) {
  74. var data = _a.data;
  75. var nodeModel = _this.lf.getNodeModelById(data.id);
  76. var bounds = nodeModel.getBounds();
  77. var newGroup = _this.getGroup(bounds, data);
  78. if (_this.activeGroup) {
  79. _this.activeGroup.setAllowAppendChild(false);
  80. }
  81. if (!newGroup || (nodeModel.isGroup && newGroup.id === data.id))
  82. return;
  83. var isAllowAppendIn = newGroup.isAllowAppendIn(data);
  84. if (!isAllowAppendIn) {
  85. return;
  86. }
  87. _this.activeGroup = newGroup;
  88. _this.activeGroup.setAllowAppendChild(true);
  89. };
  90. /**
  91. * 1. 分组节点默认在普通节点下面。
  92. * 2. 分组节点被选中后,会将分组节点以及其内部的其他分组节点放到其余分组节点的上面。
  93. * 3. 分组节点取消选中后,不会将分组节点重置为原来的高度。
  94. * 4. 由于LogicFlow核心目标是支持用户手动绘制流程图,所以不考虑一张流程图超过1000个分组节点的情况。
  95. */
  96. this.nodeSelected = function (_a) {
  97. var data = _a.data, isMultiple = _a.isMultiple, isSelected = _a.isSelected;
  98. var nodeModel = _this.lf.getNodeModelById(data.id);
  99. _this.toFrontGroup(nodeModel);
  100. // 重置所有的group zIndex,防止group节点zIndex增长为正。
  101. if (_this.topGroupZIndex > DEFAULT_TOP_Z_INDEX) {
  102. _this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
  103. var allGroups = _this.lf.graphModel.nodes
  104. .filter(function (node) { return node.isGroup; })
  105. .sort(function (a, b) { return a.zIndex - b.zIndex; });
  106. var preZIndex = 0;
  107. for (var i = 0; i < allGroups.length; i++) {
  108. var group = allGroups[i];
  109. if (group.zIndex !== preZIndex) {
  110. _this.topGroupZIndex++;
  111. preZIndex = group.zIndex;
  112. }
  113. group.setZIndex(_this.topGroupZIndex);
  114. }
  115. }
  116. // FIX #1004
  117. // 如果节点被多选,
  118. // 这个节点是分组,则将分组的所有子节点取消选中
  119. // 这个节点是分组的子节点,且其所属分组节点已选,则取消选中
  120. if (isMultiple && isSelected) {
  121. if (nodeModel.isGroup) {
  122. nodeModel.children.forEach(function (child) {
  123. var childModel = _this.lf.graphModel.getElement(child);
  124. childModel.setSelected(false);
  125. });
  126. }
  127. else {
  128. var groupId = _this.nodeGroupMap.get(data.id);
  129. if (groupId) {
  130. var groupModel = _this.lf.getNodeModelById(groupId);
  131. groupModel.isSelected && nodeModel.setSelected(false);
  132. }
  133. }
  134. }
  135. };
  136. this.toFrontGroup = function (model) {
  137. if (!model || !model.isGroup) {
  138. return;
  139. }
  140. _this.topGroupZIndex++;
  141. model.setZIndex(_this.topGroupZIndex);
  142. if (model.children) {
  143. model.children.forEach(function (nodeId) {
  144. var node = _this.lf.getNodeModelById(nodeId);
  145. _this.toFrontGroup(node);
  146. });
  147. }
  148. };
  149. lf.register(GroupNode);
  150. this.lf = lf;
  151. lf.graphModel.addNodeMoveRules(function (model, deltaX, deltaY) {
  152. if (model.isGroup) { // 如果移动的是分组,那么分组的子节点也跟着移动。
  153. var nodeIds = _this.getNodeAllChild(model);
  154. lf.graphModel.moveNodes(nodeIds, deltaX, deltaY, true);
  155. return true;
  156. }
  157. var groupModel = lf.getNodeModelById(_this.nodeGroupMap.get(model.id));
  158. if (groupModel && groupModel.isRestrict) { // 如果移动的节点存在分组中,且这个分组禁止子节点移出去。
  159. var _a = model.getBounds(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;
  160. var r = groupModel.isAllowMoveTo({
  161. x1: x1 + deltaX,
  162. y1: y1 + deltaY,
  163. x2: x2 + deltaX,
  164. y2: y2 + deltaY,
  165. });
  166. return r;
  167. }
  168. return true;
  169. });
  170. lf.graphModel.group = this;
  171. lf.on('node:add,node:drop,node:dnd-add', this.appendNodeToGroup);
  172. lf.on('node:delete', this.deleteGroupChild);
  173. lf.on('node:dnd-drag,node:drag', this.setActiveGroup);
  174. lf.on('node:click', this.nodeSelected);
  175. lf.on('graph:rendered', this.graphRendered);
  176. }
  177. /**
  178. * 获取一个节点内部所有的子节点,包裹分组的子节点
  179. */
  180. Group.prototype.getNodeAllChild = function (model) {
  181. var _this = this;
  182. var nodeIds = [];
  183. if (model.children) {
  184. model.children.forEach(function (nodeId) {
  185. nodeIds.push(nodeId);
  186. var nodeModel = _this.lf.getNodeModelById(nodeId);
  187. if (nodeModel.isGroup) {
  188. nodeIds = nodeIds.concat(_this.getNodeAllChild(nodeModel));
  189. }
  190. });
  191. }
  192. return nodeIds;
  193. };
  194. /**
  195. * 获取自定位置其所属分组
  196. * 当分组重合时,优先返回最上层的分组
  197. */
  198. Group.prototype.getGroup = function (bounds, nodeData) {
  199. var nodes = this.lf.graphModel.nodes;
  200. var groups = nodes.filter(function (node) { return node.isGroup && node.isInRange(bounds) && node.id !== nodeData.id; });
  201. if (groups.length === 0)
  202. return;
  203. if (groups.length === 1)
  204. return groups[0];
  205. var topGroup = groups[groups.length - 1];
  206. for (var i = groups.length - 2; i >= 0; i--) {
  207. if (groups[i].zIndex > topGroup.zIndex) {
  208. topGroup = groups[i];
  209. }
  210. }
  211. return topGroup;
  212. };
  213. /**
  214. * 获取某个节点所属的groupModel
  215. */
  216. Group.prototype.getNodeGroup = function (nodeId) {
  217. var groupId = this.nodeGroupMap.get(nodeId);
  218. if (groupId) {
  219. return this.lf.getNodeModelById(groupId);
  220. }
  221. };
  222. Group.pluginName = 'group';
  223. return Group;
  224. }());
  225. export { Group, GroupNode, };