@gridsuite/commons-ui 0.249.0 → 0.251.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 (64) hide show
  1. package/dist/components/composite/reactQueryBuilder/CustomReactQueryBuilder.js +23 -18
  2. package/dist/components/composite/reactQueryBuilder/PropertyValueEditor.js +1 -1
  3. package/dist/features/index.js +10 -2
  4. package/dist/features/network-modifications/common/currentLimits/limitsPane.utils.d.ts +3 -3
  5. package/dist/features/network-modifications/common/currentLimits/limitsPane.utils.js +1 -1
  6. package/dist/features/network-modifications/common/index.js +1 -2
  7. package/dist/features/network-modifications/common/measurements/branchActiveReactivePowerForm.utils.js +1 -1
  8. package/dist/features/network-modifications/common/measurements/index.js +1 -2
  9. package/dist/features/network-modifications/common/measurements/injectionActiveReactivePowerForm.utils.d.ts +0 -8
  10. package/dist/features/network-modifications/common/measurements/injectionActiveReactivePowerForm.utils.js +0 -8
  11. package/dist/features/network-modifications/index.js +6 -2
  12. package/dist/features/network-modifications/line/catalog/segment.utils.d.ts +1 -1
  13. package/dist/features/network-modifications/line/common/LineDialogTabsContent.js +2 -2
  14. package/dist/features/network-modifications/line/common/line.types.d.ts +7 -0
  15. package/dist/features/network-modifications/line/creation/lineCreation.types.d.ts +1 -7
  16. package/dist/features/network-modifications/line/creation/lineCreation.utils.d.ts +1 -1
  17. package/dist/features/network-modifications/line/index.d.ts +1 -0
  18. package/dist/features/network-modifications/line/index.js +6 -1
  19. package/dist/features/network-modifications/line/modification/index.d.ts +8 -0
  20. package/dist/features/network-modifications/line/modification/index.js +7 -0
  21. package/dist/features/network-modifications/line/modification/lineModification.types.d.ts +43 -0
  22. package/dist/features/network-modifications/line/modification/lineModification.types.js +1 -0
  23. package/dist/features/network-modifications/line/modification/lineModification.utils.d.ts +154 -0
  24. package/dist/features/network-modifications/line/modification/lineModification.utils.js +193 -0
  25. package/dist/features/parameters/common/hook/use-tabs.d.ts +3 -1
  26. package/dist/features/parameters/common/hook/use-tabs.js +21 -15
  27. package/dist/features/parameters/index.d.ts +1 -0
  28. package/dist/features/parameters/index.js +4 -0
  29. package/dist/features/parameters/loadflow/load-flow-parameters-utils.d.ts +3 -2
  30. package/dist/features/parameters/loadflow/load-flow-parameters-utils.js +22 -3
  31. package/dist/features/parameters/loadflow/use-load-flow-parameters-form.js +14 -29
  32. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-dialog.js +1 -0
  33. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-inline.js +1 -1
  34. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.d.ts +3 -1
  35. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.js +19 -6
  36. package/dist/features/parameters/security-analysis/constants.d.ts +3 -3
  37. package/dist/features/parameters/security-analysis/constants.js +3 -3
  38. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.d.ts +4 -6
  39. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.js +26 -30
  40. package/dist/features/parameters/security-analysis/security-analysis-parameters-dialog.js +2 -1
  41. package/dist/features/parameters/security-analysis/security-analysis-parameters-form.js +1 -3
  42. package/dist/features/parameters/security-analysis/security-analysis-parameters-inline.js +4 -1
  43. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.d.ts +2 -0
  44. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.js +54 -0
  45. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.d.ts +8 -1
  46. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.js +21 -2
  47. package/dist/features/parameters/sensi/sensitivity-parameters-selector.js +9 -8
  48. package/dist/features/parameters/short-circuit/short-circuit-icc-cluster-table-cell.js +1 -1
  49. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.d.ts +1 -0
  50. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.js +27 -2
  51. package/dist/features/parameters/short-circuit/use-short-circuit-parameters-form.js +15 -24
  52. package/dist/features/parameters/voltage-init/use-voltage-init-parameters-form.js +19 -18
  53. package/dist/features/parameters/voltage-init/voltage-init-form-utils.d.ts +2 -0
  54. package/dist/features/parameters/voltage-init/voltage-init-form-utils.js +14 -1
  55. package/dist/features/parameters/voltage-init/voltage-init-parameters-dialog.js +1 -0
  56. package/dist/features/parameters/voltage-init/voltage-init-parameters-form.js +27 -38
  57. package/dist/features/parameters/voltage-init/voltage-init-parameters-inline.js +1 -1
  58. package/dist/features/process-configs/security-analysis/update-sa-process-config.js +2 -0
  59. package/dist/index.js +10 -2
  60. package/dist/translations/en/networkModificationsEn.d.ts +2 -0
  61. package/dist/translations/en/networkModificationsEn.js +2 -0
  62. package/dist/translations/fr/networkModificationsFr.d.ts +2 -0
  63. package/dist/translations/fr/networkModificationsFr.js +2 -0
  64. package/package.json +1 -1
