@logicflow/extension 2.2.2 → 2.2.4-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/constant/events.d.ts +9 -0
- package/es/constant/events.js +11 -0
- package/es/dynamic-group/index.d.ts +41 -3
- package/es/dynamic-group/index.js +281 -117
- package/es/dynamic-group/model.d.ts +48 -1
- package/es/dynamic-group/model.js +138 -23
- package/es/dynamic-group/node.d.ts +1 -0
- package/es/dynamic-group/node.js +52 -19
- package/es/dynamic-group/titleText.d.ts +8 -0
- package/es/dynamic-group/titleText.js +84 -0
- package/es/dynamic-group/utils.d.ts +69 -0
- package/es/dynamic-group/utils.js +162 -0
- package/es/index.css +321 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/index.less +1 -0
- package/es/materials/group/GroupNode.js +5 -2
- package/es/materials/group/index.js +7 -6
- package/es/pool/LaneModel.d.ts +1 -1
- package/es/pool/PoolModel.d.ts +1 -1
- package/es/pool/index.d.ts +3 -2
- package/es/pool/index.js +44 -60
- package/es/style/index.css +321 -1
- package/es/style/index.less +381 -0
- package/lib/constant/events.d.ts +9 -0
- package/lib/constant/events.js +14 -0
- package/lib/dynamic-group/index.d.ts +41 -3
- package/lib/dynamic-group/index.js +280 -116
- package/lib/dynamic-group/model.d.ts +48 -1
- package/lib/dynamic-group/model.js +137 -22
- package/lib/dynamic-group/node.d.ts +1 -0
- package/lib/dynamic-group/node.js +53 -20
- package/lib/dynamic-group/titleText.d.ts +8 -0
- package/lib/dynamic-group/titleText.js +90 -0
- package/lib/dynamic-group/utils.d.ts +69 -0
- package/lib/dynamic-group/utils.js +172 -1
- package/lib/index.css +321 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.less +1 -0
- package/lib/materials/group/GroupNode.js +5 -2
- package/lib/materials/group/index.js +7 -6
- package/lib/pool/LaneModel.d.ts +1 -1
- package/lib/pool/PoolModel.d.ts +1 -1
- package/lib/pool/index.d.ts +3 -2
- package/lib/pool/index.js +44 -60
- package/lib/style/index.css +321 -1
- package/lib/style/index.less +381 -0
- package/package.json +6 -6
- package/dist/index.css +0 -1
- package/dist/index.min.js +0 -2
- package/dist/index.min.js.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** extension 插件自定义事件(非 @logicflow/core EventType) */
|
|
2
|
+
export declare enum ExtensionEventType {
|
|
3
|
+
GROUP_ADD_NODE = "group:add-node",
|
|
4
|
+
GROUP_REMOVE_NODE = "group:remove-node",
|
|
5
|
+
GROUP_NOT_ALLOWED = "group:not-allowed"
|
|
6
|
+
}
|
|
7
|
+
/** 常用于 lf.on / lf.off 的组合事件名 */
|
|
8
|
+
export declare const NODE_DRAG_EVENTS = "node:drag,node:dnd-drag";
|
|
9
|
+
export declare const NODE_ADD_DROP_DND_EVENTS = "node:add,node:drop,node:dnd-add";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventType } from '@logicflow/core';
|
|
2
|
+
/** extension 插件自定义事件(非 @logicflow/core EventType) */
|
|
3
|
+
export var ExtensionEventType;
|
|
4
|
+
(function (ExtensionEventType) {
|
|
5
|
+
ExtensionEventType["GROUP_ADD_NODE"] = "group:add-node";
|
|
6
|
+
ExtensionEventType["GROUP_REMOVE_NODE"] = "group:remove-node";
|
|
7
|
+
ExtensionEventType["GROUP_NOT_ALLOWED"] = "group:not-allowed";
|
|
8
|
+
})(ExtensionEventType || (ExtensionEventType = {}));
|
|
9
|
+
/** 常用于 lf.on / lf.off 的组合事件名 */
|
|
10
|
+
export var NODE_DRAG_EVENTS = "".concat(EventType.NODE_DRAG, ",").concat(EventType.NODE_DND_DRAG);
|
|
11
|
+
export var NODE_ADD_DROP_DND_EVENTS = "".concat(EventType.NODE_ADD, ",").concat(EventType.NODE_DROP, ",").concat(EventType.NODE_DND_ADD);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import LogicFlow, { BaseEdgeModel, BaseNodeModel, CallbackArgs, Model } from '@logicflow/core';
|
|
2
2
|
import { DynamicGroupNode } from './node';
|
|
3
3
|
import { DynamicGroupNodeModel } from './model';
|
|
4
|
+
import { ExtensionEventType } from '../constant/events';
|
|
4
5
|
import EdgeConfig = LogicFlow.EdgeConfig;
|
|
5
6
|
import EdgeData = LogicFlow.EdgeData;
|
|
6
7
|
import NodeData = LogicFlow.NodeData;
|
|
@@ -16,15 +17,40 @@ export declare const dynamicGroup: {
|
|
|
16
17
|
export declare class DynamicGroup {
|
|
17
18
|
static pluginName: string;
|
|
18
19
|
private lf;
|
|
20
|
+
/**
|
|
21
|
+
* 为 true 时禁止手动将边连到/从 dynamic-group 节点本身。
|
|
22
|
+
* 默认 false,与历史行为一致;折叠虚拟边不受影响。
|
|
23
|
+
*/
|
|
24
|
+
disallowEdgeConnectToGroup: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 删除 dynamic-group 时是否级联删除其成员。
|
|
27
|
+
* 默认 true,与 v1.1 以来行为一致;为 false 时仅删除分组,成员保留并解除归属。
|
|
28
|
+
*/
|
|
29
|
+
cascadeDeleteChildren: boolean;
|
|
19
30
|
topGroupZIndex: number;
|
|
20
31
|
activeGroup?: DynamicGroupNodeModel;
|
|
21
32
|
nodeGroupMap: Map<string, string>;
|
|
33
|
+
/** 折叠态虚拟边 id → 所属分组与真实边 id */
|
|
34
|
+
collapsedVirtualEdges: Map<string, {
|
|
35
|
+
groupId: string;
|
|
36
|
+
realEdgeId: string;
|
|
37
|
+
}>;
|
|
38
|
+
/** 折叠隐藏的真实边 id → 分组 id */
|
|
39
|
+
collapsedRealEdgeToGroup: Map<string, string>;
|
|
40
|
+
private originDeleteNode?;
|
|
22
41
|
constructor({ lf, options }: LogicFlow.IExtensionProps);
|
|
23
42
|
/**
|
|
24
43
|
* 获取节点所属的分组
|
|
25
44
|
* @param nodeId
|
|
26
45
|
*/
|
|
27
46
|
getGroupByNodeId(nodeId: string): BaseNodeModel<LogicFlow.PropertiesType> | undefined;
|
|
47
|
+
registerCollapsedVirtualEdge(virtualId: string, groupId: string, realEdgeId: string): void;
|
|
48
|
+
unregisterCollapsedVirtualEdge(virtualId: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* 折叠态删边:删虚拟边时连带删对应真实边,防止展开后「边复活」(#2395)。
|
|
51
|
+
* Gateway 双分支等场景下,每条虚拟边只映射一条真实边。
|
|
52
|
+
*/
|
|
53
|
+
onEdgeDelete: ({ data: edge }: CallbackArgs<'edge:delete'>) => void;
|
|
28
54
|
/**
|
|
29
55
|
* 获取自定位置及其所属分组
|
|
30
56
|
* 当分组重合时,优先返回最上层的分组
|
|
@@ -49,9 +75,16 @@ export declare class DynamicGroup {
|
|
|
49
75
|
*/
|
|
50
76
|
calibrateTopGroupZIndex(nodes: NodeData[]): void;
|
|
51
77
|
onSelectionDrop: () => void;
|
|
52
|
-
|
|
78
|
+
onNodeAdd: ({ data: node }: CallbackArgs<'node:add'>) => void;
|
|
79
|
+
onNodeDndAdd: ({ data: node }: CallbackArgs<'node:dnd-add'>) => void;
|
|
80
|
+
onNodeDrop: ({ data: node }: CallbackArgs<'node:drop'>) => void;
|
|
81
|
+
detachNodeFromGroup: (groupId: string, nodeId: string) => void;
|
|
82
|
+
releaseGroupMembers: (groupModel: DynamicGroupNodeModel) => void;
|
|
83
|
+
removeChildFromOtherGroups: (childId: string, ownerGroupId: string) => void;
|
|
84
|
+
setNodeGroup: (groupId: string, childId: string) => void;
|
|
85
|
+
syncGroupChildren: (node: LogicFlow.NodeData) => void;
|
|
53
86
|
addNodeToGroup: (node: LogicFlow.NodeData) => void;
|
|
54
|
-
onGroupAddNode: ({ data: groupData, childId, }: CallbackArgs<
|
|
87
|
+
onGroupAddNode: ({ data: groupData, childId, }: CallbackArgs<ExtensionEventType.GROUP_ADD_NODE>) => void;
|
|
55
88
|
removeNodeFromGroup: ({ data: node, model, }: CallbackArgs<'node:delete'>) => void;
|
|
56
89
|
onSelectionDrag: () => void;
|
|
57
90
|
onNodeDrag: ({ data: node }: CallbackArgs<'node:drag'>) => void;
|
|
@@ -66,7 +99,8 @@ export declare class DynamicGroup {
|
|
|
66
99
|
* @param isSelected
|
|
67
100
|
*/
|
|
68
101
|
onNodeSelect: ({ data: node, isMultiple, isSelected, }: Omit<CallbackArgs<'node:click'>, 'e' | 'position'>) => void;
|
|
69
|
-
onNodeMove: ({
|
|
102
|
+
onNodeMove: ({ data, }: Omit<CallbackArgs<'node:mousemove'>, 'e' | 'position'>) => void;
|
|
103
|
+
onNodeResize: ({ model, }: Omit<CallbackArgs<'node:resize'>, 'e' | 'position'>) => void;
|
|
70
104
|
onGraphRendered: ({ data }: CallbackArgs<'graph:rendered'>) => void;
|
|
71
105
|
removeChildrenInGroupNodeData<T extends LogicFlow.NodeData | LogicFlow.NodeConfig>(nodeData: T): T;
|
|
72
106
|
/**
|
|
@@ -113,6 +147,10 @@ export declare namespace DynamicGroup {
|
|
|
113
147
|
};
|
|
114
148
|
type DynamicGroupOptions = Partial<{
|
|
115
149
|
isCollapsed: boolean;
|
|
150
|
+
/** 为 true 时禁止手动将边连到/从分组节点;默认 false */
|
|
151
|
+
disallowEdgeConnectToGroup: boolean;
|
|
152
|
+
/** 删除分组时是否级联删除成员;默认 true */
|
|
153
|
+
cascadeDeleteChildren: boolean;
|
|
116
154
|
}>;
|
|
117
155
|
}
|
|
118
156
|
export default DynamicGroup;
|
|
@@ -9,6 +9,17 @@ var __assign = (this && this.__assign) || function () {
|
|
|
9
9
|
};
|
|
10
10
|
return __assign.apply(this, arguments);
|
|
11
11
|
};
|
|
12
|
+
var __values = (this && this.__values) || function(o) {
|
|
13
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
14
|
+
if (m) return m.call(o);
|
|
15
|
+
if (o && typeof o.length === "number") return {
|
|
16
|
+
next: function () {
|
|
17
|
+
if (o && i >= o.length) o = void 0;
|
|
18
|
+
return { value: o && o[i++], done: !o };
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
22
|
+
};
|
|
12
23
|
var __read = (this && this.__read) || function (o, n) {
|
|
13
24
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
25
|
if (!m) return o;
|
|
@@ -38,7 +49,8 @@ import { EventType, transformNodeData, transformEdgeData, } from '@logicflow/cor
|
|
|
38
49
|
import { assign, cloneDeep, filter, forEach, has, map, sortBy } from 'lodash-es';
|
|
39
50
|
import { DynamicGroupNode } from './node';
|
|
40
51
|
import { DynamicGroupNodeModel } from './model';
|
|
41
|
-
import {
|
|
52
|
+
import { ExtensionEventType, NODE_DRAG_EVENTS } from '../constant/events';
|
|
53
|
+
import { isAllowMoveTo, isBoundsInGroup, getChildrenBounds, isGroupBoundsContainsChildren, } from './utils';
|
|
42
54
|
export * from './node';
|
|
43
55
|
export * from './model';
|
|
44
56
|
export var dynamicGroup = {
|
|
@@ -52,85 +64,204 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
52
64
|
function DynamicGroup(_a) {
|
|
53
65
|
var lf = _a.lf, options = _a.options;
|
|
54
66
|
var _this = this;
|
|
67
|
+
/**
|
|
68
|
+
* 为 true 时禁止手动将边连到/从 dynamic-group 节点本身。
|
|
69
|
+
* 默认 false,与历史行为一致;折叠虚拟边不受影响。
|
|
70
|
+
*/
|
|
71
|
+
this.disallowEdgeConnectToGroup = false;
|
|
72
|
+
/**
|
|
73
|
+
* 删除 dynamic-group 时是否级联删除其成员。
|
|
74
|
+
* 默认 true,与 v1.1 以来行为一致;为 false 时仅删除分组,成员保留并解除归属。
|
|
75
|
+
*/
|
|
76
|
+
this.cascadeDeleteChildren = true;
|
|
55
77
|
this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
|
|
56
78
|
// 存储节点与 group 的映射关系
|
|
57
79
|
this.nodeGroupMap = new Map();
|
|
80
|
+
/** 折叠态虚拟边 id → 所属分组与真实边 id */
|
|
81
|
+
this.collapsedVirtualEdges = new Map();
|
|
82
|
+
/** 折叠隐藏的真实边 id → 分组 id */
|
|
83
|
+
this.collapsedRealEdgeToGroup = new Map();
|
|
84
|
+
/**
|
|
85
|
+
* 折叠态删边:删虚拟边时连带删对应真实边,防止展开后「边复活」(#2395)。
|
|
86
|
+
* Gateway 双分支等场景下,每条虚拟边只映射一条真实边。
|
|
87
|
+
*/
|
|
88
|
+
this.onEdgeDelete = function (_a) {
|
|
89
|
+
var e_1, _b;
|
|
90
|
+
var edge = _a.data;
|
|
91
|
+
var virtualMapping = _this.collapsedVirtualEdges.get(edge.id);
|
|
92
|
+
if (virtualMapping) {
|
|
93
|
+
_this.collapsedVirtualEdges.delete(edge.id);
|
|
94
|
+
_this.collapsedRealEdgeToGroup.delete(virtualMapping.realEdgeId);
|
|
95
|
+
// 仅删除本条映射的真实边,不影响同组其它分支
|
|
96
|
+
if (_this.lf.getEdgeModelById(virtualMapping.realEdgeId)) {
|
|
97
|
+
_this.lf.deleteEdge(virtualMapping.realEdgeId);
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// 真实边被其它路径删除时,同步清理登记与分组内快照
|
|
102
|
+
var groupId = _this.collapsedRealEdgeToGroup.get(edge.id);
|
|
103
|
+
if (groupId) {
|
|
104
|
+
_this.collapsedRealEdgeToGroup.delete(edge.id);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
for (var _c = __values(_this.collapsedVirtualEdges.entries()), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
108
|
+
var _e = __read(_d.value, 2), virtualId = _e[0], info = _e[1];
|
|
109
|
+
if (info.realEdgeId === edge.id) {
|
|
110
|
+
_this.collapsedVirtualEdges.delete(virtualId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
115
|
+
finally {
|
|
116
|
+
try {
|
|
117
|
+
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
118
|
+
}
|
|
119
|
+
finally { if (e_1) throw e_1.error; }
|
|
120
|
+
}
|
|
121
|
+
};
|
|
58
122
|
this.onSelectionDrop = function () {
|
|
59
123
|
var selectedNodes = _this.lf.graphModel.getSelectElements().nodes;
|
|
60
124
|
selectedNodes.forEach(function (node) {
|
|
61
125
|
_this.addNodeToGroup(node);
|
|
62
126
|
});
|
|
63
127
|
};
|
|
64
|
-
this.
|
|
128
|
+
this.onNodeAdd = function (_a) {
|
|
129
|
+
var node = _a.data;
|
|
130
|
+
_this.syncGroupChildren(node);
|
|
131
|
+
};
|
|
132
|
+
this.onNodeDndAdd = function (_a) {
|
|
65
133
|
var node = _a.data;
|
|
134
|
+
_this.syncGroupChildren(node);
|
|
66
135
|
_this.addNodeToGroup(node);
|
|
67
136
|
};
|
|
137
|
+
this.onNodeDrop = function (_a) {
|
|
138
|
+
var node = _a.data;
|
|
139
|
+
_this.addNodeToGroup(node);
|
|
140
|
+
};
|
|
141
|
+
this.detachNodeFromGroup = function (groupId, nodeId) {
|
|
142
|
+
var group = _this.lf.getNodeModelById(groupId);
|
|
143
|
+
if (!group)
|
|
144
|
+
return;
|
|
145
|
+
group.removeChild(nodeId);
|
|
146
|
+
_this.nodeGroupMap.delete(nodeId);
|
|
147
|
+
group.setAllowAppendChild(false);
|
|
148
|
+
};
|
|
149
|
+
this.releaseGroupMembers = function (groupModel) {
|
|
150
|
+
if (groupModel.isCollapsed) {
|
|
151
|
+
// 复用展开路径恢复真实边与成员可见性,避免删虚拟边时误删真实边
|
|
152
|
+
groupModel.toggleCollapse(false);
|
|
153
|
+
}
|
|
154
|
+
forEach(Array.from(groupModel.children), function (childId) {
|
|
155
|
+
_this.detachNodeFromGroup(groupModel.id, childId);
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
this.removeChildFromOtherGroups = function (childId, ownerGroupId) {
|
|
159
|
+
var preGroupId = _this.nodeGroupMap.get(childId);
|
|
160
|
+
if (preGroupId && preGroupId !== ownerGroupId) {
|
|
161
|
+
var preGroup = _this.lf.getNodeModelById(preGroupId);
|
|
162
|
+
preGroup === null || preGroup === void 0 ? void 0 : preGroup.removeChild(childId);
|
|
163
|
+
}
|
|
164
|
+
forEach(_this.lf.graphModel.nodes, function (node) {
|
|
165
|
+
var _a;
|
|
166
|
+
if (!node.isGroup || node.id === ownerGroupId)
|
|
167
|
+
return;
|
|
168
|
+
var group = node;
|
|
169
|
+
if ((_a = group.children) === null || _a === void 0 ? void 0 : _a.has(childId)) {
|
|
170
|
+
group.removeChild(childId);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
this.setNodeGroup = function (groupId, childId) {
|
|
175
|
+
_this.removeChildFromOtherGroups(childId, groupId);
|
|
176
|
+
_this.nodeGroupMap.set(childId, groupId);
|
|
177
|
+
};
|
|
178
|
+
this.syncGroupChildren = function (node) {
|
|
179
|
+
var nodeModel = _this.lf.getNodeModelById(node.id);
|
|
180
|
+
if (!(nodeModel === null || nodeModel === void 0 ? void 0 : nodeModel.isGroup))
|
|
181
|
+
return;
|
|
182
|
+
var group = nodeModel;
|
|
183
|
+
forEach(Array.from(group.children), function (childId) {
|
|
184
|
+
_this.setNodeGroup(node.id, childId);
|
|
185
|
+
});
|
|
186
|
+
// 新增 group 时进行 this.topGroupZIndex 的校准更新
|
|
187
|
+
_this.calibrateTopGroupZIndex([node]);
|
|
188
|
+
_this.onNodeSelect({
|
|
189
|
+
data: node,
|
|
190
|
+
isSelected: false,
|
|
191
|
+
isMultiple: false,
|
|
192
|
+
});
|
|
193
|
+
};
|
|
68
194
|
this.addNodeToGroup = function (node) {
|
|
195
|
+
var nodeModel = _this.lf.getNodeModelById(node.id);
|
|
196
|
+
var bounds = nodeModel === null || nodeModel === void 0 ? void 0 : nodeModel.getBounds();
|
|
197
|
+
if (!nodeModel || !bounds)
|
|
198
|
+
return;
|
|
69
199
|
// 1. 如果该节点之前已经在 group 中了,则将其从之前的 group 移除
|
|
70
200
|
var preGroupId = _this.nodeGroupMap.get(node.id);
|
|
71
|
-
if (preGroupId) {
|
|
72
|
-
var group = _this.lf.getNodeModelById(preGroupId);
|
|
73
|
-
group.removeChild(node.id);
|
|
74
|
-
_this.nodeGroupMap.delete(node.id);
|
|
75
|
-
group.setAllowAppendChild(false);
|
|
76
|
-
}
|
|
77
201
|
// 2. 然后再判断这个节点是否在某个 group 范围内,如果是,则将其添加到对应的 group 中
|
|
78
|
-
|
|
79
|
-
var
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
_this.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
isMultiple: false,
|
|
202
|
+
// TODO: 找到这个范围内的 groupModel, 并加 node 添加到该 group
|
|
203
|
+
var targetGroup = _this.getGroupByBounds(bounds, node);
|
|
204
|
+
// 同组内移动,成员关系不变(#2412)
|
|
205
|
+
if (preGroupId && (targetGroup === null || targetGroup === void 0 ? void 0 : targetGroup.id) === preGroupId) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (!targetGroup) {
|
|
209
|
+
if (preGroupId) {
|
|
210
|
+
_this.detachNodeFromGroup(preGroupId, node.id);
|
|
211
|
+
}
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (!preGroupId) {
|
|
215
|
+
if (targetGroup.isAllowAppendIn(node)) {
|
|
216
|
+
targetGroup.addChild(node.id);
|
|
217
|
+
// 建立节点与 group 的映射关系放在了 group.addChild 触发的事件中,与直接调用 addChild 的行为保持一致
|
|
218
|
+
targetGroup.setAllowAppendChild(false);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// 抛出不允许插入的事件
|
|
222
|
+
_this.lf.emit(ExtensionEventType.GROUP_NOT_ALLOWED, {
|
|
223
|
+
group: targetGroup.getData(),
|
|
224
|
+
node: node,
|
|
102
225
|
});
|
|
103
226
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
group: group.getData(),
|
|
117
|
-
node: node,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (targetGroup.isAllowAppendIn(node)) {
|
|
230
|
+
_this.detachNodeFromGroup(preGroupId, node.id);
|
|
231
|
+
targetGroup.addChild(node.id);
|
|
232
|
+
// 建立节点与 group 的映射关系放在了 group.addChild 触发的事件中,与直接调用 addChild 的行为保持一致
|
|
233
|
+
targetGroup.setAllowAppendChild(false);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
var preGroup = _this.lf.getNodeModelById(preGroupId);
|
|
237
|
+
if (preGroup && isBoundsInGroup(bounds, preGroup)) {
|
|
238
|
+
return;
|
|
120
239
|
}
|
|
240
|
+
_this.detachNodeFromGroup(preGroupId, node.id);
|
|
241
|
+
// 抛出不允许插入的事件
|
|
242
|
+
_this.lf.emit(ExtensionEventType.GROUP_NOT_ALLOWED, {
|
|
243
|
+
group: targetGroup.getData(),
|
|
244
|
+
node: node,
|
|
245
|
+
});
|
|
121
246
|
}
|
|
122
247
|
};
|
|
123
248
|
this.onGroupAddNode = function (_a) {
|
|
124
249
|
var groupData = _a.data, childId = _a.childId;
|
|
125
|
-
_this.
|
|
250
|
+
_this.setNodeGroup(groupData.id, childId);
|
|
126
251
|
};
|
|
127
252
|
this.removeNodeFromGroup = function (_a) {
|
|
128
253
|
var node = _a.data, model = _a.model;
|
|
129
254
|
if (model.isGroup && node.children) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
255
|
+
var groupModel = model;
|
|
256
|
+
if (_this.cascadeDeleteChildren) {
|
|
257
|
+
forEach(Array.from(groupModel.children), function (childId) {
|
|
258
|
+
_this.nodeGroupMap.delete(childId);
|
|
259
|
+
_this.lf.deleteNode(childId);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
_this.releaseGroupMembers(groupModel);
|
|
264
|
+
}
|
|
134
265
|
}
|
|
135
266
|
var groupId = _this.nodeGroupMap.get(node.id);
|
|
136
267
|
if (groupId) {
|
|
@@ -216,12 +347,8 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
216
347
|
}
|
|
217
348
|
};
|
|
218
349
|
this.onNodeMove = function (_a) {
|
|
219
|
-
var
|
|
220
|
-
var id = data.id
|
|
221
|
-
if (!properties) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
var width = properties.width, height = properties.height;
|
|
350
|
+
var data = _a.data;
|
|
351
|
+
var id = data.id;
|
|
225
352
|
var groupId = _this.nodeGroupMap.get(id);
|
|
226
353
|
if (!groupId) {
|
|
227
354
|
return;
|
|
@@ -232,13 +359,13 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
232
359
|
}
|
|
233
360
|
// 当父节点isRestrict=true & autoResize=true
|
|
234
361
|
// 子节点在父节点中移动时,父节点会自动调整大小
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
var
|
|
362
|
+
var childModel = _this.lf.getNodeModelById(id);
|
|
363
|
+
if (!childModel) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
// node:mousemove 的 data 在 onDragging 之前采集,坐标滞后;
|
|
367
|
+
// 此时子节点 model 已更新,直接读取 getBounds()。
|
|
368
|
+
var _b = childModel.getBounds(), minX = _b.minX, minY = _b.minY, maxX = _b.maxX, maxY = _b.maxY;
|
|
242
369
|
// step2:比较当前child.bounds与parent.bounds的差异,比如child.minX<parent.minX,那么parent.minX=child.minX
|
|
243
370
|
var hasChange = false;
|
|
244
371
|
var groupBounds = groupModel.getBounds();
|
|
@@ -270,9 +397,24 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
270
397
|
groupModel.moveTo(newGroupX, newGroupY);
|
|
271
398
|
groupModel.width = newGroupWidth;
|
|
272
399
|
groupModel.height = newGroupHeight;
|
|
400
|
+
groupModel.updateExpandedSize(newGroupWidth, newGroupHeight);
|
|
401
|
+
groupModel.setTextPosition();
|
|
402
|
+
};
|
|
403
|
+
this.onNodeResize = function (_a) {
|
|
404
|
+
var model = _a.model;
|
|
405
|
+
if ((model === null || model === void 0 ? void 0 : model.isGroup) && !model.isCollapsed) {
|
|
406
|
+
;
|
|
407
|
+
model.setTextPosition();
|
|
408
|
+
}
|
|
273
409
|
};
|
|
274
410
|
this.onGraphRendered = function (_a) {
|
|
275
411
|
var data = _a.data;
|
|
412
|
+
// lf.render / graphDataToModel 不会逐节点触发 node:delete,需在整图重建时重置插件侧状态
|
|
413
|
+
_this.nodeGroupMap.clear();
|
|
414
|
+
_this.collapsedVirtualEdges.clear();
|
|
415
|
+
_this.collapsedRealEdgeToGroup.clear();
|
|
416
|
+
_this.activeGroup = undefined;
|
|
417
|
+
_this.topGroupZIndex = DEFAULT_BOTTOM_Z_INDEX;
|
|
276
418
|
forEach(data.nodes, function (node) {
|
|
277
419
|
if (node.children) {
|
|
278
420
|
forEach(node.children, function (childId) {
|
|
@@ -300,6 +442,20 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
300
442
|
return this.lf.getNodeModelById(groupId);
|
|
301
443
|
}
|
|
302
444
|
};
|
|
445
|
+
DynamicGroup.prototype.registerCollapsedVirtualEdge = function (virtualId, groupId, realEdgeId) {
|
|
446
|
+
// 双向索引:删虚拟边时能找到真实边;删真实边时能清理虚拟边登记
|
|
447
|
+
this.collapsedVirtualEdges.set(virtualId, { groupId: groupId, realEdgeId: realEdgeId });
|
|
448
|
+
this.collapsedRealEdgeToGroup.set(realEdgeId, groupId);
|
|
449
|
+
};
|
|
450
|
+
DynamicGroup.prototype.unregisterCollapsedVirtualEdge = function (virtualId) {
|
|
451
|
+
var info = this.collapsedVirtualEdges.get(virtualId);
|
|
452
|
+
if (info) {
|
|
453
|
+
this.collapsedVirtualEdges.delete(virtualId);
|
|
454
|
+
if (this.collapsedRealEdgeToGroup.get(info.realEdgeId) === info.groupId) {
|
|
455
|
+
this.collapsedRealEdgeToGroup.delete(info.realEdgeId);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
};
|
|
303
459
|
/**
|
|
304
460
|
* 获取自定位置及其所属分组
|
|
305
461
|
* 当分组重合时,优先返回最上层的分组
|
|
@@ -490,35 +646,22 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
490
646
|
* @param newHeight
|
|
491
647
|
*/
|
|
492
648
|
DynamicGroup.prototype.checkGroupBoundsWithChildren = function (groupModel, deltaX, deltaY, newWidth, newHeight) {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
var groupMinY = newY - newHeight / 2;
|
|
500
|
-
var groupMaxX = newX + newWidth / 2;
|
|
501
|
-
var groupMaxY = newY + newHeight / 2;
|
|
502
|
-
var childrenArray = Array.from(children);
|
|
503
|
-
for (var i = 0; i < childrenArray.length; i++) {
|
|
504
|
-
var childId = childrenArray[i];
|
|
505
|
-
var child = this.lf.getNodeModelById(childId);
|
|
506
|
-
if (!child) {
|
|
507
|
-
continue;
|
|
508
|
-
}
|
|
509
|
-
var childBounds = child.getBounds();
|
|
510
|
-
var minX = childBounds.minX, minY = childBounds.minY, maxX = childBounds.maxX, maxY = childBounds.maxY;
|
|
511
|
-
// parent:resize后的bounds不能小于child:bounds,否则阻止其resize
|
|
512
|
-
var canResize = groupMinX <= minX &&
|
|
513
|
-
groupMinY <= minY &&
|
|
514
|
-
groupMaxX >= maxX &&
|
|
515
|
-
groupMaxY >= maxY;
|
|
516
|
-
if (!canResize) {
|
|
517
|
-
return false;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
649
|
+
var _this = this;
|
|
650
|
+
var childrenBounds = getChildrenBounds(groupModel, function (id) {
|
|
651
|
+
return _this.lf.getNodeModelById(id);
|
|
652
|
+
});
|
|
653
|
+
if (!childrenBounds) {
|
|
654
|
+
return true;
|
|
520
655
|
}
|
|
521
|
-
|
|
656
|
+
var newX = groupModel.x + deltaX / 2;
|
|
657
|
+
var newY = groupModel.y + deltaY / 2;
|
|
658
|
+
var groupBounds = {
|
|
659
|
+
minX: newX - newWidth / 2,
|
|
660
|
+
minY: newY - newHeight / 2,
|
|
661
|
+
maxX: newX + newWidth / 2,
|
|
662
|
+
maxY: newY + newHeight / 2,
|
|
663
|
+
};
|
|
664
|
+
return isGroupBoundsContainsChildren(groupBounds, childrenBounds);
|
|
522
665
|
};
|
|
523
666
|
/**
|
|
524
667
|
* Group 插件的初始化方法
|
|
@@ -565,27 +708,41 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
565
708
|
}
|
|
566
709
|
return true;
|
|
567
710
|
});
|
|
568
|
-
// https://github.com/didi/LogicFlow/issues/1442
|
|
569
|
-
// https://github.com/didi/LogicFlow/issues/937
|
|
570
711
|
// 添加分组节点resize规则
|
|
571
|
-
//
|
|
572
|
-
// 并且在isRestrict限制模式下,transformWidthContainer即使设置为true,也无效
|
|
712
|
+
// 所有分组默认不可缩小到直接子节点占地面积以下
|
|
573
713
|
graphModel.addNodeResizeRules(function (model, deltaX, deltaY, width, height) {
|
|
574
|
-
if (model.isGroup
|
|
714
|
+
if (model.isGroup) {
|
|
575
715
|
return _this.checkGroupBoundsWithChildren(model, deltaX, deltaY, width, height);
|
|
576
716
|
}
|
|
577
717
|
return true;
|
|
578
718
|
});
|
|
579
719
|
graphModel.dynamicGroup = this;
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
lf.
|
|
583
|
-
lf.
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
720
|
+
// cascadeDeleteChildren=false 时须在 core 删除「指向分组的边」之前释放成员,
|
|
721
|
+
// 否则折叠虚拟边被删会连带删掉真实边(graphModel.deleteNode 先删边再 emit node:delete)
|
|
722
|
+
this.originDeleteNode = lf.deleteNode.bind(lf);
|
|
723
|
+
lf.deleteNode = function (nodeId) {
|
|
724
|
+
var nodeModel = lf.getNodeModelById(nodeId);
|
|
725
|
+
if (!_this.cascadeDeleteChildren && (nodeModel === null || nodeModel === void 0 ? void 0 : nodeModel.isGroup)) {
|
|
726
|
+
var groupModel = nodeModel;
|
|
727
|
+
if (groupModel.children.size > 0) {
|
|
728
|
+
_this.releaseGroupMembers(groupModel);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
return _this.originDeleteNode(nodeId);
|
|
732
|
+
};
|
|
733
|
+
lf.on(EventType.NODE_ADD, this.onNodeAdd);
|
|
734
|
+
lf.on(EventType.NODE_DND_ADD, this.onNodeDndAdd);
|
|
735
|
+
lf.on(EventType.NODE_DROP, this.onNodeDrop);
|
|
736
|
+
lf.on(EventType.SELECTION_DROP, this.onSelectionDrop);
|
|
737
|
+
lf.on(EventType.NODE_DELETE, this.removeNodeFromGroup);
|
|
738
|
+
lf.on(EventType.EDGE_DELETE, this.onEdgeDelete);
|
|
739
|
+
lf.on(NODE_DRAG_EVENTS, this.onNodeDrag);
|
|
740
|
+
lf.on(EventType.SELECTION_DRAG, this.onSelectionDrag);
|
|
741
|
+
lf.on(EventType.NODE_CLICK, this.onNodeSelect);
|
|
742
|
+
lf.on(EventType.NODE_MOUSEMOVE, this.onNodeMove);
|
|
743
|
+
lf.on(EventType.NODE_RESIZE, this.onNodeResize);
|
|
744
|
+
lf.on(EventType.GRAPH_RENDERED, this.onGraphRendered);
|
|
745
|
+
lf.on(ExtensionEventType.GROUP_ADD_NODE, this.onGroupAddNode);
|
|
589
746
|
// https://github.com/didi/LogicFlow/issues/1346
|
|
590
747
|
// 重写 addElements() 方法,在 addElements() 原有基础上增加对 group 内部所有 nodes 和 edges 的复制功能
|
|
591
748
|
// 使用场景:addElements api 项目内部目前只在快捷键粘贴时使用(此处解决的也应该是粘贴场景的问题)
|
|
@@ -630,16 +787,23 @@ var DynamicGroup = /** @class */ (function () {
|
|
|
630
787
|
DynamicGroup.prototype.render = function () { };
|
|
631
788
|
DynamicGroup.prototype.destroy = function () {
|
|
632
789
|
// 销毁监听的事件,并移除渲染的 dom 内容
|
|
633
|
-
this.lf.off(
|
|
634
|
-
this.lf.off(
|
|
635
|
-
this.lf.off(
|
|
636
|
-
this.lf.off(
|
|
637
|
-
this.lf.off(
|
|
638
|
-
this.lf.off(
|
|
639
|
-
this.lf.off(
|
|
640
|
-
this.lf.off(
|
|
641
|
-
this.lf.off(
|
|
790
|
+
this.lf.off(EventType.NODE_ADD, this.onNodeAdd);
|
|
791
|
+
this.lf.off(EventType.NODE_DND_ADD, this.onNodeDndAdd);
|
|
792
|
+
this.lf.off(EventType.NODE_DROP, this.onNodeDrop);
|
|
793
|
+
this.lf.off(EventType.SELECTION_DROP, this.onSelectionDrop);
|
|
794
|
+
this.lf.off(EventType.NODE_DELETE, this.removeNodeFromGroup);
|
|
795
|
+
this.lf.off(EventType.EDGE_DELETE, this.onEdgeDelete);
|
|
796
|
+
this.lf.off(NODE_DRAG_EVENTS, this.onNodeDrag);
|
|
797
|
+
this.lf.off(EventType.SELECTION_DRAG, this.onSelectionDrag);
|
|
798
|
+
this.lf.off(EventType.NODE_CLICK, this.onNodeSelect);
|
|
799
|
+
this.lf.off(EventType.NODE_MOUSEMOVE, this.onNodeMove);
|
|
800
|
+
this.lf.off(EventType.NODE_RESIZE, this.onNodeResize);
|
|
801
|
+
this.lf.off(EventType.GRAPH_RENDERED, this.onGraphRendered);
|
|
802
|
+
this.lf.off(ExtensionEventType.GROUP_ADD_NODE, this.onGroupAddNode);
|
|
642
803
|
// 还原 lf.addElements 方法?
|
|
804
|
+
if (this.originDeleteNode) {
|
|
805
|
+
this.lf.deleteNode = this.originDeleteNode;
|
|
806
|
+
}
|
|
643
807
|
// 移除 graphModel 上重写的 addNodeMoveRules 方法?
|
|
644
808
|
// TODO: 讨论一下插件该具体做些什么
|
|
645
809
|
};
|