Fix workflow run ouput format (#10302)

- Adapt the frontend to use the new output format
This commit is contained in:
Baptiste Devessier
2025-02-19 15:10:59 +01:00
committed by GitHub
parent ad9af65898
commit 77caf36d90
8 changed files with 94 additions and 119 deletions

View File

@ -231,7 +231,7 @@ export class WorkflowVisualizerPage {
async closeSidePanel() { async closeSidePanel() {
const closeButton = this.#page.getByTestId( const closeButton = this.#page.getByTestId(
'page-header-close-command-menu-button', 'page-header-command-menu-button',
); );
await closeButton.click(); await closeButton.click();

View File

@ -194,20 +194,20 @@ export const useRecordShowContainerTabs = (
ifRelationsMissing: [], ifRelationsMissing: [],
}, },
}, },
// workflowRunFlow: { workflowRunFlow: {
// title: 'Flow', title: 'Flow',
// position: 0, position: 0,
// Icon: IconSettings, Icon: IconSettings,
// cards: [{ type: CardType.WorkflowRunCard }], cards: [{ type: CardType.WorkflowRunCard }],
// hide: { hide: {
// ifMobile: false, ifMobile: false,
// ifDesktop: false, ifDesktop: false,
// ifInRightDrawer: false, ifInRightDrawer: false,
// ifFeaturesDisabled: [FeatureFlagKey.IsWorkflowEnabled], ifFeaturesDisabled: [FeatureFlagKey.IsWorkflowEnabled],
// ifRequiredObjectsInactive: [], ifRequiredObjectsInactive: [],
// ifRelationsMissing: [], ifRelationsMissing: [],
// }, },
// }, },
timeline: null, timeline: null,
}, },
}, },

View File

@ -188,8 +188,6 @@ export type WorkflowVersion = {
type StepRunOutput = { type StepRunOutput = {
id: string; id: string;
name: string;
type: string;
outputs: { outputs: {
attemptCount: number; attemptCount: number;
result: object | undefined; result: object | undefined;
@ -197,8 +195,14 @@ type StepRunOutput = {
}[]; }[];
}; };
export type WorkflowRunOutputStepsOutput = Record<string, StepRunOutput>;
export type WorkflowRunOutput = { export type WorkflowRunOutput = {
steps: Record<string, StepRunOutput>; flow: {
trigger: WorkflowTrigger;
steps: WorkflowAction[];
};
stepsOutput?: WorkflowRunOutputStepsOutput;
error?: string; error?: string;
}; };

View File

@ -1,4 +1,3 @@
import { useWorkflowVersion } from '@/workflow/hooks/useWorkflowVersion';
import { workflowVersionIdState } from '@/workflow/states/workflowVersionIdState'; import { workflowVersionIdState } from '@/workflow/states/workflowVersionIdState';
import { WorkflowRun } from '@/workflow/types/Workflow'; import { WorkflowRun } from '@/workflow/types/Workflow';
import { workflowDiagramState } from '@/workflow/workflow-diagram/states/workflowDiagramState'; import { workflowDiagramState } from '@/workflow/workflow-diagram/states/workflowDiagramState';
@ -14,8 +13,6 @@ export const WorkflowRunVisualizerEffect = ({
workflowVersionId: string; workflowVersionId: string;
workflowRun: WorkflowRun; workflowRun: WorkflowRun;
}) => { }) => {
const workflowVersion = useWorkflowVersion(workflowVersionId);
const setWorkflowVersionId = useSetRecoilState(workflowVersionIdState); const setWorkflowVersionId = useSetRecoilState(workflowVersionIdState);
const setWorkflowDiagram = useSetRecoilState(workflowDiagramState); const setWorkflowDiagram = useSetRecoilState(workflowDiagramState);
@ -24,26 +21,20 @@ export const WorkflowRunVisualizerEffect = ({
}, [setWorkflowVersionId, workflowVersionId]); }, [setWorkflowVersionId, workflowVersionId]);
useEffect(() => { useEffect(() => {
if ( if (!isDefined(workflowRun.output)) {
!(
isDefined(workflowVersion) &&
isDefined(workflowVersion.trigger) &&
isDefined(workflowVersion.steps)
)
) {
setWorkflowDiagram(undefined); setWorkflowDiagram(undefined);
return; return;
} }
const nextWorkflowDiagram = generateWorkflowRunDiagram({ const nextWorkflowDiagram = generateWorkflowRunDiagram({
trigger: workflowVersion.trigger, trigger: workflowRun.output.flow.trigger,
steps: workflowVersion.steps, steps: workflowRun.output.flow.steps,
output: workflowRun.output, stepsOutput: workflowRun.output.stepsOutput,
}); });
setWorkflowDiagram(nextWorkflowDiagram); setWorkflowDiagram(nextWorkflowDiagram);
}, [setWorkflowDiagram, workflowRun.output, workflowVersion]); }, [setWorkflowDiagram, workflowRun.output]);
return null; return null;
}; };

View File

