1
1
import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext' ;
2
+ import { useWorkflowCommandMenu } from '@/command-menu/hooks/useWorkflowCommandMenu' ;
2
3
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue' ;
3
4
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2' ;
4
5
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2' ;
@@ -11,24 +12,33 @@ import { workflowVisualizerWorkflowRunIdComponentState } from '@/workflow/states
11
12
import { WorkflowRunOutput } from '@/workflow/types/Workflow' ;
12
13
import { workflowDiagramComponentState } from '@/workflow/workflow-diagram/states/workflowDiagramComponentState' ;
13
14
import { workflowDiagramStatusComponentState } from '@/workflow/workflow-diagram/states/workflowDiagramStatusComponentState' ;
15
+ import { workflowRunDiagramAutomaticallyOpenedStepsComponentState } from '@/workflow/workflow-diagram/states/workflowRunDiagramAutomaticallyOpenedStepsComponentState' ;
14
16
import { workflowRunStepToOpenByDefaultComponentState } from '@/workflow/workflow-diagram/states/workflowRunStepToOpenByDefaultComponentState' ;
17
+ import { workflowSelectedNodeComponentState } from '@/workflow/workflow-diagram/states/workflowSelectedNodeComponentState' ;
15
18
import { generateWorkflowRunDiagram } from '@/workflow/workflow-diagram/utils/generateWorkflowRunDiagram' ;
19
+ import { getWorkflowNodeIconKey } from '@/workflow/workflow-diagram/utils/getWorkflowNodeIconKey' ;
16
20
import { selectWorkflowDiagramNode } from '@/workflow/workflow-diagram/utils/selectWorkflowDiagramNode' ;
17
21
import { useContext , useEffect } from 'react' ;
18
22
import { useRecoilCallback } from 'recoil' ;
19
23
import { isDefined } from 'twenty-shared/utils' ;
24
+ import { useIcons } from 'twenty-ui/display' ;
20
25
21
26
export const WorkflowRunVisualizerEffect = ( {
22
27
workflowRunId,
23
28
} : {
24
29
workflowRunId : string ;
25
30
} ) => {
31
+ const { getIcon } = useIcons ( ) ;
32
+
26
33
const workflowRun = useWorkflowRun ( { workflowRunId } ) ;
27
34
const workflowVersion = useWorkflowVersion ( workflowRun ?. workflowVersionId ) ;
28
35
29
36
const setWorkflowRunId = useSetRecoilComponentStateV2 (
30
37
workflowVisualizerWorkflowRunIdComponentState ,
31
38
) ;
39
+ const workflowVisualizerWorkflowIdState = useRecoilComponentCallbackStateV2 (
40
+ workflowVisualizerWorkflowIdComponentState ,
41
+ ) ;
32
42
const setWorkflowVisualizerWorkflowId = useSetRecoilComponentStateV2 (
33
43
workflowVisualizerWorkflowIdComponentState ,
34
44
) ;
@@ -43,6 +53,15 @@ export const WorkflowRunVisualizerEffect = ({
43
53
const workflowRunStepToOpenByDefaultState = useRecoilComponentCallbackStateV2 (
44
54
workflowRunStepToOpenByDefaultComponentState ,
45
55
) ;
56
+ const workflowSelectedNodeState = useRecoilComponentCallbackStateV2 (
57
+ workflowSelectedNodeComponentState ,
58
+ ) ;
59
+ const workflowRunDiagramAutomaticallyOpenedStepsState =
60
+ useRecoilComponentCallbackStateV2 (
61
+ workflowRunDiagramAutomaticallyOpenedStepsComponentState ,
62
+ ) ;
63
+
64
+ const { openWorkflowRunViewStepInCommandMenu } = useWorkflowCommandMenu ( ) ;
46
65
47
66
const { populateStepsOutputSchema } = useStepsOutputSchema ( ) ;
48
67
@@ -65,11 +84,11 @@ export const WorkflowRunVisualizerEffect = ({
65
84
( {
66
85
workflowRunOutput,
67
86
workflowVersionId,
68
- skipNodeSelection ,
87
+ isInRightDrawer ,
69
88
} : {
70
89
workflowRunOutput : WorkflowRunOutput | undefined ;
71
90
workflowVersionId : string | undefined ;
72
- skipNodeSelection : boolean ;
91
+ isInRightDrawer : boolean ;
73
92
} ) => {
74
93
if ( ! ( isDefined ( workflowRunOutput ) && isDefined ( workflowVersionId ) ) ) {
75
94
set ( flowState , undefined ) ;
@@ -100,17 +119,60 @@ export const WorkflowRunVisualizerEffect = ({
100
119
stepsOutput : workflowRunOutput . stepsOutput ,
101
120
} ) ;
102
121
103
- if ( isDefined ( stepToOpenByDefault ) && ! skipNodeSelection ) {
104
- const workflowRunDiagram = selectWorkflowDiagramNode ( {
105
- diagram : baseWorkflowRunDiagram ,
106
- nodeIdToSelect : stepToOpenByDefault . id ,
107
- } ) ;
108
-
109
- set ( workflowDiagramState , workflowRunDiagram ) ;
110
- set ( workflowRunStepToOpenByDefaultState , {
111
- id : stepToOpenByDefault . id ,
112
- data : stepToOpenByDefault . data ,
113
- } ) ;
122
+ if ( isDefined ( stepToOpenByDefault ) ) {
123
+ if ( isInRightDrawer ) {
124
+ set ( workflowDiagramState , baseWorkflowRunDiagram ) ;
125
+
126
+ const workflowRunDiagramAutomaticallyOpenedSteps = getSnapshotValue (
127
+ snapshot ,
128
+ workflowRunDiagramAutomaticallyOpenedStepsState ,
129
+ ) ;
130
+ const hasStepAlreadyBeenOpenedAutomatically =
131
+ workflowRunDiagramAutomaticallyOpenedSteps . includes (
132
+ stepToOpenByDefault . id ,
133
+ ) ;
134
+
135
+ if (
136
+ workflowDiagramStatus === 'done' &&
137
+ ! hasStepAlreadyBeenOpenedAutomatically
138
+ ) {
139
+ set ( workflowSelectedNodeState , stepToOpenByDefault . id ) ;
140
+
141
+ const workflowVisualizerWorkflowId = getSnapshotValue (
142
+ snapshot ,
143
+ workflowVisualizerWorkflowIdState ,
144
+ ) ;
145
+ if ( ! isDefined ( workflowVisualizerWorkflowId ) ) {
146
+ throw new Error (
147
+ 'The workflow id must be set; ensure the workflow id is always set before rendering the workflow diagram.' ,
148
+ ) ;
149
+ }
150
+
151
+ set ( workflowRunDiagramAutomaticallyOpenedStepsState , [
152
+ ...workflowRunDiagramAutomaticallyOpenedSteps ,
153
+ stepToOpenByDefault . id ,
154
+ ] ) ;
155
+ openWorkflowRunViewStepInCommandMenu ( {
156
+ workflowId : workflowVisualizerWorkflowId ,
157
+ workflowRunId,
158
+ title : stepToOpenByDefault . data . name ,
159
+ icon : getIcon ( getWorkflowNodeIconKey ( stepToOpenByDefault . data ) ) ,
160
+ workflowSelectedNode : stepToOpenByDefault . id ,
161
+ stepExecutionStatus : stepToOpenByDefault . data . runStatus ,
162
+ } ) ;
163
+ }
164
+ } else {
165
+ const workflowRunDiagram = selectWorkflowDiagramNode ( {
166
+ diagram : baseWorkflowRunDiagram ,
167
+ nodeIdToSelect : stepToOpenByDefault . id ,
168
+ } ) ;
169
+
170
+ set ( workflowDiagramState , workflowRunDiagram ) ;
171
+ set ( workflowRunStepToOpenByDefaultState , {
172
+ id : stepToOpenByDefault . id ,
173
+ data : stepToOpenByDefault . data ,
174
+ } ) ;
175
+ }
114
176
} else {
115
177
set ( workflowDiagramState , baseWorkflowRunDiagram ) ;
116
178
}
@@ -121,17 +183,23 @@ export const WorkflowRunVisualizerEffect = ({
121
183
} ,
122
184
[
123
185
flowState ,
186
+ getIcon ,
187
+ openWorkflowRunViewStepInCommandMenu ,
124
188
workflowDiagramState ,
125
189
workflowDiagramStatusState ,
190
+ workflowRunDiagramAutomaticallyOpenedStepsState ,
191
+ workflowRunId ,
126
192
workflowRunStepToOpenByDefaultState ,
193
+ workflowSelectedNodeState ,
194
+ workflowVisualizerWorkflowIdState ,
127
195
] ,
128
196
) ;
129
197
130
198
useEffect ( ( ) => {
131
199
handleWorkflowRunDiagramGeneration ( {
132
200
workflowRunOutput : workflowRun ?. output ?? undefined ,
133
201
workflowVersionId : workflowRun ?. workflowVersionId ,
134
- skipNodeSelection : isInRightDrawer ,
202
+ isInRightDrawer,
135
203
} ) ;
136
204
} , [
137
205
handleWorkflowRunDiagramGeneration ,
0 commit comments