@gridsuite/commons-ui 0.250.0 → 0.252.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 (50) hide show
  1. package/dist/components/index.js +2 -1
  2. package/dist/components/ui/index.js +2 -1
  3. package/dist/components/ui/reactHookForm/constants.d.ts +1 -0
  4. package/dist/components/ui/reactHookForm/constants.js +2 -0
  5. package/dist/components/ui/reactHookForm/index.js +2 -1
  6. package/dist/features/index.js +5 -2
  7. package/dist/features/parameters/common/hook/use-tabs.d.ts +3 -1
  8. package/dist/features/parameters/common/hook/use-tabs.js +21 -15
  9. package/dist/features/parameters/dynamic-margin-calculation/constants.d.ts +0 -1
  10. package/dist/features/parameters/dynamic-margin-calculation/constants.js +0 -2
  11. package/dist/features/parameters/dynamic-margin-calculation/index.js +1 -2
  12. package/dist/features/parameters/dynamic-margin-calculation/loads-variations-parameters.js +2 -2
  13. package/dist/features/parameters/index.d.ts +1 -0
  14. package/dist/features/parameters/index.js +5 -2
  15. package/dist/features/parameters/loadflow/load-flow-parameters-utils.d.ts +3 -2
  16. package/dist/features/parameters/loadflow/load-flow-parameters-utils.js +22 -3
  17. package/dist/features/parameters/loadflow/use-load-flow-parameters-form.js +14 -29
  18. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-dialog.js +1 -0
  19. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-inline.js +1 -1
  20. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.d.ts +3 -1
  21. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.js +19 -6
  22. package/dist/features/parameters/security-analysis/constants.d.ts +3 -3
  23. package/dist/features/parameters/security-analysis/constants.js +3 -3
  24. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.d.ts +4 -6
  25. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.js +26 -30
  26. package/dist/features/parameters/security-analysis/security-analysis-parameters-dialog.js +2 -1
  27. package/dist/features/parameters/security-analysis/security-analysis-parameters-form.js +1 -3
  28. package/dist/features/parameters/security-analysis/security-analysis-parameters-inline.js +4 -1
  29. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.d.ts +2 -0
  30. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.js +54 -0
  31. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.d.ts +8 -1
  32. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.js +21 -2
  33. package/dist/features/parameters/sensi/sensitivity-parameters-selector.js +9 -8
  34. package/dist/features/parameters/short-circuit/short-circuit-icc-cluster-table-cell.js +1 -1
  35. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.d.ts +1 -0
  36. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.js +27 -2
  37. package/dist/features/parameters/short-circuit/use-short-circuit-parameters-form.js +15 -24
  38. package/dist/features/parameters/voltage-init/use-voltage-init-parameters-form.js +19 -18
  39. package/dist/features/parameters/voltage-init/voltage-init-form-utils.d.ts +2 -0
  40. package/dist/features/parameters/voltage-init/voltage-init-form-utils.js +14 -1
  41. package/dist/features/parameters/voltage-init/voltage-init-parameters-dialog.js +1 -0
  42. package/dist/features/parameters/voltage-init/voltage-init-parameters-form.js +27 -38
  43. package/dist/features/parameters/voltage-init/voltage-init-parameters-inline.js +1 -1
  44. package/dist/features/process-configs/process-configs.type.d.ts +8 -3
  45. package/dist/features/process-configs/security-analysis/update-sa-process-config.js +2 -0
  46. package/dist/features/process-configs/security-analysis/update-sa-process-configs-utils.d.ts +6 -2
  47. package/dist/features/process-configs/security-analysis/update-sa-process-configs-utils.js +17 -9
  48. package/dist/features/process-configs/update-process-config-modifications.js +25 -2
  49. package/dist/index.js +6 -2
  50. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
- import { useState, useCallback, useMemo, useEffect } from "react";
2
+ import { useEffect } from "react";
3
3
  import { FormattedMessage } from "react-intl";
4
4
  import { Tabs, Tab } from "@mui/material";
5
5
  import "@mui/icons-material";
@@ -32,6 +32,7 @@ import "react-resizable-panels";
32
32
  import "react-papaparse";
33
33
  import "../common/parameter-layout/parameter-layout-provider.js";
34
34
  import { CONTINGENCY_LISTS_INFOS } from "../common/constants.js";
35
+ import { getTabStyle } from "../parameters-style.js";
35
36
  import "../common/widget/parameter-line-slider.js";
36
37
  import { LimitReductionsTableForm } from "../common/limitreductions/limit-reductions-table-form.js";
37
38
  import { ContingencyTable } from "../common/contingency-table/contingency-table.js";
@@ -44,61 +45,56 @@ import "../loadflow/load-flow-advanced-parameters.js";
44
45
  import "../loadflow/load-flow-parameters-content.js";
45
46
  import { ViolationsHidingParameters } from "./security-analysis-violations-hiding.js";
46
47
  import { TabValues } from "./constants.js";
