Skip to content

Commit 642ca3f

Browse files
committed
fix: [PROD-14393] fix dataset creation form state after reopening the dialog
Form state validation only worked correctly the first time a data source type was opened, because the form state is reset when the Dialog is closed. This fix adds a ref in DatasetCreationParameters to store the default values used when building the form input fields, and calls getValues() to keep track of the form values while the Dialog stays open (e.g. when switching back to a previously edited data source type). When the data source type changes in the Dialog, the react-hook-form state is reset with a combination of form values and default values, and the form validation is thus correctly managed.
1 parent 85bcd69 commit 642ca3f

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

src/views/DatasetManager/components/CreateDatasetButton/components/DatasetCreationParameters/DatasetCreationParameters.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright (c) Cosmo Tech.
22
// Licensed under the MIT license.
3-
import React, { useEffect, useMemo, useState } from 'react';
3+
import React, { useEffect, useMemo, useRef, useState } from 'react';
44
import { Controller, useFormContext } from 'react-hook-form';
55
import { useTranslation } from 'react-i18next';
66
import PropTypes from 'prop-types';
@@ -18,7 +18,7 @@ const clone = rfdc();
1818

1919
export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDataset, selectedRunner }) => {
2020
const { t } = useTranslation();
21-
const { resetField } = useFormContext();
21+
const { getValues, resetField } = useFormContext();
2222
const organizationId = useOrganizationId();
2323
const workspaceId = useWorkspaceId();
2424
const { datasourceParameterHelpers, getDataSourceTypeEnumValues, getUploadFileLabels, getDefaultFileTypeFilter } =
@@ -40,6 +40,7 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase
4040
if (dataSourceType == null) setDataSourceType(defaultDataSourceTypeKey);
4141
}, [dataSourceType, setDataSourceType, defaultDataSourceTypeKey]);
4242

43+
const defaultFormState = useRef({});
4344
const sourceParameters = useMemo(() => {
4445
const forgeParameterInput = (originalParameter) => {
4546
const parameterId = originalParameter.id;
@@ -70,6 +71,7 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase
7071
console.error(`VarType "${inputType}" is not supported for ETL runner parameters.`);
7172
return null;
7273
}
74+
defaultFormState.current[fieldPath] = defaultValue;
7375

7476
return (
7577
<Controller
@@ -155,6 +157,7 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase
155157
};
156158

157159
const runTemplate = dataSourceRunTemplates[dataSourceType];
160+
defaultFormState.current = {};
158161
return runTemplate?.parameters?.map((parameter) => forgeParameterInput(parameter));
159162
}, [
160163
organizationId,
@@ -169,6 +172,25 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase
169172
getDefaultFileTypeFilter,
170173
]);
171174

175+
useEffect(() => {
176+
// Do not reset form when updating an existing dataset (already done in a useEffect in UpdateDatasetDialog)
177+
if (isDatasetParametersEditionDialog) return;
178+
179+
const formValues = getValues();
180+
for (const [sourceType, parameters] of Object.entries(formValues)) {
181+
// Ignore fields that are not source types
182+
if (['name', 'tags', 'description', 'sourceType'].includes(sourceType)) continue;
183+
for (const [parameterId, parameterValue] of Object.entries(parameters)) {
184+
const escapedSourceType = SolutionsUtils.escapeRunTemplateId(sourceType);
185+
const fieldPath = `${escapedSourceType}.${parameterId}`;
186+
defaultFormState.current[fieldPath] = parameterValue;
187+
}
188+
}
189+
for (const [key, defaultValue] of Object.entries(defaultFormState.current)) {
190+
resetField(key, { defaultValue });
191+
}
192+
}, [getValues, isDatasetParametersEditionDialog, resetField, sourceParameters]);
193+
172194
const labels = useMemo(() => {
173195
return isSubDatasetCreationWizard
174196
? {

src/views/DatasetManager/components/CreateDatasetButton/components/DatasetWizard/DatasetWizard.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,6 @@ export const DatasetWizard = ({ open, closeDialog, onConfirm, dataSourceRunTempl
2828
const { formState } = methods;
2929
const [activeStep, setActiveStep] = useState(0);
3030

31-
useEffect(() => {
32-
if (open) {
33-
methods.reset();
34-
setActiveStep(0);
35-
}
36-
}, [open, methods, setActiveStep]);
37-
3831
const confirm = (event) => {
3932
const values = methods.getValues();
4033
onConfirm(values);
@@ -62,6 +55,13 @@ export const DatasetWizard = ({ open, closeDialog, onConfirm, dataSourceRunTempl
6255
return `${parentDataset?.name} (subdataset)`;
6356
}, [parentDataset?.name, isSubDatasetCreationWizard]);
6457

58+
useEffect(() => {
59+
if (open) {
60+
methods.reset({ name: defaultName });
61+
setActiveStep(0);
62+
}
63+
}, [defaultName, open, methods, setActiveStep]);
64+
6565
const firstStep = (
6666
<>
6767
<Grid item xs={12}>

0 commit comments

Comments
 (0)