Skip to content

Commit c020e2c

Browse files
committed
4146 - add clientside support for the Subflow task dispatcher
1 parent 983cfe2 commit c020e2c

File tree

9 files changed

+67
-15
lines changed

9 files changed

+67
-15
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {BranchCaseType, NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -90,7 +90,10 @@ function createEdgesForSingleCase(
9090

9191
const sourceTaskComponentName = sourceTaskId.split('_')[0];
9292

93-
if (TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName) && sourceTaskComponentName !== 'loopBreak') {
93+
if (
94+
TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName) &&
95+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName)
96+
) {
9497
const nestedBottomGhostId = `${sourceTaskId}-${sourceTaskComponentName}-bottom-ghost`;
9598

9699
const edgeFromNestedGhostToNextTask = {
@@ -118,7 +121,10 @@ function createEdgesForSingleCase(
118121
const lastTaskId = caseTasks[caseTasks.length - 1].name;
119122
const lastTaskComponentName = lastTaskId.split('_')[0];
120123

121-
if (TASK_DISPATCHER_NAMES.includes(lastTaskComponentName) && lastTaskComponentName !== 'loopBreak') {
124+
if (
125+
TASK_DISPATCHER_NAMES.includes(lastTaskComponentName) &&
126+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(lastTaskComponentName)
127+
) {
122128
const nestedBottomGhostId = `${lastTaskId}-${lastTaskComponentName}-bottom-ghost`;
123129

124130
const edgeFromNestedGhostToBottomGhost = {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -233,7 +233,7 @@ function createBranchExitEdge(
233233

234234
const lastTaskComponentName = lastTaskNodeId.split('_')[0];
235235

236-
if (lastTaskNode?.data.taskDispatcher && lastTaskComponentName !== 'loopBreak') {
236+
if (lastTaskNode?.data.taskDispatcher && !CHILDLESS_TASK_DISPATCHER_NAMES.includes(lastTaskComponentName)) {
237237
const nestedBottomGhostId = `${lastTaskNodeId}-${lastTaskComponentName}-bottom-ghost`;
238238

239239
if (nestedBottomGhostId) {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -79,7 +79,10 @@ function createEdgeSubtaskEdges(eachId: string, eachChildTask: WorkflowTask): Ed
7979
};
8080

8181
// Check if the child task is itself a task dispatcher
82-
if (TASK_DISPATCHER_NAMES.includes(childTaskComponentName) && childTaskComponentName !== 'loopBreak') {
82+
if (
83+
TASK_DISPATCHER_NAMES.includes(childTaskComponentName) &&
84+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(childTaskComponentName)
85+
) {
8386
const nestedBottomGhostId = `${childTaskId}-${childTaskComponentName}-bottom-ghost`;
8487

8588
const edgeFromNestedGhostToBottomGhost = {

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -107,7 +107,10 @@ function createForkJoinTaskEdges(
107107

108108
const sourceTaskComponentName = sourceTaskId.split('_')[0];
109109

110-
if (TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName) && sourceTaskComponentName !== 'loopBreak') {
110+
if (
111+
TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName) &&
112+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName)
113+
) {
111114
const nestedBottomGhostId = `${sourceTaskId}-${sourceTaskComponentName}-bottom-ghost`;
112115

113116
const edgeFromNestedGhostToNextTask = {
@@ -135,7 +138,10 @@ function createForkJoinTaskEdges(
135138
const lastTaskId = branch[branch.length - 1].name;
136139
let lastTaskComponentName = lastTaskId.split('_')[0];
137140

138-
if (TASK_DISPATCHER_NAMES.includes(lastTaskComponentName) && lastTaskComponentName !== 'loopBreak') {
141+
if (
142+
TASK_DISPATCHER_NAMES.includes(lastTaskComponentName) &&
143+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(lastTaskComponentName)
144+
) {
139145
if (lastTaskComponentName === 'fork-join') {
140146
lastTaskComponentName = 'forkJoin';
141147
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -98,7 +98,7 @@ function createLoopSubtaskEdges(loopId: string, loopChildTasks: Array<WorkflowTa
9898
const sourceTaskComponentName = task.name.split('_')[0];
9999

100100
const isTaskDispatcher = TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName);
101-
const isLoopBreak = sourceTaskComponentName === 'loopBreak';
101+
const isLeafTaskDispatcher = CHILDLESS_TASK_DISPATCHER_NAMES.includes(sourceTaskComponentName);
102102
const isLastTask = index === loopChildTasks.length - 1;
103103

104104
let targetId;
@@ -112,7 +112,7 @@ function createLoopSubtaskEdges(loopId: string, loopChildTasks: Array<WorkflowTa
112112
targetHandleId = undefined;
113113
}
114114

115-
if (!isTaskDispatcher || isLoopBreak) {
115+
if (!isTaskDispatcher || isLeafTaskDispatcher) {
116116
const edgeBetweenSubtasks = {
117117
id: `${sourceTaskName}=>${targetId}`,
118118
source: sourceTaskName,

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
1+
import {CHILDLESS_TASK_DISPATCHER_NAMES, EDGE_STYLES, TASK_DISPATCHER_NAMES} from '@/shared/constants';
22
import {WorkflowTask} from '@/shared/middleware/platform/configuration';
33
import {NodeDataType} from '@/shared/types';
44
import {Edge, Node} from '@xyflow/react';
@@ -89,7 +89,10 @@ function createParallelTaskEdges(
8989

9090
taskEdges.push(edgeFromTopGhostToTask);
9191

92-
if (TASK_DISPATCHER_NAMES.includes(taskComponentName) && taskComponentName !== 'loopBreak') {
92+
if (
93+
TASK_DISPATCHER_NAMES.includes(taskComponentName) &&
94+
!CHILDLESS_TASK_DISPATCHER_NAMES.includes(taskComponentName)
95+
) {
9396
const nestedBottomGhostId = `${taskId}-${taskComponentName}-bottom-ghost`;
9497

9598
const edgeFromNestedGhostToBottomGhost = {

client/src/pages/platform/workflow-editor/utils/taskDispatcherConfig.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ export function buildGenericNodeData(
5050
newNodeData.loopBreakData = {
5151
loopBreakId: taskDispatcherId,
5252
};
53+
} else if (type === 'subflow') {
54+
newNodeData.subflowData = {
55+
subflowId: taskDispatcherId,
56+
};
5357
} else if (type === 'branch') {
5458
newNodeData.branchData = {
5559
branchId: taskDispatcherId,
@@ -482,6 +486,27 @@ export const TASK_DISPATCHER_CONFIG = {
482486
},
483487
}),
484488
},
489+
subflow: {
490+
buildNodeData: ({baseNodeData, taskDispatcherContext, taskDispatcherId}: BuildNodeDataType): NodeDataType =>
491+
buildGenericNodeData(baseNodeData, taskDispatcherContext, taskDispatcherId, 'subflow'),
492+
493+
contextIdentifier: 'subflowId',
494+
dataKey: 'subflowData',
495+
extractContextFromPlaceholder: (placeholderId: string): TaskDispatcherContextType => {
496+
const parts = placeholderId.split('-');
497+
const index = parseInt(parts[parts.length - 1] || '-1');
498+
499+
return {index, taskDispatcherId: parts[0]};
500+
},
501+
getDispatcherId: (context: TaskDispatcherContextType) => context.subflowId,
502+
getInitialParameters: (properties: Array<PropertyAllType>) => ({
503+
...getParametersWithDefaultValues({properties}),
504+
}),
505+
getSubtasks: () => [],
506+
getTask: getTaskDispatcherTask,
507+
initializeParameters: () => ({}),
508+
updateTaskParameters: ({task}: UpdateTaskParametersType): WorkflowTask => task,
509+
},
485510
};
486511

487512
/**

client/src/shared/constants.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ export const TASK_DISPATCHER_NAMES = [
126126
'subflow',
127127
];
128128

129+
export const CHILDLESS_TASK_DISPATCHER_NAMES = ['loopBreak', 'subflow'];
130+
129131
export const SORT_OPTIONS = [
130132
{
131133
label: 'Last edited',

client/src/shared/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ type LoopBreakDataType = {
126126
loopBreakId: string;
127127
};
128128

129+
type SubflowDataType = {
130+
subflowId: string;
131+
};
132+
129133
type ParallelDataType = {
130134
index: number;
131135
parallelId: string;
@@ -146,6 +150,7 @@ export type TaskDispatcherDataType = BranchDataType &
146150
EachDataType &
147151
LoopDataType &
148152
LoopBreakDataType &
153+
SubflowDataType &
149154
ConditionDataType &
150155
ParallelDataType &
151156
ForkJoinDataType;
@@ -227,6 +232,7 @@ export type NodeDataType = {
227232
index: number;
228233
};
229234
parentClusterRootId?: string;
235+
subflowData?: SubflowDataType;
230236
taskDispatcher?: boolean;
231237
taskDispatcherId?: string;
232238
title?: string;
@@ -346,6 +352,7 @@ export type TaskDispatcherContextType = {
346352
loopBreakId?: string;
347353
loopId?: string;
348354
parallelId?: string;
355+
subflowId?: string;
349356
taskDispatcherId: string;
350357
};
351358

0 commit comments

Comments
 (0)