@@ -0,0 +1,193 @@
1
+ import { object, boolean, string } from "yup";
2
+ import { FieldConstants } from "../../../../utils/constants/fieldConstants.js";
3
+ import { convertInputValue, toModificationOperation, convertOutputValue } from "../../../../utils/conversionUtils.js";
4
+ import "../../../../utils/types/equipmentType.js";
5
+ import { ModificationType } from "../../../../utils/types/modificationType.js";
6
+ import { FieldType } from "../../../../utils/types/fieldType.js";
7
+ import "react/jsx-runtime";
8
+ import "@mui/icons-material";
9
+ import { sanitizeString } from "../../../../utils/ts-utils.js";
10
+ import { getBranchConnectivityWithPositionSchema, getBranchConnectivityWithPositionEmptyFormDataProps, getConnectivityFormDataProps } from "../../common/connectivity/connectivityForm.utils.js";
11
+ import "@mui/material";
12
+ import "react";
13
+ import "react-intl";
14
+ import "../../../../components/ui/overflowableText/OverflowableText.js";
15
+ import "react-hook-form";
16
+ import "localized-countries";
17
+ import "localized-countries/data/fr";
18
+ import "localized-countries/data/en";
19
+ import "notistack";
20
+ import "../../../../components/ui/reactHookForm/provider/CustomFormProvider.js";
21
+ import "../../../../components/ui/treeViewFinder/TreeViewFinder.js";
22
+ import "../../../../components/ui/reactHookForm/numbers/RangeInput.js";
23
+ import "@material-symbols/svg-400/outlined/left_panel_open.svg?react";
24
+ import "@material-symbols/svg-400/outlined/arrows_output.svg?react";
25
+ import "@material-symbols/svg-400/outlined/arrows_input.svg?react";
26
+ import "@material-symbols/svg-400/outlined/left_panel_close.svg?react";
27
+ import "@material-symbols/svg-400/outlined/add_notes.svg?react";
28
+ import "../../../../components/ui/dialogs/descriptionModificationDialog/DescriptionModificationDialog.js";
29
+ import "../../../../components/ui/reactHookForm/expandableInput/ExpandableInput.js";
30
+ import "../../../../components/ui/reactHookForm/directory-item-input/directory-item-utils.js";
31
+ import "@hello-pangea/dnd";
32
+ import "../../../../components/ui/dialogs/elementSaveDialog/ElementSaveDialog.js";
33
+ import "../../../../components/ui/snackbarProvider/SnackbarProvider.js";
34
+ import "mui-nested-menu";
35
+ import "react-resizable-panels";
36
+ import "react-papaparse";
37
+ import { modificationPropertiesSchema, getPropertiesFromModification, toModificationProperties } from "../../common/properties/propertyUtils.js";
38
+ import { getLineCharacteristicsValidationSchemaProps, getLineCharacteristicsEmptyFormData } from "../characteristics/lineCharacteristicsPane.utils.js";
39
+ import "react-dom";
40
+ import "autosuggest-highlight/match";
41
+ import "autosuggest-highlight/parse";
42
+ import "clsx";
43
+ import "../../../../components/composite/filter/FilterCreationDialog.js";
44
+ import "../../../../components/composite/filter/HeaderFilterForm.js";
45
+ import "../../../../components/composite/filter/explicitNaming/ExplicitNamingFilterForm.js";
46
+ import "../../../../components/composite/filter/expert/ExpertFilterForm.js";
47
+ import "../../../../components/composite/filter/expert/ExpertFilterEditionDialog.js";
48
+ import "../../../../components/composite/filter/expert/expertFilterConstants.js";
49
+ import "react-querybuilder";
50
+ import "uuid";
51
+ import "../../../../components/composite/filter/explicitNaming/ExplicitNamingFilterEditionDialog.js";
52
+ import "../../../../components/composite/filter/utils/filterFormUtils.js";
53
+ import "@react-querybuilder/material";
54
+ import "../../../../components/composite/reactQueryBuilder/CustomReactQueryBuilder.js";
55
+ import "../../../../components/composite/reactQueryBuilder/PropertyValueEditor.js";
56
+ import "../../../../components/composite/agGridTable/BottomTableButtons.js";
57
+ import "../../../../components/composite/agGridTable/CustomAgGridTable.js";
58
+ import "ag-grid-community";
59
+ import "../../../../components/composite/customAGGrid/customAggrid.js";
60
+ import "../../../../components/composite/customAGGrid/context/custom-aggrid-context.js";
61
+ import "mathjs";
62
+ import "../../../../components/composite/report/report-viewer/log-table/log-table.js";
63
+ import "react-window";
64
+ import "../../../../components/composite/report/report-treeview/treeview-item.js";
65
+ import "../../../../components/composite/report/report-viewer/context/report-viewer-context.js";
66
+ import { getLimitsValidationSchemaProps, getLimitsEmptyFormDataProps, getAllLimitsFormDataProperties, formatOpLimitGroupsToFormInfos, addOperationTypeToSelectedOpLG, addModificationTypeToOpLimitsGroups, sanitizeLimitsGroups } from "../../common/currentLimits/limitsPane.utils.js";
67
+ import { getBranchActiveReactivePowerValidationSchemaObject, getBranchActiveReactivePowerEmptyFormDataProperties, getBranchActiveReactivePowerEditDataProperties } from "../../common/measurements/branchActiveReactivePowerForm.utils.js";
68
+ import { LineSegmentsInfoSchema, convertToLineSegmentInfos } from "../catalog/segment.utils.js";
69
+ import "../../common/regulatingTerminal/RegulatingTerminalForm.js";
70
+ import "@mui/material/colors";
71
+ import "@mui/x-charts";
72
+ import { OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE } from "../../common/currentLimits/operationalLimitsGroups/operationalLimitsGroups.types.js";
73
+ const lineModificationFormSchema = object().shape({
74
+ [FieldConstants.EQUIPMENT_ID]: string().required(),
75
+ [FieldConstants.EQUIPMENT_NAME]: string().nullable(),
76
+ [FieldConstants.CONNECTIVITY]: getBranchConnectivityWithPositionSchema(true, true),
77
+ [FieldConstants.CHARACTERISTICS]: getLineCharacteristicsValidationSchemaProps(true),
78
+ [FieldConstants.LIMITS]: getLimitsValidationSchemaProps(true),
79
+ [FieldConstants.STATE_ESTIMATION]: getBranchActiveReactivePowerValidationSchemaObject(),
80
+ [FieldConstants.LINE_SEGMENTS]: LineSegmentsInfoSchema,
81
+ [FieldConstants.APPLY_SEGMENTS_LIMITS]: boolean().required()
82
+ }).concat(modificationPropertiesSchema).required();
83
+ const lineModificationEmptyFormData = {
84
+ [FieldConstants.EQUIPMENT_ID]: "",
85
+ [FieldConstants.EQUIPMENT_NAME]: "",
86
+ [FieldConstants.CONNECTIVITY]: getBranchConnectivityWithPositionEmptyFormDataProps(true),
87
+ [FieldConstants.CHARACTERISTICS]: getLineCharacteristicsEmptyFormData(),
88
+ [FieldConstants.LIMITS]: getLimitsEmptyFormDataProps(true),
89
+ [FieldConstants.STATE_ESTIMATION]: getBranchActiveReactivePowerEmptyFormDataProperties(),
90
+ [FieldConstants.LINE_SEGMENTS]: [],
91
+ [FieldConstants.APPLY_SEGMENTS_LIMITS]: false,
92
+ AdditionalProperties: []
93
+ };
94
+ const lineModificationDtoToForm = (lineDto, includePreviousValues = true) => {
95
+ return {
96
+ equipmentID: lineDto.equipmentId,
97
+ equipmentName: lineDto.equipmentName?.value ?? "",
98
+ ...getPropertiesFromModification(lineDto?.properties, includePreviousValues),
99
+ limits: getAllLimitsFormDataProperties(
100
+ formatOpLimitGroupsToFormInfos(lineDto.operationalLimitsGroups),
101
+ lineDto.selectedOperationalLimitsGroupId1?.value ?? null,
102
+ lineDto.selectedOperationalLimitsGroupId2?.value ?? null,
103
+ lineDto.enableOLGModification
104
+ ),
105
+ connectivity: {
106
+ connectivity1: getConnectivityFormDataProps({
107
+ voltageLevelId: lineDto?.voltageLevelId1?.value ?? null,
108
+ busbarSectionId: lineDto?.busOrBusbarSectionId1?.value ?? null,
109
+ connectionName: lineDto?.connectionName1?.value ?? "",
110
+ connectionDirection: lineDto?.connectionDirection1?.value ?? null,
111
+ connectionPosition: lineDto?.connectionPosition1?.value ?? null,
112
+ terminalConnected: lineDto?.terminal1Connected?.value ?? null,
113
+ isEquipmentModification: true
114
+ }),
115
+ connectivity2: getConnectivityFormDataProps({
116
+ voltageLevelId: lineDto?.voltageLevelId2?.value ?? null,
117
+ busbarSectionId: lineDto?.busOrBusbarSectionId2?.value ?? null,
118
+ connectionName: lineDto?.connectionName2?.value ?? "",
119
+ connectionDirection: lineDto?.connectionDirection2?.value ?? null,
120
+ connectionPosition: lineDto?.connectionPosition2?.value ?? null,
121
+ terminalConnected: lineDto?.terminal2Connected?.value ?? null,
122
+ isEquipmentModification: true
123
+ })
124
+ },
125
+ stateEstimation: getBranchActiveReactivePowerEditDataProperties(lineDto),
126
+ characteristics: {
127
+ r: lineDto.r?.value ?? null,
128
+ x: lineDto.x?.value ?? null,
129
+ g1: convertInputValue(FieldType.G1, lineDto.g1?.value ?? null),
130
+ b1: convertInputValue(FieldType.B1, lineDto.b1?.value ?? null),
131
+ g2: convertInputValue(FieldType.G2, lineDto.g2?.value ?? null),
132
+ b2: convertInputValue(FieldType.B2, lineDto.b2?.value ?? null)
133
+ },
134
+ lineSegments: lineDto.lineSegments,
135
+ applySegmentsLimits: lineDto.applySegmentsLimits ?? true
136
+ };
137
+ };
138
+ const lineModificationFormToDto = (line, intl) => {
139
+ const connectivity1 = line.connectivity?.connectivity1;
140
+ const connectivity2 = line.connectivity?.connectivity2;
141
+ const { characteristics, limits } = line;
142
+ return {
143
+ type: ModificationType.LINE_MODIFICATION,
144
+ equipmentId: line.equipmentID,
145
+ equipmentName: toModificationOperation(sanitizeString(line.equipmentName) ?? ""),
146
+ r: toModificationOperation(characteristics.r),
147
+ x: toModificationOperation(characteristics.x),
148
+ g1: toModificationOperation(convertOutputValue(FieldType.G1, characteristics.g1)),
149
+ g2: toModificationOperation(convertOutputValue(FieldType.G2, characteristics.g2)),
150
+ b1: toModificationOperation(convertOutputValue(FieldType.B1, characteristics.b1)),
151
+ b2: toModificationOperation(convertOutputValue(FieldType.B2, characteristics.b2)),
152
+ enableOLGModification: limits.enableOLGModification,
153
+ operationalLimitsGroupsModificationType: limits.enableOLGModification ? OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE.REPLACE : null,
154
+ operationalLimitsGroups: limits.enableOLGModification ? addModificationTypeToOpLimitsGroups(sanitizeLimitsGroups(limits.operationalLimitsGroups)) : [],
155
+ selectedOperationalLimitsGroupId1: addOperationTypeToSelectedOpLG(
156
+ limits.selectedOperationalLimitsGroupId1,
157
+ intl.formatMessage({ id: "None" })
158
+ ),
159
+ selectedOperationalLimitsGroupId2: addOperationTypeToSelectedOpLG(
160
+ limits.selectedOperationalLimitsGroupId2,
161
+ intl.formatMessage({ id: "None" })
162
+ ),
163
+ voltageLevelId1: toModificationOperation(connectivity1.voltageLevel?.id),
164
+ busOrBusbarSectionId1: toModificationOperation(connectivity1.busOrBusbarSection?.id),
165
+ connectionName1: toModificationOperation(sanitizeString(connectivity1.connectionName)),
166
+ connectionDirection1: toModificationOperation(connectivity1.connectionDirection),
167
+ connectionPosition1: toModificationOperation(connectivity1.connectionPosition),
168
+ terminal1Connected: toModificationOperation(connectivity1.terminalConnected),
169
+ voltageLevelId2: toModificationOperation(connectivity2.voltageLevel?.id),
170
+ busOrBusbarSectionId2: toModificationOperation(connectivity2.busOrBusbarSection?.id),
171
+ connectionName2: toModificationOperation(sanitizeString(connectivity2.connectionName)),
172
+ connectionDirection2: toModificationOperation(connectivity2.connectionDirection),
173
+ connectionPosition2: toModificationOperation(connectivity2.connectionPosition),
174
+ terminal2Connected: toModificationOperation(connectivity2.terminalConnected),
175
+ properties: toModificationProperties(line),
176
+ p1MeasurementValue: toModificationOperation(line.stateEstimation?.measurementP1?.value),
177
+ p1MeasurementValidity: toModificationOperation(line.stateEstimation?.measurementP1?.validity),
178
+ q1MeasurementValue: toModificationOperation(line.stateEstimation?.measurementQ1?.value),
179
+ q1MeasurementValidity: toModificationOperation(line.stateEstimation?.measurementQ1?.validity),
180
+ p2MeasurementValue: toModificationOperation(line.stateEstimation?.measurementP2?.value),
181
+ p2MeasurementValidity: toModificationOperation(line.stateEstimation?.measurementP2?.validity),
182
+ q2MeasurementValue: toModificationOperation(line.stateEstimation?.measurementQ2?.value),
183
+ q2MeasurementValidity: toModificationOperation(line.stateEstimation?.measurementQ2?.validity),
184
+ lineSegments: convertToLineSegmentInfos(line.lineSegments),
185
+ applySegmentsLimits: line.applySegmentsLimits ?? true
186
+ };
187
+ };
188
+ export {
189
+ lineModificationDtoToForm,
190
+ lineModificationEmptyFormData,
191
+ lineModificationFormSchema,
192
+ lineModificationFormToDto
193
+ };
@@ -2,6 +2,7 @@ import { SyntheticEvent } from 'react';
2
2
  import { FieldErrors } from 'react-hook-form';
