From 5c16e7d3908654023ee66d670ffa48441d31f431 Mon Sep 17 00:00:00 2001 From: Adam Gough <77861281+aadamgough@users.noreply.github.com> Date: Sun, 17 Aug 2025 22:25:31 -0700 Subject: [PATCH] fix(subflow): add ability to remove block from subflow and refactor to consolidate subflow code (#983) * added logic to remove blocks from subflows * refactored logic into just subflow-node * bun run lint * added subflow test * added a safety check for data.parentId * added state update logic * bun run lint * removed old logic * removed any * added tests * added type safety * removed test script * type safety --------- Co-authored-by: Adam Gough Co-authored-by: waleedlatif1 --- apps/sim/app/globals.css | 3 +- .../w/[workflowId]/components/index.ts | 3 +- .../iteration-badges.test.tsx | 388 ++++++++++++ .../subflows/loop/loop-node.test.tsx | 452 -------------- .../subflows/parallel/parallel-node.test.tsx | 585 ------------------ .../subflows/parallel/parallel-node.tsx | 273 -------- .../components/subflows/subflow-node.test.tsx | 579 +++++++++++++++++ .../{loop/loop-node.tsx => subflow-node.tsx} | 115 ++-- .../components/action-bar/action-bar.tsx | 33 +- .../components/sub-block/sub-block.tsx | 3 +- .../workflow-block/workflow-block.tsx | 13 +- .../workflow-edge/workflow-edge.tsx | 3 +- .../[workspaceId]/w/[workflowId]/utils.ts | 6 +- .../[workspaceId]/w/[workflowId]/workflow.tsx | 115 ++-- .../workflow-preview/workflow-preview.tsx | 12 +- apps/sim/components/ui/tag-dropdown.tsx | 57 +- apps/sim/lib/workflows/diff/diff-engine.ts | 9 +- apps/sim/lib/workflows/diff/types.ts | 18 + apps/sim/socket-server/database/operations.ts | 32 +- apps/sim/stores/workflows/workflow/store.ts | 9 +- apps/sim/stores/workflows/yaml/importer.ts | 2 +- 21 files changed, 1241 insertions(+), 1469 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/components/iteration-badges/iteration-badges.test.tsx delete mode 100644 apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/loop/loop-node.test.tsx delete mode 100644 apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/parallel/parallel-node.test.tsx delete mode 100644 apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/parallel/parallel-node.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.test.tsx rename apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/{loop/loop-node.tsx => subflow-node.tsx} (75%) create mode 100644 apps/sim/lib/workflows/diff/types.ts diff --git a/apps/sim/app/globals.css b/apps/sim/app/globals.css index 84891c0553..24dbca36cb 100644 --- a/apps/sim/app/globals.css +++ b/apps/sim/app/globals.css @@ -14,7 +14,8 @@ } .workflow-container .react-flow__node-loopNode, -.workflow-container .react-flow__node-parallelNode { +.workflow-container .react-flow__node-parallelNode, +.workflow-container .react-flow__node-subflowNode { z-index: -1 !important; } diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts index fe1e8a2167..832d40c160 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts @@ -2,8 +2,7 @@ export { ControlBar } from './control-bar/control-bar' export { ErrorBoundary } from './error/index' export { Panel } from './panel/panel' export { SkeletonLoading } from './skeleton-loading/skeleton-loading' -export { LoopNodeComponent } from './subflows/loop/loop-node' -export { ParallelNodeComponent } from './subflows/parallel/parallel-node' +export { SubflowNodeComponent } from './subflows/subflow-node' export { WandPromptBar } from './wand-prompt-bar/wand-prompt-bar' export { WorkflowBlock } from './workflow-block/workflow-block' export { WorkflowEdge } from './workflow-edge/workflow-edge' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/components/iteration-badges/iteration-badges.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/components/iteration-badges/iteration-badges.test.tsx new file mode 100644 index 0000000000..9071f63953 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/components/iteration-badges/iteration-badges.test.tsx @@ -0,0 +1,388 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +// Mock hooks +const mockCollaborativeUpdates = { + collaborativeUpdateLoopType: vi.fn(), + collaborativeUpdateParallelType: vi.fn(), + collaborativeUpdateIterationCount: vi.fn(), + collaborativeUpdateIterationCollection: vi.fn(), +} + +const mockStoreData = { + loops: {}, + parallels: {}, +} + +vi.mock('@/hooks/use-collaborative-workflow', () => ({ + useCollaborativeWorkflow: () => mockCollaborativeUpdates, +})) + +vi.mock('@/stores/workflows/workflow/store', () => ({ + useWorkflowStore: () => mockStoreData, +})) + +vi.mock('@/components/ui/badge', () => ({ + Badge: ({ children, ...props }: any) => ( +
+ {children} +
+ ), +})) + +vi.mock('@/components/ui/input', () => ({ + Input: (props: any) => , +})) + +vi.mock('@/components/ui/popover', () => ({ + Popover: ({ children }: any) =>
{children}
, + PopoverContent: ({ children }: any) =>
{children}
, + PopoverTrigger: ({ children }: any) =>
{children}
, +})) + +vi.mock('@/components/ui/tag-dropdown', () => ({ + checkTagTrigger: vi.fn(() => ({ show: false })), + TagDropdown: ({ children }: any) =>
{children}
, +})) + +vi.mock('react-simple-code-editor', () => ({ + default: (props: any) =>