Skip to content

Commit b151ce8

Browse files
2867 - ai agent plus icons working in task dispatchers
1 parent 29dc91b commit b151ce8

File tree

7 files changed

+97
-48
lines changed

7 files changed

+97
-48
lines changed

client/src/pages/platform/cluster-element-editor/hooks/useClusterElementsLayout.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import useWorkflowDataStore from '../../workflow-editor/stores/useWorkflowDataSt
1515
import useWorkflowEditorStore from '../../workflow-editor/stores/useWorkflowEditorStore';
1616
import useWorkflowNodeDetailsPanelStore from '../../workflow-editor/stores/useWorkflowNodeDetailsPanelStore';
1717
import {getLayoutedElements} from '../../workflow-editor/utils/layoutUtils';
18+
import {getTaskDispatcherTask} from '../../workflow-editor/utils/taskDispatcherConfig';
1819
import useClusterElementsDataStore from '../stores/useClusterElementsDataStore';
1920
import {isPlainObject} from '../utils/clusterElementsUtils';
2021
import createClusterElementsEdges from '../utils/createClusterElementsEdges';
@@ -106,13 +107,16 @@ const useClusterElementsLayout = () => {
106107
return JSON.parse(workflow.definition).tasks;
107108
}, [workflow.definition]);
108109

109-
const mainRootClusterElementTask = useMemo(
110-
() =>
111-
workflowDefinitionTasks.find(
112-
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
113-
),
114-
[workflowDefinitionTasks, rootClusterElementNodeData?.workflowNodeName]
115-
);
110+
const mainRootClusterElementTask = useMemo(() => {
111+
if (!rootClusterElementNodeData?.workflowNodeName || !workflowDefinitionTasks.length) {
112+
return undefined;
113+
}
114+
115+
return getTaskDispatcherTask({
116+
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
117+
tasks: workflowDefinitionTasks,
118+
});
119+
}, [workflowDefinitionTasks, rootClusterElementNodeData?.workflowNodeName]);
116120

