@flowgram.ai/free-stack-plugin 0.4.18 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +24 -138
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +6 -38
- package/dist/index.d.ts +6 -38
- package/dist/index.js +26 -144
- package/dist/index.js.map +1 -1
- package/package.json +8 -9
package/dist/esm/index.js
CHANGED
|
@@ -60,8 +60,22 @@ var StackingComputing = class {
|
|
|
60
60
|
nodes.forEach((node, index) => {
|
|
61
61
|
nodeIndexMap.set(node.id, index);
|
|
62
62
|
});
|
|
63
|
+
const maxNodeIndex = nodes.length - 1;
|
|
64
|
+
const latestNodes = this.context.selectedNodes.flatMap((node) => this.getNodeParents(node));
|
|
65
|
+
latestNodes.forEach((node, index) => {
|
|
66
|
+
nodeIndexMap.set(node.id, maxNodeIndex + index);
|
|
67
|
+
});
|
|
63
68
|
return nodeIndexMap;
|
|
64
69
|
}
|
|
70
|
+
getNodeParents(node) {
|
|
71
|
+
const nodes = [];
|
|
72
|
+
let currentNode = node;
|
|
73
|
+
while (currentNode && currentNode.flowNodeType !== FlowNodeBaseType.ROOT) {
|
|
74
|
+
nodes.unshift(currentNode);
|
|
75
|
+
currentNode = currentNode.parent;
|
|
76
|
+
}
|
|
77
|
+
return nodes;
|
|
78
|
+
}
|
|
65
79
|
computeTopLevel(nodes) {
|
|
66
80
|
const nodesWithoutRoot = nodes.filter((node) => node.id !== FlowNodeBaseType.ROOT);
|
|
67
81
|
const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {
|
|
@@ -79,7 +93,7 @@ var StackingComputing = class {
|
|
|
79
93
|
lines.forEach((line) => {
|
|
80
94
|
if (line.isDrawing || // 正在绘制
|
|
81
95
|
this.context.hoveredEntityID === line.id || // hover
|
|
82
|
-
this.context.selectedIDs.
|
|
96
|
+
this.context.selectedIDs.has(line.id)) {
|
|
83
97
|
this.lineLevel.set(line.id, this.maxLevel);
|
|
84
98
|
} else {
|
|
85
99
|
this.lineLevel.set(line.id, this.getLevel(pinTop));
|
|
@@ -87,7 +101,7 @@ var StackingComputing = class {
|
|
|
87
101
|
});
|
|
88
102
|
this.levelIncrease();
|
|
89
103
|
nodes.forEach((node) => {
|
|
90
|
-
const selected = this.context.selectedIDs.
|
|
104
|
+
const selected = this.context.selectedIDs.has(node.id);
|
|
91
105
|
if (selected) {
|
|
92
106
|
this.nodeLevel.set(node.id, this.topLevel);
|
|
93
107
|
} else {
|
|
@@ -136,37 +150,7 @@ var StackingComputing = class {
|
|
|
136
150
|
};
|
|
137
151
|
|
|
138
152
|
// src/constant.ts
|
|
139
|
-
var
|
|
140
|
-
StackingItem2["Line"] = "line";
|
|
141
|
-
StackingItem2["Node"] = "node";
|
|
142
|
-
return StackingItem2;
|
|
143
|
-
})(StackingItem || {});
|
|
144
|
-
var StackingType = /* @__PURE__ */ ((StackingType2) => {
|
|
145
|
-
StackingType2["Line"] = "line" /* Line */;
|
|
146
|
-
StackingType2["Node"] = "node" /* Node */;
|
|
147
|
-
return StackingType2;
|
|
148
|
-
})(StackingType || {});
|
|
149
|
-
var StackingBaseIndex = {
|
|
150
|
-
["line" /* Line */]: 0,
|
|
151
|
-
["node" /* Node */]: 1
|
|
152
|
-
};
|
|
153
|
-
var startIndex = 8;
|
|
154
|
-
var allowLevel = 2;
|
|
155
|
-
var levelIndexStep = Object.keys(StackingType).length;
|
|
156
|
-
var maxLevel = allowLevel * 2;
|
|
157
|
-
var maxIndex = startIndex + maxLevel * levelIndexStep;
|
|
158
|
-
var StackingConfig = {
|
|
159
|
-
/** index 起始值 */
|
|
160
|
-
startIndex,
|
|
161
|
-
/** 允许存在的层级 */
|
|
162
|
-
allowLevel,
|
|
163
|
-
/** 每层 index 跨度 */
|
|
164
|
-
levelIndexStep,
|
|
165
|
-
/** 叠加计算后出现的最深层级 */
|
|
166
|
-
maxLevel,
|
|
167
|
-
/** 最大 index */
|
|
168
|
-
maxIndex
|
|
169
|
-
};
|
|
153
|
+
var BASE_Z_INDEX = 8;
|
|
170
154
|
|
|
171
155
|
// src/manager.ts
|
|
172
156
|
var StackingContextManager = class {
|
|
@@ -210,7 +194,7 @@ var StackingContextManager = class {
|
|
|
210
194
|
return;
|
|
211
195
|
}
|
|
212
196
|
nodeRenderData.stackIndex = level;
|
|
213
|
-
const zIndex =
|
|
197
|
+
const zIndex = BASE_Z_INDEX + level;
|
|
214
198
|
element.style.zIndex = String(zIndex);
|
|
215
199
|
});
|
|
216
200
|
this.lines.forEach((line) => {
|
|
@@ -223,7 +207,7 @@ var StackingContextManager = class {
|
|
|
223
207
|
return;
|
|
224
208
|
}
|
|
225
209
|
line.stackIndex = level;
|
|
226
|
-
const zIndex =
|
|
210
|
+
const zIndex = BASE_Z_INDEX + level;
|
|
227
211
|
element.style.zIndex = String(zIndex);
|
|
228
212
|
});
|
|
229
213
|
}
|
|
@@ -235,10 +219,9 @@ var StackingContextManager = class {
|
|
|
235
219
|
}
|
|
236
220
|
get context() {
|
|
237
221
|
return {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
selectedIDs: this.selectService.selection.map((entity) => entity.id)
|
|
222
|
+
hoveredEntityID: this.hoverService.someHovered?.id,
|
|
223
|
+
selectedNodes: this.selectService.selectedNodes,
|
|
224
|
+
selectedIDs: new Set(this.selectService.selection.map((entity) => entity.id))
|
|
242
225
|
};
|
|
243
226
|
}
|
|
244
227
|
mountListener() {
|
|
@@ -309,107 +292,10 @@ var createFreeStackPlugin = definePluginCreator({
|
|
|
309
292
|
stackingContextManager.dispose();
|
|
310
293
|
}
|
|
311
294
|
});
|
|
312
|
-
|
|
313
|
-
// src/layers-computing.ts
|
|
314
|
-
import { FlowNodeRenderData as FlowNodeRenderData2 } from "@flowgram.ai/document";
|
|
315
|
-
var NodeComputing;
|
|
316
|
-
((NodeComputing2) => {
|
|
317
|
-
NodeComputing2.compute = (node, context) => {
|
|
318
|
-
const zIndex = nodeZIndex(node, context);
|
|
319
|
-
const element = nodeElement(node);
|
|
320
|
-
element.style.position = "absolute";
|
|
321
|
-
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
322
|
-
};
|
|
323
|
-
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
324
|
-
if (level < 1) {
|
|
325
|
-
return void 0;
|
|
326
|
-
}
|
|
327
|
-
const baseZIndex = StackingBaseIndex[stackingType];
|
|
328
|
-
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
329
|
-
return zIndex;
|
|
330
|
-
};
|
|
331
|
-
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
332
|
-
const unReversedLinage = [];
|
|
333
|
-
let currentNode = node;
|
|
334
|
-
while (currentNode) {
|
|
335
|
-
unReversedLinage.push(currentNode);
|
|
336
|
-
currentNode = currentNode.parent;
|
|
337
|
-
}
|
|
338
|
-
const linage = unReversedLinage.reverse();
|
|
339
|
-
const nodeLevel = linage.length - 1;
|
|
340
|
-
const topLevelIndex = linage.findIndex((node2) => {
|
|
341
|
-
if (context.selectedIDs.includes(node2.id)) {
|
|
342
|
-
return true;
|
|
343
|
-
}
|
|
344
|
-
return false;
|
|
345
|
-
});
|
|
346
|
-
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
347
|
-
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
348
|
-
return topLevel;
|
|
349
|
-
}
|
|
350
|
-
return nodeLevel;
|
|
351
|
-
};
|
|
352
|
-
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
353
|
-
if (zIndex === void 0) {
|
|
354
|
-
return "auto";
|
|
355
|
-
}
|
|
356
|
-
return zIndex.toString();
|
|
357
|
-
};
|
|
358
|
-
const nodeZIndex = (node, context) => {
|
|
359
|
-
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
360
|
-
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
361
|
-
return zIndex;
|
|
362
|
-
};
|
|
363
|
-
const nodeElement = (node) => {
|
|
364
|
-
const nodeRenderData = node.getData(FlowNodeRenderData2);
|
|
365
|
-
return nodeRenderData.node;
|
|
366
|
-
};
|
|
367
|
-
})(NodeComputing || (NodeComputing = {}));
|
|
368
|
-
var LineComputing;
|
|
369
|
-
((LineComputing2) => {
|
|
370
|
-
LineComputing2.compute = (line, context) => {
|
|
371
|
-
const zIndex = lineZIndex(line, context);
|
|
372
|
-
const element = line.node;
|
|
373
|
-
element.style.position = "absolute";
|
|
374
|
-
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
375
|
-
};
|
|
376
|
-
const lineStackingLevel = (line, context) => {
|
|
377
|
-
if (line.isDrawing || // 正在绘制
|
|
378
|
-
context.hoveredEntityID === line.id || // hover
|
|
379
|
-
context.selectedIDs.includes(line.id)) {
|
|
380
|
-
return StackingConfig.maxLevel + 1;
|
|
381
|
-
}
|
|
382
|
-
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
383
|
-
if (!line.to) {
|
|
384
|
-
return fromLevel;
|
|
385
|
-
}
|
|
386
|
-
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
387
|
-
const level = Math.min(fromLevel, toLevel);
|
|
388
|
-
return level;
|
|
389
|
-
};
|
|
390
|
-
const lineZIndex = (line, context) => {
|
|
391
|
-
const level = lineStackingLevel(line, context);
|
|
392
|
-
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
393
|
-
return zIndex;
|
|
394
|
-
};
|
|
395
|
-
})(LineComputing || (LineComputing = {}));
|
|
396
|
-
var layersComputing = (params) => {
|
|
397
|
-
const { nodes, lines, context } = params;
|
|
398
|
-
nodes.forEach((node) => {
|
|
399
|
-
NodeComputing.compute(node, context);
|
|
400
|
-
});
|
|
401
|
-
lines.forEach((line) => {
|
|
402
|
-
LineComputing.compute(line, context);
|
|
403
|
-
});
|
|
404
|
-
};
|
|
405
295
|
export {
|
|
406
|
-
|
|
296
|
+
BASE_Z_INDEX,
|
|
407
297
|
StackingComputing,
|
|
408
|
-
StackingConfig,
|
|
409
298
|
StackingContextManager,
|
|
410
|
-
|
|
411
|
-
StackingType,
|
|
412
|
-
createFreeStackPlugin,
|
|
413
|
-
layersComputing
|
|
299
|
+
createFreeStackPlugin
|
|
414
300
|
};
|
|
415
301
|
//# sourceMappingURL=index.js.map
|
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/constant.ts","../../src/layers-computing.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { debounce } from 'lodash-es';\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 nodeRenderData.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n nodeRenderData.stackIndex = level;\n const zIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(zIndex);\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 line.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n line.stackIndex = level;\n const zIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(zIndex);\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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-free-stack-plugin.ts","../../src/manager.ts","../../src/stacking-computing.ts","../../src/constant.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { debounce } from 'lodash-es';\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 { BASE_Z_INDEX } 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 nodeRenderData.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n nodeRenderData.stackIndex = level;\n const zIndex = BASE_Z_INDEX + level;\n element.style.zIndex = String(zIndex);\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 line.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n line.stackIndex = level;\n const zIndex = BASE_Z_INDEX + level;\n element.style.zIndex = String(zIndex);\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 hoveredEntityID: this.hoverService.someHovered?.id,\n selectedNodes: this.selectService.selectedNodes,\n selectedIDs: new Set(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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\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 // 默认按照创建节点顺序排序\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n // 选中节点的父节点排序置顶\n const maxNodeIndex = nodes.length - 1;\n const latestNodes = this.context.selectedNodes.flatMap((node) => this.getNodeParents(node));\n latestNodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, maxNodeIndex + index);\n });\n return nodeIndexMap;\n }\n\n private getNodeParents(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n const nodes: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode && currentNode.flowNodeType !== FlowNodeBaseType.ROOT) {\n nodes.unshift(currentNode);\n currentNode = currentNode.parent;\n }\n return nodes;\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.has(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.has(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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n// 起始 z-index\nexport const BASE_Z_INDEX = 8;\n"],"mappings":"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","names":["WorkflowNodeEntity","WorkflowLineEntity","WorkflowNodeEntity","WorkflowLineEntity"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
|
-
import {
|
|
3
|
-
import { WorkflowEntityHoverable, WorkflowNodeEntity, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
2
|
+
import { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
@@ -45,27 +44,7 @@ declare class StackingContextManager {
|
|
|
45
44
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
46
45
|
* SPDX-License-Identifier: MIT
|
|
47
46
|
*/
|
|
48
|
-
declare
|
|
49
|
-
Line = "line",
|
|
50
|
-
Node = "node"
|
|
51
|
-
}
|
|
52
|
-
declare enum StackingType {
|
|
53
|
-
Line = "line",
|
|
54
|
-
Node = "node"
|
|
55
|
-
}
|
|
56
|
-
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
57
|
-
declare const StackingConfig: {
|
|
58
|
-
/** index 起始值 */
|
|
59
|
-
startIndex: number;
|
|
60
|
-
/** 允许存在的层级 */
|
|
61
|
-
allowLevel: number;
|
|
62
|
-
/** 每层 index 跨度 */
|
|
63
|
-
levelIndexStep: number;
|
|
64
|
-
/** 叠加计算后出现的最深层级 */
|
|
65
|
-
maxLevel: number;
|
|
66
|
-
/** 最大 index */
|
|
67
|
-
maxIndex: number;
|
|
68
|
-
};
|
|
47
|
+
declare const BASE_Z_INDEX = 8;
|
|
69
48
|
|
|
70
49
|
/**
|
|
71
50
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
@@ -73,23 +52,11 @@ declare const StackingConfig: {
|
|
|
73
52
|
*/
|
|
74
53
|
|
|
75
54
|
type StackingContext = {
|
|
76
|
-
hoveredEntity?: WorkflowEntityHoverable;
|
|
77
55
|
hoveredEntityID?: string;
|
|
78
|
-
|
|
79
|
-
selectedIDs: string
|
|
56
|
+
selectedNodes: WorkflowNodeEntity[];
|
|
57
|
+
selectedIDs: Set<string>;
|
|
80
58
|
};
|
|
81
59
|
|
|
82
|
-
/**
|
|
83
|
-
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
84
|
-
* SPDX-License-Identifier: MIT
|
|
85
|
-
*/
|
|
86
|
-
|
|
87
|
-
declare const layersComputing: (params: {
|
|
88
|
-
nodes: WorkflowNodeEntity[];
|
|
89
|
-
lines: WorkflowLineEntity[];
|
|
90
|
-
context: StackingContext;
|
|
91
|
-
}) => void;
|
|
92
|
-
|
|
93
60
|
/**
|
|
94
61
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
95
62
|
* SPDX-License-Identifier: MIT
|
|
@@ -119,6 +86,7 @@ declare class StackingComputing {
|
|
|
119
86
|
};
|
|
120
87
|
private clearCache;
|
|
121
88
|
private computeNodeIndexesMap;
|
|
89
|
+
private getNodeParents;
|
|
122
90
|
private computeTopLevel;
|
|
123
91
|
private layerHandler;
|
|
124
92
|
private sortNodes;
|
|
@@ -128,4 +96,4 @@ declare class StackingComputing {
|
|
|
128
96
|
private levelIncrease;
|
|
129
97
|
}
|
|
130
98
|
|
|
131
|
-
export {
|
|
99
|
+
export { BASE_Z_INDEX, StackingComputing, type StackingContext, StackingContextManager, createFreeStackPlugin };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
|
-
import {
|
|
3
|
-
import { WorkflowEntityHoverable, WorkflowNodeEntity, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
2
|
+
import { WorkflowNodeEntity } from '@flowgram.ai/free-layout-core';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
@@ -45,27 +44,7 @@ declare class StackingContextManager {
|
|
|
45
44
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
46
45
|
* SPDX-License-Identifier: MIT
|
|
47
46
|
*/
|
|
48
|
-
declare
|
|
49
|
-
Line = "line",
|
|
50
|
-
Node = "node"
|
|
51
|
-
}
|
|
52
|
-
declare enum StackingType {
|
|
53
|
-
Line = "line",
|
|
54
|
-
Node = "node"
|
|
55
|
-
}
|
|
56
|
-
declare const StackingBaseIndex: Record<StackingType, number>;
|
|
57
|
-
declare const StackingConfig: {
|
|
58
|
-
/** index 起始值 */
|
|
59
|
-
startIndex: number;
|
|
60
|
-
/** 允许存在的层级 */
|
|
61
|
-
allowLevel: number;
|
|
62
|
-
/** 每层 index 跨度 */
|
|
63
|
-
levelIndexStep: number;
|
|
64
|
-
/** 叠加计算后出现的最深层级 */
|
|
65
|
-
maxLevel: number;
|
|
66
|
-
/** 最大 index */
|
|
67
|
-
maxIndex: number;
|
|
68
|
-
};
|
|
47
|
+
declare const BASE_Z_INDEX = 8;
|
|
69
48
|
|
|
70
49
|
/**
|
|
71
50
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
@@ -73,23 +52,11 @@ declare const StackingConfig: {
|
|
|
73
52
|
*/
|
|
74
53
|
|
|
75
54
|
type StackingContext = {
|
|
76
|
-
hoveredEntity?: WorkflowEntityHoverable;
|
|
77
55
|
hoveredEntityID?: string;
|
|
78
|
-
|
|
79
|
-
selectedIDs: string
|
|
56
|
+
selectedNodes: WorkflowNodeEntity[];
|
|
57
|
+
selectedIDs: Set<string>;
|
|
80
58
|
};
|
|
81
59
|
|
|
82
|
-
/**
|
|
83
|
-
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
84
|
-
* SPDX-License-Identifier: MIT
|
|
85
|
-
*/
|
|
86
|
-
|
|
87
|
-
declare const layersComputing: (params: {
|
|
88
|
-
nodes: WorkflowNodeEntity[];
|
|
89
|
-
lines: WorkflowLineEntity[];
|
|
90
|
-
context: StackingContext;
|
|
91
|
-
}) => void;
|
|
92
|
-
|
|
93
60
|
/**
|
|
94
61
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
95
62
|
* SPDX-License-Identifier: MIT
|
|
@@ -119,6 +86,7 @@ declare class StackingComputing {
|
|
|
119
86
|
};
|
|
120
87
|
private clearCache;
|
|
121
88
|
private computeNodeIndexesMap;
|
|
89
|
+
private getNodeParents;
|
|
122
90
|
private computeTopLevel;
|
|
123
91
|
private layerHandler;
|
|
124
92
|
private sortNodes;
|
|
@@ -128,4 +96,4 @@ declare class StackingComputing {
|
|
|
128
96
|
private levelIncrease;
|
|
129
97
|
}
|
|
130
98
|
|
|
131
|
-
export {
|
|
99
|
+
export { BASE_Z_INDEX, StackingComputing, type StackingContext, StackingContextManager, createFreeStackPlugin };
|
package/dist/index.js
CHANGED
|
@@ -28,14 +28,10 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
28
28
|
// src/index.ts
|
|
29
29
|
var index_exports = {};
|
|
30
30
|
__export(index_exports, {
|
|
31
|
-
|
|
31
|
+
BASE_Z_INDEX: () => BASE_Z_INDEX,
|
|
32
32
|
StackingComputing: () => StackingComputing,
|
|
33
|
-
StackingConfig: () => StackingConfig,
|
|
34
33
|
StackingContextManager: () => StackingContextManager,
|
|
35
|
-
|
|
36
|
-
StackingType: () => StackingType,
|
|
37
|
-
createFreeStackPlugin: () => createFreeStackPlugin,
|
|
38
|
-
layersComputing: () => layersComputing
|
|
34
|
+
createFreeStackPlugin: () => createFreeStackPlugin
|
|
39
35
|
});
|
|
40
36
|
module.exports = __toCommonJS(index_exports);
|
|
41
37
|
|
|
@@ -84,8 +80,22 @@ var StackingComputing = class {
|
|
|
84
80
|
nodes.forEach((node, index) => {
|
|
85
81
|
nodeIndexMap.set(node.id, index);
|
|
86
82
|
});
|
|
83
|
+
const maxNodeIndex = nodes.length - 1;
|
|
84
|
+
const latestNodes = this.context.selectedNodes.flatMap((node) => this.getNodeParents(node));
|
|
85
|
+
latestNodes.forEach((node, index) => {
|
|
86
|
+
nodeIndexMap.set(node.id, maxNodeIndex + index);
|
|
87
|
+
});
|
|
87
88
|
return nodeIndexMap;
|
|
88
89
|
}
|
|
90
|
+
getNodeParents(node) {
|
|
91
|
+
const nodes = [];
|
|
92
|
+
let currentNode = node;
|
|
93
|
+
while (currentNode && currentNode.flowNodeType !== import_document.FlowNodeBaseType.ROOT) {
|
|
94
|
+
nodes.unshift(currentNode);
|
|
95
|
+
currentNode = currentNode.parent;
|
|
96
|
+
}
|
|
97
|
+
return nodes;
|
|
98
|
+
}
|
|
89
99
|
computeTopLevel(nodes) {
|
|
90
100
|
const nodesWithoutRoot = nodes.filter((node) => node.id !== import_document.FlowNodeBaseType.ROOT);
|
|
91
101
|
const nodeHasChildren = nodesWithoutRoot.reduce((count, node) => {
|
|
@@ -103,7 +113,7 @@ var StackingComputing = class {
|
|
|
103
113
|
lines.forEach((line) => {
|
|
104
114
|
if (line.isDrawing || // 正在绘制
|
|
105
115
|
this.context.hoveredEntityID === line.id || // hover
|
|
106
|
-
this.context.selectedIDs.
|
|
116
|
+
this.context.selectedIDs.has(line.id)) {
|
|
107
117
|
this.lineLevel.set(line.id, this.maxLevel);
|
|
108
118
|
} else {
|
|
109
119
|
this.lineLevel.set(line.id, this.getLevel(pinTop));
|
|
@@ -111,7 +121,7 @@ var StackingComputing = class {
|
|
|
111
121
|
});
|
|
112
122
|
this.levelIncrease();
|
|
113
123
|
nodes.forEach((node) => {
|
|
114
|
-
const selected = this.context.selectedIDs.
|
|
124
|
+
const selected = this.context.selectedIDs.has(node.id);
|
|
115
125
|
if (selected) {
|
|
116
126
|
this.nodeLevel.set(node.id, this.topLevel);
|
|
117
127
|
} else {
|
|
@@ -160,37 +170,7 @@ var StackingComputing = class {
|
|
|
160
170
|
};
|
|
161
171
|
|
|
162
172
|
// src/constant.ts
|
|
163
|
-
var
|
|
164
|
-
StackingItem2["Line"] = "line";
|
|
165
|
-
StackingItem2["Node"] = "node";
|
|
166
|
-
return StackingItem2;
|
|
167
|
-
})(StackingItem || {});
|
|
168
|
-
var StackingType = /* @__PURE__ */ ((StackingType2) => {
|
|
169
|
-
StackingType2["Line"] = "line" /* Line */;
|
|
170
|
-
StackingType2["Node"] = "node" /* Node */;
|
|
171
|
-
return StackingType2;
|
|
172
|
-
})(StackingType || {});
|
|
173
|
-
var StackingBaseIndex = {
|
|
174
|
-
["line" /* Line */]: 0,
|
|
175
|
-
["node" /* Node */]: 1
|
|
176
|
-
};
|
|
177
|
-
var startIndex = 8;
|
|
178
|
-
var allowLevel = 2;
|
|
179
|
-
var levelIndexStep = Object.keys(StackingType).length;
|
|
180
|
-
var maxLevel = allowLevel * 2;
|
|
181
|
-
var maxIndex = startIndex + maxLevel * levelIndexStep;
|
|
182
|
-
var StackingConfig = {
|
|
183
|
-
/** index 起始值 */
|
|
184
|
-
startIndex,
|
|
185
|
-
/** 允许存在的层级 */
|
|
186
|
-
allowLevel,
|
|
187
|
-
/** 每层 index 跨度 */
|
|
188
|
-
levelIndexStep,
|
|
189
|
-
/** 叠加计算后出现的最深层级 */
|
|
190
|
-
maxLevel,
|
|
191
|
-
/** 最大 index */
|
|
192
|
-
maxIndex
|
|
193
|
-
};
|
|
173
|
+
var BASE_Z_INDEX = 8;
|
|
194
174
|
|
|
195
175
|
// src/manager.ts
|
|
196
176
|
var StackingContextManager = class {
|
|
@@ -234,7 +214,7 @@ var StackingContextManager = class {
|
|
|
234
214
|
return;
|
|
235
215
|
}
|
|
236
216
|
nodeRenderData.stackIndex = level;
|
|
237
|
-
const zIndex =
|
|
217
|
+
const zIndex = BASE_Z_INDEX + level;
|
|
238
218
|
element.style.zIndex = String(zIndex);
|
|
239
219
|
});
|
|
240
220
|
this.lines.forEach((line) => {
|
|
@@ -247,7 +227,7 @@ var StackingContextManager = class {
|
|
|
247
227
|
return;
|
|
248
228
|
}
|
|
249
229
|
line.stackIndex = level;
|
|
250
|
-
const zIndex =
|
|
230
|
+
const zIndex = BASE_Z_INDEX + level;
|
|
251
231
|
element.style.zIndex = String(zIndex);
|
|
252
232
|
});
|
|
253
233
|
}
|
|
@@ -259,10 +239,9 @@ var StackingContextManager = class {
|
|
|
259
239
|
}
|
|
260
240
|
get context() {
|
|
261
241
|
return {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
selectedIDs: this.selectService.selection.map((entity) => entity.id)
|
|
242
|
+
hoveredEntityID: this.hoverService.someHovered?.id,
|
|
243
|
+
selectedNodes: this.selectService.selectedNodes,
|
|
244
|
+
selectedIDs: new Set(this.selectService.selection.map((entity) => entity.id))
|
|
266
245
|
};
|
|
267
246
|
}
|
|
268
247
|
mountListener() {
|
|
@@ -333,108 +312,11 @@ var createFreeStackPlugin = (0, import_core2.definePluginCreator)({
|
|
|
333
312
|
stackingContextManager.dispose();
|
|
334
313
|
}
|
|
335
314
|
});
|
|
336
|
-
|
|
337
|
-
// src/layers-computing.ts
|
|
338
|
-
var import_document3 = require("@flowgram.ai/document");
|
|
339
|
-
var NodeComputing;
|
|
340
|
-
((NodeComputing2) => {
|
|
341
|
-
NodeComputing2.compute = (node, context) => {
|
|
342
|
-
const zIndex = nodeZIndex(node, context);
|
|
343
|
-
const element = nodeElement(node);
|
|
344
|
-
element.style.position = "absolute";
|
|
345
|
-
element.style.zIndex = (0, NodeComputing2.zIndexStringify)(zIndex);
|
|
346
|
-
};
|
|
347
|
-
NodeComputing2.stackingIndex = (stackingType, level) => {
|
|
348
|
-
if (level < 1) {
|
|
349
|
-
return void 0;
|
|
350
|
-
}
|
|
351
|
-
const baseZIndex = StackingBaseIndex[stackingType];
|
|
352
|
-
const zIndex = StackingConfig.startIndex + StackingConfig.levelIndexStep * (level - 1) + baseZIndex;
|
|
353
|
-
return zIndex;
|
|
354
|
-
};
|
|
355
|
-
NodeComputing2.nodeStackingLevel = (node, context, disableTopLevel = false) => {
|
|
356
|
-
const unReversedLinage = [];
|
|
357
|
-
let currentNode = node;
|
|
358
|
-
while (currentNode) {
|
|
359
|
-
unReversedLinage.push(currentNode);
|
|
360
|
-
currentNode = currentNode.parent;
|
|
361
|
-
}
|
|
362
|
-
const linage = unReversedLinage.reverse();
|
|
363
|
-
const nodeLevel = linage.length - 1;
|
|
364
|
-
const topLevelIndex = linage.findIndex((node2) => {
|
|
365
|
-
if (context.selectedIDs.includes(node2.id)) {
|
|
366
|
-
return true;
|
|
367
|
-
}
|
|
368
|
-
return false;
|
|
369
|
-
});
|
|
370
|
-
const topLevel = StackingConfig.allowLevel + (linage.length - topLevelIndex);
|
|
371
|
-
if (!disableTopLevel && topLevelIndex !== -1) {
|
|
372
|
-
return topLevel;
|
|
373
|
-
}
|
|
374
|
-
return nodeLevel;
|
|
375
|
-
};
|
|
376
|
-
NodeComputing2.zIndexStringify = (zIndex) => {
|
|
377
|
-
if (zIndex === void 0) {
|
|
378
|
-
return "auto";
|
|
379
|
-
}
|
|
380
|
-
return zIndex.toString();
|
|
381
|
-
};
|
|
382
|
-
const nodeZIndex = (node, context) => {
|
|
383
|
-
const level = (0, NodeComputing2.nodeStackingLevel)(node, context);
|
|
384
|
-
const zIndex = (0, NodeComputing2.stackingIndex)("node" /* Node */, level);
|
|
385
|
-
return zIndex;
|
|
386
|
-
};
|
|
387
|
-
const nodeElement = (node) => {
|
|
388
|
-
const nodeRenderData = node.getData(import_document3.FlowNodeRenderData);
|
|
389
|
-
return nodeRenderData.node;
|
|
390
|
-
};
|
|
391
|
-
})(NodeComputing || (NodeComputing = {}));
|
|
392
|
-
var LineComputing;
|
|
393
|
-
((LineComputing2) => {
|
|
394
|
-
LineComputing2.compute = (line, context) => {
|
|
395
|
-
const zIndex = lineZIndex(line, context);
|
|
396
|
-
const element = line.node;
|
|
397
|
-
element.style.position = "absolute";
|
|
398
|
-
element.style.zIndex = NodeComputing.zIndexStringify(zIndex);
|
|
399
|
-
};
|
|
400
|
-
const lineStackingLevel = (line, context) => {
|
|
401
|
-
if (line.isDrawing || // 正在绘制
|
|
402
|
-
context.hoveredEntityID === line.id || // hover
|
|
403
|
-
context.selectedIDs.includes(line.id)) {
|
|
404
|
-
return StackingConfig.maxLevel + 1;
|
|
405
|
-
}
|
|
406
|
-
const fromLevel = NodeComputing.nodeStackingLevel(line.from, context, true);
|
|
407
|
-
if (!line.to) {
|
|
408
|
-
return fromLevel;
|
|
409
|
-
}
|
|
410
|
-
const toLevel = NodeComputing.nodeStackingLevel(line.to, context, true);
|
|
411
|
-
const level = Math.min(fromLevel, toLevel);
|
|
412
|
-
return level;
|
|
413
|
-
};
|
|
414
|
-
const lineZIndex = (line, context) => {
|
|
415
|
-
const level = lineStackingLevel(line, context);
|
|
416
|
-
const zIndex = NodeComputing.stackingIndex("line" /* Line */, level);
|
|
417
|
-
return zIndex;
|
|
418
|
-
};
|
|
419
|
-
})(LineComputing || (LineComputing = {}));
|
|
420
|
-
var layersComputing = (params) => {
|
|
421
|
-
const { nodes, lines, context } = params;
|
|
422
|
-
nodes.forEach((node) => {
|
|
423
|
-
NodeComputing.compute(node, context);
|
|
424
|
-
});
|
|
425
|
-
lines.forEach((line) => {
|
|
426
|
-
LineComputing.compute(line, context);
|
|
427
|
-
});
|
|
428
|
-
};
|
|
429
315
|
// Annotate the CommonJS export names for ESM import in node:
|
|
430
316
|
0 && (module.exports = {
|
|
431
|
-
|
|
317
|
+
BASE_Z_INDEX,
|
|
432
318
|
StackingComputing,
|
|
433
|
-
StackingConfig,
|
|
434
319
|
StackingContextManager,
|
|
435
|
-
|
|
436
|
-
StackingType,
|
|
437
|
-
createFreeStackPlugin,
|
|
438
|
-
layersComputing
|
|
320
|
+
createFreeStackPlugin
|
|
439
321
|
});
|
|
440
322
|
//# sourceMappingURL=index.js.map
|
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/constant.ts","../src/layers-computing.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './create-free-stack-plugin';\nexport * from './manager';\nexport * from './constant';\nexport * from './layers-computing';\nexport * from './stacking-computing';\nexport * from './type';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { debounce } from 'lodash-es';\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 nodeRenderData.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n nodeRenderData.stackIndex = level;\n const zIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(zIndex);\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 line.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n line.stackIndex = level;\n const zIndex = StackingConfig.startIndex + level;\n element.style.zIndex = String(zIndex);\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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport 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":["import_core","import_free_layout_core","import_document","StackingItem","StackingType","import_document","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"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './create-free-stack-plugin';\nexport * from './manager';\nexport * from './constant';\nexport * from './stacking-computing';\nexport * from './type';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { 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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { debounce } from 'lodash-es';\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 { BASE_Z_INDEX } 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 nodeRenderData.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n nodeRenderData.stackIndex = level;\n const zIndex = BASE_Z_INDEX + level;\n element.style.zIndex = String(zIndex);\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 line.stackIndex = 0;\n element.style.zIndex = 'auto';\n return;\n }\n line.stackIndex = level;\n const zIndex = BASE_Z_INDEX + level;\n element.style.zIndex = String(zIndex);\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 hoveredEntityID: this.hoverService.someHovered?.id,\n selectedNodes: this.selectService.selectedNodes,\n selectedIDs: new Set(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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\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 // 默认按照创建节点顺序排序\n nodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, index);\n });\n // 选中节点的父节点排序置顶\n const maxNodeIndex = nodes.length - 1;\n const latestNodes = this.context.selectedNodes.flatMap((node) => this.getNodeParents(node));\n latestNodes.forEach((node, index) => {\n nodeIndexMap.set(node.id, maxNodeIndex + index);\n });\n return nodeIndexMap;\n }\n\n private getNodeParents(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n const nodes: WorkflowNodeEntity[] = [];\n let currentNode: WorkflowNodeEntity | undefined = node;\n while (currentNode && currentNode.flowNodeType !== FlowNodeBaseType.ROOT) {\n nodes.unshift(currentNode);\n currentNode = currentNode.parent;\n }\n return nodes;\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.has(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.has(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","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n// 起始 z-index\nexport const BASE_Z_INDEX = 8;\n"],"mappings":"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","names":["import_core","import_free_layout_core","import_document"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/free-stack-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,11 +19,10 @@
|
|
|
19
19
|
"inversify": "^6.0.1",
|
|
20
20
|
"reflect-metadata": "~0.2.2",
|
|
21
21
|
"lodash-es": "^4.17.21",
|
|
22
|
-
"@flowgram.ai/document": "0.
|
|
23
|
-
"@flowgram.ai/core": "0.
|
|
24
|
-
"@flowgram.ai/free-layout-core": "0.
|
|
25
|
-
"@flowgram.ai/
|
|
26
|
-
"@flowgram.ai/utils": "0.4.18"
|
|
22
|
+
"@flowgram.ai/document": "0.5.0",
|
|
23
|
+
"@flowgram.ai/core": "0.5.0",
|
|
24
|
+
"@flowgram.ai/free-layout-core": "0.5.0",
|
|
25
|
+
"@flowgram.ai/utils": "0.5.0"
|
|
27
26
|
},
|
|
28
27
|
"devDependencies": {
|
|
29
28
|
"@types/bezier-js": "4.1.3",
|
|
@@ -39,13 +38,13 @@
|
|
|
39
38
|
"tsup": "^8.0.1",
|
|
40
39
|
"typescript": "^5.8.3",
|
|
41
40
|
"vitest": "^3.2.4",
|
|
42
|
-
"@flowgram.ai/eslint-config": "0.
|
|
43
|
-
"@flowgram.ai/ts-config": "0.
|
|
41
|
+
"@flowgram.ai/eslint-config": "0.5.0",
|
|
42
|
+
"@flowgram.ai/ts-config": "0.5.0"
|
|
44
43
|
},
|
|
45
44
|
"peerDependencies": {
|
|
46
45
|
"react": ">=16.8",
|
|
47
46
|
"react-dom": ">=16.8",
|
|
48
|
-
"styled-components": ">=
|
|
47
|
+
"styled-components": ">=5"
|
|
49
48
|
},
|
|
50
49
|
"publishConfig": {
|
|
51
50
|
"access": "public",
|