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