@flowgram.ai/free-node-panel-plugin 0.1.0-alpha.8 → 0.1.0-alpha.9

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 CHANGED
@@ -39,10 +39,7 @@ 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) => {
43
- var _a;
44
- return (_a = node == null ? void 0 : node.getNodeMeta().isContainer) != null ? _a : false;
45
- };
42
+ var isContainer = (node) => node?.getNodeMeta().isContainer ?? false;
46
43
 
47
44
  // src/utils/get-port-box.ts
48
45
  var getPortBox = (port, offset = { x: 0, y: 0 }) => {
@@ -159,12 +156,11 @@ var isLessThan = (a, b) => {
159
156
 
160
157
  // src/utils/sub-position-offset.ts
161
158
  var subPositionOffset = (params) => {
162
- var _a, _b;
163
159
  const { node, fromPort, toPort, padding } = params;
164
160
  const fromBox = getPortBox(fromPort);
165
161
  const toBox = getPortBox(toPort);
166
162
  const nodeTrans = node.getData(FlowNodeTransformData2);
167
- const nodeSize = (_b = (_a = node.getNodeMeta()) == null ? void 0 : _a.size) != null ? _b : {
163
+ const nodeSize = node.getNodeMeta()?.size ?? {
168
164
  width: nodeTrans.bounds.width,
169
165
  height: nodeTrans.bounds.height
170
166
  };
@@ -209,31 +205,28 @@ var subPositionOffset = (params) => {
209
205
 
210
206
  // src/utils/get-sub-nodes.ts
211
207
  var getSubsequentNodes = (params) => {
212
- var _a, _b;
213
208
  const { node, linesManager } = params;
214
209
  if (isContainer(node)) {
215
210
  return [];
216
211
  }
217
- const brothers = (_b = (_a = node.parent) == null ? void 0 : _a.blocks) != null ? _b : [];
212
+ const brothers = node.parent?.blocks ?? [];
218
213
  const linkedBrothers = /* @__PURE__ */ new Set();
219
214
  const linesMap = /* @__PURE__ */ new Map();
220
215
  linesManager.getAllLines().forEach((line) => {
221
- var _a2, _b2;
222
216
  if (!linesMap.has(line.from.id)) {
223
217
  linesMap.set(line.from.id, []);
224
218
  }
225
- if (!((_a2 = line.to) == null ? void 0 : _a2.id) || isContainer(line.to)) {
219
+ if (!line.to?.id || isContainer(line.to)) {
226
220
  return;
227
221
  }
228
- (_b2 = linesMap.get(line.from.id)) == null ? void 0 : _b2.push(line.to.id);
222
+ linesMap.get(line.from.id)?.push(line.to.id);
229
223
  });
230
224
  const bfs = (nodeId) => {
231
- var _a2;
232
225
  if (linkedBrothers.has(nodeId)) {
233
226
  return;
234
227
  }
235
228
  linkedBrothers.add(nodeId);
236
- const nextNodes = (_a2 = linesMap.get(nodeId)) != null ? _a2 : [];
229
+ const nextNodes = linesMap.get(nodeId) ?? [];
237
230
  nextNodes.forEach(bfs);
238
231
  };
239
232
  bfs(node.id);
@@ -284,8 +277,8 @@ var getContainerNode = (params) => {
284
277
  if (containerNode) {
285
278
  return containerNode;
286
279
  }
287
- const fromNode = fromPort == null ? void 0 : fromPort.node;
288
- const fromContainer = fromNode == null ? void 0 : fromNode.parent;
280
+ const fromNode = fromPort?.node;
281
+ const fromContainer = fromNode?.parent;
289
282
  if (isContainer(fromNode)) {
290
283
  return fromNode;
291
284
  }
@@ -297,13 +290,12 @@ import {
297
290
  WorkflowNodePortsData
298
291
  } from "@flowgram.ai/free-layout-core";
299
292
  var buildLine = (params) => {
300
- var _a, _b;
301
293
  const { fromPort, node, toPort, linesManager } = params;
302
294
  const portsData = node.getData(WorkflowNodePortsData);
303
295
  if (!portsData) {
304
296
  return;
305
297
  }
306
- const shouldBuildFromLine = ((_a = portsData.inputPorts) == null ? void 0 : _a.length) > 0;
298
+ const shouldBuildFromLine = portsData.inputPorts?.length > 0;
307
299
  if (fromPort && shouldBuildFromLine) {
308
300
  const toTargetPort = portsData.inputPorts[0];
309
301
  const isSingleInput = portsData.inputPorts.length === 1;
@@ -314,7 +306,7 @@ var buildLine = (params) => {
314
306
  toPort: isSingleInput ? void 0 : toTargetPort.id
315
307
  });
316
308
  }
317
- const shouldBuildToLine = ((_b = portsData.outputPorts) == null ? void 0 : _b.length) > 0;
309
+ const shouldBuildToLine = portsData.outputPorts?.length > 0;
318
310
  if (toPort && shouldBuildToLine) {
319
311
  const fromTargetPort = portsData.outputPorts[0];
320
312
  linesManager.createLine({
@@ -328,10 +320,9 @@ var buildLine = (params) => {
328
320
 
329
321
  // src/utils/adjust-node-position.ts
330
322
  var adjustNodePosition = (params) => {
331
- var _a;
332
323
  const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;
333
324
  const register = document.getNodeRegistry(nodeType);
334
- const size = (_a = register == null ? void 0 : register.meta) == null ? void 0 : _a.size;
325
+ const size = register?.meta?.size;
335
326
  let adjustedPosition = position;
336
327
  if (!size) {
337
328
  adjustedPosition = position;
@@ -408,7 +399,7 @@ var WorkflowNodePanelService = class {
408
399
  }),
409
400
  onSelect: async (panelParams) => {
410
401
  const node = await this.addNode(callParams, panelParams);
411
- afterAddNode == null ? void 0 : afterAddNode(node);
402
+ afterAddNode?.(node);
412
403
  if (!enableMultiAdd) {
413
404
  resolve(node);
414
405
  } else if (node) {
@@ -481,8 +472,8 @@ var WorkflowNodePanelService = class {
481
472
  const node = this.document.createWorkflowNodeByType(
482
473
  nodeType,
483
474
  nodePosition,
484
- nodeJSON != null ? nodeJSON : {},
485
- containerNode == null ? void 0 : containerNode.id
475
+ nodeJSON ?? {},
476
+ containerNode?.id
486
477
  );
487
478
  if (!node) {
488
479
  return;
@@ -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","_a","_b","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","node","WorkflowLinesManager","HistoryService","inject","params","inject"]}
package/dist/index.js CHANGED
@@ -70,10 +70,7 @@ 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) => {
74
- var _a;
75
- return (_a = node == null ? void 0 : node.getNodeMeta().isContainer) != null ? _a : false;
76
- };
73
+ var isContainer = (node) => node?.getNodeMeta().isContainer ?? false;
77
74
 
78
75
  // src/utils/get-port-box.ts
79
76
  var getPortBox = (port, offset = { x: 0, y: 0 }) => {
@@ -190,12 +187,11 @@ var isLessThan = (a, b) => {
190
187
 
191
188
  // src/utils/sub-position-offset.ts
192
189
  var subPositionOffset = (params) => {
193
- var _a, _b;
194
190
  const { node, fromPort, toPort, padding } = params;
195
191
  const fromBox = getPortBox(fromPort);
196
192
  const toBox = getPortBox(toPort);
197
193
  const nodeTrans = node.getData(import_document2.FlowNodeTransformData);
198
- const nodeSize = (_b = (_a = node.getNodeMeta()) == null ? void 0 : _a.size) != null ? _b : {
194
+ const nodeSize = node.getNodeMeta()?.size ?? {
199
195
  width: nodeTrans.bounds.width,
200
196
  height: nodeTrans.bounds.height
201
197
  };
@@ -240,31 +236,28 @@ var subPositionOffset = (params) => {
240
236
 
241
237
  // src/utils/get-sub-nodes.ts
242
238
  var getSubsequentNodes = (params) => {
243
- var _a, _b;
244
239
  const { node, linesManager } = params;
245
240
  if (isContainer(node)) {
246
241
  return [];
247
242
  }
248
- const brothers = (_b = (_a = node.parent) == null ? void 0 : _a.blocks) != null ? _b : [];
243
+ const brothers = node.parent?.blocks ?? [];
249
244
  const linkedBrothers = /* @__PURE__ */ new Set();
250
245
  const linesMap = /* @__PURE__ */ new Map();
251
246
  linesManager.getAllLines().forEach((line) => {
252
- var _a2, _b2;
253
247
  if (!linesMap.has(line.from.id)) {
254
248
  linesMap.set(line.from.id, []);
255
249
  }
256
- if (!((_a2 = line.to) == null ? void 0 : _a2.id) || isContainer(line.to)) {
250
+ if (!line.to?.id || isContainer(line.to)) {
257
251
  return;
258
252
  }
259
- (_b2 = linesMap.get(line.from.id)) == null ? void 0 : _b2.push(line.to.id);
253
+ linesMap.get(line.from.id)?.push(line.to.id);
260
254
  });
261
255
  const bfs = (nodeId) => {
262
- var _a2;
263
256
  if (linkedBrothers.has(nodeId)) {
264
257
  return;
265
258
  }
266
259
  linkedBrothers.add(nodeId);
267
- const nextNodes = (_a2 = linesMap.get(nodeId)) != null ? _a2 : [];
260
+ const nextNodes = linesMap.get(nodeId) ?? [];
268
261
  nextNodes.forEach(bfs);
269
262
  };
270
263
  bfs(node.id);
@@ -315,8 +308,8 @@ var getContainerNode = (params) => {
315
308
  if (containerNode) {
316
309
  return containerNode;
317
310
  }
318
- const fromNode = fromPort == null ? void 0 : fromPort.node;
319
- const fromContainer = fromNode == null ? void 0 : fromNode.parent;
311
+ const fromNode = fromPort?.node;
312
+ const fromContainer = fromNode?.parent;
320
313
  if (isContainer(fromNode)) {
321
314
  return fromNode;
322
315
  }
@@ -326,13 +319,12 @@ var getContainerNode = (params) => {
326
319
  // src/utils/build-line.ts
327
320
  var import_free_layout_core2 = require("@flowgram.ai/free-layout-core");
328
321
  var buildLine = (params) => {
329
- var _a, _b;
330
322
  const { fromPort, node, toPort, linesManager } = params;
331
323
  const portsData = node.getData(import_free_layout_core2.WorkflowNodePortsData);
332
324
  if (!portsData) {
333
325
  return;
334
326
  }
335
- const shouldBuildFromLine = ((_a = portsData.inputPorts) == null ? void 0 : _a.length) > 0;
327
+ const shouldBuildFromLine = portsData.inputPorts?.length > 0;
336
328
  if (fromPort && shouldBuildFromLine) {
337
329
  const toTargetPort = portsData.inputPorts[0];
338
330
  const isSingleInput = portsData.inputPorts.length === 1;
@@ -343,7 +335,7 @@ var buildLine = (params) => {
343
335
  toPort: isSingleInput ? void 0 : toTargetPort.id
344
336
  });
345
337
  }
346
- const shouldBuildToLine = ((_b = portsData.outputPorts) == null ? void 0 : _b.length) > 0;
338
+ const shouldBuildToLine = portsData.outputPorts?.length > 0;
347
339
  if (toPort && shouldBuildToLine) {
348
340
  const fromTargetPort = portsData.outputPorts[0];
349
341
  linesManager.createLine({
@@ -357,10 +349,9 @@ var buildLine = (params) => {
357
349
 
358
350
  // src/utils/adjust-node-position.ts
359
351
  var adjustNodePosition = (params) => {
360
- var _a;
361
352
  const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;
362
353
  const register = document.getNodeRegistry(nodeType);
363
- const size = (_a = register == null ? void 0 : register.meta) == null ? void 0 : _a.size;
354
+ const size = register?.meta?.size;
364
355
  let adjustedPosition = position;
365
356
  if (!size) {
366
357
  adjustedPosition = position;
@@ -437,7 +428,7 @@ var WorkflowNodePanelService = class {
437
428
  }),
438
429
  onSelect: async (panelParams) => {
439
430
  const node = await this.addNode(callParams, panelParams);
440
- afterAddNode == null ? void 0 : afterAddNode(node);
431
+ afterAddNode?.(node);
441
432
  if (!enableMultiAdd) {
442
433
  resolve(node);
443
434
  } else if (node) {
@@ -510,8 +501,8 @@ var WorkflowNodePanelService = class {
510
501
  const node = this.document.createWorkflowNodeByType(
511
502
  nodeType,
512
503
  nodePosition,
513
- nodeJSON != null ? nodeJSON : {},
514
- containerNode == null ? void 0 : containerNode.id
504
+ nodeJSON ?? {},
505
+ containerNode?.id
515
506
  );
516
507
  if (!node) {
517
508
  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","_a","_b","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","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.8",
3
+ "version": "0.1.0-alpha.9",
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.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"
22
+ "@flowgram.ai/core": "0.1.0-alpha.9",
23
+ "@flowgram.ai/free-history-plugin": "0.1.0-alpha.9",
24
+ "@flowgram.ai/document": "0.1.0-alpha.9",
25
+ "@flowgram.ai/free-layout-core": "0.1.0-alpha.9",
26
+ "@flowgram.ai/utils": "0.1.0-alpha.9",
27
+ "@flowgram.ai/renderer": "0.1.0-alpha.9"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/bezier-js": "4.1.3",
@@ -40,8 +40,8 @@
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.8",
44
- "@flowgram.ai/ts-config": "0.1.0-alpha.8"
43
+ "@flowgram.ai/eslint-config": "0.1.0-alpha.9",
44
+ "@flowgram.ai/ts-config": "0.1.0-alpha.9"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": ">=16.8",