@logicflow/extension 1.2.14 → 1.2.17
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/cjs/components/menu/index.js +17 -12
- package/cjs/materials/curved-edge/index.js +143 -64
- package/cjs/materials/group/GroupNode.js +4 -1
- package/cjs/materials/group/index.js +184 -2
- package/cjs/tools/snapshot/index.js +14 -0
- package/es/components/menu/index.js +17 -12
- package/es/materials/curved-edge/index.d.ts +8 -2
- package/es/materials/curved-edge/index.js +143 -67
- package/es/materials/group/GroupNode.js +4 -1
- package/es/materials/group/index.d.ts +10 -1
- package/es/materials/group/index.js +184 -2
- package/es/tools/snapshot/index.d.ts +1 -0
- package/es/tools/snapshot/index.js +14 -0
- package/lib/AutoLayout.js +1 -1
- package/lib/BpmnAdapter.js +1 -1
- package/lib/BpmnElement.js +1 -1
- package/lib/ContextMenu.js +1 -1
- package/lib/Control.js +1 -1
- package/lib/CurvedEdge.js +1 -1
- package/lib/DndPanel.js +1 -1
- package/lib/FlowPath.js +1 -1
- package/lib/Group.js +1 -1
- package/lib/Highlight.js +1 -1
- package/lib/InsertNodeInPolyline.js +1 -1
- package/lib/Menu.js +1 -1
- package/lib/MiniMap.js +1 -1
- package/lib/NodeResize.js +1 -1
- package/lib/RectLabelNode.js +1 -1
- package/lib/SelectionSelect.js +1 -1
- package/lib/Snapshot.js +1 -1
- package/lib/TurboAdapter.js +1 -1
- package/lib/lfJson2Xml.js +1 -1
- package/lib/lfXml2Json.js +1 -1
- package/package.json +2 -2
- package/cjs/materials/curved-edge/searchMiddleIndex.js +0 -17
- package/es/materials/curved-edge/searchMiddleIndex.d.ts +0 -1
- package/es/materials/curved-edge/searchMiddleIndex.js +0 -14
|
@@ -38,81 +38,153 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
38
38
|
}
|
|
39
39
|
return ar;
|
|
40
40
|
};
|
|
41
|
-
import { PolylineEdge, PolylineEdgeModel, h } from '@logicflow/core';
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
import { PolylineEdge, PolylineEdgeModel, h, } from '@logicflow/core';
|
|
42
|
+
var directionMap = {
|
|
43
|
+
tr: 'tl',
|
|
44
|
+
lb: 'tl',
|
|
45
|
+
tl: 'tr',
|
|
46
|
+
rb: 'tr',
|
|
47
|
+
br: 'bl',
|
|
48
|
+
lt: 'bl',
|
|
49
|
+
bl: 'br',
|
|
50
|
+
rt: 'br',
|
|
51
|
+
};
|
|
52
|
+
function pointFilter(points) {
|
|
53
|
+
var all = points;
|
|
54
|
+
var i = 1;
|
|
55
|
+
while (i < all.length - 1) {
|
|
56
|
+
var _a = __read(all[i - 1], 2), x = _a[0], y = _a[1];
|
|
57
|
+
var _b = __read(all[i], 2), x1 = _b[0], y1 = _b[1];
|
|
58
|
+
var _c = __read(all[i + 1], 2), x2 = _c[0], y2 = _c[1];
|
|
59
|
+
if ((x === x1 && x1 === x2) || (y === y1 && y1 === y2)) {
|
|
60
|
+
all.splice(i, 1);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
i++;
|
|
64
|
+
}
|
|
47
65
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
66
|
+
return all;
|
|
67
|
+
}
|
|
68
|
+
function getMidPoints(cur, key, orientation, radius) {
|
|
69
|
+
var mid1 = [cur[0], cur[1]];
|
|
70
|
+
var mid2 = [cur[0], cur[1]];
|
|
71
|
+
switch (orientation) {
|
|
72
|
+
case 'tl': {
|
|
73
|
+
if (key === 'tr') {
|
|
74
|
+
mid1[1] += radius;
|
|
75
|
+
mid2[0] += radius;
|
|
58
76
|
}
|
|
59
|
-
else {
|
|
60
|
-
|
|
77
|
+
else if (key === 'lb') {
|
|
78
|
+
mid1[0] += radius;
|
|
79
|
+
mid2[1] += radius;
|
|
61
80
|
}
|
|
81
|
+
return [mid1, mid2];
|
|
62
82
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
var points = model.points, isAnimation = model.isAnimation, arrowConfig = model.arrowConfig, _a = model.radius, radius = _a === void 0 ? 5 : _a;
|
|
68
|
-
var style = model.getEdgeStyle();
|
|
69
|
-
var animationStyle = model.getEdgeAnimationStyle();
|
|
70
|
-
var points2 = this.pointFilter(points.split(' ').map(function (p) { return p.split(',').map(function (a) { return Number(a); }); }));
|
|
71
|
-
var res = searchMiddleIndex(points2);
|
|
72
|
-
if (res) {
|
|
73
|
-
var _b = __read(res, 2), first = _b[0], last = _b[1];
|
|
74
|
-
var firstPoint = points2[first];
|
|
75
|
-
var lastPoint_1 = points2[last];
|
|
76
|
-
var flag = firstPoint.some(function (num, index) { return num === lastPoint_1[index]; });
|
|
77
|
-
if (!flag) {
|
|
78
|
-
var diff = (lastPoint_1[1] - firstPoint[1]) / 2;
|
|
79
|
-
var firstNextPoint = [lastPoint_1[0], lastPoint_1[1] - diff];
|
|
80
|
-
var lastPrePoint = [firstPoint[0], firstPoint[1] + diff];
|
|
81
|
-
points2.splice(first + 1, 0, lastPrePoint, firstNextPoint);
|
|
83
|
+
case 'tr': {
|
|
84
|
+
if (key === 'tl') {
|
|
85
|
+
mid1[1] += radius;
|
|
86
|
+
mid2[0] -= radius;
|
|
82
87
|
}
|
|
88
|
+
else if (key === 'rb') {
|
|
89
|
+
mid1[0] -= radius;
|
|
90
|
+
mid2[1] += radius;
|
|
91
|
+
}
|
|
92
|
+
return [mid1, mid2];
|
|
83
93
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// 如果x相同则前一个点的x也不变,
|
|
89
|
-
// y为(这个点的y 大于前一个点的y, 则 为 这个点的y - 5;小于前一个点的y, 则为这个点的y+5)
|
|
90
|
-
// 同理,判断这个点与后一个点的x,y是否相同,如果x相同,则y进行加减,如果y相同,则x进行加减
|
|
91
|
-
for (var i = 1; i < points2.length - 1; i++) {
|
|
92
|
-
var _d = __read(points2[i - 1], 2), preX = _d[0], preY = _d[1];
|
|
93
|
-
var _e = __read(points2[i], 2), currentX = _e[0], currentY = _e[1];
|
|
94
|
-
var _f = __read(points2[i + 1], 2), nextX = _f[0], nextY = _f[1];
|
|
95
|
-
if (currentX === preX && currentY !== preY) {
|
|
96
|
-
var y = currentY > preY ? currentY - radius : currentY + radius;
|
|
97
|
-
d = d + " L " + currentX + " " + y;
|
|
94
|
+
case 'bl': {
|
|
95
|
+
if (key === 'br') {
|
|
96
|
+
mid1[1] -= radius;
|
|
97
|
+
mid2[0] += radius;
|
|
98
98
|
}
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
else if (key === 'lt') {
|
|
100
|
+
mid1[0] += radius;
|
|
101
|
+
mid2[1] -= radius;
|
|
102
102
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
return [mid1, mid2];
|
|
104
|
+
}
|
|
105
|
+
case 'br': {
|
|
106
|
+
if (key === 'bl') {
|
|
107
|
+
mid1[1] -= radius;
|
|
108
|
+
mid2[0] -= radius;
|
|
107
109
|
}
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
else if (key === 'rt') {
|
|
111
|
+
mid1[0] -= radius;
|
|
112
|
+
mid2[1] -= radius;
|
|
111
113
|
}
|
|
114
|
+
return [mid1, mid2];
|
|
112
115
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
default:
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function getPartialPath(prev, cur, next, radius) {
|
|
121
|
+
var _a;
|
|
122
|
+
var dir1 = '';
|
|
123
|
+
var dir2 = '';
|
|
124
|
+
var realRadius = radius;
|
|
125
|
+
if (prev[0] === cur[0]) {
|
|
126
|
+
dir1 = prev[1] > cur[1] ? 't' : 'b';
|
|
127
|
+
realRadius = Math.min(Math.abs(prev[0] - cur[0]), radius);
|
|
128
|
+
}
|
|
129
|
+
else if (prev[1] === cur[1]) {
|
|
130
|
+
dir1 = prev[0] > cur[0] ? 'l' : 'r';
|
|
131
|
+
realRadius = Math.min(Math.abs(prev[1] - cur[1]), radius);
|
|
132
|
+
}
|
|
133
|
+
if (cur[0] === next[0]) {
|
|
134
|
+
dir2 = cur[1] > next[1] ? 't' : 'b';
|
|
135
|
+
realRadius = Math.min(Math.abs(prev[0] - cur[0]), radius);
|
|
136
|
+
}
|
|
137
|
+
else if (cur[1] === next[1]) {
|
|
138
|
+
dir2 = cur[0] > next[0] ? 'l' : 'r';
|
|
139
|
+
realRadius = Math.min(Math.abs(prev[1] - cur[1]), radius);
|
|
140
|
+
}
|
|
141
|
+
var key = "" + dir1 + dir2;
|
|
142
|
+
var orientation = directionMap[key] || '-';
|
|
143
|
+
var path = "L " + prev[0] + " " + prev[1];
|
|
144
|
+
if (orientation === '-') {
|
|
145
|
+
path += "L " + cur[0] + " " + cur[1] + " L " + next[0] + " " + next[1];
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
var _b = __read(getMidPoints(cur, key, orientation, realRadius) || [], 2), mid1 = _b[0], mid2 = _b[1];
|
|
149
|
+
if (mid1 && mid2) {
|
|
150
|
+
path += "L " + mid1[0] + " " + mid1[1] + " Q " + cur[0] + " " + cur[1] + " " + mid2[0] + " " + mid2[1];
|
|
151
|
+
_a = __read(mid2, 2), cur[0] = _a[0], cur[1] = _a[1];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return path;
|
|
155
|
+
}
|
|
156
|
+
function getCurvedEdgePath(points, radius) {
|
|
157
|
+
var i = 0;
|
|
158
|
+
var d = '';
|
|
159
|
+
if (points.length === 2) {
|
|
160
|
+
d += "M" + points[i][0] + " " + points[i++][1] + " L " + points[i][0] + " " + points[i][1];
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
d += "M" + points[i][0] + " " + points[i++][1];
|
|
164
|
+
for (; i + 1 < points.length;) {
|
|
165
|
+
var prev = points[i - 1];
|
|
166
|
+
var cur = points[i];
|
|
167
|
+
var next = points[i++ + 1];
|
|
168
|
+
d += getPartialPath(prev, cur, next, radius);
|
|
169
|
+
}
|
|
170
|
+
d += "L " + points[i][0] + " " + points[i][1];
|
|
171
|
+
}
|
|
172
|
+
return d;
|
|
173
|
+
}
|
|
174
|
+
var CurvedEdge = /** @class */ (function (_super) {
|
|
175
|
+
__extends(CurvedEdge, _super);
|
|
176
|
+
function CurvedEdge() {
|
|
177
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
178
|
+
}
|
|
179
|
+
CurvedEdge.prototype.getEdge = function () {
|
|
180
|
+
var model = this.props.model;
|
|
181
|
+
var pointsStr = model.points, isAnimation = model.isAnimation, arrowConfig = model.arrowConfig, _a = model.radius, radius = _a === void 0 ? 5 : _a;
|
|
182
|
+
var style = model.getEdgeStyle();
|
|
183
|
+
var animationStyle = model.getEdgeAnimationStyle();
|
|
184
|
+
var points = pointFilter(pointsStr.split(' ').map(function (p) { return p.split(',').map(function (a) { return +a; }); }));
|
|
185
|
+
var d = getCurvedEdgePath(points, radius);
|
|
186
|
+
var attrs = __assign(__assign(__assign({ style: isAnimation ? animationStyle : {} }, style), arrowConfig), { fill: 'none' });
|
|
187
|
+
console.log(pointsStr, pointsStr.split(' ').map(function (p) { return p.split(',').map(function (a) { return +a; }); }), d);
|
|
116
188
|
return h('path', __assign({ d: d }, attrs));
|
|
117
189
|
};
|
|
118
190
|
return CurvedEdge;
|
|
@@ -124,6 +196,10 @@ var CurvedEdgeModel = /** @class */ (function (_super) {
|
|
|
124
196
|
}
|
|
125
197
|
return CurvedEdgeModel;
|
|
126
198
|
}(PolylineEdgeModel));
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
199
|
+
var defaultCurvedEdge = {
|
|
200
|
+
type: 'curved-edge',
|
|
201
|
+
view: CurvedEdge,
|
|
202
|
+
model: CurvedEdgeModel,
|
|
203
|
+
};
|
|
204
|
+
export default defaultCurvedEdge;
|
|
205
|
+
export { CurvedEdge, CurvedEdgeModel, getCurvedEdgePath };
|
|
@@ -136,7 +136,8 @@ var GroupNodeModel = /** @class */ (function (_super) {
|
|
|
136
136
|
if (nodeModel.isGroup && !nodeModel.isFolded) {
|
|
137
137
|
// 正常情况下,parent折叠后,children应该折叠
|
|
138
138
|
// 因此当parent准备展开时,children的值目前肯定是折叠状态,也就是nodeModel.isFolded=true,这个代码块不会触发
|
|
139
|
-
// 只有当parent准备折叠时,children
|
|
139
|
+
// 只有当parent准备折叠时,children目前状态才有可能是展开,
|
|
140
|
+
// 即nodeModel.isFolded=false,这个代码块触发,此时isFolded=true,触发children也进行折叠
|
|
140
141
|
nodeModel.foldGroup(isFolded);
|
|
141
142
|
}
|
|
142
143
|
if (nodeModel.isGroup && !isFolded) {
|
|
@@ -277,6 +278,7 @@ var GroupNodeModel = /** @class */ (function (_super) {
|
|
|
277
278
|
*/
|
|
278
279
|
GroupNodeModel.prototype.addChild = function (id) {
|
|
279
280
|
this.children.add(id);
|
|
281
|
+
this.graphModel.eventCenter.emit('group:add-node', { data: this.getData() });
|
|
280
282
|
};
|
|
281
283
|
/**
|
|
282
284
|
* 删除分组子节点
|
|
@@ -284,6 +286,7 @@ var GroupNodeModel = /** @class */ (function (_super) {
|
|
|
284
286
|
*/
|
|
285
287
|
GroupNodeModel.prototype.removeChild = function (id) {
|
|
286
288
|
this.children.delete(id);
|
|
289
|
+
this.graphModel.eventCenter.emit('group:remove-node', { data: this.getData() });
|
|
287
290
|
};
|
|
288
291
|
GroupNodeModel.prototype.getAddableOutlineStyle = function () {
|
|
289
292
|
return {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import LogicFlow, { BaseNodeModel } from '@logicflow/core';
|
|
1
|
+
import LogicFlow, { BaseEdgeModel, BaseNodeModel, EdgeConfig } from '@logicflow/core';
|
|
2
2
|
import GroupNode from './GroupNode';
|
|
3
3
|
declare type BaseNodeId = string;
|
|
4
4
|
declare type GroupId = string;
|
|
@@ -17,6 +17,15 @@ declare class Group {
|
|
|
17
17
|
constructor({ lf }: {
|
|
18
18
|
lf: any;
|
|
19
19
|
});
|
|
20
|
+
/**
|
|
21
|
+
* 创建一个Group类型节点内部的所有子节点的副本
|
|
22
|
+
* 并且在遍历所有nodes的过程中顺便拿到所有edges(只在Group范围的edges)
|
|
23
|
+
*/
|
|
24
|
+
createAllChildNodes(nodeIdMap: Record<string, string>, children: Set<string>, current: BaseNodeModel, distance: number): {
|
|
25
|
+
nodesArray: BaseNodeModel[];
|
|
26
|
+
edgesArray: EdgeConfig[];
|
|
27
|
+
};
|
|
28
|
+
createEdgeModel(edge: EdgeConfig, nodeIdMap: Record<string, string>, distance: number): BaseEdgeModel;
|
|
20
29
|
/**
|
|
21
30
|
* 获取一个节点内部所有的子节点,包裹分组的子节点
|
|
22
31
|
*/
|
|
@@ -1,3 +1,47 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
13
|
+
var t = {};
|
|
14
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
15
|
+
t[p] = s[p];
|
|
16
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
17
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
18
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
19
|
+
t[p[i]] = s[p[i]];
|
|
20
|
+
}
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
24
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
25
|
+
if (!m) return o;
|
|
26
|
+
var i = m.call(o), r, ar = [], e;
|
|
27
|
+
try {
|
|
28
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
29
|
+
}
|
|
30
|
+
catch (error) { e = { error: error }; }
|
|
31
|
+
finally {
|
|
32
|
+
try {
|
|
33
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
34
|
+
}
|
|
35
|
+
finally { if (e) throw e.error; }
|
|
36
|
+
}
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
var __spread = (this && this.__spread) || function () {
|
|
40
|
+
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
/* eslint-disable no-shadow */
|
|
44
|
+
import { EventType, } from '@logicflow/core';
|
|
1
45
|
import GroupNode from './GroupNode';
|
|
2
46
|
var DEFAULT_TOP_Z_INDEX = -1000;
|
|
3
47
|
var DEFAULT_BOTTOM_Z_INDEX = -10000;
|
|
@@ -158,13 +202,15 @@ var Group = /** @class */ (function () {
|
|
|
158
202
|
lf.register(GroupNode);
|
|
159
203
|
this.lf = lf;
|
|
160
204
|
lf.graphModel.addNodeMoveRules(function (model, deltaX, deltaY) {
|
|
161
|
-
if (model.isGroup) {
|
|
205
|
+
if (model.isGroup) {
|
|
206
|
+
// 如果移动的是分组,那么分组的子节点也跟着移动。
|
|
162
207
|
var nodeIds = _this.getNodeAllChild(model);
|
|
163
208
|
lf.graphModel.moveNodes(nodeIds, deltaX, deltaY, true);
|
|
164
209
|
return true;
|
|
165
210
|
}
|
|
166
211
|
var groupModel = lf.getNodeModelById(_this.nodeGroupMap.get(model.id));
|
|
167
|
-
if (groupModel && groupModel.isRestrict) {
|
|
212
|
+
if (groupModel && groupModel.isRestrict) {
|
|
213
|
+
// 如果移动的节点存在分组中,且这个分组禁止子节点移出去。
|
|
168
214
|
var _a = model.getBounds(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;
|
|
169
215
|
var r = groupModel.isAllowMoveTo({
|
|
170
216
|
x1: x1 + deltaX,
|
|
@@ -182,7 +228,143 @@ var Group = /** @class */ (function () {
|
|
|
182
228
|
lf.on('node:dnd-drag,node:drag', this.setActiveGroup);
|
|
183
229
|
lf.on('node:click', this.nodeSelected);
|
|
184
230
|
lf.on('graph:rendered', this.graphRendered);
|
|
231
|
+
// https://github.com/didi/LogicFlow/issues/1346
|
|
232
|
+
// 重写addElements()方法,在addElements()原有基础上增加对group内部所有nodes和edges的复制功能
|
|
233
|
+
lf.addElements = function (_a, distance) {
|
|
234
|
+
var selectedNodes = _a.nodes, selectedEdges = _a.edges;
|
|
235
|
+
// ============== 变量初始化 ==============
|
|
236
|
+
var nodeIdMap = {};
|
|
237
|
+
var elements = {
|
|
238
|
+
nodes: [],
|
|
239
|
+
edges: [],
|
|
240
|
+
};
|
|
241
|
+
var groupInnerEdges = [];
|
|
242
|
+
// ============== 变量初始化 ==============
|
|
243
|
+
for (var i = 0; i < selectedNodes.length; i++) {
|
|
244
|
+
var node = selectedNodes[i];
|
|
245
|
+
var preId = node.id;
|
|
246
|
+
// @ts-ignore
|
|
247
|
+
var children = node.children, rest = __rest(node, ["children"]);
|
|
248
|
+
var nodeModel = lf.addNode(rest);
|
|
249
|
+
if (!nodeModel)
|
|
250
|
+
return { nodes: [], edges: [] };
|
|
251
|
+
if (preId)
|
|
252
|
+
nodeIdMap[preId] = nodeModel.id;
|
|
253
|
+
elements.nodes.push(nodeModel); // group的nodeModel
|
|
254
|
+
// 递归创建group的nodeModel的children
|
|
255
|
+
var edgesArray = _this.createAllChildNodes(nodeIdMap, children, nodeModel, distance).edgesArray;
|
|
256
|
+
groupInnerEdges.push.apply(groupInnerEdges, __spread(edgesArray));
|
|
257
|
+
}
|
|
258
|
+
groupInnerEdges.forEach(function (edge) {
|
|
259
|
+
_this.createEdgeModel(edge, nodeIdMap, distance);
|
|
260
|
+
});
|
|
261
|
+
// 构建的时候直接偏移,这里不需要再进行再度偏移
|
|
262
|
+
// groupInnerChildren.nodes.forEach(node => this.translationNodeData(node, distance));
|
|
263
|
+
// groupInnerChildren.edges.forEach(edge => this.translationEdgeData(edge, distance));
|
|
264
|
+
// 最外层的edges继续执行创建edgeModel的流程
|
|
265
|
+
selectedEdges.forEach(function (edge) {
|
|
266
|
+
var edgeModel = _this.createEdgeModel(edge, nodeIdMap, distance);
|
|
267
|
+
elements.edges.push(edgeModel);
|
|
268
|
+
});
|
|
269
|
+
// 返回elements进行选中效果,即触发element.selectElementById()
|
|
270
|
+
// shortcut.ts也会对最外层的nodes和edges进行偏移,即translationNodeData()
|
|
271
|
+
return elements;
|
|
272
|
+
};
|
|
185
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* 创建一个Group类型节点内部的所有子节点的副本
|
|
276
|
+
* 并且在遍历所有nodes的过程中顺便拿到所有edges(只在Group范围的edges)
|
|
277
|
+
*/
|
|
278
|
+
Group.prototype.createAllChildNodes = function (nodeIdMap, children, current, distance) {
|
|
279
|
+
var _this = this;
|
|
280
|
+
var lf = this.lf;
|
|
281
|
+
var edgesDataArray = [];
|
|
282
|
+
var edgesNodeModelArray = [];
|
|
283
|
+
var nodesArray = [];
|
|
284
|
+
children === null || children === void 0 ? void 0 : children.forEach(function (childId) {
|
|
285
|
+
var childNodeModel = lf.getNodeModelById(childId);
|
|
286
|
+
var x = childNodeModel.x, y = childNodeModel.y, properties = childNodeModel.properties, type = childNodeModel.type, text = childNodeModel.text, rotate = childNodeModel.rotate, children = childNodeModel.children, incoming = childNodeModel.incoming, outgoing = childNodeModel.outgoing;
|
|
287
|
+
// @ts-ignore
|
|
288
|
+
var eventType = EventType.NODE_GROUP_COPY || 'node:group-copy-add';
|
|
289
|
+
var newChildModel = lf.addNode({
|
|
290
|
+
x: x + distance,
|
|
291
|
+
y: y + distance,
|
|
292
|
+
properties: properties,
|
|
293
|
+
type: type,
|
|
294
|
+
text: __assign(__assign({}, text), { x: text.x + distance, y: text.y + distance }),
|
|
295
|
+
rotate: rotate,
|
|
296
|
+
}, eventType);
|
|
297
|
+
current.addChild(newChildModel.id);
|
|
298
|
+
nodeIdMap[childId] = newChildModel.id;
|
|
299
|
+
nodesArray.push(newChildModel);
|
|
300
|
+
// 存储children内部节点相关的输入边
|
|
301
|
+
childNodeModel.incoming.edges.forEach(function (edge) {
|
|
302
|
+
edgesNodeModelArray.push(edge);
|
|
303
|
+
});
|
|
304
|
+
// 存储children内部节点相关的输出边
|
|
305
|
+
childNodeModel.outgoing.edges.forEach(function (edge) {
|
|
306
|
+
edgesNodeModelArray.push(edge);
|
|
307
|
+
});
|
|
308
|
+
if (children instanceof Set) {
|
|
309
|
+
var _a = _this.createAllChildNodes(nodeIdMap, children, newChildModel, distance), childNodes = _a.nodesArray, childEdges = _a.edgesArray;
|
|
310
|
+
nodesArray.push.apply(nodesArray, __spread(childNodes));
|
|
311
|
+
edgesDataArray.push.apply(edgesDataArray, __spread(childEdges));
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
// 1. 判断每一条边的开始节点和目标节点是否在Group中
|
|
315
|
+
var filterEdgesArray = edgesNodeModelArray.filter(function (edge) { return nodeIdMap[edge.sourceNodeId] && nodeIdMap[edge.targetNodeId]; });
|
|
316
|
+
// 2. 为每一条group的内部边构建出EdgeData数据
|
|
317
|
+
// 从GraphModel.ts的getSelectElements()可以知道EdgeConfig就是EdgeData
|
|
318
|
+
var filterEdgesDataArray = filterEdgesArray.map(function (item) { return item.getData(); });
|
|
319
|
+
return {
|
|
320
|
+
nodesArray: nodesArray,
|
|
321
|
+
edgesArray: edgesDataArray.concat(filterEdgesDataArray),
|
|
322
|
+
};
|
|
323
|
+
};
|
|
324
|
+
Group.prototype.createEdgeModel = function (edge, nodeIdMap, distance) {
|
|
325
|
+
var lf = this.lf;
|
|
326
|
+
var sourceId = edge.sourceNodeId;
|
|
327
|
+
var targetId = edge.targetNodeId;
|
|
328
|
+
if (nodeIdMap[sourceId])
|
|
329
|
+
sourceId = nodeIdMap[sourceId];
|
|
330
|
+
if (nodeIdMap[targetId])
|
|
331
|
+
targetId = nodeIdMap[targetId];
|
|
332
|
+
var type = edge.type, startPoint = edge.startPoint, endPoint = edge.endPoint, pointsList = edge.pointsList, text = edge.text, rest = __rest(edge, ["type", "startPoint", "endPoint", "pointsList", "text"]);
|
|
333
|
+
// ====== 仿造shortcut.ts的translationEdgeData()逻辑 ======
|
|
334
|
+
var newStartPoint = {
|
|
335
|
+
x: startPoint.x + distance,
|
|
336
|
+
y: startPoint.y + distance,
|
|
337
|
+
};
|
|
338
|
+
var newEndPoint = {
|
|
339
|
+
x: endPoint.x + distance,
|
|
340
|
+
y: endPoint.y + distance,
|
|
341
|
+
};
|
|
342
|
+
var newPointsList = [];
|
|
343
|
+
if (pointsList && pointsList.length > 0) {
|
|
344
|
+
newPointsList = pointsList.map(function (point) {
|
|
345
|
+
point.x += distance;
|
|
346
|
+
point.y += distance;
|
|
347
|
+
return point;
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
var newText = text;
|
|
351
|
+
if (text && typeof text !== 'string') {
|
|
352
|
+
newText.x = text.x + distance;
|
|
353
|
+
newText.y = text.y + distance;
|
|
354
|
+
}
|
|
355
|
+
// ====== 仿造shortcut.ts的translationEdgeData()逻辑 ======
|
|
356
|
+
// 简化复制时的参数传入,防止创建出两个edge属于同个group这种情况
|
|
357
|
+
var edgeModel = lf.graphModel.addEdge({
|
|
358
|
+
type: type,
|
|
359
|
+
startPoint: newStartPoint,
|
|
360
|
+
endPoint: newEndPoint,
|
|
361
|
+
sourceNodeId: sourceId,
|
|
362
|
+
targetNodeId: targetId,
|
|
363
|
+
pointsList: newPointsList,
|
|
364
|
+
text: newText,
|
|
365
|
+
});
|
|
366
|
+
return edgeModel;
|
|
367
|
+
};
|
|
186
368
|
/**
|
|
187
369
|
* 获取一个节点内部所有的子节点,包裹分组的子节点
|
|
188
370
|
*/
|
|
@@ -15,6 +15,7 @@ declare class Snapshot {
|
|
|
15
15
|
getSvgRootElement(lf: any): any;
|
|
16
16
|
triggerDownload(imgURI: string): void;
|
|
17
17
|
removeAnchor(element: any): void;
|
|
18
|
+
removeRotateControl(element: any): void;
|
|
18
19
|
getSnapshot(fileName: string, backgroundColor: string): void;
|
|
19
20
|
getSnapshotBase64(backgroundColor: string): Promise<unknown>;
|
|
20
21
|
getSnapshotBlob(backgroundColor: string): Promise<unknown>;
|
|
@@ -53,6 +53,19 @@ var Snapshot = /** @class */ (function () {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
|
+
Snapshot.prototype.removeRotateControl = function (element) {
|
|
57
|
+
var childNodes = element.childNodes;
|
|
58
|
+
var childLength = element.childNodes && element.childNodes.length;
|
|
59
|
+
for (var i = 0; i < childLength; i++) {
|
|
60
|
+
var child = childNodes[i];
|
|
61
|
+
var classList = (child.classList && Array.from(child.classList)) || [];
|
|
62
|
+
if (classList.indexOf('lf-rotate-control') > -1) {
|
|
63
|
+
element.removeChild(element.childNodes[i]);
|
|
64
|
+
childLength--;
|
|
65
|
+
i--;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
56
69
|
/* 下载图片 */
|
|
57
70
|
Snapshot.prototype.getSnapshot = function (fileName, backgroundColor) {
|
|
58
71
|
var _this = this;
|
|
@@ -129,6 +142,7 @@ var Snapshot = /** @class */ (function () {
|
|
|
129
142
|
lfBase.childNodes.forEach(function (item) {
|
|
130
143
|
var element = item;
|
|
131
144
|
_this.removeAnchor(element.firstChild);
|
|
145
|
+
_this.removeRotateControl(element.firstChild);
|
|
132
146
|
});
|
|
133
147
|
}
|
|
134
148
|
}
|