| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- import GroupNode from './GroupNode';
- var DEFAULT_TOP_Z_INDEX = -1000;
- var DEFAULT_BOTTOM_Z_INDEX = -10000;
- var Group = /** @class */ (function () {
- function Group(_a) {
- var _this = this;
- var lf = _a.lf;
- this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
- this.nodeGroupMap = new Map();
- this.graphRendered = function (data) {
- // 如果节点
- if (data && data.nodes) {
- data.nodes.forEach(function (node) {
- if (node.children) {
- node.children.forEach(function (nodeId) {
- _this.nodeGroupMap.set(nodeId, node.id);
- });
- }
- });
- }
- };
- this.appendNodeToGroup = function (_a) {
- var data = _a.data;
- // 如果这个节点之前已经在group中了,则将其从之前的group中移除
- var preGroupId = _this.nodeGroupMap.get(data.id);
- if (preGroupId) {
- var preGroup = _this.lf.getNodeModelById(preGroupId);
- preGroup.removeChild(data.id);
- _this.nodeGroupMap.delete(data.id);
- preGroup.setAllowAppendChild(false);
- }
- // 然后再判断这个节点是否在某个group中,如果在,则将其添加到对应的group中
- var nodeModel = _this.lf.getNodeModelById(data.id);
- var bounds = nodeModel.getBounds();
- var group = _this.getGroup(bounds, data);
- if (!group)
- return;
- var isAllowAppendIn = group.isAllowAppendIn(data);
- if (!isAllowAppendIn) {
- _this.lf.emit('group:not-allowed', {
- group: group.getData(),
- node: data,
- });
- return;
- }
- group.addChild(data.id);
- _this.nodeGroupMap.set(data.id, group.id);
- group.setAllowAppendChild(false);
- // 如果这个节点是分组,那么将其子节点也记录下来
- if (nodeModel.isGroup) {
- data.children.forEach(function (nodeId) {
- _this.nodeGroupMap.set(nodeId, data.id);
- });
- _this.nodeSelected({ data: data, isSelected: false, isMultiple: false });
- }
- };
- this.deleteGroupChild = function (_a) {
- var data = _a.data;
- // 如果删除的是分组节点,则同时删除分组的子节点
- if (data.children) {
- data.children.forEach(function (nodeId) {
- _this.nodeGroupMap.delete(nodeId);
- _this.lf.deleteNode(nodeId);
- });
- }
- var groupId = _this.nodeGroupMap.get(data.id);
- if (groupId) {
- var group = _this.lf.getNodeModelById(groupId);
- group.removeChild(data.id);
- _this.nodeGroupMap.delete(data.id);
- }
- };
- this.setActiveGroup = function (_a) {
- var data = _a.data;
- var nodeModel = _this.lf.getNodeModelById(data.id);
- var bounds = nodeModel.getBounds();
- var newGroup = _this.getGroup(bounds, data);
- if (_this.activeGroup) {
- _this.activeGroup.setAllowAppendChild(false);
- }
- if (!newGroup || (nodeModel.isGroup && newGroup.id === data.id))
- return;
- var isAllowAppendIn = newGroup.isAllowAppendIn(data);
- if (!isAllowAppendIn) {
- return;
- }
- _this.activeGroup = newGroup;
- _this.activeGroup.setAllowAppendChild(true);
- };
- /**
- * 1. 分组节点默认在普通节点下面。
- * 2. 分组节点被选中后,会将分组节点以及其内部的其他分组节点放到其余分组节点的上面。
- * 3. 分组节点取消选中后,不会将分组节点重置为原来的高度。
- * 4. 由于LogicFlow核心目标是支持用户手动绘制流程图,所以不考虑一张流程图超过1000个分组节点的情况。
- */
- this.nodeSelected = function (_a) {
- var data = _a.data, isMultiple = _a.isMultiple, isSelected = _a.isSelected;
- var nodeModel = _this.lf.getNodeModelById(data.id);
- _this.toFrontGroup(nodeModel);
- // 重置所有的group zIndex,防止group节点zIndex增长为正。
- if (_this.topGroupZIndex > DEFAULT_TOP_Z_INDEX) {
- _this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
- var allGroups = _this.lf.graphModel.nodes
- .filter(function (node) { return node.isGroup; })
- .sort(function (a, b) { return a.zIndex - b.zIndex; });
- var preZIndex = 0;
- for (var i = 0; i < allGroups.length; i++) {
- var group = allGroups[i];
- if (group.zIndex !== preZIndex) {
- _this.topGroupZIndex++;
- preZIndex = group.zIndex;
- }
- group.setZIndex(_this.topGroupZIndex);
- }
- }
- // FIX #1004
- // 如果节点被多选,
- // 这个节点是分组,则将分组的所有子节点取消选中
- // 这个节点是分组的子节点,且其所属分组节点已选,则取消选中
- if (isMultiple && isSelected) {
- if (nodeModel.isGroup) {
- nodeModel.children.forEach(function (child) {
- var childModel = _this.lf.graphModel.getElement(child);
- childModel.setSelected(false);
- });
- }
- else {
- var groupId = _this.nodeGroupMap.get(data.id);
- if (groupId) {
- var groupModel = _this.lf.getNodeModelById(groupId);
- groupModel.isSelected && nodeModel.setSelected(false);
- }
- }
- }
- };
- this.toFrontGroup = function (model) {
- if (!model || !model.isGroup) {
- return;
- }
- _this.topGroupZIndex++;
- model.setZIndex(_this.topGroupZIndex);
- if (model.children) {
- model.children.forEach(function (nodeId) {
- var node = _this.lf.getNodeModelById(nodeId);
- _this.toFrontGroup(node);
- });
- }
- };
- lf.register(GroupNode);
- this.lf = lf;
- lf.graphModel.addNodeMoveRules(function (model, deltaX, deltaY) {
- if (model.isGroup) { // 如果移动的是分组,那么分组的子节点也跟着移动。
- var nodeIds = _this.getNodeAllChild(model);
- lf.graphModel.moveNodes(nodeIds, deltaX, deltaY, true);
- return true;
- }
- var groupModel = lf.getNodeModelById(_this.nodeGroupMap.get(model.id));
- if (groupModel && groupModel.isRestrict) { // 如果移动的节点存在分组中,且这个分组禁止子节点移出去。
- var _a = model.getBounds(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;
- var r = groupModel.isAllowMoveTo({
- x1: x1 + deltaX,
- y1: y1 + deltaY,
- x2: x2 + deltaX,
- y2: y2 + deltaY,
- });
- return r;
- }
- return true;
- });
- lf.graphModel.group = this;
- lf.on('node:add,node:drop,node:dnd-add', this.appendNodeToGroup);
- lf.on('node:delete', this.deleteGroupChild);
- lf.on('node:dnd-drag,node:drag', this.setActiveGroup);
- lf.on('node:click', this.nodeSelected);
- lf.on('graph:rendered', this.graphRendered);
- }
- /**
- * 获取一个节点内部所有的子节点,包裹分组的子节点
- */
- Group.prototype.getNodeAllChild = function (model) {
- var _this = this;
- var nodeIds = [];
- if (model.children) {
- model.children.forEach(function (nodeId) {
- nodeIds.push(nodeId);
- var nodeModel = _this.lf.getNodeModelById(nodeId);
- if (nodeModel.isGroup) {
- nodeIds = nodeIds.concat(_this.getNodeAllChild(nodeModel));
- }
- });
- }
- return nodeIds;
- };
- /**
- * 获取自定位置其所属分组
- * 当分组重合时,优先返回最上层的分组
- */
- Group.prototype.getGroup = function (bounds, nodeData) {
- var nodes = this.lf.graphModel.nodes;
- var groups = nodes.filter(function (node) { return node.isGroup && node.isInRange(bounds) && node.id !== nodeData.id; });
- if (groups.length === 0)
- return;
- if (groups.length === 1)
- return groups[0];
- var topGroup = groups[groups.length - 1];
- for (var i = groups.length - 2; i >= 0; i--) {
- if (groups[i].zIndex > topGroup.zIndex) {
- topGroup = groups[i];
- }
- }
- return topGroup;
- };
- /**
- * 获取某个节点所属的groupModel
- */
- Group.prototype.getNodeGroup = function (nodeId) {
- var groupId = this.nodeGroupMap.get(nodeId);
- if (groupId) {
- return this.lf.getNodeModelById(groupId);
- }
- };
- Group.pluginName = 'group';
- return Group;
- }());
- export { Group, GroupNode, };
|