@ -1,5 +1,5 @@
import { import {
WorkflowRunOutput, WorkflowRunOutputStepsOutput,
WorkflowStep, WorkflowStep,
WorkflowTrigger, WorkflowTrigger,
} from '@/workflow/types/Workflow'; } from '@/workflow/types/Workflow';
@ -76,18 +76,14 @@ describe('generateWorkflowRunDiagram', () => {
}, },
}, },
]; ];
const output: WorkflowRunOutput = { const stepsOutput: WorkflowRunOutputStepsOutput = {
steps: { step1: {
step1: { id: 'step1',
id: 'step1', outputs: [],
name: 'Step 1',
outputs: [],
type: 'CODE',
},
}, },
}; };
const result = generateWorkflowRunDiagram({ trigger, steps, output }); const result = generateWorkflowRunDiagram({ trigger, steps, stepsOutput });
expect(result).toMatchInlineSnapshot(` expect(result).toMatchInlineSnapshot(`
{ {
@ -249,24 +245,20 @@ describe('generateWorkflowRunDiagram', () => {
}, },
}, },
]; ];
const output: WorkflowRunOutput = { const stepsOutput: WorkflowRunOutputStepsOutput = {
steps: { step1: {
step1: { id: 'step1',
id: 'step1', outputs: [
name: 'Step 1', {
outputs: [ attemptCount: 1,
{ result: undefined,
attemptCount: 1, error: '',
result: undefined, },
error: '', ],
},
],
type: 'CODE',
},
}, },
}; };
const result = generateWorkflowRunDiagram({ trigger, steps, output }); const result = generateWorkflowRunDiagram({ trigger, steps, stepsOutput });
expect(result).toMatchInlineSnapshot(` expect(result).toMatchInlineSnapshot(`
{ {
@ -428,48 +420,40 @@ describe('generateWorkflowRunDiagram', () => {
}, },
}, },
]; ];
const output: WorkflowRunOutput = { const stepsOutput: WorkflowRunOutputStepsOutput = {
steps: { step1: {
step1: { id: 'step1',
id: 'step1', outputs: [
name: 'Step 1', {
outputs: [ attemptCount: 1,
{ result: {},
attemptCount: 1, error: undefined,
result: {}, },
error: undefined, ],
}, },
], step2: {
type: 'CODE', id: 'step2',
}, outputs: [
step2: { {
id: 'step2', attemptCount: 1,
name: 'Step 2', result: {},
outputs: [ error: undefined,
{ },
attemptCount: 1, ],
result: {}, },
error: undefined, step3: {
}, id: 'step3',
], outputs: [
type: 'CODE', {
}, attemptCount: 1,
step3: { result: {},
id: 'step3', error: undefined,
name: 'Step 3', },
outputs: [ ],
{
attemptCount: 1,
result: {},
error: undefined,
},
],
type: 'CODE',
},
}, },
}; };
const result = generateWorkflowRunDiagram({ trigger, steps, output }); const result = generateWorkflowRunDiagram({ trigger, steps, stepsOutput });
expect(result).toMatchInlineSnapshot(` expect(result).toMatchInlineSnapshot(`
{ {
@ -633,9 +617,9 @@ describe('generateWorkflowRunDiagram', () => {
}, },
}, },
]; ];
const output = null; const stepsOutput = undefined;
const result = generateWorkflowRunDiagram({ trigger, steps, output }); const result = generateWorkflowRunDiagram({ trigger, steps, stepsOutput });
expect(result).toMatchInlineSnapshot(` expect(result).toMatchInlineSnapshot(`
{ {
@ -815,24 +799,20 @@ describe('generateWorkflowRunDiagram', () => {
}, },
}, },
]; ];
const output: WorkflowRunOutput = { const stepsOutput: WorkflowRunOutputStepsOutput = {
steps: { step1: {
step1: { id: 'step1',
id: 'step1', outputs: [
name: 'Step 1', {
outputs: [ attemptCount: 1,
{ result: {},
attemptCount: 1, error: undefined,
result: {}, },
error: undefined, ],
},
],
type: 'CODE',
},
}, },
}; };
const result = generateWorkflowRunDiagram({ trigger, steps, output }); const result = generateWorkflowRunDiagram({ trigger, steps, stepsOutput });
expect(result).toMatchInlineSnapshot(` expect(result).toMatchInlineSnapshot(`
{ {

View File

@ -1,5 +1,5 @@
import { import {
WorkflowRunOutput, WorkflowRunOutputStepsOutput,
WorkflowStep, WorkflowStep,
WorkflowTrigger, WorkflowTrigger,
} from '@/workflow/types/Workflow'; } from '@/workflow/types/Workflow';
@ -21,11 +21,11 @@ import { v4 } from 'uuid';
export const generateWorkflowRunDiagram = ({ export const generateWorkflowRunDiagram = ({
trigger, trigger,
steps, steps,
output, stepsOutput,
}: { }: {
trigger: WorkflowTrigger; trigger: WorkflowTrigger;
steps: Array<WorkflowStep>; steps: Array<WorkflowStep>;
output: WorkflowRunOutput | null; stepsOutput: WorkflowRunOutputStepsOutput | undefined;
}): WorkflowRunDiagram => { }): WorkflowRunDiagram => {
const triggerBase = getWorkflowDiagramTriggerNode({ trigger }); const triggerBase = getWorkflowDiagramTriggerNode({ trigger });
@ -78,7 +78,7 @@ export const generateWorkflowRunDiagram = ({
}); });
} }
const runResult = output?.steps[nodeId]; const runResult = stepsOutput?.[nodeId];
let runStatus: WorkflowDiagramRunStatus; let runStatus: WorkflowDiagramRunStatus;
if (skippedExecution) { if (skippedExecution) {

View File

@ -46,7 +46,7 @@ export type WorkflowRunOutput = {
trigger: WorkflowTrigger; trigger: WorkflowTrigger;
steps: WorkflowAction[]; steps: WorkflowAction[];
}; };
stepsOutput: Record<string, StepRunOutput>; stepsOutput?: Record<string, StepRunOutput>;
error?: string; error?: string;
}; };

View File

@ -70,7 +70,7 @@ export class WorkflowExecutorWorkspaceService {
}; };
} }
const stepOutput = workflowExecutorState.stepsOutput[step.id]; const stepOutput = workflowExecutorState.stepsOutput?.[step.id];
const error = const error =
result.error?.errorMessage ?? result.error?.errorMessage ??