@gridsuite/commons-ui 0.169.0 → 0.171.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/components/index.js +7 -0
  2. package/dist/components/inputs/reactHookForm/selectInputs/CountriesInput.js +13 -10
  3. package/dist/components/network-modifications/common/properties/propertyUtils.d.ts +1 -1
  4. package/dist/components/network-modifications/common/properties/propertyUtils.js +2 -2
  5. package/dist/components/network-modifications/index.js +7 -0
  6. package/dist/components/network-modifications/substation/index.d.ts +1 -0
  7. package/dist/components/network-modifications/substation/index.js +8 -1
  8. package/dist/components/network-modifications/substation/modification/SubstationModificationForm.d.ts +6 -0
  9. package/dist/components/network-modifications/substation/modification/SubstationModificationForm.js +89 -0
  10. package/dist/components/network-modifications/substation/modification/index.d.ts +9 -0
  11. package/dist/components/network-modifications/substation/modification/index.js +9 -0
  12. package/dist/components/network-modifications/substation/modification/substationModification.types.d.ts +17 -0
  13. package/dist/components/network-modifications/substation/modification/substationModification.types.js +1 -0
  14. package/dist/components/network-modifications/substation/modification/substationModification.utils.d.ts +24 -0
  15. package/dist/components/network-modifications/substation/modification/substationModification.utils.js +42 -0
  16. package/dist/components/parameters/dynamic-margin-calculation/dynamic-margin-calculation-inline.js +5 -5
  17. package/dist/components/parameters/loadflow/load-flow-parameters-dialog.js +8 -15
  18. package/dist/components/parameters/loadflow/load-flow-parameters-form.js +2 -2
  19. package/dist/components/parameters/loadflow/load-flow-parameters-inline.js +2 -4
  20. package/dist/components/parameters/loadflow/use-load-flow-parameters-form.d.ts +2 -3
  21. package/dist/components/parameters/loadflow/use-load-flow-parameters-form.js +33 -43
  22. package/dist/components/parameters/security-analysis/security-analysis-parameters-dialog.js +7 -9
  23. package/dist/components/parameters/security-analysis/security-analysis-parameters-form.js +1 -1
  24. package/dist/components/parameters/security-analysis/security-analysis-parameters-inline.js +2 -3
  25. package/dist/components/parameters/security-analysis/use-security-analysis-parameters-form.d.ts +1 -3
  26. package/dist/components/parameters/security-analysis/use-security-analysis-parameters-form.js +13 -11
  27. package/dist/components/parameters/sensi/sensitivity-analysis-parameters-dialog.js +6 -7
  28. package/dist/components/parameters/sensi/use-sensitivity-analysis-parameters.js +1 -1
  29. package/dist/components/parameters/short-circuit/short-circuit-parameters-dialog.js +6 -14
  30. package/dist/components/parameters/short-circuit/short-circuit-parameters-inline.js +1 -1
  31. package/dist/components/parameters/short-circuit/use-short-circuit-parameters-form.d.ts +0 -1
  32. package/dist/components/parameters/short-circuit/use-short-circuit-parameters-form.js +6 -6
  33. package/dist/hooks/use-parameters-backend.d.ts +2 -3
  34. package/dist/hooks/use-parameters-backend.js +33 -110
  35. package/dist/index.js +13 -6
  36. package/dist/services/index.js +2 -5
  37. package/dist/services/loadflow.d.ts +0 -1
  38. package/dist/services/loadflow.js +1 -8
  39. package/dist/services/security-analysis.d.ts +0 -2
  40. package/dist/services/security-analysis.js +2 -23
  41. package/dist/services/sensitivity-analysis.d.ts +0 -1
  42. package/dist/services/sensitivity-analysis.js +1 -8
  43. package/dist/translations/en/businessErrorsEn.d.ts +1 -0
  44. package/dist/translations/en/businessErrorsEn.js +1 -0
  45. package/dist/translations/en/networkModificationsEn.d.ts +2 -0
  46. package/dist/translations/en/networkModificationsEn.js +2 -0
  47. package/dist/translations/en/parameters.d.ts +0 -7
  48. package/dist/translations/en/parameters.js +0 -7
  49. package/dist/translations/fr/businessErrorsFr.d.ts +1 -0
  50. package/dist/translations/fr/businessErrorsFr.js +1 -0
  51. package/dist/translations/fr/networkModificationsFr.d.ts +2 -0
  52. package/dist/translations/fr/networkModificationsFr.js +2 -0
  53. package/dist/translations/fr/parameters.d.ts +0 -8
  54. package/dist/translations/fr/parameters.js +0 -8
  55. package/dist/utils/conversionUtils.d.ts +2 -0
  56. package/dist/utils/conversionUtils.js +6 -0
  57. package/dist/utils/index.js +4 -1
  58. package/dist/utils/types/index.d.ts +1 -0
  59. package/dist/utils/types/index.js +2 -0
  60. package/dist/utils/types/network-modification-types.d.ts +14 -0
  61. package/dist/utils/types/network-modification-types.js +8 -0
  62. package/dist/utils/types/parameters.type.d.ts +16 -13
  63. package/package.json +1 -1