47
- const styles = {
48
- tab: {
49
- fontSize: 17,
50
- fontWeight: "bold"
51
- }
52
- };
53
48
  function SecurityAnalysisParametersContent({
54
- params,
55
- currentProvider,
56
- defaultLimitReductions,
49
+ securityAnalysisMethods,
57
50
  showContingencyCount,
58
51
  fetchContingencyCount,
59
52
  contingencyTableApiRef,
60
53
  isBuiltCurrentNode
61
54
  }) {
62
- const [tabSelected, setTabSelected] = useState(TabValues.Contingencies);
63
- const handleTabChange = useCallback((event, newValue) => {
64
- setTabSelected(newValue);
65
- }, []);
66
- const tabValue = useMemo(() => {
67
- return tabSelected === TabValues.LimitReductions && !params?.limitReductions ? TabValues.Contingencies : tabSelected;
68
- }, [params, tabSelected]);
55
+ const {
56
+ params,
57
+ watchProvider,
58
+ defaultLimitReductions,
59
+ selectedTab,
60
+ handleTabChange,
61
+ setSelectedTab,
62
+ tabIndexesWithError
63
+ } = securityAnalysisMethods;
64
+ const currentProvider = watchProvider?.trim();
69
65
  useEffect(() => {
70
- if (currentProvider !== PARAM_PROVIDER_OPENLOADFLOW && tabSelected === TabValues.LimitReductions) {
71
- setTabSelected(TabValues.Contingencies);
66
+ if (currentProvider !== PARAM_PROVIDER_OPENLOADFLOW && selectedTab === TabValues.LimitReductions) {
67
+ setSelectedTab(TabValues.Contingencies);
72
68
  }
73
- }, [currentProvider, tabSelected]);
69
+ }, [currentProvider, selectedTab, setSelectedTab]);
74
70
  return /* @__PURE__ */ jsxs(Fragment, { children: [
75
- /* @__PURE__ */ jsxs(Tabs, { value: tabValue, onChange: handleTabChange, children: [
71
+ /* @__PURE__ */ jsxs(Tabs, { value: selectedTab, onChange: handleTabChange, children: [
76
72
  /* @__PURE__ */ jsx(
77
73
  Tab,
78
74
  {
79
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues[TabValues.Contingencies] }),
75
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues.Contingencies }),
80
76
  value: TabValues.Contingencies,
81
- sx: styles.tab
77
+ sx: getTabStyle(tabIndexesWithError, TabValues.Contingencies)
82
78
  }
83
79
  ),
84
80
  /* @__PURE__ */ jsx(
85
81
  Tab,
86
82
  {
87
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues[TabValues.Aggravation] }),
83
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues.Aggravation }),
88
84
  value: TabValues.Aggravation,
89
- sx: styles.tab
85
+ sx: getTabStyle(tabIndexesWithError, TabValues.Aggravation)
90
86
  }
91
87
  ),
92
88
  currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && /* @__PURE__ */ jsx(
93
89
  Tab,
94
90
  {
95
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues[TabValues.LimitReductions] }),
91
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: TabValues.LimitReductions }),
96
92
  value: TabValues.LimitReductions,
97
- sx: styles.tab
93
+ sx: getTabStyle(tabIndexesWithError, TabValues.LimitReductions)
98
94
  }
99
95
  )
100
96
  ] }),
101
- /* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: TabValues.Contingencies, keepState: true, children: /* @__PURE__ */ jsx(
97
+ /* @__PURE__ */ jsx(TabPanel, { value: selectedTab, index: TabValues.Contingencies, keepState: true, children: /* @__PURE__ */ jsx(
102
98
  ContingencyTable,
103
99
  {
104
100
  name: CONTINGENCY_LISTS_INFOS,
@@ -108,8 +104,8 @@ function SecurityAnalysisParametersContent({
108
104
  ref: contingencyTableApiRef
109
105
  }
110
106
  ) }),
111
- /* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: TabValues.Aggravation, children: /* @__PURE__ */ jsx(ViolationsHidingParameters, {}) }),
112
- /* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: TabValues.LimitReductions, children: currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && /* @__PURE__ */ jsx(LimitReductionsTableForm, { limits: params.limitReductions ?? defaultLimitReductions }) })
107
+ /* @__PURE__ */ jsx(TabPanel, { value: selectedTab, index: TabValues.Aggravation, children: /* @__PURE__ */ jsx(ViolationsHidingParameters, {}) }),
108
+ /* @__PURE__ */ jsx(TabPanel, { value: selectedTab, index: TabValues.LimitReductions, children: currentProvider === PARAM_PROVIDER_OPENLOADFLOW && params?.limitReductions && /* @__PURE__ */ jsx(LimitReductionsTableForm, { limits: params.limitReductions ?? defaultLimitReductions }) })
113
109
  ] });
114
110
  }
