@logicflow/extension 2.2.3 → 2.2.4-alpha.1
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/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/constant/events.d.ts +9 -0
- package/es/constant/events.js +11 -0
- package/es/dynamic-group/index.d.ts +52 -3
- package/es/dynamic-group/index.js +294 -117
- package/es/dynamic-group/model.d.ts +56 -3
- package/es/dynamic-group/model.js +148 -25
- 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 +52 -3
- package/lib/dynamic-group/index.js +293 -116
- package/lib/dynamic-group/model.d.ts +56 -3
- package/lib/dynamic-group/model.js +148 -25
- 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 +8 -8
|
@@ -57,9 +57,16 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
57
57
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
58
58
|
};
|
|
59
59
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
-
exports.DynamicGroupNodeModel = void 0;
|
|
60
|
+
exports.DynamicGroupNodeModel = exports.DEFAULT_SENSOR_OUTLINE = void 0;
|
|
61
61
|
var core_1 = require("@logicflow/core");
|
|
62
62
|
var lodash_es_1 = require("lodash-es");
|
|
63
|
+
var events_1 = require("../constant/events");
|
|
64
|
+
var utils_1 = require("./utils");
|
|
65
|
+
/** 拖拽感应外框默认样式(可通过 pluginsOptions.dynamicGroup.sensorOutline 覆盖) */
|
|
66
|
+
exports.DEFAULT_SENSOR_OUTLINE = {
|
|
67
|
+
stroke: '#feb663',
|
|
68
|
+
strokeWidth: 2,
|
|
69
|
+
};
|
|
63
70
|
// 分组节点默认展开时的大小
|
|
64
71
|
var DEFAULT_GROUP_EXPAND_WIDTH = 400;
|
|
65
72
|
var DEFAULT_GROUP_EXPAND_HEIGHT = 230;
|
|
@@ -115,12 +122,29 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
115
122
|
this.collapsible = collapsible !== null && collapsible !== void 0 ? collapsible : true;
|
|
116
123
|
this.autoToFront = autoToFront !== null && autoToFront !== void 0 ? autoToFront : false;
|
|
117
124
|
this.setTextPosition();
|
|
118
|
-
// 禁用掉 Group 节点的文本编辑能力
|
|
119
|
-
this.text.editable = false;
|
|
120
125
|
this.text.draggable = false;
|
|
121
126
|
};
|
|
122
127
|
DynamicGroupNodeModel.prototype.setAttributes = function () {
|
|
123
128
|
_super.prototype.setAttributes.call(this);
|
|
129
|
+
this.setTextPosition();
|
|
130
|
+
};
|
|
131
|
+
DynamicGroupNodeModel.prototype.getTextStyle = function () {
|
|
132
|
+
var _a, _b, _c, _d, _e, _f;
|
|
133
|
+
var style = _super.prototype.getTextStyle.call(this);
|
|
134
|
+
var rawWrapPadding = (_d = (_c = (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a.textStyle) === null || _b === void 0 ? void 0 : _b.wrapPadding) !== null && _c !== void 0 ? _c : style.wrapPadding) !== null && _d !== void 0 ? _d : utils_1.DEFAULT_TITLE_WRAP_PADDING;
|
|
135
|
+
var pad = (0, utils_1.parseWrapPadding)(rawWrapPadding);
|
|
136
|
+
var merged = __assign(__assign({ textAlign: utils_1.DEFAULT_TITLE_TEXT_ALIGN }, style), { wrapPadding: (0, utils_1.formatWrapPaddingCss)(rawWrapPadding) });
|
|
137
|
+
var overflowMode = (_e = merged.overflowMode) !== null && _e !== void 0 ? _e : 'default';
|
|
138
|
+
var fontSize = Number((_f = merged.fontSize) !== null && _f !== void 0 ? _f : 12);
|
|
139
|
+
if (overflowMode === 'ellipsis') {
|
|
140
|
+
merged.textHeight = pad.top + fontSize + 2 + pad.bottom;
|
|
141
|
+
}
|
|
142
|
+
merged.textAnchor = (0, utils_1.textAlignToAnchor)(merged.textAlign);
|
|
143
|
+
merged.dominantBaseline = 'hanging';
|
|
144
|
+
return (0, lodash_es_1.cloneDeep)(merged);
|
|
145
|
+
};
|
|
146
|
+
DynamicGroupNodeModel.prototype.setProperties = function (properties) {
|
|
147
|
+
_super.prototype.setProperties.call(this, properties);
|
|
124
148
|
};
|
|
125
149
|
DynamicGroupNodeModel.prototype.getData = function () {
|
|
126
150
|
var _this = this;
|
|
@@ -252,19 +276,57 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
252
276
|
// step 3
|
|
253
277
|
this.collapseEdge(nextCollapseState, allRelatedEdges);
|
|
254
278
|
};
|
|
279
|
+
DynamicGroupNodeModel.prototype.getTitleHtmlRect = function () {
|
|
280
|
+
var _a, _b, _c, _d, _e;
|
|
281
|
+
var style = this.getTextStyle();
|
|
282
|
+
var pad = (0, utils_1.parseWrapPadding)((_c = (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a.textStyle) === null || _b === void 0 ? void 0 : _b.wrapPadding) !== null && _c !== void 0 ? _c : utils_1.DEFAULT_TITLE_WRAP_PADDING);
|
|
283
|
+
var overflowMode = ((_d = style.overflowMode) !== null && _d !== void 0 ? _d : 'default') === 'ellipsis'
|
|
284
|
+
? 'ellipsis'
|
|
285
|
+
: 'autoWrap';
|
|
286
|
+
return (0, utils_1.getTitleForeignObjectRect)({
|
|
287
|
+
x: this.x,
|
|
288
|
+
y: this.y,
|
|
289
|
+
width: this.width,
|
|
290
|
+
height: this.height,
|
|
291
|
+
overflowMode: overflowMode,
|
|
292
|
+
fontSize: Number((_e = style.fontSize) !== null && _e !== void 0 ? _e : 12),
|
|
293
|
+
pad: pad,
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
/**
|
|
297
|
+
* autoResize 更新分组尺寸后同步展开态快照,避免折叠/展开回退到旧尺寸。
|
|
298
|
+
*/
|
|
299
|
+
DynamicGroupNodeModel.prototype.updateExpandedSize = function (width, height) {
|
|
300
|
+
this.expandWidth = width;
|
|
301
|
+
this.expandHeight = height;
|
|
302
|
+
this.setProperties({ width: width, height: height });
|
|
303
|
+
};
|
|
255
304
|
DynamicGroupNodeModel.prototype.setTextPosition = function () {
|
|
256
|
-
var _a
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
305
|
+
var _a, _b, _c, _d;
|
|
306
|
+
var _e = this, x = _e.x, y = _e.y, width = _e.width, height = _e.height, text = _e.text;
|
|
307
|
+
if (!text) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (this.isCollapsed) {
|
|
311
|
+
if (text.x !== x || text.y !== y) {
|
|
312
|
+
this.text = __assign(__assign({}, text), { x: x, y: y });
|
|
313
|
+
}
|
|
260
314
|
return;
|
|
261
315
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
: y
|
|
316
|
+
var style = this.getTextStyle();
|
|
317
|
+
var pad = (0, utils_1.parseWrapPadding)((_c = (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a.textStyle) === null || _b === void 0 ? void 0 : _b.wrapPadding) !== null && _c !== void 0 ? _c : utils_1.DEFAULT_TITLE_WRAP_PADDING);
|
|
318
|
+
var textAlign = (_d = style.textAlign) !== null && _d !== void 0 ? _d : utils_1.DEFAULT_TITLE_TEXT_ALIGN;
|
|
319
|
+
var _f = (0, utils_1.resolveTitleTextPosition)({
|
|
320
|
+
x: x,
|
|
321
|
+
y: y,
|
|
322
|
+
width: width,
|
|
323
|
+
height: height,
|
|
324
|
+
textAlign: textAlign,
|
|
325
|
+
pad: pad,
|
|
326
|
+
}), nextX = _f.x, nextY = _f.y;
|
|
327
|
+
if (nextX !== text.x || nextY !== text.y) {
|
|
328
|
+
this.text = __assign(__assign({}, text), { x: nextX, y: nextY });
|
|
329
|
+
}
|
|
268
330
|
};
|
|
269
331
|
// 折叠操作
|
|
270
332
|
DynamicGroupNodeModel.prototype.collapse = function () {
|
|
@@ -290,14 +352,17 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
290
352
|
// 设置文本位置
|
|
291
353
|
this.setTextPosition();
|
|
292
354
|
};
|
|
293
|
-
DynamicGroupNodeModel.prototype.createVirtualEdge = function (edgeConfig) {
|
|
355
|
+
DynamicGroupNodeModel.prototype.createVirtualEdge = function (edgeConfig, realEdgeId) {
|
|
356
|
+
// 虚拟边仅用于折叠态展示,路径由锚点重算;不修改真实边的 pointsList
|
|
294
357
|
edgeConfig.pointsList = undefined;
|
|
295
358
|
var virtualEdge = this.graphModel.addEdge(edgeConfig);
|
|
296
359
|
virtualEdge.virtual = true;
|
|
297
|
-
// TODO: 强制不保存 group 连线数据???-> 为什么注释掉?是不是不能强制设置为 null,会导致无法回填
|
|
298
|
-
// virtualEdge.getData = () => null
|
|
299
360
|
virtualEdge.text.editable = false;
|
|
300
|
-
virtualEdge.isCollapsedEdge = true;
|
|
361
|
+
virtualEdge.isCollapsedEdge = true;
|
|
362
|
+
// 登记虚拟边 ↔ 真实边映射,供删除虚拟边时同步删除真实边(#2395)
|
|
363
|
+
var registry = this.graphModel.dynamicGroup;
|
|
364
|
+
registry === null || registry === void 0 ? void 0 : registry.registerCollapsedVirtualEdge(virtualEdge.id, this.id, realEdgeId);
|
|
365
|
+
return virtualEdge;
|
|
301
366
|
};
|
|
302
367
|
/**
|
|
303
368
|
* 折叠分组的时候,需要处理分组自身的连线和分组内部子节点上的连线
|
|
@@ -326,7 +391,11 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
326
391
|
var targetNodeId = edgeData.targetNodeId, sourceNodeId = edgeData.sourceNodeId;
|
|
327
392
|
var edgeConfig = __assign(__assign({}, edgeData), { id: "".concat(edgeData.id, "__").concat(idx), text: (_a = edgeData.text) === null || _a === void 0 ? void 0 : _a.value });
|
|
328
393
|
if (edge.virtual) {
|
|
394
|
+
// 先注销映射再删边,避免 deleteEdgeById 触发 edge:delete 时映射残留
|
|
395
|
+
var registry = graphModel.dynamicGroup;
|
|
396
|
+
registry === null || registry === void 0 ? void 0 : registry.unregisterCollapsedVirtualEdge(edge.id);
|
|
329
397
|
graphModel.deleteEdgeById(edge.id);
|
|
398
|
+
return;
|
|
330
399
|
}
|
|
331
400
|
// 考虑目标节点也属于分组的情况
|
|
332
401
|
var targetNodeGroup = graphModel.dynamicGroup.getGroupByNodeId(targetNodeId);
|
|
@@ -346,19 +415,25 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
346
415
|
if (_this.children.has(sourceNodeId) || _this.id === sourceNodeId) {
|
|
347
416
|
edgeConfig.startPoint = undefined;
|
|
348
417
|
edgeConfig.sourceNodeId = _this.id;
|
|
418
|
+
delete edgeConfig.sourceAnchorId;
|
|
349
419
|
}
|
|
350
420
|
else {
|
|
351
421
|
edgeConfig.endPoint = undefined;
|
|
352
422
|
edgeConfig.targetNodeId = _this.id;
|
|
423
|
+
delete edgeConfig.targetAnchorId;
|
|
353
424
|
}
|
|
354
425
|
// 如果边的起点和终点都在分组内部,则不创建新的虚拟边
|
|
355
426
|
if (targetNodeGroup.id !== _this.id || sourceNodeGroup.id !== _this.id) {
|
|
356
|
-
_this.createVirtualEdge(edgeConfig);
|
|
427
|
+
_this.createVirtualEdge(edgeConfig, edge.id);
|
|
357
428
|
}
|
|
358
429
|
edge.visible = false;
|
|
359
430
|
}
|
|
360
431
|
// 展开时,处理被隐藏的边的逻辑 -> expand
|
|
361
432
|
if (!collapse && !edge.visible) {
|
|
433
|
+
// 折叠期间用户已删虚拟边并连带删掉真实边时,跳过显示
|
|
434
|
+
if (!graphModel.getEdgeModelById(edge.id)) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
362
437
|
// 展开分组时:判断真实边的起点和中带你是否有任一节点在已折叠分组中,如果不是,则显示真实边
|
|
363
438
|
// 如果是,则修改这个边的对应目标节点 id 来创建虚拟边
|
|
364
439
|
if (targetNodeGroup &&
|
|
@@ -366,16 +441,19 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
366
441
|
targetNodeGroup.isCollapsed) {
|
|
367
442
|
edgeConfig.targetNodeId = targetNodeGroup.id;
|
|
368
443
|
edgeConfig.endPoint = undefined;
|
|
369
|
-
|
|
444
|
+
delete edgeConfig.targetAnchorId;
|
|
445
|
+
_this.createVirtualEdge(edgeConfig, edge.id);
|
|
370
446
|
}
|
|
371
447
|
else if (sourceNodeGroup &&
|
|
372
448
|
sourceNodeGroup.isGroup &&
|
|
373
449
|
sourceNodeGroup.isCollapsed) {
|
|
374
450
|
edgeConfig.sourceNodeId = sourceNodeGroup.id;
|
|
375
451
|
edgeConfig.startPoint = undefined;
|
|
376
|
-
|
|
452
|
+
delete edgeConfig.sourceAnchorId;
|
|
453
|
+
_this.createVirtualEdge(edgeConfig, edge.id);
|
|
377
454
|
}
|
|
378
455
|
else {
|
|
456
|
+
// 保留折叠态期间隐藏边已更新的几何,勿用折叠瞬间快照覆盖(折叠态拖分组场景)
|
|
379
457
|
edge.visible = true;
|
|
380
458
|
}
|
|
381
459
|
}
|
|
@@ -407,7 +485,7 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
407
485
|
DynamicGroupNodeModel.prototype.addChild = function (id) {
|
|
408
486
|
this.children.add(id);
|
|
409
487
|
var groupData = this.getData();
|
|
410
|
-
this.graphModel.eventCenter.emit(
|
|
488
|
+
this.graphModel.eventCenter.emit(events_1.ExtensionEventType.GROUP_ADD_NODE, {
|
|
411
489
|
data: groupData,
|
|
412
490
|
childId: id,
|
|
413
491
|
});
|
|
@@ -419,7 +497,9 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
419
497
|
DynamicGroupNodeModel.prototype.removeChild = function (id) {
|
|
420
498
|
this.children.delete(id);
|
|
421
499
|
var groupData = this.getData();
|
|
422
|
-
this.graphModel.eventCenter.emit(
|
|
500
|
+
this.graphModel.eventCenter.emit(events_1.ExtensionEventType.GROUP_REMOVE_NODE, {
|
|
501
|
+
data: groupData,
|
|
502
|
+
});
|
|
423
503
|
};
|
|
424
504
|
/**
|
|
425
505
|
* 当 groupA 被添加到 groupB 中时,将 groupB 及 groupB 所属的 group zIndex 减 1
|
|
@@ -435,7 +515,47 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
435
515
|
// // style.stroke = 'none'
|
|
436
516
|
// return style
|
|
437
517
|
// }
|
|
438
|
-
|
|
518
|
+
/**
|
|
519
|
+
* 展开态手动连线是否允许连到/从分组节点本身。
|
|
520
|
+
* 未设置 allowEdgeConnect 时由插件 disallowEdgeConnectToGroup 决定;折叠虚拟边不受影响。
|
|
521
|
+
*/
|
|
522
|
+
DynamicGroupNodeModel.prototype.isManualEdgeConnectAllowed = function () {
|
|
523
|
+
var _a;
|
|
524
|
+
var allowEdgeConnect = ((_a = this.properties) !== null && _a !== void 0 ? _a : {}).allowEdgeConnect;
|
|
525
|
+
if (allowEdgeConnect !== undefined) {
|
|
526
|
+
return allowEdgeConnect;
|
|
527
|
+
}
|
|
528
|
+
var plugin = this.graphModel.dynamicGroup;
|
|
529
|
+
return !(plugin === null || plugin === void 0 ? void 0 : plugin.disallowEdgeConnectToGroup);
|
|
530
|
+
};
|
|
531
|
+
DynamicGroupNodeModel.prototype.getConnectedTargetRules = function () {
|
|
532
|
+
var _this = this;
|
|
533
|
+
var rules = _super.prototype.getConnectedTargetRules.call(this);
|
|
534
|
+
rules.push({
|
|
535
|
+
message: '分组节点不允许作为边的终点',
|
|
536
|
+
validate: function () { return _this.isManualEdgeConnectAllowed(); },
|
|
537
|
+
});
|
|
538
|
+
return rules;
|
|
539
|
+
};
|
|
540
|
+
DynamicGroupNodeModel.prototype.getConnectedSourceRules = function () {
|
|
541
|
+
var _this = this;
|
|
542
|
+
var rules = _super.prototype.getConnectedSourceRules.call(this);
|
|
543
|
+
rules.push({
|
|
544
|
+
message: '分组节点不允许作为边的起点',
|
|
545
|
+
validate: function () { return _this.isManualEdgeConnectAllowed(); },
|
|
546
|
+
});
|
|
547
|
+
return rules;
|
|
548
|
+
};
|
|
549
|
+
/**
|
|
550
|
+
* 保留锚点供折叠态虚拟边使用;禁止手动连线时关闭 edgeAddable。
|
|
551
|
+
*/
|
|
552
|
+
DynamicGroupNodeModel.prototype.getDefaultAnchor = function () {
|
|
553
|
+
var anchors = _super.prototype.getDefaultAnchor.call(this);
|
|
554
|
+
if (this.isManualEdgeConnectAllowed()) {
|
|
555
|
+
return anchors;
|
|
556
|
+
}
|
|
557
|
+
return anchors.map(function (anchor) { return (__assign(__assign({}, anchor), { edgeAddable: false })); });
|
|
558
|
+
};
|
|
439
559
|
DynamicGroupNodeModel.prototype.getAnchorStyle = function () {
|
|
440
560
|
var style = _super.prototype.getAnchorStyle.call(this);
|
|
441
561
|
style.stroke = 'transparent';
|
|
@@ -450,9 +570,12 @@ var DynamicGroupNodeModel = /** @class */ (function (_super) {
|
|
|
450
570
|
* 设置分组节点 drop 区域的样式
|
|
451
571
|
*/
|
|
452
572
|
DynamicGroupNodeModel.prototype.getAddableOutlineStyle = function () {
|
|
573
|
+
var plugin = this.graphModel
|
|
574
|
+
.dynamicGroup;
|
|
575
|
+
var _a = __assign(__assign({}, exports.DEFAULT_SENSOR_OUTLINE), plugin === null || plugin === void 0 ? void 0 : plugin.sensorOutline), stroke = _a.stroke, strokeWidth = _a.strokeWidth;
|
|
453
576
|
return {
|
|
454
|
-
stroke:
|
|
455
|
-
strokeWidth:
|
|
577
|
+
stroke: stroke,
|
|
578
|
+
strokeWidth: strokeWidth,
|
|
456
579
|
strokeDasharray: '4 4',
|
|
457
580
|
fill: 'transparent',
|
|
458
581
|
};
|
|
@@ -24,6 +24,7 @@ export declare class DynamicGroupNode<P extends IDynamicGroupNodeProps = IDynami
|
|
|
24
24
|
getCollapseIcon(sx: number, sy: number): string;
|
|
25
25
|
getExpandIcon(sx: number, sy: number): string;
|
|
26
26
|
getOperateIcon(): h.JSX.Element | null;
|
|
27
|
+
getText(): h.JSX.Element | null;
|
|
27
28
|
getShape(): h.JSX.Element | null;
|
|
28
29
|
}
|
|
29
30
|
export default DynamicGroupNode;
|
|
@@ -54,7 +54,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
54
54
|
exports.DynamicGroupNode = void 0;
|
|
55
55
|
var core_1 = require("@logicflow/core");
|
|
56
56
|
var lodash_es_1 = require("lodash-es");
|
|
57
|
-
var utils_1 = require("
|
|
57
|
+
var utils_1 = require("./utils");
|
|
58
|
+
var titleText_1 = require("./titleText");
|
|
59
|
+
var utils_2 = require("../tools/label/utils");
|
|
58
60
|
var DynamicGroupNode = /** @class */ (function (_super) {
|
|
59
61
|
__extends(DynamicGroupNode, _super);
|
|
60
62
|
function DynamicGroupNode() {
|
|
@@ -92,7 +94,7 @@ var DynamicGroupNode = /** @class */ (function (_super) {
|
|
|
92
94
|
if (theta < 0)
|
|
93
95
|
theta += 360;
|
|
94
96
|
var radian = theta * (Math.PI / 180);
|
|
95
|
-
var newPoint = (0,
|
|
97
|
+
var newPoint = (0, utils_2.rotatePointAroundCenter)(point, center_1, radian);
|
|
96
98
|
child.moveTo(newPoint.x, newPoint.y);
|
|
97
99
|
child.rotate = model.rotate;
|
|
98
100
|
console.log('childInfo', child);
|
|
@@ -174,21 +176,21 @@ var DynamicGroupNode = /** @class */ (function (_super) {
|
|
|
174
176
|
_super.prototype.componentDidMount.call(this);
|
|
175
177
|
var eventCenter = this.props.graphModel.eventCenter;
|
|
176
178
|
// 在 group 旋转时,对组内的所有子节点也进行对应的旋转计算
|
|
177
|
-
eventCenter.on(
|
|
179
|
+
eventCenter.on(core_1.EventType.NODE_ROTATE, this.onNodeRotate);
|
|
178
180
|
// 在 group 缩放时,对组内的所有子节点也进行对应的缩放计算
|
|
179
|
-
eventCenter.on(
|
|
181
|
+
eventCenter.on(core_1.EventType.NODE_RESIZE, this.onNodeResize);
|
|
180
182
|
// 在 group 移动时,对组内的所有子节点也进行对应的移动计算
|
|
181
|
-
eventCenter.on(
|
|
183
|
+
eventCenter.on(core_1.EventType.NODE_MOUSEMOVE, this.onNodeMouseMove);
|
|
182
184
|
// 全部渲染完成后,判断是否【主动触发一次折叠操作】
|
|
183
|
-
eventCenter.on(
|
|
185
|
+
eventCenter.on(core_1.EventType.GRAPH_RENDERED, this.graphRendered);
|
|
184
186
|
};
|
|
185
187
|
DynamicGroupNode.prototype.componentWillUnmount = function () {
|
|
186
188
|
_super.prototype.componentWillUnmount.call(this);
|
|
187
189
|
var eventCenter = this.props.graphModel.eventCenter;
|
|
188
|
-
eventCenter.off(
|
|
189
|
-
eventCenter.off(
|
|
190
|
-
eventCenter.off(
|
|
191
|
-
eventCenter.off(
|
|
190
|
+
eventCenter.off(core_1.EventType.NODE_ROTATE, this.onNodeRotate);
|
|
191
|
+
eventCenter.off(core_1.EventType.NODE_RESIZE, this.onNodeResize);
|
|
192
|
+
eventCenter.off(core_1.EventType.NODE_MOUSEMOVE, this.onNodeMouseMove);
|
|
193
|
+
eventCenter.off(core_1.EventType.GRAPH_RENDERED, this.graphRendered);
|
|
192
194
|
};
|
|
193
195
|
/**
|
|
194
196
|
* 获取分组内的节点
|
|
@@ -236,8 +238,8 @@ var DynamicGroupNode = /** @class */ (function (_super) {
|
|
|
236
238
|
DynamicGroupNode.prototype.getOperateIcon = function () {
|
|
237
239
|
var model = this.props.model;
|
|
238
240
|
var x = model.x, y = model.y, width = model.width, height = model.height;
|
|
239
|
-
var sx = x - width / 2 +
|
|
240
|
-
var sy = y - height / 2 +
|
|
241
|
+
var sx = x - width / 2 + utils_1.DG_OPERATE_INSET;
|
|
242
|
+
var sy = y - height / 2 + utils_1.DG_OPERATE_INSET;
|
|
241
243
|
if (!model.collapsible)
|
|
242
244
|
return null;
|
|
243
245
|
var iconPath = (model === null || model === void 0 ? void 0 : model.isCollapsed)
|
|
@@ -252,8 +254,8 @@ var DynamicGroupNode = /** @class */ (function (_super) {
|
|
|
252
254
|
});
|
|
253
255
|
return (0, core_1.h)('g', {}, [
|
|
254
256
|
(0, core_1.h)('rect', {
|
|
255
|
-
height:
|
|
256
|
-
width:
|
|
257
|
+
height: utils_1.DG_OPERATE_BTN_HEIGHT,
|
|
258
|
+
width: utils_1.DG_OPERATE_BTN_WIDTH,
|
|
257
259
|
rx: 2,
|
|
258
260
|
ry: 2,
|
|
259
261
|
strokeWidth: 1,
|
|
@@ -262,20 +264,51 @@ var DynamicGroupNode = /** @class */ (function (_super) {
|
|
|
262
264
|
cursor: 'pointer',
|
|
263
265
|
x: sx,
|
|
264
266
|
y: sy,
|
|
265
|
-
|
|
267
|
+
onPointerDown: function (e) {
|
|
268
|
+
e.stopPropagation();
|
|
269
|
+
},
|
|
270
|
+
onClick: function (e) {
|
|
271
|
+
e.stopPropagation();
|
|
266
272
|
// DONE: 抛出折叠或展开事件 -> 在 toggleCollapse 方法中抛出
|
|
267
273
|
model.toggleCollapse(!model.isCollapsed);
|
|
268
274
|
},
|
|
275
|
+
onDblClick: function (e) {
|
|
276
|
+
e.stopPropagation();
|
|
277
|
+
},
|
|
269
278
|
}),
|
|
270
279
|
operateIcon,
|
|
271
280
|
]);
|
|
272
281
|
};
|
|
282
|
+
DynamicGroupNode.prototype.getText = function () {
|
|
283
|
+
var _a;
|
|
284
|
+
var _b = this.props, model = _b.model, graphModel = _b.graphModel;
|
|
285
|
+
var editConfigModel = graphModel.editConfigModel;
|
|
286
|
+
if (editConfigModel.nodeTextMode !== core_1.TextMode.TEXT)
|
|
287
|
+
return null;
|
|
288
|
+
if (model.state === core_1.ElementState.TEXT_EDIT)
|
|
289
|
+
return null;
|
|
290
|
+
var textShape = null;
|
|
291
|
+
if (model.text) {
|
|
292
|
+
var draggable = false;
|
|
293
|
+
if (editConfigModel.nodeTextDraggable && model.text.draggable) {
|
|
294
|
+
draggable = true;
|
|
295
|
+
}
|
|
296
|
+
textShape = (0, core_1.h)(titleText_1.DynamicGroupText, {
|
|
297
|
+
editable: editConfigModel.nodeTextEdit && ((_a = model.text.editable) !== null && _a !== void 0 ? _a : true),
|
|
298
|
+
model: model,
|
|
299
|
+
graphModel: graphModel,
|
|
300
|
+
draggable: draggable,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
var operateIcon = this.getOperateIcon();
|
|
304
|
+
if (!textShape && !operateIcon)
|
|
305
|
+
return null;
|
|
306
|
+
// 文本在 getShape 之后渲染;overflow 为 autoWrap/ellipsis 时使用 foreignObject,
|
|
307
|
+
// 会盖住同区域的折叠按钮。将 operateIcon 叠在文本之上以保证可点击(#1099)。
|
|
308
|
+
return (0, core_1.h)('g', {}, textShape, operateIcon);
|
|
309
|
+
};
|
|
273
310
|
DynamicGroupNode.prototype.getShape = function () {
|
|
274
|
-
return (0, core_1.h)('g', {}, [
|
|
275
|
-
this.getAppendAreaShape(),
|
|
276
|
-
_super.prototype.getShape.call(this),
|
|
277
|
-
this.getOperateIcon(),
|
|
278
|
-
]);
|
|
311
|
+
return (0, core_1.h)('g', {}, [this.getAppendAreaShape(), _super.prototype.getShape.call(this)]);
|
|
279
312
|
};
|
|
280
313
|
return DynamicGroupNode;
|
|
281
314
|
}(core_1.RectNode));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createElement as h } from 'preact/compat';
|
|
2
|
+
import { BaseText, IBaseTextProps, IBaseTextState } from '@logicflow/core';
|
|
3
|
+
type DynamicGroupTextProps = IBaseTextProps;
|
|
4
|
+
export declare class DynamicGroupText extends BaseText<DynamicGroupTextProps, IBaseTextState> {
|
|
5
|
+
getShape(): h.JSX.Element | null;
|
|
6
|
+
private renderTitleHtmlText;
|
|
7
|
+
}
|
|
8
|
+
export default DynamicGroupText;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.DynamicGroupText = void 0;
|
|
22
|
+
var jsx_runtime_1 = require("preact/jsx-runtime");
|
|
23
|
+
var classnames_1 = __importDefault(require("classnames"));
|
|
24
|
+
var core_1 = require("@logicflow/core");
|
|
25
|
+
var utils_1 = require("./utils");
|
|
26
|
+
var DynamicGroupText = /** @class */ (function (_super) {
|
|
27
|
+
__extends(DynamicGroupText, _super);
|
|
28
|
+
function DynamicGroupText() {
|
|
29
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
30
|
+
}
|
|
31
|
+
DynamicGroupText.prototype.getShape = function () {
|
|
32
|
+
var _a;
|
|
33
|
+
var model = this.props.model;
|
|
34
|
+
var value = model.text.value;
|
|
35
|
+
var style = model.getTextStyle();
|
|
36
|
+
var overflowMode = (_a = style.overflowMode) !== null && _a !== void 0 ? _a : 'default';
|
|
37
|
+
if ((0, utils_1.isHtmlTextOverflow)(overflowMode)) {
|
|
38
|
+
return this.renderTitleHtmlText(value, style);
|
|
39
|
+
}
|
|
40
|
+
return _super.prototype.getShape.call(this);
|
|
41
|
+
};
|
|
42
|
+
DynamicGroupText.prototype.renderTitleHtmlText = function (value, style) {
|
|
43
|
+
var _a;
|
|
44
|
+
var _b = this.props, model = _b.model, graphModel = _b.graphModel;
|
|
45
|
+
var _c = model.text, editable = _c.editable, draggable = _c.draggable;
|
|
46
|
+
var editConfigModel = graphModel.editConfigModel;
|
|
47
|
+
var overflowMode = style.overflowMode;
|
|
48
|
+
var fontSize = Number((_a = style.fontSize) !== null && _a !== void 0 ? _a : 12);
|
|
49
|
+
var rawWrapPadding = style.wrapPadding;
|
|
50
|
+
var pad = (0, utils_1.parseWrapPadding)(rawWrapPadding);
|
|
51
|
+
var wrapPadding = (0, utils_1.formatWrapPaddingCss)(rawWrapPadding);
|
|
52
|
+
var _d = (0, utils_1.getTitleForeignObjectRect)({
|
|
53
|
+
x: model.x,
|
|
54
|
+
y: model.y,
|
|
55
|
+
width: model.width,
|
|
56
|
+
height: model.height,
|
|
57
|
+
overflowMode: overflowMode,
|
|
58
|
+
fontSize: fontSize,
|
|
59
|
+
pad: pad,
|
|
60
|
+
}), foX = _d.foX, foY = _d.foY, foWidth = _d.foWidth, foHeight = _d.foHeight;
|
|
61
|
+
var isEllipsis = overflowMode === 'ellipsis';
|
|
62
|
+
var rows = String(value).split(/[\r\n]/g);
|
|
63
|
+
var isDraggable = editConfigModel.nodeTextDraggable || draggable;
|
|
64
|
+
return ((0, jsx_runtime_1.jsx)("g", { className: (0, classnames_1.default)({
|
|
65
|
+
'lf-element-text': editable,
|
|
66
|
+
'lf-text-draggable': !editable && isDraggable,
|
|
67
|
+
'lf-text-disabled': !editable && !isDraggable,
|
|
68
|
+
}), children: (0, jsx_runtime_1.jsx)("foreignObject", { width: foWidth, height: foHeight, x: foX, y: foY, style: { overflow: 'visible', textAlign: 'left' }, children: (0, jsx_runtime_1.jsx)("div", { className: "lf-node-text-auto-wrap lf-dg-title-html", style: {
|
|
69
|
+
boxSizing: 'border-box',
|
|
70
|
+
display: 'flex',
|
|
71
|
+
alignItems: 'flex-start',
|
|
72
|
+
justifyContent: 'stretch',
|
|
73
|
+
width: foWidth,
|
|
74
|
+
height: foHeight,
|
|
75
|
+
padding: wrapPadding,
|
|
76
|
+
}, children: (0, jsx_runtime_1.jsx)("div", { className: isEllipsis
|
|
77
|
+
? 'lf-node-text-ellipsis-content'
|
|
78
|
+
: 'lf-node-text-auto-wrap-content', title: isEllipsis ? rows.join('') : '', style: {
|
|
79
|
+
textAlign: style.textAlign,
|
|
80
|
+
fontSize: fontSize,
|
|
81
|
+
lineHeight: style.lineHeight,
|
|
82
|
+
fontFamily: style.fontFamily,
|
|
83
|
+
color: style.fill,
|
|
84
|
+
width: '100%',
|
|
85
|
+
}, children: rows.map(function (row) { return ((0, jsx_runtime_1.jsx)("div", { className: "lf-node-text--auto-wrap-inner", children: row })); }) }) }) }) }));
|
|
86
|
+
};
|
|
87
|
+
return DynamicGroupText;
|
|
88
|
+
}(core_1.BaseText));
|
|
89
|
+
exports.DynamicGroupText = DynamicGroupText;
|
|
90
|
+
exports.default = DynamicGroupText;
|
|
@@ -17,3 +17,72 @@ export declare function isAllowMoveTo(groupBounds: BoxBoundsPoint, node: BaseNod
|
|
|
17
17
|
x: boolean;
|
|
18
18
|
y: boolean;
|
|
19
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* 计算直接子节点的 bounds 并集。
|
|
22
|
+
* 无有效子节点时返回 null。
|
|
23
|
+
*/
|
|
24
|
+
export declare function getChildrenBounds(groupModel: {
|
|
25
|
+
children?: Set<string>;
|
|
26
|
+
}, getNodeById: (id: string) => BaseNodeModel | undefined): BoxBoundsPoint | null;
|
|
27
|
+
/**
|
|
28
|
+
* 判断 groupBounds 是否完全包含 childrenBounds。
|
|
29
|
+
*/
|
|
30
|
+
export declare function isGroupBoundsContainsChildren(groupBounds: BoxBoundsPoint, childrenBounds: BoxBoundsPoint): boolean;
|
|
31
|
+
/** 折叠按钮距节点顶边/左边的默认 inset,与 node.getOperateIcon 一致 */
|
|
32
|
+
export declare const DG_OPERATE_INSET = 10;
|
|
33
|
+
/** @deprecated 使用 DG_OPERATE_INSET */
|
|
34
|
+
export declare const DG_OPERATE_INSET_TOP = 10;
|
|
35
|
+
export declare const DG_OPERATE_BTN_WIDTH = 14;
|
|
36
|
+
export declare const DG_OPERATE_BTN_HEIGHT = 12;
|
|
37
|
+
/** 左对齐时推荐用于避开 operator 的 wrapPadding.left(inset + btn + inset) */
|
|
38
|
+
export declare const DG_TITLE_LEFT_CLEARANCE: number;
|
|
39
|
+
export declare const DEFAULT_TITLE_WRAP_PADDING = "0,0,0,0";
|
|
40
|
+
export declare const DEFAULT_TITLE_TEXT_ALIGN = "center";
|
|
41
|
+
export type TitleBand = {
|
|
42
|
+
bandLeft: number;
|
|
43
|
+
bandTop: number;
|
|
44
|
+
bandWidth: number;
|
|
45
|
+
bandHeight: number;
|
|
46
|
+
};
|
|
47
|
+
export type TitleForeignObjectRect = {
|
|
48
|
+
foX: number;
|
|
49
|
+
foY: number;
|
|
50
|
+
foWidth: number;
|
|
51
|
+
foHeight: number;
|
|
52
|
+
};
|
|
53
|
+
export declare function getTitleBand(options: {
|
|
54
|
+
x: number;
|
|
55
|
+
y: number;
|
|
56
|
+
width: number;
|
|
57
|
+
height: number;
|
|
58
|
+
}): TitleBand;
|
|
59
|
+
export declare function resolveTitleTextPosition(options: {
|
|
60
|
+
x: number;
|
|
61
|
+
y: number;
|
|
62
|
+
width: number;
|
|
63
|
+
height: number;
|
|
64
|
+
textAlign: string;
|
|
65
|
+
pad: ReturnType<typeof parseWrapPadding>;
|
|
66
|
+
}): {
|
|
67
|
+
x: number;
|
|
68
|
+
y: number;
|
|
69
|
+
};
|
|
70
|
+
export declare function getTitleForeignObjectRect(options: {
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
width: number;
|
|
74
|
+
height: number;
|
|
75
|
+
overflowMode: 'autoWrap' | 'ellipsis';
|
|
76
|
+
fontSize: number;
|
|
77
|
+
pad: ReturnType<typeof parseWrapPadding>;
|
|
78
|
+
}): TitleForeignObjectRect;
|
|
79
|
+
export declare function parseWrapPadding(padding?: string | number | null): {
|
|
80
|
+
top: number;
|
|
81
|
+
right: number;
|
|
82
|
+
bottom: number;
|
|
83
|
+
left: number;
|
|
84
|
+
};
|
|
85
|
+
export declare function textAlignToAnchor(textAlign?: string): 'start' | 'middle' | 'end';
|
|
86
|
+
export declare function isHtmlTextOverflow(overflowMode?: string): boolean;
|
|
87
|
+
/** LogicFlow 存储格式 `15,8,4,8` → CSS padding `15px 8px 4px 8px` */
|
|
88
|
+
export declare function formatWrapPaddingCss(padding?: string | number | null): string;
|