@@ -186,6 +186,8 @@ import { copyEquipmentPropertiesForCreation, createPropertyModification, creatio
186
186
  import { filledTextField, italicFontTextField, standardTextField } from "./network-modifications/common/form.utils.js";
187
187
  import { SubstationCreationForm } from "./network-modifications/substation/creation/SubstationCreationForm.js";
188
188
  import { substationCreationDtoToForm, substationCreationEmptyFormData, substationCreationFormSchema, substationCreationFormToDto } from "./network-modifications/substation/creation/substationCreation.utils.js";
189
+ import { SubstationModificationForm } from "./network-modifications/substation/modification/SubstationModificationForm.js";
190
+ import { substationModificationDtoToForm, substationModificationEmptyFormData, substationModificationFormSchema, substationModificationFormToDto } from "./network-modifications/substation/modification/substationModification.utils.js";
189
191
  export {
190
192
  ACCURACY,
191
193
  ACTIVE,
@@ -485,6 +487,7 @@ export {
485
487
  SubmitButton,
486
488
  SubstationCreationForm,
487
489
  SubstationLayout,
490
+ SubstationModificationForm,
488
491
  SwitchInput,
489
492
  SwitchWithLabel,
490
493
  TAB_INFO,
@@ -583,6 +586,10 @@ export {
583
586
  substationCreationEmptyFormData,
584
587
  substationCreationFormSchema,
585
588
  substationCreationFormToDto,
589
+ substationModificationDtoToForm,
590
+ substationModificationEmptyFormData,
591
+ substationModificationFormSchema,
592
+ substationModificationFormToDto,
586
593
  testQuery,
587
594
  toFloatOrNullValue,
588
595
  toFormValuesLimitReductions,
@@ -26,16 +26,19 @@ function CountriesInput({ name, label, dataTestId }) {
26
26
  getOptionLabel: translateOption,
27
27
  fullWidth: true,
28
28
  multiple: true,
29
- renderTags: (val, getTagsProps) => val.map((code, index) => /* @__PURE__ */ jsx(
30
- Chip,
31
- {
32
- "data-testid": `${dataTestId}.${code}`,
33
- size: "small",
34
- label: translate(code),
35
- ...getTagsProps({ index })
36
- },
37
- code
38
- ))
29
+ renderTags: (val, getTagsProps) => val.map((code, index) => {
30
+ const { key, ...tagProps } = getTagsProps({ index });
31
+ return /* @__PURE__ */ jsx(
32
+ Chip,
33
+ {
34
+ "data-testid": `${dataTestId}.${code}`,
35
+ size: "small",
36
+ label: translate(code),
37
+ ...tagProps
38
+ },
39
+ key ?? code
40
+ );
41
+ })
39
42
  }
40
43
  );
41
44
  }
@@ -8,7 +8,7 @@ export declare const emptyProperties: Properties;
8
8
  export declare const createPropertyModification: (name: string, value: string | null) => Property;
9
9
  export declare const initializedProperty: () => Property;
10
10
  export declare const getFilledPropertiesFromModification: (properties: Property[] | undefined | null) => FilledProperty[];
11
- export declare const getPropertiesFromModification: (properties: Property[] | undefined | null) => Properties;
11
+ export declare const getPropertiesFromModification: (properties: Property[] | undefined | null, includePreviousValue?: boolean) => Properties;
12
12
  export declare const copyEquipmentPropertiesForCreation: (equipmentInfos: EquipmentWithProperties) => Properties;
13
13
  export declare const mergeModificationAndEquipmentProperties: (modificationProperties: Property[], equipment: EquipmentWithProperties) => Property[];
14
14
  export declare function getConcatenatedProperties(equipment: EquipmentWithProperties, getValues: (name: string) => any, id?: string): any;
@@ -41,13 +41,13 @@ const getFilledPropertiesFromModification = (properties) => {
41
41
  };
42
42
  }) ?? [];
43
43
  };
