@flowgram.ai/group-plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +497 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/index.d.mts +87 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +525 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/index.ts
|
|
13
|
+
import { FlowGroupController as FlowGroupController5 } from "@flowgram.ai/document";
|
|
14
|
+
|
|
15
|
+
// src/groups-layer.tsx
|
|
16
|
+
import React3 from "react";
|
|
17
|
+
import { inject, injectable } from "inversify";
|
|
18
|
+
import { FlowRendererRegistry } from "@flowgram.ai/renderer";
|
|
19
|
+
import {
|
|
20
|
+
FlowDocument as FlowDocument2,
|
|
21
|
+
FlowDocumentTransformerEntity,
|
|
22
|
+
FlowGroupService,
|
|
23
|
+
FlowNodeEntity as FlowNodeEntity2,
|
|
24
|
+
FlowNodeRenderData as FlowNodeRenderData2,
|
|
25
|
+
FlowNodeTransformData
|
|
26
|
+
} from "@flowgram.ai/document";
|
|
27
|
+
import { Layer, observeEntity, observeEntityDatas } from "@flowgram.ai/core";
|
|
28
|
+
import { domUtils } from "@flowgram.ai/utils";
|
|
29
|
+
|
|
30
|
+
// src/constant.ts
|
|
31
|
+
var GroupRenderer = /* @__PURE__ */ ((GroupRenderer2) => {
|
|
32
|
+
GroupRenderer2["GroupRender"] = "group_render";
|
|
33
|
+
GroupRenderer2["GroupBox"] = "group_box";
|
|
34
|
+
return GroupRenderer2;
|
|
35
|
+
})(GroupRenderer || {});
|
|
36
|
+
var PositionConfig = {
|
|
37
|
+
paddingWithNote: 50,
|
|
38
|
+
// note 留白大小
|
|
39
|
+
padding: 10,
|
|
40
|
+
// 无 label 的 padding
|
|
41
|
+
paddingWithAddLabel: 20,
|
|
42
|
+
// 有 label 的padding,如要放添加按钮
|
|
43
|
+
headerHeight: 20
|
|
44
|
+
// 基础头部高度
|
|
45
|
+
};
|
|
46
|
+
var GroupPluginRegister = /* @__PURE__ */ ((GroupPluginRegister2) => {
|
|
47
|
+
GroupPluginRegister2["GroupNode"] = "registerGroupNode";
|
|
48
|
+
GroupPluginRegister2["Render"] = "registerRender";
|
|
49
|
+
GroupPluginRegister2["Layer"] = "registerLayer";
|
|
50
|
+
GroupPluginRegister2["CleanGroups"] = "registerCleanGroups";
|
|
51
|
+
return GroupPluginRegister2;
|
|
52
|
+
})(GroupPluginRegister || {});
|
|
53
|
+
|
|
54
|
+
// src/components/group-render.tsx
|
|
55
|
+
import React, { useCallback, useEffect, useState } from "react";
|
|
56
|
+
import { FlowGroupController, FlowNodeRenderData } from "@flowgram.ai/document";
|
|
57
|
+
import { FlowDocument } from "@flowgram.ai/document";
|
|
58
|
+
import { useEntityFromContext, useService } from "@flowgram.ai/core";
|
|
59
|
+
import { delay } from "@flowgram.ai/utils";
|
|
60
|
+
function useCurrentDomNode() {
|
|
61
|
+
const entity = useEntityFromContext();
|
|
62
|
+
const renderData = entity.getData(FlowNodeRenderData);
|
|
63
|
+
return renderData.node;
|
|
64
|
+
}
|
|
65
|
+
var GroupRender = (props) => {
|
|
66
|
+
const { groupNode, GroupNode, GroupBoxHeader } = props;
|
|
67
|
+
const container = useCurrentDomNode();
|
|
68
|
+
const document = useService(FlowDocument);
|
|
69
|
+
const groupController = FlowGroupController.create(groupNode);
|
|
70
|
+
const [key, setKey] = useState(0);
|
|
71
|
+
const [rendering, setRendering] = useState(true);
|
|
72
|
+
const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);
|
|
73
|
+
const rerender = useCallback(async () => {
|
|
74
|
+
setRendering(true);
|
|
75
|
+
setKey(key + 1);
|
|
76
|
+
await delay(50);
|
|
77
|
+
setKey(key + 1);
|
|
78
|
+
setRendering(false);
|
|
79
|
+
}, [key]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
const disposer = document.renderTree.onTreeChange(() => {
|
|
82
|
+
if (groupController?.collapsed !== collapsedCache) {
|
|
83
|
+
setCollapsedCache(groupController?.collapsed ?? false);
|
|
84
|
+
rerender();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return () => {
|
|
88
|
+
disposer.dispose();
|
|
89
|
+
};
|
|
90
|
+
}, [key]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!groupController || groupController.collapsed) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
rerender();
|
|
96
|
+
}, []);
|
|
97
|
+
if (!groupController) {
|
|
98
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
99
|
+
}
|
|
100
|
+
const groupNodeRender = /* @__PURE__ */ React.createElement(GroupNode, { key, groupNode, groupController });
|
|
101
|
+
const groupBoxHeader = /* @__PURE__ */ React.createElement(GroupBoxHeader, { key, groupController, groupNode });
|
|
102
|
+
if (groupController.collapsed) {
|
|
103
|
+
const positionStyle = {
|
|
104
|
+
display: "block",
|
|
105
|
+
zIndex: "0",
|
|
106
|
+
width: "auto",
|
|
107
|
+
height: "auto"
|
|
108
|
+
};
|
|
109
|
+
Object.assign(container.style, positionStyle);
|
|
110
|
+
return groupNodeRender;
|
|
111
|
+
} else if (!rendering) {
|
|
112
|
+
const bounds = groupController.bounds;
|
|
113
|
+
const positionStyle = {
|
|
114
|
+
width: `${bounds.width}px`
|
|
115
|
+
};
|
|
116
|
+
Object.assign(container.style, positionStyle);
|
|
117
|
+
return groupBoxHeader;
|
|
118
|
+
} else {
|
|
119
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// src/components/group-box.tsx
|
|
124
|
+
import { useEffect as useEffect3 } from "react";
|
|
125
|
+
import React2 from "react";
|
|
126
|
+
import { FlowGroupController as FlowGroupController2 } from "@flowgram.ai/document";
|
|
127
|
+
|
|
128
|
+
// src/components/hooks.ts
|
|
129
|
+
import { useEffect as useEffect2, useRef, useState as useState2 } from "react";
|
|
130
|
+
var useHover = () => {
|
|
131
|
+
const ref = useRef(null);
|
|
132
|
+
const [hover, setHover] = useState2(false);
|
|
133
|
+
const checkMouseOver = (event) => {
|
|
134
|
+
if (!ref.current) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const { left, top, right, bottom } = ref.current.getBoundingClientRect();
|
|
138
|
+
const isOver = event.clientX >= left && event.clientX <= right && event.clientY >= top && event.clientY <= bottom;
|
|
139
|
+
setHover(isOver);
|
|
140
|
+
};
|
|
141
|
+
useEffect2(() => {
|
|
142
|
+
window.addEventListener("mousemove", checkMouseOver);
|
|
143
|
+
return () => {
|
|
144
|
+
window.removeEventListener("mousemove", checkMouseOver);
|
|
145
|
+
};
|
|
146
|
+
}, []);
|
|
147
|
+
return {
|
|
148
|
+
hover,
|
|
149
|
+
ref
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// src/components/group-box.tsx
|
|
154
|
+
var GroupBox = (props) => {
|
|
155
|
+
const { groupNode } = props;
|
|
156
|
+
const groupController = FlowGroupController2.create(groupNode);
|
|
157
|
+
const bounds = groupController.bounds;
|
|
158
|
+
const { hover, ref } = useHover();
|
|
159
|
+
const positionStyle = {
|
|
160
|
+
position: "absolute",
|
|
161
|
+
left: bounds.left,
|
|
162
|
+
top: bounds.top,
|
|
163
|
+
width: bounds.width,
|
|
164
|
+
height: bounds.height
|
|
165
|
+
};
|
|
166
|
+
const defaultBackgroundStyle = {
|
|
167
|
+
borderRadius: 10,
|
|
168
|
+
zIndex: -1,
|
|
169
|
+
outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,
|
|
170
|
+
backgroundColor: "rgb(236 233 247)"
|
|
171
|
+
};
|
|
172
|
+
const backgroundStyle = props.backgroundStyle ? props.backgroundStyle(groupController) : defaultBackgroundStyle;
|
|
173
|
+
useEffect3(() => {
|
|
174
|
+
groupController.hovered = hover;
|
|
175
|
+
}, [hover]);
|
|
176
|
+
if (!groupController || groupController.collapsed) {
|
|
177
|
+
return /* @__PURE__ */ React2.createElement(React2.Fragment, null);
|
|
178
|
+
}
|
|
179
|
+
return /* @__PURE__ */ React2.createElement("div", { className: "gedit-group-box", "data-group-id": groupNode.id }, /* @__PURE__ */ React2.createElement(
|
|
180
|
+
"div",
|
|
181
|
+
{
|
|
182
|
+
className: "gedit-group-background",
|
|
183
|
+
ref,
|
|
184
|
+
style: {
|
|
185
|
+
...positionStyle,
|
|
186
|
+
...backgroundStyle
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// src/groups-layer.tsx
|
|
193
|
+
var GroupsLayer = class extends Layer {
|
|
194
|
+
constructor() {
|
|
195
|
+
super();
|
|
196
|
+
this.className = "gedit-groups-layer";
|
|
197
|
+
this.node = domUtils.createDivWithClass(this.className);
|
|
198
|
+
this.node.style.zIndex = "0";
|
|
199
|
+
}
|
|
200
|
+
/** 缩放 */
|
|
201
|
+
onZoom(scale) {
|
|
202
|
+
this.node.style.transform = `scale(${scale})`;
|
|
203
|
+
}
|
|
204
|
+
render() {
|
|
205
|
+
if (this.documentTransformer.loading) return /* @__PURE__ */ React3.createElement(React3.Fragment, null);
|
|
206
|
+
this.documentTransformer.refresh();
|
|
207
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, this.renderGroups());
|
|
208
|
+
}
|
|
209
|
+
/** 渲染分组 */
|
|
210
|
+
renderGroups() {
|
|
211
|
+
const Box = this.renderer || GroupBox;
|
|
212
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, this.groups.map((group) => /* @__PURE__ */ React3.createElement(
|
|
213
|
+
Box,
|
|
214
|
+
{
|
|
215
|
+
key: group.groupNode.id,
|
|
216
|
+
groupNode: group.groupNode,
|
|
217
|
+
backgroundStyle: this.options.groupBoxStyle
|
|
218
|
+
}
|
|
219
|
+
)));
|
|
220
|
+
}
|
|
221
|
+
/** 所有分组 */
|
|
222
|
+
get groups() {
|
|
223
|
+
return this.groupService.getAllGroups();
|
|
224
|
+
}
|
|
225
|
+
get renderer() {
|
|
226
|
+
return this.rendererRegistry.tryToGetRendererComponent("group_box" /* GroupBox */)?.renderer;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
__decorateClass([
|
|
230
|
+
inject(FlowDocument2)
|
|
231
|
+
], GroupsLayer.prototype, "document", 2);
|
|
232
|
+
__decorateClass([
|
|
233
|
+
inject(FlowRendererRegistry)
|
|
234
|
+
], GroupsLayer.prototype, "rendererRegistry", 2);
|
|
235
|
+
__decorateClass([
|
|
236
|
+
inject(FlowGroupService)
|
|
237
|
+
], GroupsLayer.prototype, "groupService", 2);
|
|
238
|
+
__decorateClass([
|
|
239
|
+
observeEntity(FlowDocumentTransformerEntity)
|
|
240
|
+
], GroupsLayer.prototype, "documentTransformer", 2);
|
|
241
|
+
__decorateClass([
|
|
242
|
+
observeEntityDatas(FlowNodeEntity2, FlowNodeRenderData2)
|
|
243
|
+
], GroupsLayer.prototype, "renderStates", 2);
|
|
244
|
+
__decorateClass([
|
|
245
|
+
observeEntityDatas(FlowNodeEntity2, FlowNodeTransformData)
|
|
246
|
+
], GroupsLayer.prototype, "transforms", 2);
|
|
247
|
+
GroupsLayer = __decorateClass([
|
|
248
|
+
injectable()
|
|
249
|
+
], GroupsLayer);
|
|
250
|
+
|
|
251
|
+
// src/create-group-plugin.tsx
|
|
252
|
+
import { definePluginCreator } from "@flowgram.ai/core";
|
|
253
|
+
|
|
254
|
+
// src/registers/register-render.tsx
|
|
255
|
+
import React4 from "react";
|
|
256
|
+
import { FlowRendererRegistry as FlowRendererRegistry2 } from "@flowgram.ai/renderer";
|
|
257
|
+
var registerRender = (ctx, opts) => {
|
|
258
|
+
const rendererRegistry = ctx.get(FlowRendererRegistry2);
|
|
259
|
+
const renderer = (props) => /* @__PURE__ */ React4.createElement(
|
|
260
|
+
GroupRender,
|
|
261
|
+
{
|
|
262
|
+
groupNode: props.node,
|
|
263
|
+
GroupNode: opts.components.GroupNode,
|
|
264
|
+
GroupBoxHeader: opts.components.GroupBoxHeader
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
rendererRegistry.registerReactComponent("group_render" /* GroupRender */, renderer);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// src/registers/register-layer.ts
|
|
271
|
+
var registerLayer = (ctx, opts) => {
|
|
272
|
+
ctx.playground.registerLayer(GroupsLayer, opts);
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
// src/registers/register-group-node.ts
|
|
276
|
+
import { FlowDocument as FlowDocument3 } from "@flowgram.ai/document";
|
|
277
|
+
|
|
278
|
+
// src/group-node-register.tsx
|
|
279
|
+
import { Point } from "@flowgram.ai/utils";
|
|
280
|
+
import {
|
|
281
|
+
FlowGroupController as FlowGroupController4,
|
|
282
|
+
FlowNodeBaseType,
|
|
283
|
+
FlowTransitionLabelEnum,
|
|
284
|
+
FlowTransitionLineEnum
|
|
285
|
+
} from "@flowgram.ai/document";
|
|
286
|
+
var GroupRegister = {
|
|
287
|
+
type: FlowNodeBaseType.GROUP,
|
|
288
|
+
meta: {
|
|
289
|
+
exportJSON: true,
|
|
290
|
+
renderKey: "group_render" /* GroupRender */,
|
|
291
|
+
positionConfig: PositionConfig,
|
|
292
|
+
padding: (transform) => {
|
|
293
|
+
const groupController = FlowGroupController4.create(transform.entity);
|
|
294
|
+
if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {
|
|
295
|
+
return {
|
|
296
|
+
top: 0,
|
|
297
|
+
bottom: 0,
|
|
298
|
+
left: 0,
|
|
299
|
+
right: 0
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
if (transform.entity.isVertical) {
|
|
303
|
+
return {
|
|
304
|
+
top: PositionConfig.paddingWithNote,
|
|
305
|
+
bottom: PositionConfig.paddingWithAddLabel,
|
|
306
|
+
left: PositionConfig.padding,
|
|
307
|
+
right: PositionConfig.padding
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
top: PositionConfig.paddingWithNote,
|
|
312
|
+
bottom: PositionConfig.padding,
|
|
313
|
+
left: PositionConfig.padding,
|
|
314
|
+
right: PositionConfig.paddingWithAddLabel
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
getLines(transition) {
|
|
319
|
+
const { transform } = transition;
|
|
320
|
+
const lines = [];
|
|
321
|
+
if (transform.firstChild) {
|
|
322
|
+
lines.push({
|
|
323
|
+
type: FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
324
|
+
from: transform.inputPoint,
|
|
325
|
+
to: transform.firstChild.inputPoint
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (transform.next) {
|
|
329
|
+
lines.push({
|
|
330
|
+
type: FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
331
|
+
from: transform.outputPoint,
|
|
332
|
+
to: transform.next.inputPoint
|
|
333
|
+
});
|
|
334
|
+
} else {
|
|
335
|
+
lines.push({
|
|
336
|
+
type: FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
337
|
+
from: transform.outputPoint,
|
|
338
|
+
to: transform.parent.outputPoint
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
return lines;
|
|
342
|
+
},
|
|
343
|
+
getDelta(transform) {
|
|
344
|
+
const groupController = FlowGroupController4.create(transform.entity);
|
|
345
|
+
if (!groupController || groupController.collapsed) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
if (transform.entity.isVertical) {
|
|
349
|
+
return {
|
|
350
|
+
x: 0,
|
|
351
|
+
y: PositionConfig.paddingWithNote
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
x: PositionConfig.padding,
|
|
356
|
+
y: 0
|
|
357
|
+
};
|
|
358
|
+
},
|
|
359
|
+
getInputPoint(transform) {
|
|
360
|
+
const child = transform.firstChild;
|
|
361
|
+
if (!child) return transform.defaultInputPoint;
|
|
362
|
+
if (transform.entity.isVertical) {
|
|
363
|
+
return {
|
|
364
|
+
x: child.inputPoint.x,
|
|
365
|
+
y: transform.bounds.topCenter.y
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
x: transform.bounds.leftCenter.x,
|
|
370
|
+
y: child.inputPoint.y
|
|
371
|
+
};
|
|
372
|
+
},
|
|
373
|
+
getOutputPoint(transform) {
|
|
374
|
+
const child = transform.lastChild;
|
|
375
|
+
if (!child) return transform.defaultOutputPoint;
|
|
376
|
+
if (transform.entity.isVertical) {
|
|
377
|
+
return {
|
|
378
|
+
x: child.outputPoint.x,
|
|
379
|
+
y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,
|
|
384
|
+
y: child.outputPoint.y
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
getLabels(transition) {
|
|
388
|
+
const { transform } = transition;
|
|
389
|
+
if (transform.next) {
|
|
390
|
+
if (transform.entity.isVertical) {
|
|
391
|
+
return [
|
|
392
|
+
{
|
|
393
|
+
offset: Point.getMiddlePoint(
|
|
394
|
+
Point.move(transform.outputPoint, {
|
|
395
|
+
x: 0,
|
|
396
|
+
y: PositionConfig.paddingWithAddLabel / 2
|
|
397
|
+
}),
|
|
398
|
+
transform.next.inputPoint
|
|
399
|
+
),
|
|
400
|
+
type: FlowTransitionLabelEnum.ADDER_LABEL
|
|
401
|
+
}
|
|
402
|
+
];
|
|
403
|
+
}
|
|
404
|
+
return [
|
|
405
|
+
{
|
|
406
|
+
offset: Point.getMiddlePoint(
|
|
407
|
+
Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),
|
|
408
|
+
transform.next.inputPoint
|
|
409
|
+
),
|
|
410
|
+
type: FlowTransitionLabelEnum.ADDER_LABEL
|
|
411
|
+
}
|
|
412
|
+
];
|
|
413
|
+
}
|
|
414
|
+
return [
|
|
415
|
+
{
|
|
416
|
+
offset: transform.parent.outputPoint,
|
|
417
|
+
type: FlowTransitionLabelEnum.ADDER_LABEL
|
|
418
|
+
}
|
|
419
|
+
];
|
|
420
|
+
},
|
|
421
|
+
getOriginDeltaY(transform) {
|
|
422
|
+
const { children } = transform;
|
|
423
|
+
if (children.length === 0) {
|
|
424
|
+
return -transform.size.height * transform.origin.y;
|
|
425
|
+
}
|
|
426
|
+
return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// src/registers/register-group-node.ts
|
|
431
|
+
var registerGroupNode = (ctx) => {
|
|
432
|
+
const document = ctx.get(FlowDocument3);
|
|
433
|
+
document.registerFlowNodes(GroupRegister);
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
// src/registers/register-clean-groups.ts
|
|
437
|
+
import { FlowDocument as FlowDocument4 } from "@flowgram.ai/document";
|
|
438
|
+
import { FlowGroupService as FlowGroupService2 } from "@flowgram.ai/document";
|
|
439
|
+
var registerCleanGroups = (ctx, opts) => {
|
|
440
|
+
const groupService = ctx.get(FlowGroupService2);
|
|
441
|
+
const document = ctx.get(FlowDocument4);
|
|
442
|
+
const clearInvalidGroups = () => {
|
|
443
|
+
groupService.getAllGroups().forEach((group) => {
|
|
444
|
+
if (group?.nodes.length !== 0) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
if (!group.groupNode.pre) {
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
groupService.deleteGroup(group.groupNode);
|
|
451
|
+
});
|
|
452
|
+
};
|
|
453
|
+
document.originTree.onTreeChange(() => {
|
|
454
|
+
setTimeout(() => {
|
|
455
|
+
clearInvalidGroups();
|
|
456
|
+
}, 0);
|
|
457
|
+
});
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
// src/registers/index.ts
|
|
461
|
+
var groupRegisters = {
|
|
462
|
+
["registerGroupNode" /* GroupNode */]: registerGroupNode,
|
|
463
|
+
["registerRender" /* Render */]: registerRender,
|
|
464
|
+
["registerLayer" /* Layer */]: registerLayer,
|
|
465
|
+
["registerCleanGroups" /* CleanGroups */]: registerCleanGroups
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
// src/create-group-plugin.tsx
|
|
469
|
+
var createGroupPlugin = definePluginCreator({
|
|
470
|
+
onInit: (ctx, opts) => {
|
|
471
|
+
const { registers: registerConfs = {} } = opts;
|
|
472
|
+
Object.entries(groupRegisters).forEach(([key, register]) => {
|
|
473
|
+
const registerName = key;
|
|
474
|
+
const registerConf = registerConfs[registerName];
|
|
475
|
+
if (registerConf === false) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
if (typeof registerConf === "function") {
|
|
479
|
+
registerConf(ctx, opts);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
register(ctx, opts);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
export {
|
|
487
|
+
FlowGroupController5 as FlowGroupController,
|
|
488
|
+
GroupBox,
|
|
489
|
+
GroupPluginRegister,
|
|
490
|
+
GroupRegister,
|
|
491
|
+
GroupRender,
|
|
492
|
+
GroupRenderer,
|
|
493
|
+
GroupsLayer,
|
|
494
|
+
PositionConfig,
|
|
495
|
+
createGroupPlugin
|
|
496
|
+
};
|
|
497
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/groups-layer.tsx","../../src/constant.ts","../../src/components/group-render.tsx","../../src/components/group-box.tsx","../../src/components/hooks.ts","../../src/create-group-plugin.tsx","../../src/registers/register-render.tsx","../../src/registers/register-layer.ts","../../src/registers/register-group-node.ts","../../src/group-node-register.tsx","../../src/registers/register-clean-groups.ts","../../src/registers/index.ts"],"sourcesContent":["export { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","import React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","export enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport { FlowGroupController } from '@flowgram.ai/document';\nimport type { Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = props => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","import { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","import React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","import { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","import { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","import { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","import { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","import { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["FlowGroupController","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","GroupRenderer","GroupPluginRegister","useEffect","React","FlowGroupController","useEffect","useState","FlowGroupController","useEffect","React","React","FlowDocument","FlowNodeEntity","FlowNodeRenderData","React","FlowRendererRegistry","FlowRendererRegistry","React","FlowDocument","FlowGroupController","FlowGroupController","FlowDocument","FlowDocument","FlowGroupService"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { FlowNodeEntity, FlowGroupController, FlowDocument, FlowGroupService, FlowDocumentTransformerEntity, FlowNodeRenderData, FlowNodeTransformData, FlowNodeRegistry } from '@flowgram.ai/document';
|
|
2
|
+
export { FlowGroupController } from '@flowgram.ai/document';
|
|
3
|
+
import { FlowRendererRegistry } from '@flowgram.ai/renderer';
|
|
4
|
+
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
5
|
+
import { LayerOptions, PluginContext, Layer } from '@flowgram.ai/core';
|
|
6
|
+
import { FC, CSSProperties } from 'react';
|
|
7
|
+
|
|
8
|
+
declare enum GroupRenderer {
|
|
9
|
+
GroupRender = "group_render",
|
|
10
|
+
GroupBox = "group_box"
|
|
11
|
+
}
|
|
12
|
+
declare const PositionConfig: {
|
|
13
|
+
paddingWithNote: number;
|
|
14
|
+
padding: number;
|
|
15
|
+
paddingWithAddLabel: number;
|
|
16
|
+
headerHeight: number;
|
|
17
|
+
};
|
|
18
|
+
declare enum GroupPluginRegister {
|
|
19
|
+
GroupNode = "registerGroupNode",
|
|
20
|
+
Render = "registerRender",
|
|
21
|
+
Layer = "registerLayer",
|
|
22
|
+
CleanGroups = "registerCleanGroups"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type IGroupBox = FC<{
|
|
26
|
+
groupNode: FlowNodeEntity;
|
|
27
|
+
backgroundStyle?: (groupController: FlowGroupController) => CSSProperties;
|
|
28
|
+
}>;
|
|
29
|
+
type IGroupRender = FC<{
|
|
30
|
+
groupNode: FlowNodeEntity;
|
|
31
|
+
GroupNode: IGroupNode;
|
|
32
|
+
GroupBoxHeader: IGroupBoxHeader;
|
|
33
|
+
}>;
|
|
34
|
+
type IGroupNode = FC<{
|
|
35
|
+
groupNode: FlowNodeEntity;
|
|
36
|
+
groupController: FlowGroupController;
|
|
37
|
+
}>;
|
|
38
|
+
type IGroupBoxHeader = FC<{
|
|
39
|
+
groupNode: FlowNodeEntity;
|
|
40
|
+
groupController: FlowGroupController;
|
|
41
|
+
}>;
|
|
42
|
+
interface GroupsLayerOptions extends LayerOptions {
|
|
43
|
+
groupBoxStyle?: (groupController: FlowGroupController) => CSSProperties;
|
|
44
|
+
}
|
|
45
|
+
type IGroupPluginRegister = (ctx: PluginContext, opts: CreateGroupPluginOptions) => void;
|
|
46
|
+
type CreateGroupPluginOptions = GroupsLayerOptions & {
|
|
47
|
+
components?: {
|
|
48
|
+
GroupNode: IGroupNode;
|
|
49
|
+
GroupBoxHeader: IGroupBoxHeader;
|
|
50
|
+
};
|
|
51
|
+
registers?: {
|
|
52
|
+
[key in GroupPluginRegister]?: IGroupPluginRegister | boolean;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
declare class GroupsLayer extends Layer<GroupsLayerOptions> {
|
|
57
|
+
readonly node: HTMLElement;
|
|
58
|
+
protected document: FlowDocument;
|
|
59
|
+
protected readonly rendererRegistry: FlowRendererRegistry;
|
|
60
|
+
protected readonly groupService: FlowGroupService;
|
|
61
|
+
readonly documentTransformer: FlowDocumentTransformerEntity;
|
|
62
|
+
renderStates: FlowNodeRenderData[];
|
|
63
|
+
transforms: FlowNodeTransformData[];
|
|
64
|
+
private readonly className;
|
|
65
|
+
constructor();
|
|
66
|
+
/** 缩放 */
|
|
67
|
+
onZoom(scale: number): void;
|
|
68
|
+
render(): JSX.Element;
|
|
69
|
+
/** 渲染分组 */
|
|
70
|
+
protected renderGroups(): JSX.Element;
|
|
71
|
+
/** 所有分组 */
|
|
72
|
+
protected get groups(): FlowGroupController[];
|
|
73
|
+
protected get renderer(): IGroupBox;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 分组插件
|
|
78
|
+
*/
|
|
79
|
+
declare const createGroupPlugin: _flowgram_ai_core.PluginCreator<CreateGroupPluginOptions>;
|
|
80
|
+
|
|
81
|
+
declare const GroupRegister: FlowNodeRegistry;
|
|
82
|
+
|
|
83
|
+
declare const GroupRender: IGroupRender;
|
|
84
|
+
|
|
85
|
+
declare const GroupBox: IGroupBox;
|
|
86
|
+
|
|
87
|
+
export { type CreateGroupPluginOptions, GroupBox, GroupPluginRegister, GroupRegister, GroupRender, GroupRenderer, GroupsLayer, type GroupsLayerOptions, type IGroupBox, type IGroupBoxHeader, type IGroupNode, type IGroupPluginRegister, type IGroupRender, PositionConfig, createGroupPlugin };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { FlowNodeEntity, FlowGroupController, FlowDocument, FlowGroupService, FlowDocumentTransformerEntity, FlowNodeRenderData, FlowNodeTransformData, FlowNodeRegistry } from '@flowgram.ai/document';
|
|
2
|
+
export { FlowGroupController } from '@flowgram.ai/document';
|
|
3
|
+
import { FlowRendererRegistry } from '@flowgram.ai/renderer';
|
|
4
|
+
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
5
|
+
import { LayerOptions, PluginContext, Layer } from '@flowgram.ai/core';
|
|
6
|
+
import { FC, CSSProperties } from 'react';
|
|
7
|
+
|
|
8
|
+
declare enum GroupRenderer {
|
|
9
|
+
GroupRender = "group_render",
|
|
10
|
+
GroupBox = "group_box"
|
|
11
|
+
}
|
|
12
|
+
declare const PositionConfig: {
|
|
13
|
+
paddingWithNote: number;
|
|
14
|
+
padding: number;
|
|
15
|
+
paddingWithAddLabel: number;
|
|
16
|
+
headerHeight: number;
|
|
17
|
+
};
|
|
18
|
+
declare enum GroupPluginRegister {
|
|
19
|
+
GroupNode = "registerGroupNode",
|
|
20
|
+
Render = "registerRender",
|
|
21
|
+
Layer = "registerLayer",
|
|
22
|
+
CleanGroups = "registerCleanGroups"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type IGroupBox = FC<{
|
|
26
|
+
groupNode: FlowNodeEntity;
|
|
27
|
+
backgroundStyle?: (groupController: FlowGroupController) => CSSProperties;
|
|
28
|
+
}>;
|
|
29
|
+
type IGroupRender = FC<{
|
|
30
|
+
groupNode: FlowNodeEntity;
|
|
31
|
+
GroupNode: IGroupNode;
|
|
32
|
+
GroupBoxHeader: IGroupBoxHeader;
|
|
33
|
+
}>;
|
|
34
|
+
type IGroupNode = FC<{
|
|
35
|
+
groupNode: FlowNodeEntity;
|
|
36
|
+
groupController: FlowGroupController;
|
|
37
|
+
}>;
|
|
38
|
+
type IGroupBoxHeader = FC<{
|
|
39
|
+
groupNode: FlowNodeEntity;
|
|
40
|
+
groupController: FlowGroupController;
|
|
41
|
+
}>;
|
|
42
|
+
interface GroupsLayerOptions extends LayerOptions {
|
|
43
|
+
groupBoxStyle?: (groupController: FlowGroupController) => CSSProperties;
|
|
44
|
+
}
|
|
45
|
+
type IGroupPluginRegister = (ctx: PluginContext, opts: CreateGroupPluginOptions) => void;
|
|
46
|
+
type CreateGroupPluginOptions = GroupsLayerOptions & {
|
|
47
|
+
components?: {
|
|
48
|
+
GroupNode: IGroupNode;
|
|
49
|
+
GroupBoxHeader: IGroupBoxHeader;
|
|
50
|
+
};
|
|
51
|
+
registers?: {
|
|
52
|
+
[key in GroupPluginRegister]?: IGroupPluginRegister | boolean;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
declare class GroupsLayer extends Layer<GroupsLayerOptions> {
|
|
57
|
+
readonly node: HTMLElement;
|
|
58
|
+
protected document: FlowDocument;
|
|
59
|
+
protected readonly rendererRegistry: FlowRendererRegistry;
|
|
60
|
+
protected readonly groupService: FlowGroupService;
|
|
61
|
+
readonly documentTransformer: FlowDocumentTransformerEntity;
|
|
62
|
+
renderStates: FlowNodeRenderData[];
|
|
63
|
+
transforms: FlowNodeTransformData[];
|
|
64
|
+
private readonly className;
|
|
65
|
+
constructor();
|
|
66
|
+
/** 缩放 */
|
|
67
|
+
onZoom(scale: number): void;
|
|
68
|
+
render(): JSX.Element;
|
|
69
|
+
/** 渲染分组 */
|
|
70
|
+
protected renderGroups(): JSX.Element;
|
|
71
|
+
/** 所有分组 */
|
|
72
|
+
protected get groups(): FlowGroupController[];
|
|
73
|
+
protected get renderer(): IGroupBox;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 分组插件
|
|
78
|
+
*/
|
|
79
|
+
declare const createGroupPlugin: _flowgram_ai_core.PluginCreator<CreateGroupPluginOptions>;
|
|
80
|
+
|
|
81
|
+
declare const GroupRegister: FlowNodeRegistry;
|
|
82
|
+
|
|
83
|
+
declare const GroupRender: IGroupRender;
|
|
84
|
+
|
|
85
|
+
declare const GroupBox: IGroupBox;
|
|
86
|
+
|
|
87
|
+
export { type CreateGroupPluginOptions, GroupBox, GroupPluginRegister, GroupRegister, GroupRender, GroupRenderer, GroupsLayer, type GroupsLayerOptions, type IGroupBox, type IGroupBoxHeader, type IGroupNode, type IGroupPluginRegister, type IGroupRender, PositionConfig, createGroupPlugin };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
30
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
31
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
32
|
+
if (decorator = decorators[i])
|
|
33
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
34
|
+
if (kind && result) __defProp(target, key, result);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/index.ts
|
|
39
|
+
var src_exports = {};
|
|
40
|
+
__export(src_exports, {
|
|
41
|
+
FlowGroupController: () => import_document9.FlowGroupController,
|
|
42
|
+
GroupBox: () => GroupBox,
|
|
43
|
+
GroupPluginRegister: () => GroupPluginRegister,
|
|
44
|
+
GroupRegister: () => GroupRegister,
|
|
45
|
+
GroupRender: () => GroupRender,
|
|
46
|
+
GroupRenderer: () => GroupRenderer,
|
|
47
|
+
GroupsLayer: () => GroupsLayer,
|
|
48
|
+
PositionConfig: () => PositionConfig,
|
|
49
|
+
createGroupPlugin: () => createGroupPlugin
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(src_exports);
|
|
52
|
+
var import_document9 = require("@flowgram.ai/document");
|
|
53
|
+
|
|
54
|
+
// src/groups-layer.tsx
|
|
55
|
+
var import_react5 = __toESM(require("react"));
|
|
56
|
+
var import_inversify = require("inversify");
|
|
57
|
+
var import_renderer = require("@flowgram.ai/renderer");
|
|
58
|
+
var import_document4 = require("@flowgram.ai/document");
|
|
59
|
+
var import_core2 = require("@flowgram.ai/core");
|
|
60
|
+
var import_utils2 = require("@flowgram.ai/utils");
|
|
61
|
+
|
|
62
|
+
// src/constant.ts
|
|
63
|
+
var GroupRenderer = /* @__PURE__ */ ((GroupRenderer2) => {
|
|
64
|
+
GroupRenderer2["GroupRender"] = "group_render";
|
|
65
|
+
GroupRenderer2["GroupBox"] = "group_box";
|
|
66
|
+
return GroupRenderer2;
|
|
67
|
+
})(GroupRenderer || {});
|
|
68
|
+
var PositionConfig = {
|
|
69
|
+
paddingWithNote: 50,
|
|
70
|
+
// note 留白大小
|
|
71
|
+
padding: 10,
|
|
72
|
+
// 无 label 的 padding
|
|
73
|
+
paddingWithAddLabel: 20,
|
|
74
|
+
// 有 label 的padding,如要放添加按钮
|
|
75
|
+
headerHeight: 20
|
|
76
|
+
// 基础头部高度
|
|
77
|
+
};
|
|
78
|
+
var GroupPluginRegister = /* @__PURE__ */ ((GroupPluginRegister2) => {
|
|
79
|
+
GroupPluginRegister2["GroupNode"] = "registerGroupNode";
|
|
80
|
+
GroupPluginRegister2["Render"] = "registerRender";
|
|
81
|
+
GroupPluginRegister2["Layer"] = "registerLayer";
|
|
82
|
+
GroupPluginRegister2["CleanGroups"] = "registerCleanGroups";
|
|
83
|
+
return GroupPluginRegister2;
|
|
84
|
+
})(GroupPluginRegister || {});
|
|
85
|
+
|
|
86
|
+
// src/components/group-render.tsx
|
|
87
|
+
var import_react = __toESM(require("react"));
|
|
88
|
+
var import_document = require("@flowgram.ai/document");
|
|
89
|
+
var import_document2 = require("@flowgram.ai/document");
|
|
90
|
+
var import_core = require("@flowgram.ai/core");
|
|
91
|
+
var import_utils = require("@flowgram.ai/utils");
|
|
92
|
+
function useCurrentDomNode() {
|
|
93
|
+
const entity = (0, import_core.useEntityFromContext)();
|
|
94
|
+
const renderData = entity.getData(import_document.FlowNodeRenderData);
|
|
95
|
+
return renderData.node;
|
|
96
|
+
}
|
|
97
|
+
var GroupRender = (props) => {
|
|
98
|
+
const { groupNode, GroupNode, GroupBoxHeader } = props;
|
|
99
|
+
const container = useCurrentDomNode();
|
|
100
|
+
const document = (0, import_core.useService)(import_document2.FlowDocument);
|
|
101
|
+
const groupController = import_document.FlowGroupController.create(groupNode);
|
|
102
|
+
const [key, setKey] = (0, import_react.useState)(0);
|
|
103
|
+
const [rendering, setRendering] = (0, import_react.useState)(true);
|
|
104
|
+
const [collapsedCache, setCollapsedCache] = (0, import_react.useState)(groupController?.collapsed ?? false);
|
|
105
|
+
const rerender = (0, import_react.useCallback)(async () => {
|
|
106
|
+
setRendering(true);
|
|
107
|
+
setKey(key + 1);
|
|
108
|
+
await (0, import_utils.delay)(50);
|
|
109
|
+
setKey(key + 1);
|
|
110
|
+
setRendering(false);
|
|
111
|
+
}, [key]);
|
|
112
|
+
(0, import_react.useEffect)(() => {
|
|
113
|
+
const disposer = document.renderTree.onTreeChange(() => {
|
|
114
|
+
if (groupController?.collapsed !== collapsedCache) {
|
|
115
|
+
setCollapsedCache(groupController?.collapsed ?? false);
|
|
116
|
+
rerender();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return () => {
|
|
120
|
+
disposer.dispose();
|
|
121
|
+
};
|
|
122
|
+
}, [key]);
|
|
123
|
+
(0, import_react.useEffect)(() => {
|
|
124
|
+
if (!groupController || groupController.collapsed) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
rerender();
|
|
128
|
+
}, []);
|
|
129
|
+
if (!groupController) {
|
|
130
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null);
|
|
131
|
+
}
|
|
132
|
+
const groupNodeRender = /* @__PURE__ */ import_react.default.createElement(GroupNode, { key, groupNode, groupController });
|
|
133
|
+
const groupBoxHeader = /* @__PURE__ */ import_react.default.createElement(GroupBoxHeader, { key, groupController, groupNode });
|
|
134
|
+
if (groupController.collapsed) {
|
|
135
|
+
const positionStyle = {
|
|
136
|
+
display: "block",
|
|
137
|
+
zIndex: "0",
|
|
138
|
+
width: "auto",
|
|
139
|
+
height: "auto"
|
|
140
|
+
};
|
|
141
|
+
Object.assign(container.style, positionStyle);
|
|
142
|
+
return groupNodeRender;
|
|
143
|
+
} else if (!rendering) {
|
|
144
|
+
const bounds = groupController.bounds;
|
|
145
|
+
const positionStyle = {
|
|
146
|
+
width: `${bounds.width}px`
|
|
147
|
+
};
|
|
148
|
+
Object.assign(container.style, positionStyle);
|
|
149
|
+
return groupBoxHeader;
|
|
150
|
+
} else {
|
|
151
|
+
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// src/components/group-box.tsx
|
|
156
|
+
var import_react3 = require("react");
|
|
157
|
+
var import_react4 = __toESM(require("react"));
|
|
158
|
+
var import_document3 = require("@flowgram.ai/document");
|
|
159
|
+
|
|
160
|
+
// src/components/hooks.ts
|
|
161
|
+
var import_react2 = require("react");
|
|
162
|
+
var useHover = () => {
|
|
163
|
+
const ref = (0, import_react2.useRef)(null);
|
|
164
|
+
const [hover, setHover] = (0, import_react2.useState)(false);
|
|
165
|
+
const checkMouseOver = (event) => {
|
|
166
|
+
if (!ref.current) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const { left, top, right, bottom } = ref.current.getBoundingClientRect();
|
|
170
|
+
const isOver = event.clientX >= left && event.clientX <= right && event.clientY >= top && event.clientY <= bottom;
|
|
171
|
+
setHover(isOver);
|
|
172
|
+
};
|
|
173
|
+
(0, import_react2.useEffect)(() => {
|
|
174
|
+
window.addEventListener("mousemove", checkMouseOver);
|
|
175
|
+
return () => {
|
|
176
|
+
window.removeEventListener("mousemove", checkMouseOver);
|
|
177
|
+
};
|
|
178
|
+
}, []);
|
|
179
|
+
return {
|
|
180
|
+
hover,
|
|
181
|
+
ref
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// src/components/group-box.tsx
|
|
186
|
+
var GroupBox = (props) => {
|
|
187
|
+
const { groupNode } = props;
|
|
188
|
+
const groupController = import_document3.FlowGroupController.create(groupNode);
|
|
189
|
+
const bounds = groupController.bounds;
|
|
190
|
+
const { hover, ref } = useHover();
|
|
191
|
+
const positionStyle = {
|
|
192
|
+
position: "absolute",
|
|
193
|
+
left: bounds.left,
|
|
194
|
+
top: bounds.top,
|
|
195
|
+
width: bounds.width,
|
|
196
|
+
height: bounds.height
|
|
197
|
+
};
|
|
198
|
+
const defaultBackgroundStyle = {
|
|
199
|
+
borderRadius: 10,
|
|
200
|
+
zIndex: -1,
|
|
201
|
+
outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,
|
|
202
|
+
backgroundColor: "rgb(236 233 247)"
|
|
203
|
+
};
|
|
204
|
+
const backgroundStyle = props.backgroundStyle ? props.backgroundStyle(groupController) : defaultBackgroundStyle;
|
|
205
|
+
(0, import_react3.useEffect)(() => {
|
|
206
|
+
groupController.hovered = hover;
|
|
207
|
+
}, [hover]);
|
|
208
|
+
if (!groupController || groupController.collapsed) {
|
|
209
|
+
return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null);
|
|
210
|
+
}
|
|
211
|
+
return /* @__PURE__ */ import_react4.default.createElement("div", { className: "gedit-group-box", "data-group-id": groupNode.id }, /* @__PURE__ */ import_react4.default.createElement(
|
|
212
|
+
"div",
|
|
213
|
+
{
|
|
214
|
+
className: "gedit-group-background",
|
|
215
|
+
ref,
|
|
216
|
+
style: {
|
|
217
|
+
...positionStyle,
|
|
218
|
+
...backgroundStyle
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
));
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// src/groups-layer.tsx
|
|
225
|
+
var GroupsLayer = class extends import_core2.Layer {
|
|
226
|
+
constructor() {
|
|
227
|
+
super();
|
|
228
|
+
this.className = "gedit-groups-layer";
|
|
229
|
+
this.node = import_utils2.domUtils.createDivWithClass(this.className);
|
|
230
|
+
this.node.style.zIndex = "0";
|
|
231
|
+
}
|
|
232
|
+
/** 缩放 */
|
|
233
|
+
onZoom(scale) {
|
|
234
|
+
this.node.style.transform = `scale(${scale})`;
|
|
235
|
+
}
|
|
236
|
+
render() {
|
|
237
|
+
if (this.documentTransformer.loading) return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null);
|
|
238
|
+
this.documentTransformer.refresh();
|
|
239
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, this.renderGroups());
|
|
240
|
+
}
|
|
241
|
+
/** 渲染分组 */
|
|
242
|
+
renderGroups() {
|
|
243
|
+
const Box = this.renderer || GroupBox;
|
|
244
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, this.groups.map((group) => /* @__PURE__ */ import_react5.default.createElement(
|
|
245
|
+
Box,
|
|
246
|
+
{
|
|
247
|
+
key: group.groupNode.id,
|
|
248
|
+
groupNode: group.groupNode,
|
|
249
|
+
backgroundStyle: this.options.groupBoxStyle
|
|
250
|
+
}
|
|
251
|
+
)));
|
|
252
|
+
}
|
|
253
|
+
/** 所有分组 */
|
|
254
|
+
get groups() {
|
|
255
|
+
return this.groupService.getAllGroups();
|
|
256
|
+
}
|
|
257
|
+
get renderer() {
|
|
258
|
+
return this.rendererRegistry.tryToGetRendererComponent("group_box" /* GroupBox */)?.renderer;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
__decorateClass([
|
|
262
|
+
(0, import_inversify.inject)(import_document4.FlowDocument)
|
|
263
|
+
], GroupsLayer.prototype, "document", 2);
|
|
264
|
+
__decorateClass([
|
|
265
|
+
(0, import_inversify.inject)(import_renderer.FlowRendererRegistry)
|
|
266
|
+
], GroupsLayer.prototype, "rendererRegistry", 2);
|
|
267
|
+
__decorateClass([
|
|
268
|
+
(0, import_inversify.inject)(import_document4.FlowGroupService)
|
|
269
|
+
], GroupsLayer.prototype, "groupService", 2);
|
|
270
|
+
__decorateClass([
|
|
271
|
+
(0, import_core2.observeEntity)(import_document4.FlowDocumentTransformerEntity)
|
|
272
|
+
], GroupsLayer.prototype, "documentTransformer", 2);
|
|
273
|
+
__decorateClass([
|
|
274
|
+
(0, import_core2.observeEntityDatas)(import_document4.FlowNodeEntity, import_document4.FlowNodeRenderData)
|
|
275
|
+
], GroupsLayer.prototype, "renderStates", 2);
|
|
276
|
+
__decorateClass([
|
|
277
|
+
(0, import_core2.observeEntityDatas)(import_document4.FlowNodeEntity, import_document4.FlowNodeTransformData)
|
|
278
|
+
], GroupsLayer.prototype, "transforms", 2);
|
|
279
|
+
GroupsLayer = __decorateClass([
|
|
280
|
+
(0, import_inversify.injectable)()
|
|
281
|
+
], GroupsLayer);
|
|
282
|
+
|
|
283
|
+
// src/create-group-plugin.tsx
|
|
284
|
+
var import_core3 = require("@flowgram.ai/core");
|
|
285
|
+
|
|
286
|
+
// src/registers/register-render.tsx
|
|
287
|
+
var import_react6 = __toESM(require("react"));
|
|
288
|
+
var import_renderer2 = require("@flowgram.ai/renderer");
|
|
289
|
+
var registerRender = (ctx, opts) => {
|
|
290
|
+
const rendererRegistry = ctx.get(import_renderer2.FlowRendererRegistry);
|
|
291
|
+
const renderer = (props) => /* @__PURE__ */ import_react6.default.createElement(
|
|
292
|
+
GroupRender,
|
|
293
|
+
{
|
|
294
|
+
groupNode: props.node,
|
|
295
|
+
GroupNode: opts.components.GroupNode,
|
|
296
|
+
GroupBoxHeader: opts.components.GroupBoxHeader
|
|
297
|
+
}
|
|
298
|
+
);
|
|
299
|
+
rendererRegistry.registerReactComponent("group_render" /* GroupRender */, renderer);
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// src/registers/register-layer.ts
|
|
303
|
+
var registerLayer = (ctx, opts) => {
|
|
304
|
+
ctx.playground.registerLayer(GroupsLayer, opts);
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
// src/registers/register-group-node.ts
|
|
308
|
+
var import_document6 = require("@flowgram.ai/document");
|
|
309
|
+
|
|
310
|
+
// src/group-node-register.tsx
|
|
311
|
+
var import_utils3 = require("@flowgram.ai/utils");
|
|
312
|
+
var import_document5 = require("@flowgram.ai/document");
|
|
313
|
+
var GroupRegister = {
|
|
314
|
+
type: import_document5.FlowNodeBaseType.GROUP,
|
|
315
|
+
meta: {
|
|
316
|
+
exportJSON: true,
|
|
317
|
+
renderKey: "group_render" /* GroupRender */,
|
|
318
|
+
positionConfig: PositionConfig,
|
|
319
|
+
padding: (transform) => {
|
|
320
|
+
const groupController = import_document5.FlowGroupController.create(transform.entity);
|
|
321
|
+
if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {
|
|
322
|
+
return {
|
|
323
|
+
top: 0,
|
|
324
|
+
bottom: 0,
|
|
325
|
+
left: 0,
|
|
326
|
+
right: 0
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
if (transform.entity.isVertical) {
|
|
330
|
+
return {
|
|
331
|
+
top: PositionConfig.paddingWithNote,
|
|
332
|
+
bottom: PositionConfig.paddingWithAddLabel,
|
|
333
|
+
left: PositionConfig.padding,
|
|
334
|
+
right: PositionConfig.padding
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
top: PositionConfig.paddingWithNote,
|
|
339
|
+
bottom: PositionConfig.padding,
|
|
340
|
+
left: PositionConfig.padding,
|
|
341
|
+
right: PositionConfig.paddingWithAddLabel
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
getLines(transition) {
|
|
346
|
+
const { transform } = transition;
|
|
347
|
+
const lines = [];
|
|
348
|
+
if (transform.firstChild) {
|
|
349
|
+
lines.push({
|
|
350
|
+
type: import_document5.FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
351
|
+
from: transform.inputPoint,
|
|
352
|
+
to: transform.firstChild.inputPoint
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
if (transform.next) {
|
|
356
|
+
lines.push({
|
|
357
|
+
type: import_document5.FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
358
|
+
from: transform.outputPoint,
|
|
359
|
+
to: transform.next.inputPoint
|
|
360
|
+
});
|
|
361
|
+
} else {
|
|
362
|
+
lines.push({
|
|
363
|
+
type: import_document5.FlowTransitionLineEnum.STRAIGHT_LINE,
|
|
364
|
+
from: transform.outputPoint,
|
|
365
|
+
to: transform.parent.outputPoint
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return lines;
|
|
369
|
+
},
|
|
370
|
+
getDelta(transform) {
|
|
371
|
+
const groupController = import_document5.FlowGroupController.create(transform.entity);
|
|
372
|
+
if (!groupController || groupController.collapsed) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (transform.entity.isVertical) {
|
|
376
|
+
return {
|
|
377
|
+
x: 0,
|
|
378
|
+
y: PositionConfig.paddingWithNote
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
x: PositionConfig.padding,
|
|
383
|
+
y: 0
|
|
384
|
+
};
|
|
385
|
+
},
|
|
386
|
+
getInputPoint(transform) {
|
|
387
|
+
const child = transform.firstChild;
|
|
388
|
+
if (!child) return transform.defaultInputPoint;
|
|
389
|
+
if (transform.entity.isVertical) {
|
|
390
|
+
return {
|
|
391
|
+
x: child.inputPoint.x,
|
|
392
|
+
y: transform.bounds.topCenter.y
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
x: transform.bounds.leftCenter.x,
|
|
397
|
+
y: child.inputPoint.y
|
|
398
|
+
};
|
|
399
|
+
},
|
|
400
|
+
getOutputPoint(transform) {
|
|
401
|
+
const child = transform.lastChild;
|
|
402
|
+
if (!child) return transform.defaultOutputPoint;
|
|
403
|
+
if (transform.entity.isVertical) {
|
|
404
|
+
return {
|
|
405
|
+
x: child.outputPoint.x,
|
|
406
|
+
y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,
|
|
411
|
+
y: child.outputPoint.y
|
|
412
|
+
};
|
|
413
|
+
},
|
|
414
|
+
getLabels(transition) {
|
|
415
|
+
const { transform } = transition;
|
|
416
|
+
if (transform.next) {
|
|
417
|
+
if (transform.entity.isVertical) {
|
|
418
|
+
return [
|
|
419
|
+
{
|
|
420
|
+
offset: import_utils3.Point.getMiddlePoint(
|
|
421
|
+
import_utils3.Point.move(transform.outputPoint, {
|
|
422
|
+
x: 0,
|
|
423
|
+
y: PositionConfig.paddingWithAddLabel / 2
|
|
424
|
+
}),
|
|
425
|
+
transform.next.inputPoint
|
|
426
|
+
),
|
|
427
|
+
type: import_document5.FlowTransitionLabelEnum.ADDER_LABEL
|
|
428
|
+
}
|
|
429
|
+
];
|
|
430
|
+
}
|
|
431
|
+
return [
|
|
432
|
+
{
|
|
433
|
+
offset: import_utils3.Point.getMiddlePoint(
|
|
434
|
+
import_utils3.Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),
|
|
435
|
+
transform.next.inputPoint
|
|
436
|
+
),
|
|
437
|
+
type: import_document5.FlowTransitionLabelEnum.ADDER_LABEL
|
|
438
|
+
}
|
|
439
|
+
];
|
|
440
|
+
}
|
|
441
|
+
return [
|
|
442
|
+
{
|
|
443
|
+
offset: transform.parent.outputPoint,
|
|
444
|
+
type: import_document5.FlowTransitionLabelEnum.ADDER_LABEL
|
|
445
|
+
}
|
|
446
|
+
];
|
|
447
|
+
},
|
|
448
|
+
getOriginDeltaY(transform) {
|
|
449
|
+
const { children } = transform;
|
|
450
|
+
if (children.length === 0) {
|
|
451
|
+
return -transform.size.height * transform.origin.y;
|
|
452
|
+
}
|
|
453
|
+
return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
// src/registers/register-group-node.ts
|
|
458
|
+
var registerGroupNode = (ctx) => {
|
|
459
|
+
const document = ctx.get(import_document6.FlowDocument);
|
|
460
|
+
document.registerFlowNodes(GroupRegister);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
// src/registers/register-clean-groups.ts
|
|
464
|
+
var import_document7 = require("@flowgram.ai/document");
|
|
465
|
+
var import_document8 = require("@flowgram.ai/document");
|
|
466
|
+
var registerCleanGroups = (ctx, opts) => {
|
|
467
|
+
const groupService = ctx.get(import_document8.FlowGroupService);
|
|
468
|
+
const document = ctx.get(import_document7.FlowDocument);
|
|
469
|
+
const clearInvalidGroups = () => {
|
|
470
|
+
groupService.getAllGroups().forEach((group) => {
|
|
471
|
+
if (group?.nodes.length !== 0) {
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (!group.groupNode.pre) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
groupService.deleteGroup(group.groupNode);
|
|
478
|
+
});
|
|
479
|
+
};
|
|
480
|
+
document.originTree.onTreeChange(() => {
|
|
481
|
+
setTimeout(() => {
|
|
482
|
+
clearInvalidGroups();
|
|
483
|
+
}, 0);
|
|
484
|
+
});
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
// src/registers/index.ts
|
|
488
|
+
var groupRegisters = {
|
|
489
|
+
["registerGroupNode" /* GroupNode */]: registerGroupNode,
|
|
490
|
+
["registerRender" /* Render */]: registerRender,
|
|
491
|
+
["registerLayer" /* Layer */]: registerLayer,
|
|
492
|
+
["registerCleanGroups" /* CleanGroups */]: registerCleanGroups
|
|
493
|
+
};
|
|
494
|
+
|
|
495
|
+
// src/create-group-plugin.tsx
|
|
496
|
+
var createGroupPlugin = (0, import_core3.definePluginCreator)({
|
|
497
|
+
onInit: (ctx, opts) => {
|
|
498
|
+
const { registers: registerConfs = {} } = opts;
|
|
499
|
+
Object.entries(groupRegisters).forEach(([key, register]) => {
|
|
500
|
+
const registerName = key;
|
|
501
|
+
const registerConf = registerConfs[registerName];
|
|
502
|
+
if (registerConf === false) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (typeof registerConf === "function") {
|
|
506
|
+
registerConf(ctx, opts);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
register(ctx, opts);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
514
|
+
0 && (module.exports = {
|
|
515
|
+
FlowGroupController,
|
|
516
|
+
GroupBox,
|
|
517
|
+
GroupPluginRegister,
|
|
518
|
+
GroupRegister,
|
|
519
|
+
GroupRender,
|
|
520
|
+
GroupRenderer,
|
|
521
|
+
GroupsLayer,
|
|
522
|
+
PositionConfig,
|
|
523
|
+
createGroupPlugin
|
|
524
|
+
});
|
|
525
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/groups-layer.tsx","../src/constant.ts","../src/components/group-render.tsx","../src/components/group-box.tsx","../src/components/hooks.ts","../src/create-group-plugin.tsx","../src/registers/register-render.tsx","../src/registers/register-layer.ts","../src/registers/register-group-node.ts","../src/group-node-register.tsx","../src/registers/register-clean-groups.ts","../src/registers/index.ts"],"sourcesContent":["export { FlowGroupController } from '@flowgram.ai/document';\nexport * from './groups-layer';\nexport * from './create-group-plugin';\nexport * from './type';\nexport * from './constant';\nexport * from './group-node-register';\nexport * from './components';\n","import React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport {\n FlowDocument,\n FlowDocumentTransformerEntity,\n FlowGroupController,\n FlowGroupService,\n FlowNodeEntity,\n FlowNodeRenderData,\n FlowNodeTransformData,\n} from '@flowgram.ai/document';\nimport { Layer, observeEntity, observeEntityDatas } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { GroupsLayerOptions, IGroupBox } from './type';\nimport { GroupRenderer } from './constant';\nimport { GroupBox } from './components';\n\n@injectable()\nexport class GroupsLayer extends Layer<GroupsLayerOptions> {\n public readonly node: HTMLElement;\n\n @inject(FlowDocument) protected document: FlowDocument;\n\n @inject(FlowRendererRegistry)\n protected readonly rendererRegistry: FlowRendererRegistry;\n\n @inject(FlowGroupService)\n protected readonly groupService: FlowGroupService;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeRenderData)\n renderStates: FlowNodeRenderData[];\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transforms: FlowNodeTransformData[];\n\n private readonly className = 'gedit-groups-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '0';\n }\n\n /** 缩放 */\n public onZoom(scale: number): void {\n this.node!.style.transform = `scale(${scale})`;\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n\n return <>{this.renderGroups()}</>;\n }\n\n /** 渲染分组 */\n protected renderGroups(): JSX.Element {\n const Box = this.renderer || GroupBox;\n return (\n <>\n {this.groups.map(group => (\n <Box\n key={group.groupNode.id}\n groupNode={group.groupNode}\n backgroundStyle={this.options.groupBoxStyle}\n />\n ))}\n </>\n );\n }\n\n /** 所有分组 */\n protected get groups(): FlowGroupController[] {\n return this.groupService.getAllGroups();\n }\n\n protected get renderer(): IGroupBox {\n return this.rendererRegistry.tryToGetRendererComponent(GroupRenderer.GroupBox)\n ?.renderer as IGroupBox;\n }\n}\n","export enum GroupRenderer {\n GroupRender = 'group_render',\n GroupBox = 'group_box',\n}\n\nexport const PositionConfig = {\n paddingWithNote: 50, // note 留白大小\n padding: 10, // 无 label 的 padding\n paddingWithAddLabel: 20, // 有 label 的padding,如要放添加按钮\n headerHeight: 20, // 基础头部高度\n};\n\nexport enum GroupPluginRegister {\n GroupNode = 'registerGroupNode',\n Render = 'registerRender',\n Layer = 'registerLayer',\n CleanGroups = 'registerCleanGroups',\n}\n","/* eslint-disable react/prop-types */\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { FlowGroupController, FlowNodeEntity, FlowNodeRenderData } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { useEntityFromContext, useService } from '@flowgram.ai/core';\nimport { delay, Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupRender } from '../type';\n\nfunction useCurrentDomNode(): HTMLDivElement {\n const entity = useEntityFromContext<FlowNodeEntity>();\n const renderData = entity.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return renderData.node;\n}\n\nexport const GroupRender: IGroupRender = props => {\n const { groupNode, GroupNode, GroupBoxHeader } = props;\n const container = useCurrentDomNode();\n const document = useService<FlowDocument>(FlowDocument);\n const groupController = FlowGroupController.create(groupNode);\n\n const [key, setKey] = useState(0);\n const [rendering, setRendering] = useState(true);\n const [collapsedCache, setCollapsedCache] = useState(groupController?.collapsed ?? false);\n\n const rerender = useCallback(async () => {\n setRendering(true);\n setKey(key + 1);\n // 边框bounds计算会有延迟\n await delay(50);\n setKey(key + 1);\n setRendering(false);\n }, [key]);\n\n // 监听 collapsed 变化触发重渲染\n useEffect(() => {\n const disposer = document.renderTree.onTreeChange(() => {\n if (groupController?.collapsed !== collapsedCache) {\n setCollapsedCache(groupController?.collapsed ?? false);\n rerender();\n }\n });\n return () => {\n disposer.dispose();\n };\n }, [key]);\n\n // 首次渲染时如果分组是展开状态,此时边框bounds计算会有延迟,需要强制重新渲染\n useEffect(() => {\n if (!groupController || groupController.collapsed) {\n return;\n }\n rerender();\n }, []);\n\n if (!groupController) {\n return <></>;\n }\n\n const groupNodeRender = (\n <GroupNode key={key} groupNode={groupNode} groupController={groupController} />\n );\n const groupBoxHeader = (\n <GroupBoxHeader key={key} groupController={groupController} groupNode={groupNode} />\n );\n\n if (groupController.collapsed) {\n const positionStyle: Partial<CSSStyleDeclaration> = {\n display: 'block',\n zIndex: '0',\n width: 'auto',\n height: 'auto',\n };\n Object.assign(container.style, positionStyle);\n return groupNodeRender;\n } else if (!rendering) {\n const bounds: Rectangle = groupController.bounds;\n const positionStyle: Partial<CSSStyleDeclaration> = {\n width: `${bounds.width}px`,\n };\n Object.assign(container.style, positionStyle);\n return groupBoxHeader;\n } else {\n return <></>;\n }\n};\n","/* eslint-disable react/prop-types */\nimport { useEffect, type CSSProperties } from 'react';\nimport React from 'react';\n\nimport { FlowGroupController } from '@flowgram.ai/document';\nimport type { Rectangle } from '@flowgram.ai/utils';\n\nimport { IGroupBox } from '../type';\nimport { useHover } from './hooks';\n\nexport const GroupBox: IGroupBox = props => {\n const { groupNode } = props;\n const groupController = FlowGroupController.create(groupNode)!;\n const bounds: Rectangle = groupController.bounds;\n const { hover, ref } = useHover();\n\n const positionStyle: CSSProperties = {\n position: 'absolute',\n left: bounds.left,\n top: bounds.top,\n width: bounds.width,\n height: bounds.height,\n };\n\n const defaultBackgroundStyle: CSSProperties = {\n borderRadius: 10,\n zIndex: -1,\n outline: `${hover ? 3 : 1}px solid rgb(97, 69, 211)`,\n backgroundColor: 'rgb(236 233 247)',\n };\n\n const backgroundStyle = props.backgroundStyle\n ? props.backgroundStyle(groupController)\n : defaultBackgroundStyle;\n\n useEffect(() => {\n groupController.hovered = hover;\n }, [hover]);\n\n if (!groupController || groupController.collapsed) {\n return <></>;\n }\n\n return (\n <div className=\"gedit-group-box\" data-group-id={groupNode.id}>\n <div\n className=\"gedit-group-background\"\n ref={ref}\n style={{\n ...positionStyle,\n ...backgroundStyle,\n }}\n />\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useHover = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [hover, setHover] = useState(false);\n\n const checkMouseOver = (event: MouseEvent) => {\n if (!ref.current) {\n return;\n }\n const { left, top, right, bottom } = ref.current.getBoundingClientRect();\n const isOver =\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom;\n\n setHover(isOver);\n };\n\n useEffect(() => {\n window.addEventListener('mousemove', checkMouseOver);\n\n return () => {\n window.removeEventListener('mousemove', checkMouseOver);\n };\n }, []);\n\n return {\n hover,\n ref,\n };\n};\n","import { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateGroupPluginOptions } from './type';\nimport { groupRegisters } from './registers';\nimport { GroupPluginRegister } from './constant';\n\n/**\n * 分组插件\n */\nexport const createGroupPlugin = definePluginCreator<CreateGroupPluginOptions>({\n onInit: (ctx: PluginContext, opts: CreateGroupPluginOptions) => {\n const { registers: registerConfs = {} } = opts;\n Object.entries(groupRegisters).forEach(([key, register]) => {\n const registerName = key as GroupPluginRegister;\n const registerConf = registerConfs[registerName];\n if (registerConf === false) {\n return;\n }\n if (typeof registerConf === 'function') {\n registerConf(ctx, opts);\n return;\n }\n register(ctx, opts);\n });\n },\n});\n","import React, { FC } from 'react';\n\nimport { FlowRendererRegistry } from '@flowgram.ai/renderer';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRenderer } from '../constant';\nimport { GroupRender } from '../components';\n\n/** 注册渲染组件 */\nexport const registerRender: IGroupPluginRegister = (ctx, opts) => {\n const rendererRegistry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);\n const renderer: FC<{ node: FlowNodeEntity }> = props => (\n <GroupRender\n groupNode={props.node}\n GroupNode={opts.components!.GroupNode}\n GroupBoxHeader={opts.components!.GroupBoxHeader}\n />\n );\n rendererRegistry.registerReactComponent(GroupRenderer.GroupRender, renderer);\n};\n","import { IGroupPluginRegister } from '../type';\nimport { GroupsLayer } from '../groups-layer';\n\n/** 注册背景层 */\nexport const registerLayer: IGroupPluginRegister = (ctx, opts) => {\n ctx.playground.registerLayer(GroupsLayer, opts);\n};\n","import { FlowDocument } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\nimport { GroupRegister } from '../group-node-register';\n\n/** 注册分组节点 */\nexport const registerGroupNode: IGroupPluginRegister = ctx => {\n const document = ctx.get<FlowDocument>(FlowDocument);\n document.registerFlowNodes(GroupRegister);\n};\n","import { IPoint, PaddingSchema, Point } from '@flowgram.ai/utils';\nimport {\n FlowGroupController,\n FlowNodeBaseType,\n FlowNodeRegistry,\n FlowNodeTransformData,\n FlowTransitionLabelEnum,\n type FlowTransitionLine,\n FlowTransitionLineEnum,\n} from '@flowgram.ai/document';\n\nimport { GroupRenderer, PositionConfig } from './constant';\n\nexport const GroupRegister: FlowNodeRegistry = {\n type: FlowNodeBaseType.GROUP,\n meta: {\n exportJSON: true,\n renderKey: GroupRenderer.GroupRender,\n positionConfig: PositionConfig,\n padding: (transform: FlowNodeTransformData): PaddingSchema => {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed || groupController.nodes.length === 0) {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n if (transform.entity.isVertical) {\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.paddingWithAddLabel,\n left: PositionConfig.padding,\n right: PositionConfig.padding,\n };\n }\n return {\n top: PositionConfig.paddingWithNote,\n bottom: PositionConfig.padding,\n left: PositionConfig.padding,\n right: PositionConfig.paddingWithAddLabel,\n };\n },\n },\n getLines(transition) {\n const { transform } = transition;\n const lines: FlowTransitionLine[] = [];\n if (transform.firstChild) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.inputPoint,\n to: transform.firstChild.inputPoint,\n });\n }\n if (transform.next) {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.next.inputPoint,\n });\n } else {\n lines.push({\n type: FlowTransitionLineEnum.STRAIGHT_LINE,\n from: transform.outputPoint,\n to: transform.parent!.outputPoint,\n });\n }\n return lines;\n },\n getDelta(transform: FlowNodeTransformData): IPoint | undefined {\n const groupController = FlowGroupController.create(transform.entity);\n if (!groupController || groupController.collapsed) {\n return;\n }\n if (transform.entity.isVertical) {\n return {\n x: 0,\n y: PositionConfig.paddingWithNote,\n };\n }\n return {\n x: PositionConfig.padding,\n y: 0,\n };\n },\n getInputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.firstChild;\n if (!child) return transform.defaultInputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.inputPoint.x,\n y: transform.bounds.topCenter.y,\n };\n }\n return {\n x: transform.bounds.leftCenter.x,\n y: child.inputPoint.y,\n };\n },\n getOutputPoint(transform: FlowNodeTransformData): IPoint {\n const child = transform.lastChild;\n if (!child) return transform.defaultOutputPoint;\n if (transform.entity.isVertical) {\n return {\n x: child.outputPoint.x,\n y: child.outputPoint.y + PositionConfig.paddingWithAddLabel / 2,\n };\n }\n return {\n x: child.outputPoint.x + PositionConfig.paddingWithAddLabel / 2,\n y: child.outputPoint.y,\n };\n },\n getLabels(transition) {\n const { transform } = transition;\n if (transform.next) {\n if (transform.entity.isVertical) {\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, {\n x: 0,\n y: PositionConfig.paddingWithAddLabel / 2,\n }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: Point.getMiddlePoint(\n Point.move(transform.outputPoint, { x: PositionConfig.paddingWithAddLabel / 2, y: 0 }),\n transform.next.inputPoint\n ),\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n }\n return [\n {\n offset: transform.parent!.outputPoint,\n type: FlowTransitionLabelEnum.ADDER_LABEL,\n },\n ];\n },\n getOriginDeltaY(transform): number {\n const { children } = transform;\n if (children.length === 0) {\n return -transform.size.height * transform.origin.y;\n }\n // 这里要加上 y 轴的偏移\n return -transform.size.height * transform.origin.y - PositionConfig.paddingWithNote;\n },\n};\n","import { FlowDocument } from '@flowgram.ai/document';\nimport { FlowGroupService } from '@flowgram.ai/document';\n\nimport { IGroupPluginRegister } from '../type';\n\n/** 注册清理分组逻辑 */\nexport const registerCleanGroups: IGroupPluginRegister = (ctx, opts) => {\n const groupService = ctx.get<FlowGroupService>(FlowGroupService);\n const document = ctx.get<FlowDocument>(FlowDocument);\n\n const clearInvalidGroups = () => {\n groupService.getAllGroups().forEach(group => {\n if (group?.nodes.length !== 0) {\n return;\n }\n if (!group.groupNode.pre) {\n return;\n }\n groupService.deleteGroup(group.groupNode);\n });\n };\n\n document.originTree.onTreeChange(() => {\n setTimeout(() => {\n clearInvalidGroups();\n }, 0);\n });\n};\n","import { IGroupPluginRegister } from '../type';\nimport { GroupPluginRegister } from '../constant';\nimport { registerRender } from './register-render';\nimport { registerLayer } from './register-layer';\nimport { registerGroupNode } from './register-group-node';\nimport { registerCleanGroups } from './register-clean-groups';\n\nexport const groupRegisters: Record<GroupPluginRegister, IGroupPluginRegister> = {\n [GroupPluginRegister.GroupNode]: registerGroupNode,\n [GroupPluginRegister.Render]: registerRender,\n [GroupPluginRegister.Layer]: registerLayer,\n [GroupPluginRegister.CleanGroups]: registerCleanGroups,\n};\n"],"mappings":"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","names":["import_document","import_react","import_document","import_core","import_utils","GroupRenderer","GroupPluginRegister","import_document","React","import_react","import_document","import_react","React","React","import_core","import_react","import_renderer","React","import_document","import_utils","import_document","import_document"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowgram.ai/group-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"exports": {
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"import": "./dist/esm/index.js",
|
|
8
|
+
"require": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"module": "./dist/esm/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "npm run build:fast -- --dts-resolve",
|
|
18
|
+
"build:fast": "tsup src/index.ts --format cjs,esm --sourcemap --legacy-output",
|
|
19
|
+
"build:watch": "npm run build:fast -- --dts-resolve",
|
|
20
|
+
"clean": "rimraf dist",
|
|
21
|
+
"test": "exit 0",
|
|
22
|
+
"test:cov": "exit 0",
|
|
23
|
+
"ts-check": "tsc --noEmit",
|
|
24
|
+
"watch": "npm run build:fast -- --dts-resolve --watch --ignore-watch dist"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@flowgram.ai/core": "workspace:*",
|
|
28
|
+
"@flowgram.ai/document": "workspace:*",
|
|
29
|
+
"@flowgram.ai/renderer": "workspace:*",
|
|
30
|
+
"@flowgram.ai/utils": "workspace:*",
|
|
31
|
+
"inversify": "^6.0.1"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@flowgram.ai/eslint-config": "workspace:*",
|
|
35
|
+
"@flowgram.ai/ts-config": "workspace:*",
|
|
36
|
+
"@types/react": "^18",
|
|
37
|
+
"@types/react-dom": "^18",
|
|
38
|
+
"@vitest/coverage-v8": "^0.32.0",
|
|
39
|
+
"eslint": "^8.54.0",
|
|
40
|
+
"tsup": "^8.0.1",
|
|
41
|
+
"typescript": "^5.0.4",
|
|
42
|
+
"vitest": "^0.34.6"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"react": ">=17",
|
|
46
|
+
"react-dom": ">=17"
|
|
47
|
+
}
|
|
48
|
+
}
|