Procházet zdrojové kódy

feat(canvas-core): container node use meta.isContainer tag instead of SUB_CANVAS type

liuyangxing před 10 měsíci
rodič
revize
dba6190e1a

+ 1 - 0
packages/canvas-engine/free-layout-core/src/typings/workflow-node.ts

@@ -18,6 +18,7 @@ export interface WorkflowNodeMeta extends FlowNodeMeta {
   defaultPorts?: WorkflowPorts; // 默认点位
   useDynamicPort?: boolean; // 使用动态点位,会计算 data-port-key
   subCanvas?: (node: WorkflowNodeEntity) => WorkflowSubCanvas | undefined;
+  isContainer?: boolean; // 是否容器节点
 }
 
 /**

+ 3 - 3
packages/canvas-engine/free-layout-core/src/workflow-document.ts

@@ -367,11 +367,11 @@ export class WorkflowDocument extends FlowDocument {
     const endNodeId = allNode.find((node) => node.isNodeEnd)!.id;
 
     // 子画布内节点无需开始/结束
-    const nodeInSubCanvas = allNode
-      .filter((node) => node.parent?.flowNodeType === FlowNodeBaseType.SUB_CANVAS)
+    const nodeInContainer = allNode
+      .filter((node) => node.parent?.getNodeMeta<WorkflowNodeMeta>().isContainer)
       .map((node) => node.id);
 
-    const associatedCache = new Set([endNodeId, ...nodeInSubCanvas]);
+    const associatedCache = new Set([endNodeId, ...nodeInContainer]);
     const bfs = (nodeId: string) => {
       if (associatedCache.has(nodeId)) {
         return;

+ 10 - 5
packages/plugins/free-node-panel-plugin/src/service.ts

@@ -8,12 +8,12 @@ import {
   WorkflowPortEntity,
   WorkflowNodePortsData,
   WorkflowNodeEntity,
+  WorkflowNodeMeta,
 } from '@flowgram.ai/free-layout-core';
 import { WorkflowSelectService } from '@flowgram.ai/free-layout-core';
 import { WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';
 import { FreeOperationType, HistoryService } from '@flowgram.ai/free-history-plugin';
 import { FlowNodeTransformData } from '@flowgram.ai/document';
-import { FlowNodeBaseType } from '@flowgram.ai/document';
 import { PlaygroundConfigEntity } from '@flowgram.ai/core';
 import { TransformData } from '@flowgram.ai/core';
 
@@ -293,7 +293,7 @@ export class WorkflowNodePanelService {
     }
     const fromNode = fromPort?.node;
     const fromContainer = fromNode?.parent;
-    if (fromNode?.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {
+    if (this.isContainer(fromNode)) {
       // 子画布内部输入连线
       return fromNode;
     }
@@ -303,7 +303,7 @@ export class WorkflowNodePanelService {
   /** 获取端口矩形 */
   private getPortBox(port: WorkflowPortEntity, offset: IPoint = { x: 0, y: 0 }): Rectangle {
     const node = port.node;
-    if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {
+    if (this.isContainer(node)) {
       // 子画布内部端口需要虚拟节点
       const { point } = port;
       if (port.portType === 'input') {
@@ -424,7 +424,7 @@ export class WorkflowNodePanelService {
 
   /** 获取后续节点 */
   private getSubsequentNodes(node: WorkflowNodeEntity): WorkflowNodeEntity[] {
-    if (node.flowNodeType === FlowNodeBaseType.SUB_CANVAS) {
+    if (this.isContainer(node)) {
       return [];
     }
     const brothers = node.parent?.collapsedChildren ?? [];
@@ -436,7 +436,7 @@ export class WorkflowNodePanelService {
       }
       if (
         !line.to?.id ||
-        line.to.flowNodeType === FlowNodeBaseType.SUB_CANVAS // 子画布内部成环
+        this.isContainer(line.to) // 子画布内部成环
       ) {
         return;
       }
@@ -519,4 +519,9 @@ export class WorkflowNodePanelService {
       },
     });
   }
+
+  /** 是否容器节点 */
+  private isContainer(node?: WorkflowNodeEntity): boolean {
+    return node?.getNodeMeta<WorkflowNodeMeta>().isContainer ?? false;
+  }
 }