build-line.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import {
  6. WorkflowLinesManager,
  7. WorkflowNodeEntity,
  8. WorkflowNodePortsData,
  9. WorkflowPortEntity,
  10. } from '@flowgram.ai/free-layout-core';
  11. export type IBuildLine = (params: {
  12. node: WorkflowNodeEntity;
  13. linesManager: WorkflowLinesManager;
  14. fromPort?: WorkflowPortEntity;
  15. toPort?: WorkflowPortEntity;
  16. }) => void;
  17. /** 建立连线 */
  18. export const buildLine: IBuildLine = (params) => {
  19. const { fromPort, node, toPort, linesManager } = params;
  20. const portsData = node.getData(WorkflowNodePortsData);
  21. if (!portsData) {
  22. return;
  23. }
  24. const shouldBuildFromLine = portsData.inputPorts?.length > 0;
  25. if (fromPort && shouldBuildFromLine) {
  26. const isVertical = fromPort.location === 'bottom';
  27. const toTargetPort =
  28. portsData.inputPorts.find((port) => (isVertical ? port.location === 'top' : true)) ||
  29. portsData.inputPorts[0];
  30. linesManager.createLine({
  31. from: fromPort.node.id,
  32. fromPort: fromPort.portID,
  33. to: node.id,
  34. toPort: toTargetPort.portID,
  35. });
  36. }
  37. const shouldBuildToLine = portsData.outputPorts?.length > 0;
  38. if (toPort && shouldBuildToLine) {
  39. const fromTargetPort = portsData.outputPorts[0];
  40. linesManager.createLine({
  41. from: node.id,
  42. fromPort: fromTargetPort.portID,
  43. to: toPort.node.id,
  44. toPort: toPort.portID,
  45. });
  46. }
  47. };