44
- const getPropertiesFromModification = (properties) => {
44
+ const getPropertiesFromModification = (properties, includePreviousValue = true) => {
45
45
  return {
46
46
  [FieldConstants.ADDITIONAL_PROPERTIES]: properties ? properties.map((p) => {
47
47
  return {
48
48
  [FieldConstants.NAME]: p[FieldConstants.NAME],
49
49
  [FieldConstants.VALUE]: p[FieldConstants.VALUE],
50
- [FieldConstants.PREVIOUS_VALUE]: p[FieldConstants.PREVIOUS_VALUE],
50
+ [FieldConstants.PREVIOUS_VALUE]: includePreviousValue ? p[FieldConstants.PREVIOUS_VALUE] : void 0,
51
51
  [FieldConstants.ADDED]: p[FieldConstants.ADDED],
52
52
  [FieldConstants.DELETION_MARK]: p[FieldConstants.DELETION_MARK]
53
53
  };
@@ -4,10 +4,13 @@ import { copyEquipmentPropertiesForCreation, createPropertyModification, creatio
4
4
  import { filledTextField, italicFontTextField, standardTextField } from "./common/form.utils.js";
5
5
  import { SubstationCreationForm } from "./substation/creation/SubstationCreationForm.js";
6
6
  import { substationCreationDtoToForm, substationCreationEmptyFormData, substationCreationFormSchema, substationCreationFormToDto } from "./substation/creation/substationCreation.utils.js";
7
+ import { SubstationModificationForm } from "./substation/modification/SubstationModificationForm.js";
8
+ import { substationModificationDtoToForm, substationModificationEmptyFormData, substationModificationFormSchema, substationModificationFormToDto } from "./substation/modification/substationModification.utils.js";
7
9
  export {
8
10
  PropertiesForm,
9
11
  PropertyForm,
10
12
  SubstationCreationForm,
13
+ SubstationModificationForm,
11
14
  copyEquipmentPropertiesForCreation,
12
15
  createPropertyModification,
13
16
  creationPropertiesSchema,
@@ -27,5 +30,9 @@ export {
27
30
  substationCreationEmptyFormData,
28
31
  substationCreationFormSchema,
29
32
  substationCreationFormToDto,
33
+ substationModificationDtoToForm,
34
+ substationModificationEmptyFormData,
35
+ substationModificationFormSchema,
36
+ substationModificationFormToDto,
30
37
  toModificationProperties
31
38
  };
@@ -5,3 +5,4 @@
5
5
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
6
  */
7
7
  export * from './creation';
8
+ export * from './modification';
@@ -1,9 +1,16 @@
1
1
  import { SubstationCreationForm } from "./creation/SubstationCreationForm.js";
2
2
  import { substationCreationDtoToForm, substationCreationEmptyFormData, substationCreationFormSchema, substationCreationFormToDto } from "./creation/substationCreation.utils.js";
3
+ import { SubstationModificationForm } from "./modification/SubstationModificationForm.js";
4
+ import { substationModificationDtoToForm, substationModificationEmptyFormData, substationModificationFormSchema, substationModificationFormToDto } from "./modification/substationModification.utils.js";
3
5
  export {
4
6
  SubstationCreationForm,
7
+ SubstationModificationForm,
5
8
  substationCreationDtoToForm,
6
9
  substationCreationEmptyFormData,
7
10
  substationCreationFormSchema,
8
- substationCreationFormToDto
11
+ substationCreationFormToDto,
12
+ substationModificationDtoToForm,
13
+ substationModificationEmptyFormData,
14
+ substationModificationFormSchema,
15
+ substationModificationFormToDto
9
16
  };
@@ -0,0 +1,6 @@
1
+ import { SubstationModificationInfos } from './substationModification.types';
2
+ interface SubstationModificationFormProps {
3
+ substationToModify?: SubstationModificationInfos | null;
4
+ }
5
+ export declare function SubstationModificationForm({ substationToModify }: Readonly<SubstationModificationFormProps>): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,89 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { TextField, Grid } from "@mui/material";
3
+ import { useIntl } from "react-intl";
4
+ import { useWatch } from "react-hook-form";
5
+ import GridItem from "../../../grid/grid-item.js";
6
+ import "../../../overflowableText/OverflowableText.js";
7
+ import { FieldConstants } from "../../../../utils/constants/fieldConstants.js";
8
+ import "../../../../utils/conversionUtils.js";
9
+ import "../../../../utils/types/equipmentType.js";
10
+ import "@mui/icons-material";
11
+ import "../../../../utils/yupConfig.js";
12
+ import "react";
13
+ import { useLocalizedCountries } from "../../../../hooks/useLocalizedCountries.js";
14
+ import "notistack";
15
+ import "../../../inputs/reactHookForm/provider/CustomFormProvider.js";
16
+ import "yup";
17
+ import "../../../treeViewFinder/TreeViewFinder.js";
18
+ import "../../../inputs/reactHookForm/agGridTable/BottomRightButtons.js";
19
+ import "../../../customAGGrid/customAggrid.js";
20
+ import "ag-grid-community";
21
+ import "react-papaparse";
22
+ import "react-csv-downloader";
23
+ import { TextInput } from "../../../inputs/reactHookForm/text/TextInput.js";
24
+ import "../../../inputs/reactHookForm/numbers/RangeInput.js";
25
+ import "@material-symbols/svg-400/outlined/left_panel_open.svg?react";
26
+ import "@material-symbols/svg-400/outlined/arrows_output.svg?react";
27
+ import "@material-symbols/svg-400/outlined/left_panel_close.svg?react";
28
+ import "@material-symbols/svg-400/outlined/add_notes.svg?react";
29
+ import "../../../dialogs/descriptionModificationDialog/DescriptionModificationDialog.js";
30
+ import { CountrySelectionInput } from "../../../inputs/reactHookForm/CountrySelectionInput.js";
31
+ import "@react-querybuilder/material";
32
+ import "../../../filter/expert/expertFilterConstants.js";
33
+ import "../../../inputs/reactQueryBuilder/CustomReactQueryBuilder.js";
34
+ import "uuid";
35
+ import "../../../inputs/reactQueryBuilder/PropertyValueEditor.js";
36
+ import "react-querybuilder";
37
+ import { PropertiesForm } from "../../common/properties/PropertiesForm.js";
38
+ import { filledTextField } from "../../common/form.utils.js";
39
+ import "../../common/properties/propertyUtils.js";
40
+ function SubstationModificationForm({ substationToModify }) {
41
+ const { locale } = useIntl();
42
+ const { translate } = useLocalizedCountries(locale);
43
+ const equipmentId = useWatch({ name: FieldConstants.EQUIPMENT_ID });
44
+ const substationIdField = /* @__PURE__ */ jsx(
45
+ TextField,
46
+ {
47
+ size: "small",
48
+ fullWidth: true,
49
+ label: "ID",
50
+ value: equipmentId ?? "",
51
+ InputProps: {
52
+ readOnly: true
53
+ },
54
+ disabled: true,
55
+ ...filledTextField
56
+ }
57
+ );
58
+ const substationNameField = /* @__PURE__ */ jsx(
59
+ TextInput,
60
+ {
61
+ name: FieldConstants.EQUIPMENT_NAME,
62
+ label: "Name",
63
+ formProps: filledTextField,
64
+ previousValue: substationToModify?.name,
65
+ clearable: true
66
+ }
67
+ );
68
+ const substationCountryField = /* @__PURE__ */ jsx(
69
+ CountrySelectionInput,
70
+ {
71
+ name: FieldConstants.COUNTRY,
72
+ label: "Country",
73
+ formProps: filledTextField,
74
+ size: "small",
75
+ previousValue: substationToModify?.country ? translate(substationToModify.country) : ""
76
+ }
77
+ );
78
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
79
+ /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
80
+ /* @__PURE__ */ jsx(GridItem, { size: 4, children: substationIdField }),
81
+ /* @__PURE__ */ jsx(GridItem, { size: 4, children: substationNameField }),
82
+ /* @__PURE__ */ jsx(GridItem, { size: 4, children: substationCountryField })
83
+ ] }),
84
+ /* @__PURE__ */ jsx(PropertiesForm, { networkElementType: "substation", isModification: true })
85
+ ] });
86
+ }
87
+ export {
88
+ SubstationModificationForm
89
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright (c) 2026, RTE (http://www.rte-france.com)
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+ export * from './SubstationModificationForm';
8
+ export * from './substationModification.types';
9
+ export * from './substationModification.utils';
@@ -0,0 +1,9 @@
1
+ import { SubstationModificationForm } from "./SubstationModificationForm.js";
2
+ import { substationModificationDtoToForm, substationModificationEmptyFormData, substationModificationFormSchema, substationModificationFormToDto } from "./substationModification.utils.js";
3
+ export {
4
+ SubstationModificationForm,
5
+ substationModificationDtoToForm,
6
+ substationModificationEmptyFormData,
7
+ substationModificationFormSchema,
8
+ substationModificationFormToDto
9
+ };
@@ -0,0 +1,17 @@
1
+ import { UUID } from 'node:crypto';
2
+ import { AttributeModification, ModificationType } from '../../../../utils';
3
+ import { Property } from '../../common';
4
+ export interface SubstationModificationInfos {
5
+ id: string;
6
+ name?: string;
7
+ country: string | null;
8
+ properties?: Record<string, string>;
9
+ }
10
+ export interface SubstationModificationDto {
11
+ uuid?: UUID;
12
+ equipmentId: string;
13
+ equipmentName?: AttributeModification<string> | null;
14
+ country: AttributeModification<string> | null;
15
+ properties?: Property[] | null;
16
+ type?: ModificationType;
17
+ }
@@ -0,0 +1,24 @@
1
+ import { default as yup } from '../../../../utils/yupConfig';
2
+ import { SubstationModificationDto } from './substationModification.types';
3
+ export declare const substationModificationFormSchema: yup.ObjectSchema<{
4
+ equipmentID: string;
5
+ equipmentName: string | null | undefined;
6
+ country: string | null | undefined;
7
+ } & {
8
+ AdditionalProperties: {
9
+ previousValue?: string | null | undefined;
10
+ value?: string | null | undefined;
11
+ added: NonNullable<boolean | undefined>;
12
+ deletionMark: NonNullable<boolean | undefined>;
13
+ name: string;
14
+ }[] | undefined;
15
+ }, yup.AnyObject, {
16
+ equipmentID: undefined;
17
+ equipmentName: undefined;
18
+ country: undefined;
19
+ AdditionalProperties: "";
20
+ }, "">;
21
+ export type SubstationModificationFormData = yup.InferType<typeof substationModificationFormSchema>;
22
+ export declare const substationModificationEmptyFormData: SubstationModificationFormData;
23
+ export declare const substationModificationFormToDto: (formData: SubstationModificationFormData) => SubstationModificationDto;
24
+ export declare const substationModificationDtoToForm: (substationDto: SubstationModificationDto, includePreviousValues?: boolean) => SubstationModificationFormData;
@@ -0,0 +1,42 @@
1
+ import "../../../../utils/yupConfig.js";
2
+ import { modificationPropertiesSchema, toModificationProperties, getPropertiesFromModification } from "../../common/properties/propertyUtils.js";
3
+ import { FieldConstants } from "../../../../utils/constants/fieldConstants.js";
4
+ import { toModificationOperation } from "../../../../utils/conversionUtils.js";
5
+ import "../../../../utils/types/equipmentType.js";
6
+ import { ModificationType } from "../../../../utils/types/modificationType.js";
7
+ import "react/jsx-runtime";
8
+ import "@mui/icons-material";
9
+ import { sanitizeString } from "../../../../utils/ts-utils.js";
10
+ import * as yup from "yup";
11
+ const substationModificationFormSchema = yup.object().shape({
12
+ [FieldConstants.EQUIPMENT_ID]: yup.string().required(),
13
+ [FieldConstants.EQUIPMENT_NAME]: yup.string().nullable(),
14
+ [FieldConstants.COUNTRY]: yup.string().nullable()
15
+ }).concat(modificationPropertiesSchema);
16
+ const substationModificationEmptyFormData = {
17
+ equipmentID: "",
18
+ equipmentName: "",
19
+ country: null,
20
+ AdditionalProperties: []
21
+ };
22
+ const substationModificationFormToDto = (formData) => ({
23
+ type: ModificationType.SUBSTATION_MODIFICATION,
24
+ equipmentId: formData.equipmentID,
25
+ equipmentName: toModificationOperation(sanitizeString(formData.equipmentName)),
26
+ country: toModificationOperation(formData.country ?? null),
27
+ properties: toModificationProperties(formData)
28
+ });
29
+ const substationModificationDtoToForm = (substationDto, includePreviousValues = true) => {
30
+ return {
31
+ equipmentID: substationDto.equipmentId,
32
+ equipmentName: substationDto.equipmentName?.value ?? "",
33
+ country: substationDto.country?.value ?? null,
34
+ ...getPropertiesFromModification(substationDto?.properties, includePreviousValues)
35
+ };
36
+ };
37
+ export {
38
+ substationModificationDtoToForm,
39
+ substationModificationEmptyFormData,
40
+ substationModificationFormSchema,
41
+ substationModificationFormToDto
42
+ };
@@ -50,7 +50,7 @@ function DynamicMarginCalculationInline({
50
50
  parametersBackend,
51
51
  setHaveDirtyFields
52
52
  }) {
53
- const [providers, , , , , params, , updateParams, resetParams, ,] = parametersBackend;
53
+ const { providers, params, updateParameters, resetParameters } = parametersBackend;
54
54
  const dynamicMarginCalculationMethods = useDynamicMarginCalculationParametersForm({
55
55
  providers,
56
56
  params,
@@ -71,14 +71,14 @@ function DynamicMarginCalculationInline({
71
71
  setOpenResetConfirmation(false);
72
72
  }, []);
73
73
  const handleReset = useCallback(() => {
74
- resetParams();
74
+ resetParameters();
75
75
  setOpenResetConfirmation(false);
76
- }, [resetParams]);
76
+ }, [resetParameters]);
77
77
  const onSubmit = useCallback(
78
78
  (formData) => {
79
- updateParams(toParamsInfos(formData));
79
+ updateParameters(toParamsInfos(formData));
80
80
  },
81
- [updateParams]
81
+ [updateParameters]
82
82
  );
83
83
  const handleLoadParameter = useCallback(
84
84
  (newParams) => {
@@ -8,7 +8,7 @@ import "../../../utils/types/equipmentType.js";
8
8
  import { LANG_ENGLISH } from "../../../utils/langs.js";
9
9
  import "@mui/icons-material";
10
10
  import "../../../utils/yupConfig.js";
11
- import { getLoadFlowDefaultLimitReductions, getLoadFlowSpecificParametersDescription, setLoadFlowParameters, fetchLoadFlowParameters, getDefaultLoadFlowProvider, getLoadFlowProviders } from "../../../services/loadflow.js";
11
+ import { getLoadFlowDefaultLimitReductions, getLoadFlowProviders, fetchLoadFlowParameters, setLoadFlowParameters, getLoadFlowSpecificParametersDescription } from "../../../services/loadflow.js";
12
12
  import "react";
13
13
  import "@mui/material";
14
14
  import "react-intl";
@@ -57,20 +57,13 @@ function LoadFlowParametersEditionDialog({
57
57
  language = LANG_ENGLISH,
58
58
  isDeveloperMode = false
59
59
  }) {
60
- const parametersBackend = useParametersBackend(
61
- user,
62
- id,
63
- ComputingType.LOAD_FLOW,
64
- OptionalServicesStatus.Up,
65
- getLoadFlowProviders,
66
- null,
67
- getDefaultLoadFlowProvider,
68
- null,
69
- fetchLoadFlowParameters,
70
- setLoadFlowParameters,
71
- getLoadFlowSpecificParametersDescription,
72
- getLoadFlowDefaultLimitReductions
73
- );
60
+ const parametersBackend = useParametersBackend(user, id, ComputingType.LOAD_FLOW, OptionalServicesStatus.Up, {
61
+ backendFetchProviders: getLoadFlowProviders,
62
+ backendFetchParameters: fetchLoadFlowParameters,
63
+ backendUpdateParameters: setLoadFlowParameters,
64
+ backendFetchSpecificParametersDescription: getLoadFlowSpecificParametersDescription,
65
+ backendFetchDefaultLimitReductions: getLoadFlowDefaultLimitReductions
66
+ });
74
67
  const loadflowMethods = useLoadFlowParametersForm(parametersBackend, isDeveloperMode, id, name, description);
75
68
  const {
76
69
  formState: { errors, dirtyFields }
@@ -74,7 +74,7 @@ function LoadFlowParametersForm({
74
74
  formattedProviders,
75
75
  specificParametersDescriptionForProvider,
76
76
  params,
77
- currentProvider,
77
+ watchProvider,
78
78
  defaultLimitReductions,
79
79
  paramsLoaded
80
80
  } = loadflowMethods;
@@ -94,7 +94,7 @@ function LoadFlowParametersForm({
94
94
  LoadFlowParametersContent,
95
95
  {
96
96
  selectedTab,
97
- currentProvider: currentProvider ?? "",
97
+ currentProvider: watchProvider ?? "",
98
98
  specificParameters: specificParametersDescriptionForProvider,
99
99
  params,
100
100
  defaultLimitReductions
@@ -55,7 +55,7 @@ function LoadFlowParametersInline({
55
55
  setHaveDirtyFields,
56
56
  isDeveloperMode
57
57
  }) {
58
- const [, , , , resetProvider, , , , resetParameters, ,] = parametersBackend;
58
+ const { resetParameters } = parametersBackend;
59
59
  const loadflowMethods = useLoadFlowParametersForm(parametersBackend, isDeveloperMode, null, null, null);
60
60
  const intl = useIntl();
61
61
  const [openCreateParameterDialog, setOpenCreateParameterDialog] = useState(false);
@@ -64,9 +64,8 @@ function LoadFlowParametersInline({
64
64
  const { snackError } = useSnackMessage();
65
65
  const executeResetAction = useCallback(() => {
66
66
  resetParameters();
67
- resetProvider();
68
67
  setOpenResetConfirmation(false);
69
- }, [resetParameters, resetProvider]);
68
+ }, [resetParameters]);
70
69
  const handleResetAllClick = useCallback(() => {
71
70
  setOpenResetConfirmation(true);
72
71
  }, []);
@@ -79,7 +78,6 @@ function LoadFlowParametersInline({
79
78
  if (newParams && newParams.length > 0) {
80
79
  setOpenSelectParameterDialog(false);
81
80
  fetchLoadFlowParameters(newParams[0].id).then((parameters) => {
82
- loadflowMethods.setCurrentProvider(parameters.provider);
83
81
  console.info(`loading the following loadflow parameters : ${parameters.uuid}`);
84
82
  reset(loadflowMethods.toLoadFlowFormValues(parameters), {
85
83
  keepDefaultValues: true
@@ -1,5 +1,5 @@
1
1
  import { FieldErrors, UseFormReturn } from 'react-hook-form';
2
- import { Dispatch, SetStateAction, SyntheticEvent } from 'react';
2
+ import { SyntheticEvent } from 'react';
3
3
  import { ObjectSchema } from 'yup';
4
4
  import { UUID } from 'node:crypto';
5
5
  import { TabValues } from './load-flow-parameters-utils';
@@ -22,8 +22,7 @@ export interface UseLoadFlowParametersFormReturn {
22
22
  toLoadFlowFormValues: (_params: LoadFlowParametersInfos) => any;
23
23
  formatNewParams: (formData: Record<string, any>) => LoadFlowParametersInfos;
24
24
  params: LoadFlowParametersInfos | null;
25
- currentProvider: string | undefined;
26
- setCurrentProvider: Dispatch<SetStateAction<string | undefined>>;
25
+ watchProvider: string | undefined;
27
26
  paramsLoaded: boolean;
28
27
  onValidationError: (errors: FieldErrors) => void;
29
28
  onSaveInline: (formData: Record<string, any>) => void;
@@ -1,6 +1,6 @@
1
1
  import { useForm } from "react-hook-form";
2
2
  import { yupResolver } from "@hookform/resolvers/yup";
3
- import { useState, useCallback, useMemo, useEffectEvent, useEffect } from "react";
3
+ import { useState, useRef, useCallback, useMemo, useEffect, useEffectEvent } from "react";
4
4
  import { TabValues, getCommonLoadFlowParametersFormSchema, mapLimitReductions, setLimitReductions } from "./load-flow-parameters-utils.js";
5
5
  import { PROVIDER, SPECIFIC_PARAMETERS, COMMON_PARAMETERS, VERSION_PARAMETER } from "../common/constants.js";
6
6
  import "react/jsx-runtime";
@@ -47,30 +47,18 @@ import "../../filter/HeaderFilterForm.js";
47
47
  import { getNameElementEditorSchema, getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
48
48
  import { getDefaultSpecificParamsValues, getSpecificParametersFormSchema, getAllSpecificParametersValues, formatSpecificParameters, setSpecificParameters } from "../common/utils.js";
49
49
  const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parametersUuid, name, description) => {
50
- const [
51
- providers,
52
- provider,
53
- ,
54
- ,
55
- ,
56
- params,
57
- ,
58
- updateParameters,
59
- ,
60
- specificParamsDescriptions,
61
- defaultLimitReductions
62
- ] = parametersBackend;
63
- const [currentProvider, setCurrentProvider] = useState(params?.provider);
50
+ const { providers, params, updateParameters, specificParamsDescription, defaultLimitReductions } = parametersBackend;
64
51
  const [selectedTab, setSelectedTab] = useState(TabValues.GENERAL);
65
52
  const [limitReductionNumber, setLimitReductionNumber] = useState(0);
66
53
  const [tabIndexesWithError, setTabIndexesWithError] = useState([]);
54
+ const [specificParametersDescriptionForProvider, setSpecificParametersDescriptionForProvider] = useState(() => {
55
+ return params?.provider && specificParamsDescription ? specificParamsDescription[params.provider] : [];
56
+ });
67
57
  const { snackError } = useSnackMessage();
58
+ const previousWatchProviderRef = useRef(void 0);
68
59
  const handleTabChange = useCallback((event, newValue) => {
69
60
  setSelectedTab(newValue);
70
61
  }, []);
71
- const specificParametersDescriptionForProvider = useMemo(() => {
72
- return currentProvider && specificParamsDescriptions ? specificParamsDescriptions[currentProvider] : [];
73
- }, [currentProvider, specificParamsDescriptions]);
74
62
  const specificParametersDefaultValues = useMemo(() => {
75
63
  return getDefaultSpecificParamsValues(specificParametersDescriptionForProvider);
76
64
  }, [specificParametersDescriptionForProvider]);
@@ -86,7 +74,7 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
86
74
  const formMethods = useForm({
87
75
  defaultValues: {
88
76
  ...getNameElementEditorEmptyFormData(name, description),
89
- [PROVIDER]: provider,
77
+ [PROVIDER]: params?.provider,
90
78
  [PARAM_LIMIT_REDUCTION]: null,
91
79
  [COMMON_PARAMETERS]: {
92
80
  ...params?.commonParameters
@@ -100,6 +88,14 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
100
88
  });
101
89
  const { watch, reset } = formMethods;
102
90
  const watchProvider = watch(PROVIDER);
91
+ useEffect(() => {
92
+ const provider = watchProvider ?? params?.provider;
93
+ if (!provider || !specificParamsDescription) {
94
+ setSpecificParametersDescriptionForProvider([]);
95
+ return;
96
+ }
97
+ setSpecificParametersDescriptionForProvider(specificParamsDescription[provider] ?? []);
98
+ }, [watchProvider, params?.provider, specificParamsDescription]);
103
99
  const toLimitReductions = useCallback(
104
100
  (formLimits) => {
105
101
  if (formLimits?.length === 0) {
@@ -143,6 +139,7 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
143
139
  const toLoadFlowFormValues = useCallback(
144
140
  (_params) => {
145
141
  const specificParamsListForCurrentProvider = _params.specificParametersPerProvider[_params.provider];
142
+ const specificParametersForLoadedProvider = specificParamsDescription?.[_params.provider] ?? [];
146
143
  return {
147
144
  [PROVIDER]: _params.provider,
148
145
  [PARAM_LIMIT_REDUCTION]: _params.limitReduction,
@@ -151,16 +148,16 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
151
148
  },
152
149
  [SPECIFIC_PARAMETERS]: {
153
150
  ...formatSpecificParameters(
154
- specificParametersDescriptionForProvider,
151
+ specificParametersForLoadedProvider,
155
152
  specificParamsListForCurrentProvider
156
153
  )
157
154
  },
158
155
  ...toFormValuesLimitReductions(_params.limitReductions)
159
156
  };
160
157
  },
161
- [specificParametersDescriptionForProvider]
158
+ [specificParamsDescription]
162
159
  );
163
- const paramsLoaded = useMemo(() => !!params && !!currentProvider, [currentProvider, params]);
160
+ const paramsLoaded = useMemo(() => !!params && !!watchProvider, [watchProvider, params]);
164
161
  const formattedProviders = useMemo(() => {
165
162
  return Object.entries(providers).filter(([key]) => !key.includes("DynaFlow") || isDeveloperMode).map(([key, value]) => ({
166
163
  id: key,
@@ -214,28 +211,22 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
214
211
  resetForm(params);
215
212
  }, [paramsLoaded, params]);
216
213
  useEffect(() => {
217
- if (watchProvider && watchProvider !== currentProvider) {
218
- setCurrentProvider(watchProvider);
219
- setSpecificParameters(watchProvider, specificParamsDescriptions, formMethods);
220
- setLimitReductions(watchProvider, defaultLimitReductions, formMethods);
221
- if (watchProvider === PARAM_PROVIDER_OPENLOADFLOW) {
222
- if (currentProvider) {
223
- setLimitReductionNumber(defaultLimitReductions?.at(0)?.temporaryLimitReductions?.length ?? 0);
224
- } else {
225
- setLimitReductionNumber(params?.limitReductions?.at(0)?.temporaryLimitReductions?.length ?? 0);
226
- }
214
+ if (!watchProvider || watchProvider === previousWatchProviderRef.current) {
215
+ return;
216
+ }
217
+ setSpecificParameters(watchProvider, specificParamsDescription, formMethods);
218
+ setLimitReductions(watchProvider, defaultLimitReductions, formMethods);
219
+ if (watchProvider === PARAM_PROVIDER_OPENLOADFLOW) {
220
+ if (previousWatchProviderRef.current) {
221
+ setLimitReductionNumber(defaultLimitReductions?.at(0)?.temporaryLimitReductions?.length ?? 0);
227
222
  } else {
228
- setLimitReductionNumber(0);
223
+ setLimitReductionNumber(params?.limitReductions?.at(0)?.temporaryLimitReductions?.length ?? 0);
229
224
  }
225
+ } else {
226
+ setLimitReductionNumber(0);
230
227
  }
231
- }, [
232
- currentProvider,
233
- defaultLimitReductions,
234
- formMethods,
235
- params?.limitReductions,
236
- specificParamsDescriptions,
237
- watchProvider
238
- ]);
228
+ previousWatchProviderRef.current = watchProvider;
229
+ }, [defaultLimitReductions, formMethods, params?.limitReductions, specificParamsDescription, watchProvider]);
239
230
  return {
240
231
  formMethods,
241
232
  formSchema,
@@ -248,8 +239,7 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
248
239
  toLoadFlowFormValues,
249
240
  formatNewParams,
250
241
  params,
251
- currentProvider,
252
- setCurrentProvider,
242
+ watchProvider,
253
243
  paramsLoaded,
254
244
  onValidationError,
255
245
  onSaveInline,