@flowgram.ai/free-node-panel-plugin 0.1.0-alpha.7 → 0.1.0-alpha.8
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 +23 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +23 -14
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/esm/index.js
CHANGED
|
@@ -39,7 +39,10 @@ import { Rectangle } from "@flowgram.ai/utils";
|
|
|
39
39
|
import { FlowNodeTransformData } from "@flowgram.ai/document";
|
|
40
40
|
|
|
41
41
|
// src/utils/is-container.ts
|
|
42
|
-
var isContainer = (node) =>
|
|
42
|
+
var isContainer = (node) => {
|
|
43
|
+
var _a;
|
|
44
|
+
return (_a = node == null ? void 0 : node.getNodeMeta().isContainer) != null ? _a : false;
|
|
45
|
+
};
|
|
43
46
|
|
|
44
47
|
// src/utils/get-port-box.ts
|
|
45
48
|
var getPortBox = (port, offset = { x: 0, y: 0 }) => {
|
|
@@ -156,11 +159,12 @@ var isLessThan = (a, b) => {
|
|
|
156
159
|
|
|
157
160
|
// src/utils/sub-position-offset.ts
|
|
158
161
|
var subPositionOffset = (params) => {
|
|
162
|
+
var _a, _b;
|
|
159
163
|
const { node, fromPort, toPort, padding } = params;
|
|
160
164
|
const fromBox = getPortBox(fromPort);
|
|
161
165
|
const toBox = getPortBox(toPort);
|
|
162
166
|
const nodeTrans = node.getData(FlowNodeTransformData2);
|
|
163
|
-
const nodeSize = node.getNodeMeta()
|
|
167
|
+
const nodeSize = (_b = (_a = node.getNodeMeta()) == null ? void 0 : _a.size) != null ? _b : {
|
|
164
168
|
width: nodeTrans.bounds.width,
|
|
165
169
|
height: nodeTrans.bounds.height
|
|
166
170
|
};
|
|
@@ -205,28 +209,31 @@ var subPositionOffset = (params) => {
|
|
|
205
209
|
|
|
206
210
|
// src/utils/get-sub-nodes.ts
|
|
207
211
|
var getSubsequentNodes = (params) => {
|
|
212
|
+
var _a, _b;
|
|
208
213
|
const { node, linesManager } = params;
|
|
209
214
|
if (isContainer(node)) {
|
|
210
215
|
return [];
|
|
211
216
|
}
|
|
212
|
-
const brothers = node.parent
|
|
217
|
+
const brothers = (_b = (_a = node.parent) == null ? void 0 : _a.blocks) != null ? _b : [];
|
|
213
218
|
const linkedBrothers = /* @__PURE__ */ new Set();
|
|
214
219
|
const linesMap = /* @__PURE__ */ new Map();
|
|
215
220
|
linesManager.getAllLines().forEach((line) => {
|
|
221
|
+
var _a2, _b2;
|
|
216
222
|
if (!linesMap.has(line.from.id)) {
|
|
217
223
|
linesMap.set(line.from.id, []);
|
|
218
224
|
}
|
|
219
|
-
if (!line.to
|
|
225
|
+
if (!((_a2 = line.to) == null ? void 0 : _a2.id) || isContainer(line.to)) {
|
|
220
226
|
return;
|
|
221
227
|
}
|
|
222
|
-
linesMap.get(line.from.id)
|
|
228
|
+
(_b2 = linesMap.get(line.from.id)) == null ? void 0 : _b2.push(line.to.id);
|
|
223
229
|
});
|
|
224
230
|
const bfs = (nodeId) => {
|
|
231
|
+
var _a2;
|
|
225
232
|
if (linkedBrothers.has(nodeId)) {
|
|
226
233
|
return;
|
|
227
234
|
}
|
|
228
235
|
linkedBrothers.add(nodeId);
|
|
229
|
-
const nextNodes = linesMap.get(nodeId)
|
|
236
|
+
const nextNodes = (_a2 = linesMap.get(nodeId)) != null ? _a2 : [];
|
|
230
237
|
nextNodes.forEach(bfs);
|
|
231
238
|
};
|
|
232
239
|
bfs(node.id);
|
|
@@ -277,8 +284,8 @@ var getContainerNode = (params) => {
|
|
|
277
284
|
if (containerNode) {
|
|
278
285
|
return containerNode;
|
|
279
286
|
}
|
|
280
|
-
const fromNode = fromPort
|
|
281
|
-
const fromContainer = fromNode
|
|
287
|
+
const fromNode = fromPort == null ? void 0 : fromPort.node;
|
|
288
|
+
const fromContainer = fromNode == null ? void 0 : fromNode.parent;
|
|
282
289
|
if (isContainer(fromNode)) {
|
|
283
290
|
return fromNode;
|
|
284
291
|
}
|
|
@@ -290,12 +297,13 @@ import {
|
|
|
290
297
|
WorkflowNodePortsData
|
|
291
298
|
} from "@flowgram.ai/free-layout-core";
|
|
292
299
|
var buildLine = (params) => {
|
|
300
|
+
var _a, _b;
|
|
293
301
|
const { fromPort, node, toPort, linesManager } = params;
|
|
294
302
|
const portsData = node.getData(WorkflowNodePortsData);
|
|
295
303
|
if (!portsData) {
|
|
296
304
|
return;
|
|
297
305
|
}
|
|
298
|
-
const shouldBuildFromLine = portsData.inputPorts
|
|
306
|
+
const shouldBuildFromLine = ((_a = portsData.inputPorts) == null ? void 0 : _a.length) > 0;
|
|
299
307
|
if (fromPort && shouldBuildFromLine) {
|
|
300
308
|
const toTargetPort = portsData.inputPorts[0];
|
|
301
309
|
const isSingleInput = portsData.inputPorts.length === 1;
|
|
@@ -306,7 +314,7 @@ var buildLine = (params) => {
|
|
|
306
314
|
toPort: isSingleInput ? void 0 : toTargetPort.id
|
|
307
315
|
});
|
|
308
316
|
}
|
|
309
|
-
const shouldBuildToLine = portsData.outputPorts
|
|
317
|
+
const shouldBuildToLine = ((_b = portsData.outputPorts) == null ? void 0 : _b.length) > 0;
|
|
310
318
|
if (toPort && shouldBuildToLine) {
|
|
311
319
|
const fromTargetPort = portsData.outputPorts[0];
|
|
312
320
|
linesManager.createLine({
|
|
@@ -320,9 +328,10 @@ var buildLine = (params) => {
|
|
|
320
328
|
|
|
321
329
|
// src/utils/adjust-node-position.ts
|
|
322
330
|
var adjustNodePosition = (params) => {
|
|
331
|
+
var _a;
|
|
323
332
|
const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;
|
|
324
333
|
const register = document.getNodeRegistry(nodeType);
|
|
325
|
-
const size = register
|
|
334
|
+
const size = (_a = register == null ? void 0 : register.meta) == null ? void 0 : _a.size;
|
|
326
335
|
let adjustedPosition = position;
|
|
327
336
|
if (!size) {
|
|
328
337
|
adjustedPosition = position;
|
|
@@ -399,7 +408,7 @@ var WorkflowNodePanelService = class {
|
|
|
399
408
|
}),
|
|
400
409
|
onSelect: async (panelParams) => {
|
|
401
410
|
const node = await this.addNode(callParams, panelParams);
|
|
402
|
-
afterAddNode
|
|
411
|
+
afterAddNode == null ? void 0 : afterAddNode(node);
|
|
403
412
|
if (!enableMultiAdd) {
|
|
404
413
|
resolve(node);
|
|
405
414
|
} else if (node) {
|
|
@@ -472,8 +481,8 @@ var WorkflowNodePanelService = class {
|
|
|
472
481
|
const node = this.document.createWorkflowNodeByType(
|
|
473
482
|
nodeType,
|
|
474
483
|
nodePosition,
|
|
475
|
-
nodeJSON
|
|
476
|
-
containerNode
|
|
484
|
+
nodeJSON != null ? nodeJSON : {},
|
|
485
|
+
containerNode == null ? void 0 : containerNode.id
|
|
477
486
|
);
|
|
478
487
|
if (!node) {
|
|
479
488
|
return;
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create-plugin.ts","../../src/service.ts","../../src/utils/wait-node-render.ts","../../src/utils/update-sub-nodes-position.ts","../../src/utils/get-port-box.ts","../../src/utils/is-container.ts","../../src/utils/sub-position-offset.ts","../../src/utils/rect-distance.ts","../../src/utils/greater-or-less.ts","../../src/utils/get-sub-nodes.ts","../../src/utils/sub-nodes-auto-offset.ts","../../src/utils/get-container-node.ts","../../src/utils/build-line.ts","../../src/utils/adjust-node-position.ts","../../src/utils/index.ts","../../src/layer.tsx"],"sourcesContent":["import { definePluginCreator, type PluginBindConfig, type PluginContext } from '@flowgram.ai/core';\n\nimport { NodePanelPluginOptions } from './type';\nimport { WorkflowNodePanelService } from './service';\nimport { WorkflowNodePanelLayer } from './layer';\n\nexport const createFreeNodePanelPlugin = definePluginCreator({\n onBind({ bind }: PluginBindConfig) {\n bind(WorkflowNodePanelService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: NodePanelPluginOptions) => {\n ctx.playground.registerLayer(WorkflowNodePanelLayer, {\n renderer: opts.renderer,\n });\n },\n onDispose: (ctx: PluginContext) => {\n const nodePanelService = ctx.get(WorkflowNodePanelService);\n nodePanelService.dispose();\n },\n});\n","import { inject, injectable } from 'inversify';\nimport { DisposableCollection } from '@flowgram.ai/utils';\nimport type { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { WorkflowNodePanelUtils } from './utils';\nimport type {\n CallNodePanel,\n CallNodePanelParams,\n NodePanelCallParams,\n NodePanelResult,\n} from './type';\n\n/**\n * 添加节点面板服务\n */\n@injectable()\nexport class WorkflowNodePanelService {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(WorkflowDragService)\n private readonly dragService: WorkflowDragService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n @inject(WorkflowLinesManager)\n private readonly linesManager: WorkflowLinesManager;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n @inject(HistoryService) private readonly historyService: HistoryService;\n\n private readonly toDispose = new DisposableCollection();\n\n public callNodePanel: CallNodePanel = async () => undefined;\n\n /** 销毁 */\n public dispose(): void {\n this.toDispose.dispose();\n }\n\n public setCallNodePanel(callNodePanel: CallNodePanel) {\n this.callNodePanel = callNodePanel;\n }\n\n /** 唤起节点面板 */\n public async call(\n callParams: NodePanelCallParams\n ): Promise<WorkflowNodeEntity | WorkflowNodeEntity[] | undefined> {\n const {\n panelPosition,\n fromPort,\n enableMultiAdd = false,\n panelProps = {},\n containerNode,\n afterAddNode,\n } = callParams;\n\n if (!panelPosition || this.playgroundConfig.readonly) {\n return;\n }\n\n const nodes: WorkflowNodeEntity[] = [];\n\n return new Promise((resolve) => {\n this.callNodePanel({\n position: panelPosition,\n enableMultiAdd,\n panelProps,\n containerNode: WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode,\n }),\n onSelect: async (panelParams?: NodePanelResult) => {\n const node = await this.addNode(callParams, panelParams);\n afterAddNode?.(node);\n if (!enableMultiAdd) {\n resolve(node);\n } else if (node) {\n nodes.push(node);\n }\n },\n onClose: () => {\n resolve(enableMultiAdd ? nodes : undefined);\n },\n });\n });\n }\n\n /**\n * 唤起单选面板\n */\n public async singleSelectNodePanel(\n params: Omit<CallNodePanelParams, 'onSelect' | 'onClose' | 'enableMultiAdd'>\n ): Promise<NodePanelResult | undefined> {\n return new Promise((resolve) => {\n this.callNodePanel({\n ...params,\n enableMultiAdd: false,\n onSelect: async (panelParams?: NodePanelResult) => {\n resolve(panelParams);\n },\n onClose: () => {\n resolve(undefined);\n },\n });\n });\n }\n\n /** 添加节点 */\n private async addNode(\n callParams: NodePanelCallParams,\n panelParams: NodePanelResult\n ): Promise<WorkflowNodeEntity | undefined> {\n const {\n panelPosition,\n fromPort,\n toPort,\n canAddNode,\n autoOffsetPadding = {\n x: 100,\n y: 100,\n },\n enableBuildLine = false,\n enableSelectPosition = false,\n enableAutoOffset = false,\n enableDragNode = false,\n } = callParams;\n\n if (!panelPosition || !panelParams) {\n return;\n }\n\n const { nodeType, selectEvent, nodeJSON } = panelParams;\n\n const containerNode = WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode: callParams.containerNode,\n });\n\n // 判断是否可以添加节点\n if (canAddNode) {\n const canAdd = canAddNode({ nodeType, containerNode });\n if (!canAdd) {\n return;\n }\n }\n\n // 鼠标选择坐标\n const selectPosition = this.playgroundConfig.getPosFromMouseEvent(selectEvent);\n\n // 自定义坐标\n const nodePosition: PositionSchema = callParams.customPosition\n ? callParams.customPosition({ nodeType, selectPosition })\n : WorkflowNodePanelUtils.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n document: this.document,\n dragService: this.dragService,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = this.document.createWorkflowNodeByType(\n nodeType,\n nodePosition,\n nodeJSON ?? ({} as WorkflowNodeJSON),\n containerNode?.id\n );\n\n if (!node) {\n return;\n }\n\n // 后续节点偏移\n if (enableAutoOffset && fromPort && toPort) {\n WorkflowNodePanelUtils.subNodesAutoOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n containerNode,\n historyService: this.historyService,\n dragService: this.dragService,\n linesManager: this.linesManager,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await WorkflowNodePanelUtils.waitNodeRender();\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n WorkflowNodePanelUtils.buildLine({\n fromPort,\n node,\n toPort,\n linesManager: this.linesManager,\n });\n }\n\n // 开始拖拽节点\n if (enableDragNode) {\n this.selectService.selectNode(node);\n this.dragService.startDragSelectedNodes(selectEvent);\n }\n\n return node;\n }\n}\n","import { delay } from '@flowgram.ai/free-layout-core';\n\nexport type IWaitNodeRender = () => Promise<void>;\n\nexport const waitNodeRender: IWaitNodeRender = async () => {\n await delay(20);\n};\n","import { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowNodeEntity,\n WorkflowPortEntity,\n WorkflowDragService,\n} from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { getPortBox } from './get-port-box';\n\nexport type IUpdateSubSequentNodesPosition = (params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n}) => void;\n\n/** 更新后续节点位置 */\nexport const updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition = (params) => {\n const {\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset,\n historyService,\n dragService,\n } = params;\n if (!offset || !toPort) {\n return;\n }\n // 更新后续节点位置\n const subsequentNodesPositions = subsequentNodes.map((node) => {\n const nodeTrans = node.getData(TransformData);\n return {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n };\n });\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: subsequentNodes.map((node) => node.id),\n value: subsequentNodesPositions.map((position) => ({\n x: position.x + offset.x,\n y: position.y + offset.y,\n })),\n oldValue: subsequentNodesPositions,\n },\n });\n // 新增节点坐标需重新计算\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort, offset);\n const nodeTrans = node.getData(TransformData);\n let nodePos: PositionSchema = {\n x: (fromBox.center.x + toBox.center.x) / 2,\n y: (fromBox.y + toBox.y) / 2,\n };\n if (containerNode) {\n nodePos = dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: [node.id],\n value: [nodePos],\n oldValue: [\n {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n },\n ],\n },\n });\n};\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { isContainer } from './is-container';\n\nexport type IGetPortBox = (port: WorkflowPortEntity, offset?: IPoint) => Rectangle;\n\n/** 获取端口矩形 */\nexport const getPortBox: IGetPortBox = (\n port: WorkflowPortEntity,\n offset: IPoint = { x: 0, y: 0 }\n): Rectangle => {\n const node = port.node;\n if (isContainer(node)) {\n // 子画布内部端口需要虚拟节点\n const { point } = port;\n if (port.portType === 'input') {\n return new Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);\n }\n return new Rectangle(point.x - 300, point.y - 50, 300, 100);\n }\n const box = node.getData(FlowNodeTransformData).bounds;\n return box;\n};\n","import { WorkflowNodeEntity, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\n\n/** 是否容器节点 */\nexport const isContainer = (node?: WorkflowNodeEntity): boolean =>\n node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { rectDistance } from './rect-distance';\nimport { isGreaterThan, isLessThan } from './greater-or-less';\nimport { getPortBox } from './get-port-box';\n\nexport interface XYSchema {\n x: number;\n y: number;\n}\n\nexport type ISubPositionOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: XYSchema;\n}) => XYSchema | undefined;\n\n/** 后续节点位置偏移 */\nexport const subPositionOffset: ISubPositionOffset = (params) => {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort);\n\n const nodeTrans = node.getData(FlowNodeTransformData);\n const nodeSize = node.getNodeMeta()?.size ?? {\n width: nodeTrans.bounds.width,\n height: nodeTrans.bounds.height,\n };\n\n // 最小距离\n const minDistance: IPoint = {\n x: nodeSize.width + padding.x,\n y: nodeSize.height + padding.y,\n };\n // from 与 to 的距离\n const boxDistance = rectDistance(fromBox, toBox);\n\n // 需要的偏移量\n const neededOffset: IPoint = {\n x: isGreaterThan(boxDistance.x, minDistance.x) ? 0 : minDistance.x - boxDistance.x,\n y: isGreaterThan(boxDistance.y, minDistance.y) ? 0 : minDistance.y - boxDistance.y,\n };\n\n // 至少有一个方向满足要求,无需偏移\n if (neededOffset.x === 0 || neededOffset.y === 0) {\n return;\n }\n\n // 是否存在相交\n const intersection = {\n // 这里没有写反,Rectangle内置的算法是反的\n vertical: Rectangle.intersects(fromBox, toBox, 'horizontal'),\n horizontal: Rectangle.intersects(fromBox, toBox, 'vertical'),\n };\n\n // 初始化偏移量\n let offsetX: number = 0;\n let offsetY: number = 0;\n\n if (!intersection.horizontal) {\n // 水平不相交,需要加垂直方向的偏移\n if (isGreaterThan(toBox.center.y, fromBox.center.y)) {\n // B在A下方\n offsetY = neededOffset.y;\n } else if (isLessThan(toBox.center.y, fromBox.center.y)) {\n // B在A上方\n offsetY = -neededOffset.y;\n }\n }\n\n if (!intersection.vertical) {\n // 垂直不相交,需要加水平方向的偏移\n if (isGreaterThan(toBox.center.x, fromBox.center.x)) {\n // B在A右侧\n offsetX = neededOffset.x;\n } else if (isLessThan(toBox.center.x, fromBox.center.x)) {\n // B在A左侧\n offsetX = -neededOffset.x;\n }\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n};\n","import { Rectangle, IPoint } from '@flowgram.ai/utils';\n\nexport type IRectDistance = (rectA: Rectangle, rectB: Rectangle) => IPoint;\n\n/** 矩形间距 */\nexport const rectDistance: IRectDistance = (rectA, rectB) => {\n // 计算 x 轴距离\n const distanceX = Math.abs(Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left));\n // 计算 y 轴距离\n const distanceY = Math.abs(Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top));\n if (Rectangle.intersects(rectA, rectB)) {\n // 相交距离为负\n return {\n x: -distanceX,\n y: -distanceY,\n };\n }\n return {\n x: distanceX,\n y: distanceY,\n };\n};\n","/**\n * 检查 a 是否大于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 大于 b 则返回 true,否则返回 false\n */\nexport const isGreaterThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著大于 b\n return a - b > EPSILON;\n};\n\n/**\n * 检查 a 是否小于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 小于 b 则返回 true,否则返回 false\n */\nexport const isLessThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著小于 b\n return b - a > EPSILON;\n};\n","import { WorkflowNodeEntity, WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetSubsequentNodes = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n}) => WorkflowNodeEntity[];\n\n/** 获取后续节点 */\nexport const getSubsequentNodes: IGetSubsequentNodes = (params) => {\n const { node, linesManager } = params;\n if (isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.blocks ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n linesManager.getAllLines().forEach((line) => {\n if (!linesMap.has(line.from.id)) {\n linesMap.set(line.from.id, []);\n }\n if (\n !line.to?.id ||\n isContainer(line.to) // 子画布内部成环\n ) {\n return;\n }\n linesMap.get(line.from.id)?.push(line.to.id);\n });\n\n const bfs = (nodeId: string) => {\n if (linkedBrothers.has(nodeId)) {\n return;\n }\n linkedBrothers.add(nodeId);\n const nextNodes = linesMap.get(nodeId) ?? [];\n nextNodes.forEach(bfs);\n };\n\n bfs(node.id);\n\n const subsequentNodes = brothers.filter((node) => linkedBrothers.has(node.id));\n return subsequentNodes;\n};\n","import {\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\n\nimport { updateSubSequentNodesPosition } from './update-sub-nodes-position';\nimport { subPositionOffset, XYSchema } from './sub-position-offset';\nimport { getSubsequentNodes } from './get-sub-nodes';\n\nexport type ISubNodesAutoOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding?: XYSchema;\n linesManager: WorkflowLinesManager;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n}) => void;\n\nexport const subNodesAutoOffset: ISubNodesAutoOffset = (params) => {\n const {\n node,\n fromPort,\n toPort,\n linesManager,\n historyService,\n dragService,\n containerNode,\n padding = {\n x: 100,\n y: 100,\n },\n } = params;\n const subOffset = subPositionOffset({\n node,\n fromPort,\n toPort,\n padding,\n });\n const subsequentNodes = getSubsequentNodes({\n node: toPort.node,\n linesManager,\n });\n updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n historyService,\n dragService,\n });\n};\n","import { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetContainerNode = (params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => WorkflowNodeEntity | undefined;\n\nexport const getContainerNode: IGetContainerNode = (params) => {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n};\n","import {\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowNodePortsData,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IBuildLine = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => void;\n\n/** 建立连线 */\nexport const buildLine: IBuildLine = (params) => {\n const { fromPort, node, toPort, linesManager } = params;\n const portsData = node.getData(WorkflowNodePortsData);\n if (!portsData) {\n return;\n }\n\n const shouldBuildFromLine = portsData.inputPorts?.length > 0;\n if (fromPort && shouldBuildFromLine) {\n const toTargetPort = portsData.inputPorts[0];\n const isSingleInput = portsData.inputPorts.length === 1;\n linesManager.createLine({\n from: fromPort.node.id,\n fromPort: fromPort.portID,\n to: node.id,\n toPort: isSingleInput ? undefined : toTargetPort.id,\n });\n }\n const shouldBuildToLine = portsData.outputPorts?.length > 0;\n if (toPort && shouldBuildToLine) {\n const fromTargetPort = portsData.outputPorts[0];\n linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n};\n","import { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IAdjustNodePosition = (params: {\n nodeType: string;\n position: PositionSchema;\n document: WorkflowDocument;\n dragService: WorkflowDragService;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n}) => PositionSchema;\n\n/** 调整节点坐标 */\nexport const adjustNodePosition: IAdjustNodePosition = (params) => {\n const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;\n const register = document.getNodeRegistry(nodeType);\n const size = register?.meta?.size;\n let adjustedPosition = position;\n if (!size) {\n adjustedPosition = position;\n }\n // 计算坐标偏移\n else if (fromPort && toPort) {\n // 输入输出\n adjustedPosition = {\n x: position.x,\n y: position.y - size.height / 2,\n };\n } else if (fromPort && !toPort) {\n // 仅输入\n adjustedPosition = {\n x: position.x + size.width / 2,\n y: position.y - size.height / 2,\n };\n } else if (!fromPort && toPort) {\n // 仅输出\n adjustedPosition = {\n x: position.x - size.width / 2,\n y: position.y - size.height / 2,\n };\n } else {\n adjustedPosition = position;\n }\n return dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n};\n","import { IWaitNodeRender, waitNodeRender } from './wait-node-render';\nimport {\n updateSubSequentNodesPosition,\n IUpdateSubSequentNodesPosition,\n} from './update-sub-nodes-position';\nimport { subPositionOffset, ISubPositionOffset } from './sub-position-offset';\nimport { subNodesAutoOffset, ISubNodesAutoOffset } from './sub-nodes-auto-offset';\nimport { rectDistance, IRectDistance } from './rect-distance';\nimport { getSubsequentNodes, IGetSubsequentNodes } from './get-sub-nodes';\nimport { getPortBox, IGetPortBox } from './get-port-box';\nimport { getContainerNode, IGetContainerNode } from './get-container-node';\nimport { buildLine, IBuildLine } from './build-line';\nimport { adjustNodePosition, IAdjustNodePosition } from './adjust-node-position';\n\nexport interface IWorkflowNodePanelUtils {\n adjustNodePosition: IAdjustNodePosition;\n buildLine: IBuildLine;\n getPortBox: IGetPortBox;\n getSubsequentNodes: IGetSubsequentNodes;\n getContainerNode: IGetContainerNode;\n rectDistance: IRectDistance;\n subNodesAutoOffset: ISubNodesAutoOffset;\n subPositionOffset: ISubPositionOffset;\n updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition;\n waitNodeRender: IWaitNodeRender;\n}\n\nexport const WorkflowNodePanelUtils: IWorkflowNodePanelUtils = {\n adjustNodePosition,\n buildLine,\n getPortBox,\n getSubsequentNodes,\n getContainerNode,\n rectDistance,\n subNodesAutoOffset,\n subPositionOffset,\n updateSubSequentNodesPosition,\n waitNodeRender,\n};\n","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { Layer } from '@flowgram.ai/core';\n\nimport type {\n CallNodePanelParams,\n NodePanelLayerOptions,\n NodePanelRenderProps,\n NodePanelResult,\n} from './type';\nimport { WorkflowNodePanelService } from './service';\n\nexport class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {\n public static type = 'WorkflowNodePanelLayer';\n\n @inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;\n\n public node: HTMLDivElement;\n\n private renderList: Map<string, NodePanelRenderProps>;\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');\n this.node.style.zIndex = '9999';\n this.renderList = new Map();\n }\n\n public onReady(): void {\n this.service.setCallNodePanel(this.call.bind(this));\n }\n\n public onZoom(zoom: number): void {\n this.node.style.transform = `scale(${zoom})`;\n }\n\n public render(): JSX.Element {\n const NodePanelRender = this.options.renderer;\n return (\n <>\n {Array.from(this.renderList.keys()).map((taskId) => {\n const renderProps = this.renderList.get(taskId)!;\n return <NodePanelRender key={taskId} {...renderProps} />;\n })}\n </>\n );\n }\n\n private async call(params: CallNodePanelParams): Promise<void> {\n const taskId = nanoid();\n const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;\n return new Promise((resolve) => {\n const unmount = () => {\n // 清理挂载的组件\n this.renderList.delete(taskId);\n this.render();\n resolve();\n };\n const handleClose = () => {\n unmount();\n onClose();\n };\n const handleSelect = (params?: NodePanelResult) => {\n onSelect(params);\n if (!enableMultiAdd) {\n unmount();\n }\n };\n const renderProps: NodePanelRenderProps = {\n ...params,\n panelProps,\n onSelect: handleSelect,\n onClose: handleClose,\n };\n this.renderList.set(taskId, renderProps);\n this.render();\n });\n }\n}\n"],"mappings":"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","names":["WorkflowLinesManager","HistoryService","node","nodeTrans","Rectangle","FlowNodeTransformData","Rectangle","FlowNodeTransformData","Rectangle","node","WorkflowLinesManager","HistoryService","inject","params","inject"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-plugin.ts","../../src/service.ts","../../src/utils/wait-node-render.ts","../../src/utils/update-sub-nodes-position.ts","../../src/utils/get-port-box.ts","../../src/utils/is-container.ts","../../src/utils/sub-position-offset.ts","../../src/utils/rect-distance.ts","../../src/utils/greater-or-less.ts","../../src/utils/get-sub-nodes.ts","../../src/utils/sub-nodes-auto-offset.ts","../../src/utils/get-container-node.ts","../../src/utils/build-line.ts","../../src/utils/adjust-node-position.ts","../../src/utils/index.ts","../../src/layer.tsx"],"sourcesContent":["import { definePluginCreator, type PluginBindConfig, type PluginContext } from '@flowgram.ai/core';\n\nimport { NodePanelPluginOptions } from './type';\nimport { WorkflowNodePanelService } from './service';\nimport { WorkflowNodePanelLayer } from './layer';\n\nexport const createFreeNodePanelPlugin = definePluginCreator({\n onBind({ bind }: PluginBindConfig) {\n bind(WorkflowNodePanelService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: NodePanelPluginOptions) => {\n ctx.playground.registerLayer(WorkflowNodePanelLayer, {\n renderer: opts.renderer,\n });\n },\n onDispose: (ctx: PluginContext) => {\n const nodePanelService = ctx.get(WorkflowNodePanelService);\n nodePanelService.dispose();\n },\n});\n","import { inject, injectable } from 'inversify';\nimport { DisposableCollection } from '@flowgram.ai/utils';\nimport type { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { WorkflowNodePanelUtils } from './utils';\nimport type {\n CallNodePanel,\n CallNodePanelParams,\n NodePanelCallParams,\n NodePanelResult,\n} from './type';\n\n/**\n * 添加节点面板服务\n */\n@injectable()\nexport class WorkflowNodePanelService {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(WorkflowDragService)\n private readonly dragService: WorkflowDragService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n @inject(WorkflowLinesManager)\n private readonly linesManager: WorkflowLinesManager;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n @inject(HistoryService) private readonly historyService: HistoryService;\n\n private readonly toDispose = new DisposableCollection();\n\n public callNodePanel: CallNodePanel = async () => undefined;\n\n /** 销毁 */\n public dispose(): void {\n this.toDispose.dispose();\n }\n\n public setCallNodePanel(callNodePanel: CallNodePanel) {\n this.callNodePanel = callNodePanel;\n }\n\n /** 唤起节点面板 */\n public async call(\n callParams: NodePanelCallParams\n ): Promise<WorkflowNodeEntity | WorkflowNodeEntity[] | undefined> {\n const {\n panelPosition,\n fromPort,\n enableMultiAdd = false,\n panelProps = {},\n containerNode,\n afterAddNode,\n } = callParams;\n\n if (!panelPosition || this.playgroundConfig.readonly) {\n return;\n }\n\n const nodes: WorkflowNodeEntity[] = [];\n\n return new Promise((resolve) => {\n this.callNodePanel({\n position: panelPosition,\n enableMultiAdd,\n panelProps,\n containerNode: WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode,\n }),\n onSelect: async (panelParams?: NodePanelResult) => {\n const node = await this.addNode(callParams, panelParams);\n afterAddNode?.(node);\n if (!enableMultiAdd) {\n resolve(node);\n } else if (node) {\n nodes.push(node);\n }\n },\n onClose: () => {\n resolve(enableMultiAdd ? nodes : undefined);\n },\n });\n });\n }\n\n /**\n * 唤起单选面板\n */\n public async singleSelectNodePanel(\n params: Omit<CallNodePanelParams, 'onSelect' | 'onClose' | 'enableMultiAdd'>\n ): Promise<NodePanelResult | undefined> {\n return new Promise((resolve) => {\n this.callNodePanel({\n ...params,\n enableMultiAdd: false,\n onSelect: async (panelParams?: NodePanelResult) => {\n resolve(panelParams);\n },\n onClose: () => {\n resolve(undefined);\n },\n });\n });\n }\n\n /** 添加节点 */\n private async addNode(\n callParams: NodePanelCallParams,\n panelParams: NodePanelResult\n ): Promise<WorkflowNodeEntity | undefined> {\n const {\n panelPosition,\n fromPort,\n toPort,\n canAddNode,\n autoOffsetPadding = {\n x: 100,\n y: 100,\n },\n enableBuildLine = false,\n enableSelectPosition = false,\n enableAutoOffset = false,\n enableDragNode = false,\n } = callParams;\n\n if (!panelPosition || !panelParams) {\n return;\n }\n\n const { nodeType, selectEvent, nodeJSON } = panelParams;\n\n const containerNode = WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode: callParams.containerNode,\n });\n\n // 判断是否可以添加节点\n if (canAddNode) {\n const canAdd = canAddNode({ nodeType, containerNode });\n if (!canAdd) {\n return;\n }\n }\n\n // 鼠标选择坐标\n const selectPosition = this.playgroundConfig.getPosFromMouseEvent(selectEvent);\n\n // 自定义坐标\n const nodePosition: PositionSchema = callParams.customPosition\n ? callParams.customPosition({ nodeType, selectPosition })\n : WorkflowNodePanelUtils.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n document: this.document,\n dragService: this.dragService,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = this.document.createWorkflowNodeByType(\n nodeType,\n nodePosition,\n nodeJSON ?? ({} as WorkflowNodeJSON),\n containerNode?.id\n );\n\n if (!node) {\n return;\n }\n\n // 后续节点偏移\n if (enableAutoOffset && fromPort && toPort) {\n WorkflowNodePanelUtils.subNodesAutoOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n containerNode,\n historyService: this.historyService,\n dragService: this.dragService,\n linesManager: this.linesManager,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await WorkflowNodePanelUtils.waitNodeRender();\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n WorkflowNodePanelUtils.buildLine({\n fromPort,\n node,\n toPort,\n linesManager: this.linesManager,\n });\n }\n\n // 开始拖拽节点\n if (enableDragNode) {\n this.selectService.selectNode(node);\n this.dragService.startDragSelectedNodes(selectEvent);\n }\n\n return node;\n }\n}\n","import { delay } from '@flowgram.ai/free-layout-core';\n\nexport type IWaitNodeRender = () => Promise<void>;\n\nexport const waitNodeRender: IWaitNodeRender = async () => {\n await delay(20);\n};\n","import { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowNodeEntity,\n WorkflowPortEntity,\n WorkflowDragService,\n} from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { getPortBox } from './get-port-box';\n\nexport type IUpdateSubSequentNodesPosition = (params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n}) => void;\n\n/** 更新后续节点位置 */\nexport const updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition = (params) => {\n const {\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset,\n historyService,\n dragService,\n } = params;\n if (!offset || !toPort) {\n return;\n }\n // 更新后续节点位置\n const subsequentNodesPositions = subsequentNodes.map((node) => {\n const nodeTrans = node.getData(TransformData);\n return {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n };\n });\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: subsequentNodes.map((node) => node.id),\n value: subsequentNodesPositions.map((position) => ({\n x: position.x + offset.x,\n y: position.y + offset.y,\n })),\n oldValue: subsequentNodesPositions,\n },\n });\n // 新增节点坐标需重新计算\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort, offset);\n const nodeTrans = node.getData(TransformData);\n let nodePos: PositionSchema = {\n x: (fromBox.center.x + toBox.center.x) / 2,\n y: (fromBox.y + toBox.y) / 2,\n };\n if (containerNode) {\n nodePos = dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: [node.id],\n value: [nodePos],\n oldValue: [\n {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n },\n ],\n },\n });\n};\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { isContainer } from './is-container';\n\nexport type IGetPortBox = (port: WorkflowPortEntity, offset?: IPoint) => Rectangle;\n\n/** 获取端口矩形 */\nexport const getPortBox: IGetPortBox = (\n port: WorkflowPortEntity,\n offset: IPoint = { x: 0, y: 0 }\n): Rectangle => {\n const node = port.node;\n if (isContainer(node)) {\n // 子画布内部端口需要虚拟节点\n const { point } = port;\n if (port.portType === 'input') {\n return new Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);\n }\n return new Rectangle(point.x - 300, point.y - 50, 300, 100);\n }\n const box = node.getData(FlowNodeTransformData).bounds;\n return box;\n};\n","import { WorkflowNodeEntity, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\n\n/** 是否容器节点 */\nexport const isContainer = (node?: WorkflowNodeEntity): boolean =>\n node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { rectDistance } from './rect-distance';\nimport { isGreaterThan, isLessThan } from './greater-or-less';\nimport { getPortBox } from './get-port-box';\n\nexport interface XYSchema {\n x: number;\n y: number;\n}\n\nexport type ISubPositionOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: XYSchema;\n}) => XYSchema | undefined;\n\n/** 后续节点位置偏移 */\nexport const subPositionOffset: ISubPositionOffset = (params) => {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort);\n\n const nodeTrans = node.getData(FlowNodeTransformData);\n const nodeSize = node.getNodeMeta()?.size ?? {\n width: nodeTrans.bounds.width,\n height: nodeTrans.bounds.height,\n };\n\n // 最小距离\n const minDistance: IPoint = {\n x: nodeSize.width + padding.x,\n y: nodeSize.height + padding.y,\n };\n // from 与 to 的距离\n const boxDistance = rectDistance(fromBox, toBox);\n\n // 需要的偏移量\n const neededOffset: IPoint = {\n x: isGreaterThan(boxDistance.x, minDistance.x) ? 0 : minDistance.x - boxDistance.x,\n y: isGreaterThan(boxDistance.y, minDistance.y) ? 0 : minDistance.y - boxDistance.y,\n };\n\n // 至少有一个方向满足要求,无需偏移\n if (neededOffset.x === 0 || neededOffset.y === 0) {\n return;\n }\n\n // 是否存在相交\n const intersection = {\n // 这里没有写反,Rectangle内置的算法是反的\n vertical: Rectangle.intersects(fromBox, toBox, 'horizontal'),\n horizontal: Rectangle.intersects(fromBox, toBox, 'vertical'),\n };\n\n // 初始化偏移量\n let offsetX: number = 0;\n let offsetY: number = 0;\n\n if (!intersection.horizontal) {\n // 水平不相交,需要加垂直方向的偏移\n if (isGreaterThan(toBox.center.y, fromBox.center.y)) {\n // B在A下方\n offsetY = neededOffset.y;\n } else if (isLessThan(toBox.center.y, fromBox.center.y)) {\n // B在A上方\n offsetY = -neededOffset.y;\n }\n }\n\n if (!intersection.vertical) {\n // 垂直不相交,需要加水平方向的偏移\n if (isGreaterThan(toBox.center.x, fromBox.center.x)) {\n // B在A右侧\n offsetX = neededOffset.x;\n } else if (isLessThan(toBox.center.x, fromBox.center.x)) {\n // B在A左侧\n offsetX = -neededOffset.x;\n }\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n};\n","import { Rectangle, IPoint } from '@flowgram.ai/utils';\n\nexport type IRectDistance = (rectA: Rectangle, rectB: Rectangle) => IPoint;\n\n/** 矩形间距 */\nexport const rectDistance: IRectDistance = (rectA, rectB) => {\n // 计算 x 轴距离\n const distanceX = Math.abs(Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left));\n // 计算 y 轴距离\n const distanceY = Math.abs(Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top));\n if (Rectangle.intersects(rectA, rectB)) {\n // 相交距离为负\n return {\n x: -distanceX,\n y: -distanceY,\n };\n }\n return {\n x: distanceX,\n y: distanceY,\n };\n};\n","/**\n * 检查 a 是否大于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 大于 b 则返回 true,否则返回 false\n */\nexport const isGreaterThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著大于 b\n return a - b > EPSILON;\n};\n\n/**\n * 检查 a 是否小于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 小于 b 则返回 true,否则返回 false\n */\nexport const isLessThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著小于 b\n return b - a > EPSILON;\n};\n","import { WorkflowNodeEntity, WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetSubsequentNodes = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n}) => WorkflowNodeEntity[];\n\n/** 获取后续节点 */\nexport const getSubsequentNodes: IGetSubsequentNodes = (params) => {\n const { node, linesManager } = params;\n if (isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.blocks ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n linesManager.getAllLines().forEach((line) => {\n if (!linesMap.has(line.from.id)) {\n linesMap.set(line.from.id, []);\n }\n if (\n !line.to?.id ||\n isContainer(line.to) // 子画布内部成环\n ) {\n return;\n }\n linesMap.get(line.from.id)?.push(line.to.id);\n });\n\n const bfs = (nodeId: string) => {\n if (linkedBrothers.has(nodeId)) {\n return;\n }\n linkedBrothers.add(nodeId);\n const nextNodes = linesMap.get(nodeId) ?? [];\n nextNodes.forEach(bfs);\n };\n\n bfs(node.id);\n\n const subsequentNodes = brothers.filter((node) => linkedBrothers.has(node.id));\n return subsequentNodes;\n};\n","import {\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\n\nimport { updateSubSequentNodesPosition } from './update-sub-nodes-position';\nimport { subPositionOffset, XYSchema } from './sub-position-offset';\nimport { getSubsequentNodes } from './get-sub-nodes';\n\nexport type ISubNodesAutoOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding?: XYSchema;\n linesManager: WorkflowLinesManager;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n}) => void;\n\nexport const subNodesAutoOffset: ISubNodesAutoOffset = (params) => {\n const {\n node,\n fromPort,\n toPort,\n linesManager,\n historyService,\n dragService,\n containerNode,\n padding = {\n x: 100,\n y: 100,\n },\n } = params;\n const subOffset = subPositionOffset({\n node,\n fromPort,\n toPort,\n padding,\n });\n const subsequentNodes = getSubsequentNodes({\n node: toPort.node,\n linesManager,\n });\n updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n historyService,\n dragService,\n });\n};\n","import { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetContainerNode = (params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => WorkflowNodeEntity | undefined;\n\nexport const getContainerNode: IGetContainerNode = (params) => {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n};\n","import {\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowNodePortsData,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IBuildLine = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => void;\n\n/** 建立连线 */\nexport const buildLine: IBuildLine = (params) => {\n const { fromPort, node, toPort, linesManager } = params;\n const portsData = node.getData(WorkflowNodePortsData);\n if (!portsData) {\n return;\n }\n\n const shouldBuildFromLine = portsData.inputPorts?.length > 0;\n if (fromPort && shouldBuildFromLine) {\n const toTargetPort = portsData.inputPorts[0];\n const isSingleInput = portsData.inputPorts.length === 1;\n linesManager.createLine({\n from: fromPort.node.id,\n fromPort: fromPort.portID,\n to: node.id,\n toPort: isSingleInput ? undefined : toTargetPort.id,\n });\n }\n const shouldBuildToLine = portsData.outputPorts?.length > 0;\n if (toPort && shouldBuildToLine) {\n const fromTargetPort = portsData.outputPorts[0];\n linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n};\n","import { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IAdjustNodePosition = (params: {\n nodeType: string;\n position: PositionSchema;\n document: WorkflowDocument;\n dragService: WorkflowDragService;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n}) => PositionSchema;\n\n/** 调整节点坐标 */\nexport const adjustNodePosition: IAdjustNodePosition = (params) => {\n const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;\n const register = document.getNodeRegistry(nodeType);\n const size = register?.meta?.size;\n let adjustedPosition = position;\n if (!size) {\n adjustedPosition = position;\n }\n // 计算坐标偏移\n else if (fromPort && toPort) {\n // 输入输出\n adjustedPosition = {\n x: position.x,\n y: position.y - size.height / 2,\n };\n } else if (fromPort && !toPort) {\n // 仅输入\n adjustedPosition = {\n x: position.x + size.width / 2,\n y: position.y - size.height / 2,\n };\n } else if (!fromPort && toPort) {\n // 仅输出\n adjustedPosition = {\n x: position.x - size.width / 2,\n y: position.y - size.height / 2,\n };\n } else {\n adjustedPosition = position;\n }\n return dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n};\n","import { IWaitNodeRender, waitNodeRender } from './wait-node-render';\nimport {\n updateSubSequentNodesPosition,\n IUpdateSubSequentNodesPosition,\n} from './update-sub-nodes-position';\nimport { subPositionOffset, ISubPositionOffset } from './sub-position-offset';\nimport { subNodesAutoOffset, ISubNodesAutoOffset } from './sub-nodes-auto-offset';\nimport { rectDistance, IRectDistance } from './rect-distance';\nimport { getSubsequentNodes, IGetSubsequentNodes } from './get-sub-nodes';\nimport { getPortBox, IGetPortBox } from './get-port-box';\nimport { getContainerNode, IGetContainerNode } from './get-container-node';\nimport { buildLine, IBuildLine } from './build-line';\nimport { adjustNodePosition, IAdjustNodePosition } from './adjust-node-position';\n\nexport interface IWorkflowNodePanelUtils {\n adjustNodePosition: IAdjustNodePosition;\n buildLine: IBuildLine;\n getPortBox: IGetPortBox;\n getSubsequentNodes: IGetSubsequentNodes;\n getContainerNode: IGetContainerNode;\n rectDistance: IRectDistance;\n subNodesAutoOffset: ISubNodesAutoOffset;\n subPositionOffset: ISubPositionOffset;\n updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition;\n waitNodeRender: IWaitNodeRender;\n}\n\nexport const WorkflowNodePanelUtils: IWorkflowNodePanelUtils = {\n adjustNodePosition,\n buildLine,\n getPortBox,\n getSubsequentNodes,\n getContainerNode,\n rectDistance,\n subNodesAutoOffset,\n subPositionOffset,\n updateSubSequentNodesPosition,\n waitNodeRender,\n};\n","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { Layer } from '@flowgram.ai/core';\n\nimport type {\n CallNodePanelParams,\n NodePanelLayerOptions,\n NodePanelRenderProps,\n NodePanelResult,\n} from './type';\nimport { WorkflowNodePanelService } from './service';\n\nexport class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {\n public static type = 'WorkflowNodePanelLayer';\n\n @inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;\n\n public node: HTMLDivElement;\n\n private renderList: Map<string, NodePanelRenderProps>;\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');\n this.node.style.zIndex = '9999';\n this.renderList = new Map();\n }\n\n public onReady(): void {\n this.service.setCallNodePanel(this.call.bind(this));\n }\n\n public onZoom(zoom: number): void {\n this.node.style.transform = `scale(${zoom})`;\n }\n\n public render(): JSX.Element {\n const NodePanelRender = this.options.renderer;\n return (\n <>\n {Array.from(this.renderList.keys()).map((taskId) => {\n const renderProps = this.renderList.get(taskId)!;\n return <NodePanelRender key={taskId} {...renderProps} />;\n })}\n </>\n );\n }\n\n private async call(params: CallNodePanelParams): Promise<void> {\n const taskId = nanoid();\n const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;\n return new Promise((resolve) => {\n const unmount = () => {\n // 清理挂载的组件\n this.renderList.delete(taskId);\n this.render();\n resolve();\n };\n const handleClose = () => {\n unmount();\n onClose();\n };\n const handleSelect = (params?: NodePanelResult) => {\n onSelect(params);\n if (!enableMultiAdd) {\n unmount();\n }\n };\n const renderProps: NodePanelRenderProps = {\n ...params,\n panelProps,\n onSelect: handleSelect,\n onClose: handleClose,\n };\n this.renderList.set(taskId, renderProps);\n this.render();\n });\n }\n}\n"],"mappings":"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","names":["WorkflowLinesManager","HistoryService","node","nodeTrans","Rectangle","FlowNodeTransformData","Rectangle","FlowNodeTransformData","Rectangle","_a","_b","node","WorkflowLinesManager","HistoryService","inject","params","inject"]}
|
package/dist/index.js
CHANGED
|
@@ -70,7 +70,10 @@ var import_utils = require("@flowgram.ai/utils");
|
|
|
70
70
|
var import_document = require("@flowgram.ai/document");
|
|
71
71
|
|
|
72
72
|
// src/utils/is-container.ts
|
|
73
|
-
var isContainer = (node) =>
|
|
73
|
+
var isContainer = (node) => {
|
|
74
|
+
var _a;
|
|
75
|
+
return (_a = node == null ? void 0 : node.getNodeMeta().isContainer) != null ? _a : false;
|
|
76
|
+
};
|
|
74
77
|
|
|
75
78
|
// src/utils/get-port-box.ts
|
|
76
79
|
var getPortBox = (port, offset = { x: 0, y: 0 }) => {
|
|
@@ -187,11 +190,12 @@ var isLessThan = (a, b) => {
|
|
|
187
190
|
|
|
188
191
|
// src/utils/sub-position-offset.ts
|
|
189
192
|
var subPositionOffset = (params) => {
|
|
193
|
+
var _a, _b;
|
|
190
194
|
const { node, fromPort, toPort, padding } = params;
|
|
191
195
|
const fromBox = getPortBox(fromPort);
|
|
192
196
|
const toBox = getPortBox(toPort);
|
|
193
197
|
const nodeTrans = node.getData(import_document2.FlowNodeTransformData);
|
|
194
|
-
const nodeSize = node.getNodeMeta()
|
|
198
|
+
const nodeSize = (_b = (_a = node.getNodeMeta()) == null ? void 0 : _a.size) != null ? _b : {
|
|
195
199
|
width: nodeTrans.bounds.width,
|
|
196
200
|
height: nodeTrans.bounds.height
|
|
197
201
|
};
|
|
@@ -236,28 +240,31 @@ var subPositionOffset = (params) => {
|
|
|
236
240
|
|
|
237
241
|
// src/utils/get-sub-nodes.ts
|
|
238
242
|
var getSubsequentNodes = (params) => {
|
|
243
|
+
var _a, _b;
|
|
239
244
|
const { node, linesManager } = params;
|
|
240
245
|
if (isContainer(node)) {
|
|
241
246
|
return [];
|
|
242
247
|
}
|
|
243
|
-
const brothers = node.parent
|
|
248
|
+
const brothers = (_b = (_a = node.parent) == null ? void 0 : _a.blocks) != null ? _b : [];
|
|
244
249
|
const linkedBrothers = /* @__PURE__ */ new Set();
|
|
245
250
|
const linesMap = /* @__PURE__ */ new Map();
|
|
246
251
|
linesManager.getAllLines().forEach((line) => {
|
|
252
|
+
var _a2, _b2;
|
|
247
253
|
if (!linesMap.has(line.from.id)) {
|
|
248
254
|
linesMap.set(line.from.id, []);
|
|
249
255
|
}
|
|
250
|
-
if (!line.to
|
|
256
|
+
if (!((_a2 = line.to) == null ? void 0 : _a2.id) || isContainer(line.to)) {
|
|
251
257
|
return;
|
|
252
258
|
}
|
|
253
|
-
linesMap.get(line.from.id)
|
|
259
|
+
(_b2 = linesMap.get(line.from.id)) == null ? void 0 : _b2.push(line.to.id);
|
|
254
260
|
});
|
|
255
261
|
const bfs = (nodeId) => {
|
|
262
|
+
var _a2;
|
|
256
263
|
if (linkedBrothers.has(nodeId)) {
|
|
257
264
|
return;
|
|
258
265
|
}
|
|
259
266
|
linkedBrothers.add(nodeId);
|
|
260
|
-
const nextNodes = linesMap.get(nodeId)
|
|
267
|
+
const nextNodes = (_a2 = linesMap.get(nodeId)) != null ? _a2 : [];
|
|
261
268
|
nextNodes.forEach(bfs);
|
|
262
269
|
};
|
|
263
270
|
bfs(node.id);
|
|
@@ -308,8 +315,8 @@ var getContainerNode = (params) => {
|
|
|
308
315
|
if (containerNode) {
|
|
309
316
|
return containerNode;
|
|
310
317
|
}
|
|
311
|
-
const fromNode = fromPort
|
|
312
|
-
const fromContainer = fromNode
|
|
318
|
+
const fromNode = fromPort == null ? void 0 : fromPort.node;
|
|
319
|
+
const fromContainer = fromNode == null ? void 0 : fromNode.parent;
|
|
313
320
|
if (isContainer(fromNode)) {
|
|
314
321
|
return fromNode;
|
|
315
322
|
}
|
|
@@ -319,12 +326,13 @@ var getContainerNode = (params) => {
|
|
|
319
326
|
// src/utils/build-line.ts
|
|
320
327
|
var import_free_layout_core2 = require("@flowgram.ai/free-layout-core");
|
|
321
328
|
var buildLine = (params) => {
|
|
329
|
+
var _a, _b;
|
|
322
330
|
const { fromPort, node, toPort, linesManager } = params;
|
|
323
331
|
const portsData = node.getData(import_free_layout_core2.WorkflowNodePortsData);
|
|
324
332
|
if (!portsData) {
|
|
325
333
|
return;
|
|
326
334
|
}
|
|
327
|
-
const shouldBuildFromLine = portsData.inputPorts
|
|
335
|
+
const shouldBuildFromLine = ((_a = portsData.inputPorts) == null ? void 0 : _a.length) > 0;
|
|
328
336
|
if (fromPort && shouldBuildFromLine) {
|
|
329
337
|
const toTargetPort = portsData.inputPorts[0];
|
|
330
338
|
const isSingleInput = portsData.inputPorts.length === 1;
|
|
@@ -335,7 +343,7 @@ var buildLine = (params) => {
|
|
|
335
343
|
toPort: isSingleInput ? void 0 : toTargetPort.id
|
|
336
344
|
});
|
|
337
345
|
}
|
|
338
|
-
const shouldBuildToLine = portsData.outputPorts
|
|
346
|
+
const shouldBuildToLine = ((_b = portsData.outputPorts) == null ? void 0 : _b.length) > 0;
|
|
339
347
|
if (toPort && shouldBuildToLine) {
|
|
340
348
|
const fromTargetPort = portsData.outputPorts[0];
|
|
341
349
|
linesManager.createLine({
|
|
@@ -349,9 +357,10 @@ var buildLine = (params) => {
|
|
|
349
357
|
|
|
350
358
|
// src/utils/adjust-node-position.ts
|
|
351
359
|
var adjustNodePosition = (params) => {
|
|
360
|
+
var _a;
|
|
352
361
|
const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;
|
|
353
362
|
const register = document.getNodeRegistry(nodeType);
|
|
354
|
-
const size = register
|
|
363
|
+
const size = (_a = register == null ? void 0 : register.meta) == null ? void 0 : _a.size;
|
|
355
364
|
let adjustedPosition = position;
|
|
356
365
|
if (!size) {
|
|
357
366
|
adjustedPosition = position;
|
|
@@ -428,7 +437,7 @@ var WorkflowNodePanelService = class {
|
|
|
428
437
|
}),
|
|
429
438
|
onSelect: async (panelParams) => {
|
|
430
439
|
const node = await this.addNode(callParams, panelParams);
|
|
431
|
-
afterAddNode
|
|
440
|
+
afterAddNode == null ? void 0 : afterAddNode(node);
|
|
432
441
|
if (!enableMultiAdd) {
|
|
433
442
|
resolve(node);
|
|
434
443
|
} else if (node) {
|
|
@@ -501,8 +510,8 @@ var WorkflowNodePanelService = class {
|
|
|
501
510
|
const node = this.document.createWorkflowNodeByType(
|
|
502
511
|
nodeType,
|
|
503
512
|
nodePosition,
|
|
504
|
-
nodeJSON
|
|
505
|
-
containerNode
|
|
513
|
+
nodeJSON != null ? nodeJSON : {},
|
|
514
|
+
containerNode == null ? void 0 : containerNode.id
|
|
506
515
|
);
|
|
507
516
|
if (!node) {
|
|
508
517
|
return;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-plugin.ts","../src/service.ts","../src/utils/wait-node-render.ts","../src/utils/update-sub-nodes-position.ts","../src/utils/get-port-box.ts","../src/utils/is-container.ts","../src/utils/sub-position-offset.ts","../src/utils/rect-distance.ts","../src/utils/greater-or-less.ts","../src/utils/get-sub-nodes.ts","../src/utils/sub-nodes-auto-offset.ts","../src/utils/get-container-node.ts","../src/utils/build-line.ts","../src/utils/adjust-node-position.ts","../src/utils/index.ts","../src/layer.tsx"],"sourcesContent":["export { createFreeNodePanelPlugin } from './create-plugin';\nexport { WorkflowNodePanelService } from './service';\nexport type {\n NodePanelResult,\n NodePanelRenderProps,\n NodePanelRender,\n NodePanelLayerOptions as NodePanelServiceOptions,\n NodePanelPluginOptions,\n} from './type';\nexport { type IWorkflowNodePanelUtils, WorkflowNodePanelUtils } from './utils';\n","import { definePluginCreator, type PluginBindConfig, type PluginContext } from '@flowgram.ai/core';\n\nimport { NodePanelPluginOptions } from './type';\nimport { WorkflowNodePanelService } from './service';\nimport { WorkflowNodePanelLayer } from './layer';\n\nexport const createFreeNodePanelPlugin = definePluginCreator({\n onBind({ bind }: PluginBindConfig) {\n bind(WorkflowNodePanelService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: NodePanelPluginOptions) => {\n ctx.playground.registerLayer(WorkflowNodePanelLayer, {\n renderer: opts.renderer,\n });\n },\n onDispose: (ctx: PluginContext) => {\n const nodePanelService = ctx.get(WorkflowNodePanelService);\n nodePanelService.dispose();\n },\n});\n","import { inject, injectable } from 'inversify';\nimport { DisposableCollection } from '@flowgram.ai/utils';\nimport type { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { WorkflowNodePanelUtils } from './utils';\nimport type {\n CallNodePanel,\n CallNodePanelParams,\n NodePanelCallParams,\n NodePanelResult,\n} from './type';\n\n/**\n * 添加节点面板服务\n */\n@injectable()\nexport class WorkflowNodePanelService {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(WorkflowDragService)\n private readonly dragService: WorkflowDragService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n @inject(WorkflowLinesManager)\n private readonly linesManager: WorkflowLinesManager;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n @inject(HistoryService) private readonly historyService: HistoryService;\n\n private readonly toDispose = new DisposableCollection();\n\n public callNodePanel: CallNodePanel = async () => undefined;\n\n /** 销毁 */\n public dispose(): void {\n this.toDispose.dispose();\n }\n\n public setCallNodePanel(callNodePanel: CallNodePanel) {\n this.callNodePanel = callNodePanel;\n }\n\n /** 唤起节点面板 */\n public async call(\n callParams: NodePanelCallParams\n ): Promise<WorkflowNodeEntity | WorkflowNodeEntity[] | undefined> {\n const {\n panelPosition,\n fromPort,\n enableMultiAdd = false,\n panelProps = {},\n containerNode,\n afterAddNode,\n } = callParams;\n\n if (!panelPosition || this.playgroundConfig.readonly) {\n return;\n }\n\n const nodes: WorkflowNodeEntity[] = [];\n\n return new Promise((resolve) => {\n this.callNodePanel({\n position: panelPosition,\n enableMultiAdd,\n panelProps,\n containerNode: WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode,\n }),\n onSelect: async (panelParams?: NodePanelResult) => {\n const node = await this.addNode(callParams, panelParams);\n afterAddNode?.(node);\n if (!enableMultiAdd) {\n resolve(node);\n } else if (node) {\n nodes.push(node);\n }\n },\n onClose: () => {\n resolve(enableMultiAdd ? nodes : undefined);\n },\n });\n });\n }\n\n /**\n * 唤起单选面板\n */\n public async singleSelectNodePanel(\n params: Omit<CallNodePanelParams, 'onSelect' | 'onClose' | 'enableMultiAdd'>\n ): Promise<NodePanelResult | undefined> {\n return new Promise((resolve) => {\n this.callNodePanel({\n ...params,\n enableMultiAdd: false,\n onSelect: async (panelParams?: NodePanelResult) => {\n resolve(panelParams);\n },\n onClose: () => {\n resolve(undefined);\n },\n });\n });\n }\n\n /** 添加节点 */\n private async addNode(\n callParams: NodePanelCallParams,\n panelParams: NodePanelResult\n ): Promise<WorkflowNodeEntity | undefined> {\n const {\n panelPosition,\n fromPort,\n toPort,\n canAddNode,\n autoOffsetPadding = {\n x: 100,\n y: 100,\n },\n enableBuildLine = false,\n enableSelectPosition = false,\n enableAutoOffset = false,\n enableDragNode = false,\n } = callParams;\n\n if (!panelPosition || !panelParams) {\n return;\n }\n\n const { nodeType, selectEvent, nodeJSON } = panelParams;\n\n const containerNode = WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode: callParams.containerNode,\n });\n\n // 判断是否可以添加节点\n if (canAddNode) {\n const canAdd = canAddNode({ nodeType, containerNode });\n if (!canAdd) {\n return;\n }\n }\n\n // 鼠标选择坐标\n const selectPosition = this.playgroundConfig.getPosFromMouseEvent(selectEvent);\n\n // 自定义坐标\n const nodePosition: PositionSchema = callParams.customPosition\n ? callParams.customPosition({ nodeType, selectPosition })\n : WorkflowNodePanelUtils.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n document: this.document,\n dragService: this.dragService,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = this.document.createWorkflowNodeByType(\n nodeType,\n nodePosition,\n nodeJSON ?? ({} as WorkflowNodeJSON),\n containerNode?.id\n );\n\n if (!node) {\n return;\n }\n\n // 后续节点偏移\n if (enableAutoOffset && fromPort && toPort) {\n WorkflowNodePanelUtils.subNodesAutoOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n containerNode,\n historyService: this.historyService,\n dragService: this.dragService,\n linesManager: this.linesManager,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await WorkflowNodePanelUtils.waitNodeRender();\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n WorkflowNodePanelUtils.buildLine({\n fromPort,\n node,\n toPort,\n linesManager: this.linesManager,\n });\n }\n\n // 开始拖拽节点\n if (enableDragNode) {\n this.selectService.selectNode(node);\n this.dragService.startDragSelectedNodes(selectEvent);\n }\n\n return node;\n }\n}\n","import { delay } from '@flowgram.ai/free-layout-core';\n\nexport type IWaitNodeRender = () => Promise<void>;\n\nexport const waitNodeRender: IWaitNodeRender = async () => {\n await delay(20);\n};\n","import { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowNodeEntity,\n WorkflowPortEntity,\n WorkflowDragService,\n} from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { getPortBox } from './get-port-box';\n\nexport type IUpdateSubSequentNodesPosition = (params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n}) => void;\n\n/** 更新后续节点位置 */\nexport const updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition = (params) => {\n const {\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset,\n historyService,\n dragService,\n } = params;\n if (!offset || !toPort) {\n return;\n }\n // 更新后续节点位置\n const subsequentNodesPositions = subsequentNodes.map((node) => {\n const nodeTrans = node.getData(TransformData);\n return {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n };\n });\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: subsequentNodes.map((node) => node.id),\n value: subsequentNodesPositions.map((position) => ({\n x: position.x + offset.x,\n y: position.y + offset.y,\n })),\n oldValue: subsequentNodesPositions,\n },\n });\n // 新增节点坐标需重新计算\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort, offset);\n const nodeTrans = node.getData(TransformData);\n let nodePos: PositionSchema = {\n x: (fromBox.center.x + toBox.center.x) / 2,\n y: (fromBox.y + toBox.y) / 2,\n };\n if (containerNode) {\n nodePos = dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: [node.id],\n value: [nodePos],\n oldValue: [\n {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n },\n ],\n },\n });\n};\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { isContainer } from './is-container';\n\nexport type IGetPortBox = (port: WorkflowPortEntity, offset?: IPoint) => Rectangle;\n\n/** 获取端口矩形 */\nexport const getPortBox: IGetPortBox = (\n port: WorkflowPortEntity,\n offset: IPoint = { x: 0, y: 0 }\n): Rectangle => {\n const node = port.node;\n if (isContainer(node)) {\n // 子画布内部端口需要虚拟节点\n const { point } = port;\n if (port.portType === 'input') {\n return new Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);\n }\n return new Rectangle(point.x - 300, point.y - 50, 300, 100);\n }\n const box = node.getData(FlowNodeTransformData).bounds;\n return box;\n};\n","import { WorkflowNodeEntity, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\n\n/** 是否容器节点 */\nexport const isContainer = (node?: WorkflowNodeEntity): boolean =>\n node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { rectDistance } from './rect-distance';\nimport { isGreaterThan, isLessThan } from './greater-or-less';\nimport { getPortBox } from './get-port-box';\n\nexport interface XYSchema {\n x: number;\n y: number;\n}\n\nexport type ISubPositionOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: XYSchema;\n}) => XYSchema | undefined;\n\n/** 后续节点位置偏移 */\nexport const subPositionOffset: ISubPositionOffset = (params) => {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort);\n\n const nodeTrans = node.getData(FlowNodeTransformData);\n const nodeSize = node.getNodeMeta()?.size ?? {\n width: nodeTrans.bounds.width,\n height: nodeTrans.bounds.height,\n };\n\n // 最小距离\n const minDistance: IPoint = {\n x: nodeSize.width + padding.x,\n y: nodeSize.height + padding.y,\n };\n // from 与 to 的距离\n const boxDistance = rectDistance(fromBox, toBox);\n\n // 需要的偏移量\n const neededOffset: IPoint = {\n x: isGreaterThan(boxDistance.x, minDistance.x) ? 0 : minDistance.x - boxDistance.x,\n y: isGreaterThan(boxDistance.y, minDistance.y) ? 0 : minDistance.y - boxDistance.y,\n };\n\n // 至少有一个方向满足要求,无需偏移\n if (neededOffset.x === 0 || neededOffset.y === 0) {\n return;\n }\n\n // 是否存在相交\n const intersection = {\n // 这里没有写反,Rectangle内置的算法是反的\n vertical: Rectangle.intersects(fromBox, toBox, 'horizontal'),\n horizontal: Rectangle.intersects(fromBox, toBox, 'vertical'),\n };\n\n // 初始化偏移量\n let offsetX: number = 0;\n let offsetY: number = 0;\n\n if (!intersection.horizontal) {\n // 水平不相交,需要加垂直方向的偏移\n if (isGreaterThan(toBox.center.y, fromBox.center.y)) {\n // B在A下方\n offsetY = neededOffset.y;\n } else if (isLessThan(toBox.center.y, fromBox.center.y)) {\n // B在A上方\n offsetY = -neededOffset.y;\n }\n }\n\n if (!intersection.vertical) {\n // 垂直不相交,需要加水平方向的偏移\n if (isGreaterThan(toBox.center.x, fromBox.center.x)) {\n // B在A右侧\n offsetX = neededOffset.x;\n } else if (isLessThan(toBox.center.x, fromBox.center.x)) {\n // B在A左侧\n offsetX = -neededOffset.x;\n }\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n};\n","import { Rectangle, IPoint } from '@flowgram.ai/utils';\n\nexport type IRectDistance = (rectA: Rectangle, rectB: Rectangle) => IPoint;\n\n/** 矩形间距 */\nexport const rectDistance: IRectDistance = (rectA, rectB) => {\n // 计算 x 轴距离\n const distanceX = Math.abs(Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left));\n // 计算 y 轴距离\n const distanceY = Math.abs(Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top));\n if (Rectangle.intersects(rectA, rectB)) {\n // 相交距离为负\n return {\n x: -distanceX,\n y: -distanceY,\n };\n }\n return {\n x: distanceX,\n y: distanceY,\n };\n};\n","/**\n * 检查 a 是否大于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 大于 b 则返回 true,否则返回 false\n */\nexport const isGreaterThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著大于 b\n return a - b > EPSILON;\n};\n\n/**\n * 检查 a 是否小于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 小于 b 则返回 true,否则返回 false\n */\nexport const isLessThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著小于 b\n return b - a > EPSILON;\n};\n","import { WorkflowNodeEntity, WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetSubsequentNodes = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n}) => WorkflowNodeEntity[];\n\n/** 获取后续节点 */\nexport const getSubsequentNodes: IGetSubsequentNodes = (params) => {\n const { node, linesManager } = params;\n if (isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.blocks ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n linesManager.getAllLines().forEach((line) => {\n if (!linesMap.has(line.from.id)) {\n linesMap.set(line.from.id, []);\n }\n if (\n !line.to?.id ||\n isContainer(line.to) // 子画布内部成环\n ) {\n return;\n }\n linesMap.get(line.from.id)?.push(line.to.id);\n });\n\n const bfs = (nodeId: string) => {\n if (linkedBrothers.has(nodeId)) {\n return;\n }\n linkedBrothers.add(nodeId);\n const nextNodes = linesMap.get(nodeId) ?? [];\n nextNodes.forEach(bfs);\n };\n\n bfs(node.id);\n\n const subsequentNodes = brothers.filter((node) => linkedBrothers.has(node.id));\n return subsequentNodes;\n};\n","import {\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\n\nimport { updateSubSequentNodesPosition } from './update-sub-nodes-position';\nimport { subPositionOffset, XYSchema } from './sub-position-offset';\nimport { getSubsequentNodes } from './get-sub-nodes';\n\nexport type ISubNodesAutoOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding?: XYSchema;\n linesManager: WorkflowLinesManager;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n}) => void;\n\nexport const subNodesAutoOffset: ISubNodesAutoOffset = (params) => {\n const {\n node,\n fromPort,\n toPort,\n linesManager,\n historyService,\n dragService,\n containerNode,\n padding = {\n x: 100,\n y: 100,\n },\n } = params;\n const subOffset = subPositionOffset({\n node,\n fromPort,\n toPort,\n padding,\n });\n const subsequentNodes = getSubsequentNodes({\n node: toPort.node,\n linesManager,\n });\n updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n historyService,\n dragService,\n });\n};\n","import { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetContainerNode = (params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => WorkflowNodeEntity | undefined;\n\nexport const getContainerNode: IGetContainerNode = (params) => {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n};\n","import {\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowNodePortsData,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IBuildLine = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => void;\n\n/** 建立连线 */\nexport const buildLine: IBuildLine = (params) => {\n const { fromPort, node, toPort, linesManager } = params;\n const portsData = node.getData(WorkflowNodePortsData);\n if (!portsData) {\n return;\n }\n\n const shouldBuildFromLine = portsData.inputPorts?.length > 0;\n if (fromPort && shouldBuildFromLine) {\n const toTargetPort = portsData.inputPorts[0];\n const isSingleInput = portsData.inputPorts.length === 1;\n linesManager.createLine({\n from: fromPort.node.id,\n fromPort: fromPort.portID,\n to: node.id,\n toPort: isSingleInput ? undefined : toTargetPort.id,\n });\n }\n const shouldBuildToLine = portsData.outputPorts?.length > 0;\n if (toPort && shouldBuildToLine) {\n const fromTargetPort = portsData.outputPorts[0];\n linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n};\n","import { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IAdjustNodePosition = (params: {\n nodeType: string;\n position: PositionSchema;\n document: WorkflowDocument;\n dragService: WorkflowDragService;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n}) => PositionSchema;\n\n/** 调整节点坐标 */\nexport const adjustNodePosition: IAdjustNodePosition = (params) => {\n const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;\n const register = document.getNodeRegistry(nodeType);\n const size = register?.meta?.size;\n let adjustedPosition = position;\n if (!size) {\n adjustedPosition = position;\n }\n // 计算坐标偏移\n else if (fromPort && toPort) {\n // 输入输出\n adjustedPosition = {\n x: position.x,\n y: position.y - size.height / 2,\n };\n } else if (fromPort && !toPort) {\n // 仅输入\n adjustedPosition = {\n x: position.x + size.width / 2,\n y: position.y - size.height / 2,\n };\n } else if (!fromPort && toPort) {\n // 仅输出\n adjustedPosition = {\n x: position.x - size.width / 2,\n y: position.y - size.height / 2,\n };\n } else {\n adjustedPosition = position;\n }\n return dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n};\n","import { IWaitNodeRender, waitNodeRender } from './wait-node-render';\nimport {\n updateSubSequentNodesPosition,\n IUpdateSubSequentNodesPosition,\n} from './update-sub-nodes-position';\nimport { subPositionOffset, ISubPositionOffset } from './sub-position-offset';\nimport { subNodesAutoOffset, ISubNodesAutoOffset } from './sub-nodes-auto-offset';\nimport { rectDistance, IRectDistance } from './rect-distance';\nimport { getSubsequentNodes, IGetSubsequentNodes } from './get-sub-nodes';\nimport { getPortBox, IGetPortBox } from './get-port-box';\nimport { getContainerNode, IGetContainerNode } from './get-container-node';\nimport { buildLine, IBuildLine } from './build-line';\nimport { adjustNodePosition, IAdjustNodePosition } from './adjust-node-position';\n\nexport interface IWorkflowNodePanelUtils {\n adjustNodePosition: IAdjustNodePosition;\n buildLine: IBuildLine;\n getPortBox: IGetPortBox;\n getSubsequentNodes: IGetSubsequentNodes;\n getContainerNode: IGetContainerNode;\n rectDistance: IRectDistance;\n subNodesAutoOffset: ISubNodesAutoOffset;\n subPositionOffset: ISubPositionOffset;\n updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition;\n waitNodeRender: IWaitNodeRender;\n}\n\nexport const WorkflowNodePanelUtils: IWorkflowNodePanelUtils = {\n adjustNodePosition,\n buildLine,\n getPortBox,\n getSubsequentNodes,\n getContainerNode,\n rectDistance,\n subNodesAutoOffset,\n subPositionOffset,\n updateSubSequentNodesPosition,\n waitNodeRender,\n};\n","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { Layer } from '@flowgram.ai/core';\n\nimport type {\n CallNodePanelParams,\n NodePanelLayerOptions,\n NodePanelRenderProps,\n NodePanelResult,\n} from './type';\nimport { WorkflowNodePanelService } from './service';\n\nexport class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {\n public static type = 'WorkflowNodePanelLayer';\n\n @inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;\n\n public node: HTMLDivElement;\n\n private renderList: Map<string, NodePanelRenderProps>;\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');\n this.node.style.zIndex = '9999';\n this.renderList = new Map();\n }\n\n public onReady(): void {\n this.service.setCallNodePanel(this.call.bind(this));\n }\n\n public onZoom(zoom: number): void {\n this.node.style.transform = `scale(${zoom})`;\n }\n\n public render(): JSX.Element {\n const NodePanelRender = this.options.renderer;\n return (\n <>\n {Array.from(this.renderList.keys()).map((taskId) => {\n const renderProps = this.renderList.get(taskId)!;\n return <NodePanelRender key={taskId} {...renderProps} />;\n })}\n </>\n );\n }\n\n private async call(params: CallNodePanelParams): Promise<void> {\n const taskId = nanoid();\n const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;\n return new Promise((resolve) => {\n const unmount = () => {\n // 清理挂载的组件\n this.renderList.delete(taskId);\n this.render();\n resolve();\n };\n const handleClose = () => {\n unmount();\n onClose();\n };\n const handleSelect = (params?: NodePanelResult) => {\n onSelect(params);\n if (!enableMultiAdd) {\n unmount();\n }\n };\n const renderProps: NodePanelRenderProps = {\n ...params,\n panelProps,\n onSelect: handleSelect,\n onClose: handleClose,\n };\n this.renderList.set(taskId, renderProps);\n this.render();\n });\n }\n}\n"],"mappings":"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","names":["import_core","import_utils","import_free_layout_core","import_free_history_plugin","import_core","node","nodeTrans","import_utils","import_document","import_utils","node","import_free_layout_core","import_inversify","import_utils","import_free_layout_core","import_core","React","params"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-plugin.ts","../src/service.ts","../src/utils/wait-node-render.ts","../src/utils/update-sub-nodes-position.ts","../src/utils/get-port-box.ts","../src/utils/is-container.ts","../src/utils/sub-position-offset.ts","../src/utils/rect-distance.ts","../src/utils/greater-or-less.ts","../src/utils/get-sub-nodes.ts","../src/utils/sub-nodes-auto-offset.ts","../src/utils/get-container-node.ts","../src/utils/build-line.ts","../src/utils/adjust-node-position.ts","../src/utils/index.ts","../src/layer.tsx"],"sourcesContent":["export { createFreeNodePanelPlugin } from './create-plugin';\nexport { WorkflowNodePanelService } from './service';\nexport type {\n NodePanelResult,\n NodePanelRenderProps,\n NodePanelRender,\n NodePanelLayerOptions as NodePanelServiceOptions,\n NodePanelPluginOptions,\n} from './type';\nexport { type IWorkflowNodePanelUtils, WorkflowNodePanelUtils } from './utils';\n","import { definePluginCreator, type PluginBindConfig, type PluginContext } from '@flowgram.ai/core';\n\nimport { NodePanelPluginOptions } from './type';\nimport { WorkflowNodePanelService } from './service';\nimport { WorkflowNodePanelLayer } from './layer';\n\nexport const createFreeNodePanelPlugin = definePluginCreator({\n onBind({ bind }: PluginBindConfig) {\n bind(WorkflowNodePanelService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: NodePanelPluginOptions) => {\n ctx.playground.registerLayer(WorkflowNodePanelLayer, {\n renderer: opts.renderer,\n });\n },\n onDispose: (ctx: PluginContext) => {\n const nodePanelService = ctx.get(WorkflowNodePanelService);\n nodePanelService.dispose();\n },\n});\n","import { inject, injectable } from 'inversify';\nimport { DisposableCollection } from '@flowgram.ai/utils';\nimport type { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport { WorkflowNodePanelUtils } from './utils';\nimport type {\n CallNodePanel,\n CallNodePanelParams,\n NodePanelCallParams,\n NodePanelResult,\n} from './type';\n\n/**\n * 添加节点面板服务\n */\n@injectable()\nexport class WorkflowNodePanelService {\n @inject(WorkflowDocument) private readonly document: WorkflowDocument;\n\n @inject(WorkflowDragService)\n private readonly dragService: WorkflowDragService;\n\n @inject(WorkflowSelectService)\n private readonly selectService: WorkflowSelectService;\n\n @inject(WorkflowLinesManager)\n private readonly linesManager: WorkflowLinesManager;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n @inject(HistoryService) private readonly historyService: HistoryService;\n\n private readonly toDispose = new DisposableCollection();\n\n public callNodePanel: CallNodePanel = async () => undefined;\n\n /** 销毁 */\n public dispose(): void {\n this.toDispose.dispose();\n }\n\n public setCallNodePanel(callNodePanel: CallNodePanel) {\n this.callNodePanel = callNodePanel;\n }\n\n /** 唤起节点面板 */\n public async call(\n callParams: NodePanelCallParams\n ): Promise<WorkflowNodeEntity | WorkflowNodeEntity[] | undefined> {\n const {\n panelPosition,\n fromPort,\n enableMultiAdd = false,\n panelProps = {},\n containerNode,\n afterAddNode,\n } = callParams;\n\n if (!panelPosition || this.playgroundConfig.readonly) {\n return;\n }\n\n const nodes: WorkflowNodeEntity[] = [];\n\n return new Promise((resolve) => {\n this.callNodePanel({\n position: panelPosition,\n enableMultiAdd,\n panelProps,\n containerNode: WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode,\n }),\n onSelect: async (panelParams?: NodePanelResult) => {\n const node = await this.addNode(callParams, panelParams);\n afterAddNode?.(node);\n if (!enableMultiAdd) {\n resolve(node);\n } else if (node) {\n nodes.push(node);\n }\n },\n onClose: () => {\n resolve(enableMultiAdd ? nodes : undefined);\n },\n });\n });\n }\n\n /**\n * 唤起单选面板\n */\n public async singleSelectNodePanel(\n params: Omit<CallNodePanelParams, 'onSelect' | 'onClose' | 'enableMultiAdd'>\n ): Promise<NodePanelResult | undefined> {\n return new Promise((resolve) => {\n this.callNodePanel({\n ...params,\n enableMultiAdd: false,\n onSelect: async (panelParams?: NodePanelResult) => {\n resolve(panelParams);\n },\n onClose: () => {\n resolve(undefined);\n },\n });\n });\n }\n\n /** 添加节点 */\n private async addNode(\n callParams: NodePanelCallParams,\n panelParams: NodePanelResult\n ): Promise<WorkflowNodeEntity | undefined> {\n const {\n panelPosition,\n fromPort,\n toPort,\n canAddNode,\n autoOffsetPadding = {\n x: 100,\n y: 100,\n },\n enableBuildLine = false,\n enableSelectPosition = false,\n enableAutoOffset = false,\n enableDragNode = false,\n } = callParams;\n\n if (!panelPosition || !panelParams) {\n return;\n }\n\n const { nodeType, selectEvent, nodeJSON } = panelParams;\n\n const containerNode = WorkflowNodePanelUtils.getContainerNode({\n fromPort,\n containerNode: callParams.containerNode,\n });\n\n // 判断是否可以添加节点\n if (canAddNode) {\n const canAdd = canAddNode({ nodeType, containerNode });\n if (!canAdd) {\n return;\n }\n }\n\n // 鼠标选择坐标\n const selectPosition = this.playgroundConfig.getPosFromMouseEvent(selectEvent);\n\n // 自定义坐标\n const nodePosition: PositionSchema = callParams.customPosition\n ? callParams.customPosition({ nodeType, selectPosition })\n : WorkflowNodePanelUtils.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n document: this.document,\n dragService: this.dragService,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = this.document.createWorkflowNodeByType(\n nodeType,\n nodePosition,\n nodeJSON ?? ({} as WorkflowNodeJSON),\n containerNode?.id\n );\n\n if (!node) {\n return;\n }\n\n // 后续节点偏移\n if (enableAutoOffset && fromPort && toPort) {\n WorkflowNodePanelUtils.subNodesAutoOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n containerNode,\n historyService: this.historyService,\n dragService: this.dragService,\n linesManager: this.linesManager,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await WorkflowNodePanelUtils.waitNodeRender();\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n WorkflowNodePanelUtils.buildLine({\n fromPort,\n node,\n toPort,\n linesManager: this.linesManager,\n });\n }\n\n // 开始拖拽节点\n if (enableDragNode) {\n this.selectService.selectNode(node);\n this.dragService.startDragSelectedNodes(selectEvent);\n }\n\n return node;\n }\n}\n","import { delay } from '@flowgram.ai/free-layout-core';\n\nexport type IWaitNodeRender = () => Promise<void>;\n\nexport const waitNodeRender: IWaitNodeRender = async () => {\n await delay(20);\n};\n","import { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowNodeEntity,\n WorkflowPortEntity,\n WorkflowDragService,\n} from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { getPortBox } from './get-port-box';\n\nexport type IUpdateSubSequentNodesPosition = (params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n}) => void;\n\n/** 更新后续节点位置 */\nexport const updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition = (params) => {\n const {\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset,\n historyService,\n dragService,\n } = params;\n if (!offset || !toPort) {\n return;\n }\n // 更新后续节点位置\n const subsequentNodesPositions = subsequentNodes.map((node) => {\n const nodeTrans = node.getData(TransformData);\n return {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n };\n });\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: subsequentNodes.map((node) => node.id),\n value: subsequentNodesPositions.map((position) => ({\n x: position.x + offset.x,\n y: position.y + offset.y,\n })),\n oldValue: subsequentNodesPositions,\n },\n });\n // 新增节点坐标需重新计算\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort, offset);\n const nodeTrans = node.getData(TransformData);\n let nodePos: PositionSchema = {\n x: (fromBox.center.x + toBox.center.x) / 2,\n y: (fromBox.y + toBox.y) / 2,\n };\n if (containerNode) {\n nodePos = dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n historyService.pushOperation({\n type: FreeOperationType.dragNodes,\n value: {\n ids: [node.id],\n value: [nodePos],\n oldValue: [\n {\n x: nodeTrans.position.x,\n y: nodeTrans.position.y,\n },\n ],\n },\n });\n};\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { isContainer } from './is-container';\n\nexport type IGetPortBox = (port: WorkflowPortEntity, offset?: IPoint) => Rectangle;\n\n/** 获取端口矩形 */\nexport const getPortBox: IGetPortBox = (\n port: WorkflowPortEntity,\n offset: IPoint = { x: 0, y: 0 }\n): Rectangle => {\n const node = port.node;\n if (isContainer(node)) {\n // 子画布内部端口需要虚拟节点\n const { point } = port;\n if (port.portType === 'input') {\n return new Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);\n }\n return new Rectangle(point.x - 300, point.y - 50, 300, 100);\n }\n const box = node.getData(FlowNodeTransformData).bounds;\n return box;\n};\n","import { WorkflowNodeEntity, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\n\n/** 是否容器节点 */\nexport const isContainer = (node?: WorkflowNodeEntity): boolean =>\n node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\n","import { IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\n\nimport { rectDistance } from './rect-distance';\nimport { isGreaterThan, isLessThan } from './greater-or-less';\nimport { getPortBox } from './get-port-box';\n\nexport interface XYSchema {\n x: number;\n y: number;\n}\n\nexport type ISubPositionOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: XYSchema;\n}) => XYSchema | undefined;\n\n/** 后续节点位置偏移 */\nexport const subPositionOffset: ISubPositionOffset = (params) => {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = getPortBox(fromPort);\n const toBox = getPortBox(toPort);\n\n const nodeTrans = node.getData(FlowNodeTransformData);\n const nodeSize = node.getNodeMeta()?.size ?? {\n width: nodeTrans.bounds.width,\n height: nodeTrans.bounds.height,\n };\n\n // 最小距离\n const minDistance: IPoint = {\n x: nodeSize.width + padding.x,\n y: nodeSize.height + padding.y,\n };\n // from 与 to 的距离\n const boxDistance = rectDistance(fromBox, toBox);\n\n // 需要的偏移量\n const neededOffset: IPoint = {\n x: isGreaterThan(boxDistance.x, minDistance.x) ? 0 : minDistance.x - boxDistance.x,\n y: isGreaterThan(boxDistance.y, minDistance.y) ? 0 : minDistance.y - boxDistance.y,\n };\n\n // 至少有一个方向满足要求,无需偏移\n if (neededOffset.x === 0 || neededOffset.y === 0) {\n return;\n }\n\n // 是否存在相交\n const intersection = {\n // 这里没有写反,Rectangle内置的算法是反的\n vertical: Rectangle.intersects(fromBox, toBox, 'horizontal'),\n horizontal: Rectangle.intersects(fromBox, toBox, 'vertical'),\n };\n\n // 初始化偏移量\n let offsetX: number = 0;\n let offsetY: number = 0;\n\n if (!intersection.horizontal) {\n // 水平不相交,需要加垂直方向的偏移\n if (isGreaterThan(toBox.center.y, fromBox.center.y)) {\n // B在A下方\n offsetY = neededOffset.y;\n } else if (isLessThan(toBox.center.y, fromBox.center.y)) {\n // B在A上方\n offsetY = -neededOffset.y;\n }\n }\n\n if (!intersection.vertical) {\n // 垂直不相交,需要加水平方向的偏移\n if (isGreaterThan(toBox.center.x, fromBox.center.x)) {\n // B在A右侧\n offsetX = neededOffset.x;\n } else if (isLessThan(toBox.center.x, fromBox.center.x)) {\n // B在A左侧\n offsetX = -neededOffset.x;\n }\n }\n\n return {\n x: offsetX,\n y: offsetY,\n };\n};\n","import { Rectangle, IPoint } from '@flowgram.ai/utils';\n\nexport type IRectDistance = (rectA: Rectangle, rectB: Rectangle) => IPoint;\n\n/** 矩形间距 */\nexport const rectDistance: IRectDistance = (rectA, rectB) => {\n // 计算 x 轴距离\n const distanceX = Math.abs(Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left));\n // 计算 y 轴距离\n const distanceY = Math.abs(Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top));\n if (Rectangle.intersects(rectA, rectB)) {\n // 相交距离为负\n return {\n x: -distanceX,\n y: -distanceY,\n };\n }\n return {\n x: distanceX,\n y: distanceY,\n };\n};\n","/**\n * 检查 a 是否大于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 大于 b 则返回 true,否则返回 false\n */\nexport const isGreaterThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著大于 b\n return a - b > EPSILON;\n};\n\n/**\n * 检查 a 是否小于 b,考虑浮点数精度问题\n * @param a 第一个数\n * @param b 第二个数\n * @returns 如果 a 小于 b 则返回 true,否则返回 false\n */\nexport const isLessThan = (a: number | undefined, b: number | undefined): boolean => {\n // 如果任一参数为 undefined,返回 false\n if (a === undefined || b === undefined) {\n return false;\n }\n\n // 定义一个很小的误差值\n const EPSILON: number = 0.00001;\n\n // 检查 a 是否显著小于 b\n return b - a > EPSILON;\n};\n","import { WorkflowNodeEntity, WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetSubsequentNodes = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n}) => WorkflowNodeEntity[];\n\n/** 获取后续节点 */\nexport const getSubsequentNodes: IGetSubsequentNodes = (params) => {\n const { node, linesManager } = params;\n if (isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.blocks ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n linesManager.getAllLines().forEach((line) => {\n if (!linesMap.has(line.from.id)) {\n linesMap.set(line.from.id, []);\n }\n if (\n !line.to?.id ||\n isContainer(line.to) // 子画布内部成环\n ) {\n return;\n }\n linesMap.get(line.from.id)?.push(line.to.id);\n });\n\n const bfs = (nodeId: string) => {\n if (linkedBrothers.has(nodeId)) {\n return;\n }\n linkedBrothers.add(nodeId);\n const nextNodes = linesMap.get(nodeId) ?? [];\n nextNodes.forEach(bfs);\n };\n\n bfs(node.id);\n\n const subsequentNodes = brothers.filter((node) => linkedBrothers.has(node.id));\n return subsequentNodes;\n};\n","import {\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/free-history-plugin';\n\nimport { updateSubSequentNodesPosition } from './update-sub-nodes-position';\nimport { subPositionOffset, XYSchema } from './sub-position-offset';\nimport { getSubsequentNodes } from './get-sub-nodes';\n\nexport type ISubNodesAutoOffset = (params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding?: XYSchema;\n linesManager: WorkflowLinesManager;\n historyService: HistoryService;\n dragService: WorkflowDragService;\n containerNode?: WorkflowNodeEntity;\n}) => void;\n\nexport const subNodesAutoOffset: ISubNodesAutoOffset = (params) => {\n const {\n node,\n fromPort,\n toPort,\n linesManager,\n historyService,\n dragService,\n containerNode,\n padding = {\n x: 100,\n y: 100,\n },\n } = params;\n const subOffset = subPositionOffset({\n node,\n fromPort,\n toPort,\n padding,\n });\n const subsequentNodes = getSubsequentNodes({\n node: toPort.node,\n linesManager,\n });\n updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n historyService,\n dragService,\n });\n};\n","import { WorkflowNodeEntity, WorkflowPortEntity } from '@flowgram.ai/free-layout-core';\n\nimport { isContainer } from './is-container';\n\nexport type IGetContainerNode = (params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => WorkflowNodeEntity | undefined;\n\nexport const getContainerNode: IGetContainerNode = (params) => {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n};\n","import {\n WorkflowLinesManager,\n WorkflowNodeEntity,\n WorkflowNodePortsData,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IBuildLine = (params: {\n node: WorkflowNodeEntity;\n linesManager: WorkflowLinesManager;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n}) => void;\n\n/** 建立连线 */\nexport const buildLine: IBuildLine = (params) => {\n const { fromPort, node, toPort, linesManager } = params;\n const portsData = node.getData(WorkflowNodePortsData);\n if (!portsData) {\n return;\n }\n\n const shouldBuildFromLine = portsData.inputPorts?.length > 0;\n if (fromPort && shouldBuildFromLine) {\n const toTargetPort = portsData.inputPorts[0];\n const isSingleInput = portsData.inputPorts.length === 1;\n linesManager.createLine({\n from: fromPort.node.id,\n fromPort: fromPort.portID,\n to: node.id,\n toPort: isSingleInput ? undefined : toTargetPort.id,\n });\n }\n const shouldBuildToLine = portsData.outputPorts?.length > 0;\n if (toPort && shouldBuildToLine) {\n const fromTargetPort = portsData.outputPorts[0];\n linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n};\n","import { PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n} from '@flowgram.ai/free-layout-core';\n\nexport type IAdjustNodePosition = (params: {\n nodeType: string;\n position: PositionSchema;\n document: WorkflowDocument;\n dragService: WorkflowDragService;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n}) => PositionSchema;\n\n/** 调整节点坐标 */\nexport const adjustNodePosition: IAdjustNodePosition = (params) => {\n const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;\n const register = document.getNodeRegistry(nodeType);\n const size = register?.meta?.size;\n let adjustedPosition = position;\n if (!size) {\n adjustedPosition = position;\n }\n // 计算坐标偏移\n else if (fromPort && toPort) {\n // 输入输出\n adjustedPosition = {\n x: position.x,\n y: position.y - size.height / 2,\n };\n } else if (fromPort && !toPort) {\n // 仅输入\n adjustedPosition = {\n x: position.x + size.width / 2,\n y: position.y - size.height / 2,\n };\n } else if (!fromPort && toPort) {\n // 仅输出\n adjustedPosition = {\n x: position.x - size.width / 2,\n y: position.y - size.height / 2,\n };\n } else {\n adjustedPosition = position;\n }\n return dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n};\n","import { IWaitNodeRender, waitNodeRender } from './wait-node-render';\nimport {\n updateSubSequentNodesPosition,\n IUpdateSubSequentNodesPosition,\n} from './update-sub-nodes-position';\nimport { subPositionOffset, ISubPositionOffset } from './sub-position-offset';\nimport { subNodesAutoOffset, ISubNodesAutoOffset } from './sub-nodes-auto-offset';\nimport { rectDistance, IRectDistance } from './rect-distance';\nimport { getSubsequentNodes, IGetSubsequentNodes } from './get-sub-nodes';\nimport { getPortBox, IGetPortBox } from './get-port-box';\nimport { getContainerNode, IGetContainerNode } from './get-container-node';\nimport { buildLine, IBuildLine } from './build-line';\nimport { adjustNodePosition, IAdjustNodePosition } from './adjust-node-position';\n\nexport interface IWorkflowNodePanelUtils {\n adjustNodePosition: IAdjustNodePosition;\n buildLine: IBuildLine;\n getPortBox: IGetPortBox;\n getSubsequentNodes: IGetSubsequentNodes;\n getContainerNode: IGetContainerNode;\n rectDistance: IRectDistance;\n subNodesAutoOffset: ISubNodesAutoOffset;\n subPositionOffset: ISubPositionOffset;\n updateSubSequentNodesPosition: IUpdateSubSequentNodesPosition;\n waitNodeRender: IWaitNodeRender;\n}\n\nexport const WorkflowNodePanelUtils: IWorkflowNodePanelUtils = {\n adjustNodePosition,\n buildLine,\n getPortBox,\n getSubsequentNodes,\n getContainerNode,\n rectDistance,\n subNodesAutoOffset,\n subPositionOffset,\n updateSubSequentNodesPosition,\n waitNodeRender,\n};\n","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { Layer } from '@flowgram.ai/core';\n\nimport type {\n CallNodePanelParams,\n NodePanelLayerOptions,\n NodePanelRenderProps,\n NodePanelResult,\n} from './type';\nimport { WorkflowNodePanelService } from './service';\n\nexport class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {\n public static type = 'WorkflowNodePanelLayer';\n\n @inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;\n\n public node: HTMLDivElement;\n\n private renderList: Map<string, NodePanelRenderProps>;\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');\n this.node.style.zIndex = '9999';\n this.renderList = new Map();\n }\n\n public onReady(): void {\n this.service.setCallNodePanel(this.call.bind(this));\n }\n\n public onZoom(zoom: number): void {\n this.node.style.transform = `scale(${zoom})`;\n }\n\n public render(): JSX.Element {\n const NodePanelRender = this.options.renderer;\n return (\n <>\n {Array.from(this.renderList.keys()).map((taskId) => {\n const renderProps = this.renderList.get(taskId)!;\n return <NodePanelRender key={taskId} {...renderProps} />;\n })}\n </>\n );\n }\n\n private async call(params: CallNodePanelParams): Promise<void> {\n const taskId = nanoid();\n const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;\n return new Promise((resolve) => {\n const unmount = () => {\n // 清理挂载的组件\n this.renderList.delete(taskId);\n this.render();\n resolve();\n };\n const handleClose = () => {\n unmount();\n onClose();\n };\n const handleSelect = (params?: NodePanelResult) => {\n onSelect(params);\n if (!enableMultiAdd) {\n unmount();\n }\n };\n const renderProps: NodePanelRenderProps = {\n ...params,\n panelProps,\n onSelect: handleSelect,\n onClose: handleClose,\n };\n this.renderList.set(taskId, renderProps);\n this.render();\n });\n }\n}\n"],"mappings":"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","names":["import_core","import_utils","import_free_layout_core","import_free_history_plugin","import_core","node","nodeTrans","import_utils","import_document","import_utils","_a","_b","node","import_free_layout_core","import_inversify","import_utils","import_free_layout_core","import_core","React","params"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/free-node-panel-plugin",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.8",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"inversify": "^6.0.1",
|
|
20
20
|
"reflect-metadata": "~0.2.2",
|
|
21
21
|
"lodash": "^4.17.21",
|
|
22
|
-
"@flowgram.ai/core": "0.1.0-alpha.
|
|
23
|
-
"@flowgram.ai/document": "0.1.0-alpha.
|
|
24
|
-
"@flowgram.ai/free-history-plugin": "0.1.0-alpha.
|
|
25
|
-
"@flowgram.ai/
|
|
26
|
-
"@flowgram.ai/utils": "0.1.0-alpha.
|
|
27
|
-
"@flowgram.ai/
|
|
22
|
+
"@flowgram.ai/core": "0.1.0-alpha.8",
|
|
23
|
+
"@flowgram.ai/document": "0.1.0-alpha.8",
|
|
24
|
+
"@flowgram.ai/free-history-plugin": "0.1.0-alpha.8",
|
|
25
|
+
"@flowgram.ai/renderer": "0.1.0-alpha.8",
|
|
26
|
+
"@flowgram.ai/utils": "0.1.0-alpha.8",
|
|
27
|
+
"@flowgram.ai/free-layout-core": "0.1.0-alpha.8"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/bezier-js": "4.1.3",
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
"tsup": "^8.0.1",
|
|
41
41
|
"typescript": "^5.0.4",
|
|
42
42
|
"vitest": "^0.34.6",
|
|
43
|
-
"@flowgram.ai/eslint-config": "0.1.0-alpha.
|
|
44
|
-
"@flowgram.ai/ts-config": "0.1.0-alpha.
|
|
43
|
+
"@flowgram.ai/eslint-config": "0.1.0-alpha.8",
|
|
44
|
+
"@flowgram.ai/ts-config": "0.1.0-alpha.8"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"react": ">=
|
|
48
|
-
"react-dom": ">=
|
|
47
|
+
"react": ">=16.8",
|
|
48
|
+
"react-dom": ">=16.8",
|
|
49
49
|
"styled-components": ">=4"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|