From b90548fa4b90bb7f68b1f07982d6815d3f7c8b65 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Tue, 7 Jul 2026 17:03:03 +0200 Subject: [PATCH 1/5] separate advanced and provider specific parameters between new tabs Signed-off-by: LE SAULNIER Kevin --- src/features/parameters/common/constants.ts | 1 + .../load-flow-advanced-parameters.tsx | 96 ++++++++++++++++ .../loadflow/load-flow-general-parameters.tsx | 104 +----------------- .../loadflow/load-flow-parameters-content.tsx | 12 +- .../loadflow/load-flow-parameters-form.tsx | 1 + .../loadflow/load-flow-parameters-header.tsx | 15 +++ .../loadflow/load-flow-parameters-type.ts | 4 +- .../loadflow/load-flow-parameters-utils.ts | 14 ++- ...load-flow-provider-specific-parameters.tsx | 27 +++++ .../loadflow/use-load-flow-parameters-form.ts | 64 +++++++++-- src/translations/en/parameters.ts | 3 +- src/translations/fr/parameters.ts | 3 +- 12 files changed, 226 insertions(+), 118 deletions(-) create mode 100644 src/features/parameters/loadflow/load-flow-advanced-parameters.tsx create mode 100644 src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx diff --git a/src/features/parameters/common/constants.ts b/src/features/parameters/common/constants.ts index 389b222c1..e6a976655 100644 --- a/src/features/parameters/common/constants.ts +++ b/src/features/parameters/common/constants.ts @@ -17,6 +17,7 @@ export const PARAM_SA_HIGH_VOLTAGE_ABSOLUTE_THRESHOLD = 'highVoltageAbsoluteThre export const VERSION_PARAMETER = 'version'; export const COMMON_PARAMETERS = 'commonParameters'; +export const ADVANCED_PARAMETERS = 'advancedParameters'; export const SPECIFIC_PARAMETERS = 'specificParametersPerProvider'; export const CONTINGENCY_LISTS_INFOS = 'contingencyListsInfos'; diff --git a/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx new file mode 100644 index 000000000..6307780bd --- /dev/null +++ b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { memo } from 'react'; +import ParameterField from '../common/parameter-field'; +import { + DC_POWER_FACTOR, + DC_USE_TRANSFORMER_RATIO, + DISTRIBUTED_SLACK, + READ_SLACK_BUS, + SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON, + TWT_SPLIT_SHUNT_ADMITTANCE, + USE_REACTIVE_LIMITS, + VOLTAGE_INIT_MODE, + WRITE_SLACK_BUS, +} from './constants'; +import { ParameterType, SpecificParameterInfos } from '../../../utils/types/parameters.type'; +import { ADVANCED_PARAMETERS, COMMON_PARAMETERS } from '../common'; + +export const advancedParams: SpecificParameterInfos[] = [ + { + name: VOLTAGE_INIT_MODE, + type: ParameterType.STRING, + label: 'descLfVoltageInitMode', + possibleValues: [ + { + id: 'UNIFORM_VALUES', + label: 'descLfUniformValues', + }, + { + id: 'PREVIOUS_VALUES', + label: 'descLfPreviousValues', + }, + { + id: 'DC_VALUES', + label: 'descLfDcValues', + }, + ], + }, + { + name: USE_REACTIVE_LIMITS, + type: ParameterType.BOOLEAN, + label: 'descLfUseReactiveLimits', + }, + { + name: TWT_SPLIT_SHUNT_ADMITTANCE, + type: ParameterType.BOOLEAN, + label: 'descLfTwtSplitShuntAdmittance', + }, + { + name: READ_SLACK_BUS, + type: ParameterType.BOOLEAN, + label: 'descLfReadSlackBus', + }, + { + name: WRITE_SLACK_BUS, + type: ParameterType.BOOLEAN, + label: 'descLfWriteSlackBus', + }, + { + name: DISTRIBUTED_SLACK, + type: ParameterType.BOOLEAN, + label: 'descLfDistributedSlack', + }, + { + name: SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON, + type: ParameterType.BOOLEAN, + label: 'descLfShuntCompensatorVoltageControlOn', + }, + { + name: DC_USE_TRANSFORMER_RATIO, + type: ParameterType.BOOLEAN, + label: 'descLfDcUseTransformerRatio', + }, + { + name: DC_POWER_FACTOR, + type: ParameterType.DOUBLE, + label: 'descLfDcPowerFactor', + }, +]; + +function LoadFlowAdvancedParameters() { + return ( + <> + {advancedParams.map((item) => ( + + ))} + + ); +} + +export default memo(LoadFlowAdvancedParameters); diff --git a/src/features/parameters/loadflow/load-flow-general-parameters.tsx b/src/features/parameters/loadflow/load-flow-general-parameters.tsx index dbe5534e7..7945be651 100644 --- a/src/features/parameters/loadflow/load-flow-general-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-general-parameters.tsx @@ -12,22 +12,11 @@ import { CONNECTED_MODE, COUNTRIES_TO_BALANCE, DC, - DC_POWER_FACTOR, - DC_USE_TRANSFORMER_RATIO, - DISTRIBUTED_SLACK, HVDC_AC_EMULATION, PHASE_SHIFTER_REGULATION_ON, - READ_SLACK_BUS, - SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON, - TWT_SPLIT_SHUNT_ADMITTANCE, - USE_REACTIVE_LIMITS, - VOLTAGE_INIT_MODE, - WRITE_SLACK_BUS, } from './constants'; -import { useLoadFlowContext } from './use-load-flow-context'; import { ParameterType, SpecificParameterInfos } from '../../../utils/types/parameters.type'; -import { ParameterGroup } from '../common/widget'; -import { COMMON_PARAMETERS, SPECIFIC_PARAMETERS } from '../common'; +import { COMMON_PARAMETERS } from '../common'; const basicParams: SpecificParameterInfos[] = [ { @@ -82,101 +71,12 @@ const basicParams: SpecificParameterInfos[] = [ }, ]; -const advancedParams: SpecificParameterInfos[] = [ - { - name: VOLTAGE_INIT_MODE, - type: ParameterType.STRING, - label: 'descLfVoltageInitMode', - possibleValues: [ - { - id: 'UNIFORM_VALUES', - label: 'descLfUniformValues', - }, - { - id: 'PREVIOUS_VALUES', - label: 'descLfPreviousValues', - }, - { - id: 'DC_VALUES', - label: 'descLfDcValues', - }, - ], - }, - { - name: USE_REACTIVE_LIMITS, - type: ParameterType.BOOLEAN, - label: 'descLfUseReactiveLimits', - }, - { - name: TWT_SPLIT_SHUNT_ADMITTANCE, - type: ParameterType.BOOLEAN, - label: 'descLfTwtSplitShuntAdmittance', - }, - { - name: READ_SLACK_BUS, - type: ParameterType.BOOLEAN, - label: 'descLfReadSlackBus', - }, - { - name: WRITE_SLACK_BUS, - type: ParameterType.BOOLEAN, - label: 'descLfWriteSlackBus', - }, - { - name: DISTRIBUTED_SLACK, - type: ParameterType.BOOLEAN, - label: 'descLfDistributedSlack', - }, - { - name: SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON, - type: ParameterType.BOOLEAN, - label: 'descLfShuntCompensatorVoltageControlOn', - }, - { - name: DC_USE_TRANSFORMER_RATIO, - type: ParameterType.BOOLEAN, - label: 'descLfDcUseTransformerRatio', - }, - { - name: DC_POWER_FACTOR, - type: ParameterType.DOUBLE, - label: 'descLfDcPowerFactor', - }, -]; - -interface LoadFlowGeneralParametersProps { - provider: string; - specificParams: SpecificParameterInfos[]; -} - -function LoadFlowGeneralParameters({ provider, specificParams }: Readonly) { - const { showAdvancedLfParams, setShowAdvancedLfParams, showSpecificLfParams, setShowSpecificLfParams } = - useLoadFlowContext(); +function LoadFlowGeneralParameters() { return ( <> {basicParams.map((item) => ( ))} - - {showAdvancedLfParams && - advancedParams.map((item) => )} - - - {showSpecificLfParams && - specificParams?.map((item) => ( - - ))} - ); } diff --git a/src/features/parameters/loadflow/load-flow-parameters-content.tsx b/src/features/parameters/loadflow/load-flow-parameters-content.tsx index 7457fd078..8405b9bf5 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-content.tsx +++ b/src/features/parameters/loadflow/load-flow-parameters-content.tsx @@ -7,7 +7,9 @@ import { Box, Grid2 as Grid } from '@mui/material'; import { TabValues } from './load-flow-parameters-utils'; +import LoadFlowAdvancedParameters from './load-flow-advanced-parameters'; import LoadFlowGeneralParameters from './load-flow-general-parameters'; +import LoadFlowProviderSpecificParameters from './load-flow-provider-specific-parameters'; import { LimitReductionsTableForm } from '../common'; import { alertThresholdMarks, @@ -27,7 +29,7 @@ import type { MuiStyles } from '../../../utils/styles'; type LoadFlowParametersContentProps = { selectedTab: TabValues; currentProvider: string; - specificParameters: SpecificParameterInfos[]; + specificParameters?: SpecificParameterInfos[]; params: LoadFlowParametersInfos | null; defaultLimitReductions: ILimitReductionsByVoltageLevel[]; }; @@ -59,7 +61,7 @@ function LoadFlowParametersContent({ - + @@ -76,6 +78,12 @@ function LoadFlowParametersContent({ )} + + + + + + diff --git a/src/features/parameters/loadflow/load-flow-parameters-form.tsx b/src/features/parameters/loadflow/load-flow-parameters-form.tsx index 31c64d464..ae1d9c10c 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-form.tsx +++ b/src/features/parameters/loadflow/load-flow-parameters-form.tsx @@ -35,6 +35,7 @@ export function LoadFlowParametersForm({ loadflowMethods }: Readonly diff --git a/src/features/parameters/loadflow/load-flow-parameters-header.tsx b/src/features/parameters/loadflow/load-flow-parameters-header.tsx index 0e0a45f03..222f95d2f 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-header.tsx +++ b/src/features/parameters/loadflow/load-flow-parameters-header.tsx @@ -17,11 +17,13 @@ function LoadFlowParametersHeader({ handleTabChange, tabIndexesWithError, formattedProviders, + disableSpecificProviderParams, }: Readonly<{ selectedTab: string; handleTabChange: (event: React.SyntheticEvent, newValue: TabValues) => void; tabIndexesWithError: TabValues[]; formattedProviders: { id: string; label: string }[]; + disableSpecificProviderParams: boolean; }>) { return ( @@ -39,6 +41,19 @@ function LoadFlowParametersHeader({ sx={getTabStyle(tabIndexesWithError, TabValues.LIMIT_REDUCTIONS)} data-testid="LfLimitReductionsTab" /> + } + value={TabValues.ADVANCED} + sx={getTabStyle(tabIndexesWithError, TabValues.ADVANCED)} + data-testid="LfAdvancedTab" + /> + } + value={TabValues.PROVIDER_SPECIFIC} + sx={getTabStyle(tabIndexesWithError, TabValues.PROVIDER_SPECIFIC)} + data-testid="LfProviderSpecificTab" + disabled={disableSpecificProviderParams} + /> ); diff --git a/src/features/parameters/loadflow/load-flow-parameters-type.ts b/src/features/parameters/loadflow/load-flow-parameters-type.ts index d963bcccf..274e2dab1 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-type.ts +++ b/src/features/parameters/loadflow/load-flow-parameters-type.ts @@ -9,11 +9,13 @@ import type { UUID } from 'node:crypto'; import { ILimitReductionsByVoltageLevel } from '../common'; import { SpecificParametersPerProvider } from '../../../utils'; +export type ParameterValue = boolean | string | string[] | number; + export interface LoadFlowParametersInfos { uuid?: UUID; provider: string; limitReduction: number; - commonParameters: Record; + commonParameters: Record; specificParametersPerProvider: SpecificParametersPerProvider; limitReductions: ILimitReductionsByVoltageLevel[]; } diff --git a/src/features/parameters/loadflow/load-flow-parameters-utils.ts b/src/features/parameters/loadflow/load-flow-parameters-utils.ts index 5a8c871a3..c4b55d691 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-utils.ts +++ b/src/features/parameters/loadflow/load-flow-parameters-utils.ts @@ -8,6 +8,7 @@ import { UseFormReturn } from 'react-hook-form'; import * as yup from 'yup'; import { + ADVANCED_PARAMETERS, COMMON_PARAMETERS, ILimitReductionsByVoltageLevel, IST_FORM, @@ -38,6 +39,8 @@ import { export enum TabValues { GENERAL = 'General', + ADVANCED = 'Advanced', + PROVIDER_SPECIFIC = 'ProviderSpecific', LIMIT_REDUCTIONS = 'LimitReductions', } @@ -52,7 +55,7 @@ export const getBasicLoadFlowParametersFormSchema = () => { }); }; -export const getAdvancedLoadFlowParametersFormSchema = () => { +export const getAdvancedLoadFlowParametersFormSchemaFields = () => { return yup.object().shape({ [VOLTAGE_INIT_MODE]: yup.string().required(), [USE_REACTIVE_LIMITS]: yup.boolean().required(), @@ -74,7 +77,14 @@ export const getCommonLoadFlowParametersFormSchema = () => { return yup.object().shape({ [COMMON_PARAMETERS]: yup.object().shape({ ...getBasicLoadFlowParametersFormSchema().fields, - ...getAdvancedLoadFlowParametersFormSchema().fields, + }), + }); +}; + +export const getAdvancedLoadFlowParametersFormSchema = () => { + return yup.object().shape({ + [ADVANCED_PARAMETERS]: yup.object().shape({ + ...getAdvancedLoadFlowParametersFormSchemaFields().fields, }), }); }; diff --git a/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx new file mode 100644 index 000000000..c47660625 --- /dev/null +++ b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import { memo } from 'react'; +import ParameterField from '../common/parameter-field'; +import { SpecificParameterInfos } from '../../../utils/types/parameters.type'; +import { SPECIFIC_PARAMETERS } from '../common'; + +interface LoadFlowProviderSpecificParametersProps { + specificParameters?: SpecificParameterInfos[]; +} + +function LoadFlowProviderSpecificParameters({ specificParameters }: Readonly) { + return ( + <> + {specificParameters?.map((item) => ( + + ))} + + ); +} + +export default memo(LoadFlowProviderSpecificParameters); diff --git a/src/features/parameters/loadflow/use-load-flow-parameters-form.ts b/src/features/parameters/loadflow/use-load-flow-parameters-form.ts index 89486a96f..b87d1ce45 100644 --- a/src/features/parameters/loadflow/use-load-flow-parameters-form.ts +++ b/src/features/parameters/loadflow/use-load-flow-parameters-form.ts @@ -11,13 +11,15 @@ import { SyntheticEvent, useCallback, useEffect, useEffectEvent, useMemo, useRef import type { UUID } from 'node:crypto'; import * as yup from 'yup'; import { + getAdvancedLoadFlowParametersFormSchema, getCommonLoadFlowParametersFormSchema, mapLimitReductions, setLimitReductions, TabValues, } from './load-flow-parameters-utils'; -import { LoadFlowParametersInfos } from './load-flow-parameters-type'; +import { LoadFlowParametersInfos, ParameterValue } from './load-flow-parameters-type'; import { + ADVANCED_PARAMETERS, COMMON_PARAMETERS, PROVIDER, SPECIFIC_PARAMETERS, @@ -43,6 +45,7 @@ import { setSpecificParameters, } from '../common/utils'; import { snackWithFallback } from '../../../utils/error'; +import { advancedParams } from './load-flow-advanced-parameters'; export interface UseLoadFlowParametersFormReturn { formMethods: UseFormReturn; @@ -98,19 +101,25 @@ export const useLoadFlowParametersForm = ( [PROVIDER]: yup.string().required(), [PARAM_LIMIT_REDUCTION]: yup.number().nullable(), ...getCommonLoadFlowParametersFormSchema().fields, + ...getAdvancedLoadFlowParametersFormSchema().fields, ...getLimitReductionsFormSchema(limitReductionNumber).fields, ...getSpecificParametersFormSchema(specificParametersDescriptionForProvider).fields, }) .concat(getNameElementEditorSchema(name)); }, [name, limitReductionNumber, specificParametersDescriptionForProvider]); + const { advancedParameters, commonParameters } = useMemo(() => splitCommonParameters(params?.commonParameters), [params?.commonParameters]); + const formMethods = useForm({ defaultValues: { ...getNameElementEditorEmptyFormData(name, description), [PROVIDER]: params?.provider, [PARAM_LIMIT_REDUCTION]: null, [COMMON_PARAMETERS]: { - ...params?.commonParameters, + ...commonParameters, + }, + [ADVANCED_PARAMETERS]: { + ...advancedParameters }, [SPECIFIC_PARAMETERS]: { ...specificParametersDefaultValues, @@ -160,6 +169,7 @@ export const useLoadFlowParametersForm = ( commonParameters: { [VERSION_PARAMETER]: formData[COMMON_PARAMETERS][VERSION_PARAMETER], // PowSyBl requires that "version" appears first ...formData[COMMON_PARAMETERS], + ...formData[ADVANCED_PARAMETERS] }, specificParametersPerProvider: specificParametersDefaultValues ? { @@ -176,16 +186,52 @@ export const useLoadFlowParametersForm = ( [specificParametersDefaultValues, toLimitReductions] ); + function splitCommonParameters(commonParameters?: Record): { + advancedParameters: Record; + commonParameters: Record; + } { + if(!commonParameters) { + return { + advancedParameters:{}, + commonParameters: {} + } + } + const advancedParamNames = new Set(advancedParams.map((param) => param.name)); + + return Object.entries(commonParameters).reduce( + (acc, [key, value]) => { + if (advancedParamNames.has(key)) { + acc.advancedParameters[key] = value; + } else { + acc.commonParameters[key] = value; + } + + return acc; + }, + { + advancedParameters: {}, + commonParameters: {}, + } as { + advancedParameters: Record; + commonParameters: Record; + } + ); + } + const toLoadFlowFormValues = useCallback( (_params: LoadFlowParametersInfos) => { const specificParamsListForCurrentProvider = _params.specificParametersPerProvider[_params.provider]; const specificParametersForLoadedProvider = specificParamsDescription?.[_params.provider] ?? []; + const { advancedParameters, commonParameters } = splitCommonParameters(_params.commonParameters); return { [PROVIDER]: _params.provider, [PARAM_LIMIT_REDUCTION]: _params.limitReduction, [COMMON_PARAMETERS]: { - ..._params.commonParameters, + ...commonParameters, + }, + [ADVANCED_PARAMETERS]: { + ...advancedParameters }, [SPECIFIC_PARAMETERS]: { ...formatSpecificParameters( @@ -214,15 +260,19 @@ export const useLoadFlowParametersForm = ( const onValidationError = useCallback( (errors: FieldErrors) => { const tabsInError = []; + console.log("ERRORS", errors); if (errors?.[LIMIT_REDUCTIONS_FORM] && TabValues.LIMIT_REDUCTIONS !== selectedTab) { tabsInError.push(TabValues.LIMIT_REDUCTIONS); } - if ( - (errors?.[SPECIFIC_PARAMETERS] || errors?.[COMMON_PARAMETERS] || errors?.[PROVIDER]) && - TabValues.GENERAL !== selectedTab - ) { + if (errors?.[COMMON_PARAMETERS] && TabValues.GENERAL !== selectedTab) { tabsInError.push(TabValues.GENERAL); } + if (errors?.[SPECIFIC_PARAMETERS] && TabValues.PROVIDER_SPECIFIC !== selectedTab) { + tabsInError.push(TabValues.PROVIDER_SPECIFIC); + } + if (errors?.[ADVANCED_PARAMETERS] && TabValues.ADVANCED !== selectedTab) { + tabsInError.push(TabValues.ADVANCED); + } setTabIndexesWithError(tabsInError); }, [selectedTab] diff --git a/src/translations/en/parameters.ts b/src/translations/en/parameters.ts index 76001a948..e98b4f777 100644 --- a/src/translations/en/parameters.ts +++ b/src/translations/en/parameters.ts @@ -16,8 +16,7 @@ export const parametersEn = { descLfDcValues: 'DC Values', resetToDefault: 'Reset All', resetParamsConfirmation: 'Do you really want to reset these parameters ?', - showAdvancedParameters: 'Advanced settings', - showSpecificParameters: 'Specific settings', + ProviderSpecific: 'Provider specific', save: 'Save', saveParameters: 'Save parameters', 'settings.button.chooseSettings': 'Choose parameters', diff --git a/src/translations/fr/parameters.ts b/src/translations/fr/parameters.ts index 73ce7853e..09f94301a 100644 --- a/src/translations/fr/parameters.ts +++ b/src/translations/fr/parameters.ts @@ -17,8 +17,7 @@ export const parametersFr = { descLfDcValues: 'DC', resetToDefault: 'Tout réinitialiser ', resetParamsConfirmation: 'Souhaitez vous réellement réinitialiser ces paramètres ?', - showAdvancedParameters: 'Paramètres avancés', - showSpecificParameters: 'Paramètres spécifiques', + ProviderSpecific: 'Spécifique au simulateur', save: 'Enregistrer', saveParameters: 'Enregistrer des paramètres', 'settings.button.chooseSettings': 'Sélectionner', From 3c8a238f2263968a50e75c86eb8ce4e6504e36c1 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Fri, 10 Jul 2026 13:31:14 +0200 Subject: [PATCH 2/5] last changes Signed-off-by: LE SAULNIER Kevin --- .../parameters/common/parameter-field.tsx | 23 ++++++++++++++----- .../loadflow/load-flow-general-parameters.tsx | 1 + src/translations/en/parameters.ts | 3 ++- src/translations/fr/parameters.ts | 3 ++- src/utils/types/parameters.type.ts | 1 + 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/features/parameters/common/parameter-field.tsx b/src/features/parameters/common/parameter-field.tsx index dbe03bd00..194368c90 100644 --- a/src/features/parameters/common/parameter-field.tsx +++ b/src/features/parameters/common/parameter-field.tsx @@ -21,18 +21,20 @@ import { TextInput, } from '../../../components/ui'; import { LineSeparator } from './index'; +import { mergeSx } from '../../../utils'; interface ParameterFieldProps { id: string; name: string; type: string; label?: string; + inputLabel?: string; description?: string; possibleValues?: { id: string; label: string }[] | string[]; sx?: SxProps; } -function ParameterField({ id, name, type, label, description, possibleValues, sx }: Readonly) { +function ParameterField({ id, name, type, label, inputLabel, description, possibleValues, sx }: Readonly) { const renderField = () => { switch (type) { case ParameterType.STRING: @@ -42,7 +44,7 @@ function ParameterField({ id, name, type, label, description, possibleValues, sx options={possibleValues} size="small" data-testid={`${id}.${name}`} - sx={sx} + sx={mergeSx(sx, {overflow: "hidden"})} /> ) : ( @@ -50,7 +52,13 @@ function ParameterField({ id, name, type, label, description, possibleValues, sx case ParameterType.BOOLEAN: return ; case ParameterType.COUNTRIES: - return ; + return ( + + ); case ParameterType.DOUBLE: return ; case ParameterType.STRING_LIST: @@ -58,7 +66,7 @@ function ParameterField({ id, name, type, label, description, possibleValues, sx - + {label ? : name} - + {renderField()} diff --git a/src/features/parameters/loadflow/load-flow-general-parameters.tsx b/src/features/parameters/loadflow/load-flow-general-parameters.tsx index 7945be651..29054228e 100644 --- a/src/features/parameters/loadflow/load-flow-general-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-general-parameters.tsx @@ -43,6 +43,7 @@ const basicParams: SpecificParameterInfos[] = [ { name: COUNTRIES_TO_BALANCE, type: ParameterType.COUNTRIES, + inputLabel: "inputLabelLfCountriesToBalance", label: 'descLfCountriesToBalance', }, { diff --git a/src/translations/en/parameters.ts b/src/translations/en/parameters.ts index e98b4f777..a1d4ae80e 100644 --- a/src/translations/en/parameters.ts +++ b/src/translations/en/parameters.ts @@ -49,7 +49,8 @@ export const parametersEn = { descLfBalanceTypeConformLoad: 'conform load', descLfCountries: 'Countries', descLfAllCountries: 'All countries', - descLfCountriesToBalance: 'Countries participating in balancing', + descLfCountriesToBalance: 'Balancing countries', + inputLabelLfCountriesToBalance: 'Countries participating in balancing', editParameters: 'Edit parameters', RealPercentage: 'This value must be between 0 and 1', diff --git a/src/translations/fr/parameters.ts b/src/translations/fr/parameters.ts index 09f94301a..650e3ca62 100644 --- a/src/translations/fr/parameters.ts +++ b/src/translations/fr/parameters.ts @@ -51,7 +51,8 @@ export const parametersFr = { descLfBalanceTypeConformLoad: 'part variable de la consommation', descLfCountries: 'Pays', descLfAllCountries: 'Tous les pays', - descLfCountriesToBalance: 'Pays participant à la compensation', + descLfCountriesToBalance: 'Pays réglant', + inputLabelLfCountriesToBalance: 'Pays participant à la compensation', editParameters: 'Éditer les paramètres', RealPercentage: 'Cette valeur doit être comprise entre 0 et 1', diff --git a/src/utils/types/parameters.type.ts b/src/utils/types/parameters.type.ts index d3b38cb4d..57ca05a88 100644 --- a/src/utils/types/parameters.type.ts +++ b/src/utils/types/parameters.type.ts @@ -35,6 +35,7 @@ export type SpecificParameterInfos = { categoryKey?: string; description?: string; label?: string; + inputLabel?: string; }; export type SpecificParametersDescription = Record; From dd31d3da68c245fe32d5f9033014a160b6d8dd64 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Fri, 10 Jul 2026 13:34:58 +0200 Subject: [PATCH 3/5] fix copyright date Signed-off-by: LE SAULNIER Kevin --- .../parameters/loadflow/load-flow-advanced-parameters.tsx | 2 +- .../loadflow/load-flow-provider-specific-parameters.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx index 6307780bd..cd02b513d 100644 --- a/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024, RTE (http://www.rte-france.com) + * Copyright (c) 2026, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx index c47660625..bc1fef7c7 100644 --- a/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2024, RTE (http://www.rte-france.com) + * Copyright (c) 2026, RTE (http://www.rte-france.com) * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. From f85761a2213e0fbd8b6345454fe3796f291513d1 Mon Sep 17 00:00:00 2001 From: LE SAULNIER Kevin Date: Fri, 10 Jul 2026 15:57:08 +0200 Subject: [PATCH 4/5] fix eslint Signed-off-by: LE SAULNIER Kevin --- .../parameters/common/parameter-field.tsx | 13 +++- .../load-flow-advanced-parameters.tsx | 2 +- .../loadflow/load-flow-general-parameters.tsx | 2 +- .../loadflow/load-flow-parameters-utils.ts | 34 +++++++++++ ...load-flow-provider-specific-parameters.tsx | 2 +- .../loadflow/use-load-flow-parameters-form.ts | 61 ++++++------------- .../short-circuit-parameters-utils.ts | 3 +- .../security-analysis.type.ts | 5 +- 8 files changed, 71 insertions(+), 51 deletions(-) diff --git a/src/features/parameters/common/parameter-field.tsx b/src/features/parameters/common/parameter-field.tsx index 194368c90..b04757ff5 100644 --- a/src/features/parameters/common/parameter-field.tsx +++ b/src/features/parameters/common/parameter-field.tsx @@ -34,7 +34,16 @@ interface ParameterFieldProps { sx?: SxProps; } -function ParameterField({ id, name, type, label, inputLabel, description, possibleValues, sx }: Readonly) { +function ParameterField({ + id, + name, + type, + label, + inputLabel, + description, + possibleValues, + sx, +}: Readonly) { const renderField = () => { switch (type) { case ParameterType.STRING: @@ -44,7 +53,7 @@ function ParameterField({ id, name, type, label, inputLabel, description, possib options={possibleValues} size="small" data-testid={`${id}.${name}`} - sx={mergeSx(sx, {overflow: "hidden"})} + sx={mergeSx(sx, { overflow: 'hidden' })} /> ) : ( diff --git a/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx index cd02b513d..ec4390361 100644 --- a/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-advanced-parameters.tsx @@ -19,7 +19,7 @@ import { WRITE_SLACK_BUS, } from './constants'; import { ParameterType, SpecificParameterInfos } from '../../../utils/types/parameters.type'; -import { ADVANCED_PARAMETERS, COMMON_PARAMETERS } from '../common'; +import { ADVANCED_PARAMETERS } from '../common'; export const advancedParams: SpecificParameterInfos[] = [ { diff --git a/src/features/parameters/loadflow/load-flow-general-parameters.tsx b/src/features/parameters/loadflow/load-flow-general-parameters.tsx index 29054228e..396c5ceed 100644 --- a/src/features/parameters/loadflow/load-flow-general-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-general-parameters.tsx @@ -43,7 +43,7 @@ const basicParams: SpecificParameterInfos[] = [ { name: COUNTRIES_TO_BALANCE, type: ParameterType.COUNTRIES, - inputLabel: "inputLabelLfCountriesToBalance", + inputLabel: 'inputLabelLfCountriesToBalance', label: 'descLfCountriesToBalance', }, { diff --git a/src/features/parameters/loadflow/load-flow-parameters-utils.ts b/src/features/parameters/loadflow/load-flow-parameters-utils.ts index c4b55d691..89086cbfe 100644 --- a/src/features/parameters/loadflow/load-flow-parameters-utils.ts +++ b/src/features/parameters/loadflow/load-flow-parameters-utils.ts @@ -36,6 +36,8 @@ import { VOLTAGE_INIT_MODE, WRITE_SLACK_BUS, } from './constants'; +import { ParameterValue } from './load-flow-parameters-type'; +import { advancedParams } from './load-flow-advanced-parameters'; export enum TabValues { GENERAL = 'General', @@ -124,3 +126,35 @@ export const mapLimitReductions = ( }); return vlLNewLimits; }; + +export function splitCommonParameters(commonParameters?: Record): { + advancedParameters: Record; + commonParameters: Record; +} { + if (!commonParameters) { + return { + advancedParameters: {}, + commonParameters: {}, + }; + } + const advancedParamNames = new Set(advancedParams.map((param) => param.name)); + + return Object.entries(commonParameters).reduce( + (acc, [key, value]) => { + if (advancedParamNames.has(key)) { + acc.advancedParameters[key] = value; + } else { + acc.commonParameters[key] = value; + } + + return acc; + }, + { + advancedParameters: {}, + commonParameters: {}, + } as { + advancedParameters: Record; + commonParameters: Record; + } + ); +} diff --git a/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx index bc1fef7c7..51f3157a6 100644 --- a/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx +++ b/src/features/parameters/loadflow/load-flow-provider-specific-parameters.tsx @@ -7,7 +7,7 @@ import { memo } from 'react'; import ParameterField from '../common/parameter-field'; -import { SpecificParameterInfos } from '../../../utils/types/parameters.type'; +import { SpecificParameterInfos } from '../../../utils'; import { SPECIFIC_PARAMETERS } from '../common'; interface LoadFlowProviderSpecificParametersProps { diff --git a/src/features/parameters/loadflow/use-load-flow-parameters-form.ts b/src/features/parameters/loadflow/use-load-flow-parameters-form.ts index b87d1ce45..fe4cee9a2 100644 --- a/src/features/parameters/loadflow/use-load-flow-parameters-form.ts +++ b/src/features/parameters/loadflow/use-load-flow-parameters-form.ts @@ -15,9 +15,10 @@ import { getCommonLoadFlowParametersFormSchema, mapLimitReductions, setLimitReductions, + splitCommonParameters, TabValues, } from './load-flow-parameters-utils'; -import { LoadFlowParametersInfos, ParameterValue } from './load-flow-parameters-type'; +import { LoadFlowParametersInfos } from './load-flow-parameters-type'; import { ADVANCED_PARAMETERS, COMMON_PARAMETERS, @@ -39,13 +40,12 @@ import { getNameElementEditorEmptyFormData, getNameElementEditorSchema } from '. import { useSnackMessage } from '../../../hooks'; import { formatSpecificParameters, + getAllSpecificParametersValues, getDefaultSpecificParamsValues, getSpecificParametersFormSchema, - getAllSpecificParametersValues, setSpecificParameters, } from '../common/utils'; import { snackWithFallback } from '../../../utils/error'; -import { advancedParams } from './load-flow-advanced-parameters'; export interface UseLoadFlowParametersFormReturn { formMethods: UseFormReturn; @@ -75,7 +75,6 @@ export const useLoadFlowParametersForm = ( ): UseLoadFlowParametersFormReturn => { const { providers, params, updateParameters, specificParamsDescription, defaultLimitReductions } = parametersBackend; - const [selectedTab, setSelectedTab] = useState(TabValues.GENERAL); const [limitReductionNumber, setLimitReductionNumber] = useState(0); const [tabIndexesWithError, setTabIndexesWithError] = useState([]); @@ -85,6 +84,7 @@ export const useLoadFlowParametersForm = ( return params?.provider && specificParamsDescription ? specificParamsDescription[params.provider] : []; }); const { snackError } = useSnackMessage(); + const previousWatchProviderRef = useRef(undefined); const handleTabChange = useCallback((event: SyntheticEvent, newValue: TabValues) => { @@ -108,7 +108,10 @@ export const useLoadFlowParametersForm = ( .concat(getNameElementEditorSchema(name)); }, [name, limitReductionNumber, specificParametersDescriptionForProvider]); - const { advancedParameters, commonParameters } = useMemo(() => splitCommonParameters(params?.commonParameters), [params?.commonParameters]); + const { advancedParameters, commonParameters } = useMemo( + () => splitCommonParameters(params?.commonParameters), + [params?.commonParameters] + ); const formMethods = useForm({ defaultValues: { @@ -119,7 +122,7 @@ export const useLoadFlowParametersForm = ( ...commonParameters, }, [ADVANCED_PARAMETERS]: { - ...advancedParameters + ...advancedParameters, }, [SPECIFIC_PARAMETERS]: { ...specificParametersDefaultValues, @@ -128,8 +131,8 @@ export const useLoadFlowParametersForm = ( }, resolver: yupResolver(formSchema as unknown as yup.ObjectSchema), }); - const { watch, reset } = formMethods; + const watchProvider = watch(PROVIDER); useEffect(() => { @@ -169,7 +172,7 @@ export const useLoadFlowParametersForm = ( commonParameters: { [VERSION_PARAMETER]: formData[COMMON_PARAMETERS][VERSION_PARAMETER], // PowSyBl requires that "version" appears first ...formData[COMMON_PARAMETERS], - ...formData[ADVANCED_PARAMETERS] + ...formData[ADVANCED_PARAMETERS], }, specificParametersPerProvider: specificParametersDefaultValues ? { @@ -186,52 +189,22 @@ export const useLoadFlowParametersForm = ( [specificParametersDefaultValues, toLimitReductions] ); - function splitCommonParameters(commonParameters?: Record): { - advancedParameters: Record; - commonParameters: Record; - } { - if(!commonParameters) { - return { - advancedParameters:{}, - commonParameters: {} - } - } - const advancedParamNames = new Set(advancedParams.map((param) => param.name)); - - return Object.entries(commonParameters).reduce( - (acc, [key, value]) => { - if (advancedParamNames.has(key)) { - acc.advancedParameters[key] = value; - } else { - acc.commonParameters[key] = value; - } - - return acc; - }, - { - advancedParameters: {}, - commonParameters: {}, - } as { - advancedParameters: Record; - commonParameters: Record; - } - ); - } - const toLoadFlowFormValues = useCallback( (_params: LoadFlowParametersInfos) => { const specificParamsListForCurrentProvider = _params.specificParametersPerProvider[_params.provider]; const specificParametersForLoadedProvider = specificParamsDescription?.[_params.provider] ?? []; - const { advancedParameters, commonParameters } = splitCommonParameters(_params.commonParameters); + const { advancedParameters: advancedParams, commonParameters: commonParams } = splitCommonParameters( + _params.commonParameters + ); return { [PROVIDER]: _params.provider, [PARAM_LIMIT_REDUCTION]: _params.limitReduction, [COMMON_PARAMETERS]: { - ...commonParameters, + ...commonParams, }, [ADVANCED_PARAMETERS]: { - ...advancedParameters + ...advancedParams, }, [SPECIFIC_PARAMETERS]: { ...formatSpecificParameters( @@ -260,7 +233,7 @@ export const useLoadFlowParametersForm = ( const onValidationError = useCallback( (errors: FieldErrors) => { const tabsInError = []; - console.log("ERRORS", errors); + console.log('ERRORS', errors); if (errors?.[LIMIT_REDUCTIONS_FORM] && TabValues.LIMIT_REDUCTIONS !== selectedTab) { tabsInError.push(TabValues.LIMIT_REDUCTIONS); } diff --git a/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts b/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts index e281b5e3c..7989d8b26 100644 --- a/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts +++ b/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts @@ -146,7 +146,8 @@ export const getSpecificShortCircuitParametersFormSchema = ( // try to extract existing SPECIFIC_PARAMETERS fields from defaultSchema (if present) const existingSpecificSchema = (defaultSchema as any).fields?.[SPECIFIC_PARAMETERS] as - yup.ObjectSchema | undefined; + | yup.ObjectSchema + | undefined; const existingSpecificFields = existingSpecificSchema ? (existingSpecificSchema as any).fields || {} : {}; const mergedSpecificShape: { [key: string]: yup.AnySchema } = { diff --git a/src/features/results/securityanalysis/security-analysis.type.ts b/src/features/results/securityanalysis/security-analysis.type.ts index bfb76f715..693e7d794 100644 --- a/src/features/results/securityanalysis/security-analysis.type.ts +++ b/src/features/results/securityanalysis/security-analysis.type.ts @@ -101,7 +101,10 @@ export interface ConnectivityResult { export type SecurityAnalysisNmkResult = { content?: ( - ContingenciesFromConstraintItem[] | ConstraintsFromContingencyItem[] | CutOffPowerFromConstraintsItem[] | null + | ContingenciesFromConstraintItem[] + | ConstraintsFromContingencyItem[] + | CutOffPowerFromConstraintsItem[] + | null )[]; [key: string]: unknown; }; From dfe12f2b648f3df5ec3eeb6e8cedfe644a2025e0 Mon Sep 17 00:00:00 2001 From: Radouane Khouadri Date: Thu, 16 Jul 2026 10:42:58 +0200 Subject: [PATCH 5/5] fix reviews --- src/features/parameters/common/parameter-field.tsx | 8 ++++---- .../short-circuit/short-circuit-parameters-utils.ts | 3 +-- .../results/securityanalysis/security-analysis.type.ts | 5 +---- src/translations/en/parameters.ts | 2 ++ src/translations/fr/parameters.ts | 2 ++ 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/features/parameters/common/parameter-field.tsx b/src/features/parameters/common/parameter-field.tsx index b04757ff5..0b9f267bc 100644 --- a/src/features/parameters/common/parameter-field.tsx +++ b/src/features/parameters/common/parameter-field.tsx @@ -102,19 +102,19 @@ function ParameterField({ } }; - const LABEL_COLUMN_COUNT = type !== ParameterType.COUNTRIES ? 8 : 3; - const INPUT_COLUMN_COUNT = 12 - LABEL_COLUMN_COUNT; + const LABEL_GRID_SIZE = type !== ParameterType.COUNTRIES ? 8 : 3; + const INPUT_GRID_SIZE = 12 - LABEL_GRID_SIZE; return ( - + {label ? : name} - + {renderField()} diff --git a/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts b/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts index 7989d8b26..e281b5e3c 100644 --- a/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts +++ b/src/features/parameters/short-circuit/short-circuit-parameters-utils.ts @@ -146,8 +146,7 @@ export const getSpecificShortCircuitParametersFormSchema = ( // try to extract existing SPECIFIC_PARAMETERS fields from defaultSchema (if present) const existingSpecificSchema = (defaultSchema as any).fields?.[SPECIFIC_PARAMETERS] as - | yup.ObjectSchema - | undefined; + yup.ObjectSchema | undefined; const existingSpecificFields = existingSpecificSchema ? (existingSpecificSchema as any).fields || {} : {}; const mergedSpecificShape: { [key: string]: yup.AnySchema } = { diff --git a/src/features/results/securityanalysis/security-analysis.type.ts b/src/features/results/securityanalysis/security-analysis.type.ts index 693e7d794..bfb76f715 100644 --- a/src/features/results/securityanalysis/security-analysis.type.ts +++ b/src/features/results/securityanalysis/security-analysis.type.ts @@ -101,10 +101,7 @@ export interface ConnectivityResult { export type SecurityAnalysisNmkResult = { content?: ( - | ContingenciesFromConstraintItem[] - | ConstraintsFromContingencyItem[] - | CutOffPowerFromConstraintsItem[] - | null + ContingenciesFromConstraintItem[] | ConstraintsFromContingencyItem[] | CutOffPowerFromConstraintsItem[] | null )[]; [key: string]: unknown; }; diff --git a/src/translations/en/parameters.ts b/src/translations/en/parameters.ts index 26b40e7d2..a30990ae6 100644 --- a/src/translations/en/parameters.ts +++ b/src/translations/en/parameters.ts @@ -67,6 +67,8 @@ export const parametersEn = { leftOpenBracket: '(', rightOpenBracket: ')', + Advanced: 'Advanced', + Provider: 'Provider', LimitReduction: 'Limit reduction', Default: 'Default', diff --git a/src/translations/fr/parameters.ts b/src/translations/fr/parameters.ts index 88c1a97a8..749f6ddab 100644 --- a/src/translations/fr/parameters.ts +++ b/src/translations/fr/parameters.ts @@ -69,6 +69,8 @@ export const parametersFr = { leftOpenBracket: ']', rightOpenBracket: '[', + Advanced: 'Avancés', + Provider: 'Simulateur', LimitReduction: 'Abattement des seuils', Default: 'Défaut',