From 8b2110569bedec0944dadfa68b77d9d5a7546345 Mon Sep 17 00:00:00 2001 From: Tristan Huet Date: Thu, 2 May 2024 17:23:25 +0200 Subject: [PATCH] fix: fix default state of enum with dynamic values in scenario parameters --- .../ScenarioParametersInputs/GenericEnumInput.js | 8 +++++--- .../DatasetCreationParameters.js | 5 ++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/ScenarioParameters/components/ScenarioParametersInputs/GenericEnumInput.js b/src/components/ScenarioParameters/components/ScenarioParametersInputs/GenericEnumInput.js index e10d9b07d..8aeebb6d2 100644 --- a/src/components/ScenarioParameters/components/ScenarioParametersInputs/GenericEnumInput.js +++ b/src/components/ScenarioParameters/components/ScenarioParametersInputs/GenericEnumInput.js @@ -13,6 +13,7 @@ export const GenericEnumInput = ({ context, parameterValue, setParameterValue, + resetParameterValue, // Set a new value without triggering the form 'dirty' state isDirty, gridItemProps, }) => { @@ -55,14 +56,14 @@ export const GenericEnumInput = ({ }, [t, parameterData, dynamicEnumValues]); useEffect(() => { - // Call setParameterValue when dynamic values are enabled to trigger an update of the form validity. This + // Call resetParameterValue when dynamic values are enabled to trigger an update of the form validity. This // is required to automatically enable a form confirmation button when a default value is selected from // dynamic values (e.g. in the dataset creation wizard). Yet, we don't want this behavior in the scenario // parameters, because it tends to set the form state to "dirty" for enums without default values. if (dynamicEnumValues != null && parameterValue == null && enumValues?.length > 0) { - setParameterValue(enumValues[0]?.key); + resetParameterValue(enumValues[0]?.key); } - }, [enumValues, dynamicEnumValues, parameterValue, setParameterValue]); + }, [enumValues, dynamicEnumValues, parameterValue, resetParameterValue]); if (dynamicValuesError) return dynamicValuesError; return ( @@ -90,6 +91,7 @@ GenericEnumInput.propTypes = { context: PropTypes.object.isRequired, parameterValue: PropTypes.any, setParameterValue: PropTypes.func.isRequired, + resetParameterValue: PropTypes.func.isRequired, isDirty: PropTypes.bool, gridItemProps: PropTypes.object, }; diff --git a/src/views/DatasetManager/components/CreateDatasetButton/components/DatasetCreationParameters/DatasetCreationParameters.js b/src/views/DatasetManager/components/CreateDatasetButton/components/DatasetCreationParameters/DatasetCreationParameters.js index f27166110..db73b159a 100644 --- a/src/views/DatasetManager/components/CreateDatasetButton/components/DatasetCreationParameters/DatasetCreationParameters.js +++ b/src/views/DatasetManager/components/CreateDatasetButton/components/DatasetCreationParameters/DatasetCreationParameters.js @@ -1,7 +1,7 @@ // Copyright (c) Cosmo Tech. // Licensed under the MIT license. import React, { useEffect, useMemo, useState } from 'react'; -import { Controller } from 'react-hook-form'; +import { Controller, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; import { Grid, Typography } from '@mui/material'; @@ -21,6 +21,7 @@ const clone = rfdc(); export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDataset }) => { const { t } = useTranslation(); + const { resetField } = useFormContext(); const { datasourceParameterHelpers, getDataSourceTypeEnumValues, getUploadFileLabels, getDefaultFileTypeFilter } = useDatasetCreationParameters(); @@ -93,6 +94,7 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase context={{ editMode: true, targetDatasetId: parentDataset?.id }} parameterValue={value} setParameterValue={onChange} + resetParameterValue={(newDefaultValue) => resetField(fieldPath, { defaultValue: newDefaultValue })} gridItemProps={{ xs: 6, sx: { pt: 2 } }} isDirty={null} /> @@ -142,6 +144,7 @@ export const DatasetCreationParameters = ({ dataSourceRunTemplates, parentDatase dataSourceType, parentDataset?.id, datasourceParameterHelpers, + resetField, ]); const labels = useMemo(() => {