117121
const clusterElements = useMemo(
118122
() => mainRootClusterElementTask?.clusterElements || {},

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import getParametersWithDefaultValues from '../utils/getParametersWithDefaultVal
8383
import saveClusterElementFieldChange from '../utils/saveClusterElementFieldChange';
8484
import saveTaskDispatcherSubtaskFieldChange from '../utils/saveTaskDispatcherSubtaskFieldChange';
8585
import saveWorkflowDefinition from '../utils/saveWorkflowDefinition';
86+
import {getTaskDispatcherTask} from '../utils/taskDispatcherConfig';
8687
import {DescriptionTabSkeleton, FieldsetSkeleton, PropertiesTabSkeleton} from './WorkflowEditorSkeletons';
8788

8889
const TABS: Array<{label: string; name: TabNameType}> = [
@@ -985,9 +986,12 @@ const WorkflowNodeDetailsPanel = ({
985986

986987
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;
987988

988-
const mainClusterRootTask = workflowDefinitionTasks?.find(
989-
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
990-
);
989+
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
990+
? getTaskDispatcherTask({
991+
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
992+
tasks: workflowDefinitionTasks,
993+
})
994+
: undefined;
991995

992996
if (!mainClusterRootTask) {
993997
return;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import handleComponentAddedSuccess from '../utils/handleComponentAddedSuccess';
3434
import handleTaskDispatcherSubtaskOperationClick from '../utils/handleTaskDispatcherSubtaskOperationClick';
3535
import processClusterElementsHierarchy from '../utils/processClusterElementsHierarchy';
3636
import saveWorkflowDefinition from '../utils/saveWorkflowDefinition';
37+
import {getTaskDispatcherTask} from '../utils/taskDispatcherConfig';
3738

3839
interface WorkflowNodesPopoverMenuOperationListProps {
3940
clusterElementType?: string;
@@ -189,9 +190,12 @@ const WorkflowNodesPopoverMenuOperationList = ({
189190

190191
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;
191192

192-
const mainClusterRootTask = workflowDefinitionTasks?.find(
193-
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
194-
);
193+
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
194+
? getTaskDispatcherTask({
195+
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
196+
tasks: workflowDefinitionTasks,
197+
})
198+
: undefined;
195199

196200
if (!mainClusterRootTask) {
197201
return;

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

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {QueryClient, UseMutationResult} from '@tanstack/react-query';
99
import {WorkflowDataType} from '../stores/useWorkflowDataStore';
1010
import useWorkflowNodeDetailsPanelStore from '../stores/useWorkflowNodeDetailsPanelStore';
1111
import findAndRemoveClusterElement from './findAndRemoveClusterElement';
12-
import {TASK_DISPATCHER_CONFIG} from './taskDispatcherConfig';
12+
import getRecursivelyUpdatedTasks from './getRecursivelyUpdatedTasks';
13+
import {TASK_DISPATCHER_CONFIG, getTaskDispatcherTask} from './taskDispatcherConfig';
1314

1415
interface HandleDeleteTaskProps {
1516
rootClusterElementNodeData?: NodeDataType;
@@ -193,7 +194,10 @@ export default function handleDeleteTask({
193194
return parentForkJoinTask;
194195
}) as Array<WorkflowTaskType>;
195196
} else if (clusterElementsCanvasOpen && rootClusterElementNodeData) {
196-
const mainRootClusterElementTask = workflowTasks.find((task) => task.name === rootClusterElementNodeData?.name);
197+
const mainRootClusterElementTask = getTaskDispatcherTask({
198+
taskDispatcherId: rootClusterElementNodeData.name,
199+
tasks: workflowTasks,
200+
});
197201

198202
if (!mainRootClusterElementTask || !mainRootClusterElementTask.clusterElements) {
199203
return;
@@ -237,13 +241,23 @@ export default function handleDeleteTask({
237241
}
238242
}
239243

240-
updatedTasks = workflowTasks.map((task) => {
241-
if (task.name !== mainRootClusterElementTask?.name) {
242-
return task;
243-
}
244+
// Check if the task is at top level
245+
const topLevelTaskIndex = workflowTasks.findIndex((task) => task.name === mainRootClusterElementTask.name);
244246

245-
return updatedRootClusterElementTask;
246-
}) as Array<WorkflowTaskType>;
247+
if (topLevelTaskIndex !== -1) {
248+
updatedTasks = workflowTasks.map((task) => {
249+
if (task.name !== mainRootClusterElementTask?.name) {
250+
return task;
251+
}
252+
253+
return updatedRootClusterElementTask;
254+
}) as Array<WorkflowTaskType>;
255+
} else {
256+
updatedTasks = getRecursivelyUpdatedTasks(
257+
workflowTasks as Array<WorkflowTask>,
258+
updatedRootClusterElementTask
259+
) as Array<WorkflowTaskType>;
260+
}
247261
} else {
248262
updatedTasks = workflowTasks.filter((task: WorkflowTask) => task.name !== data.name);
249263
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useWorkflowNodeDetailsPanelStore from '../stores/useWorkflowNodeDetailsPa
88
import {updateClusterRootElementField, updateNestedClusterElementField} from './clusterElementsFieldChangeUtils';
99
import getParametersWithDefaultValues from './getParametersWithDefaultValues';
1010
import saveWorkflowDefinition from './saveWorkflowDefinition';
11+
import {getTaskDispatcherTask} from './taskDispatcherConfig';
1112

1213
type FieldUpdateType = {
1314
field: 'operation' | 'label' | 'description';
@@ -42,9 +43,15 @@ export default function saveClusterElementFieldChange({
4243

4344
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;
4445

45-
const mainClusterRootTask = workflowDefinitionTasks?.find(
46-
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
47-
);
46+
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
47+
? getTaskDispatcherTask({
48+
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
49+
tasks: workflowDefinitionTasks,
50+
})
51+
: undefined;
52+
// const mainClusterRootTask = workflowDefinitionTasks?.find(
53+
// (task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
54+
// );
4855

4956
if (!mainClusterRootTask) {
5057
return;

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import useClusterElementsDataStore from '../../cluster-element-editor/stores/use
55
import useWorkflowEditorStore from '../stores/useWorkflowEditorStore';
66
import {removeClusterElementPosition} from './removeClusterElementPosition';
77
import saveWorkflowDefinition from './saveWorkflowDefinition';
8+
import {getTaskDispatcherTask} from './taskDispatcherConfig';
89
import updateClusterElementsPositions from './updateClusterElementsPositions';
910

1011
interface SaveClusterElementNodesPositionProps {
@@ -33,9 +34,10 @@ export default function saveClusterElementNodesPosition({
3334

3435
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;
3536

36-
const mainClusterRootTask = workflowDefinitionTasks.find(
37-
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
38-
);
37+
const mainClusterRootTask = getTaskDispatcherTask({
38+
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
39+
tasks: workflowDefinitionTasks,
40+
});
3941

4042
if (!mainClusterRootTask || !mainClusterRootTask.clusterElements) {
4143
console.error('Main cluster root task or cluster elements not found');

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

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import {BranchCaseType, NodeDataType, TaskDispatcherContextType, WorkflowDefinit
33
import {UseMutationResult} from '@tanstack/react-query';
44

55
import useWorkflowDataStore from '../stores/useWorkflowDataStore';
6+
import getRecursivelyUpdatedTasks from './getRecursivelyUpdatedTasks';
67
import insertTaskDispatcherSubtask from './insertTaskDispatcherSubtask';
8+
import {getTaskDispatcherTask} from './taskDispatcherConfig';
79

810
const SPACE = 4;
911

@@ -153,41 +155,53 @@ export default async function saveWorkflowDefinition({
153155
(task) => task.name === existingWorkflowTask.name
154156
);
155157

156-
if (existingTaskIndex === undefined || existingTaskIndex === -1) {
157-
return;
158-
}
159-
160158
let combinedParameters = {
161159
...existingWorkflowTask.parameters,
162160
...newTask.parameters,
163161
};
164162

165163
if (existingWorkflowTask.type !== newTask.type) {
166-
delete updatedWorkflowDefinitionTasks[existingTaskIndex].parameters;
167-
168164
combinedParameters = newTask.parameters ?? {};
169165
}
170166

171-
if (existingWorkflowTask.clusterRoot) {
172-
const rootClusterElementTask: WorkflowTask = {
173-
...newTask,
174-
clusterElements: {
175-
...(newTask.clusterElements || {}),
176-
},
177-
};
178-
179-
updatedWorkflowDefinitionTasks[existingTaskIndex] = rootClusterElementTask;
180-
} else {
181-
const combinedTask: WorkflowTask = {
182-
...newTask,
183-
parameters: combinedParameters,
184-
};
167+
const taskToUpdate = existingWorkflowTask.clusterRoot
168+
? {
169+
...newTask,
170+
clusterElements: {
171+
...(newTask.clusterElements || {}),
172+
},
173+
}
174+
: {
175+
...newTask,
176+
parameters: combinedParameters,
177+
};
178+
179+
if (existingTaskIndex !== undefined && existingTaskIndex !== -1) {
180+
if (existingWorkflowTask.type !== newTask.type) {
181+
delete updatedWorkflowDefinitionTasks[existingTaskIndex].parameters;
182+
}
185183

186184
updatedWorkflowDefinitionTasks = [
187185
...updatedWorkflowDefinitionTasks.slice(0, existingTaskIndex),
188-
combinedTask,
186+
taskToUpdate,
189187
...updatedWorkflowDefinitionTasks.slice(existingTaskIndex + 1),
190188
];
189+
} else {
190+
const nestedTask = getTaskDispatcherTask({
191+
taskDispatcherId: existingWorkflowTask.name,
192+
tasks: workflowDefinitionTasks,
193+
});
194+
195+
if (!nestedTask) {
196+
console.error(`Task ${existingWorkflowTask.name} not found in workflow definition`);
197+
198+
return;
199+
}
200+
201+
updatedWorkflowDefinitionTasks = getRecursivelyUpdatedTasks(
202+
updatedWorkflowDefinitionTasks,
203+
taskToUpdate
204+
);
191205
}
192206
} else {
193207
updatedWorkflowDefinitionTasks = [...(workflowDefinitionTasks || [])];

0 commit comments

Comments
 (0)