Skip to content

Commit 79f3a62

Browse files
committed
1721 - enable operation switching for condition subtasks
1 parent f7a20e6 commit 79f3a62

File tree

4 files changed

+165
-14
lines changed

4 files changed

+165
-14
lines changed

client/src/pages/platform/workflow-editor/components/WorkflowNodeDetailsPanel.tsx

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
TriggerDefinitionApi,
1515
WorkflowConnection,
1616
WorkflowNodeOutput,
17+
WorkflowTask,
1718
} from '@/shared/middleware/platform/configuration';
1819
import {useDeleteWorkflowNodeTestOutputMutation} from '@/shared/mutations/platform/workflowNodeTestOutputs.mutations';
1920
import {
@@ -33,6 +34,7 @@ import {useGetWorkflowTestConfigurationConnectionsQuery} from '@/shared/queries/
3334
import {
3435
ComponentPropertiesType,
3536
DataPillType,
37+
NodeDataType,
3638
PropertyAllType,
3739
UpdateWorkflowMutationType,
3840
WorkflowDefinitionType,
@@ -50,6 +52,7 @@ import getAllTaskNames from '../utils/getAllTaskNames';
5052
import getDataPillsFromProperties from '../utils/getDataPillsFromProperties';
5153
import getParametersWithDefaultValues from '../utils/getParametersWithDefaultValues';
5254
import saveWorkflowDefinition from '../utils/saveWorkflowDefinition';
55+
import updateConditionSubtask from '../utils/updateRootConditionNode';
5356
import CurrentOperationSelect from './CurrentOperationSelect';
5457
import ConnectionTab from './node-details-tabs/ConnectionTab';
5558
import DescriptionTab from './node-details-tabs/DescriptionTab';
@@ -96,7 +99,7 @@ const WorkflowNodeDetailsPanel = ({
9699
const {currentComponent, currentNode, setCurrentComponent, setCurrentNode, workflowNodeDetailsPanelOpen} =
97100
useWorkflowNodeDetailsPanelStore();
98101

99-
const {componentActions, setDataPills, workflow} = useWorkflowDataStore();
102+
const {componentActions, nodes, setDataPills, workflow} = useWorkflowDataStore();
100103

101104
const {data: currentComponentDefinition} = useGetComponentDefinitionQuery(
102105
{
@@ -269,19 +272,72 @@ const WorkflowNodeDetailsPanel = ({
269272

270273
const {componentName, description, label, workflowNodeName} = currentComponent;
271274

275+
let nodeData = {
276+
componentName,
277+
description,
278+
label,
279+
name: workflowNodeName || currentNode?.name || '',
280+
operationName: newOperationName,
281+
parameters: getParametersWithDefaultValues({
282+
properties: operationData.properties as Array<PropertyAllType>,
283+
}),
284+
trigger: currentNode?.trigger,
285+
type: `${componentName}/v${currentComponentDefinition.version}/${newOperationName}`,
286+
};
287+
288+
if (currentNode?.conditionData) {
289+
const parentConditionNode = nodes.find(
290+
(node) => node.data.name === currentNode?.conditionData?.conditionId
291+
);
292+
293+
if (!parentConditionNode) {
294+
return;
295+
}
296+
297+
const conditionCase = currentNode.conditionData.conditionCase;
298+
const conditionParameters: Array<WorkflowTask> = parentConditionNode.data.parameters[conditionCase];
299+
300+
if (conditionParameters) {
301+
const nodeIndex = conditionParameters.findIndex((subtask) => subtask.name === currentNode.name);
302+
303+
if (nodeIndex !== -1) {
304+
conditionParameters[nodeIndex] = {
305+
...conditionParameters[nodeIndex],
306+
type: `${componentName}/v${currentComponentDefinition.version}/${newOperationName}`,
307+
};
308+
309+
if (!workflow.definition) {
310+
return;
311+
}
312+
313+
const tasks = JSON.parse(workflow.definition).tasks;
314+
315+
const updatedParentConditionTask = workflow.tasks?.find(
316+
(task) => task.name === currentNode.conditionData?.conditionId
317+
);
318+
319+
if (!updatedParentConditionTask) {
320+
return;
321+
}
322+
323+
const updatedRootConditionNode = updateConditionSubtask({
324+
conditionCase,
325+
conditionId: currentNode.conditionData.conditionId,
326+
nodeIndex,
327+
nodes,
328+
tasks,
329+
updatedParentConditionNodeData: parentConditionNode.data,
330+
updatedParentConditionTask,
331+
workflow,
332+
});
333+
334+
nodeData = updatedRootConditionNode.data ?? (updatedRootConditionNode as NodeDataType);
335+
}
336+
}
337+
}
338+
272339
saveWorkflowDefinition({
273-
nodeData: {
274-
componentName,
275-
description,
276-
label,
277-
name: workflowNodeName || currentNode?.name || '',
278-
operationName: newOperationName,
279-
parameters: getParametersWithDefaultValues({
280-
properties: operationData.properties as Array<PropertyAllType>,
281-
}),
282-
trigger: currentNode?.trigger,
283-
type: `${componentName}/v${currentComponentDefinition.version}/${newOperationName}`,
284-
},
340+
nodeData,
285341
onSuccess: () => {
286342
setCurrentComponent({
287343
...currentComponent,
@@ -295,6 +351,7 @@ const WorkflowNodeDetailsPanel = ({
295351
});
296352
},
297353
queryClient,
354+
subtask: !!currentNode?.conditionData,
298355
updateWorkflowMutation,
299356
workflow,
300357
});

client/src/pages/platform/workflow-editor/utils/saveWorkflowDefinition.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ interface SaveWorkflowDefinitionProps {
2727
onSuccess?: () => void;
2828
placeholderId?: string;
2929
queryClient: QueryClient;
30+
subtask?: boolean;
3031
updateWorkflowMutation: UseMutationResult<void, Error, UpdateWorkflowRequestType, unknown>;
3132
workflow: Workflow;
3233
}
@@ -39,6 +40,7 @@ export default async function saveWorkflowDefinition({
3940
onSuccess,
4041
placeholderId,
4142
queryClient,
43+
subtask,
4244
updateWorkflowMutation,
4345
workflow,
4446
}: SaveWorkflowDefinitionProps) {
@@ -130,6 +132,7 @@ export default async function saveWorkflowDefinition({
130132
if (
131133
existingWorkflowTask &&
132134
!decorative &&
135+
!subtask &&
133136
(!operationName ||
134137
(existingWorkflowTask.parameters &&
135138
JSON.stringify(existingWorkflowTask.parameters) === JSON.stringify(newTask.parameters))) &&
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import {Workflow, WorkflowTask} from '@/shared/middleware/automation/configuration';
2+
import {NodeType} from '@/shared/types';
3+
import {Node} from 'reactflow';
4+
5+
import {WorkflowTaskDataType} from '../stores/useWorkflowDataStore';
6+
import getParentConditionTask from './getParentConditionTask';
7+
8+
interface UpdateRootConditionNodeProps {
9+
conditionCase: string;
10+
conditionId: string;
11+
nodeIndex: number;
12+
tasks: Array<WorkflowTask>;
13+
updatedParentConditionNodeData: NodeType;
14+
updatedParentConditionTask: WorkflowTask;
15+
nodes: Array<Node>;
16+
workflow: Workflow & WorkflowTaskDataType;
17+
}
18+
19+
export default function updateRootConditionNode({
20+
nodeIndex,
21+
nodes,
22+
tasks,
23+
updatedParentConditionNodeData,
24+
updatedParentConditionTask,
25+
workflow,
26+
}: UpdateRootConditionNodeProps): NodeType {
27+
let currentTaskNode = updatedParentConditionNodeData;
28+
29+
let currentTaskNodeConditionData = updatedParentConditionNodeData.conditionData;
30+
31+
while (currentTaskNodeConditionData) {
32+
const parentConditionTask = getParentConditionTask(tasks, currentTaskNodeConditionData.conditionId);
33+
34+
if (!parentConditionTask) {
35+
break;
36+
}
37+
38+
const parentConditionTaskNode = nodes.find((node) => node.id === parentConditionTask.name);
39+
40+
if (!parentConditionTaskNode) {
41+
break;
42+
}
43+
44+
console.log('parentConditionTaskNode: ', parentConditionTaskNode);
45+
46+
const currentConditionCase = currentTaskNodeConditionData.conditionCase;
47+
48+
const parentConditionCaseTasks: Array<WorkflowTask> =
49+
parentConditionTaskNode.data.parameters[currentConditionCase] || [];
50+
51+
const workflowTasks = workflow.tasks;
52+
53+
let currentTask = workflowTasks?.find((task) => task.name === currentTaskNode.id);
54+
55+
if (!currentTask) {
56+
currentTask = updatedParentConditionTask;
57+
}
58+
59+
const currentTaskIndex = parentConditionCaseTasks.findIndex((task) => task.name === currentTask.name);
60+
61+
if (currentTaskIndex > -1) {
62+
parentConditionCaseTasks[currentTaskIndex] = currentTask;
63+
} else {
64+
parentConditionCaseTasks[nodeIndex] = currentTask;
65+
}
66+
67+
parentConditionTaskNode.data.parameters = {
68+
...parentConditionTaskNode.data.parameters,
69+
[currentConditionCase]: parentConditionCaseTasks,
70+
};
71+
72+
currentTaskNode = {
73+
...parentConditionTaskNode,
74+
name: parentConditionTaskNode.id,
75+
type: parentConditionTaskNode.type || 'workflow',
76+
version: parentConditionTaskNode.data.type.split('/v')[1],
77+
workflowNodeName: parentConditionTaskNode.id,
78+
};
79+
80+
currentTaskNodeConditionData = parentConditionTaskNode.data.conditionData;
81+
}
82+
83+
return currentTaskNode;
84+
}

client/src/shared/types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from '@/shared/middleware/platform/configuration';
2525
import {UseMutationResult} from '@tanstack/react-query';
2626
import {ReactNode} from 'react';
27+
import {Node} from 'reactflow';
2728

2829
export type DataPillType = {
2930
componentName?: string;
@@ -125,8 +126,14 @@ export type NodeDataType = {
125126

126127
export type NodeType = {
127128
componentName?: string;
129+
conditionData?: {
130+
conditionCase: string;
131+
conditionId: string;
132+
index: number;
133+
};
128134
connections?: Array<WorkflowConnectionType>;
129135
connectionId?: number;
136+
data: NodeDataType;
130137
displayConditions?: {
131138
// eslint-disable-next-line @typescript-eslint/no-explicit-any
132139
[key: string]: boolean;
@@ -151,7 +158,7 @@ export type NodeType = {
151158
type: string;
152159
version: number;
153160
workflowNodeName: string;
154-
};
161+
} & Node;
155162

156163
export type SubPropertyType = PropertyAllType & {custom: boolean};
157164

0 commit comments

Comments
 (0)