Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import useWorkflowDataStore from '../../workflow-editor/stores/useWorkflowDataSt
import useWorkflowEditorStore from '../../workflow-editor/stores/useWorkflowEditorStore';
import useWorkflowNodeDetailsPanelStore from '../../workflow-editor/stores/useWorkflowNodeDetailsPanelStore';
import {getLayoutedElements} from '../../workflow-editor/utils/layoutUtils';
import {getTaskDispatcherTask} from '../../workflow-editor/utils/taskDispatcherConfig';
import useClusterElementsDataStore from '../stores/useClusterElementsDataStore';
import {isPlainObject} from '../utils/clusterElementsUtils';
import createClusterElementsEdges from '../utils/createClusterElementsEdges';
Expand Down Expand Up @@ -106,13 +107,16 @@ const useClusterElementsLayout = () => {
return JSON.parse(workflow.definition).tasks;
}, [workflow.definition]);

const mainRootClusterElementTask = useMemo(
() =>
workflowDefinitionTasks.find(
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
),
[workflowDefinitionTasks, rootClusterElementNodeData?.workflowNodeName]
);
const mainRootClusterElementTask = useMemo(() => {
if (!rootClusterElementNodeData?.workflowNodeName || !workflowDefinitionTasks.length) {
return undefined;
}

return getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflowDefinitionTasks,
});
}, [workflowDefinitionTasks, rootClusterElementNodeData?.workflowNodeName]);

