@gridsuite/commons-ui 0.250.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 (37) hide show
  1. package/dist/features/index.js +4 -0
  2. package/dist/features/parameters/common/hook/use-tabs.d.ts +3 -1
  3. package/dist/features/parameters/common/hook/use-tabs.js +21 -15
  4. package/dist/features/parameters/index.d.ts +1 -0
  5. package/dist/features/parameters/index.js +4 -0
  6. package/dist/features/parameters/loadflow/load-flow-parameters-utils.d.ts +3 -2
  7. package/dist/features/parameters/loadflow/load-flow-parameters-utils.js +22 -3
  8. package/dist/features/parameters/loadflow/use-load-flow-parameters-form.js +14 -29
  9. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-dialog.js +1 -0
  10. package/dist/features/parameters/network-visualizations/network-visualizations-parameters-inline.js +1 -1
  11. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.d.ts +3 -1
  12. package/dist/features/parameters/network-visualizations/use-network-visualizations-parameters-form.js +19 -6
  13. package/dist/features/parameters/security-analysis/constants.d.ts +3 -3
  14. package/dist/features/parameters/security-analysis/constants.js +3 -3
  15. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.d.ts +4 -6
  16. package/dist/features/parameters/security-analysis/security-analysis-parameters-content.js +26 -30
  17. package/dist/features/parameters/security-analysis/security-analysis-parameters-dialog.js +2 -1
  18. package/dist/features/parameters/security-analysis/security-analysis-parameters-form.js +1 -3
  19. package/dist/features/parameters/security-analysis/security-analysis-parameters-inline.js +4 -1
  20. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.d.ts +2 -0
  21. package/dist/features/parameters/security-analysis/security-analysis-parameters-utils.js +54 -0
  22. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.d.ts +8 -1
  23. package/dist/features/parameters/security-analysis/use-security-analysis-parameters-form.js +21 -2
  24. package/dist/features/parameters/sensi/sensitivity-parameters-selector.js +9 -8
  25. package/dist/features/parameters/short-circuit/short-circuit-icc-cluster-table-cell.js +1 -1
  26. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.d.ts +1 -0
  27. package/dist/features/parameters/short-circuit/short-circuit-parameters-utils.js +27 -2
  28. package/dist/features/parameters/short-circuit/use-short-circuit-parameters-form.js +15 -24
  29. package/dist/features/parameters/voltage-init/use-voltage-init-parameters-form.js +19 -18
  30. package/dist/features/parameters/voltage-init/voltage-init-form-utils.d.ts +2 -0
  31. package/dist/features/parameters/voltage-init/voltage-init-form-utils.js +14 -1
  32. package/dist/features/parameters/voltage-init/voltage-init-parameters-dialog.js +1 -0
  33. package/dist/features/parameters/voltage-init/voltage-init-parameters-form.js +27 -38
  34. package/dist/features/parameters/voltage-init/voltage-init-parameters-inline.js +1 -1
  35. package/dist/features/process-configs/security-analysis/update-sa-process-config.js +2 -0
  36. package/dist/index.js +4 -0
  37. package/package.json +1 -1
@@ -69,6 +69,7 @@ import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION }
69
69
  import { DynamicSecurityAnalysisInline } from "./parameters/dynamic-security-analysis/dynamic-security-analysis-inline.js";
70
70
  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 "./parameters/dynamic-margin-calculation/constants.js";
71
71
  import { DynamicMarginCalculationInline } from "./parameters/dynamic-margin-calculation/dynamic-margin-calculation-inline.js";
72
+ import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./parameters/parameters-style.js";
72
73
  import { filledTextField, italicFontTextField, standardTextField } from "./network-modifications/common/form.utils.js";
73
74
  import { PropertiesForm } from "./network-modifications/common/properties/PropertiesForm.js";
74
75
  import { PropertyForm } from "./network-modifications/common/properties/PropertyForm.js";
