Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Commit 39ea6c4

Browse files
authored
fix(orchestrator): multiple bug fixes related to execution form (#2573)
1 parent 8ac72a1 commit 39ea6c4

File tree

4 files changed

+45
-27
lines changed

4 files changed

+45
-27
lines changed

.changeset/warm-clouds-compete.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@janus-idp/backstage-plugin-orchestrator-form-react": patch
3+
"@janus-idp/backstage-plugin-orchestrator": patch
4+
---
5+
6+
multiple bug fixes related to execution form

plugins/orchestrator-form-react/src/components/OrchestratorForm.tsx

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@ const getNumSteps = (schema: JSONSchema7): number | undefined => {
2424

2525
const SingleStepForm = ({
2626
schema,
27-
formData,
28-
onChange,
27+
initialFormData,
28+
onSubmit,
2929
uiSchema,
3030
}: {
3131
schema: JSONSchema7;
32-
formData: JsonObject;
33-
onChange: (formData: JsonObject) => void;
32+
initialFormData?: JsonObject;
33+
onSubmit: (formData: JsonObject) => void;
3434
uiSchema: UiSchema<JsonObject>;
3535
}) => {
36+
const [_initialFormData, setInitialFormData] = React.useState<JsonObject | undefined>(initialFormData)
37+
const _onSubmit = (formData: JsonObject) => {
38+
// Since the review step is outside of the MuiForm component in SingleStepForm, we need to load the current values when navigating back.
39+
setInitialFormData(formData);
40+
onSubmit(formData);
41+
}
42+
3643
const steps = React.useMemo<OrchestratorFormStep[]>(() => {
3744
return [
3845
{
@@ -41,16 +48,16 @@ const SingleStepForm = ({
4148
content: (
4249
<OrchestratorFormWrapper
4350
schema={{ ...schema, title: '' }}
44-
formData={formData}
45-
onChange={onChange}
51+
initialFormData={_initialFormData}
52+
onSubmit={_onSubmit}
4653
uiSchema={uiSchema}
4754
>
4855
<OrchestratorFormToolbar />
4956
</OrchestratorFormWrapper>
5057
),
5158
},
5259
];
53-
}, [schema, formData, onChange, uiSchema]);
60+
}, [schema, _initialFormData, onSubmit, uiSchema]);
5461
return <OrchestratorFormStepper steps={steps} />;
5562
};
5663

@@ -59,7 +66,7 @@ type OrchestratorFormProps = {
5966
isExecuting: boolean;
6067
handleExecute: (parameters: JsonObject) => Promise<void>;
6168
data?: JsonObject;
62-
isDataReadonly?: boolean;
69+
isDataReadonly?: boolean;
6370
};
6471

6572
const OrchestratorForm = ({
@@ -80,7 +87,7 @@ const OrchestratorForm = ({
8087
handleExecute(formData || {});
8188
}, [formData, handleExecute]);
8289

83-
const onChange = React.useCallback(
90+
const onSubmit = React.useCallback(
8491
(_formData: JsonObject) => {
8592
setFormData(_formData);
8693
},
@@ -113,17 +120,17 @@ const OrchestratorForm = ({
113120
<OrchestratorFormWrapper
114121
schema={schema}
115122
numStepsInMultiStepSchema={numStepsInMultiStepSchema}
116-
formData={formData}
117-
onChange={onChange}
123+
onSubmit={onSubmit}
118124
uiSchema={uiSchema}
125+
initialFormData={data}
119126
>
120127
<Fragment />
121128
</OrchestratorFormWrapper> // it is required to pass the fragment so rjsf won't generate a Submit button
122129
) : (
123130
<SingleStepForm
124131
schema={schema}
125-
onChange={onChange}
126-
formData={formData}
132+
onSubmit={onSubmit}
133+
initialFormData={data}
127134
uiSchema={uiSchema}
128135
/>
129136
)}

plugins/orchestrator-form-react/src/components/OrchestratorFormWrapper.tsx

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ const MuiForm = withTheme<JsonObject, JSONSchema7>(MuiTheme);
2626
type OrchestratorFormWrapperProps = {
2727
schema: JSONSchema7;
2828
numStepsInMultiStepSchema?: number;
29-
children: React.ReactNode;
30-
formData: JsonObject;
31-
onChange: (formData: JsonObject) => void;
29+
children: React.ReactNode;
30+
onSubmit: (formData: JsonObject) => void;
3231
uiSchema: UiSchema<JsonObject, JSONSchema7>;
32+
initialFormData?: JsonObject;
3333
};
3434

3535
const WrapperFormPropsContext =
@@ -49,13 +49,15 @@ const FormComponent = (decoratorProps: FormDecoratorProps) => {
4949
numStepsInMultiStepSchema,
5050
uiSchema,
5151
schema,
52-
onChange,
53-
formData,
52+
onSubmit: _onSubmit,
53+
initialFormData,
5454
children,
5555
} = props;
5656
const [extraErrors, setExtraErrors] = React.useState<
5757
ErrorSchema<JsonObject> | undefined
5858
>();
59+
// make this form a controlled component so state will remain when moving between steps. see https://rjsf-team.github.io/react-jsonschema-form/docs/quickstart#controlled-component
60+
const [formData, setFormData] = React.useState<JsonObject>(initialFormData || {});
5961
const isMultiStep = numStepsInMultiStepSchema !== undefined;
6062
const { handleNext, activeStep, handleValidateStarted, handleValidateEnded } =
6163
useStepperContext();
@@ -96,8 +98,10 @@ const FormComponent = (decoratorProps: FormDecoratorProps) => {
9698
!_validationError &&
9799
activeStep < (numStepsInMultiStepSchema || 1)
98100
) {
101+
_onSubmit(_formData);
99102
handleNext();
100-
}
103+
104+
}
101105
};
102106

103107
return (
@@ -109,7 +113,7 @@ const FormComponent = (decoratorProps: FormDecoratorProps) => {
109113
)}
110114
<Grid item>
111115
<MuiForm
112-
{...omit(decoratorProps, 'extra')}
116+
{...omit(decoratorProps, 'getExtraErrors')}
113117
fields={isMultiStep ? { ObjectField: StepperObjectField } : {}}
114118
uiSchema={uiSchema}
115119
validator={validator}
@@ -119,7 +123,7 @@ const FormComponent = (decoratorProps: FormDecoratorProps) => {
119123
extraErrors={extraErrors}
120124
onSubmit={e => onSubmit(e.formData || {})}
121125
onChange={e => {
122-
onChange(e.formData || {});
126+
setFormData(e.formData || {});
123127
if (decoratorProps.onChange) {
124128
decoratorProps.onChange(e);
125129
}
@@ -135,17 +139,18 @@ const FormComponent = (decoratorProps: FormDecoratorProps) => {
135139
const OrchestratorFormWrapper = ({
136140
schema,
137141
uiSchema,
138-
formData,
142+
initialFormData,
139143
...props
140144
}: OrchestratorFormWrapperProps) => {
141145
const formApi =
142146
useApiHolder().get(orchestratorFormApiRef) || defaultFormExtensionsApi;
143147
const NewComponent = React.useMemo(() => {
144-
const formDecorator = formApi.getFormDecorator(schema, uiSchema, formData);
148+
const formDecorator = formApi.getFormDecorator(schema, uiSchema, initialFormData);
145149
return formDecorator(FormComponent);
146-
}, [schema, formApi, uiSchema, formData]);
150+
}, [schema, uiSchema, formApi, initialFormData]);
151+
console.log({initialFormData})
147152
return (
148-
<WrapperFormPropsContext.Provider value={{ schema, uiSchema, formData, ...props }}>
153+
<WrapperFormPropsContext.Provider value={{ schema, uiSchema, initialFormData, ...props }}>
149154
<NewComponent />
150155
</WrapperFormPropsContext.Provider>
151156
);

plugins/orchestrator/src/components/ExecuteWorkflowPage/ExecuteWorkflowPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const ExecuteWorkflowPage = () => {
7575
const response = await orchestratorApi.executeWorkflow({
7676
workflowId,
7777
parameters,
78-
businessKey: effectiveInstanceId,
78+
businessKey: assessmentInstanceId,
7979
});
8080
navigate(instanceLink({ instanceId: response.data.id }));
8181
} catch (err) {
@@ -84,7 +84,7 @@ export const ExecuteWorkflowPage = () => {
8484
setIsExecuting(false);
8585
}
8686
},
87-
[orchestratorApi, workflowId, navigate, instanceLink, effectiveInstanceId],
87+
[orchestratorApi, workflowId, navigate, instanceLink, assessmentInstanceId],
8888
);
8989

9090
const error = responseError || workflowNameError;

0 commit comments

Comments
 (0)