@flowgram.ai/free-stack-plugin 0.1.25 → 0.1.27
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 +138 -144
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +30 -37
- package/dist/index.d.ts +30 -37
- package/dist/index.js +134 -143
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/esm/index.js
CHANGED
|
@@ -21,14 +21,16 @@ import {
|
|
|
21
21
|
WorkflowNodeEntity as WorkflowNodeEntity2,
|
|
22
22
|
WorkflowSelectService
|
|
23
23
|
} from "@flowgram.ai/free-layout-core";
|
|
24
|
-
import { WorkflowLineEntity } from "@flowgram.ai/free-layout-core";
|
|
24
|
+
import { WorkflowLineEntity as WorkflowLineEntity2 } from "@flowgram.ai/free-layout-core";
|
|
25
25
|
import { WorkflowDocument } from "@flowgram.ai/free-layout-core";
|
|
26
|
-
import { FlowNodeRenderData
|
|
26
|
+
import { FlowNodeRenderData } from "@flowgram.ai/document";
|
|
27
27
|
import { EntityManager, PipelineRegistry, PipelineRenderer } from "@flowgram.ai/core";
|
|
28
28
|
|
|
29
29
|
// src/stacking-computing.ts
|
|
30
|
+
import {
|
|
31
|
+
WorkflowNodeLinesData
|
|
32
|
+
} from "@flowgram.ai/free-layout-core";
|
|
30
33
|
import { FlowNodeBaseType } from "@flowgram.ai/document";
|
|
31
|
-
import { WorkflowNodeLinesData } from "@flowgram.ai/free-layout-core";
|
|
32
34
|
var StackingComputing = class {
|
|
33
35
|
compute(params) {
|
|
34
36
|
this.clearCache();
|
|
@@ -37,7 +39,7 @@ var StackingComputing = class {
|
|
|
37
39
|
this.nodeIndexes = this.computeNodeIndexesMap(nodes);
|
|
38
40
|
this.topLevel = this.computeTopLevel(nodes);
|
|
39
41
|
this.maxLevel = this.topLevel * 2;
|
|
40
|
-
this.layerHandler(root.
|
|
42
|
+
this.layerHandler(root.blocks);
|
|
41
43
|
return {
|
|
42
44
|
nodeLevel: this.nodeLevel,
|
|
43
45
|
lineLevel: this.lineLevel,
|
|
@@ -63,7 +65,7 @@ var StackingComputing = class {
|
|
|
63
65
|
computeTopLevel(nodes) {
|
|
64
66
|
const nodesWithoutRoot = nodes.filter((node) => node.id !== FlowNodeBaseType.ROOT);
|
|
65
67
|
const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {
|
|
66
|
-
if (node.
|
|
68
|
+
if (node.blocks.length > 0) {
|
|
67
69
|
return count + 1;
|
|
68
70
|
} else {
|
|
69
71
|
return count;
|
|
@@ -71,21 +73,9 @@ var StackingComputing = class {
|
|
|
71
73
|
}, 0);
|
|
72
74
|
return nodesWithoutRoot.length + nodeHasChildren + 1;
|
|
73
75
|
}
|
|
74
|
-
layerHandler(
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const bIndex = this.nodeIndexes.get(b.id);
|
|
78
|
-
if (aIndex === void 0 || bIndex === void 0) {
|
|
79
|
-
return 0;
|
|
80
|
-
}
|
|
81
|
-
return aIndex - bIndex;
|
|
82
|
-
});
|
|
83
|
-
const lines = nodes.map((node) => {
|
|
84
|
-
const linesData = node.getData(WorkflowNodeLinesData);
|
|
85
|
-
const outputLines = linesData.outputLines.filter(Boolean);
|
|
86
|
-
const inputLines = linesData.inputLines.filter(Boolean);
|
|
87
|
-
return [...outputLines, ...inputLines];
|
|
88
|
-
}).flat();
|
|
76
|
+
layerHandler(layerNodes, pinTop = false) {
|
|
77
|
+
const nodes = this.sortNodes(layerNodes);
|
|
78
|
+
const lines = this.getNodesAllLines(nodes);
|
|
89
79
|
lines.forEach((line) => {
|
|
90
80
|
if (line.isDrawing || // 正在绘制
|
|
91
81
|
this.context.hoveredEntityID === line.id || // hover
|
|
@@ -96,7 +86,7 @@ var StackingComputing = class {
|
|
|
96
86
|
}
|
|
97
87
|
});
|
|
98
88
|
this.levelIncrease();
|
|
99
|
-
|
|
89
|
+
nodes.forEach((node) => {
|
|
100
90
|
const selected = this.context.selectedIDs.includes(node.id);
|
|
101
91
|
if (selected) {
|
|
102
92
|
this.nodeLevel.set(node.id, this.topLevel);
|
|
@@ -104,11 +94,36 @@ var StackingComputing = class {
|
|
|
104
94
|
this.nodeLevel.set(node.id, this.getLevel(pinTop));
|
|
105
95
|
}
|
|
106
96
|
this.levelIncrease();
|
|
107
|
-
if (node.
|
|
108
|
-
this.layerHandler(node.
|
|
97
|
+
if (node.blocks.length > 0) {
|
|
98
|
+
this.layerHandler(node.blocks, pinTop || selected);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
sortNodes(nodes) {
|
|
103
|
+
return nodes.sort((a, b) => {
|
|
104
|
+
const aIndex = this.nodeIndexes.get(a.id);
|
|
105
|
+
const bIndex = this.nodeIndexes.get(b.id);
|
|
106
|
+
if (aIndex === void 0 || bIndex === void 0) {
|
|
107
|
+
return 0;
|
|
109
108
|
}
|
|
109
|
+
return aIndex - bIndex;
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
|
+
getNodesAllLines(nodes) {
|
|
113
|
+
const lines = nodes.map((node) => {
|
|
114
|
+
const linesData = node.getData(WorkflowNodeLinesData);
|
|
115
|
+
const outputLines = linesData.outputLines.filter(Boolean);
|
|
116
|
+
const inputLines = linesData.inputLines.filter(Boolean);
|
|
117
|
+
return [...outputLines, ...inputLines];
|
|
118
|
+
}).flat();
|
|
119
|
+
const filteredLines = lines.filter(
|
|
120
|
+
(line) => this.lineLevel.get(line.id) === void 0 || this.isHigherFirstLine(line)
|
|
121
|
+
);
|
|
122
|
+
return filteredLines;
|
|
123
|
+
}
|
|
124
|
+
isHigherFirstLine(line) {
|
|
125
|
+
return line.to?.parent === line.from || line.from?.parent === line.to;
|
|
126
|
+
}
|
|
112
127
|
getLevel(pinTop) {
|
|
113
128
|
if (pinTop) {
|
|
114
129
|
return this.topLevel + this.currentLevel;
|
|
@@ -120,9 +135,6 @@ var StackingComputing = class {
|
|
|
120
135
|
}
|
|
121
136
|
};
|
|
122
137
|
|
|
123
|
-
// src/layers-computing.ts
|
|
124
|
-
import { FlowNodeRenderData } from "@flowgram.ai/document";
|
|
125
|
-
|
|
126
138
|
// src/constant.ts
|
|
127
139
|
var StackingItem = /* @__PURE__ */ ((StackingItem2) => {
|
|
128
140
|
StackingItem2["Line"] = "line";
|
|
@@ -155,103 +167,6 @@ var StackingConfig = {
|
|
|
155
167
|
/** 最大 index */
|
|
156
168
|
maxIndex
|
|
157
169
|
};
|
|
158
|
-
var StackingComputeMode = /* @__PURE__ */ ((StackingComputeMode2) => {
|
|
159
|
-
StackingComputeMode2["Stacking"] = "stacking";
|
|
160
|
-
StackingComputeMode2["Layers"] = "layers";
|
|
161
|
-
return StackingComputeMode2;
|
|
162
|
-
})(StackingComputeMode || {});
|
|
163
|
-
|
|
164
|
-
// src/layers-computing.ts
|
|
165
|
-
var NodeComputing;
|
|
166
|
-
((NodeComputing2) => {
|
|
167
|
-
NodeComputing2.compute = (node, context) => {
|
|
168
|
-
const zIndex = nodeZIndex(node, context);
|
|
169
|
-
const element = nodeElement(node);
|
|
170
|
-
element.style.position = "absolute";
|
|
171
|
-
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
172
|
-
};
|
|
173
|
-
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
174
|
-
if (level < 1) {
|
|
175
|
-
return void 0;
|
|
176
|
-
}
|
|
177
|
-
const baseZIndex = StackingBaseIndex[stackingType];
|
|
178
|
-
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
179
|
-
return zIndex;
|
|
180
|
-
};
|
|
181
|
-
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
182
|
-
const unReversedLinage = [];
|
|
183
|
-
let currentNode = node;
|
|
184
|
-
while (currentNode) {
|
|
185
|
-
unReversedLinage.push(currentNode);
|
|
186
|
-
currentNode = currentNode.parent;
|
|
187
|
-
}
|
|
188
|
-
const linage = unReversedLinage.reverse();
|
|
189
|
-
const nodeLevel = linage.length - 1;
|
|
190
|
-
const topLevelIndex = linage.findIndex((node2) => {
|
|
191
|
-
if (context.selectedIDs.includes(node2.id)) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
return false;
|
|
195
|
-
});
|
|
196
|
-
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
197
|
-
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
198
|
-
return topLevel;
|
|
199
|
-
}
|
|
200
|
-
return nodeLevel;
|
|
201
|
-
};
|
|
202
|
-
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
203
|
-
if (zIndex === void 0) {
|
|
204
|
-
return "auto";
|
|
205
|
-
}
|
|
206
|
-
return zIndex.toString();
|
|
207
|
-
};
|
|
208
|
-
const nodeZIndex = (node, context) => {
|
|
209
|
-
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
210
|
-
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
211
|
-
return zIndex;
|
|
212
|
-
};
|
|
213
|
-
const nodeElement = (node) => {
|
|
214
|
-
const nodeRenderData = node.getData(FlowNodeRenderData);
|
|
215
|
-
return nodeRenderData.node;
|
|
216
|
-
};
|
|
217
|
-
})(NodeComputing || (NodeComputing = {}));
|
|
218
|
-
var LineComputing;
|
|
219
|
-
((LineComputing2) => {
|
|
220
|
-
LineComputing2.compute = (line, context) => {
|
|
221
|
-
const zIndex = lineZIndex(line, context);
|
|
222
|
-
const element = line.node;
|
|
223
|
-
element.style.position = "absolute";
|
|
224
|
-
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
225
|
-
};
|
|
226
|
-
const lineStackingLevel = (line, context) => {
|
|
227
|
-
if (line.isDrawing || // 正在绘制
|
|
228
|
-
context.hoveredEntityID === line.id || // hover
|
|
229
|
-
context.selectedIDs.includes(line.id)) {
|
|
230
|
-
return StackingConfig.maxLevel + 1;
|
|
231
|
-
}
|
|
232
|
-
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
233
|
-
if (!line.to) {
|
|
234
|
-
return fromLevel;
|
|
235
|
-
}
|
|
236
|
-
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
237
|
-
const level = Math.min(fromLevel, toLevel);
|
|
238
|
-
return level;
|
|
239
|
-
};
|
|
240
|
-
const lineZIndex = (line, context) => {
|
|
241
|
-
const level = lineStackingLevel(line, context);
|
|
242
|
-
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
243
|
-
return zIndex;
|
|
244
|
-
};
|
|
245
|
-
})(LineComputing || (LineComputing = {}));
|
|
246
|
-
var layersComputing = (params) => {
|
|
247
|
-
const { nodes, lines, context } = params;
|
|
248
|
-
nodes.forEach((node) => {
|
|
249
|
-
NodeComputing.compute(node, context);
|
|
250
|
-
});
|
|
251
|
-
lines.forEach((line) => {
|
|
252
|
-
LineComputing.compute(line, context);
|
|
253
|
-
});
|
|
254
|
-
};
|
|
255
170
|
|
|
256
171
|
// src/manager.ts
|
|
257
172
|
var StackingContextManager = class {
|
|
@@ -260,15 +175,13 @@ var StackingContextManager = class {
|
|
|
260
175
|
"gedit-playground-layer gedit-flow-render-layer"
|
|
261
176
|
);
|
|
262
177
|
this.disposers = [];
|
|
263
|
-
this.mode = "stacking" /* Stacking */;
|
|
264
178
|
/**
|
|
265
179
|
* 触发计算
|
|
266
180
|
* 10ms内仅计算一次
|
|
267
181
|
*/
|
|
268
182
|
this.compute = debounce(this._compute, 10);
|
|
269
183
|
}
|
|
270
|
-
init(
|
|
271
|
-
if (mode) this.mode = mode;
|
|
184
|
+
init() {
|
|
272
185
|
this.pipelineRenderer.node.appendChild(this.node);
|
|
273
186
|
this.mountListener();
|
|
274
187
|
}
|
|
@@ -279,17 +192,6 @@ var StackingContextManager = class {
|
|
|
279
192
|
this.disposers.forEach((disposer) => disposer.dispose());
|
|
280
193
|
}
|
|
281
194
|
_compute() {
|
|
282
|
-
if (this.mode === "stacking" /* Stacking */) {
|
|
283
|
-
return this.stackingCompute();
|
|
284
|
-
} else {
|
|
285
|
-
return layersComputing({
|
|
286
|
-
nodes: this.nodes,
|
|
287
|
-
lines: this.lines,
|
|
288
|
-
context: this.context
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
stackingCompute() {
|
|
293
195
|
const context = this.context;
|
|
294
196
|
const stackingComputing = new StackingComputing();
|
|
295
197
|
const { nodeLevel, lineLevel } = stackingComputing.compute({
|
|
@@ -299,10 +201,10 @@ var StackingContextManager = class {
|
|
|
299
201
|
});
|
|
300
202
|
this.nodes.forEach((node) => {
|
|
301
203
|
const level = nodeLevel.get(node.id);
|
|
302
|
-
const nodeRenderData = node.getData(
|
|
204
|
+
const nodeRenderData = node.getData(FlowNodeRenderData);
|
|
303
205
|
const element = nodeRenderData.node;
|
|
304
206
|
element.style.position = "absolute";
|
|
305
|
-
if (
|
|
207
|
+
if (level === void 0) {
|
|
306
208
|
element.style.zIndex = "auto";
|
|
307
209
|
nodeRenderData.stackIndex = 0;
|
|
308
210
|
return;
|
|
@@ -315,7 +217,7 @@ var StackingContextManager = class {
|
|
|
315
217
|
const level = lineLevel.get(line.id);
|
|
316
218
|
const element = line.node;
|
|
317
219
|
element.style.position = "absolute";
|
|
318
|
-
if (
|
|
220
|
+
if (level === void 0) {
|
|
319
221
|
element.style.zIndex = "auto";
|
|
320
222
|
return;
|
|
321
223
|
}
|
|
@@ -326,7 +228,7 @@ var StackingContextManager = class {
|
|
|
326
228
|
return this.entityManager.getEntities(WorkflowNodeEntity2);
|
|
327
229
|
}
|
|
328
230
|
get lines() {
|
|
329
|
-
return this.entityManager.getEntities(
|
|
231
|
+
return this.entityManager.getEntities(WorkflowLineEntity2);
|
|
330
232
|
}
|
|
331
233
|
get context() {
|
|
332
234
|
return {
|
|
@@ -391,9 +293,9 @@ var createFreeStackPlugin = definePluginCreator({
|
|
|
391
293
|
onBind({ bind }) {
|
|
392
294
|
bind(StackingContextManager).toSelf().inSingletonScope();
|
|
393
295
|
},
|
|
394
|
-
onInit(ctx
|
|
296
|
+
onInit(ctx) {
|
|
395
297
|
const stackingContextManager = ctx.get(StackingContextManager);
|
|
396
|
-
stackingContextManager.init(
|
|
298
|
+
stackingContextManager.init();
|
|
397
299
|
},
|
|
398
300
|
onReady(ctx) {
|
|
399
301
|
const stackingContextManager = ctx.get(StackingContextManager);
|
|
@@ -404,9 +306,101 @@ var createFreeStackPlugin = definePluginCreator({
|
|
|
404
306
|
stackingContextManager.dispose();
|
|
405
307
|
}
|
|
406
308
|
});
|
|
309
|
+
|
|
310
|
+
// src/layers-computing.ts
|
|
311
|
+
import { FlowNodeRenderData as FlowNodeRenderData2 } from "@flowgram.ai/document";
|
|
312
|
+
var NodeComputing;
|
|
313
|
+
((NodeComputing2) => {
|
|
314
|
+
NodeComputing2.compute = (node, context) => {
|
|
315
|
+
const zIndex = nodeZIndex(node, context);
|
|
316
|
+
const element = nodeElement(node);
|
|
317
|
+
element.style.position = "absolute";
|
|
318
|
+
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
319
|
+
};
|
|
320
|
+
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
321
|
+
if (level < 1) {
|
|
322
|
+
return void 0;
|
|
323
|
+
}
|
|
324
|
+
const baseZIndex = StackingBaseIndex[stackingType];
|
|
325
|
+
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
326
|
+
return zIndex;
|
|
327
|
+
};
|
|
328
|
+
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
329
|
+
const unReversedLinage = [];
|
|
330
|
+
let currentNode = node;
|
|
331
|
+
while (currentNode) {
|
|
332
|
+
unReversedLinage.push(currentNode);
|
|
333
|
+
currentNode = currentNode.parent;
|
|
334
|
+
}
|
|
335
|
+
const linage = unReversedLinage.reverse();
|
|
336
|
+
const nodeLevel = linage.length - 1;
|
|
337
|
+
const topLevelIndex = linage.findIndex((node2) => {
|
|
338
|
+
if (context.selectedIDs.includes(node2.id)) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
});
|
|
343
|
+
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
344
|
+
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
345
|
+
return topLevel;
|
|
346
|
+
}
|
|
347
|
+
return nodeLevel;
|
|
348
|
+
};
|
|
349
|
+
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
350
|
+
if (zIndex === void 0) {
|
|
351
|
+
return "auto";
|
|
352
|
+
}
|
|
353
|
+
return zIndex.toString();
|
|
354
|
+
};
|
|
355
|
+
const nodeZIndex = (node, context) => {
|
|
356
|
+
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
357
|
+
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
358
|
+
return zIndex;
|
|
359
|
+
};
|
|
360
|
+
const nodeElement = (node) => {
|
|
361
|
+
const nodeRenderData = node.getData(FlowNodeRenderData2);
|
|
362
|
+
return nodeRenderData.node;
|
|
363
|
+
};
|
|
364
|
+
})(NodeComputing || (NodeComputing = {}));
|
|
365
|
+
var LineComputing;
|
|
366
|
+
((LineComputing2) => {
|
|
367
|
+
LineComputing2.compute = (line, context) => {
|
|
368
|
+
const zIndex = lineZIndex(line, context);
|
|
369
|
+
const element = line.node;
|
|
370
|
+
element.style.position = "absolute";
|
|
371
|
+
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
372
|
+
};
|
|
373
|
+
const lineStackingLevel = (line, context) => {
|
|
374
|
+
if (line.isDrawing || // 正在绘制
|
|
375
|
+
context.hoveredEntityID === line.id || // hover
|
|
376
|
+
context.selectedIDs.includes(line.id)) {
|
|
377
|
+
return StackingConfig.maxLevel + 1;
|
|
378
|
+
}
|
|
379
|
+
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
380
|
+
if (!line.to) {
|
|
381
|
+
return fromLevel;
|
|
382
|
+
}
|
|
383
|
+
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
384
|
+
const level = Math.min(fromLevel, toLevel);
|
|
385
|
+
return level;
|
|
386
|
+
};
|
|
387
|
+
const lineZIndex = (line, context) => {
|
|
388
|
+
const level = lineStackingLevel(line, context);
|
|
389
|
+
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
390
|
+
return zIndex;
|
|
391
|
+
};
|
|
392
|
+
})(LineComputing || (LineComputing = {}));
|
|
393
|
+
var layersComputing = (params) => {
|
|
394
|
+
const { nodes, lines, context } = params;
|
|
395
|
+
nodes.forEach((node) => {
|
|
396
|
+
NodeComputing.compute(node, context);
|
|
397
|
+
});
|
|
398
|
+
lines.forEach((line) => {
|
|
399
|
+
LineComputing.compute(line, context);
|
|
400
|
+
});
|
|
401
|
+
};
|
|
407
402
|
export {
|
|
408
403
|
StackingBaseIndex,
|
|
409
|
-
StackingComputeMode,
|
|
410
404
|
StackingComputing,
|
|
411
405
|
StackingConfig,
|
|
412
406
|
StackingContextManager,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create-free-stack-plugin.ts","../../src/manager.ts","../../src/stacking-computing.ts","../../src/layers-computing.ts","../../src/constant.ts"],"sourcesContent":["import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { StackingContextManager } from './manager';\nimport { StackingComputeMode } from './constant';\n\nexport const createFreeStackPlugin = definePluginCreator<{\n mode?: StackingComputeMode;\n}>({\n onBind({ bind }) {\n bind(StackingContextManager).toSelf().inSingletonScope();\n },\n onInit(ctx, opts) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.init(opts?.mode);\n },\n onReady(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.ready();\n },\n onDispose(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.dispose();\n },\n});\n","import { debounce } from 'lodash';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Disposable } from '@flowgram.ai/utils';\nimport {\n WorkflowHoverService,\n WorkflowNodeEntity,\n WorkflowSelectService,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\nimport { EntityManager, PipelineRegistry, PipelineRenderer } from '@flowgram.ai/core';\n\nimport type { StackingContext } from './type';\nimport { StackingComputing } from './stacking-computing';\nimport { layersComputing } from './layers-computing';\nimport { StackingComputeMode, StackingConfig } from './constant';\n\n@injectable()\nexport class StackingContextManager {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(PipelineRenderer)\n private readonly pipelineRenderer: PipelineRenderer;\n\n @inject(PipelineRegistry)\n private readonly pipelineRegistry: PipelineRegistry;\n\n @inject(WorkflowHoverService)\n private readonly hoverService: WorkflowHoverService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n public readonly node = domUtils.createDivWithClass(\n 'gedit-playground-layer gedit-flow-render-layer'\n );\n\n private disposers: Disposable[] = [];\n\n private mode: StackingComputeMode = StackingComputeMode.Stacking;\n\n constructor() {}\n\n public init(mode?: StackingComputeMode): void {\n if (mode) this.mode = mode;\n this.pipelineRenderer.node.appendChild(this.node);\n this.mountListener();\n }\n\n public ready(): void {\n this.compute();\n }\n\n public dispose(): void {\n this.disposers.forEach((disposer) => disposer.dispose());\n }\n\n /**\n * 触发计算\n * 10ms内仅计算一次\n */\n private compute = debounce(this._compute, 10);\n\n private _compute(): void {\n if (this.mode === StackingComputeMode.Stacking) {\n return this.stackingCompute();\n } else {\n return layersComputing({\n nodes: this.nodes,\n lines: this.lines,\n context: this.context,\n });\n }\n }\n\n private stackingCompute(): void {\n const context = this.context;\n const stackingComputing = new StackingComputing();\n const { nodeLevel, lineLevel } = stackingComputing.compute({\n root: this.document.root,\n nodes: this.nodes,\n context,\n });\n this.nodes.forEach((node) => {\n const level = nodeLevel.get(node.id);\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n const element = nodeRenderData.node;\n element.style.position = 'absolute';\n if (!level) {\n element.style.zIndex = 'auto';\n nodeRenderData.stackIndex = 0;\n return;\n }\n const stackIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(stackIndex);\n nodeRenderData.stackIndex = stackIndex;\n });\n this.lines.forEach((line) => {\n const level = lineLevel.get(line.id);\n const element = line.node;\n element.style.position = 'absolute';\n if (!level) {\n element.style.zIndex = 'auto';\n return;\n }\n element.style.zIndex = String(StackingConfig.startIndex + level);\n });\n }\n\n private get nodes(): WorkflowNodeEntity[] {\n return this.entityManager.getEntities<WorkflowNodeEntity>(WorkflowNodeEntity);\n }\n\n private get lines(): WorkflowLineEntity[] {\n return this.entityManager.getEntities<WorkflowLineEntity>(WorkflowLineEntity);\n }\n\n private get context(): StackingContext {\n return {\n hoveredEntity: this.hoverService.hoveredNode,\n hoveredEntityID: this.hoverService.hoveredNode?.id,\n selectedEntities: this.selectService.selection,\n selectedIDs: this.selectService.selection.map((entity) => entity.id),\n };\n }\n\n private mountListener(): void {\n const entityChangeDisposer = this.onEntityChange();\n const zoomDisposer = this.onZoom();\n const hoverDisposer = this.onHover();\n const selectDisposer = this.onSelect();\n this.disposers = [entityChangeDisposer, zoomDisposer, hoverDisposer, selectDisposer];\n }\n\n private onZoom(): Disposable {\n return this.pipelineRegistry.onZoom((scale: number) => {\n this.node.style.transform = `scale(${scale})`;\n });\n }\n\n private onHover(): Disposable {\n return this.hoverService.onHoveredChange(() => {\n this.compute();\n });\n }\n\n private onEntityChange(): Disposable {\n return this.entityManager.onEntityChange(() => {\n this.compute();\n });\n }\n\n private onSelect(): Disposable {\n return this.selectService.onSelectionChanged(() => {\n this.compute();\n });\n }\n}\n","import { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { WorkflowNodeEntity, WorkflowNodeLinesData } from '@flowgram.ai/free-layout-core';\n\nimport type { StackingContext } from './type';\n\nexport class StackingComputing {\n private currentLevel: number;\n\n private topLevel: number;\n\n private maxLevel: number;\n\n private nodeIndexes: Map<string, number>;\n\n private nodeLevel: Map<string, number>;\n\n private lineLevel: Map<string, number>;\n\n private context: StackingContext;\n\n public compute(params: {\n root: WorkflowNodeEntity;\n nodes: WorkflowNodeEntity[];\n context: StackingContext;\n }): {\n /** 节点层级 */\n nodeLevel: Map<string, number>;\n /** 线条层级 */\n lineLevel: Map<string, number>;\n /** 正常渲染的最高层级 */\n topLevel: number;\n /** 选中计算叠加后可能计算出的最高层级 */\n maxLevel: number;\n } {\n this.clearCache();\n const { root, nodes, context } = params;\n this.context = context;\n this.nodeIndexes = this.computeNodeIndexesMap(nodes);\n this.topLevel = this.computeTopLevel(nodes);\n this.maxLevel = this.topLevel * 2;\n this.layerHandler(root.collapsedChildren);\n return {\n nodeLevel: this.nodeLevel,\n lineLevel: this.lineLevel,\n topLevel: this.topLevel,\n maxLevel: this.maxLevel,\n };\n }\n\n private clearCache(): void {\n this.currentLevel = 0;\n this.topLevel = 0;\n this.maxLevel = 0;\n this.nodeIndexes = new Map();\n this.nodeLevel = new Map();\n this.lineLevel = new Map();\n }\n\n private computeNodeIndexesMap(nodes: WorkflowNodeEntity[]): Map<string, number> {\n const nodeIndexMap = new Map<string, number>();\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n return nodeIndexMap;\n }\n\n private computeTopLevel(nodes: WorkflowNodeEntity[]): number {\n const nodesWithoutRoot = nodes.filter(node => node.id !== FlowNodeBaseType.ROOT);\n const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {\n if (node.collapsedChildren.length > 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n // 最高层数 = 节点个数 + 容器节点个数(线条单独占一层) + 抬高一层\n return nodesWithoutRoot.length + nodeHasChildren + 1;\n }\n\n private layerHandler(nodes: WorkflowNodeEntity[], pinTop: boolean = false): void {\n const sortedNodes = nodes.sort((a, b) => {\n const aIndex = this.nodeIndexes.get(a.id);\n const bIndex = this.nodeIndexes.get(b.id);\n if (aIndex === undefined || bIndex === undefined) {\n return 0;\n }\n return aIndex - bIndex;\n });\n\n const lines = nodes\n .map(node => {\n const linesData = node.getData<WorkflowNodeLinesData>(WorkflowNodeLinesData);\n const outputLines = linesData.outputLines.filter(Boolean);\n const inputLines = linesData.inputLines.filter(Boolean);\n // 前后线条会有重复,下面 Map 会通过线条 ID 过滤掉\n return [...outputLines, ...inputLines];\n })\n .flat();\n\n // 线条统一设为当前层级最低\n lines.forEach(line => {\n if (\n line.isDrawing || // 正在绘制\n this.context.hoveredEntityID === line.id || // hover\n this.context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n this.lineLevel.set(line.id, this.maxLevel);\n } else {\n this.lineLevel.set(line.id, this.getLevel(pinTop));\n }\n });\n this.levelIncrease();\n sortedNodes.forEach(node => {\n const selected = this.context.selectedIDs.includes(node.id);\n if (selected) {\n // 节点置顶条件:选中\n this.nodeLevel.set(node.id, this.topLevel);\n } else {\n this.nodeLevel.set(node.id, this.getLevel(pinTop));\n }\n // 节点层级逐层增高\n this.levelIncrease();\n if (node.collapsedChildren.length > 0) {\n // 子节点层级需低于后续兄弟节点,因此需要先进行计算\n this.layerHandler(node.collapsedChildren, pinTop || selected);\n }\n });\n }\n\n private getLevel(pinTop: boolean): number {\n if (pinTop) {\n return this.topLevel + this.currentLevel;\n }\n return this.currentLevel;\n }\n\n private levelIncrease(): void {\n this.currentLevel += 1;\n }\n}\n","import { FlowNodeRenderData } from '@flowgram.ai/document';\nimport type { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';\nimport type { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\n\nimport type { StackingContext } from './type';\nimport { StackingBaseIndex, StackingConfig, StackingType } from './constant';\n\nnamespace NodeComputing {\n export const compute = (node: WorkflowNodeEntity, context: StackingContext): void => {\n const zIndex = nodeZIndex(node, context);\n const element = nodeElement(node);\n element.style.position = 'absolute';\n element.style.zIndex = zIndexStringify(zIndex);\n };\n\n export const stackingIndex = (stackingType: StackingType, level: number): number | undefined => {\n if (level < 1) {\n // root节点\n return undefined;\n }\n const baseZIndex = StackingBaseIndex[stackingType];\n const zIndex =\n StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;\n return zIndex;\n };\n\n export const nodeStackingLevel = (\n node: WorkflowNodeEntity,\n context: StackingContext,\n disableTopLevel = false,\n ): number => {\n // TODO 后续支持多层级时这个计算逻辑应该去掉,level信息应该直接由 FlowNodeEntity 缓存给出\n // 多层时这里的计算会有 O(logN) 时间复杂度,并且在多层级联同计算时会有BUG,本次需求不处理这种情况\n const unReversedLinage: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode) {\n unReversedLinage.push(currentNode);\n currentNode = currentNode.parent;\n }\n const linage = unReversedLinage.reverse();\n const nodeLevel = linage.length - 1;\n\n const topLevelIndex = linage.findIndex((node: WorkflowNodeEntity) => {\n if (context.selectedIDs.includes(node.id)) {\n // 存在被选中的父级或自身被选中,直接置顶\n return true;\n }\n return false;\n });\n const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);\n\n if (!disableTopLevel && topLevelIndex !== -1) {\n // 置顶\n return topLevel;\n }\n\n return nodeLevel;\n };\n\n export const zIndexStringify = (zIndex?: number): string => {\n if (zIndex === undefined) {\n return 'auto';\n }\n return zIndex.toString();\n };\n\n const nodeZIndex = (node: WorkflowNodeEntity, context: StackingContext): number | undefined => {\n const level = nodeStackingLevel(node, context);\n const zIndex = stackingIndex(StackingType.Node, level);\n return zIndex;\n };\n\n const nodeElement = (node: WorkflowNodeEntity): HTMLDivElement => {\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return nodeRenderData.node;\n };\n}\n\nnamespace LineComputing {\n export const compute = (line: WorkflowLineEntity, context: StackingContext): void => {\n const zIndex = lineZIndex(line, context);\n const element = line.node;\n element.style.position = 'absolute';\n element.style.zIndex = NodeComputing.zIndexStringify(zIndex);\n };\n\n const lineStackingLevel = (line: WorkflowLineEntity, context: StackingContext): number => {\n if (\n line.isDrawing || // 正在绘制\n context.hoveredEntityID === line.id || // hover\n context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n return StackingConfig.maxLevel + 1;\n }\n const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);\n if (!line.to) {\n // 还处于连线中\n return fromLevel;\n }\n const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);\n const level = Math.min(fromLevel, toLevel);\n return level;\n };\n\n const lineZIndex = (line: WorkflowLineEntity, context: StackingContext): number | undefined => {\n const level = lineStackingLevel(line, context);\n const zIndex = NodeComputing.stackingIndex(StackingType.Line, level);\n return zIndex;\n };\n}\n\nexport const layersComputing = (params: {\n nodes: WorkflowNodeEntity[];\n lines: WorkflowLineEntity[];\n context: StackingContext;\n}) => {\n const { nodes, lines, context } = params;\n nodes.forEach(node => {\n NodeComputing.compute(node, context);\n });\n lines.forEach(line => {\n LineComputing.compute(line, context);\n });\n};\n","export enum StackingItem {\n Line = 'line',\n Node = 'node',\n}\n\nexport enum StackingType {\n Line = StackingItem.Line,\n Node = StackingItem.Node,\n}\n\nexport const StackingBaseIndex: Record<StackingType, number> = {\n [StackingType.Line]: 0,\n [StackingType.Node]: 1,\n};\n\n// 常量\nconst startIndex = 8;\nconst allowLevel = 2;\n\n// 计算值\nconst levelIndexStep = Object.keys(StackingType).length;\nconst maxLevel = allowLevel * 2;\nconst maxIndex = startIndex + maxLevel * levelIndexStep;\n\nexport const StackingConfig = {\n /** index 起始值 */\n startIndex,\n /** 允许存在的层级 */\n allowLevel,\n /** 每层 index 跨度 */\n levelIndexStep,\n /** 叠加计算后出现的最深层级 */\n maxLevel,\n /** 最大 index */\n maxIndex,\n};\n\nexport enum StackingComputeMode {\n /** 层叠计算模式 */\n Stacking = 'stacking',\n /** 层级计算模式 */\n Layers = 'layers',\n}\n"],"mappings":"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","names":["WorkflowNodeEntity","FlowNodeRenderData","StackingItem","StackingType","StackingComputeMode","NodeComputing","node","LineComputing","FlowNodeRenderData","WorkflowNodeEntity"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-free-stack-plugin.ts","../../src/manager.ts","../../src/stacking-computing.ts","../../src/constant.ts","../../src/layers-computing.ts"],"sourcesContent":["import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { StackingContextManager } from './manager';\n\nexport const createFreeStackPlugin = definePluginCreator({\n onBind({ bind }) {\n bind(StackingContextManager).toSelf().inSingletonScope();\n },\n onInit(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.init();\n },\n onReady(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.ready();\n },\n onDispose(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.dispose();\n },\n});\n","import { debounce } from 'lodash';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Disposable } from '@flowgram.ai/utils';\nimport {\n WorkflowHoverService,\n WorkflowNodeEntity,\n WorkflowSelectService,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\nimport { EntityManager, PipelineRegistry, PipelineRenderer } from '@flowgram.ai/core';\n\nimport type { StackingContext } from './type';\nimport { StackingComputing } from './stacking-computing';\nimport { StackingConfig } from './constant';\n\n@injectable()\nexport class StackingContextManager {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(PipelineRenderer)\n private readonly pipelineRenderer: PipelineRenderer;\n\n @inject(PipelineRegistry)\n private readonly pipelineRegistry: PipelineRegistry;\n\n @inject(WorkflowHoverService)\n private readonly hoverService: WorkflowHoverService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n public readonly node = domUtils.createDivWithClass(\n 'gedit-playground-layer gedit-flow-render-layer'\n );\n\n private disposers: Disposable[] = [];\n\n constructor() {}\n\n public init(): void {\n this.pipelineRenderer.node.appendChild(this.node);\n this.mountListener();\n }\n\n public ready(): void {\n this.compute();\n }\n\n public dispose(): void {\n this.disposers.forEach((disposer) => disposer.dispose());\n }\n\n /**\n * 触发计算\n * 10ms内仅计算一次\n */\n private compute = debounce(this._compute, 10);\n\n private _compute(): void {\n const context = this.context;\n const stackingComputing = new StackingComputing();\n const { nodeLevel, lineLevel } = stackingComputing.compute({\n root: this.document.root,\n nodes: this.nodes,\n context,\n });\n this.nodes.forEach((node) => {\n const level = nodeLevel.get(node.id);\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n const element = nodeRenderData.node;\n element.style.position = 'absolute';\n if (level === undefined) {\n element.style.zIndex = 'auto';\n nodeRenderData.stackIndex = 0;\n return;\n }\n const stackIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(stackIndex);\n nodeRenderData.stackIndex = stackIndex;\n });\n this.lines.forEach((line) => {\n const level = lineLevel.get(line.id);\n const element = line.node;\n element.style.position = 'absolute';\n if (level === undefined) {\n element.style.zIndex = 'auto';\n return;\n }\n element.style.zIndex = String(StackingConfig.startIndex + level);\n });\n }\n\n private get nodes(): WorkflowNodeEntity[] {\n return this.entityManager.getEntities<WorkflowNodeEntity>(WorkflowNodeEntity);\n }\n\n private get lines(): WorkflowLineEntity[] {\n return this.entityManager.getEntities<WorkflowLineEntity>(WorkflowLineEntity);\n }\n\n private get context(): StackingContext {\n return {\n hoveredEntity: this.hoverService.hoveredNode,\n hoveredEntityID: this.hoverService.hoveredNode?.id,\n selectedEntities: this.selectService.selection,\n selectedIDs: this.selectService.selection.map((entity) => entity.id),\n };\n }\n\n private mountListener(): void {\n const entityChangeDisposer = this.onEntityChange();\n const zoomDisposer = this.onZoom();\n const hoverDisposer = this.onHover();\n const selectDisposer = this.onSelect();\n this.disposers = [entityChangeDisposer, zoomDisposer, hoverDisposer, selectDisposer];\n }\n\n private onZoom(): Disposable {\n return this.pipelineRegistry.onZoom((scale: number) => {\n this.node.style.transform = `scale(${scale})`;\n });\n }\n\n private onHover(): Disposable {\n return this.hoverService.onHoveredChange(() => {\n this.compute();\n });\n }\n\n private onEntityChange(): Disposable {\n return this.entityManager.onEntityChange(() => {\n this.compute();\n });\n }\n\n private onSelect(): Disposable {\n return this.selectService.onSelectionChanged(() => {\n this.compute();\n });\n }\n}\n","import {\n WorkflowLineEntity,\n WorkflowNodeEntity,\n WorkflowNodeLinesData,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\n\nimport type { StackingContext } from './type';\n\nexport class StackingComputing {\n private currentLevel: number;\n\n private topLevel: number;\n\n private maxLevel: number;\n\n private nodeIndexes: Map<string, number>;\n\n private nodeLevel: Map<string, number>;\n\n private lineLevel: Map<string, number>;\n\n private context: StackingContext;\n\n public compute(params: {\n root: WorkflowNodeEntity;\n nodes: WorkflowNodeEntity[];\n context: StackingContext;\n }): {\n /** 节点层级 */\n nodeLevel: Map<string, number>;\n /** 线条层级 */\n lineLevel: Map<string, number>;\n /** 正常渲染的最高层级 */\n topLevel: number;\n /** 选中计算叠加后可能计算出的最高层级 */\n maxLevel: number;\n } {\n this.clearCache();\n const { root, nodes, context } = params;\n this.context = context;\n this.nodeIndexes = this.computeNodeIndexesMap(nodes);\n this.topLevel = this.computeTopLevel(nodes);\n this.maxLevel = this.topLevel * 2;\n this.layerHandler(root.blocks);\n return {\n nodeLevel: this.nodeLevel,\n lineLevel: this.lineLevel,\n topLevel: this.topLevel,\n maxLevel: this.maxLevel,\n };\n }\n\n private clearCache(): void {\n this.currentLevel = 0;\n this.topLevel = 0;\n this.maxLevel = 0;\n this.nodeIndexes = new Map();\n this.nodeLevel = new Map();\n this.lineLevel = new Map();\n }\n\n private computeNodeIndexesMap(nodes: WorkflowNodeEntity[]): Map<string, number> {\n const nodeIndexMap = new Map<string, number>();\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n return nodeIndexMap;\n }\n\n private computeTopLevel(nodes: WorkflowNodeEntity[]): number {\n const nodesWithoutRoot = nodes.filter((node) => node.id !== FlowNodeBaseType.ROOT);\n const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {\n if (node.blocks.length > 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n // 最高层数 = 节点个数 + 容器节点个数(线条单独占一层) + 抬高一层\n return nodesWithoutRoot.length + nodeHasChildren + 1;\n }\n\n private layerHandler(layerNodes: WorkflowNodeEntity[], pinTop: boolean = false): void {\n const nodes = this.sortNodes(layerNodes);\n const lines = this.getNodesAllLines(nodes);\n\n // 线条统一设为当前层级最低\n lines.forEach((line) => {\n if (\n line.isDrawing || // 正在绘制\n this.context.hoveredEntityID === line.id || // hover\n this.context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n this.lineLevel.set(line.id, this.maxLevel);\n } else {\n this.lineLevel.set(line.id, this.getLevel(pinTop));\n }\n });\n this.levelIncrease();\n nodes.forEach((node) => {\n const selected = this.context.selectedIDs.includes(node.id);\n if (selected) {\n // 节点置顶条件:选中\n this.nodeLevel.set(node.id, this.topLevel);\n } else {\n this.nodeLevel.set(node.id, this.getLevel(pinTop));\n }\n // 节点层级逐层增高\n this.levelIncrease();\n if (node.blocks.length > 0) {\n // 子节点层级需低于后续兄弟节点,因此需要先进行计算\n this.layerHandler(node.blocks, pinTop || selected);\n }\n });\n }\n\n private sortNodes(nodes: WorkflowNodeEntity[]): WorkflowNodeEntity[] {\n return nodes.sort((a, b) => {\n const aIndex = this.nodeIndexes.get(a.id);\n const bIndex = this.nodeIndexes.get(b.id);\n if (aIndex === undefined || bIndex === undefined) {\n return 0;\n }\n return aIndex - bIndex;\n });\n }\n\n private getNodesAllLines(nodes: WorkflowNodeEntity[]): WorkflowLineEntity[] {\n const lines = nodes\n .map((node) => {\n const linesData = node.getData<WorkflowNodeLinesData>(WorkflowNodeLinesData);\n const outputLines = linesData.outputLines.filter(Boolean);\n const inputLines = linesData.inputLines.filter(Boolean);\n return [...outputLines, ...inputLines];\n })\n .flat();\n\n // 过滤出未计算层级的线条,以及高度优先(需要覆盖计算)的线条\n const filteredLines = lines.filter(\n (line) => this.lineLevel.get(line.id) === undefined || this.isHigherFirstLine(line)\n );\n\n return filteredLines;\n }\n\n private isHigherFirstLine(line: WorkflowLineEntity): boolean {\n // 父子相连的线条,需要作为高度优先的线条,避免线条不可见\n return line.to?.parent === line.from || line.from?.parent === line.to;\n }\n\n private getLevel(pinTop: boolean): number {\n if (pinTop) {\n return this.topLevel + this.currentLevel;\n }\n return this.currentLevel;\n }\n\n private levelIncrease(): void {\n this.currentLevel += 1;\n }\n}\n","export enum StackingItem {\n Line = 'line',\n Node = 'node',\n}\n\nexport enum StackingType {\n Line = StackingItem.Line,\n Node = StackingItem.Node,\n}\n\nexport const StackingBaseIndex: Record<StackingType, number> = {\n [StackingType.Line]: 0,\n [StackingType.Node]: 1,\n};\n\n// 常量\nconst startIndex = 8;\nconst allowLevel = 2;\n\n// 计算值\nconst levelIndexStep = Object.keys(StackingType).length;\nconst maxLevel = allowLevel * 2;\nconst maxIndex = startIndex + maxLevel * levelIndexStep;\n\nexport const StackingConfig = {\n /** index 起始值 */\n startIndex,\n /** 允许存在的层级 */\n allowLevel,\n /** 每层 index 跨度 */\n levelIndexStep,\n /** 叠加计算后出现的最深层级 */\n maxLevel,\n /** 最大 index */\n maxIndex,\n};\n","import type { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';\nimport type { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport type { StackingContext } from './type';\nimport { StackingBaseIndex, StackingConfig, StackingType } from './constant';\n\nnamespace NodeComputing {\n export const compute = (node: WorkflowNodeEntity, context: StackingContext): void => {\n const zIndex = nodeZIndex(node, context);\n const element = nodeElement(node);\n element.style.position = 'absolute';\n element.style.zIndex = zIndexStringify(zIndex);\n };\n\n export const stackingIndex = (stackingType: StackingType, level: number): number | undefined => {\n if (level < 1) {\n // root节点\n return undefined;\n }\n const baseZIndex = StackingBaseIndex[stackingType];\n const zIndex =\n StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;\n return zIndex;\n };\n\n export const nodeStackingLevel = (\n node: WorkflowNodeEntity,\n context: StackingContext,\n disableTopLevel = false\n ): number => {\n // TODO 后续支持多层级时这个计算逻辑应该去掉,level信息应该直接由 FlowNodeEntity 缓存给出\n // 多层时这里的计算会有 O(logN) 时间复杂度,并且在多层级联同计算时会有BUG,本次需求不处理这种情况\n const unReversedLinage: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode) {\n unReversedLinage.push(currentNode);\n currentNode = currentNode.parent;\n }\n const linage = unReversedLinage.reverse();\n const nodeLevel = linage.length - 1;\n\n const topLevelIndex = linage.findIndex((node: WorkflowNodeEntity) => {\n if (context.selectedIDs.includes(node.id)) {\n // 存在被选中的父级或自身被选中,直接置顶\n return true;\n }\n return false;\n });\n const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);\n\n if (!disableTopLevel && topLevelIndex !== -1) {\n // 置顶\n return topLevel;\n }\n\n return nodeLevel;\n };\n\n export const zIndexStringify = (zIndex?: number): string => {\n if (zIndex === undefined) {\n return 'auto';\n }\n return zIndex.toString();\n };\n\n const nodeZIndex = (node: WorkflowNodeEntity, context: StackingContext): number | undefined => {\n const level = nodeStackingLevel(node, context);\n const zIndex = stackingIndex(StackingType.Node, level);\n return zIndex;\n };\n\n const nodeElement = (node: WorkflowNodeEntity): HTMLDivElement => {\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return nodeRenderData.node;\n };\n}\n\nnamespace LineComputing {\n export const compute = (line: WorkflowLineEntity, context: StackingContext): void => {\n const zIndex = lineZIndex(line, context);\n const element = line.node;\n element.style.position = 'absolute';\n element.style.zIndex = NodeComputing.zIndexStringify(zIndex);\n };\n\n const lineStackingLevel = (line: WorkflowLineEntity, context: StackingContext): number => {\n if (\n line.isDrawing || // 正在绘制\n context.hoveredEntityID === line.id || // hover\n context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n return StackingConfig.maxLevel + 1;\n }\n const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);\n if (!line.to) {\n // 还处于连线中\n return fromLevel;\n }\n const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);\n const level = Math.min(fromLevel, toLevel);\n return level;\n };\n\n const lineZIndex = (line: WorkflowLineEntity, context: StackingContext): number | undefined => {\n const level = lineStackingLevel(line, context);\n const zIndex = NodeComputing.stackingIndex(StackingType.Line, level);\n return zIndex;\n };\n}\n\nexport const layersComputing = (params: {\n nodes: WorkflowNodeEntity[];\n lines: WorkflowLineEntity[];\n context: StackingContext;\n}) => {\n const { nodes, lines, context } = params;\n nodes.forEach((node) => {\n NodeComputing.compute(node, context);\n });\n lines.forEach((line) => {\n LineComputing.compute(line, context);\n });\n};\n"],"mappings":"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","names":["WorkflowNodeEntity","WorkflowLineEntity","StackingItem","StackingType","WorkflowNodeEntity","WorkflowLineEntity","FlowNodeRenderData","NodeComputing","node","FlowNodeRenderData","LineComputing"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,38 +1,8 @@
|
|
|
1
1
|
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
2
|
import { Entity } from '@flowgram.ai/core';
|
|
3
|
-
import {
|
|
3
|
+
import { WorkflowEntityHoverable, WorkflowNodeEntity, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
4
4
|
|
|
5
|
-
declare
|
|
6
|
-
Line = "line",
|
|
7
|
-
Node = "node"
|
|
8
|
-
}
|
|
9
|
-
declare enum StackingType {
|
|
10
|
-
Line = "line",
|
|
11
|
-
Node = "node"
|
|
12
|
-
}
|
|
13
|
-
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
14
|
-
declare const StackingConfig: {
|
|
15
|
-
/** index 起始值 */
|
|
16
|
-
startIndex: number;
|
|
17
|
-
/** 允许存在的层级 */
|
|
18
|
-
allowLevel: number;
|
|
19
|
-
/** 每层 index 跨度 */
|
|
20
|
-
levelIndexStep: number;
|
|
21
|
-
/** 叠加计算后出现的最深层级 */
|
|
22
|
-
maxLevel: number;
|
|
23
|
-
/** 最大 index */
|
|
24
|
-
maxIndex: number;
|
|
25
|
-
};
|
|
26
|
-
declare enum StackingComputeMode {
|
|
27
|
-
/** 层叠计算模式 */
|
|
28
|
-
Stacking = "stacking",
|
|
29
|
-
/** 层级计算模式 */
|
|
30
|
-
Layers = "layers"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
declare const createFreeStackPlugin: _flowgram_ai_core.PluginCreator<{
|
|
34
|
-
mode?: StackingComputeMode | undefined;
|
|
35
|
-
}>;
|
|
5
|
+
declare const createFreeStackPlugin: _flowgram_ai_core.PluginCreator<unknown>;
|
|
36
6
|
|
|
37
7
|
declare class StackingContextManager {
|
|
38
8
|
private readonly document;
|
|
@@ -43,9 +13,8 @@ declare class StackingContextManager {
|
|
|
43
13
|
private readonly selectService;
|
|
44
14
|
readonly node: HTMLDivElement;
|
|
45
15
|
private disposers;
|
|
46
|
-
private mode;
|
|
47
16
|
constructor();
|
|
48
|
-
init(
|
|
17
|
+
init(): void;
|
|
49
18
|
ready(): void;
|
|
50
19
|
dispose(): void;
|
|
51
20
|
/**
|
|
@@ -54,7 +23,6 @@ declare class StackingContextManager {
|
|
|
54
23
|
*/
|
|
55
24
|
private compute;
|
|
56
25
|
private _compute;
|
|
57
|
-
private stackingCompute;
|
|
58
26
|
private get nodes();
|
|
59
27
|
private get lines();
|
|
60
28
|
private get context();
|
|
@@ -65,8 +33,30 @@ declare class StackingContextManager {
|
|
|
65
33
|
private onSelect;
|
|
66
34
|
}
|
|
67
35
|
|
|
36
|
+
declare enum StackingItem {
|
|
37
|
+
Line = "line",
|
|
38
|
+
Node = "node"
|
|
39
|
+
}
|
|
40
|
+
declare enum StackingType {
|
|
41
|
+
Line = "line",
|
|
42
|
+
Node = "node"
|
|
43
|
+
}
|
|
44
|
+
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
45
|
+
declare const StackingConfig: {
|
|
46
|
+
/** index 起始值 */
|
|
47
|
+
startIndex: number;
|
|
48
|
+
/** 允许存在的层级 */
|
|
49
|
+
allowLevel: number;
|
|
50
|
+
/** 每层 index 跨度 */
|
|
51
|
+
levelIndexStep: number;
|
|
52
|
+
/** 叠加计算后出现的最深层级 */
|
|
53
|
+
maxLevel: number;
|
|
54
|
+
/** 最大 index */
|
|
55
|
+
maxIndex: number;
|
|
56
|
+
};
|
|
57
|
+
|
|
68
58
|
type StackingContext = {
|
|
69
|
-
hoveredEntity?:
|
|
59
|
+
hoveredEntity?: WorkflowEntityHoverable;
|
|
70
60
|
hoveredEntityID?: string;
|
|
71
61
|
selectedEntities: Entity[];
|
|
72
62
|
selectedIDs: string[];
|
|
@@ -104,8 +94,11 @@ declare class StackingComputing {
|
|
|
104
94
|
private computeNodeIndexesMap;
|
|
105
95
|
private computeTopLevel;
|
|
106
96
|
private layerHandler;
|
|
97
|
+
private sortNodes;
|
|
98
|
+
private getNodesAllLines;
|
|
99
|
+
private isHigherFirstLine;
|
|
107
100
|
private getLevel;
|
|
108
101
|
private levelIncrease;
|
|
109
102
|
}
|
|
110
103
|
|
|
111
|
-
export { StackingBaseIndex,
|
|
104
|
+
export { StackingBaseIndex, StackingComputing, StackingConfig, type StackingContext, StackingContextManager, StackingItem, StackingType, createFreeStackPlugin, layersComputing };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,38 +1,8 @@
|
|
|
1
1
|
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
2
|
import { Entity } from '@flowgram.ai/core';
|
|
3
|
-
import {
|
|
3
|
+
import { WorkflowEntityHoverable, WorkflowNodeEntity, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
4
4
|
|
|
5
|
-
declare
|
|
6
|
-
Line = "line",
|
|
7
|
-
Node = "node"
|
|
8
|
-
}
|
|
9
|
-
declare enum StackingType {
|
|
10
|
-
Line = "line",
|
|
11
|
-
Node = "node"
|
|
12
|
-
}
|
|
13
|
-
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
14
|
-
declare const StackingConfig: {
|
|
15
|
-
/** index 起始值 */
|
|
16
|
-
startIndex: number;
|
|
17
|
-
/** 允许存在的层级 */
|
|
18
|
-
allowLevel: number;
|
|
19
|
-
/** 每层 index 跨度 */
|
|
20
|
-
levelIndexStep: number;
|
|
21
|
-
/** 叠加计算后出现的最深层级 */
|
|
22
|
-
maxLevel: number;
|
|
23
|
-
/** 最大 index */
|
|
24
|
-
maxIndex: number;
|
|
25
|
-
};
|
|
26
|
-
declare enum StackingComputeMode {
|
|
27
|
-
/** 层叠计算模式 */
|
|
28
|
-
Stacking = "stacking",
|
|
29
|
-
/** 层级计算模式 */
|
|
30
|
-
Layers = "layers"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
declare const createFreeStackPlugin: _flowgram_ai_core.PluginCreator<{
|
|
34
|
-
mode?: StackingComputeMode | undefined;
|
|
35
|
-
}>;
|
|
5
|
+
declare const createFreeStackPlugin: _flowgram_ai_core.PluginCreator<unknown>;
|
|
36
6
|
|
|
37
7
|
declare class StackingContextManager {
|
|
38
8
|
private readonly document;
|
|
@@ -43,9 +13,8 @@ declare class StackingContextManager {
|
|
|
43
13
|
private readonly selectService;
|
|
44
14
|
readonly node: HTMLDivElement;
|
|
45
15
|
private disposers;
|
|
46
|
-
private mode;
|
|
47
16
|
constructor();
|
|
48
|
-
init(
|
|
17
|
+
init(): void;
|
|
49
18
|
ready(): void;
|
|
50
19
|
dispose(): void;
|
|
51
20
|
/**
|
|
@@ -54,7 +23,6 @@ declare class StackingContextManager {
|
|
|
54
23
|
*/
|
|
55
24
|
private compute;
|
|
56
25
|
private _compute;
|
|
57
|
-
private stackingCompute;
|
|
58
26
|
private get nodes();
|
|
59
27
|
private get lines();
|
|
60
28
|
private get context();
|
|
@@ -65,8 +33,30 @@ declare class StackingContextManager {
|
|
|
65
33
|
private onSelect;
|
|
66
34
|
}
|
|
67
35
|
|
|
36
|
+
declare enum StackingItem {
|
|
37
|
+
Line = "line",
|
|
38
|
+
Node = "node"
|
|
39
|
+
}
|
|
40
|
+
declare enum StackingType {
|
|
41
|
+
Line = "line",
|
|
42
|
+
Node = "node"
|
|
43
|
+
}
|
|
44
|
+
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
45
|
+
declare const StackingConfig: {
|
|
46
|
+
/** index 起始值 */
|
|
47
|
+
startIndex: number;
|
|
48
|
+
/** 允许存在的层级 */
|
|
49
|
+
allowLevel: number;
|
|
50
|
+
/** 每层 index 跨度 */
|
|
51
|
+
levelIndexStep: number;
|
|
52
|
+
/** 叠加计算后出现的最深层级 */
|
|
53
|
+
maxLevel: number;
|
|
54
|
+
/** 最大 index */
|
|
55
|
+
maxIndex: number;
|
|
56
|
+
};
|
|
57
|
+
|
|
68
58
|
type StackingContext = {
|
|
69
|
-
hoveredEntity?:
|
|
59
|
+
hoveredEntity?: WorkflowEntityHoverable;
|
|
70
60
|
hoveredEntityID?: string;
|
|
71
61
|
selectedEntities: Entity[];
|
|
72
62
|
selectedIDs: string[];
|
|
@@ -104,8 +94,11 @@ declare class StackingComputing {
|
|
|
104
94
|
private computeNodeIndexesMap;
|
|
105
95
|
private computeTopLevel;
|
|
106
96
|
private layerHandler;
|
|
97
|
+
private sortNodes;
|
|
98
|
+
private getNodesAllLines;
|
|
99
|
+
private isHigherFirstLine;
|
|
107
100
|
private getLevel;
|
|
108
101
|
private levelIncrease;
|
|
109
102
|
}
|
|
110
103
|
|
|
111
|
-
export { StackingBaseIndex,
|
|
104
|
+
export { StackingBaseIndex, StackingComputing, StackingConfig, type StackingContext, StackingContextManager, StackingItem, StackingType, createFreeStackPlugin, layersComputing };
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,6 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
29
29
|
var src_exports = {};
|
|
30
30
|
__export(src_exports, {
|
|
31
31
|
StackingBaseIndex: () => StackingBaseIndex,
|
|
32
|
-
StackingComputeMode: () => StackingComputeMode,
|
|
33
32
|
StackingComputing: () => StackingComputing,
|
|
34
33
|
StackingConfig: () => StackingConfig,
|
|
35
34
|
StackingContextManager: () => StackingContextManager,
|
|
@@ -50,12 +49,12 @@ var import_utils = require("@flowgram.ai/utils");
|
|
|
50
49
|
var import_free_layout_core2 = require("@flowgram.ai/free-layout-core");
|
|
51
50
|
var import_free_layout_core3 = require("@flowgram.ai/free-layout-core");
|
|
52
51
|
var import_free_layout_core4 = require("@flowgram.ai/free-layout-core");
|
|
53
|
-
var
|
|
52
|
+
var import_document2 = require("@flowgram.ai/document");
|
|
54
53
|
var import_core = require("@flowgram.ai/core");
|
|
55
54
|
|
|
56
55
|
// src/stacking-computing.ts
|
|
57
|
-
var import_document = require("@flowgram.ai/document");
|
|
58
56
|
var import_free_layout_core = require("@flowgram.ai/free-layout-core");
|
|
57
|
+
var import_document = require("@flowgram.ai/document");
|
|
59
58
|
var StackingComputing = class {
|
|
60
59
|
compute(params) {
|
|
61
60
|
this.clearCache();
|
|
@@ -64,7 +63,7 @@ var StackingComputing = class {
|
|
|
64
63
|
this.nodeIndexes = this.computeNodeIndexesMap(nodes);
|
|
65
64
|
this.topLevel = this.computeTopLevel(nodes);
|
|
66
65
|
this.maxLevel = this.topLevel * 2;
|
|
67
|
-
this.layerHandler(root.
|
|
66
|
+
this.layerHandler(root.blocks);
|
|
68
67
|
return {
|
|
69
68
|
nodeLevel: this.nodeLevel,
|
|
70
69
|
lineLevel: this.lineLevel,
|
|
@@ -90,7 +89,7 @@ var StackingComputing = class {
|
|
|
90
89
|
computeTopLevel(nodes) {
|
|
91
90
|
const nodesWithoutRoot = nodes.filter((node) => node.id !== import_document.FlowNodeBaseType.ROOT);
|
|
92
91
|
const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {
|
|
93
|
-
if (node.
|
|
92
|
+
if (node.blocks.length > 0) {
|
|
94
93
|
return count + 1;
|
|
95
94
|
} else {
|
|
96
95
|
return count;
|
|
@@ -98,21 +97,9 @@ var StackingComputing = class {
|
|
|
98
97
|
}, 0);
|
|
99
98
|
return nodesWithoutRoot.length + nodeHasChildren + 1;
|
|
100
99
|
}
|
|
101
|
-
layerHandler(
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
const bIndex = this.nodeIndexes.get(b.id);
|
|
105
|
-
if (aIndex === void 0 || bIndex === void 0) {
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
return aIndex - bIndex;
|
|
109
|
-
});
|
|
110
|
-
const lines = nodes.map((node) => {
|
|
111
|
-
const linesData = node.getData(import_free_layout_core.WorkflowNodeLinesData);
|
|
112
|
-
const outputLines = linesData.outputLines.filter(Boolean);
|
|
113
|
-
const inputLines = linesData.inputLines.filter(Boolean);
|
|
114
|
-
return [...outputLines, ...inputLines];
|
|
115
|
-
}).flat();
|
|
100
|
+
layerHandler(layerNodes, pinTop = false) {
|
|
101
|
+
const nodes = this.sortNodes(layerNodes);
|
|
102
|
+
const lines = this.getNodesAllLines(nodes);
|
|
116
103
|
lines.forEach((line) => {
|
|
117
104
|
if (line.isDrawing || // 正在绘制
|
|
118
105
|
this.context.hoveredEntityID === line.id || // hover
|
|
@@ -123,7 +110,7 @@ var StackingComputing = class {
|
|
|
123
110
|
}
|
|
124
111
|
});
|
|
125
112
|
this.levelIncrease();
|
|
126
|
-
|
|
113
|
+
nodes.forEach((node) => {
|
|
127
114
|
const selected = this.context.selectedIDs.includes(node.id);
|
|
128
115
|
if (selected) {
|
|
129
116
|
this.nodeLevel.set(node.id, this.topLevel);
|
|
@@ -131,11 +118,36 @@ var StackingComputing = class {
|
|
|
131
118
|
this.nodeLevel.set(node.id, this.getLevel(pinTop));
|
|
132
119
|
}
|
|
133
120
|
this.levelIncrease();
|
|
134
|
-
if (node.
|
|
135
|
-
this.layerHandler(node.
|
|
121
|
+
if (node.blocks.length > 0) {
|
|
122
|
+
this.layerHandler(node.blocks, pinTop || selected);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
sortNodes(nodes) {
|
|
127
|
+
return nodes.sort((a, b) => {
|
|
128
|
+
const aIndex = this.nodeIndexes.get(a.id);
|
|
129
|
+
const bIndex = this.nodeIndexes.get(b.id);
|
|
130
|
+
if (aIndex === void 0 || bIndex === void 0) {
|
|
131
|
+
return 0;
|
|
136
132
|
}
|
|
133
|
+
return aIndex - bIndex;
|
|
137
134
|
});
|
|
138
135
|
}
|
|
136
|
+
getNodesAllLines(nodes) {
|
|
137
|
+
const lines = nodes.map((node) => {
|
|
138
|
+
const linesData = node.getData(import_free_layout_core.WorkflowNodeLinesData);
|
|
139
|
+
const outputLines = linesData.outputLines.filter(Boolean);
|
|
140
|
+
const inputLines = linesData.inputLines.filter(Boolean);
|
|
141
|
+
return [...outputLines, ...inputLines];
|
|
142
|
+
}).flat();
|
|
143
|
+
const filteredLines = lines.filter(
|
|
144
|
+
(line) => this.lineLevel.get(line.id) === void 0 || this.isHigherFirstLine(line)
|
|
145
|
+
);
|
|
146
|
+
return filteredLines;
|
|
147
|
+
}
|
|
148
|
+
isHigherFirstLine(line) {
|
|
149
|
+
return line.to?.parent === line.from || line.from?.parent === line.to;
|
|
150
|
+
}
|
|
139
151
|
getLevel(pinTop) {
|
|
140
152
|
if (pinTop) {
|
|
141
153
|
return this.topLevel + this.currentLevel;
|
|
@@ -147,9 +159,6 @@ var StackingComputing = class {
|
|
|
147
159
|
}
|
|
148
160
|
};
|
|
149
161
|
|
|
150
|
-
// src/layers-computing.ts
|
|
151
|
-
var import_document2 = require("@flowgram.ai/document");
|
|
152
|
-
|
|
153
162
|
// src/constant.ts
|
|
154
163
|
var StackingItem = /* @__PURE__ */ ((StackingItem2) => {
|
|
155
164
|
StackingItem2["Line"] = "line";
|
|
@@ -182,103 +191,6 @@ var StackingConfig = {
|
|
|
182
191
|
/** 最大 index */
|
|
183
192
|
maxIndex
|
|
184
193
|
};
|
|
185
|
-
var StackingComputeMode = /* @__PURE__ */ ((StackingComputeMode2) => {
|
|
186
|
-
StackingComputeMode2["Stacking"] = "stacking";
|
|
187
|
-
StackingComputeMode2["Layers"] = "layers";
|
|
188
|
-
return StackingComputeMode2;
|
|
189
|
-
})(StackingComputeMode || {});
|
|
190
|
-
|
|
191
|
-
// src/layers-computing.ts
|
|
192
|
-
var NodeComputing;
|
|
193
|
-
((NodeComputing2) => {
|
|
194
|
-
NodeComputing2.compute = (node, context) => {
|
|
195
|
-
const zIndex = nodeZIndex(node, context);
|
|
196
|
-
const element = nodeElement(node);
|
|
197
|
-
element.style.position = "absolute";
|
|
198
|
-
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
199
|
-
};
|
|
200
|
-
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
201
|
-
if (level < 1) {
|
|
202
|
-
return void 0;
|
|
203
|
-
}
|
|
204
|
-
const baseZIndex = StackingBaseIndex[stackingType];
|
|
205
|
-
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
206
|
-
return zIndex;
|
|
207
|
-
};
|
|
208
|
-
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
209
|
-
const unReversedLinage = [];
|
|
210
|
-
let currentNode = node;
|
|
211
|
-
while (currentNode) {
|
|
212
|
-
unReversedLinage.push(currentNode);
|
|
213
|
-
currentNode = currentNode.parent;
|
|
214
|
-
}
|
|
215
|
-
const linage = unReversedLinage.reverse();
|
|
216
|
-
const nodeLevel = linage.length - 1;
|
|
217
|
-
const topLevelIndex = linage.findIndex((node2) => {
|
|
218
|
-
if (context.selectedIDs.includes(node2.id)) {
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
return false;
|
|
222
|
-
});
|
|
223
|
-
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
224
|
-
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
225
|
-
return topLevel;
|
|
226
|
-
}
|
|
227
|
-
return nodeLevel;
|
|
228
|
-
};
|
|
229
|
-
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
230
|
-
if (zIndex === void 0) {
|
|
231
|
-
return "auto";
|
|
232
|
-
}
|
|
233
|
-
return zIndex.toString();
|
|
234
|
-
};
|
|
235
|
-
const nodeZIndex = (node, context) => {
|
|
236
|
-
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
237
|
-
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
238
|
-
return zIndex;
|
|
239
|
-
};
|
|
240
|
-
const nodeElement = (node) => {
|
|
241
|
-
const nodeRenderData = node.getData(import_document2.FlowNodeRenderData);
|
|
242
|
-
return nodeRenderData.node;
|
|
243
|
-
};
|
|
244
|
-
})(NodeComputing || (NodeComputing = {}));
|
|
245
|
-
var LineComputing;
|
|
246
|
-
((LineComputing2) => {
|
|
247
|
-
LineComputing2.compute = (line, context) => {
|
|
248
|
-
const zIndex = lineZIndex(line, context);
|
|
249
|
-
const element = line.node;
|
|
250
|
-
element.style.position = "absolute";
|
|
251
|
-
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
252
|
-
};
|
|
253
|
-
const lineStackingLevel = (line, context) => {
|
|
254
|
-
if (line.isDrawing || // 正在绘制
|
|
255
|
-
context.hoveredEntityID === line.id || // hover
|
|
256
|
-
context.selectedIDs.includes(line.id)) {
|
|
257
|
-
return StackingConfig.maxLevel + 1;
|
|
258
|
-
}
|
|
259
|
-
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
260
|
-
if (!line.to) {
|
|
261
|
-
return fromLevel;
|
|
262
|
-
}
|
|
263
|
-
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
264
|
-
const level = Math.min(fromLevel, toLevel);
|
|
265
|
-
return level;
|
|
266
|
-
};
|
|
267
|
-
const lineZIndex = (line, context) => {
|
|
268
|
-
const level = lineStackingLevel(line, context);
|
|
269
|
-
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
270
|
-
return zIndex;
|
|
271
|
-
};
|
|
272
|
-
})(LineComputing || (LineComputing = {}));
|
|
273
|
-
var layersComputing = (params) => {
|
|
274
|
-
const { nodes, lines, context } = params;
|
|
275
|
-
nodes.forEach((node) => {
|
|
276
|
-
NodeComputing.compute(node, context);
|
|
277
|
-
});
|
|
278
|
-
lines.forEach((line) => {
|
|
279
|
-
LineComputing.compute(line, context);
|
|
280
|
-
});
|
|
281
|
-
};
|
|
282
194
|
|
|
283
195
|
// src/manager.ts
|
|
284
196
|
var StackingContextManager = class {
|
|
@@ -287,15 +199,13 @@ var StackingContextManager = class {
|
|
|
287
199
|
"gedit-playground-layer gedit-flow-render-layer"
|
|
288
200
|
);
|
|
289
201
|
this.disposers = [];
|
|
290
|
-
this.mode = "stacking" /* Stacking */;
|
|
291
202
|
/**
|
|
292
203
|
* 触发计算
|
|
293
204
|
* 10ms内仅计算一次
|
|
294
205
|
*/
|
|
295
206
|
this.compute = (0, import_lodash.debounce)(this._compute, 10);
|
|
296
207
|
}
|
|
297
|
-
init(
|
|
298
|
-
if (mode) this.mode = mode;
|
|
208
|
+
init() {
|
|
299
209
|
this.pipelineRenderer.node.appendChild(this.node);
|
|
300
210
|
this.mountListener();
|
|
301
211
|
}
|
|
@@ -306,17 +216,6 @@ var StackingContextManager = class {
|
|
|
306
216
|
this.disposers.forEach((disposer) => disposer.dispose());
|
|
307
217
|
}
|
|
308
218
|
_compute() {
|
|
309
|
-
if (this.mode === "stacking" /* Stacking */) {
|
|
310
|
-
return this.stackingCompute();
|
|
311
|
-
} else {
|
|
312
|
-
return layersComputing({
|
|
313
|
-
nodes: this.nodes,
|
|
314
|
-
lines: this.lines,
|
|
315
|
-
context: this.context
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
stackingCompute() {
|
|
320
219
|
const context = this.context;
|
|
321
220
|
const stackingComputing = new StackingComputing();
|
|
322
221
|
const { nodeLevel, lineLevel } = stackingComputing.compute({
|
|
@@ -326,10 +225,10 @@ var StackingContextManager = class {
|
|
|
326
225
|
});
|
|
327
226
|
this.nodes.forEach((node) => {
|
|
328
227
|
const level = nodeLevel.get(node.id);
|
|
329
|
-
const nodeRenderData = node.getData(
|
|
228
|
+
const nodeRenderData = node.getData(import_document2.FlowNodeRenderData);
|
|
330
229
|
const element = nodeRenderData.node;
|
|
331
230
|
element.style.position = "absolute";
|
|
332
|
-
if (
|
|
231
|
+
if (level === void 0) {
|
|
333
232
|
element.style.zIndex = "auto";
|
|
334
233
|
nodeRenderData.stackIndex = 0;
|
|
335
234
|
return;
|
|
@@ -342,7 +241,7 @@ var StackingContextManager = class {
|
|
|
342
241
|
const level = lineLevel.get(line.id);
|
|
343
242
|
const element = line.node;
|
|
344
243
|
element.style.position = "absolute";
|
|
345
|
-
if (
|
|
244
|
+
if (level === void 0) {
|
|
346
245
|
element.style.zIndex = "auto";
|
|
347
246
|
return;
|
|
348
247
|
}
|
|
@@ -418,9 +317,9 @@ var createFreeStackPlugin = (0, import_core2.definePluginCreator)({
|
|
|
418
317
|
onBind({ bind }) {
|
|
419
318
|
bind(StackingContextManager).toSelf().inSingletonScope();
|
|
420
319
|
},
|
|
421
|
-
onInit(ctx
|
|
320
|
+
onInit(ctx) {
|
|
422
321
|
const stackingContextManager = ctx.get(StackingContextManager);
|
|
423
|
-
stackingContextManager.init(
|
|
322
|
+
stackingContextManager.init();
|
|
424
323
|
},
|
|
425
324
|
onReady(ctx) {
|
|
426
325
|
const stackingContextManager = ctx.get(StackingContextManager);
|
|
@@ -431,10 +330,102 @@ var createFreeStackPlugin = (0, import_core2.definePluginCreator)({
|
|
|
431
330
|
stackingContextManager.dispose();
|
|
432
331
|
}
|
|
433
332
|
});
|
|
333
|
+
|
|
334
|
+
// src/layers-computing.ts
|
|
335
|
+
var import_document3 = require("@flowgram.ai/document");
|
|
336
|
+
var NodeComputing;
|
|
337
|
+
((NodeComputing2) => {
|
|
338
|
+
NodeComputing2.compute = (node, context) => {
|
|
339
|
+
const zIndex = nodeZIndex(node, context);
|
|
340
|
+
const element = nodeElement(node);
|
|
341
|
+
element.style.position = "absolute";
|
|
342
|
+
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
343
|
+
};
|
|
344
|
+
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
345
|
+
if (level < 1) {
|
|
346
|
+
return void 0;
|
|
347
|
+
}
|
|
348
|
+
const baseZIndex = StackingBaseIndex[stackingType];
|
|
349
|
+
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
350
|
+
return zIndex;
|
|
351
|
+
};
|
|
352
|
+
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
353
|
+
const unReversedLinage = [];
|
|
354
|
+
let currentNode = node;
|
|
355
|
+
while (currentNode) {
|
|
356
|
+
unReversedLinage.push(currentNode);
|
|
357
|
+
currentNode = currentNode.parent;
|
|
358
|
+
}
|
|
359
|
+
const linage = unReversedLinage.reverse();
|
|
360
|
+
const nodeLevel = linage.length - 1;
|
|
361
|
+
const topLevelIndex = linage.findIndex((node2) => {
|
|
362
|
+
if (context.selectedIDs.includes(node2.id)) {
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
return false;
|
|
366
|
+
});
|
|
367
|
+
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
368
|
+
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
369
|
+
return topLevel;
|
|
370
|
+
}
|
|
371
|
+
return nodeLevel;
|
|
372
|
+
};
|
|
373
|
+
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
374
|
+
if (zIndex === void 0) {
|
|
375
|
+
return "auto";
|
|
376
|
+
}
|
|
377
|
+
return zIndex.toString();
|
|
378
|
+
};
|
|
379
|
+
const nodeZIndex = (node, context) => {
|
|
380
|
+
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
381
|
+
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
382
|
+
return zIndex;
|
|
383
|
+
};
|
|
384
|
+
const nodeElement = (node) => {
|
|
385
|
+
const nodeRenderData = node.getData(import_document3.FlowNodeRenderData);
|
|
386
|
+
return nodeRenderData.node;
|
|
387
|
+
};
|
|
388
|
+
})(NodeComputing || (NodeComputing = {}));
|
|
389
|
+
var LineComputing;
|
|
390
|
+
((LineComputing2) => {
|
|
391
|
+
LineComputing2.compute = (line, context) => {
|
|
392
|
+
const zIndex = lineZIndex(line, context);
|
|
393
|
+
const element = line.node;
|
|
394
|
+
element.style.position = "absolute";
|
|
395
|
+
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
396
|
+
};
|
|
397
|
+
const lineStackingLevel = (line, context) => {
|
|
398
|
+
if (line.isDrawing || // 正在绘制
|
|
399
|
+
context.hoveredEntityID === line.id || // hover
|
|
400
|
+
context.selectedIDs.includes(line.id)) {
|
|
401
|
+
return StackingConfig.maxLevel + 1;
|
|
402
|
+
}
|
|
403
|
+
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
404
|
+
if (!line.to) {
|
|
405
|
+
return fromLevel;
|
|
406
|
+
}
|
|
407
|
+
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
408
|
+
const level = Math.min(fromLevel, toLevel);
|
|
409
|
+
return level;
|
|
410
|
+
};
|
|
411
|
+
const lineZIndex = (line, context) => {
|
|
412
|
+
const level = lineStackingLevel(line, context);
|
|
413
|
+
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
414
|
+
return zIndex;
|
|
415
|
+
};
|
|
416
|
+
})(LineComputing || (LineComputing = {}));
|
|
417
|
+
var layersComputing = (params) => {
|
|
418
|
+
const { nodes, lines, context } = params;
|
|
419
|
+
nodes.forEach((node) => {
|
|
420
|
+
NodeComputing.compute(node, context);
|
|
421
|
+
});
|
|
422
|
+
lines.forEach((line) => {
|
|
423
|
+
LineComputing.compute(line, context);
|
|
424
|
+
});
|
|
425
|
+
};
|
|
434
426
|
// Annotate the CommonJS export names for ESM import in node:
|
|
435
427
|
0 && (module.exports = {
|
|
436
428
|
StackingBaseIndex,
|
|
437
|
-
StackingComputeMode,
|
|
438
429
|
StackingComputing,
|
|
439
430
|
StackingConfig,
|
|
440
431
|
StackingContextManager,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-free-stack-plugin.ts","../src/manager.ts","../src/stacking-computing.ts","../src/layers-computing.ts","../src/constant.ts"],"sourcesContent":["export * from './create-free-stack-plugin';\nexport * from './manager';\nexport * from './constant';\nexport * from './layers-computing';\nexport * from './stacking-computing';\nexport * from './type';\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { StackingContextManager } from './manager';\nimport { StackingComputeMode } from './constant';\n\nexport const createFreeStackPlugin = definePluginCreator<{\n mode?: StackingComputeMode;\n}>({\n onBind({ bind }) {\n bind(StackingContextManager).toSelf().inSingletonScope();\n },\n onInit(ctx, opts) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.init(opts?.mode);\n },\n onReady(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.ready();\n },\n onDispose(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.dispose();\n },\n});\n","import { debounce } from 'lodash';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Disposable } from '@flowgram.ai/utils';\nimport {\n WorkflowHoverService,\n WorkflowNodeEntity,\n WorkflowSelectService,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\nimport { EntityManager, PipelineRegistry, PipelineRenderer } from '@flowgram.ai/core';\n\nimport type { StackingContext } from './type';\nimport { StackingComputing } from './stacking-computing';\nimport { layersComputing } from './layers-computing';\nimport { StackingComputeMode, StackingConfig } from './constant';\n\n@injectable()\nexport class StackingContextManager {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(PipelineRenderer)\n private readonly pipelineRenderer: PipelineRenderer;\n\n @inject(PipelineRegistry)\n private readonly pipelineRegistry: PipelineRegistry;\n\n @inject(WorkflowHoverService)\n private readonly hoverService: WorkflowHoverService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n public readonly node = domUtils.createDivWithClass(\n 'gedit-playground-layer gedit-flow-render-layer'\n );\n\n private disposers: Disposable[] = [];\n\n private mode: StackingComputeMode = StackingComputeMode.Stacking;\n\n constructor() {}\n\n public init(mode?: StackingComputeMode): void {\n if (mode) this.mode = mode;\n this.pipelineRenderer.node.appendChild(this.node);\n this.mountListener();\n }\n\n public ready(): void {\n this.compute();\n }\n\n public dispose(): void {\n this.disposers.forEach((disposer) => disposer.dispose());\n }\n\n /**\n * 触发计算\n * 10ms内仅计算一次\n */\n private compute = debounce(this._compute, 10);\n\n private _compute(): void {\n if (this.mode === StackingComputeMode.Stacking) {\n return this.stackingCompute();\n } else {\n return layersComputing({\n nodes: this.nodes,\n lines: this.lines,\n context: this.context,\n });\n }\n }\n\n private stackingCompute(): void {\n const context = this.context;\n const stackingComputing = new StackingComputing();\n const { nodeLevel, lineLevel } = stackingComputing.compute({\n root: this.document.root,\n nodes: this.nodes,\n context,\n });\n this.nodes.forEach((node) => {\n const level = nodeLevel.get(node.id);\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n const element = nodeRenderData.node;\n element.style.position = 'absolute';\n if (!level) {\n element.style.zIndex = 'auto';\n nodeRenderData.stackIndex = 0;\n return;\n }\n const stackIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(stackIndex);\n nodeRenderData.stackIndex = stackIndex;\n });\n this.lines.forEach((line) => {\n const level = lineLevel.get(line.id);\n const element = line.node;\n element.style.position = 'absolute';\n if (!level) {\n element.style.zIndex = 'auto';\n return;\n }\n element.style.zIndex = String(StackingConfig.startIndex + level);\n });\n }\n\n private get nodes(): WorkflowNodeEntity[] {\n return this.entityManager.getEntities<WorkflowNodeEntity>(WorkflowNodeEntity);\n }\n\n private get lines(): WorkflowLineEntity[] {\n return this.entityManager.getEntities<WorkflowLineEntity>(WorkflowLineEntity);\n }\n\n private get context(): StackingContext {\n return {\n hoveredEntity: this.hoverService.hoveredNode,\n hoveredEntityID: this.hoverService.hoveredNode?.id,\n selectedEntities: this.selectService.selection,\n selectedIDs: this.selectService.selection.map((entity) => entity.id),\n };\n }\n\n private mountListener(): void {\n const entityChangeDisposer = this.onEntityChange();\n const zoomDisposer = this.onZoom();\n const hoverDisposer = this.onHover();\n const selectDisposer = this.onSelect();\n this.disposers = [entityChangeDisposer, zoomDisposer, hoverDisposer, selectDisposer];\n }\n\n private onZoom(): Disposable {\n return this.pipelineRegistry.onZoom((scale: number) => {\n this.node.style.transform = `scale(${scale})`;\n });\n }\n\n private onHover(): Disposable {\n return this.hoverService.onHoveredChange(() => {\n this.compute();\n });\n }\n\n private onEntityChange(): Disposable {\n return this.entityManager.onEntityChange(() => {\n this.compute();\n });\n }\n\n private onSelect(): Disposable {\n return this.selectService.onSelectionChanged(() => {\n this.compute();\n });\n }\n}\n","import { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { WorkflowNodeEntity, WorkflowNodeLinesData } from '@flowgram.ai/free-layout-core';\n\nimport type { StackingContext } from './type';\n\nexport class StackingComputing {\n private currentLevel: number;\n\n private topLevel: number;\n\n private maxLevel: number;\n\n private nodeIndexes: Map<string, number>;\n\n private nodeLevel: Map<string, number>;\n\n private lineLevel: Map<string, number>;\n\n private context: StackingContext;\n\n public compute(params: {\n root: WorkflowNodeEntity;\n nodes: WorkflowNodeEntity[];\n context: StackingContext;\n }): {\n /** 节点层级 */\n nodeLevel: Map<string, number>;\n /** 线条层级 */\n lineLevel: Map<string, number>;\n /** 正常渲染的最高层级 */\n topLevel: number;\n /** 选中计算叠加后可能计算出的最高层级 */\n maxLevel: number;\n } {\n this.clearCache();\n const { root, nodes, context } = params;\n this.context = context;\n this.nodeIndexes = this.computeNodeIndexesMap(nodes);\n this.topLevel = this.computeTopLevel(nodes);\n this.maxLevel = this.topLevel * 2;\n this.layerHandler(root.collapsedChildren);\n return {\n nodeLevel: this.nodeLevel,\n lineLevel: this.lineLevel,\n topLevel: this.topLevel,\n maxLevel: this.maxLevel,\n };\n }\n\n private clearCache(): void {\n this.currentLevel = 0;\n this.topLevel = 0;\n this.maxLevel = 0;\n this.nodeIndexes = new Map();\n this.nodeLevel = new Map();\n this.lineLevel = new Map();\n }\n\n private computeNodeIndexesMap(nodes: WorkflowNodeEntity[]): Map<string, number> {\n const nodeIndexMap = new Map<string, number>();\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n return nodeIndexMap;\n }\n\n private computeTopLevel(nodes: WorkflowNodeEntity[]): number {\n const nodesWithoutRoot = nodes.filter(node => node.id !== FlowNodeBaseType.ROOT);\n const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {\n if (node.collapsedChildren.length > 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n // 最高层数 = 节点个数 + 容器节点个数(线条单独占一层) + 抬高一层\n return nodesWithoutRoot.length + nodeHasChildren + 1;\n }\n\n private layerHandler(nodes: WorkflowNodeEntity[], pinTop: boolean = false): void {\n const sortedNodes = nodes.sort((a, b) => {\n const aIndex = this.nodeIndexes.get(a.id);\n const bIndex = this.nodeIndexes.get(b.id);\n if (aIndex === undefined || bIndex === undefined) {\n return 0;\n }\n return aIndex - bIndex;\n });\n\n const lines = nodes\n .map(node => {\n const linesData = node.getData<WorkflowNodeLinesData>(WorkflowNodeLinesData);\n const outputLines = linesData.outputLines.filter(Boolean);\n const inputLines = linesData.inputLines.filter(Boolean);\n // 前后线条会有重复,下面 Map 会通过线条 ID 过滤掉\n return [...outputLines, ...inputLines];\n })\n .flat();\n\n // 线条统一设为当前层级最低\n lines.forEach(line => {\n if (\n line.isDrawing || // 正在绘制\n this.context.hoveredEntityID === line.id || // hover\n this.context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n this.lineLevel.set(line.id, this.maxLevel);\n } else {\n this.lineLevel.set(line.id, this.getLevel(pinTop));\n }\n });\n this.levelIncrease();\n sortedNodes.forEach(node => {\n const selected = this.context.selectedIDs.includes(node.id);\n if (selected) {\n // 节点置顶条件:选中\n this.nodeLevel.set(node.id, this.topLevel);\n } else {\n this.nodeLevel.set(node.id, this.getLevel(pinTop));\n }\n // 节点层级逐层增高\n this.levelIncrease();\n if (node.collapsedChildren.length > 0) {\n // 子节点层级需低于后续兄弟节点,因此需要先进行计算\n this.layerHandler(node.collapsedChildren, pinTop || selected);\n }\n });\n }\n\n private getLevel(pinTop: boolean): number {\n if (pinTop) {\n return this.topLevel + this.currentLevel;\n }\n return this.currentLevel;\n }\n\n private levelIncrease(): void {\n this.currentLevel += 1;\n }\n}\n","import { FlowNodeRenderData } from '@flowgram.ai/document';\nimport type { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';\nimport type { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\n\nimport type { StackingContext } from './type';\nimport { StackingBaseIndex, StackingConfig, StackingType } from './constant';\n\nnamespace NodeComputing {\n export const compute = (node: WorkflowNodeEntity, context: StackingContext): void => {\n const zIndex = nodeZIndex(node, context);\n const element = nodeElement(node);\n element.style.position = 'absolute';\n element.style.zIndex = zIndexStringify(zIndex);\n };\n\n export const stackingIndex = (stackingType: StackingType, level: number): number | undefined => {\n if (level < 1) {\n // root节点\n return undefined;\n }\n const baseZIndex = StackingBaseIndex[stackingType];\n const zIndex =\n StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;\n return zIndex;\n };\n\n export const nodeStackingLevel = (\n node: WorkflowNodeEntity,\n context: StackingContext,\n disableTopLevel = false,\n ): number => {\n // TODO 后续支持多层级时这个计算逻辑应该去掉,level信息应该直接由 FlowNodeEntity 缓存给出\n // 多层时这里的计算会有 O(logN) 时间复杂度,并且在多层级联同计算时会有BUG,本次需求不处理这种情况\n const unReversedLinage: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode) {\n unReversedLinage.push(currentNode);\n currentNode = currentNode.parent;\n }\n const linage = unReversedLinage.reverse();\n const nodeLevel = linage.length - 1;\n\n const topLevelIndex = linage.findIndex((node: WorkflowNodeEntity) => {\n if (context.selectedIDs.includes(node.id)) {\n // 存在被选中的父级或自身被选中,直接置顶\n return true;\n }\n return false;\n });\n const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);\n\n if (!disableTopLevel && topLevelIndex !== -1) {\n // 置顶\n return topLevel;\n }\n\n return nodeLevel;\n };\n\n export const zIndexStringify = (zIndex?: number): string => {\n if (zIndex === undefined) {\n return 'auto';\n }\n return zIndex.toString();\n };\n\n const nodeZIndex = (node: WorkflowNodeEntity, context: StackingContext): number | undefined => {\n const level = nodeStackingLevel(node, context);\n const zIndex = stackingIndex(StackingType.Node, level);\n return zIndex;\n };\n\n const nodeElement = (node: WorkflowNodeEntity): HTMLDivElement => {\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return nodeRenderData.node;\n };\n}\n\nnamespace LineComputing {\n export const compute = (line: WorkflowLineEntity, context: StackingContext): void => {\n const zIndex = lineZIndex(line, context);\n const element = line.node;\n element.style.position = 'absolute';\n element.style.zIndex = NodeComputing.zIndexStringify(zIndex);\n };\n\n const lineStackingLevel = (line: WorkflowLineEntity, context: StackingContext): number => {\n if (\n line.isDrawing || // 正在绘制\n context.hoveredEntityID === line.id || // hover\n context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n return StackingConfig.maxLevel + 1;\n }\n const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);\n if (!line.to) {\n // 还处于连线中\n return fromLevel;\n }\n const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);\n const level = Math.min(fromLevel, toLevel);\n return level;\n };\n\n const lineZIndex = (line: WorkflowLineEntity, context: StackingContext): number | undefined => {\n const level = lineStackingLevel(line, context);\n const zIndex = NodeComputing.stackingIndex(StackingType.Line, level);\n return zIndex;\n };\n}\n\nexport const layersComputing = (params: {\n nodes: WorkflowNodeEntity[];\n lines: WorkflowLineEntity[];\n context: StackingContext;\n}) => {\n const { nodes, lines, context } = params;\n nodes.forEach(node => {\n NodeComputing.compute(node, context);\n });\n lines.forEach(line => {\n LineComputing.compute(line, context);\n });\n};\n","export enum StackingItem {\n Line = 'line',\n Node = 'node',\n}\n\nexport enum StackingType {\n Line = StackingItem.Line,\n Node = StackingItem.Node,\n}\n\nexport const StackingBaseIndex: Record<StackingType, number> = {\n [StackingType.Line]: 0,\n [StackingType.Node]: 1,\n};\n\n// 常量\nconst startIndex = 8;\nconst allowLevel = 2;\n\n// 计算值\nconst levelIndexStep = Object.keys(StackingType).length;\nconst maxLevel = allowLevel * 2;\nconst maxIndex = startIndex + maxLevel * levelIndexStep;\n\nexport const StackingConfig = {\n /** index 起始值 */\n startIndex,\n /** 允许存在的层级 */\n allowLevel,\n /** 每层 index 跨度 */\n levelIndexStep,\n /** 叠加计算后出现的最深层级 */\n maxLevel,\n /** 最大 index */\n maxIndex,\n};\n\nexport enum StackingComputeMode {\n /** 层叠计算模式 */\n Stacking = 'stacking',\n /** 层级计算模式 */\n Layers = 'layers',\n}\n"],"mappings":"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","names":["import_core","import_free_layout_core","import_document","import_document","StackingItem","StackingType","StackingComputeMode","NodeComputing","node","LineComputing"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-free-stack-plugin.ts","../src/manager.ts","../src/stacking-computing.ts","../src/constant.ts","../src/layers-computing.ts"],"sourcesContent":["export * from './create-free-stack-plugin';\nexport * from './manager';\nexport * from './constant';\nexport * from './layers-computing';\nexport * from './stacking-computing';\nexport * from './type';\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { StackingContextManager } from './manager';\n\nexport const createFreeStackPlugin = definePluginCreator({\n onBind({ bind }) {\n bind(StackingContextManager).toSelf().inSingletonScope();\n },\n onInit(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.init();\n },\n onReady(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.ready();\n },\n onDispose(ctx) {\n const stackingContextManager = ctx.get<StackingContextManager>(StackingContextManager);\n stackingContextManager.dispose();\n },\n});\n","import { debounce } from 'lodash';\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Disposable } from '@flowgram.ai/utils';\nimport {\n WorkflowHoverService,\n WorkflowNodeEntity,\n WorkflowSelectService,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\nimport { EntityManager, PipelineRegistry, PipelineRenderer } from '@flowgram.ai/core';\n\nimport type { StackingContext } from './type';\nimport { StackingComputing } from './stacking-computing';\nimport { StackingConfig } from './constant';\n\n@injectable()\nexport class StackingContextManager {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(PipelineRenderer)\n private readonly pipelineRenderer: PipelineRenderer;\n\n @inject(PipelineRegistry)\n private readonly pipelineRegistry: PipelineRegistry;\n\n @inject(WorkflowHoverService)\n private readonly hoverService: WorkflowHoverService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n public readonly node = domUtils.createDivWithClass(\n 'gedit-playground-layer gedit-flow-render-layer'\n );\n\n private disposers: Disposable[] = [];\n\n constructor() {}\n\n public init(): void {\n this.pipelineRenderer.node.appendChild(this.node);\n this.mountListener();\n }\n\n public ready(): void {\n this.compute();\n }\n\n public dispose(): void {\n this.disposers.forEach((disposer) => disposer.dispose());\n }\n\n /**\n * 触发计算\n * 10ms内仅计算一次\n */\n private compute = debounce(this._compute, 10);\n\n private _compute(): void {\n const context = this.context;\n const stackingComputing = new StackingComputing();\n const { nodeLevel, lineLevel } = stackingComputing.compute({\n root: this.document.root,\n nodes: this.nodes,\n context,\n });\n this.nodes.forEach((node) => {\n const level = nodeLevel.get(node.id);\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n const element = nodeRenderData.node;\n element.style.position = 'absolute';\n if (level === undefined) {\n element.style.zIndex = 'auto';\n nodeRenderData.stackIndex = 0;\n return;\n }\n const stackIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(stackIndex);\n nodeRenderData.stackIndex = stackIndex;\n });\n this.lines.forEach((line) => {\n const level = lineLevel.get(line.id);\n const element = line.node;\n element.style.position = 'absolute';\n if (level === undefined) {\n element.style.zIndex = 'auto';\n return;\n }\n element.style.zIndex = String(StackingConfig.startIndex + level);\n });\n }\n\n private get nodes(): WorkflowNodeEntity[] {\n return this.entityManager.getEntities<WorkflowNodeEntity>(WorkflowNodeEntity);\n }\n\n private get lines(): WorkflowLineEntity[] {\n return this.entityManager.getEntities<WorkflowLineEntity>(WorkflowLineEntity);\n }\n\n private get context(): StackingContext {\n return {\n hoveredEntity: this.hoverService.hoveredNode,\n hoveredEntityID: this.hoverService.hoveredNode?.id,\n selectedEntities: this.selectService.selection,\n selectedIDs: this.selectService.selection.map((entity) => entity.id),\n };\n }\n\n private mountListener(): void {\n const entityChangeDisposer = this.onEntityChange();\n const zoomDisposer = this.onZoom();\n const hoverDisposer = this.onHover();\n const selectDisposer = this.onSelect();\n this.disposers = [entityChangeDisposer, zoomDisposer, hoverDisposer, selectDisposer];\n }\n\n private onZoom(): Disposable {\n return this.pipelineRegistry.onZoom((scale: number) => {\n this.node.style.transform = `scale(${scale})`;\n });\n }\n\n private onHover(): Disposable {\n return this.hoverService.onHoveredChange(() => {\n this.compute();\n });\n }\n\n private onEntityChange(): Disposable {\n return this.entityManager.onEntityChange(() => {\n this.compute();\n });\n }\n\n private onSelect(): Disposable {\n return this.selectService.onSelectionChanged(() => {\n this.compute();\n });\n }\n}\n","import {\n WorkflowLineEntity,\n WorkflowNodeEntity,\n WorkflowNodeLinesData,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\n\nimport type { StackingContext } from './type';\n\nexport class StackingComputing {\n private currentLevel: number;\n\n private topLevel: number;\n\n private maxLevel: number;\n\n private nodeIndexes: Map<string, number>;\n\n private nodeLevel: Map<string, number>;\n\n private lineLevel: Map<string, number>;\n\n private context: StackingContext;\n\n public compute(params: {\n root: WorkflowNodeEntity;\n nodes: WorkflowNodeEntity[];\n context: StackingContext;\n }): {\n /** 节点层级 */\n nodeLevel: Map<string, number>;\n /** 线条层级 */\n lineLevel: Map<string, number>;\n /** 正常渲染的最高层级 */\n topLevel: number;\n /** 选中计算叠加后可能计算出的最高层级 */\n maxLevel: number;\n } {\n this.clearCache();\n const { root, nodes, context } = params;\n this.context = context;\n this.nodeIndexes = this.computeNodeIndexesMap(nodes);\n this.topLevel = this.computeTopLevel(nodes);\n this.maxLevel = this.topLevel * 2;\n this.layerHandler(root.blocks);\n return {\n nodeLevel: this.nodeLevel,\n lineLevel: this.lineLevel,\n topLevel: this.topLevel,\n maxLevel: this.maxLevel,\n };\n }\n\n private clearCache(): void {\n this.currentLevel = 0;\n this.topLevel = 0;\n this.maxLevel = 0;\n this.nodeIndexes = new Map();\n this.nodeLevel = new Map();\n this.lineLevel = new Map();\n }\n\n private computeNodeIndexesMap(nodes: WorkflowNodeEntity[]): Map<string, number> {\n const nodeIndexMap = new Map<string, number>();\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n return nodeIndexMap;\n }\n\n private computeTopLevel(nodes: WorkflowNodeEntity[]): number {\n const nodesWithoutRoot = nodes.filter((node) => node.id !== FlowNodeBaseType.ROOT);\n const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {\n if (node.blocks.length > 0) {\n return count + 1;\n } else {\n return count;\n }\n }, 0);\n // 最高层数 = 节点个数 + 容器节点个数(线条单独占一层) + 抬高一层\n return nodesWithoutRoot.length + nodeHasChildren + 1;\n }\n\n private layerHandler(layerNodes: WorkflowNodeEntity[], pinTop: boolean = false): void {\n const nodes = this.sortNodes(layerNodes);\n const lines = this.getNodesAllLines(nodes);\n\n // 线条统一设为当前层级最低\n lines.forEach((line) => {\n if (\n line.isDrawing || // 正在绘制\n this.context.hoveredEntityID === line.id || // hover\n this.context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n this.lineLevel.set(line.id, this.maxLevel);\n } else {\n this.lineLevel.set(line.id, this.getLevel(pinTop));\n }\n });\n this.levelIncrease();\n nodes.forEach((node) => {\n const selected = this.context.selectedIDs.includes(node.id);\n if (selected) {\n // 节点置顶条件:选中\n this.nodeLevel.set(node.id, this.topLevel);\n } else {\n this.nodeLevel.set(node.id, this.getLevel(pinTop));\n }\n // 节点层级逐层增高\n this.levelIncrease();\n if (node.blocks.length > 0) {\n // 子节点层级需低于后续兄弟节点,因此需要先进行计算\n this.layerHandler(node.blocks, pinTop || selected);\n }\n });\n }\n\n private sortNodes(nodes: WorkflowNodeEntity[]): WorkflowNodeEntity[] {\n return nodes.sort((a, b) => {\n const aIndex = this.nodeIndexes.get(a.id);\n const bIndex = this.nodeIndexes.get(b.id);\n if (aIndex === undefined || bIndex === undefined) {\n return 0;\n }\n return aIndex - bIndex;\n });\n }\n\n private getNodesAllLines(nodes: WorkflowNodeEntity[]): WorkflowLineEntity[] {\n const lines = nodes\n .map((node) => {\n const linesData = node.getData<WorkflowNodeLinesData>(WorkflowNodeLinesData);\n const outputLines = linesData.outputLines.filter(Boolean);\n const inputLines = linesData.inputLines.filter(Boolean);\n return [...outputLines, ...inputLines];\n })\n .flat();\n\n // 过滤出未计算层级的线条,以及高度优先(需要覆盖计算)的线条\n const filteredLines = lines.filter(\n (line) => this.lineLevel.get(line.id) === undefined || this.isHigherFirstLine(line)\n );\n\n return filteredLines;\n }\n\n private isHigherFirstLine(line: WorkflowLineEntity): boolean {\n // 父子相连的线条,需要作为高度优先的线条,避免线条不可见\n return line.to?.parent === line.from || line.from?.parent === line.to;\n }\n\n private getLevel(pinTop: boolean): number {\n if (pinTop) {\n return this.topLevel + this.currentLevel;\n }\n return this.currentLevel;\n }\n\n private levelIncrease(): void {\n this.currentLevel += 1;\n }\n}\n","export enum StackingItem {\n Line = 'line',\n Node = 'node',\n}\n\nexport enum StackingType {\n Line = StackingItem.Line,\n Node = StackingItem.Node,\n}\n\nexport const StackingBaseIndex: Record<StackingType, number> = {\n [StackingType.Line]: 0,\n [StackingType.Node]: 1,\n};\n\n// 常量\nconst startIndex = 8;\nconst allowLevel = 2;\n\n// 计算值\nconst levelIndexStep = Object.keys(StackingType).length;\nconst maxLevel = allowLevel * 2;\nconst maxIndex = startIndex + maxLevel * levelIndexStep;\n\nexport const StackingConfig = {\n /** index 起始值 */\n startIndex,\n /** 允许存在的层级 */\n allowLevel,\n /** 每层 index 跨度 */\n levelIndexStep,\n /** 叠加计算后出现的最深层级 */\n maxLevel,\n /** 最大 index */\n maxIndex,\n};\n","import type { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';\nimport type { WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeRenderData } from '@flowgram.ai/document';\n\nimport type { StackingContext } from './type';\nimport { StackingBaseIndex, StackingConfig, StackingType } from './constant';\n\nnamespace NodeComputing {\n export const compute = (node: WorkflowNodeEntity, context: StackingContext): void => {\n const zIndex = nodeZIndex(node, context);\n const element = nodeElement(node);\n element.style.position = 'absolute';\n element.style.zIndex = zIndexStringify(zIndex);\n };\n\n export const stackingIndex = (stackingType: StackingType, level: number): number | undefined => {\n if (level < 1) {\n // root节点\n return undefined;\n }\n const baseZIndex = StackingBaseIndex[stackingType];\n const zIndex =\n StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;\n return zIndex;\n };\n\n export const nodeStackingLevel = (\n node: WorkflowNodeEntity,\n context: StackingContext,\n disableTopLevel = false\n ): number => {\n // TODO 后续支持多层级时这个计算逻辑应该去掉,level信息应该直接由 FlowNodeEntity 缓存给出\n // 多层时这里的计算会有 O(logN) 时间复杂度,并且在多层级联同计算时会有BUG,本次需求不处理这种情况\n const unReversedLinage: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode) {\n unReversedLinage.push(currentNode);\n currentNode = currentNode.parent;\n }\n const linage = unReversedLinage.reverse();\n const nodeLevel = linage.length - 1;\n\n const topLevelIndex = linage.findIndex((node: WorkflowNodeEntity) => {\n if (context.selectedIDs.includes(node.id)) {\n // 存在被选中的父级或自身被选中,直接置顶\n return true;\n }\n return false;\n });\n const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);\n\n if (!disableTopLevel && topLevelIndex !== -1) {\n // 置顶\n return topLevel;\n }\n\n return nodeLevel;\n };\n\n export const zIndexStringify = (zIndex?: number): string => {\n if (zIndex === undefined) {\n return 'auto';\n }\n return zIndex.toString();\n };\n\n const nodeZIndex = (node: WorkflowNodeEntity, context: StackingContext): number | undefined => {\n const level = nodeStackingLevel(node, context);\n const zIndex = stackingIndex(StackingType.Node, level);\n return zIndex;\n };\n\n const nodeElement = (node: WorkflowNodeEntity): HTMLDivElement => {\n const nodeRenderData = node.getData<FlowNodeRenderData>(FlowNodeRenderData);\n return nodeRenderData.node;\n };\n}\n\nnamespace LineComputing {\n export const compute = (line: WorkflowLineEntity, context: StackingContext): void => {\n const zIndex = lineZIndex(line, context);\n const element = line.node;\n element.style.position = 'absolute';\n element.style.zIndex = NodeComputing.zIndexStringify(zIndex);\n };\n\n const lineStackingLevel = (line: WorkflowLineEntity, context: StackingContext): number => {\n if (\n line.isDrawing || // 正在绘制\n context.hoveredEntityID === line.id || // hover\n context.selectedIDs.includes(line.id) // 选中\n ) {\n // 线条置顶条件:正在绘制 / hover / 选中\n return StackingConfig.maxLevel + 1;\n }\n const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);\n if (!line.to) {\n // 还处于连线中\n return fromLevel;\n }\n const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);\n const level = Math.min(fromLevel, toLevel);\n return level;\n };\n\n const lineZIndex = (line: WorkflowLineEntity, context: StackingContext): number | undefined => {\n const level = lineStackingLevel(line, context);\n const zIndex = NodeComputing.stackingIndex(StackingType.Line, level);\n return zIndex;\n };\n}\n\nexport const layersComputing = (params: {\n nodes: WorkflowNodeEntity[];\n lines: WorkflowLineEntity[];\n context: StackingContext;\n}) => {\n const { nodes, lines, context } = params;\n nodes.forEach((node) => {\n NodeComputing.compute(node, context);\n });\n lines.forEach((line) => {\n LineComputing.compute(line, context);\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,eAAoC;;;ACApC,oBAAyB;AACzB,uBAAmC;AACnC,mBAAyB;AAEzB,IAAAC,2BAIO;AACP,IAAAA,2BAAmC;AACnC,IAAAA,2BAAiC;AACjC,IAAAC,mBAAmC;AACnC,kBAAkE;;;ACZlE,8BAIO;AACP,sBAAiC;AAI1B,IAAM,oBAAN,MAAwB;AAAA,EAetB,QAAQ,QAab;AACA,SAAK,WAAW;AAChB,UAAM,EAAE,MAAM,OAAO,QAAQ,IAAI;AACjC,SAAK,UAAU;AACf,SAAK,cAAc,KAAK,sBAAsB,KAAK;AACnD,SAAK,WAAW,KAAK,gBAAgB,KAAK;AAC1C,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,cAAc,oBAAI,IAAI;AAC3B,SAAK,YAAY,oBAAI,IAAI;AACzB,SAAK,YAAY,oBAAI,IAAI;AAAA,EAC3B;AAAA,EAEQ,sBAAsB,OAAkD;AAC9E,UAAM,eAAe,oBAAI,IAAoB;AAC7C,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,mBAAa,IAAI,KAAK,IAAI,KAAK;AAAA,IACjC,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,OAAqC;AAC3D,UAAM,mBAAmB,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,iCAAiB,IAAI;AACjF,UAAM,kBAAkB,iBAAiB,OAAO,CAAC,OAAO,SAAS;AAC/D,UAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,eAAO,QAAQ;AAAA,MACjB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,GAAG,CAAC;AAEJ,WAAO,iBAAiB,SAAS,kBAAkB;AAAA,EACrD;AAAA,EAEQ,aAAa,YAAkC,SAAkB,OAAa;AACpF,UAAM,QAAQ,KAAK,UAAU,UAAU;AACvC,UAAM,QAAQ,KAAK,iBAAiB,KAAK;AAGzC,UAAM,QAAQ,CAAC,SAAS;AACtB,UACE,KAAK;AAAA,MACL,KAAK,QAAQ,oBAAoB,KAAK;AAAA,MACtC,KAAK,QAAQ,YAAY,SAAS,KAAK,EAAE,GACzC;AAEA,aAAK,UAAU,IAAI,KAAK,IAAI,KAAK,QAAQ;AAAA,MAC3C,OAAO;AACL,aAAK,UAAU,IAAI,KAAK,IAAI,KAAK,SAAS,MAAM,CAAC;AAAA,MACnD;AAAA,IACF,CAAC;AACD,SAAK,cAAc;AACnB,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,WAAW,KAAK,QAAQ,YAAY,SAAS,KAAK,EAAE;AAC1D,UAAI,UAAU;AAEZ,aAAK,UAAU,IAAI,KAAK,IAAI,KAAK,QAAQ;AAAA,MAC3C,OAAO;AACL,aAAK,UAAU,IAAI,KAAK,IAAI,KAAK,SAAS,MAAM,CAAC;AAAA,MACnD;AAEA,WAAK,cAAc;AACnB,UAAI,KAAK,OAAO,SAAS,GAAG;AAE1B,aAAK,aAAa,KAAK,QAAQ,UAAU,QAAQ;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,OAAmD;AACnE,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM;AAC1B,YAAM,SAAS,KAAK,YAAY,IAAI,EAAE,EAAE;AACxC,YAAM,SAAS,KAAK,YAAY,IAAI,EAAE,EAAE;AACxC,UAAI,WAAW,UAAa,WAAW,QAAW;AAChD,eAAO;AAAA,MACT;AACA,aAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,OAAmD;AAC1E,UAAM,QAAQ,MACX,IAAI,CAAC,SAAS;AACb,YAAM,YAAY,KAAK,QAA+B,6CAAqB;AAC3E,YAAM,cAAc,UAAU,YAAY,OAAO,OAAO;AACxD,YAAM,aAAa,UAAU,WAAW,OAAO,OAAO;AACtD,aAAO,CAAC,GAAG,aAAa,GAAG,UAAU;AAAA,IACvC,CAAC,EACA,KAAK;AAGR,UAAM,gBAAgB,MAAM;AAAA,MAC1B,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,EAAE,MAAM,UAAa,KAAK,kBAAkB,IAAI;AAAA,IACpF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAmC;AAE3D,WAAO,KAAK,IAAI,WAAW,KAAK,QAAQ,KAAK,MAAM,WAAW,KAAK;AAAA,EACrE;AAAA,EAEQ,SAAS,QAAyB;AACxC,QAAI,QAAQ;AACV,aAAO,KAAK,WAAW,KAAK;AAAA,IAC9B;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,gBAAsB;AAC5B,SAAK,gBAAgB;AAAA,EACvB;AACF;;;AClKO,IAAK,eAAL,kBAAKC,kBAAL;AACL,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,UAAO;AAFG,SAAAA;AAAA,GAAA;AAKL,IAAK,eAAL,kBAAKC,kBAAL;AACL,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,UAAO;AAFG,SAAAA;AAAA,GAAA;AAKL,IAAM,oBAAkD;AAAA,EAC7D,CAAC,iBAAiB,GAAG;AAAA,EACrB,CAAC,iBAAiB,GAAG;AACvB;AAGA,IAAM,aAAa;AACnB,IAAM,aAAa;AAGnB,IAAM,iBAAiB,OAAO,KAAK,YAAY,EAAE;AACjD,IAAM,WAAW,aAAa;AAC9B,IAAM,WAAW,aAAa,WAAW;AAElC,IAAM,iBAAiB;AAAA;AAAA,EAE5B;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;;;AFhBO,IAAM,yBAAN,MAA6B;AAAA,EAuBlC,cAAc;AANd,SAAgB,OAAO,sBAAS;AAAA,MAC9B;AAAA,IACF;AAEA,SAAQ,YAA0B,CAAC;AAqBnC;AAAA;AAAA;AAAA;AAAA,SAAQ,cAAU,wBAAS,KAAK,UAAU,EAAE;AAAA,EAnB7B;AAAA,EAER,OAAa;AAClB,SAAK,iBAAiB,KAAK,YAAY,KAAK,IAAI;AAChD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,QAAc;AACnB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,UAAgB;AACrB,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,QAAQ,CAAC;AAAA,EACzD;AAAA,EAQQ,WAAiB;AACvB,UAAM,UAAU,KAAK;AACrB,UAAM,oBAAoB,IAAI,kBAAkB;AAChD,UAAM,EAAE,WAAW,UAAU,IAAI,kBAAkB,QAAQ;AAAA,MACzD,MAAM,KAAK,SAAS;AAAA,MACpB,OAAO,KAAK;AAAA,MACZ;AAAA,IACF,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,YAAM,QAAQ,UAAU,IAAI,KAAK,EAAE;AACnC,YAAM,iBAAiB,KAAK,QAA4B,mCAAkB;AAC1E,YAAM,UAAU,eAAe;AAC/B,cAAQ,MAAM,WAAW;AACzB,UAAI,UAAU,QAAW;AACvB,gBAAQ,MAAM,SAAS;AACvB,uBAAe,aAAa;AAC5B;AAAA,MACF;AACA,YAAM,aAAa,eAAe,aAAa;AAC/C,cAAQ,MAAM,SAAS,OAAO,UAAU;AACxC,qBAAe,aAAa;AAAA,IAC9B,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,YAAM,QAAQ,UAAU,IAAI,KAAK,EAAE;AACnC,YAAM,UAAU,KAAK;AACrB,cAAQ,MAAM,WAAW;AACzB,UAAI,UAAU,QAAW;AACvB,gBAAQ,MAAM,SAAS;AACvB;AAAA,MACF;AACA,cAAQ,MAAM,SAAS,OAAO,eAAe,aAAa,KAAK;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,IAAY,QAA8B;AACxC,WAAO,KAAK,cAAc,YAAgC,2CAAkB;AAAA,EAC9E;AAAA,EAEA,IAAY,QAA8B;AACxC,WAAO,KAAK,cAAc,YAAgC,2CAAkB;AAAA,EAC9E;AAAA,EAEA,IAAY,UAA2B;AACrC,WAAO;AAAA,MACL,eAAe,KAAK,aAAa;AAAA,MACjC,iBAAiB,KAAK,aAAa,aAAa;AAAA,MAChD,kBAAkB,KAAK,cAAc;AAAA,MACrC,aAAa,KAAK,cAAc,UAAU,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IACrE;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,UAAM,uBAAuB,KAAK,eAAe;AACjD,UAAM,eAAe,KAAK,OAAO;AACjC,UAAM,gBAAgB,KAAK,QAAQ;AACnC,UAAM,iBAAiB,KAAK,SAAS;AACrC,SAAK,YAAY,CAAC,sBAAsB,cAAc,eAAe,cAAc;AAAA,EACrF;AAAA,EAEQ,SAAqB;AAC3B,WAAO,KAAK,iBAAiB,OAAO,CAAC,UAAkB;AACrD,WAAK,KAAK,MAAM,YAAY,SAAS,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEQ,UAAsB;AAC5B,WAAO,KAAK,aAAa,gBAAgB,MAAM;AAC7C,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,iBAA6B;AACnC,WAAO,KAAK,cAAc,eAAe,MAAM;AAC7C,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,WAAuB;AAC7B,WAAO,KAAK,cAAc,mBAAmB,MAAM;AACjD,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AACF;AA7H6C;AAAA,MAA1C,yBAAO,yCAAgB;AAAA,GADb,uBACgC;AAEH;AAAA,MAAvC,yBAAO,yBAAa;AAAA,GAHV,uBAG6B;AAGvB;AAAA,MADhB,yBAAO,4BAAgB;AAAA,GALb,uBAMM;AAGA;AAAA,MADhB,yBAAO,4BAAgB;AAAA,GARb,uBASM;AAGA;AAAA,MADhB,yBAAO,6CAAoB;AAAA,GAXjB,uBAYM;AAGA;AAAA,MADhB,yBAAO,8CAAqB;AAAA,GAdlB,uBAeM;AAfN,yBAAN;AAAA,MADN,6BAAW;AAAA,GACC;;;ADfN,IAAM,4BAAwB,kCAAoB;AAAA,EACvD,OAAO,EAAE,KAAK,GAAG;AACf,SAAK,sBAAsB,EAAE,OAAO,EAAE,iBAAiB;AAAA,EACzD;AAAA,EACA,OAAO,KAAK;AACV,UAAM,yBAAyB,IAAI,IAA4B,sBAAsB;AACrF,2BAAuB,KAAK;AAAA,EAC9B;AAAA,EACA,QAAQ,KAAK;AACX,UAAM,yBAAyB,IAAI,IAA4B,sBAAsB;AACrF,2BAAuB,MAAM;AAAA,EAC/B;AAAA,EACA,UAAU,KAAK;AACb,UAAM,yBAAyB,IAAI,IAA4B,sBAAsB;AACrF,2BAAuB,QAAQ;AAAA,EACjC;AACF,CAAC;;;AIlBD,IAAAC,mBAAmC;AAKnC,IAAU;AAAA,CAAV,CAAUC,mBAAV;AACS,EAAMA,eAAA,UAAU,CAAC,MAA0B,YAAmC;AACnF,UAAM,SAAS,WAAW,MAAM,OAAO;AACvC,UAAM,UAAU,YAAY,IAAI;AAChC,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,aAASA,eAAA,iBAAgB,MAAM;AAAA,EAC/C;AAEO,EAAMA,eAAA,gBAAgB,CAAC,cAA4B,UAAsC;AAC9F,QAAI,QAAQ,GAAG;AAEb,aAAO;AAAA,IACT;AACA,UAAM,aAAa,kBAAkB,YAAY;AACjD,UAAM,SACJ,eAAe,aAAa,eAAe,kBAAkB,QAAQ,KAAK;AAC5E,WAAO;AAAA,EACT;AAEO,EAAMA,eAAA,oBAAoB,CAC/B,MACA,SACA,kBAAkB,UACP;AAGX,UAAM,mBAAyC,CAAC;AAChD,QAAI,cAA8C;AAClD,WAAO,aAAa;AAClB,uBAAiB,KAAK,WAAW;AACjC,oBAAc,YAAY;AAAA,IAC5B;AACA,UAAM,SAAS,iBAAiB,QAAQ;AACxC,UAAM,YAAY,OAAO,SAAS;AAElC,UAAM,gBAAgB,OAAO,UAAU,CAACC,UAA6B;AACnE,UAAI,QAAQ,YAAY,SAASA,MAAK,EAAE,GAAG;AAEzC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AACD,UAAM,WAAW,eAAe,cAAc,OAAO,SAAS;AAE9D,QAAI,CAAC,mBAAmB,kBAAkB,IAAI;AAE5C,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEO,EAAMD,eAAA,kBAAkB,CAAC,WAA4B;AAC1D,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,QAAM,aAAa,CAAC,MAA0B,YAAiD;AAC7F,UAAM,YAAQA,eAAA,mBAAkB,MAAM,OAAO;AAC7C,UAAM,aAASA,eAAA,kCAAiC,KAAK;AACrD,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,SAA6C;AAChE,UAAM,iBAAiB,KAAK,QAA4B,mCAAkB;AAC1E,WAAO,eAAe;AAAA,EACxB;AAAA,GApEQ;AAuEV,IAAU;AAAA,CAAV,CAAUE,mBAAV;AACS,EAAMA,eAAA,UAAU,CAAC,MAA0B,YAAmC;AACnF,UAAM,SAAS,WAAW,MAAM,OAAO;AACvC,UAAM,UAAU,KAAK;AACrB,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,SAAS,cAAc,gBAAgB,MAAM;AAAA,EAC7D;AAEA,QAAM,oBAAoB,CAAC,MAA0B,YAAqC;AACxF,QACE,KAAK;AAAA,IACL,QAAQ,oBAAoB,KAAK;AAAA,IACjC,QAAQ,YAAY,SAAS,KAAK,EAAE,GACpC;AAEA,aAAO,eAAe,WAAW;AAAA,IACnC;AACA,UAAM,YAAY,cAAc,kBAAkB,KAAK,MAAM,SAAS,IAAI;AAC1E,QAAI,CAAC,KAAK,IAAI;AAEZ,aAAO;AAAA,IACT;AACA,UAAM,UAAU,cAAc,kBAAkB,KAAK,IAAI,SAAS,IAAI;AACtE,UAAM,QAAQ,KAAK,IAAI,WAAW,OAAO;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,MAA0B,YAAiD;AAC7F,UAAM,QAAQ,kBAAkB,MAAM,OAAO;AAC7C,UAAM,SAAS,cAAc,iCAAiC,KAAK;AACnE,WAAO;AAAA,EACT;AAAA,GA/BQ;AAkCH,IAAM,kBAAkB,CAAC,WAI1B;AACJ,QAAM,EAAE,OAAO,OAAO,QAAQ,IAAI;AAClC,QAAM,QAAQ,CAAC,SAAS;AACtB,kBAAc,QAAQ,MAAM,OAAO;AAAA,EACrC,CAAC;AACD,QAAM,QAAQ,CAAC,SAAS;AACtB,kBAAc,QAAQ,MAAM,OAAO;AAAA,EACrC,CAAC;AACH;","names":["import_core","import_free_layout_core","import_document","StackingItem","StackingType","import_document","NodeComputing","node","LineComputing"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/free-stack-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
"inversify": "^6.0.1",
|
|
20
20
|
"reflect-metadata": "~0.2.2",
|
|
21
21
|
"lodash": "^4.17.21",
|
|
22
|
-
"@flowgram.ai/
|
|
23
|
-
"@flowgram.ai/document": "0.1.
|
|
24
|
-
"@flowgram.ai/renderer": "0.1.
|
|
25
|
-
"@flowgram.ai/free-layout-core": "0.1.
|
|
26
|
-
"@flowgram.ai/
|
|
22
|
+
"@flowgram.ai/utils": "0.1.27",
|
|
23
|
+
"@flowgram.ai/document": "0.1.27",
|
|
24
|
+
"@flowgram.ai/renderer": "0.1.27",
|
|
25
|
+
"@flowgram.ai/free-layout-core": "0.1.27",
|
|
26
|
+
"@flowgram.ai/core": "0.1.27"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/bezier-js": "4.1.3",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"tsup": "^8.0.1",
|
|
40
40
|
"typescript": "^5.0.4",
|
|
41
41
|
"vitest": "^0.34.6",
|
|
42
|
-
"@flowgram.ai/eslint-config": "0.1.
|
|
43
|
-
"@flowgram.ai/ts-config": "0.1.
|
|
42
|
+
"@flowgram.ai/eslint-config": "0.1.27",
|
|
43
|
+
"@flowgram.ai/ts-config": "0.1.27"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"react": ">=17",
|