@logicflow/extension 2.0.12 → 2.0.14
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/.turbo/turbo-build.log +16 -8
- package/CHANGELOG.md +19 -0
- package/dist/index.css +1 -278
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +1 -0
- package/es/bpmn-elements/presets/Pool/Pool.d.ts +2 -2
- package/es/components/mini-map/index.d.ts +2 -0
- package/es/components/mini-map/index.js +10 -0
- package/es/components/selection-select/index.js +8 -6
- package/es/dynamic-group/model.d.ts +6 -0
- package/es/dynamic-group/model.js +20 -0
- package/es/dynamic-group/node.d.ts +2 -1
- package/es/dynamic-group/node.js +15 -14
- package/es/index.css +1 -278
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/style/index.css +1 -278
- package/es/style/raw.d.ts +1 -1
- package/es/style/raw.js +1 -1
- package/es/tools/label/Label.d.ts +5 -0
- package/es/tools/label/Label.js +82 -31
- package/es/tools/label/LabelModel.js +1 -0
- package/es/tools/label/index.d.ts +1 -0
- package/es/tools/label/index.js +51 -4
- package/es/tools/proximity-connect/index.d.ts +42 -0
- package/es/tools/proximity-connect/index.js +337 -0
- package/lib/bpmn-elements/presets/Pool/Pool.d.ts +2 -2
- package/lib/components/mini-map/index.d.ts +2 -0
- package/lib/components/mini-map/index.js +10 -0
- package/lib/components/selection-select/index.js +8 -6
- package/lib/dynamic-group/model.d.ts +6 -0
- package/lib/dynamic-group/model.js +20 -0
- package/lib/dynamic-group/node.d.ts +2 -1
- package/lib/dynamic-group/node.js +15 -14
- package/lib/index.css +1 -278
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/style/index.css +1 -278
- package/lib/style/raw.d.ts +1 -1
- package/lib/style/raw.js +1 -1
- package/lib/tools/label/Label.d.ts +5 -0
- package/lib/tools/label/Label.js +82 -31
- package/lib/tools/label/LabelModel.js +1 -0
- package/lib/tools/label/index.d.ts +1 -0
- package/lib/tools/label/index.js +50 -3
- package/lib/tools/proximity-connect/index.d.ts +42 -0
- package/lib/tools/proximity-connect/index.js +340 -0
- package/package.json +3 -3
- package/src/components/selection-select/index.ts +8 -6
- package/src/dynamic-group/model.ts +29 -0
- package/src/dynamic-group/node.ts +21 -17
- package/src/tools/label/Label.tsx +9 -0
- package/src/tools/label/index.ts +6 -2
- package/stats.html +1 -1
- package/es/index.less +0 -1
- package/es/style/index.less +0 -327
- package/lib/index.less +0 -1
- package/lib/style/index.less +0 -327
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ProximityConnect = void 0;
|
|
15
|
+
var core_1 = require("@logicflow/core");
|
|
16
|
+
var lodash_es_1 = require("lodash-es");
|
|
17
|
+
var ProximityConnect = /** @class */ (function () {
|
|
18
|
+
function ProximityConnect(_a) {
|
|
19
|
+
var lf = _a.lf, options = _a.options;
|
|
20
|
+
this.enable = true;
|
|
21
|
+
this.currentDistance = Infinity; // 当前间距
|
|
22
|
+
this.thresholdDistance = 100; // 节点-节点连接距离阈值
|
|
23
|
+
this.reverseDirection = false; // 节点-节点连线方向,默认是拖拽节点连向最近节点
|
|
24
|
+
this.virtualEdgeStyle = {
|
|
25
|
+
strokeDasharray: '10,10',
|
|
26
|
+
stroke: '#acacac',
|
|
27
|
+
}; // 虚拟边样式
|
|
28
|
+
this.lf = lf;
|
|
29
|
+
(0, lodash_es_1.assign)(this, options);
|
|
30
|
+
}
|
|
31
|
+
ProximityConnect.prototype.render = function () {
|
|
32
|
+
this.addEventListeners();
|
|
33
|
+
};
|
|
34
|
+
// 增加节点拖拽和锚点拖拽的事件监听
|
|
35
|
+
ProximityConnect.prototype.addEventListeners = function () {
|
|
36
|
+
var _this = this;
|
|
37
|
+
// 节点开始拖拽事件
|
|
38
|
+
this.lf.graphModel.eventCenter.on('node:dragstart', function (_a) {
|
|
39
|
+
var data = _a.data;
|
|
40
|
+
if (!_this.enable)
|
|
41
|
+
return;
|
|
42
|
+
var graphModel = _this.lf.graphModel;
|
|
43
|
+
var id = data.id;
|
|
44
|
+
_this.currentNode = graphModel.getNodeModelById(id);
|
|
45
|
+
});
|
|
46
|
+
// 节点拖拽事件
|
|
47
|
+
this.lf.graphModel.eventCenter.on('node:drag', function () {
|
|
48
|
+
_this.handleNodeDrag();
|
|
49
|
+
});
|
|
50
|
+
// 锚点开始拖拽事件
|
|
51
|
+
this.lf.graphModel.eventCenter.on('anchor:dragstart', function (_a) {
|
|
52
|
+
var data = _a.data, nodeModel = _a.nodeModel;
|
|
53
|
+
if (!_this.enable)
|
|
54
|
+
return;
|
|
55
|
+
_this.currentNode = nodeModel;
|
|
56
|
+
_this.currentAnchor = data;
|
|
57
|
+
});
|
|
58
|
+
// 锚点拖拽事件
|
|
59
|
+
this.lf.graphModel.eventCenter.on('anchor:drag', function (_a) {
|
|
60
|
+
var _b = _a.e, clientX = _b.clientX, clientY = _b.clientY;
|
|
61
|
+
if (!_this.enable)
|
|
62
|
+
return;
|
|
63
|
+
_this.handleAnchorDrag(clientX, clientY);
|
|
64
|
+
});
|
|
65
|
+
// 节点、锚点拖拽结束事件
|
|
66
|
+
this.lf.graphModel.eventCenter.on('node:drop,anchor:dragend', function () {
|
|
67
|
+
if (!_this.enable)
|
|
68
|
+
return;
|
|
69
|
+
_this.handleDrop();
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
// 节点拖拽动作
|
|
73
|
+
ProximityConnect.prototype.handleNodeDrag = function () {
|
|
74
|
+
/**
|
|
75
|
+
* 主要做几件事情
|
|
76
|
+
* 判断当前是否有虚拟连线,有的话判断两点距离是否超过阈值,超过的话删除连线
|
|
77
|
+
* 遍历画布上的所有节点,找到距离最近的节点,获取其所有锚点数据
|
|
78
|
+
* 判断每个锚点与当前选中节点的所有锚点之间的距离,找到路路径最短的两个点时,把当前节点、当前锚点当前最短记录记录下来,作为当前最近数据
|
|
79
|
+
* 判断当前最短距离是否小于阈值
|
|
80
|
+
* 如果是 就创建虚拟边
|
|
81
|
+
*/
|
|
82
|
+
var nodes = this.lf.graphModel.nodes;
|
|
83
|
+
if (!(0, lodash_es_1.isNil)(this.virtualEdge)) {
|
|
84
|
+
var _a = this.virtualEdge, startPoint = _a.startPoint, endPoint = _a.endPoint, id = _a.id;
|
|
85
|
+
var curDistance = (0, core_1.twoPointDistance)(startPoint, endPoint);
|
|
86
|
+
if (curDistance > this.thresholdDistance) {
|
|
87
|
+
this.lf.deleteEdge(id);
|
|
88
|
+
this.virtualEdge = undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (this.currentNode) {
|
|
92
|
+
this.findClosestAnchorOfNode(this.currentNode, nodes);
|
|
93
|
+
}
|
|
94
|
+
if (this.currentDistance < this.thresholdDistance) {
|
|
95
|
+
this.addVirtualEdge();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// 节点放下
|
|
99
|
+
ProximityConnect.prototype.handleDrop = function () {
|
|
100
|
+
this.addActualEdge();
|
|
101
|
+
this.resetData();
|
|
102
|
+
};
|
|
103
|
+
// 锚点拖拽动作
|
|
104
|
+
ProximityConnect.prototype.handleAnchorDrag = function (clientX, clientY) {
|
|
105
|
+
// 获取当前点在画布上的位置
|
|
106
|
+
var graphModel = this.lf.graphModel;
|
|
107
|
+
var _a = graphModel.getPointByClient({
|
|
108
|
+
x: clientX,
|
|
109
|
+
y: clientY,
|
|
110
|
+
}).canvasOverlayPosition, x = _a.x, y = _a.y;
|
|
111
|
+
if ((0, lodash_es_1.isNil)(x) || (0, lodash_es_1.isNil)(y))
|
|
112
|
+
return;
|
|
113
|
+
var currentPoint = { x: x, y: y };
|
|
114
|
+
var nodes = graphModel.nodes;
|
|
115
|
+
// 判断当前是否有虚拟连线,有的话判断两点距离是否超过阈值,超过的话删除连线
|
|
116
|
+
if (!(0, lodash_es_1.isNil)(this.virtualEdge)) {
|
|
117
|
+
var _b = this.virtualEdge, endPoint = _b.endPoint, id = _b.id;
|
|
118
|
+
var curDistance = (0, core_1.twoPointDistance)(currentPoint, endPoint);
|
|
119
|
+
if (curDistance > this.thresholdDistance) {
|
|
120
|
+
this.lf.deleteEdge(id);
|
|
121
|
+
this.virtualEdge = undefined;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// 记录最近点的信息
|
|
125
|
+
this.findClosestAnchorOfAnchor(currentPoint, nodes);
|
|
126
|
+
if (this.currentDistance < this.thresholdDistance) {
|
|
127
|
+
this.addVirtualEdge();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
// 节点→节点 找最近的节点和锚点
|
|
131
|
+
ProximityConnect.prototype.findClosestAnchorOfNode = function (draggingNode, allNodes) {
|
|
132
|
+
var _this = this;
|
|
133
|
+
if ((0, lodash_es_1.isNil)(draggingNode) || (0, lodash_es_1.isEmpty)(draggingNode))
|
|
134
|
+
return;
|
|
135
|
+
var _a = draggingNode.anchors, draggingAnchors = _a === void 0 ? [] : _a, id = draggingNode.id;
|
|
136
|
+
var distance;
|
|
137
|
+
var preConnectAnchor;
|
|
138
|
+
var closestAnchor;
|
|
139
|
+
var closestNode;
|
|
140
|
+
allNodes.forEach(function (node) {
|
|
141
|
+
if ((0, lodash_es_1.isEqual)(node.id, id))
|
|
142
|
+
return;
|
|
143
|
+
var _a = node.anchors, anchors = _a === void 0 ? [] : _a;
|
|
144
|
+
// 遍历所有节点,找离当前拖拽节点最近的可连接节点和锚点
|
|
145
|
+
anchors.forEach(function (anchor) {
|
|
146
|
+
// 找距离最近的两个锚点
|
|
147
|
+
draggingAnchors.forEach(function (draggingAnchor) {
|
|
148
|
+
// 判断拖拽点锚点和当前锚点是否可连线
|
|
149
|
+
var anchorAllowConnect = _this.anchorAllowConnect(node, anchor, draggingAnchor);
|
|
150
|
+
if (!anchorAllowConnect)
|
|
151
|
+
return;
|
|
152
|
+
// 获取两个锚点之间的距离
|
|
153
|
+
var curDistance = (0, core_1.twoPointDistance)(draggingAnchor, anchor);
|
|
154
|
+
if (!distance || curDistance < distance) {
|
|
155
|
+
// 如果是第一条数据,或者当前这对锚点距离更短,就替换数据
|
|
156
|
+
distance = curDistance;
|
|
157
|
+
preConnectAnchor = draggingAnchor;
|
|
158
|
+
closestAnchor = anchor;
|
|
159
|
+
closestNode = node;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
this.currentDistance = distance;
|
|
165
|
+
this.currentAnchor = preConnectAnchor;
|
|
166
|
+
this.closestAnchor = closestAnchor;
|
|
167
|
+
this.closestNode = closestNode;
|
|
168
|
+
};
|
|
169
|
+
// 锚点→节点 找最近的锚点
|
|
170
|
+
ProximityConnect.prototype.findClosestAnchorOfAnchor = function (draggingPoint, allNodes) {
|
|
171
|
+
var _this = this;
|
|
172
|
+
if ((0, lodash_es_1.isNil)(draggingPoint))
|
|
173
|
+
return;
|
|
174
|
+
var distance;
|
|
175
|
+
var closestAnchor;
|
|
176
|
+
var closestNode;
|
|
177
|
+
var _a = this, currentNode = _a.currentNode, currentAnchor = _a.currentAnchor;
|
|
178
|
+
allNodes.forEach(function (node) {
|
|
179
|
+
if (!currentNode)
|
|
180
|
+
return;
|
|
181
|
+
var _a = node.anchors, anchors = _a === void 0 ? [] : _a;
|
|
182
|
+
// 遍历所有节点,找离当前拖拽节点最近的可连接节点和锚点
|
|
183
|
+
anchors.forEach(function (anchor) {
|
|
184
|
+
var _a;
|
|
185
|
+
if ((0, lodash_es_1.isEqual)((_a = _this.currentAnchor) === null || _a === void 0 ? void 0 : _a.id, anchor.id))
|
|
186
|
+
return;
|
|
187
|
+
// 判断拖拽点锚点和当前锚点是否可连线
|
|
188
|
+
var anchorAllowConnect = _this.anchorAllowConnect(node, anchor, currentAnchor);
|
|
189
|
+
if (!anchorAllowConnect)
|
|
190
|
+
return;
|
|
191
|
+
// 获取两个锚点之间的距离
|
|
192
|
+
var curDistance = (0, core_1.twoPointDistance)(draggingPoint, anchor);
|
|
193
|
+
if (!distance || curDistance < distance) {
|
|
194
|
+
// 如果是第一条数据,或者当前这对锚点距离更短,就替换数据
|
|
195
|
+
distance = curDistance;
|
|
196
|
+
closestAnchor = anchor;
|
|
197
|
+
closestNode = node;
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
this.currentDistance = distance;
|
|
202
|
+
this.closestAnchor = closestAnchor;
|
|
203
|
+
this.closestNode = closestNode;
|
|
204
|
+
};
|
|
205
|
+
// 判断锚点是否允许连线
|
|
206
|
+
ProximityConnect.prototype.anchorAllowConnect = function (node, anchor, draggingAnchor) {
|
|
207
|
+
var currentNode = this.currentNode;
|
|
208
|
+
if (!currentNode)
|
|
209
|
+
return;
|
|
210
|
+
// 判断起点是否可连接
|
|
211
|
+
var sourceValidResult = (this.reverseDirection
|
|
212
|
+
? node.isAllowConnectedAsSource(currentNode, anchor, draggingAnchor)
|
|
213
|
+
: currentNode.isAllowConnectedAsSource(node, draggingAnchor, anchor)).isAllPass;
|
|
214
|
+
// 判断终点是否可连接
|
|
215
|
+
var targetValidResult = (this.reverseDirection
|
|
216
|
+
? currentNode.isAllowConnectedAsTarget(node, anchor, draggingAnchor)
|
|
217
|
+
: node.isAllowConnectedAsTarget(currentNode, draggingAnchor, anchor)).isAllPass;
|
|
218
|
+
return sourceValidResult && targetValidResult;
|
|
219
|
+
};
|
|
220
|
+
// 判断是否应该删除虚拟边
|
|
221
|
+
ProximityConnect.prototype.sameEdgeIsExist = function (edge) {
|
|
222
|
+
if ((0, lodash_es_1.isNil)(this.closestNode) ||
|
|
223
|
+
(0, lodash_es_1.isNil)(this.currentNode) ||
|
|
224
|
+
(0, lodash_es_1.isNil)(this.closestAnchor) ||
|
|
225
|
+
(0, lodash_es_1.isNil)(this.currentAnchor))
|
|
226
|
+
return false;
|
|
227
|
+
if ((0, lodash_es_1.isNil)(edge))
|
|
228
|
+
return false;
|
|
229
|
+
var _a = this, closestNodeId = _a.closestNode.id, currentNodeId = _a.currentNode.id, closestAnchorId = _a.closestAnchor.id, currentAnchorId = _a.currentAnchor.id, reverseDirection = _a.reverseDirection;
|
|
230
|
+
var sourceNodeId = edge.sourceNodeId, targetNodeId = edge.targetNodeId, sourceAnchorId = edge.sourceAnchorId, targetAnchorId = edge.targetAnchorId;
|
|
231
|
+
var isExist = reverseDirection
|
|
232
|
+
? (0, lodash_es_1.isEqual)(closestNodeId, sourceNodeId) &&
|
|
233
|
+
(0, lodash_es_1.isEqual)(currentNodeId, targetNodeId) &&
|
|
234
|
+
(0, lodash_es_1.isEqual)(closestAnchorId, sourceAnchorId) &&
|
|
235
|
+
(0, lodash_es_1.isEqual)(currentAnchorId, targetAnchorId)
|
|
236
|
+
: (0, lodash_es_1.isEqual)(currentNodeId, sourceNodeId) &&
|
|
237
|
+
(0, lodash_es_1.isEqual)(closestNodeId, targetNodeId) &&
|
|
238
|
+
(0, lodash_es_1.isEqual)(currentAnchorId, sourceAnchorId) &&
|
|
239
|
+
(0, lodash_es_1.isEqual)(closestAnchorId, targetAnchorId);
|
|
240
|
+
return isExist;
|
|
241
|
+
};
|
|
242
|
+
// 增加虚拟边
|
|
243
|
+
ProximityConnect.prototype.addVirtualEdge = function () {
|
|
244
|
+
var _this = this;
|
|
245
|
+
var edges = this.lf.graphModel.edges;
|
|
246
|
+
// 判断当前是否已存在一条同样配置的真实边
|
|
247
|
+
var actualEdgeIsExist = (0, lodash_es_1.reduce)(edges, function (result, edge) {
|
|
248
|
+
if (edge.virtual)
|
|
249
|
+
return result;
|
|
250
|
+
return result || _this.sameEdgeIsExist(edge);
|
|
251
|
+
}, false);
|
|
252
|
+
// 如果有真实边就不重复创建边了
|
|
253
|
+
if (actualEdgeIsExist)
|
|
254
|
+
return;
|
|
255
|
+
// 判断当前是否有虚拟边
|
|
256
|
+
// 如果当前已有虚拟边,判断当前的节点和锚点信息与虚拟边的信息是否一致
|
|
257
|
+
if (!(0, lodash_es_1.isNil)(this.virtualEdge)) {
|
|
258
|
+
var edgeId = this.virtualEdge.id;
|
|
259
|
+
// 信息一致不做处理
|
|
260
|
+
if (this.sameEdgeIsExist(this.virtualEdge))
|
|
261
|
+
return;
|
|
262
|
+
// 不一致就删除老边
|
|
263
|
+
this.lf.deleteEdge(edgeId);
|
|
264
|
+
}
|
|
265
|
+
// 开始创建虚拟边
|
|
266
|
+
var _a = this, reverseDirection = _a.reverseDirection, currentNode = _a.currentNode, closestNode = _a.closestNode, currentAnchor = _a.currentAnchor, closestAnchor = _a.closestAnchor;
|
|
267
|
+
if ((0, lodash_es_1.isEmpty)(currentNode) || (0, lodash_es_1.isEmpty)(closestNode))
|
|
268
|
+
return;
|
|
269
|
+
var properties = {
|
|
270
|
+
style: this.virtualEdgeStyle,
|
|
271
|
+
};
|
|
272
|
+
this.virtualEdge = this.lf.addEdge(reverseDirection
|
|
273
|
+
? {
|
|
274
|
+
sourceNodeId: closestNode === null || closestNode === void 0 ? void 0 : closestNode.id,
|
|
275
|
+
targetNodeId: currentNode === null || currentNode === void 0 ? void 0 : currentNode.id,
|
|
276
|
+
sourceAnchorId: closestAnchor === null || closestAnchor === void 0 ? void 0 : closestAnchor.id,
|
|
277
|
+
targetAnchorId: currentAnchor === null || currentAnchor === void 0 ? void 0 : currentAnchor.id,
|
|
278
|
+
properties: properties,
|
|
279
|
+
}
|
|
280
|
+
: {
|
|
281
|
+
sourceNodeId: currentNode === null || currentNode === void 0 ? void 0 : currentNode.id,
|
|
282
|
+
targetNodeId: closestNode === null || closestNode === void 0 ? void 0 : closestNode.id,
|
|
283
|
+
sourceAnchorId: currentAnchor === null || currentAnchor === void 0 ? void 0 : currentAnchor.id,
|
|
284
|
+
targetAnchorId: closestAnchor === null || closestAnchor === void 0 ? void 0 : closestAnchor.id,
|
|
285
|
+
properties: properties,
|
|
286
|
+
});
|
|
287
|
+
this.virtualEdge.virtual = true;
|
|
288
|
+
};
|
|
289
|
+
// 增加实体边
|
|
290
|
+
ProximityConnect.prototype.addActualEdge = function () {
|
|
291
|
+
if ((0, lodash_es_1.isNil)(this.virtualEdge))
|
|
292
|
+
return;
|
|
293
|
+
var _a = this.virtualEdge, type = _a.type, sourceNodeId = _a.sourceNodeId, targetNodeId = _a.targetNodeId, sourceAnchorId = _a.sourceAnchorId, targetAnchorId = _a.targetAnchorId, startPoint = _a.startPoint, endPoint = _a.endPoint, pointsList = _a.pointsList;
|
|
294
|
+
this.lf.addEdge({
|
|
295
|
+
type: type,
|
|
296
|
+
sourceNodeId: sourceNodeId,
|
|
297
|
+
targetNodeId: targetNodeId,
|
|
298
|
+
sourceAnchorId: sourceAnchorId,
|
|
299
|
+
targetAnchorId: targetAnchorId,
|
|
300
|
+
startPoint: startPoint,
|
|
301
|
+
endPoint: endPoint,
|
|
302
|
+
pointsList: pointsList,
|
|
303
|
+
});
|
|
304
|
+
this.lf.deleteEdge(this.virtualEdge.id);
|
|
305
|
+
};
|
|
306
|
+
// 设置虚拟边样式
|
|
307
|
+
ProximityConnect.prototype.setVirtualEdgeStyle = function (value) {
|
|
308
|
+
this.virtualEdgeStyle = __assign(__assign({}, this.virtualEdgeStyle), value);
|
|
309
|
+
};
|
|
310
|
+
// 设置连线阈值
|
|
311
|
+
ProximityConnect.prototype.setThresholdDistance = function (distance) {
|
|
312
|
+
console.log('distance', distance);
|
|
313
|
+
if (!(0, lodash_es_1.isFinite)(distance))
|
|
314
|
+
return;
|
|
315
|
+
this.thresholdDistance = distance;
|
|
316
|
+
};
|
|
317
|
+
// 设置连线方向
|
|
318
|
+
ProximityConnect.prototype.setReverseDirection = function (value) {
|
|
319
|
+
this.reverseDirection = value;
|
|
320
|
+
};
|
|
321
|
+
// 设置插件开关状态
|
|
322
|
+
ProximityConnect.prototype.setEnable = function (enable) {
|
|
323
|
+
this.enable = enable;
|
|
324
|
+
if (!enable) {
|
|
325
|
+
this.resetData();
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
// 重置数据
|
|
329
|
+
ProximityConnect.prototype.resetData = function () {
|
|
330
|
+
this.closestNode = undefined;
|
|
331
|
+
this.currentDistance = Infinity;
|
|
332
|
+
this.currentNode = undefined;
|
|
333
|
+
this.currentAnchor = undefined;
|
|
334
|
+
this.closestAnchor = undefined;
|
|
335
|
+
this.virtualEdge = undefined;
|
|
336
|
+
};
|
|
337
|
+
ProximityConnect.pluginName = 'proximityConnect';
|
|
338
|
+
return ProximityConnect;
|
|
339
|
+
}());
|
|
340
|
+
exports.ProximityConnect = ProximityConnect;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logicflow/extension",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.14",
|
|
4
4
|
"description": "LogicFlow Extensions",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"author": "Logicflow-Team",
|
|
21
21
|
"license": "Apache-2.0",
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@logicflow/core": "2.0.
|
|
23
|
+
"@logicflow/core": "2.0.10"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@antv/hierarchy": "^0.6.11",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"preact": "^10.17.1",
|
|
32
32
|
"rangy": "^1.3.1",
|
|
33
33
|
"vanilla-picker": "^2.12.3",
|
|
34
|
-
"@logicflow/core": "2.0.
|
|
34
|
+
"@logicflow/core": "2.0.10"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"less": "^4.1.1",
|
|
@@ -166,18 +166,20 @@ export class SelectionSelect {
|
|
|
166
166
|
true,
|
|
167
167
|
)
|
|
168
168
|
const { dynamicGroup, group } = this.lf.graphModel
|
|
169
|
+
const nonGroupedElements: typeof elements = []
|
|
169
170
|
elements.forEach((element) => {
|
|
170
171
|
// 如果节点属于分组,则不选中节点,此处兼容旧版 Group 插件
|
|
171
|
-
if (
|
|
172
|
-
|
|
172
|
+
if (group && group.getNodeGroup(element.id)) {
|
|
173
|
+
return
|
|
173
174
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
this.lf.selectElementById(element.id, true)
|
|
175
|
+
if (dynamicGroup && dynamicGroup.getGroupByNodeId(element.id)) {
|
|
176
|
+
return
|
|
177
177
|
}
|
|
178
|
+
this.lf.selectElementById(element.id, true)
|
|
179
|
+
nonGroupedElements.push(element)
|
|
178
180
|
})
|
|
179
181
|
this.lf.emit('selection:selected', {
|
|
180
|
-
elements,
|
|
182
|
+
elements: nonGroupedElements,
|
|
181
183
|
leftTopPoint: lt,
|
|
182
184
|
rightBottomPoint: rb,
|
|
183
185
|
})
|
|
@@ -181,6 +181,35 @@ export class DynamicGroupNodeModel extends RectNodeModel<IGroupNodeProperties> {
|
|
|
181
181
|
return data
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
+
/**
|
|
185
|
+
* 获取分组内的节点
|
|
186
|
+
* @param groupModel
|
|
187
|
+
*/
|
|
188
|
+
getNodesInGroup(groupModel: DynamicGroupNodeModel): string[] {
|
|
189
|
+
const nodeIds: string[] = []
|
|
190
|
+
if (groupModel.isGroup) {
|
|
191
|
+
forEach(Array.from(groupModel.children), (nodeId: string) => {
|
|
192
|
+
nodeIds.push(nodeId)
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
return nodeIds
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
getMoveDistance(
|
|
199
|
+
deltaX: number,
|
|
200
|
+
deltaY: number,
|
|
201
|
+
isIgnoreRule = false,
|
|
202
|
+
): [number, number] {
|
|
203
|
+
const [moveDeltaX, moveDeltaY] = super.getMoveDistance(
|
|
204
|
+
deltaX,
|
|
205
|
+
deltaY,
|
|
206
|
+
isIgnoreRule,
|
|
207
|
+
)
|
|
208
|
+
const nodeIds = this.getNodesInGroup(this)
|
|
209
|
+
this.graphModel.moveNodes(nodeIds, deltaX, deltaY, isIgnoreRule)
|
|
210
|
+
return [moveDeltaX, moveDeltaY]
|
|
211
|
+
}
|
|
212
|
+
|
|
184
213
|
/**
|
|
185
214
|
* 重写 getHistoryData 方法
|
|
186
215
|
*/
|
|
@@ -106,24 +106,27 @@ export class DynamicGroupNode<
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
onNodeMouseMove = (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
|
|
109
|
+
onNodeMouseMove = () =>
|
|
110
|
+
// {
|
|
111
|
+
// deltaX,
|
|
112
|
+
// deltaY,
|
|
113
|
+
// data,
|
|
114
|
+
// }: Omit<CallbackArgs<'node:mousemove'>, 'e' | 'position'>
|
|
115
|
+
{
|
|
116
|
+
// console.log(data,deltaX,deltaY,'111')
|
|
117
|
+
// const { model: curGroup, graphModel } = this.props
|
|
118
|
+
// const { transformModel } = graphModel
|
|
119
|
+
// const { SCALE_X, SCALE_Y } = transformModel
|
|
120
|
+
// if (data.id === curGroup.id) {
|
|
121
|
+
// const nodeIds = this.getNodesInGroup(curGroup, graphModel)
|
|
122
|
+
// // https://github.com/didi/LogicFlow/issues/1914
|
|
123
|
+
// // 当调用lf.fitView()时,会改变整体的SCALE_X和SCALE_Y
|
|
124
|
+
// // 由于group的mousemove是在drag.ts的this.onDragging()处理的,在onDragging()里面进行SCALE的处理
|
|
125
|
+
// // 而"node:mousemove"emit出来跟onDragging()是同时的,也就是emit出来的数据是没有经过SCALE处理的坐标
|
|
126
|
+
// // 因此这里需要增加SCALE的处理
|
|
127
|
+
// graphModel.moveNodes(nodeIds, deltaX / SCALE_X, deltaY / SCALE_Y, true)
|
|
128
|
+
// }
|
|
125
129
|
}
|
|
126
|
-
}
|
|
127
130
|
|
|
128
131
|
graphRendered = () => {
|
|
129
132
|
const { model } = this.props
|
|
@@ -169,6 +172,7 @@ export class DynamicGroupNode<
|
|
|
169
172
|
/**
|
|
170
173
|
* 获取分组内的节点
|
|
171
174
|
* @param groupModel
|
|
175
|
+
* @param graphModel
|
|
172
176
|
*/
|
|
173
177
|
getNodesInGroup(
|
|
174
178
|
groupModel: DynamicGroupNodeModel,
|
|
@@ -182,6 +182,14 @@ export class Label extends Component<ILabelProps, ILabelState> {
|
|
|
182
182
|
})
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
handleInput = (e: InputEvent) => {
|
|
186
|
+
const { label, graphModel } = this.props
|
|
187
|
+
graphModel.eventCenter.emit('label:input', {
|
|
188
|
+
e,
|
|
189
|
+
data: label.getData(),
|
|
190
|
+
})
|
|
191
|
+
}
|
|
192
|
+
|
|
185
193
|
setElementModelLabelInfo(data) {
|
|
186
194
|
const { label, element, graphModel } = this.props
|
|
187
195
|
const {
|
|
@@ -330,6 +338,7 @@ export class Label extends Component<ILabelProps, ILabelState> {
|
|
|
330
338
|
'lf-label-editor-hover': !isEditing && (isHovered || isSelected),
|
|
331
339
|
[`lf-label-editor-${textOverflowMode}`]: !isEditing,
|
|
332
340
|
})}
|
|
341
|
+
onInput={this.handleInput}
|
|
333
342
|
style={{
|
|
334
343
|
maxWidth: `${maxLabelWidth}px`,
|
|
335
344
|
boxSizing: 'border-box',
|
package/src/tools/label/index.ts
CHANGED
|
@@ -221,8 +221,12 @@ export class Label implements Extension {
|
|
|
221
221
|
editable: true,
|
|
222
222
|
vertical: false,
|
|
223
223
|
}
|
|
224
|
-
|
|
225
|
-
if (
|
|
224
|
+
// 全局的isMultiple为false,或全局isMultiple为true但局部isMultiple指明是false,或当前label长度已经达到上线时,不允许添加多个 label
|
|
225
|
+
if (
|
|
226
|
+
!isMultiple ||
|
|
227
|
+
(isMultiple && curLabelOption.isMultiple === false) ||
|
|
228
|
+
len >= (curLabelOption?.maxCount ?? maxCount)
|
|
229
|
+
) {
|
|
226
230
|
return
|
|
227
231
|
}
|
|
228
232
|
|