From d477db261ae7564bbea3a347205ef33dc6e6e1da Mon Sep 17 00:00:00 2001 From: Baptiste Devessier Date: Wed, 24 Sep 2025 16:12:15 +0200 Subject: [PATCH] Add basic support for iterators in workflow runs (#14680) ## Workflow CleanShot 2025-09-24 at 11 50
49@2x ## Workflow run CleanShot 2025-09-24 at 11 50
56@2x --- .../components/WorkflowRunDiagramCanvas.tsx | 4 +- .../workflow-diagram/types/WorkflowDiagram.ts | 2 +- .../generateWorkflowRunDiagram.test.ts | 28 ++++++------- .../utils/generateWorkflowRunDiagram.ts | 3 +- .../WorkflowDiagramDefaultEdgeRun.tsx | 42 ------------------- .../components/WorkflowRunDiagramBaseEdge.tsx | 27 ------------ .../components/WorkflowRunDiagramStepNode.tsx | 11 +++++ 7 files changed, 30 insertions(+), 87 deletions(-) delete mode 100644 packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeRun.tsx delete mode 100644 packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowRunDiagramBaseEdge.tsx diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowRunDiagramCanvas.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowRunDiagramCanvas.tsx index b6073244ad..4d8adcb895 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowRunDiagramCanvas.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowRunDiagramCanvas.tsx @@ -1,8 +1,8 @@ import { type WorkflowRunStatus } from '@/workflow/types/Workflow'; import { WorkflowDiagramCanvasBase } from '@/workflow/workflow-diagram/components/WorkflowDiagramCanvasBase'; -import { WorkflowDiagramDefaultEdgeRun } from '@/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeRun'; import { getWorkflowRunStatusTagProps } from '@/workflow/workflow-diagram/utils/getWorkflowRunStatusTagProps'; +import { WorkflowDiagramDefaultEdgeReadonly } from '@/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeReadonly'; import { WorkflowRunDiagramStepNode } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode'; import { ReactFlowProvider } from '@xyflow/react'; @@ -22,7 +22,7 @@ export const WorkflowRunDiagramCanvas = ({ default: WorkflowRunDiagramStepNode, }} edgeTypes={{ - run: WorkflowDiagramDefaultEdgeRun, + readonly: WorkflowDiagramDefaultEdgeReadonly, }} tagContainerTestId="workflow-run-status" tagColor={tagProps.color} diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts index 3c6b9e75d7..6de051b386 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts @@ -119,4 +119,4 @@ export type WorkflowDiagramEdgeData = WorkflowDiagramDefaultEdgeData; export type WorkflowDiagramNodeType = 'default' | 'empty-trigger'; -export type WorkflowDiagramEdgeType = 'blank' | 'editable' | 'readonly' | 'run'; +export type WorkflowDiagramEdgeType = 'blank' | 'editable' | 'readonly'; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/__tests__/generateWorkflowRunDiagram.test.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/__tests__/generateWorkflowRunDiagram.test.ts index 68e8ff2383..fa5dba34e2 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/__tests__/generateWorkflowRunDiagram.test.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/__tests__/generateWorkflowRunDiagram.test.ts @@ -124,7 +124,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step1", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -142,7 +142,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step2", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -160,7 +160,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step3", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, ], @@ -363,7 +363,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step1", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -381,7 +381,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step2", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -399,7 +399,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step3", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, ], @@ -602,7 +602,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step1", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -620,7 +620,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step2", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -638,7 +638,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step3", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, ], @@ -860,7 +860,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step1", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -878,7 +878,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step2", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -896,7 +896,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step3", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, { @@ -914,7 +914,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step4", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, ], @@ -1102,7 +1102,7 @@ describe('generateWorkflowRunDiagram', () => { "sourceHandle": "default", "target": "step1", "targetHandle": "default", - "type": "run", + "type": "readonly", "zIndex": -2, }, ], diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateWorkflowRunDiagram.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateWorkflowRunDiagram.ts index d418d5027c..d54edaddac 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateWorkflowRunDiagram.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateWorkflowRunDiagram.ts @@ -4,6 +4,7 @@ import { } from '@/workflow/types/Workflow'; import { type WorkflowDiagramEdgeData, + type WorkflowDiagramEdgeType, type WorkflowRunDiagram, type WorkflowRunDiagramNode, type WorkflowRunDiagramStepNodeData, @@ -87,7 +88,7 @@ export const generateWorkflowRunDiagram = ({ return { ...edge, - type: 'run', + type: 'readonly' satisfies WorkflowDiagramEdgeType, data: { ...edge.data, edgeType: 'default', diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeRun.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeRun.tsx deleted file mode 100644 index 4a4e0a3286..0000000000 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeRun.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { WorkflowRunDiagramBaseEdge } from '@/workflow/workflow-diagram/workflow-edges/components/WorkflowRunDiagramBaseEdge'; -import { type WorkflowDiagramEdgeComponentProps } from '@/workflow/workflow-diagram/workflow-edges/types/WorkflowDiagramEdgeComponentProps'; -import { getEdgePath } from '@/workflow/workflow-diagram/workflow-edges/utils/getEdgePath'; - -type WorkflowDiagramDefaultEdgeRunProps = WorkflowDiagramEdgeComponentProps; - -export const WorkflowDiagramDefaultEdgeRun = ({ - sourceX, - sourceY, - sourcePosition, - targetX, - targetY, - targetPosition, - markerStart, - markerEnd, - data, -}: WorkflowDiagramDefaultEdgeRunProps) => { - const { segments } = getEdgePath({ - sourceX, - sourceY, - sourcePosition, - targetX, - targetY, - targetPosition, - markerStart, - markerEnd, - strategy: data?.edgePathStrategy, - }); - - return ( - <> - {segments.map((segment) => ( - - ))} - - ); -}; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowRunDiagramBaseEdge.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowRunDiagramBaseEdge.tsx deleted file mode 100644 index f80382c334..0000000000 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowRunDiagramBaseEdge.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { type WorkflowDiagramEdgeComponentProps } from '@/workflow/workflow-diagram/workflow-edges/types/WorkflowDiagramEdgeComponentProps'; -import { useTheme } from '@emotion/react'; -import { BaseEdge } from '@xyflow/react'; - -type WorkflowRunDiagramBaseEdgeProps = Pick< - WorkflowDiagramEdgeComponentProps, - 'markerStart' | 'markerEnd' -> & { - path: string; -}; - -export const WorkflowRunDiagramBaseEdge = ({ - path, - markerStart, - markerEnd, -}: WorkflowRunDiagramBaseEdgeProps) => { - const theme = useTheme(); - - return ( - - ); -}; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode.tsx index dd019adffa..4204ae1a78 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode.tsx @@ -161,6 +161,17 @@ export const WorkflowRunDiagramStepNode = ({ selected={selected} runStatus={data.runStatus} /> + + {isDefined(data.rightHandleOptions) && ( + + )} ); };