3
3
  export type UseTabsReturn<TTabValue extends string> = {
4
4
  selectedTab: TTabValue;
5
+ setSelectedTab: (selectedTab: TTabValue) => void;
5
6
  tabsWithError: TTabValue[];
6
7
  onTabChange: (event: SyntheticEvent, newValue: TTabValue) => void;
7
8
  onError: (errors: FieldErrors) => void;
@@ -10,5 +11,6 @@ export type UseTabsProps<TTabValue extends string> = {
10
11
  defaultTab: TTabValue;
11
12
  tabEnum: Record<string, TTabValue>;
12
13
  errors: FieldErrors;
14
+ tabFields?: Record<TTabValue, string[]>;
13
15
  };
14
- export declare function useTabs<TTabValue extends string>({ defaultTab, tabEnum, errors, }: Readonly<UseTabsProps<TTabValue>>): UseTabsReturn<TTabValue>;
16
+ export declare function useTabs<TTabValue extends string>({ defaultTab, tabEnum, errors, tabFields, }: Readonly<UseTabsProps<TTabValue>>): UseTabsReturn<TTabValue>;
@@ -1,43 +1,48 @@
1
1
  import { useState, useCallback } from "react";
2
+ import { get } from "react-hook-form";
2
3
  import { isObjectEmpty } from "../../../../utils/functions.js";
3
4
  function useTabs({
4
5
  defaultTab,
5
6
  tabEnum,
6
- errors
7
+ errors,
8
+ tabFields
7
9
  }) {
8
10
  const [selectedTab, setSelectedTab] = useState(defaultTab);
9
11
  const [tabsWithError, setTabsWithError] = useState([]);
12
+ const getTabsWithError = useCallback(
13
+ (_errors) => {
14
+ const tabsHasError = [];
15
+ Object.values(tabEnum).forEach((tabValue) => {
16
+ const fields = tabFields?.[tabValue] ?? [tabValue];
17
+ if (fields.some((field) => get(_errors, field))) {
18
+ tabsHasError.push(tabValue);
19
+ }
20
+ });
21
+ return tabsHasError;
22
+ },
23
+ [tabEnum, tabFields]
24
+ );
10
25
  const onTabChange = useCallback(
11
26
  (event, newSelectedTab) => {
12
27
  setSelectedTab(newSelectedTab);
13
28
  if (!errors || isObjectEmpty(errors)) {
14
29
  return;
15
30
  }
16
- const tabsHasError = [];
17
- Object.values(tabEnum).forEach((tabValue) => {
18
- if (errors?.[tabValue]) {
19
- tabsHasError.push(tabValue);
20
- }
21
- });
31
+ const tabsHasError = getTabsWithError(errors);
22
32
  if (tabsHasError.includes(newSelectedTab)) {
23
33
  setTabsWithError(tabsHasError.filter((errorTab) => errorTab !== newSelectedTab));
24
34
  } else {
25
35
  setTabsWithError(tabsHasError);
26
36
  }
27
37
  },
28
- [errors, tabEnum]
38
+ [errors, getTabsWithError]
29
39
  );
30
40
  const onError = useCallback(
31
41
  (_errors) => {
32
42
  if (!_errors || isObjectEmpty(_errors)) {
33
43
  return;
34
44
  }
35
- const tabsHasError = [];
36
- Object.values(tabEnum).forEach((tabValue) => {
37
- if (_errors?.[tabValue]) {
38
- tabsHasError.push(tabValue);
39
- }
40
- });
45
+ const tabsHasError = getTabsWithError(_errors);
41
46
  if (tabsHasError.includes(selectedTab)) {
42
47
  setTabsWithError(tabsHasError.filter((errorTab) => errorTab !== selectedTab));
43
48
  } else if (tabsHasError.length > 0) {
@@ -45,10 +50,11 @@ function useTabs({
45
50
  setTabsWithError(tabsHasError.filter((errorTab, index, arr) => errorTab !== arr[0]));
46
51
  }
47
52
  },
48
- [selectedTab, tabEnum]
53
+ [getTabsWithError, selectedTab]
49
54
  );
50
55
  return {
51
56
  selectedTab,
57
+ setSelectedTab,
52
58
  tabsWithError,
53
59
  onTabChange,
54
60
  onError
@@ -15,3 +15,4 @@ export * from './sensi';
15
15
  export * from './dynamic-simulation';
16
16
  export * from './dynamic-security-analysis';
17
17
  export * from './dynamic-margin-calculation';
18
+ export * from './parameters-style';
@@ -49,6 +49,7 @@ import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION }
49
49
  import { DynamicSecurityAnalysisInline } from "./dynamic-security-analysis/dynamic-security-analysis-inline.js";
50
50
  import { ACCURACY, ACTIVE, CALCULATION_TYPE, LOADS_VARIATIONS, LOAD_FILTERS, LOAD_INCREASE_START_TIME, LOAD_INCREASE_STOP_TIME, LOAD_MODELS_RULE, MARGIN_CALCULATION_START_TIME, START_TIME, STOP_TIME, VARIATION } from "./dynamic-margin-calculation/constants.js";
51
51
  import { DynamicMarginCalculationInline } from "./dynamic-margin-calculation/dynamic-margin-calculation-inline.js";
52
+ import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./parameters-style.js";
52
53
  export {
53
54
  ACCURACY,
54
55
  ACTIVE,
@@ -238,11 +239,14 @@ export {
238
239
  formatComputingTypeLabel,
239
240
  getContingencyListsInfosFormSchema,
240
241
  getLimitReductionsFormSchema,
242
+ getTabIndicatorStyle,
243
+ getTabStyle,
241
244
  intlInitialVoltageProfileMode,
242
245
  intlPredefinedParametersOptions,
243
246
  isValidComputingType,
244
247
  isValidContingencyRow,
245
248
  onlyStartedGeneratorsOptions,
249
+ parametersStyles,
246
250
  sanitizePercentageValue,
247
251
  toFormValuesContingencyListsInfos,
248
252
  toFormValuesLimitReductions,
@@ -4,10 +4,11 @@ import { ParameterValue } from './load-flow-parameters-type';
4
4
  import * as yup from 'yup';
5
5
  export declare enum TabValues {
6
6
  GENERAL = "General",
7
+ LIMIT_REDUCTIONS = "LimitReductions",
7
8
  ADVANCED = "Advanced",
8
- PROVIDER_SPECIFIC = "ProviderSpecific",
9
- LIMIT_REDUCTIONS = "LimitReductions"
9
+ PROVIDER_SPECIFIC = "ProviderSpecific"
10
10
  }
11
+ export declare const TAB_FIELDS: Record<TabValues, string[]>;
11
12
  export declare const getBasicLoadFlowParametersFormSchema: () => yup.ObjectSchema<{
12
13
  phaseShifterRegulationOn: NonNullable<boolean | undefined>;
13
14
  dc: NonNullable<boolean | undefined>;
@@ -30,9 +30,9 @@ import "mui-nested-menu";
30
30
  import "react-resizable-panels";
31
31
  import "react-papaparse";
32
32
  import "../common/parameter-layout/parameter-layout-provider.js";
33
- import { ADVANCED_PARAMETERS, COMMON_PARAMETERS } from "../common/constants.js";
33
+ import { ADVANCED_PARAMETERS, SPECIFIC_PARAMETERS, COMMON_PARAMETERS } from "../common/constants.js";
34
34
  import "../common/widget/parameter-line-slider.js";
35
- import { IST_FORM, LIMIT_DURATION_FORM, LIMIT_REDUCTIONS_FORM, toFormValuesLimitReductions } from "../common/limitreductions/columns-definitions.js";
35
+ import { LIMIT_REDUCTIONS_FORM, IST_FORM, LIMIT_DURATION_FORM, toFormValuesLimitReductions } from "../common/limitreductions/columns-definitions.js";
36
36
  import "../common/contingency-table/contingency-table.js";
37
37
  import "../common/contingency-table/columns-definitions.js";
38
38
  import "@hookform/resolvers/yup";
@@ -41,11 +41,29 @@ import { DC_POWER_FACTOR, DC_USE_TRANSFORMER_RATIO, SHUNT_COMPENSATOR_VOLTAGE_CO
41
41
  import { advancedParams } from "./load-flow-advanced-parameters.js";
42
42
  var TabValues = /* @__PURE__ */ ((TabValues2) => {
43
43
  TabValues2["GENERAL"] = "General";
44
+ TabValues2["LIMIT_REDUCTIONS"] = "LimitReductions";
44
45
  TabValues2["ADVANCED"] = "Advanced";
45
46
  TabValues2["PROVIDER_SPECIFIC"] = "ProviderSpecific";
46
- TabValues2["LIMIT_REDUCTIONS"] = "LimitReductions";
47
47
  return TabValues2;
48
48
  })(TabValues || {});
49
+ const TAB_FIELDS = {
50
+ [
51
+ "General"
52
+ /* GENERAL */
53
+ ]: [COMMON_PARAMETERS],
54
+ [
55
+ "ProviderSpecific"
56
+ /* PROVIDER_SPECIFIC */
57
+ ]: [SPECIFIC_PARAMETERS],
58
+ [
59
+ "Advanced"
60
+ /* ADVANCED */
61
+ ]: [ADVANCED_PARAMETERS],
62
+ [
63
+ "LimitReductions"
64
+ /* LIMIT_REDUCTIONS */
65
+ ]: [LIMIT_REDUCTIONS_FORM]
66
+ };
49
67
  const getBasicLoadFlowParametersFormSchema = () => {
50
68
  return yup.object().shape({
51
69
  [PHASE_SHIFTER_REGULATION_ON]: yup.boolean().required(),
@@ -133,6 +151,7 @@ function splitCommonParameters(commonParameters) {
133
151
  );
134
152
  }
135
153
  export {
154
+ TAB_FIELDS,
136
155
  TabValues,
137
156
  getAdvancedLoadFlowParametersFormSchema,
138
157
  getAdvancedLoadFlowParametersFormSchemaFields,
@@ -1,8 +1,8 @@
1
1
  import { useForm } from "react-hook-form";
2
2
  import { yupResolver } from "@hookform/resolvers/yup";
3
- import { useState, useRef, useCallback, useMemo, useEffect, useEffectEvent } from "react";
3
+ import { useState, useRef, useMemo, useEffect, useCallback, useEffectEvent } from "react";
4
4
  import * as yup from "yup";
5
- import { TabValues, getAdvancedLoadFlowParametersFormSchema, getCommonLoadFlowParametersFormSchema, splitCommonParameters, mapLimitReductions, setLimitReductions } from "./load-flow-parameters-utils.js";
5
+ import { getAdvancedLoadFlowParametersFormSchema, getCommonLoadFlowParametersFormSchema, splitCommonParameters, mapLimitReductions, TabValues, TAB_FIELDS, setLimitReductions } from "./load-flow-parameters-utils.js";
6
6
  import "react/jsx-runtime";
7
7
  import "@mui/material";
8
8
  import "@mui/icons-material";
@@ -41,23 +41,19 @@ import "../common/widget/parameter-line-slider.js";
41
41
  import { getLimitReductionsFormSchema, LIMIT_REDUCTIONS_FORM, toFormValuesLimitReductions } from "../common/limitreductions/columns-definitions.js";
42
42
  import "../common/contingency-table/contingency-table.js";
43
43
  import "../common/contingency-table/columns-definitions.js";
44
+ import { useTabs } from "../common/hook/use-tabs.js";
44
45
  import "../../../components/composite/filter/HeaderFilterForm.js";
45
46
  import { getNameElementEditorSchema, getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
46
47
  import { PARAM_LIMIT_REDUCTION, PARAM_PROVIDER_OPENLOADFLOW } from "./constants.js";
47
48
  import { getDefaultSpecificParamsValues, getSpecificParametersFormSchema, getAllSpecificParametersValues, formatSpecificParameters, setSpecificParameters } from "../common/utils.js";
48
49
  const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parametersUuid, name, description) => {
49
50
  const { providers, params, updateParameters, specificParamsDescription, defaultLimitReductions } = parametersBackend;
50
- const [selectedTab, setSelectedTab] = useState(TabValues.GENERAL);
51
51
  const [limitReductionNumber, setLimitReductionNumber] = useState(0);
52
- const [tabIndexesWithError, setTabIndexesWithError] = useState([]);
53
52
  const [specificParametersDescriptionForProvider, setSpecificParametersDescriptionForProvider] = useState(() => {
54
53
  return params?.provider && specificParamsDescription ? specificParamsDescription[params.provider] : [];
55
54
  });
56
55
  const { snackError } = useSnackMessage();
57
56
  const previousWatchProviderRef = useRef(void 0);
58
- const handleTabChange = useCallback((event, newValue) => {
59
- setSelectedTab(newValue);
60
- }, []);
61
57
  const specificParametersDefaultValues = useMemo(() => {
62
58
  return getDefaultSpecificParamsValues(specificParametersDescriptionForProvider);
63
59
  }, [specificParametersDescriptionForProvider]);
@@ -178,29 +174,19 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
178
174
  label: value
179
175
  }));
180
176
  }, [providers, isDeveloperMode]);
181
- const onValidationError = useCallback(
182
- (errors) => {
183
- const tabsInError = [];
184
- console.log("ERRORS", errors);
185
- if (errors?.[LIMIT_REDUCTIONS_FORM] && TabValues.LIMIT_REDUCTIONS !== selectedTab) {
186
- tabsInError.push(TabValues.LIMIT_REDUCTIONS);
187
- }
188
- if (errors?.[COMMON_PARAMETERS] && TabValues.GENERAL !== selectedTab) {
189
- tabsInError.push(TabValues.GENERAL);
190
- }
191
- if (errors?.[SPECIFIC_PARAMETERS] && TabValues.PROVIDER_SPECIFIC !== selectedTab) {
192
- tabsInError.push(TabValues.PROVIDER_SPECIFIC);
193
- }
194
- if (errors?.[ADVANCED_PARAMETERS] && TabValues.ADVANCED !== selectedTab) {
195
- tabsInError.push(TabValues.ADVANCED);
196
- }
197
- setTabIndexesWithError(tabsInError);
198
- },
199
- [selectedTab]
200
- );
177
+ const {
178
+ selectedTab,
179
+ onTabChange: handleTabChange,
180
+ tabsWithError: tabIndexesWithError,
181
+ onError: onValidationError
182
+ } = useTabs({
183
+ defaultTab: TabValues.GENERAL,
184
+ tabEnum: TabValues,
185
+ errors: formMethods.formState.errors,
186
+ tabFields: TAB_FIELDS
187
+ });
201
188
  const onSaveInline = useCallback(
202
189
  (formData) => {
203
- setTabIndexesWithError([]);
204
190
  updateParameters(formatNewParams(formData));
205
191
  },
206
192
  [updateParameters, formatNewParams]
@@ -208,7 +194,6 @@ const useLoadFlowParametersForm = (parametersBackend, isDeveloperMode, parameter
208
194
  const onSaveDialog = useCallback(
209
195
  (formData) => {
210
196
  if (parametersUuid) {
211
- setTabIndexesWithError([]);
212
197
  updateParameter(
213
198
  parametersUuid,
214
199
  formatNewParams(formData),
@@ -62,6 +62,7 @@ function NetworkVisualizationsParametersEditionDialog({
62
62
  open,
63
63
  onClose,
64
64
  onSave: networkVisuMethods.onSaveDialog,
65
+ onValidationError: networkVisuMethods.onValidationError,
65
66
  formContext: {
66
67
  ...networkVisuMethods.formMethods,
67
68
  validationSchema: networkVisuMethods.formSchema,
@@ -91,7 +91,7 @@ function NetworkVisualizationParametersInline({
91
91
  parameterFormatter: (newParams) => newParams
92
92
  },
93
93
  selectParameterHandler: handleLoadParameters,
94
- validateHandler: handleSubmit(networkVisuMethods.onSaveInline),
94
+ validateHandler: handleSubmit(networkVisuMethods.onSaveInline, networkVisuMethods.onValidationError),
95
95
  children: /* @__PURE__ */ jsx(NetworkVisualizationParametersForm, { userProfile, networkVisuMethods })
96
96
  }
97
97
  )
@@ -1,4 +1,4 @@
1
- import { UseFormReturn } from 'react-hook-form';
1
+ import { FieldErrors, UseFormReturn } from 'react-hook-form';
2
2
  import { SyntheticEvent } from 'react';
3
3
  import { UUID } from 'node:crypto';
4
4
  import { NetworkVisualizationTabValues as TabValues } from './constants';
@@ -12,6 +12,8 @@ export interface UseNetworkVisualizationParametersFormReturn {
12
12
  paramsLoading: boolean;
13
13
  onSaveInline: (formData: Record<string, any>) => void;
14
14
  onSaveDialog: (formData: Record<string, any>) => void;
15
+ tabIndexesWithError: TabValues[];
16
+ onValidationError: (errors: FieldErrors) => void;
15
17
  }
16
18
  type UseNetworkVisualizationParametersFormProps = {
17
19
  parametersUuid: UUID;
@@ -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, useEffect } from "react";
3
+ import { useState, useMemo, useCallback, useEffect } from "react";
4
4
  import * as yup from "yup";
5
5
  import "react/jsx-runtime";
6
6
  import "@mui/material";
@@ -39,6 +39,11 @@ import "react-papaparse";
39
39
  import { NetworkVisualizationTabValues, PARAM_NAD_POSITIONS_GENERATION_MODE, PARAM_STATE_ESTIMATION, PARAM_COMPONENT_LIBRARY, PARAM_SUBSTATION_LAYOUT, PARAM_CENTER_LABEL, PARAM_DIAGONAL_LABEL, PARAM_MAP_BASEMAP, PARAM_MAP_MANUAL_REFRESH, PARAM_LINE_FLOW_MODE, PARAM_LINE_PARALLEL_PATH, PARAM_LINE_FULL_PATH } from "./constants.js";
40
40
  import "../../../components/composite/filter/HeaderFilterForm.js";
41
41
  import { getNameElementEditorSchema, getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
42
+ import "../common/parameter-layout/parameter-layout-provider.js";
43
+ import "../common/widget/parameter-line-slider.js";
44
+ import "../common/contingency-table/contingency-table.js";
45
+ import "../common/contingency-table/columns-definitions.js";
46
+ import { useTabs } from "../common/hook/use-tabs.js";
42
47
  const useNetworkVisualizationParametersForm = ({
43
48
  parametersUuid,
44
49
  name,
@@ -46,12 +51,8 @@ const useNetworkVisualizationParametersForm = ({
46
51
  studyUuid,
47
52
  parameters
48
53
  }) => {
49
- const [selectedTab, setSelectedTab] = useState(NetworkVisualizationTabValues.MAP);
50
54
  const [paramsLoading, setParamsLoading] = useState(false);
51
55
  const { snackError } = useSnackMessage();
52
- const handleTabChange = useCallback((event, newValue) => {
53
- setSelectedTab(newValue);
54
- }, []);
55
56
  const formSchema = useMemo(() => {
56
57
  return yup.object({
57
58
  [NetworkVisualizationTabValues.MAP]: yup.object().shape({
@@ -97,6 +98,16 @@ const useNetworkVisualizationParametersForm = ({
97
98
  resolver: yupResolver(formSchema)
98
99
  });
99
100
  const { reset } = formMethods;
101
+ const {
102
+ selectedTab,
103
+ onTabChange: handleTabChange,
104
+ tabsWithError: tabIndexesWithError,
105
+ onError: onValidationError
106
+ } = useTabs({
107
+ defaultTab: NetworkVisualizationTabValues.MAP,
108
+ tabEnum: NetworkVisualizationTabValues,
109
+ errors: formMethods.formState.errors
110
+ });
100
111
  const onSaveInline = useCallback(
101
112
  (formData) => {
102
113
  if (studyUuid) {
@@ -150,7 +161,9 @@ const useNetworkVisualizationParametersForm = ({
150
161
  handleTabChange,
151
162
  paramsLoading,
152
163
  onSaveInline,
153
- onSaveDialog
164
+ onSaveDialog,
165
+ tabIndexesWithError,
166
+ onValidationError
154
167
  };
155
168
  };
156
169
  export {
@@ -10,7 +10,7 @@ export declare const LOW_VOLTAGE_ABSOLUTE_THRESHOLD = "lowVoltageAbsoluteThresho
10
10
  export declare const HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD = "highVoltageProportionalThreshold";
11
11
  export declare const HIGH_VOLTAGE_ABSOLUTE_THRESHOLD = "highVoltageAbsoluteThreshold";
12
12
  export declare enum TabValues {
13
- Contingencies = 0,
14
- Aggravation = 1,
15
- LimitReductions = 2
13
+ Contingencies = "Contingencies",
14
+ Aggravation = "Aggravation",
15
+ LimitReductions = "LimitReductions"
16
16
  }
@@ -4,9 +4,9 @@ const LOW_VOLTAGE_ABSOLUTE_THRESHOLD = "lowVoltageAbsoluteThreshold";
4
4
  const HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD = "highVoltageProportionalThreshold";
5
5
  const HIGH_VOLTAGE_ABSOLUTE_THRESHOLD = "highVoltageAbsoluteThreshold";
6
6
  var TabValues = /* @__PURE__ */ ((TabValues2) => {
7
- TabValues2[TabValues2["Contingencies"] = 0] = "Contingencies";
8
- TabValues2[TabValues2["Aggravation"] = 1] = "Aggravation";
9
- TabValues2[TabValues2["LimitReductions"] = 2] = "LimitReductions";
7
+ TabValues2["Contingencies"] = "Contingencies";
8
+ TabValues2["Aggravation"] = "Aggravation";
9
+ TabValues2["LimitReductions"] = "LimitReductions";
10
10
  return TabValues2;
11
11
  })(TabValues || {});
12
12
  export {
@@ -1,12 +1,10 @@
1
1
  import { ForwardedRef } from 'react';
2
2
  import { UUID } from 'node:crypto';
3
- import { ILimitReductionsByVoltageLevel, ContingencyTableApi } from '../common';
3
+ import { ContingencyTableApi } from '../common';
4
4
  import { ContingencyCount } from '../common/contingency-table/types';
5
- import { SAParametersEnriched } from '../../../utils/types';
6
- export declare function SecurityAnalysisParametersContent({ params, currentProvider, defaultLimitReductions, showContingencyCount, fetchContingencyCount, contingencyTableApiRef, isBuiltCurrentNode, }: Readonly<{
7
- params: SAParametersEnriched | null;
8
- currentProvider?: string;
9
- defaultLimitReductions: ILimitReductionsByVoltageLevel[];
5
+ import { UseSecurityAnalysisParametersFormReturn } from './use-security-analysis-parameters-form';
6
+ export declare function SecurityAnalysisParametersContent({ securityAnalysisMethods, showContingencyCount, fetchContingencyCount, contingencyTableApiRef, isBuiltCurrentNode, }: Readonly<{
7
+ securityAnalysisMethods: UseSecurityAnalysisParametersFormReturn;
10
8
  showContingencyCount: boolean;
11
9
  fetchContingencyCount?: (contingencyListIds: UUID[] | null, abortSignal: AbortSignal) => Promise<ContingencyCount>;
12
10
  contingencyTableApiRef?: ForwardedRef<ContingencyTableApi>;