115
111
  export {
@@ -71,6 +71,7 @@ function SecurityAnalysisParametersDialog({
71
71
  open,
72
72
  onClose,
73
73
  onSave: securityAnalysisMethods.onSaveDialog,
74
+ onValidationError: securityAnalysisMethods.onValidationError,
74
75
  formContext: {
75
76
  ...securityAnalysisMethods.formMethods,
76
77
  validationSchema: securityAnalysisMethods.formSchema,
@@ -91,7 +92,7 @@ function SecurityAnalysisParametersDialog({
91
92
  {
92
93
  initialElementName: name,
93
94
  activeDirectory,
94
- elementType: ElementType.LOADFLOW_PARAMETERS
95
+ elementType: ElementType.SECURITY_ANALYSIS_PARAMETERS
95
96
  }
96
97
  ) }),
97
98
  securityAnalysisMethods.paramsFormInitialized ? /* @__PURE__ */ jsx(
@@ -50,9 +50,7 @@ function SecurityAnalysisParametersForm({
50
50
  /* @__PURE__ */ jsx(
51
51
  SecurityAnalysisParametersContent,
52
52
  {
53
- params: securityAnalysisMethods.params,
54
- currentProvider: securityAnalysisMethods.watchProvider?.trim(),
55
- defaultLimitReductions: securityAnalysisMethods.defaultLimitReductions,
53
+ securityAnalysisMethods,
56
54
  showContingencyCount,
57
55
  fetchContingencyCount,
58
56
  contingencyTableApiRef,
@@ -96,7 +96,10 @@ function SecurityAnalysisParametersInline({
96
96
  },
97
97
  selectParameterHandler: handleLoadParameter,
98
98
  resetHandler: executeResetAction,
99
- validateHandler: handleSubmit(securityAnalysisMethods.onSaveInline),
99
+ validateHandler: handleSubmit(
100
+ securityAnalysisMethods.onSaveInline,
101
+ securityAnalysisMethods.onValidationError
102
+ ),
100
103
  children: /* @__PURE__ */ jsx(
101
104
  SecurityAnalysisParametersForm,
102
105
  {
@@ -0,0 +1,2 @@
1
+ import { TabValues } from './constants';
2
+ export declare const TAB_FIELDS: Record<TabValues, string[]>;
@@ -0,0 +1,54 @@
1
+ import "react/jsx-runtime";
2
+ import "@mui/material";
3
+ import "@mui/icons-material";
4
+ import "react";
5
+ import "react-intl";
6
+ import "../../../components/ui/overflowableText/OverflowableText.js";
7
+ import "../../../utils/conversionUtils.js";
8
+ import "../../../utils/types/equipmentType.js";
9
+ import "react-hook-form";
10
+ import "localized-countries";
11
+ import "localized-countries/data/fr";
12
+ import "localized-countries/data/en";
13
+ import "notistack";
14
+ import "../../../components/ui/reactHookForm/provider/CustomFormProvider.js";
15
+ import "yup";
16
+ import "../../../components/ui/treeViewFinder/TreeViewFinder.js";
17
+ import "../../../components/ui/reactHookForm/numbers/RangeInput.js";
18
+ import "@material-symbols/svg-400/outlined/left_panel_open.svg?react";
19
+ import "@material-symbols/svg-400/outlined/arrows_output.svg?react";
20
+ import "@material-symbols/svg-400/outlined/arrows_input.svg?react";
21
+ import "@material-symbols/svg-400/outlined/left_panel_close.svg?react";
22
+ import "@material-symbols/svg-400/outlined/add_notes.svg?react";
23
+ import "../../../components/ui/dialogs/descriptionModificationDialog/DescriptionModificationDialog.js";
24
+ import "../../../components/ui/reactHookForm/expandableInput/ExpandableInput.js";
25
+ import "../../../components/ui/reactHookForm/directory-item-input/directory-item-utils.js";
26
+ import "@hello-pangea/dnd";
27
+ import "../../../components/ui/dialogs/elementSaveDialog/ElementSaveDialog.js";
28
+ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
29
+ import "mui-nested-menu";
30
+ import "react-resizable-panels";
31
+ import "react-papaparse";
32
+ import "../common/parameter-layout/parameter-layout-provider.js";
33
+ import { CONTINGENCY_LISTS_INFOS } from "../common/constants.js";
34
+ import "../common/widget/parameter-line-slider.js";
35
+ import { LIMIT_REDUCTIONS_FORM } from "../common/limitreductions/columns-definitions.js";
36
+ import "../common/contingency-table/contingency-table.js";
37
+ import "../common/contingency-table/columns-definitions.js";
38
+ import "@hookform/resolvers/yup";
39
+ import "../../../components/composite/filter/HeaderFilterForm.js";
40
+ import { TabValues, FLOW_PROPORTIONAL_THRESHOLD, LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, LOW_VOLTAGE_ABSOLUTE_THRESHOLD, HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, HIGH_VOLTAGE_ABSOLUTE_THRESHOLD } from "./constants.js";
41
+ const TAB_FIELDS = {
42
+ [TabValues.Contingencies]: [CONTINGENCY_LISTS_INFOS],
43
+ [TabValues.Aggravation]: [
44
+ FLOW_PROPORTIONAL_THRESHOLD,
45
+ LOW_VOLTAGE_PROPORTIONAL_THRESHOLD,
46
+ LOW_VOLTAGE_ABSOLUTE_THRESHOLD,
47
+ HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD,
48
+ HIGH_VOLTAGE_ABSOLUTE_THRESHOLD
49
+ ],
50
+ [TabValues.LimitReductions]: [LIMIT_REDUCTIONS_FORM]
51
+ };
52
+ export {
53
+ TAB_FIELDS
54
+ };
@@ -1,12 +1,17 @@
1
- import { UseFormReturn } from 'react-hook-form';
1
+ import { FieldErrors, UseFormReturn } from 'react-hook-form';
2
2
  import { ObjectSchema } from 'yup';
3
+ import { SyntheticEvent } from 'react';
3
4
  import { UUID } from 'node:crypto';
4
5
  import { ComputingType, UseParametersBackendReturnProps } from '../../../utils';
5
6
  import { ILimitReductionsByVoltageLevel } from '../common';
6
7
  import { SAParametersEnriched } from '../../../utils/types';
8
+ import { TabValues } from './constants';
7
9
  export interface UseSecurityAnalysisParametersFormReturn {
8
10
  formMethods: UseFormReturn;
9
11
  formSchema: ObjectSchema<any>;
12
+ selectedTab: TabValues;
13
+ setSelectedTab: (selectedTab: TabValues) => void;
14
+ handleTabChange: (event: SyntheticEvent, newValue: TabValues) => void;
10
15
  formattedProviders: {
11
16
  id: string;
12
17
  label: string;
@@ -19,5 +24,7 @@ export interface UseSecurityAnalysisParametersFormReturn {
19
24
  paramsFormInitialized: boolean;
20
25
  onSaveInline: (formData: Record<string, any>) => void;
21
26
  onSaveDialog: (formData: Record<string, any>) => void;
27
+ tabIndexesWithError: TabValues[];
28
+ onValidationError: (errors: FieldErrors) => void;
22
29
  }
23
30
  export declare const useSecurityAnalysisParametersForm: (parametersBackend: UseParametersBackendReturnProps<ComputingType.SECURITY_ANALYSIS>, parametersUuid: UUID | null, name: string | null, description: string | null) => UseSecurityAnalysisParametersFormReturn;
@@ -40,12 +40,14 @@ import "../common/widget/parameter-line-slider.js";
40
40
  import { LIMIT_REDUCTIONS_FORM, IST_FORM, LIMIT_DURATION_FORM, toFormValuesLimitReductions } from "../common/limitreductions/columns-definitions.js";
41
41
  import "../common/contingency-table/contingency-table.js";
42
42
  import "../common/contingency-table/columns-definitions.js";
43
+ import { useTabs } from "../common/hook/use-tabs.js";
43
44
  import "../../../components/composite/filter/HeaderFilterForm.js";
44
45
  import { getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
45
46
  import { getSAParametersFormSchema, toFormValueSaParameters } from "./columns-definitions.js";
46
47
  import { ACTIVATED, DESCRIPTION, NAME, ID } from "../common/parameter-table-field/constants.js";
47
48
  import "react-dom";
48
- import { HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, LOW_VOLTAGE_ABSOLUTE_THRESHOLD, LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, FLOW_PROPORTIONAL_THRESHOLD } from "./constants.js";
49
+ import { TAB_FIELDS } from "./security-analysis-parameters-utils.js";
50
+ import { HIGH_VOLTAGE_ABSOLUTE_THRESHOLD, HIGH_VOLTAGE_PROPORTIONAL_THRESHOLD, LOW_VOLTAGE_ABSOLUTE_THRESHOLD, LOW_VOLTAGE_PROPORTIONAL_THRESHOLD, FLOW_PROPORTIONAL_THRESHOLD, TabValues } from "./constants.js";
49
51
  const useSecurityAnalysisParametersForm = (parametersBackend, parametersUuid, name, description) => {
50
52
  const { providers, params, updateParameters, defaultLimitReductions } = parametersBackend;
51
53
  const previousWatchProviderRef = useRef(void 0);
@@ -129,6 +131,18 @@ const useSecurityAnalysisParametersForm = (parametersBackend, parametersUuid, na
129
131
  },
130
132
  [toContingencyListsInfos, toLimitReductions]
131
133
  );
134
+ const {
135
+ selectedTab,
136
+ setSelectedTab,
137
+ onTabChange: handleTabChange,
138
+ tabsWithError: tabIndexesWithError,
139
+ onError: onValidationError
140
+ } = useTabs({
141
+ defaultTab: TabValues.Contingencies,
142
+ tabEnum: TabValues,
143
+ errors: formMethods.formState.errors,
144
+ tabFields: TAB_FIELDS
145
+ });
132
146
  const onSaveInline = useCallback(
133
147
  (formData) => {
134
148
  updateParameters(formatNewParams(formData));
@@ -175,6 +189,9 @@ const useSecurityAnalysisParametersForm = (parametersBackend, parametersUuid, na
175
189
  return {
176
190
  formMethods,
177
191
  formSchema,
192
+ selectedTab,
193
+ setSelectedTab,
194
+ handleTabChange,
178
195
  formattedProviders,
179
196
  defaultLimitReductions,
180
197
  toFormValueSaParameters,
@@ -183,7 +200,9 @@ const useSecurityAnalysisParametersForm = (parametersBackend, parametersUuid, na
183
200
  watchProvider,
184
201
  paramsFormInitialized,
185
202
  onSaveInline,
186
- onSaveDialog
203
+ onSaveDialog,
204
+ tabIndexesWithError,
205
+ onValidationError
187
206
  };
188
207
  };
189
208
  export {
@@ -9,6 +9,7 @@ import { TabPanel } from "../common/parameters.js";
9
9
  import "../../../components/ui/overflowableText/OverflowableText.js";
10
10
  import "../../../utils/conversionUtils.js";
11
11
  import "../../../utils/types/equipmentType.js";
12
+ import { mergeSx } from "../../../utils/styles.js";
12
13
  import "localized-countries";
13
14
  import "localized-countries/data/fr";
14
15
  import "localized-countries/data/en";
@@ -32,6 +33,7 @@ import "mui-nested-menu";
32
33
  import "react-resizable-panels";
33
34
  import "react-papaparse";
34
35
  import "../common/parameter-layout/parameter-layout-provider.js";
36
+ import { parametersStyles } from "../parameters-style.js";
35
37
  import "../common/widget/parameter-line-slider.js";
36
38
  import "../common/contingency-table/contingency-table.js";
37
39
  import "../common/contingency-table/columns-definitions.js";
@@ -217,14 +219,13 @@ function SensitivityParametersSelector({
217
219
  Tab,
218
220
  {
219
221
  value: subIndex,
220
- sx: {
221
- fontWeight: "bold",
222
- textTransform: "capitalize",
223
- ...subTabHasError[subIndex] && subIndex !== subTabValue && {
224
- color: "error.main",
225
- "&.Mui-selected": { color: "error.main" }
226
- }
227
- },
222
+ sx: mergeSx(
223
+ {
224
+ fontWeight: "bold",
225
+ textTransform: "capitalize"
226
+ },
227
+ subTabHasError[subIndex] && subIndex !== subTabValue ? parametersStyles.tabWithError : void 0
228
+ ),
228
229
  label: /* @__PURE__ */ jsx(FormattedMessage, { id: subTab.label })
229
230
  },
230
231
  subTab.label
@@ -40,7 +40,7 @@ function ShortCircuitIccClusterTableCell({
40
40
  column,
41
41
  inputsDisabled
42
42
  }) {
43
- return /* @__PURE__ */ jsxs(TableCell, { align: "center", sx: { fontWeight: "bold" }, children: [
43
+ return /* @__PURE__ */ jsxs(TableCell, { children: [
44
44
  column.dataKey === SHORT_CIRCUIT_ICC_CLUSTER_ACTIVE && /* @__PURE__ */ jsx(SwitchInput, { formProps: { size: "small" }, name: `${formName}[${rowIndex}].${column.dataKey}` }),
45
45
  column.dataKey === SHORT_CIRCUIT_ICC_CLUSTER_FILTERS && /* @__PURE__ */ jsx(
46
46
  DirectoryItemsInput,
@@ -13,6 +13,7 @@ export declare enum ShortCircuitParametersTabValues {
13
13
  STUDY_AREA = "StudyArea",
14
14
  POWER_ELECTRONICS = "PowerElectronics"
15
15
  }
16
+ export declare const TAB_FIELDS: Record<ShortCircuitParametersTabValues, string[]>;
16
17
  export declare const getCommonShortCircuitParametersFormSchema: () => yup.ObjectSchema<{
17
18
  commonParameters: {
18
19
  withFeederResult: NonNullable<boolean | undefined>;
@@ -1,5 +1,5 @@
1
1
  import * as yup from "yup";
2
- import { SHORT_CIRCUIT_POWER_ELECTRONICS_MATERIALS, SHORT_CIRCUIT_POWER_ELECTRONICS_CLUSTERS, NODE_CLUSTER, NODE_CLUSTER_FILTER_IDS, SHORT_CIRCUIT_INITIAL_VOLTAGE_PROFILE_MODE, InitialVoltage, SHORT_CIRCUIT_WITH_NEUTRAL_POSITION, SHORT_CIRCUIT_WITH_SHUNT_COMPENSATORS, SHORT_CIRCUIT_WITH_VSC_CONVERTER_STATIONS, SHORT_CIRCUIT_WITH_LOADS, SHORT_CIRCUIT_WITH_FEEDER_RESULT } from "./constants.js";
2
+ import { SHORT_CIRCUIT_MODEL_POWER_ELECTRONICS, SHORT_CIRCUIT_POWER_ELECTRONICS_MATERIALS, SHORT_CIRCUIT_POWER_ELECTRONICS_CLUSTERS, NODE_CLUSTER_FILTER_IDS, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_IN_CALCULATION_CLUSTER, STARTED_GENERATORS_IN_CALCULATION_CLUSTER_THRESHOLD, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER, STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER_THRESHOLD, SHORT_CIRCUIT_PREDEFINED_PARAMS, NODE_CLUSTER, SHORT_CIRCUIT_INITIAL_VOLTAGE_PROFILE_MODE, InitialVoltage, SHORT_CIRCUIT_WITH_NEUTRAL_POSITION, SHORT_CIRCUIT_WITH_SHUNT_COMPENSATORS, SHORT_CIRCUIT_WITH_VSC_CONVERTER_STATIONS, SHORT_CIRCUIT_WITH_LOADS, SHORT_CIRCUIT_WITH_FEEDER_RESULT } from "./constants.js";
3
3
  import "react/jsx-runtime";
4
4
  import "@mui/material";
5
5
  import "@mui/icons-material";
@@ -35,7 +35,7 @@ import "mui-nested-menu";
35
35
  import "react-resizable-panels";
36
36
  import "react-papaparse";
37
37
  import "../common/parameter-layout/parameter-layout-provider.js";
38
- import { COMMON_PARAMETERS, SPECIFIC_PARAMETERS } from "../common/constants.js";
38
+ import { SPECIFIC_PARAMETERS, PROVIDER, COMMON_PARAMETERS } from "../common/constants.js";
39
39
  import "../common/widget/parameter-line-slider.js";
40
40
  import "../common/contingency-table/contingency-table.js";
41
41
  import "../common/contingency-table/columns-definitions.js";
@@ -48,6 +48,30 @@ var ShortCircuitParametersTabValues = /* @__PURE__ */ ((ShortCircuitParametersTa
48
48
  ShortCircuitParametersTabValues2["POWER_ELECTRONICS"] = "PowerElectronics";
49
49
  return ShortCircuitParametersTabValues2;
50
50
  })(ShortCircuitParametersTabValues || {});
51
+ const TAB_FIELDS = {
52
+ [
53
+ "General"
54
+ /* GENERAL */
55
+ ]: [PROVIDER, SHORT_CIRCUIT_PREDEFINED_PARAMS, COMMON_PARAMETERS],
56
+ [
57
+ "StudyArea"
58
+ /* STUDY_AREA */
59
+ ]: [
60
+ `${SPECIFIC_PARAMETERS}.${NODE_CLUSTER_FILTER_IDS}`,
61
+ `${SPECIFIC_PARAMETERS}.${SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_IN_CALCULATION_CLUSTER}`,
62
+ `${SPECIFIC_PARAMETERS}.${STARTED_GENERATORS_IN_CALCULATION_CLUSTER_THRESHOLD}`,
63
+ `${SPECIFIC_PARAMETERS}.${SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER}`,
64
+ `${SPECIFIC_PARAMETERS}.${STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER_THRESHOLD}`
65
+ ],
66
+ [
67
+ "PowerElectronics"
68
+ /* POWER_ELECTRONICS */
69
+ ]: [
70
+ `${SPECIFIC_PARAMETERS}.${SHORT_CIRCUIT_MODEL_POWER_ELECTRONICS}`,
71
+ `${SPECIFIC_PARAMETERS}.${SHORT_CIRCUIT_POWER_ELECTRONICS_MATERIALS}`,
72
+ `${SPECIFIC_PARAMETERS}.${SHORT_CIRCUIT_POWER_ELECTRONICS_CLUSTERS}`
73
+ ]
74
+ };
51
75
  const getCommonShortCircuitParametersFormSchema = () => {
52
76
  return yup.object().shape({
53
77
  [COMMON_PARAMETERS]: yup.object().shape({
@@ -289,6 +313,7 @@ const formatShortCircuitSpecificParameters = (specificParametersDescriptionForPr
289
313
  };
290
314
  export {
291
315
  ShortCircuitParametersTabValues,
316
+ TAB_FIELDS,
292
317
  formatShortCircuitSpecificParameters,
293
318
  getCommonShortCircuitParametersFormSchema,
294
319
  getDefaultShortCircuitSpecificParamsValues,
@@ -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";
@@ -34,7 +34,7 @@ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
34
34
  import "mui-nested-menu";
35
35
  import "react-resizable-panels";
36
36
  import "react-papaparse";
37
- import { SHORT_CIRCUIT_PREDEFINED_PARAMS, PredefinedParameters, SHORT_CIRCUIT_WITH_LOADS, SHORT_CIRCUIT_WITH_VSC_CONVERTER_STATIONS, SHORT_CIRCUIT_WITH_SHUNT_COMPENSATORS, SHORT_CIRCUIT_WITH_NEUTRAL_POSITION, SHORT_CIRCUIT_INITIAL_VOLTAGE_PROFILE_MODE, InitialVoltage, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_IN_CALCULATION_CLUSTER, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER, SHORT_CIRCUIT_VOLTAGE_RANGES, SHORT_CIRCUIT_POWER_ELECTRONICS_MATERIALS, SHORT_CIRCUIT_POWER_ELECTRONICS_CLUSTERS, NODE_CLUSTER_FILTER_IDS } from "./constants.js";
37
+ import { SHORT_CIRCUIT_PREDEFINED_PARAMS, PredefinedParameters, SHORT_CIRCUIT_WITH_LOADS, SHORT_CIRCUIT_WITH_VSC_CONVERTER_STATIONS, SHORT_CIRCUIT_WITH_SHUNT_COMPENSATORS, SHORT_CIRCUIT_WITH_NEUTRAL_POSITION, SHORT_CIRCUIT_INITIAL_VOLTAGE_PROFILE_MODE, InitialVoltage, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_IN_CALCULATION_CLUSTER, SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER, SHORT_CIRCUIT_VOLTAGE_RANGES } from "./constants.js";
38
38
  import "../../../components/composite/filter/HeaderFilterForm.js";
39
39
  import { getNameElementEditorSchema, getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
40
40
  import "../common/parameter-layout/parameter-layout-provider.js";
@@ -42,7 +42,8 @@ import { SPECIFIC_PARAMETERS, COMMON_PARAMETERS, VERSION_PARAMETER, PROVIDER } f
42
42
  import "../common/widget/parameter-line-slider.js";
43
43
  import "../common/contingency-table/contingency-table.js";
44
44
  import "../common/contingency-table/columns-definitions.js";
45
- import { ShortCircuitParametersTabValues, getDefaultShortCircuitSpecificParamsValues, getSpecificShortCircuitParametersFormSchema, getCommonShortCircuitParametersFormSchema, getShortCircuitSpecificParametersValues, formatShortCircuitSpecificParameters } from "./short-circuit-parameters-utils.js";
45
+ import { useTabs } from "../common/hook/use-tabs.js";
46
+ import { getDefaultShortCircuitSpecificParamsValues, getSpecificShortCircuitParametersFormSchema, getCommonShortCircuitParametersFormSchema, getShortCircuitSpecificParametersValues, formatShortCircuitSpecificParameters, ShortCircuitParametersTabValues, TAB_FIELDS } from "./short-circuit-parameters-utils.js";
46
47
  const useShortCircuitParametersForm = ({
47
48
  parametersBackend,
48
49
  parametersUuid,
@@ -51,15 +52,8 @@ const useShortCircuitParametersForm = ({
51
52
  }) => {
52
53
  const { params, updateParameters, specificParamsDescription } = parametersBackend;
53
54
  const provider = params?.provider;
54
- const [selectedTab, setSelectedTab] = useState(
55
- ShortCircuitParametersTabValues.GENERAL
56
- );
57
- const [tabIndexesWithError, setTabIndexesWithError] = useState([]);
58
55
  const [paramsLoaded, setParamsLoaded] = useState(false);
59
56
  const { snackError } = useSnackMessage();
60
- const handleTabChange = useCallback((event, newValue) => {
61
- setSelectedTab(newValue);
62
- }, []);
63
57
  const specificParametersDescriptionForProvider = useMemo(() => {
64
58
  return provider && specificParamsDescription?.[provider] ? specificParamsDescription[provider] : [];
65
59
  }, [provider, specificParamsDescription]);
@@ -181,20 +175,17 @@ const useShortCircuitParametersForm = ({
181
175
  },
182
176
  [provider, snackError, specificParametersDescriptionForProvider]
183
177
  );
184
- const onValidationError = useCallback(
185
- (_errors) => {
186
- console.error("onValidationError: ", _errors);
187
- const tabsInError = [];
188
- if ((_errors?.[SHORT_CIRCUIT_POWER_ELECTRONICS_MATERIALS] || _errors?.[SHORT_CIRCUIT_POWER_ELECTRONICS_CLUSTERS]) && ShortCircuitParametersTabValues.POWER_ELECTRONICS !== selectedTab) {
189
- tabsInError.push(ShortCircuitParametersTabValues.POWER_ELECTRONICS);
190
- }
191
- if ((_errors?.[SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_IN_CALCULATION_CLUSTER] || _errors?.[SHORT_CIRCUIT_ONLY_STARTED_GENERATORS_OUTSIDE_CALCULATION_CLUSTER] || _errors?.[NODE_CLUSTER_FILTER_IDS]) && ShortCircuitParametersTabValues.STUDY_AREA !== selectedTab) {
192
- tabsInError.push(ShortCircuitParametersTabValues.STUDY_AREA);
193
- }
194
- setTabIndexesWithError(tabsInError);
195
- },
196
- [selectedTab]
197
- );
178
+ const {
179
+ selectedTab,
180
+ onTabChange: handleTabChange,
181
+ tabsWithError: tabIndexesWithError,
182
+ onError: onValidationError
183
+ } = useTabs({
184
+ defaultTab: ShortCircuitParametersTabValues.GENERAL,
185
+ tabEnum: ShortCircuitParametersTabValues,
186
+ errors: formMethods.formState.errors,
187
+ tabFields: TAB_FIELDS
188
+ });
198
189
  const onSaveInline = useCallback(
199
190
  (formData) => {
200
191
  const data = formatNewParams(formData);
@@ -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";
@@ -38,12 +38,17 @@ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
38
38
  import "mui-nested-menu";
39
39
  import "react-resizable-panels";
40
40
  import "react-papaparse";
41
- import { VoltageInitTabValues, VARIABLE_SHUNT_COMPENSATORS, SHUNT_COMPENSATORS_SELECTION_TYPE, VARIABLE_TRANSFORMERS, TRANSFORMERS_SELECTION_TYPE, VARIABLE_Q_GENERATORS, GENERATORS_SELECTION_TYPE, VOLTAGE_LIMITS_DEFAULT, HIGH_VOLTAGE_LIMIT, LOW_VOLTAGE_LIMIT, VOLTAGE_LIMITS_MODIFICATION, SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, REACTIVE_SLACKS_THRESHOLD, UPDATE_BUS_VOLTAGE, GENERAL_APPLY_MODIFICATIONS, DEFAULT_SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, DEFAULT_REACTIVE_SLACKS_THRESHOLD, DEFAULT_UPDATE_BUS_VOLTAGE, DEFAULT_GENERAL_APPLY_MODIFICATIONS, GENERAL } from "./constants.js";
41
+ import { VARIABLE_SHUNT_COMPENSATORS, SHUNT_COMPENSATORS_SELECTION_TYPE, VARIABLE_TRANSFORMERS, TRANSFORMERS_SELECTION_TYPE, VARIABLE_Q_GENERATORS, GENERATORS_SELECTION_TYPE, VOLTAGE_LIMITS_DEFAULT, HIGH_VOLTAGE_LIMIT, LOW_VOLTAGE_LIMIT, VOLTAGE_LIMITS_MODIFICATION, VoltageInitTabValues, SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, REACTIVE_SLACKS_THRESHOLD, UPDATE_BUS_VOLTAGE, GENERAL_APPLY_MODIFICATIONS, DEFAULT_SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, DEFAULT_REACTIVE_SLACKS_THRESHOLD, DEFAULT_UPDATE_BUS_VOLTAGE, DEFAULT_GENERAL_APPLY_MODIFICATIONS } from "./constants.js";
42
42
  import "../../../components/composite/filter/HeaderFilterForm.js";
43
43
  import { getNameElementEditorSchema, getNameElementEditorEmptyFormData } from "../common/name-element-editor/name-element-editor-utils.js";
44
- import { fromVoltageInitParametersFormToParamValues, fromVoltageInitParamsDataToFormValues, fromStudyVoltageInitParamsDataToFormValues } from "./voltage-init-form-utils.js";
44
+ import { TAB_FIELDS, fromVoltageInitParametersFormToParamValues, fromVoltageInitParamsDataToFormValues, fromStudyVoltageInitParamsDataToFormValues } from "./voltage-init-form-utils.js";
45
45
  import "react-dom";
46
46
  import { SELECTED } from "../../../components/composite/dnd-table/dnd-table.type.js";
47
+ import "../common/parameter-layout/parameter-layout-provider.js";
48
+ import "../common/widget/parameter-line-slider.js";
49
+ import "../common/contingency-table/contingency-table.js";
50
+ import "../common/contingency-table/columns-definitions.js";
51
+ import { useTabs } from "../common/hook/use-tabs.js";
47
52
  const useVoltageInitParametersForm = ({
48
53
  parametersUuid,
49
54
  name,
@@ -51,13 +56,8 @@ const useVoltageInitParametersForm = ({
51
56
  studyUuid,
52
57
  parameters
53
58
  }) => {
54
- const [selectedTab, setSelectedTab] = useState(VoltageInitTabValues.GENERAL);
55
59
  const [paramsLoading, setParamsLoading] = useState(false);
56
- const [tabIndexesWithError, setTabIndexesWithError] = useState([]);
57
60
  const { snackError } = useSnackMessage();
58
- const handleTabChange = useCallback((_event, newValue) => {
59
- setSelectedTab(newValue);
60
- }, []);
61
61
  const formSchema = useMemo(() => {
62
62
  return yup.object({
63
63
  [VoltageInitTabValues.GENERAL]: yup.object().shape({
@@ -140,16 +140,17 @@ const useVoltageInitParametersForm = ({
140
140
  resolver: yupResolver(formSchema)
141
141
  });
142
142
  const { reset } = formMethods;
143
- const onValidationError = useCallback(
144
- (errors) => {
145
- const tabsInError = [];
146
- if (errors?.[GENERAL] && VoltageInitTabValues.GENERAL !== selectedTab) {
147
- tabsInError.push(VoltageInitTabValues.GENERAL);
148
- }
149
- setTabIndexesWithError(tabsInError);
150
- },
151
- [selectedTab]
152
- );
143
+ const {
144
+ selectedTab,
145
+ onTabChange: handleTabChange,
146
+ tabsWithError: tabIndexesWithError,
147
+ onError: onValidationError
148
+ } = useTabs({
149
+ defaultTab: VoltageInitTabValues.GENERAL,
150
+ tabEnum: VoltageInitTabValues,
151
+ errors: formMethods.formState.errors,
152
+ tabFields: TAB_FIELDS
153
+ });
153
154
  const onSaveInline = useCallback(
154
155
  (formData) => {
155
156
  if (studyUuid) {
@@ -1,4 +1,6 @@
1
1
  import { VoltageInitParameters, VoltageInitStudyParameters } from './voltage-init.type';
2
+ import { VoltageInitTabValues as TabValues } from './constants';
3
+ export declare const TAB_FIELDS: Record<TabValues, string[]>;
2
4
  export declare const fromVoltageInitParametersFormToParamValues: (newParams: Record<string, any>) => VoltageInitStudyParameters;
3
5
  export declare const fromVoltageInitParamsDataToFormValues: (parameters: VoltageInitParameters) => Record<string, any>;
4
6
  export declare const fromStudyVoltageInitParamsDataToFormValues: (parameters: VoltageInitStudyParameters) => Record<string, any>;
@@ -1,5 +1,5 @@
1
1
  import { EquipmentsSelectionType } from "./voltage-init.type.js";
2
- import { DEFAULT_UPDATE_BUS_VOLTAGE, VARIABLE_SHUNT_COMPENSATORS, SHUNT_COMPENSATORS_SELECTION_TYPE, VARIABLE_TRANSFORMERS, TRANSFORMERS_SELECTION_TYPE, VARIABLE_Q_GENERATORS, GENERATORS_SELECTION_TYPE, VOLTAGE_LIMITS_DEFAULT, HIGH_VOLTAGE_LIMIT, LOW_VOLTAGE_LIMIT, VOLTAGE_LIMITS_MODIFICATION, VoltageInitTabValues, SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, REACTIVE_SLACKS_THRESHOLD, UPDATE_BUS_VOLTAGE, GENERAL_APPLY_MODIFICATIONS, DEFAULT_SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, DEFAULT_REACTIVE_SLACKS_THRESHOLD, DEFAULT_GENERAL_APPLY_MODIFICATIONS, PRIORITY } from "./constants.js";
2
+ import { VoltageInitTabValues, TRANSFORMERS_SELECTION_TYPE, VARIABLE_TRANSFORMERS, SHUNT_COMPENSATORS_SELECTION_TYPE, VARIABLE_SHUNT_COMPENSATORS, GENERATORS_SELECTION_TYPE, VARIABLE_Q_GENERATORS, VOLTAGE_LIMITS_MODIFICATION, VOLTAGE_LIMITS_DEFAULT, DEFAULT_UPDATE_BUS_VOLTAGE, HIGH_VOLTAGE_LIMIT, LOW_VOLTAGE_LIMIT, SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, REACTIVE_SLACKS_THRESHOLD, UPDATE_BUS_VOLTAGE, GENERAL_APPLY_MODIFICATIONS, DEFAULT_SHUNT_COMPENSATOR_ACTIVATION_THRESHOLD, DEFAULT_REACTIVE_SLACKS_THRESHOLD, DEFAULT_GENERAL_APPLY_MODIFICATIONS, PRIORITY } from "./constants.js";
3
3
  import "react/jsx-runtime";
4
4
  import "@mui/material";
5
5
  import "@mui/icons-material";
@@ -35,6 +35,18 @@ import "react-resizable-panels";
35
35
  import "react-papaparse";
36
36
  import "react-dom";
37
37
  import { SELECTED } from "../../../components/composite/dnd-table/dnd-table.type.js";
38
+ const TAB_FIELDS = {
39
+ [VoltageInitTabValues.GENERAL]: [VoltageInitTabValues.GENERAL],
40
+ [VoltageInitTabValues.VOLTAGE_LIMITS]: [VOLTAGE_LIMITS_MODIFICATION, VOLTAGE_LIMITS_DEFAULT],
41
+ [VoltageInitTabValues.EQUIPMENTS_SELECTION]: [
42
+ TRANSFORMERS_SELECTION_TYPE,
43
+ VARIABLE_TRANSFORMERS,
44
+ SHUNT_COMPENSATORS_SELECTION_TYPE,
45
+ VARIABLE_SHUNT_COMPENSATORS,
46
+ GENERATORS_SELECTION_TYPE,
47
+ VARIABLE_Q_GENERATORS
48
+ ]
49
+ };
38
50
  const fromVoltageInitParametersFormToParamValues = (newParams) => {
39
51
  return {
40
52
  applyModifications: newParams?.[VoltageInitTabValues.GENERAL]?.[GENERAL_APPLY_MODIFICATIONS] ?? DEFAULT_GENERAL_APPLY_MODIFICATIONS,
@@ -209,6 +221,7 @@ const fromStudyVoltageInitParamsDataToFormValues = (parameters) => {
209
221
  };
210
222
  };
211
223
  export {
224
+ TAB_FIELDS,
212
225
  fromStudyVoltageInitParamsDataToFormValues,
213
226
  fromVoltageInitParametersFormToParamValues,
214
227
  fromVoltageInitParamsDataToFormValues
@@ -61,6 +61,7 @@ function VoltageInitParametersEditionDialog({
61
61
  open,
62
62
  onClose,
63
63
  onSave: voltageInitMethods.onSaveDialog,
64
+ onValidationError: voltageInitMethods.onValidationError,
64
65
  titleId,
65
66
  formContext: {
66
67
  ...voltageInitMethods.formMethods,