@flowgram.ai/free-node-panel-plugin 0.1.12 → 0.1.14
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 +8 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/esm/index.js
CHANGED
|
@@ -26,7 +26,6 @@ import {
|
|
|
26
26
|
import { WorkflowSelectService } from "@flowgram.ai/free-layout-core";
|
|
27
27
|
import { FreeOperationType, HistoryService } from "@flowgram.ai/free-history-plugin";
|
|
28
28
|
import { FlowNodeTransformData } from "@flowgram.ai/document";
|
|
29
|
-
import { FlowNodeBaseType } from "@flowgram.ai/document";
|
|
30
29
|
import { PlaygroundConfigEntity } from "@flowgram.ai/core";
|
|
31
30
|
import { TransformData } from "@flowgram.ai/core";
|
|
32
31
|
|
|
@@ -242,7 +241,7 @@ var WorkflowNodePanelService = class {
|
|
|
242
241
|
}
|
|
243
242
|
const fromNode = fromPort?.node;
|
|
244
243
|
const fromContainer = fromNode?.parent;
|
|
245
|
-
if (fromNode
|
|
244
|
+
if (this.isContainer(fromNode)) {
|
|
246
245
|
return fromNode;
|
|
247
246
|
}
|
|
248
247
|
return fromContainer;
|
|
@@ -250,7 +249,7 @@ var WorkflowNodePanelService = class {
|
|
|
250
249
|
/** 获取端口矩形 */
|
|
251
250
|
getPortBox(port, offset = { x: 0, y: 0 }) {
|
|
252
251
|
const node = port.node;
|
|
253
|
-
if (node
|
|
252
|
+
if (this.isContainer(node)) {
|
|
254
253
|
const { point } = port;
|
|
255
254
|
if (port.portType === "input") {
|
|
256
255
|
return new Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);
|
|
@@ -329,7 +328,7 @@ var WorkflowNodePanelService = class {
|
|
|
329
328
|
}
|
|
330
329
|
/** 获取后续节点 */
|
|
331
330
|
getSubsequentNodes(node) {
|
|
332
|
-
if (node
|
|
331
|
+
if (this.isContainer(node)) {
|
|
333
332
|
return [];
|
|
334
333
|
}
|
|
335
334
|
const brothers = node.parent?.collapsedChildren ?? [];
|
|
@@ -339,7 +338,7 @@ var WorkflowNodePanelService = class {
|
|
|
339
338
|
if (!linesMap.has(line.from.id)) {
|
|
340
339
|
linesMap.set(line.from.id, []);
|
|
341
340
|
}
|
|
342
|
-
if (!line.to?.id || line.to
|
|
341
|
+
if (!line.to?.id || this.isContainer(line.to)) {
|
|
343
342
|
return;
|
|
344
343
|
}
|
|
345
344
|
linesMap.get(line.from.id)?.push(line.to.id);
|
|
@@ -408,6 +407,10 @@ var WorkflowNodePanelService = class {
|
|
|
408
407
|
}
|
|
409
408
|
});
|
|
410
409
|
}
|
|
410
|
+
/** 是否容器节点 */
|
|
411
|
+
isContainer(node) {
|
|
412
|
+
return node?.getNodeMeta().isContainer ?? false;
|
|
413
|
+
}
|
|
411
414
|
};
|
|
412
415
|
__decorateClass([
|
|
413
416
|
inject(WorkflowDocument)
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create-plugin.ts","../../src/service.ts","../../src/utils.ts","../../src/layer.tsx"],"sourcesContent":["import {\n definePluginCreator,\n type PluginBindConfig,\n type PluginContext,\n} 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 { delay, DisposableCollection, Rectangle } from '@flowgram.ai/utils';\nimport type { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowPortEntity,\n WorkflowNodePortsData,\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 { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { isGreaterThan, isLessThan } from './utils';\nimport type { CallNodePanel, NodePanelCallParams, NodePanelResult } 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 private 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: this.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 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 = this.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 : this.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = await 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 const subOffset = this.subPositionOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n });\n const subsequentNodes = this.getSubsequentNodes(toPort.node);\n this.updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await delay(20);\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n this.buildLine({\n fromPort,\n node,\n toPort,\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 /** 建立连线 */\n private buildLine(params: {\n node: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): void {\n const { fromPort, node, toPort } = 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 this.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 this.linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n }\n\n /** 调整节点坐标 */\n private adjustNodePosition(params: {\n nodeType: string;\n position: PositionSchema;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n }): PositionSchema {\n const { nodeType, position, fromPort, toPort, containerNode } = params;\n const register = this.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 this.dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n }\n\n private getContainerNode(params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): WorkflowNodeEntity | undefined {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (fromNode?.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n }\n\n /** 获取端口矩形 */\n private getPortBox(port: WorkflowPortEntity, offset: IPoint = { x: 0, y: 0 }): Rectangle {\n const node = port.node;\n if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\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\n /** 后续节点位置偏移 */\n private subPositionOffset(params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: {\n x: number;\n y: number;\n };\n }):\n | {\n x: number;\n y: number;\n }\n | undefined {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = this.getPortBox(fromPort);\n const toBox = this.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 = this.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\n /** 矩形间距 */\n private rectDistance(rectA: Rectangle, rectB: Rectangle): IPoint {\n // 计算 x 轴距离\n const distanceX = Math.abs(\n Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left)\n );\n // 计算 y 轴距离\n const distanceY = Math.abs(\n Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top)\n );\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 /** 获取后续节点 */\n private getSubsequentNodes(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\n return [];\n }\n const brothers = node.parent?.collapsedChildren ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n this.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 line.to.flowNodeType === FlowNodeBaseType.SUB_CANVAS // 子画布内部成环\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\n /** 更新后续节点位置 */\n private updateSubSequentNodesPosition(params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n }): void {\n const { node, subsequentNodes, fromPort, toPort, containerNode, offset } = 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 this.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 = this.getPortBox(fromPort);\n const toBox = this.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 = this.dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n this.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}\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","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { Layer } from '@flowgram.ai/core';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { domUtils } from '@flowgram.ai/utils';\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 { enableMultiAdd, onSelect, onClose } = 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 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":["node","nodeTrans","inject","params","inject"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-plugin.ts","../../src/service.ts","../../src/utils.ts","../../src/layer.tsx"],"sourcesContent":["import {\n definePluginCreator,\n type PluginBindConfig,\n type PluginContext,\n} 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 { delay, DisposableCollection, Rectangle } from '@flowgram.ai/utils';\nimport type { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowPortEntity,\n WorkflowNodePortsData,\n WorkflowNodeEntity,\n WorkflowNodeMeta,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { isGreaterThan, isLessThan } from './utils';\nimport type { CallNodePanel, NodePanelCallParams, NodePanelResult } 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 private 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: this.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 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 = this.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 : this.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = await 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 const subOffset = this.subPositionOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n });\n const subsequentNodes = this.getSubsequentNodes(toPort.node);\n this.updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await delay(20);\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n this.buildLine({\n fromPort,\n node,\n toPort,\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 /** 建立连线 */\n private buildLine(params: {\n node: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): void {\n const { fromPort, node, toPort } = 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 this.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 this.linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n }\n\n /** 调整节点坐标 */\n private adjustNodePosition(params: {\n nodeType: string;\n position: PositionSchema;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n }): PositionSchema {\n const { nodeType, position, fromPort, toPort, containerNode } = params;\n const register = this.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 this.dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n }\n\n private getContainerNode(params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): WorkflowNodeEntity | undefined {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (this.isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n }\n\n /** 获取端口矩形 */\n private getPortBox(port: WorkflowPortEntity, offset: IPoint = { x: 0, y: 0 }): Rectangle {\n const node = port.node;\n if (this.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\n /** 后续节点位置偏移 */\n private subPositionOffset(params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: {\n x: number;\n y: number;\n };\n }):\n | {\n x: number;\n y: number;\n }\n | undefined {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = this.getPortBox(fromPort);\n const toBox = this.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 = this.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\n /** 矩形间距 */\n private rectDistance(rectA: Rectangle, rectB: Rectangle): IPoint {\n // 计算 x 轴距离\n const distanceX = Math.abs(\n Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left)\n );\n // 计算 y 轴距离\n const distanceY = Math.abs(\n Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top)\n );\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 /** 获取后续节点 */\n private getSubsequentNodes(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n if (this.isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.collapsedChildren ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n this.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 this.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\n /** 更新后续节点位置 */\n private updateSubSequentNodesPosition(params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n }): void {\n const { node, subsequentNodes, fromPort, toPort, containerNode, offset } = 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 this.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 = this.getPortBox(fromPort);\n const toBox = this.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 = this.dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n this.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\n /** 是否容器节点 */\n private isContainer(node?: WorkflowNodeEntity): boolean {\n return node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\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","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { Layer } from '@flowgram.ai/core';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { domUtils } from '@flowgram.ai/utils';\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 { enableMultiAdd, onSelect, onClose } = 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 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":["node","nodeTrans","inject","params","inject"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -98,6 +98,8 @@ declare class WorkflowNodePanelService {
|
|
|
98
98
|
private getSubsequentNodes;
|
|
99
99
|
/** 更新后续节点位置 */
|
|
100
100
|
private updateSubSequentNodesPosition;
|
|
101
|
+
/** 是否容器节点 */
|
|
102
|
+
private isContainer;
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
export { type NodePanelPluginOptions, type NodePanelRender, type NodePanelRenderProps, type NodePanelResult, type NodePanelLayerOptions as NodePanelServiceOptions, WorkflowNodePanelService, createFreeNodePanelPlugin };
|
package/dist/index.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ declare class WorkflowNodePanelService {
|
|
|
98
98
|
private getSubsequentNodes;
|
|
99
99
|
/** 更新后续节点位置 */
|
|
100
100
|
private updateSubSequentNodesPosition;
|
|
101
|
+
/** 是否容器节点 */
|
|
102
|
+
private isContainer;
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
export { type NodePanelPluginOptions, type NodePanelRender, type NodePanelRenderProps, type NodePanelResult, type NodePanelLayerOptions as NodePanelServiceOptions, WorkflowNodePanelService, createFreeNodePanelPlugin };
|
package/dist/index.js
CHANGED
|
@@ -53,7 +53,6 @@ var import_free_layout_core = require("@flowgram.ai/free-layout-core");
|
|
|
53
53
|
var import_free_layout_core2 = require("@flowgram.ai/free-layout-core");
|
|
54
54
|
var import_free_history_plugin = require("@flowgram.ai/free-history-plugin");
|
|
55
55
|
var import_document = require("@flowgram.ai/document");
|
|
56
|
-
var import_document2 = require("@flowgram.ai/document");
|
|
57
56
|
var import_core = require("@flowgram.ai/core");
|
|
58
57
|
var import_core2 = require("@flowgram.ai/core");
|
|
59
58
|
|
|
@@ -269,7 +268,7 @@ var WorkflowNodePanelService = class {
|
|
|
269
268
|
}
|
|
270
269
|
const fromNode = fromPort?.node;
|
|
271
270
|
const fromContainer = fromNode?.parent;
|
|
272
|
-
if (fromNode
|
|
271
|
+
if (this.isContainer(fromNode)) {
|
|
273
272
|
return fromNode;
|
|
274
273
|
}
|
|
275
274
|
return fromContainer;
|
|
@@ -277,7 +276,7 @@ var WorkflowNodePanelService = class {
|
|
|
277
276
|
/** 获取端口矩形 */
|
|
278
277
|
getPortBox(port, offset = { x: 0, y: 0 }) {
|
|
279
278
|
const node = port.node;
|
|
280
|
-
if (node
|
|
279
|
+
if (this.isContainer(node)) {
|
|
281
280
|
const { point } = port;
|
|
282
281
|
if (port.portType === "input") {
|
|
283
282
|
return new import_utils.Rectangle(point.x + offset.x, point.y - 50 + offset.y, 300, 100);
|
|
@@ -356,7 +355,7 @@ var WorkflowNodePanelService = class {
|
|
|
356
355
|
}
|
|
357
356
|
/** 获取后续节点 */
|
|
358
357
|
getSubsequentNodes(node) {
|
|
359
|
-
if (node
|
|
358
|
+
if (this.isContainer(node)) {
|
|
360
359
|
return [];
|
|
361
360
|
}
|
|
362
361
|
const brothers = node.parent?.collapsedChildren ?? [];
|
|
@@ -366,7 +365,7 @@ var WorkflowNodePanelService = class {
|
|
|
366
365
|
if (!linesMap.has(line.from.id)) {
|
|
367
366
|
linesMap.set(line.from.id, []);
|
|
368
367
|
}
|
|
369
|
-
if (!line.to?.id || line.to
|
|
368
|
+
if (!line.to?.id || this.isContainer(line.to)) {
|
|
370
369
|
return;
|
|
371
370
|
}
|
|
372
371
|
linesMap.get(line.from.id)?.push(line.to.id);
|
|
@@ -435,6 +434,10 @@ var WorkflowNodePanelService = class {
|
|
|
435
434
|
}
|
|
436
435
|
});
|
|
437
436
|
}
|
|
437
|
+
/** 是否容器节点 */
|
|
438
|
+
isContainer(node) {
|
|
439
|
+
return node?.getNodeMeta().isContainer ?? false;
|
|
440
|
+
}
|
|
438
441
|
};
|
|
439
442
|
__decorateClass([
|
|
440
443
|
(0, import_inversify.inject)(import_free_layout_core.WorkflowDocument)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-plugin.ts","../src/service.ts","../src/utils.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';\n","import {\n definePluginCreator,\n type PluginBindConfig,\n type PluginContext,\n} 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 { delay, DisposableCollection, Rectangle } from '@flowgram.ai/utils';\nimport type { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowPortEntity,\n WorkflowNodePortsData,\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 { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { isGreaterThan, isLessThan } from './utils';\nimport type { CallNodePanel, NodePanelCallParams, NodePanelResult } 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 private 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: this.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 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 = this.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 : this.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = await 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 const subOffset = this.subPositionOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n });\n const subsequentNodes = this.getSubsequentNodes(toPort.node);\n this.updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await delay(20);\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n this.buildLine({\n fromPort,\n node,\n toPort,\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 /** 建立连线 */\n private buildLine(params: {\n node: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): void {\n const { fromPort, node, toPort } = 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 this.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 this.linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n }\n\n /** 调整节点坐标 */\n private adjustNodePosition(params: {\n nodeType: string;\n position: PositionSchema;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n }): PositionSchema {\n const { nodeType, position, fromPort, toPort, containerNode } = params;\n const register = this.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 this.dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n }\n\n private getContainerNode(params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): WorkflowNodeEntity | undefined {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (fromNode?.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n }\n\n /** 获取端口矩形 */\n private getPortBox(port: WorkflowPortEntity, offset: IPoint = { x: 0, y: 0 }): Rectangle {\n const node = port.node;\n if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\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\n /** 后续节点位置偏移 */\n private subPositionOffset(params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: {\n x: number;\n y: number;\n };\n }):\n | {\n x: number;\n y: number;\n }\n | undefined {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = this.getPortBox(fromPort);\n const toBox = this.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 = this.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\n /** 矩形间距 */\n private rectDistance(rectA: Rectangle, rectB: Rectangle): IPoint {\n // 计算 x 轴距离\n const distanceX = Math.abs(\n Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left)\n );\n // 计算 y 轴距离\n const distanceY = Math.abs(\n Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top)\n );\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 /** 获取后续节点 */\n private getSubsequentNodes(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {\n return [];\n }\n const brothers = node.parent?.collapsedChildren ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n this.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 line.to.flowNodeType === FlowNodeBaseType.SUB_CANVAS // 子画布内部成环\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\n /** 更新后续节点位置 */\n private updateSubSequentNodesPosition(params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n }): void {\n const { node, subsequentNodes, fromPort, toPort, containerNode, offset } = 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 this.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 = this.getPortBox(fromPort);\n const toBox = this.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 = this.dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n this.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}\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","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { Layer } from '@flowgram.ai/core';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { domUtils } from '@flowgram.ai/utils';\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 { enableMultiAdd, onSelect, onClose } = 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 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_free_layout_core","import_document","import_core","node","nodeTrans","import_inversify","import_core","import_free_layout_core","import_utils","React","params"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-plugin.ts","../src/service.ts","../src/utils.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';\n","import {\n definePluginCreator,\n type PluginBindConfig,\n type PluginContext,\n} 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 { delay, DisposableCollection, Rectangle } from '@flowgram.ai/utils';\nimport type { IPoint, PositionSchema } from '@flowgram.ai/utils';\nimport {\n WorkflowDocument,\n WorkflowDragService,\n WorkflowLinesManager,\n WorkflowPortEntity,\n WorkflowNodePortsData,\n WorkflowNodeEntity,\n WorkflowNodeMeta,\n} from '@flowgram.ai/free-layout-core';\nimport { WorkflowSelectService } from '@flowgram.ai/free-layout-core';\nimport { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\nimport { PlaygroundConfigEntity } from '@flowgram.ai/core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { isGreaterThan, isLessThan } from './utils';\nimport type { CallNodePanel, NodePanelCallParams, NodePanelResult } 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 private 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: this.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 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 = this.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 : this.adjustNodePosition({\n nodeType,\n position: enableSelectPosition ? selectPosition : panelPosition,\n fromPort,\n toPort,\n containerNode,\n });\n\n // 创建节点\n const node: WorkflowNodeEntity = await 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 const subOffset = this.subPositionOffset({\n node,\n fromPort,\n toPort,\n padding: autoOffsetPadding,\n });\n const subsequentNodes = this.getSubsequentNodes(toPort.node);\n this.updateSubSequentNodesPosition({\n node,\n subsequentNodes,\n fromPort,\n toPort,\n containerNode,\n offset: subOffset,\n });\n }\n\n if (!enableBuildLine && !enableDragNode) {\n return node;\n }\n\n // 等待节点渲染\n await delay(20);\n\n // 重建连线(需先让端口完成渲染)\n if (enableBuildLine) {\n this.buildLine({\n fromPort,\n node,\n toPort,\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 /** 建立连线 */\n private buildLine(params: {\n node: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): void {\n const { fromPort, node, toPort } = 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 this.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 this.linesManager.createLine({\n from: node.id,\n fromPort: fromTargetPort.portID,\n to: toPort.node.id,\n toPort: toPort.portID,\n });\n }\n }\n\n /** 调整节点坐标 */\n private adjustNodePosition(params: {\n nodeType: string;\n position: PositionSchema;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n }): PositionSchema {\n const { nodeType, position, fromPort, toPort, containerNode } = params;\n const register = this.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 this.dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);\n }\n\n private getContainerNode(params: {\n containerNode?: WorkflowNodeEntity;\n fromPort?: WorkflowPortEntity;\n toPort?: WorkflowPortEntity;\n }): WorkflowNodeEntity | undefined {\n const { fromPort, containerNode } = params;\n if (containerNode) {\n return containerNode;\n }\n const fromNode = fromPort?.node;\n const fromContainer = fromNode?.parent;\n if (this.isContainer(fromNode)) {\n // 子画布内部输入连线\n return fromNode;\n }\n return fromContainer;\n }\n\n /** 获取端口矩形 */\n private getPortBox(port: WorkflowPortEntity, offset: IPoint = { x: 0, y: 0 }): Rectangle {\n const node = port.node;\n if (this.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\n /** 后续节点位置偏移 */\n private subPositionOffset(params: {\n node: WorkflowNodeEntity;\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n padding: {\n x: number;\n y: number;\n };\n }):\n | {\n x: number;\n y: number;\n }\n | undefined {\n const { node, fromPort, toPort, padding } = params;\n\n const fromBox = this.getPortBox(fromPort);\n const toBox = this.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 = this.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\n /** 矩形间距 */\n private rectDistance(rectA: Rectangle, rectB: Rectangle): IPoint {\n // 计算 x 轴距离\n const distanceX = Math.abs(\n Math.min(rectA.right, rectB.right) - Math.max(rectA.left, rectB.left)\n );\n // 计算 y 轴距离\n const distanceY = Math.abs(\n Math.min(rectA.bottom, rectB.bottom) - Math.max(rectA.top, rectB.top)\n );\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 /** 获取后续节点 */\n private getSubsequentNodes(node: WorkflowNodeEntity): WorkflowNodeEntity[] {\n if (this.isContainer(node)) {\n return [];\n }\n const brothers = node.parent?.collapsedChildren ?? [];\n const linkedBrothers = new Set();\n const linesMap = new Map<string, string[]>();\n this.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 this.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\n /** 更新后续节点位置 */\n private updateSubSequentNodesPosition(params: {\n node: WorkflowNodeEntity;\n subsequentNodes: WorkflowNodeEntity[];\n fromPort: WorkflowPortEntity;\n toPort: WorkflowPortEntity;\n containerNode?: WorkflowNodeEntity;\n offset?: IPoint;\n }): void {\n const { node, subsequentNodes, fromPort, toPort, containerNode, offset } = 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 this.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 = this.getPortBox(fromPort);\n const toBox = this.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 = this.dragService.adjustSubNodePosition(\n node.flowNodeType as string,\n containerNode,\n nodePos\n );\n }\n this.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\n /** 是否容器节点 */\n private isContainer(node?: WorkflowNodeEntity): boolean {\n return node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;\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","/* eslint-disable react/no-deprecated */\nimport React from 'react';\n\nimport { inject } from 'inversify';\nimport { Layer } from '@flowgram.ai/core';\nimport { nanoid } from '@flowgram.ai/free-layout-core';\nimport { domUtils } from '@flowgram.ai/utils';\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 { enableMultiAdd, onSelect, onClose } = 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 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_free_layout_core","import_core","node","nodeTrans","import_inversify","import_core","import_free_layout_core","import_utils","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.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
"inversify": "^6.0.1",
|
|
19
19
|
"reflect-metadata": "~0.2.2",
|
|
20
20
|
"lodash": "^4.17.21",
|
|
21
|
-
"@flowgram.ai/core": "0.1.
|
|
22
|
-
"@flowgram.ai/document": "0.1.
|
|
23
|
-
"@flowgram.ai/free-history-plugin": "0.1.
|
|
24
|
-
"@flowgram.ai/free-layout-core": "0.1.
|
|
25
|
-
"@flowgram.ai/renderer": "0.1.
|
|
26
|
-
"@flowgram.ai/utils": "0.1.
|
|
21
|
+
"@flowgram.ai/core": "0.1.14",
|
|
22
|
+
"@flowgram.ai/document": "0.1.14",
|
|
23
|
+
"@flowgram.ai/free-history-plugin": "0.1.14",
|
|
24
|
+
"@flowgram.ai/free-layout-core": "0.1.14",
|
|
25
|
+
"@flowgram.ai/renderer": "0.1.14",
|
|
26
|
+
"@flowgram.ai/utils": "0.1.14"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/bezier-js": "4.1.3",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"tsup": "^8.0.1",
|
|
40
40
|
"typescript": "^5.0.4",
|
|
41
41
|
"vitest": "^0.34.6",
|
|
42
|
-
"@flowgram.ai/eslint-config": "0.1.
|
|
43
|
-
"@flowgram.ai/ts-config": "0.1.
|
|
42
|
+
"@flowgram.ai/eslint-config": "0.1.14",
|
|
43
|
+
"@flowgram.ai/ts-config": "0.1.14"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"react": ">=17",
|