@@ -719,6 +720,8 @@ export {
719
720
  getShortCircuitEmptyFormData,
720
721
  getShortCircuitFormData,
721
722
  getShortCircuitFormSchema,
723
+ getTabIndicatorStyle,
724
+ getTabStyle,
722
725
  getVoltageRegulationEmptyFormData,
723
726
  getVoltageRegulationSchema,
724
727
  handlePostSortRows,
@@ -765,6 +768,7 @@ export {
765
768
  networkModificationTableStyles,
766
769
  newEquipmentDeletionDto,
767
770
  onlyStartedGeneratorsOptions,
771
+ parametersStyles,
768
772
  removeUuidsFromTree,
769
773
  sanitizeLimitNames,
770
774
  sanitizeLimitsGroups,
@@ -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>;
@@ -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,
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { Stack, Tabs, Tab, Grid2 } from "@mui/material";
3
3
  import { FormattedMessage } from "react-intl";
4
- import { parametersStyles, getTabStyle, getTabIndicatorStyle } from "../parameters-style.js";
4
+ import { parametersStyles, getTabStyle } from "../parameters-style.js";
5
5
  import "@mui/icons-material";
6
6
  import "react";
7
7
  import { TabPanel } from "../common/parameters.js";
@@ -47,43 +47,32 @@ function VoltageInitParametersForm({
47
47
  }) {
48
48
  const { selectedTab, handleTabChange, tabIndexesWithError } = voltageInitMethods;
49
49
  return /* @__PURE__ */ jsxs(Stack, { sx: parametersStyles.scrollableGrid, children: [
50
- /* @__PURE__ */ jsxs(
51
- Tabs,
52
- {
53
- value: selectedTab,
54
- variant: "scrollable",
55
- onChange: handleTabChange,
56
- TabIndicatorProps: {
57
- sx: getTabIndicatorStyle(tabIndexesWithError, selectedTab)
58
- },
59
- children: [
60
- /* @__PURE__ */ jsx(
61
- Tab,
62
- {
63
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: "VoltageInitParametersGeneralTabLabel" }),
64
- value: VoltageInitTabValues.GENERAL,
65
- sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.GENERAL)
66
- }
67
- ),
68
- /* @__PURE__ */ jsx(
69
- Tab,
70
- {
71
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: "VoltageLimits" }),
72
- value: VoltageInitTabValues.VOLTAGE_LIMITS,
73
- sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.VOLTAGE_LIMITS)
74
- }
75
- ),
76
- /* @__PURE__ */ jsx(
77
- Tab,
78
- {
79
- label: /* @__PURE__ */ jsx(FormattedMessage, { id: "EquipmentSelection" }),
80
- value: VoltageInitTabValues.EQUIPMENTS_SELECTION,
81
- sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.EQUIPMENTS_SELECTION)
82
- }
83
- )
84
- ]
85
- }
86
- ),
50
+ /* @__PURE__ */ jsxs(Tabs, { value: selectedTab, variant: "scrollable", onChange: handleTabChange, children: [
51
+ /* @__PURE__ */ jsx(
52
+ Tab,
53
+ {
54
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: "VoltageInitParametersGeneralTabLabel" }),
55
+ value: VoltageInitTabValues.GENERAL,
56
+ sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.GENERAL)
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx(
60
+ Tab,
61
+ {
62
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: "VoltageLimits" }),
63
+ value: VoltageInitTabValues.VOLTAGE_LIMITS,
64
+ sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.VOLTAGE_LIMITS)
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsx(
68
+ Tab,
69
+ {
70
+ label: /* @__PURE__ */ jsx(FormattedMessage, { id: "EquipmentSelection" }),
71
+ value: VoltageInitTabValues.EQUIPMENTS_SELECTION,
72
+ sx: getTabStyle(tabIndexesWithError, VoltageInitTabValues.EQUIPMENTS_SELECTION)
73
+ }
74
+ )
75
+ ] }),
87
76
  /* @__PURE__ */ jsxs(Grid2, { container: true, children: [
88
77
  /* @__PURE__ */ jsx(TabPanel, { value: selectedTab, index: VoltageInitTabValues.GENERAL, children: /* @__PURE__ */ jsx(GeneralParameters, { withApplyModifications: !!showActionsButtons }) }),
89
78
  /* @__PURE__ */ jsx(TabPanel, { value: selectedTab, index: VoltageInitTabValues.VOLTAGE_LIMITS, children: /* @__PURE__ */ jsx(VoltageLimitsParameters, {}) }),
@@ -104,7 +104,7 @@ function VoltageInitParametersInLine({
104
104
  },
105
105
  selectParameterHandler: handleLoadParameters,
106
106
  resetHandler: resetVoltageInitParameters,
107
- validateHandler: handleSubmit(voltageInitMethods.onSaveInline),
107
+ validateHandler: handleSubmit(voltageInitMethods.onSaveInline, voltageInitMethods.onValidationError),
108
108
  children: /* @__PURE__ */ jsx(VoltageInitParametersForm, { voltageInitMethods, showActionsButtons: true })
109
109
  }
110
110
  )
@@ -44,7 +44,9 @@ import "../../parameters/loadflow/load-flow-parameters-context.js";
44
44
  import "../../parameters/loadflow/load-flow-advanced-parameters.js";
45
45
  import "../../parameters/loadflow/load-flow-parameters-content.js";
46
46
  import "../../parameters/short-circuit/short-circuit-parameters-content.js";
47
+ import "../../parameters/voltage-init/voltage-init-form-utils.js";
47
48
  import "react-dom";
49
+ import "../../parameters/security-analysis/security-analysis-parameters-utils.js";
48
50
  import "../../parameters/sensi/utils.js";
49
51
  import "../../parameters/sensi/columns-definitions.js";
50
52
  import "../../parameters/dynamic-simulation/use-dynamic-simulation-parameters-form.js";
package/dist/index.js CHANGED
@@ -227,6 +227,7 @@ import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION }
227
227
  import { DynamicSecurityAnalysisInline } from "./features/parameters/dynamic-security-analysis/dynamic-security-analysis-inline.js";
228
228
  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 "./features/parameters/dynamic-margin-calculation/constants.js";
229
229
  import { DynamicMarginCalculationInline } from "./features/parameters/dynamic-margin-calculation/dynamic-margin-calculation-inline.js";
230
+ import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./features/parameters/parameters-style.js";
230
231
  import { filledTextField, italicFontTextField, standardTextField } from "./features/network-modifications/common/form.utils.js";
231
232
  import { PropertiesForm } from "./features/network-modifications/common/properties/PropertiesForm.js";
232
233
  import { PropertyForm } from "./features/network-modifications/common/properties/PropertyForm.js";
@@ -1438,6 +1439,8 @@ export {
1438
1439
  getStudyUrlWithNodeUuid,
1439
1440
  getStudyUrlWithNodeUuidAndRootNetworkUuid,
1440
1441
  getSystemLanguage,
1442
+ getTabIndicatorStyle,
1443
+ getTabStyle,
1441
1444
  getUser,
1442
1445
  getUserToken,
1443
1446
  getVoltageInitParameters,
@@ -1528,6 +1531,7 @@ export {
1528
1531
  onlyStartedGeneratorsOptions,
1529
1532
  parametersEn,
1530
1533
  parametersFr,
1534
+ parametersStyles,
1531
1535
  parseError,
1532
1536
  parseIntData,
1533
1537
  processConfigEn,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gridsuite/commons-ui",
3
- "version": "0.250.0",
3
+ "version": "0.251.0",
4
4
  "description": "common react components for gridsuite applications",
5
5
  "author": "gridsuite team",
6
6
  "homepage": "https://github.com/gridsuite",