const clusterElements = useMemo(
() => mainRootClusterElementTask?.clusterElements || {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import getParametersWithDefaultValues from '../utils/getParametersWithDefaultVal
import saveClusterElementFieldChange from '../utils/saveClusterElementFieldChange';
import saveTaskDispatcherSubtaskFieldChange from '../utils/saveTaskDispatcherSubtaskFieldChange';
import saveWorkflowDefinition from '../utils/saveWorkflowDefinition';
import {getTaskDispatcherTask} from '../utils/taskDispatcherConfig';
import {DescriptionTabSkeleton, FieldsetSkeleton, PropertiesTabSkeleton} from './WorkflowEditorSkeletons';

const TABS: Array<{label: string; name: TabNameType}> = [
Expand Down Expand Up @@ -428,14 +429,23 @@ const WorkflowNodeDetailsPanel = ({
);

const currentWorkflowTask = useMemo(
() => workflow.tasks?.find((task) => task.name === currentNode?.workflowNodeName),
() =>
currentNode?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: currentNode.workflowNodeName,
tasks: workflow.tasks || [],
})
: undefined,
[workflow.tasks, currentNode]
);

const currentClusterElementsConnections = useMemo(() => {
const mainClusterRootTask = workflow.tasks?.find(
(task) => task.name === rootClusterElementNodeData?.workflowNodeName
);
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflow.tasks || [],
})
: undefined;

if (mainClusterRootTask?.connections && currentNode?.clusterElementType) {
return mainClusterRootTask.connections.filter(
Expand Down Expand Up @@ -560,9 +570,12 @@ const WorkflowNodeDetailsPanel = ({
let filteredNodeNames = workflowNodeOutputs?.map((output) => output.workflowNodeName) || [];

if (currentNode?.conditionData) {
const parentConditionTask = workflow.tasks?.find(
(task) => task.name === currentNode.conditionData?.conditionId
);
const parentConditionTask = currentNode.conditionData.conditionId
? getTaskDispatcherTask({
taskDispatcherId: currentNode.conditionData.conditionId,
tasks: workflow.tasks || [],
})
: undefined;

if (!parentConditionTask) {
return [];
Expand All @@ -581,7 +594,12 @@ const WorkflowNodeDetailsPanel = ({
(nodeName) => !oppositeConditionCaseNodeNames?.includes(nodeName)
);
} else if (currentNode?.branchData) {
const parentBranchTask = workflow.tasks?.find((task) => task.name === currentNode.branchData?.branchId);
const parentBranchTask = currentNode.branchData.branchId
? getTaskDispatcherTask({
taskDispatcherId: currentNode.branchData.branchId,
tasks: workflow.tasks || [],
})
: undefined;

if (!parentBranchTask || !parentBranchTask.parameters) {
return [];
Expand Down Expand Up @@ -985,9 +1003,12 @@ const WorkflowNodeDetailsPanel = ({

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

const mainClusterRootTask = workflowDefinitionTasks?.find(
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
);
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflowDefinitionTasks,
})
: undefined;

if (!mainClusterRootTask) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import handleComponentAddedSuccess from '../utils/handleComponentAddedSuccess';
import handleTaskDispatcherSubtaskOperationClick from '../utils/handleTaskDispatcherSubtaskOperationClick';
import processClusterElementsHierarchy from '../utils/processClusterElementsHierarchy';
import saveWorkflowDefinition from '../utils/saveWorkflowDefinition';
import {getTaskDispatcherTask} from '../utils/taskDispatcherConfig';

interface WorkflowNodesPopoverMenuOperationListProps {
clusterElementType?: string;
Expand Down Expand Up @@ -187,18 +188,25 @@ const WorkflowNodesPopoverMenuOperationList = ({
return;
}

if (!rootClusterElementNodeData?.workflowNodeName || !rootClusterElementNodeData?.componentName) {
console.error('Root cluster element node data is missing required properties');

return;
}

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

const mainClusterRootTask = workflowDefinitionTasks?.find(
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
);
const mainClusterRootTask = getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflowDefinitionTasks,
});

if (!mainClusterRootTask) {
return;
}

const clusterElements = initializeClusterElementsObject({
clusterElementsData: mainClusterRootTask?.clusterElements || {},
clusterElementsData: mainClusterRootTask.clusterElements || {},
mainClusterRootComponentDefinition,
mainClusterRootTask,
});
Expand All @@ -208,7 +216,7 @@ const WorkflowNodesPopoverMenuOperationList = ({
clusterElements,
elementType: clusterElementType,
isMultipleElements,
mainRootId: rootClusterElementNodeData?.workflowNodeName,
mainRootId: rootClusterElementNodeData.workflowNodeName,
sourceNodeId,
});

Expand All @@ -230,22 +238,28 @@ const WorkflowNodesPopoverMenuOperationList = ({
}

if (workflowNodeDetailsPanelOpen && currentNode?.workflowNodeName === sourceNodeName) {
if (rootClusterElementNodeData) {
setCurrentNode({
...rootClusterElementNodeData,
clusterElements: updatedClusterElements.nestedClusterElements,
});
}
setCurrentNode({
...rootClusterElementNodeData,
clusterElements: updatedClusterElements.nestedClusterElements,
});

setWorkflowNodeDetailsPanelOpen(false);
}

saveWorkflowDefinition({
invalidateWorkflowQueries,
nodeData: updatedNodeData,
nodeData: {
...updatedNodeData,
componentName: rootClusterElementNodeData.componentName,
workflowNodeName: rootClusterElementNodeData.workflowNodeName,
},
onSuccess: () => {
handleComponentAddedSuccess({
nodeData: updatedNodeData,
nodeData: {
...updatedNodeData,
componentName: rootClusterElementNodeData.componentName,
workflowNodeName: rootClusterElementNodeData.workflowNodeName,
},
queryClient,
workflow,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {useShallow} from 'zustand/react/shallow';
import saveClusterElementFieldChange from '../../utils/saveClusterElementFieldChange';
import saveTaskDispatcherSubtaskFieldChange from '../../utils/saveTaskDispatcherSubtaskFieldChange';
import saveWorkflowDefinition from '../../utils/saveWorkflowDefinition';
import {getTaskDispatcherTask} from '../../utils/taskDispatcherConfig';

interface DescriptionTabProps {
invalidateWorkflowQueries: () => void;
Expand Down Expand Up @@ -179,9 +180,14 @@ const DescriptionTab = ({invalidateWorkflowQueries, nodeDefinition, updateWorkfl
});
}, 300);

let workflowTaskOrTrigger = [...(workflow.tasks ?? []), ...(workflow.triggers ?? [])]?.find(
(task) => task.name === currentNode?.workflowNodeName
);
let workflowTaskOrTrigger =
workflow.triggers?.find((trigger) => trigger.name === currentNode?.workflowNodeName) ||
(currentNode?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: currentNode.workflowNodeName,
tasks: workflow.tasks || [],
})
: undefined);

if (!workflowTaskOrTrigger && currentNode?.clusterElementType) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import useWorkflowNodeDetailsPanelStore from '@/pages/platform/workflow-editor/s
import deleteProperty from '@/pages/platform/workflow-editor/utils/deleteProperty';
import getInputHTMLType from '@/pages/platform/workflow-editor/utils/getInputHTMLType';
import saveProperty from '@/pages/platform/workflow-editor/utils/saveProperty';
import {getTaskDispatcherTask} from '@/pages/platform/workflow-editor/utils/taskDispatcherConfig';
import {
GetClusterElementParameterDisplayConditions200Response,
Option,
Expand Down Expand Up @@ -622,9 +623,12 @@ const Property = ({
if (currentNode.clusterElementType) {
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;

const mainClusterRootTask = workflowDefinitionTasks?.find(
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
);
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflowDefinitionTasks,
})
: undefined;

if (mainClusterRootTask?.clusterElements) {
return getClusterElementByName(mainClusterRootTask.clusterElements, currentNode.name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import {PlayIcon, RefreshCwIcon, SaveIcon, SquareIcon} from 'lucide-react';
import {Suspense, lazy, useEffect, useState} from 'react';
import {twMerge} from 'tailwind-merge';

import {getTaskDispatcherTask} from '../../../../utils/taskDispatcherConfig';

const MonacoEditor = lazy(() => import('@/shared/components/MonacoEditorWrapper'));
const ReactJson = lazy(() => import('react-json-view'));

Expand Down Expand Up @@ -54,7 +56,10 @@ const PropertyCodeEditorSheet = ({
const copilotPanelOpen = useCopilotStore((state) => state.copilotPanelOpen);
const currentEnvironmentId = useEnvironmentStore((state) => state.currentEnvironmentId);

const currentWorkflowTask = workflow.tasks?.find((task) => task.name === workflowNodeName);
const currentWorkflowTask = getTaskDispatcherTask({
taskDispatcherId: workflowNodeName,
tasks: workflow.tasks || [],
});

const handleRunClick = () => {
setScriptIsRunning(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import PropertyCodeEditorSheetRightPanelConnections from '@/pages/platform/workf
import PropertyCodeEditorSheetRightPanelInputs from '@/pages/platform/workflow-editor/components/properties/components/property-code-editor/PropertyCodeEditorSheetRightPanelInputs';
import {ComponentConnection, Workflow} from '@/shared/middleware/platform/configuration';

import {getTaskDispatcherTask} from '../../../../utils/taskDispatcherConfig';

interface PropertyCodeEditorSheetConnectionsSheetRightPanelProps {
componentConnections: ComponentConnection[];
workflow: Workflow;
Expand All @@ -13,12 +15,15 @@ const PropertyCodeEditorSheetRightPanel = ({
workflow,
workflowNodeName,
}: PropertyCodeEditorSheetConnectionsSheetRightPanelProps) => {
const currentTask = getTaskDispatcherTask({
taskDispatcherId: workflowNodeName,
tasks: workflow.tasks || [],
});

return (
<div className="flex w-96 flex-col divide-y divide-solid divide-muted">
<div className="flex-1">
<PropertyCodeEditorSheetRightPanelInputs
input={workflow.tasks?.find((task) => task.name === workflowNodeName)?.parameters?.input ?? {}}
/>
<PropertyCodeEditorSheetRightPanelInputs input={currentTask?.parameters?.input ?? {}} />
</div>

<div className="flex-1">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
transformValueForObjectAccess,
} from '@/pages/platform/workflow-editor/utils/encodingUtils';
import saveProperty from '@/pages/platform/workflow-editor/utils/saveProperty';
import {getTaskDispatcherTask} from '@/pages/platform/workflow-editor/utils/taskDispatcherConfig';
import {TASK_DISPATCHER_NAMES} from '@/shared/constants';
import {
ComponentDefinitionBasic,
Expand Down Expand Up @@ -132,9 +133,12 @@ const PropertyMentionsInputEditor = forwardRef<Editor, PropertyMentionsInputEdit
if (currentNode.clusterElementType) {
const workflowDefinitionTasks = JSON.parse(workflow.definition).tasks;

const mainClusterRootTask = workflowDefinitionTasks?.find(
(task: {name: string}) => task.name === rootClusterElementNodeData?.workflowNodeName
);
const mainClusterRootTask = rootClusterElementNodeData?.workflowNodeName
? getTaskDispatcherTask({
taskDispatcherId: rootClusterElementNodeData.workflowNodeName,
tasks: workflowDefinitionTasks,
})
: undefined;

if (mainClusterRootTask?.clusterElements) {
return getClusterElementByName(mainClusterRootTask.clusterElements, currentNode.name);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {TASK_DISPATCHER_NAMES} from '@/shared/constants';
import {WorkflowTask} from '@/shared/middleware/platform/configuration';

import {TASK_DISPATCHER_CONFIG} from './taskDispatcherConfig';

/**
* Recursively gets all tasks from a workflow, including tasks nested inside task dispatchers
*/
export default function getAllTasksRecursively(tasks: Array<WorkflowTask>): Array<WorkflowTask> {
const allTasks: Array<WorkflowTask> = [];

const extractTasks = (taskList: Array<WorkflowTask>) => {
taskList.forEach((task) => {
allTasks.push(task);

// Check if this is a task dispatcher
const componentName = task.type?.split('/')[0];

if (componentName && TASK_DISPATCHER_NAMES.includes(componentName)) {
const config = TASK_DISPATCHER_CONFIG[componentName as keyof typeof TASK_DISPATCHER_CONFIG];

if (config) {
const subtasks = config.getSubtasks({getAllSubtasks: true, task});

if (subtasks && subtasks.length > 0) {
extractTasks(subtasks);
}
}
}
});
};

extractTasks(tasks);

return allTasks;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {ClusterElementsType, NodeDataType} from '@/shared/types';

import {isPlainObject} from '../../cluster-element-editor/utils/clusterElementsUtils';
import useWorkflowDataStore from '../stores/useWorkflowDataStore';
import getAllTasksRecursively from './getAllTasksRecursively';

export default function getFormattedName(itemName: string): string {
const {nodes, workflow} = useWorkflowDataStore.getState();
Expand All @@ -13,7 +14,9 @@ export default function getFormattedName(itemName: string): string {

const workflowDefinition = JSON.parse(workflow.definition!);

const clusterElementNames = workflowDefinition.tasks.map((task: WorkflowTask) => {
const allTasks = getAllTasksRecursively(workflowDefinition.tasks);

const clusterElementNames = allTasks.map((task: WorkflowTask) => {
const elementNames: string[] = [];

const {clusterElements} = task;
Expand Down
Loading
Loading