diff --git a/packages/twenty-front/src/modules/workflow/types/WorkflowDiagram.ts b/packages/twenty-front/src/modules/workflow/types/WorkflowDiagram.ts index 85f5df761e7d2..f97d5027ed0c8 100644 --- a/packages/twenty-front/src/modules/workflow/types/WorkflowDiagram.ts +++ b/packages/twenty-front/src/modules/workflow/types/WorkflowDiagram.ts @@ -1,8 +1,11 @@ import { Edge, Node } from '@xyflow/react'; +export type WorkflowDiagramNode = Node; +export type WorkflowDiagramEdge = Edge; + export type WorkflowDiagram = { - nodes: Array>; - edges: Array; + nodes: Array; + edges: Array; }; export type WorkflowDiagramStepNodeData = { diff --git a/packages/twenty-front/src/modules/workflow/utils/addCreateStepNodes.ts b/packages/twenty-front/src/modules/workflow/utils/addCreateStepNodes.ts new file mode 100644 index 0000000000000..9d2941adb2741 --- /dev/null +++ b/packages/twenty-front/src/modules/workflow/utils/addCreateStepNodes.ts @@ -0,0 +1,41 @@ +import { + WorkflowDiagram, + WorkflowDiagramEdge, + WorkflowDiagramNode, +} from '@/workflow/types/WorkflowDiagram'; +import { MarkerType } from '@xyflow/react'; +import { v4 } from 'uuid'; + +export const addCreateStepNodes = ({ nodes, edges }: WorkflowDiagram) => { + const nodesWithoutTargets = nodes.filter((node) => + edges.every((edge) => edge.source !== node.id), + ); + + const updatedNodes: Array = nodes.slice(); + const updatedEdges: Array = edges.slice(); + + for (const node of nodesWithoutTargets) { + const newCreateStepNode: WorkflowDiagramNode = { + id: v4(), + type: 'create-step', + data: {}, + position: { x: 0, y: 0 }, + }; + + updatedNodes.push(newCreateStepNode); + + updatedEdges.push({ + id: v4(), + source: node.id, + target: newCreateStepNode.id, + markerEnd: { + type: MarkerType.ArrowClosed, + }, + }); + } + + return { + nodes: updatedNodes, + edges: updatedEdges, + }; +}; diff --git a/packages/twenty-front/src/pages/workflows/WorkflowShowPage.tsx b/packages/twenty-front/src/pages/workflows/WorkflowShowPage.tsx index e660046f81244..46b7f763e360c 100644 --- a/packages/twenty-front/src/pages/workflows/WorkflowShowPage.tsx +++ b/packages/twenty-front/src/pages/workflows/WorkflowShowPage.tsx @@ -7,7 +7,8 @@ import { PageTitle } from '@/ui/utilities/page-title/PageTitle'; import { showPageWorkflowDiagramState } from '@/workflow/states/showPageWorkflowDiagramState'; import { WorkflowDiagram, - WorkflowDiagramNodeData, + WorkflowDiagramEdge, + WorkflowDiagramNode, } from '@/workflow/types/WorkflowDiagram'; import { getOrganizedDiagram } from '@/workflow/utils/getOrganizedDiagram'; import { @@ -15,7 +16,6 @@ import { applyNodeChanges, Background, EdgeChange, - Node, NodeChange, ReactFlow, } from '@xyflow/react'; @@ -57,7 +57,7 @@ const LoadedWorkflow = ({ diagram }: { diagram: WorkflowDiagram }) => { ); const handleNodesChange = ( - nodeChanges: Array>>, + nodeChanges: Array>, ) => { setShowPageWorkflowDiagram((diagram) => { if (isDefined(diagram) === false) { @@ -73,7 +73,9 @@ const LoadedWorkflow = ({ diagram }: { diagram: WorkflowDiagram }) => { }); }; - const handleEdgesChange = (edgeChanges: Array) => { + const handleEdgesChange = ( + edgeChanges: Array>, + ) => { setShowPageWorkflowDiagram((diagram) => { if (isDefined(diagram) === false) { throw new Error( diff --git a/packages/twenty-front/src/pages/workflows/WorkflowShowPageEffect.tsx b/packages/twenty-front/src/pages/workflows/WorkflowShowPageEffect.tsx index 0cce6443c77da..ac6a63537ecdd 100644 --- a/packages/twenty-front/src/pages/workflows/WorkflowShowPageEffect.tsx +++ b/packages/twenty-front/src/pages/workflows/WorkflowShowPageEffect.tsx @@ -10,9 +10,11 @@ import { } from '@/workflow/types/Workflow'; import { WorkflowDiagram, - WorkflowDiagramNodeData, + WorkflowDiagramEdge, + WorkflowDiagramNode, } from '@/workflow/types/WorkflowDiagram'; -import { Edge, MarkerType, Node } from '@xyflow/react'; +import { addCreateStepNodes } from '@/workflow/utils/addCreateStepNodes'; +import { MarkerType } from '@xyflow/react'; import { useEffect, useMemo } from 'react'; import { useSetRecoilState } from 'recoil'; import { isDefined } from 'twenty-ui'; @@ -28,8 +30,8 @@ const EMPTY_FLOW_DATA: WorkflowDiagram = { }; const generateWorklowDiagram = (trigger: WorkflowTrigger): WorkflowDiagram => { - const nodes: Array> = []; - const edges: Array = []; + const nodes: Array = []; + const edges: Array = []; // Helper function to generate nodes and edges recursively const processNode = ( @@ -107,43 +109,6 @@ const getFlowLastVersion = ( return generateWorklowDiagram(lastVersion.trigger); }; -const addCreateStepNodes = ( - nodes: Array>, - edges: Array, -) => { - const nodesWithoutTargets = nodes.filter((node) => - edges.every((edge) => edge.source !== node.id), - ); - - const updatedNodes: typeof nodes = nodes.slice(); - const updatedEdges: typeof edges = edges.slice(); - - for (const node of nodesWithoutTargets) { - const newCreateStepNode: Node = { - id: v4(), - type: 'create-step', - data: {}, - position: { x: 0, y: 0 }, - }; - - updatedNodes.push(newCreateStepNode); - - updatedEdges.push({ - id: v4(), - source: node.id, - target: newCreateStepNode.id, - markerEnd: { - type: MarkerType.ArrowClosed, - }, - }); - } - - return { - nodes: updatedNodes, - edges: updatedEdges, - }; -}; - export const WorkflowShowPageEffect = ({ workflowId, }: WorkflowShowPageEffectProps) => { @@ -168,7 +133,7 @@ export const WorkflowShowPageEffect = ({ ); const flowWithCreateStepNodes = useMemo( - () => addCreateStepNodes(flowLastVersion.nodes, flowLastVersion.edges), + () => addCreateStepNodes(flowLastVersion), [flowLastVersion], );