@gridsuite/commons-ui 0.251.0 → 0.253.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 (26) 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 +1 -2
  7. package/dist/features/network-modification-table/use-modifications-drag-and-drop.js +43 -49
  8. package/dist/features/parameters/common/parameter-field.js +1 -9
  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.js +1 -2
  14. package/dist/features/parameters/network-visualizations/map-parameters.js +1 -12
  15. package/dist/features/parameters/network-visualizations/single-line-diagram-parameters.js +2 -13
  16. package/dist/features/parameters/parameters-style.d.ts +0 -1
  17. package/dist/features/parameters/parameters-style.js +0 -1
  18. package/dist/features/process-configs/process-configs.type.d.ts +8 -3
  19. package/dist/features/process-configs/security-analysis/update-sa-process-configs-utils.d.ts +6 -2
  20. package/dist/features/process-configs/security-analysis/update-sa-process-configs-utils.js +17 -9
  21. package/dist/features/process-configs/update-process-config-modifications.js +25 -2
  22. package/dist/index.js +5 -5
  23. package/dist/services/index.js +3 -3
  24. package/dist/services/networkModification.d.ts +9 -17
  25. package/dist/services/networkModification.js +16 -19
  26. package/package.json +1 -1
@@ -42,7 +42,7 @@ import { SubmitButton } from "./ui/reactHookForm/utils/SubmitButton.js";
42
42
  import { TextFieldWithAdornment } from "./ui/reactHookForm/utils/TextFieldWithAdornment.js";
43
43
  import { genHelperError, gridItem, identity, isFieldRequired, toFloatOrNullValue } from "./ui/reactHookForm/utils/functions.js";
44
44
  import { HelperPreviousValue } from "./ui/reactHookForm/utils/HelperPreviousValue.js";
45
- import { DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./ui/reactHookForm/constants.js";
45
+ import { ACTIVE, DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./ui/reactHookForm/constants.js";
46
46
  import { ExpandableInput } from "./ui/reactHookForm/expandableInput/ExpandableInput.js";
47
47
  import { CountrySelectionInput } from "./ui/reactHookForm/CountrySelectionInput.js";
48
48
  import { CheckboxNullableInput } from "./ui/reactHookForm/CheckboxNullableInput.js";
@@ -156,6 +156,7 @@ import { ReportType } from "./composite/report/report.type.js";
156
156
  import { GLOBAL_REPORT_NODE_LABEL, NETWORK_MODIFICATION } from "./composite/report/report.constant.js";
157
157
  import { QuickSearch } from "./composite/report/QuickSearch.js";
158
158
  export {
159
+ ACTIVE,
159
160
  ActivableChip,
160
161
  AddButton,
161
162
  AddButtonMode,
@@ -42,7 +42,7 @@ import { SubmitButton } from "./reactHookForm/utils/SubmitButton.js";
42
42
  import { TextFieldWithAdornment } from "./reactHookForm/utils/TextFieldWithAdornment.js";
43
43
  import { genHelperError, gridItem, identity, isFieldRequired, toFloatOrNullValue } from "./reactHookForm/utils/functions.js";
44
44
  import { HelperPreviousValue } from "./reactHookForm/utils/HelperPreviousValue.js";
45
- import { DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./reactHookForm/constants.js";
45
+ import { ACTIVE, DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./reactHookForm/constants.js";
46
46
  import { ExpandableInput } from "./reactHookForm/expandableInput/ExpandableInput.js";
47
47
  import { CountrySelectionInput } from "./reactHookForm/CountrySelectionInput.js";
48
48
  import { CheckboxNullableInput } from "./reactHookForm/CheckboxNullableInput.js";
@@ -80,6 +80,7 @@ import { doesNodeHasChildren } from "./treeViewFinder/TreeViewUtils.js";
80
80
  import { DirectoryItemSelector } from "./directoryItemSelector/DirectoryItemSelector.js";
81
81
  import { CustomTablePagination } from "./tablepagination/custom-table-pagination.js";
82
82
  export {
83
+ ACTIVE,
83
84
  ActivableChip,
84
85
  AddButton,
85
86
  AddButtonMode,
@@ -9,3 +9,4 @@ export declare const DESCRIPTION = "description";
9
9
  export declare const DIRECTORY_ITEM = "directoryItem";
10
10
  export declare const DIRECTORY_ITEM_ID = "directoryItemId";
11
11
  export declare const DIRECTORY_ITEM_FULL_PATH = "directoryItemFullPath";
12
+ export declare const ACTIVE = "active";
@@ -3,7 +3,9 @@ const DESCRIPTION = "description";
3
3
  const DIRECTORY_ITEM = "directoryItem";
4
4
  const DIRECTORY_ITEM_ID = "directoryItemId";
5
5
  const DIRECTORY_ITEM_FULL_PATH = "directoryItemFullPath";
6
+ const ACTIVE = "active";
6
7
  export {
8
+ ACTIVE,
7
9
  DESCRIPTION,
8
10
  DIRECTORY_ITEM,
9
11
  DIRECTORY_ITEM_FULL_PATH,
@@ -41,13 +41,14 @@ import { SubmitButton } from "./utils/SubmitButton.js";
41
41
  import { TextFieldWithAdornment } from "./utils/TextFieldWithAdornment.js";
42
42
  import { genHelperError, gridItem, identity, isFieldRequired, toFloatOrNullValue } from "./utils/functions.js";
43
43
  import { HelperPreviousValue } from "./utils/HelperPreviousValue.js";
44
- import { DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./constants.js";
44
+ import { ACTIVE, DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./constants.js";
45
45
  import { ExpandableInput } from "./expandableInput/ExpandableInput.js";
46
46
  import { CountrySelectionInput } from "./CountrySelectionInput.js";
47
47
  import { CheckboxNullableInput } from "./CheckboxNullableInput.js";
48
48
  import { directoryItemSchema, getAbsenceLabelKeyFromType } from "./directory-item-input/directory-item-utils.js";
49
49
  import { DirectoryItemInput } from "./directory-item-input/directory-item-input.js";
50
50
  export {
51
+ ACTIVE,
51
52
  AutocompleteInput,
52
53
  BooleanInput,
53
54
  ButtonReadOnlyInput,
@@ -67,7 +67,7 @@ import { COLUMNS_DEFINITIONS_HVDCS, COLUMNS_DEFINITIONS_INJECTIONS, COLUMNS_DEFI
67
67
  import { DynamicSimulationInline } from "./parameters/dynamic-simulation/dynamic-simulation-inline.js";
68
68
  import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION } from "./parameters/dynamic-security-analysis/constants.js";
69
69
  import { DynamicSecurityAnalysisInline } from "./parameters/dynamic-security-analysis/dynamic-security-analysis-inline.js";
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";
70
+ import { ACCURACY, 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
72
  import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./parameters/parameters-style.js";
73
73
  import { filledTextField, italicFontTextField, standardTextField } from "./network-modifications/common/form.utils.js";
@@ -239,7 +239,6 @@ import { getSAProcessConfigBackendFromFormData, getSAProcessConfigFormDataFromFe
239
239
  import { ProcessType } from "./process-configs/process-configs.type.js";
240
240
  export {
241
241
  ACCURACY,
242
- ACTIVE,
243
242
  ADVANCED_PARAMETERS,
244
243
  APPLICABILITY,
245
244
  AUTO_EXTENSIBLE_COLUMNS,
@@ -13,7 +13,7 @@ import { snackWithFallback } from "../../utils/error.js";
13
13
  import "../../utils/types/equipmentType.js";
14
14
  import "@mui/icons-material";
15
15
  import { injectForbiddenChips, CHIP_ATTR } from "./drag-forbidden-chip.js";
16
- import { changeCompositeSubModificationOrder, changeNetworkModificationOrder } from "../../services/networkModification.js";
16
+ import { moveModification, ModificationContainerType } from "../../services/networkModification.js";
17
17
  import "localized-countries";
18
18
  import "localized-countries/data/fr";
19
19
  import "localized-countries/data/en";
@@ -97,40 +97,6 @@ const useModificationsDragAndDrop = ({
97
97
  },
98
98
  [containerRef, isDropForbidden, rows]
99
99
  );
100
- const handleDragEndComposite = useCallback(
101
- (sourceRow, targetRow, droppingIntoExpandedComposite, isDraggingDown) => {
102
- const movingUuid = sourceRow.original.uuid;
103
- const sourceCompositeUuid = sourceRow.depth > 0 ? sourceRow.getParentRow()?.original.uuid ?? null : null;
104
- const targetCompositeUuid = getTargetCompositeUuid(droppingIntoExpandedComposite, targetRow);
105
- const targetSiblings = getTargetSiblings(targetCompositeUuid, rows);
106
- let beforeUuid;
107
- if (droppingIntoExpandedComposite) {
108
- beforeUuid = targetSiblings[0]?.original.uuid ?? null;
109
- } else {
110
- const landingIndexInSiblings = targetSiblings.findIndex(
111
- (r) => r.original.uuid === targetRow.original.uuid
112
- );
113
- const beforeSiblingIndex = isDraggingDown ? landingIndexInSiblings + 1 : landingIndexInSiblings;
114
- beforeUuid = targetSiblings[beforeSiblingIndex]?.original.uuid ?? null;
115
- }
116
- const previousComposed = composedModifications;
117
- setComposedModifications(
118
- (prev) => moveSubModificationInTree(movingUuid, sourceCompositeUuid, targetCompositeUuid, beforeUuid, prev)
119
- );
120
- changeCompositeSubModificationOrder(
121
- studyUuid,
122
- currentNodeUuid,
123
- movingUuid,
124
- sourceCompositeUuid,
125
- targetCompositeUuid,
126
- beforeUuid
127
- ).catch((error) => {
128
- snackWithFallback(snackError, error, { headerId: "errReorderModificationMsg" });
129
- setComposedModifications(previousComposed);
130
- });
131
- },
132
- [rows, studyUuid, currentNodeUuid, snackError, composedModifications, setComposedModifications]
133
- );
134
100
  const handleDragEnd = useCallback(
135
101
  (result) => {
136
102
  clearRowDragIndicators(containerRef.current);
@@ -144,37 +110,65 @@ const useModificationsDragAndDrop = ({
144
110
  if (isDropForbidden(sourceRow, targetRow)) {
145
111
  return;
146
112
  }
147
- const isSubRowInvolved = sourceRow.depth > 0 || targetRow.depth > 0;
113
+ const movingUuid = sourceRow.original.uuid;
114
+ const sourceCompositeUuid = sourceRow.depth > 0 ? sourceRow.getParentRow()?.original.uuid ?? null : null;
148
115
  const isDraggingDown = destination.index > source.index;
149
116
  const droppingIntoExpandedComposite = isDraggingDown && targetRow.getIsExpanded();
150
- if (isSubRowInvolved || droppingIntoExpandedComposite) {
151
- handleDragEndComposite(sourceRow, targetRow, droppingIntoExpandedComposite, isDraggingDown);
117
+ const isSubRowInvolved = sourceRow.depth > 0 || targetRow.depth > 0;
118
+ const targetCompositeUuid = getTargetCompositeUuid(droppingIntoExpandedComposite, targetRow);
119
+ const sourceContainerId = sourceRow.depth > 0 ? sourceRow.getParentRow()?.original.uuid ?? null : null;
120
+ const targetContainerId = targetCompositeUuid;
121
+ const previousModifications = [...composedModifications];
122
+ let beforeUuid;
123
+ if (droppingIntoExpandedComposite || isSubRowInvolved) {
124
+ const targetSiblings = getTargetSiblings(targetCompositeUuid, rows);
125
+ if (droppingIntoExpandedComposite) {
126
+ beforeUuid = targetSiblings[0]?.original.uuid ?? null;
127
+ } else {
128
+ const landingIndexInSiblings = targetSiblings.findIndex(
129
+ (r) => r.original.uuid === targetRow.original.uuid
130
+ );
131
+ const beforeSiblingIndex = isDraggingDown ? landingIndexInSiblings + 1 : landingIndexInSiblings;
132
+ beforeUuid = targetSiblings[beforeSiblingIndex]?.original.uuid ?? null;
133
+ }
134
+ setComposedModifications(
135
+ (prev) => moveSubModificationInTree(movingUuid, sourceCompositeUuid, targetCompositeUuid, beforeUuid, prev)
136
+ );
152
137
  } else {
153
- const sourceDepth0Uuid = sourceRow.original.uuid;
154
- const targetDepth0Uuid = targetRow.original.uuid;
155
- const oldPosition = composedModifications.findIndex((m) => m.uuid === sourceDepth0Uuid);
156
- const newPosition = composedModifications.findIndex((m) => m.uuid === targetDepth0Uuid);
138
+ const oldPosition = composedModifications.findIndex((m) => m.uuid === sourceRow.original.uuid);
139
+ const newPosition = composedModifications.findIndex((m) => m.uuid === targetRow.original.uuid);
157
140
  if (oldPosition === -1 || newPosition === -1 || oldPosition === newPosition || !currentNodeUuid) {
158
141
  return;
159
142
  }
160
- const previousModifications = [...composedModifications];
161
143
  const updatedModifications = [...composedModifications];
162
144
  const [movedItem] = updatedModifications.splice(oldPosition, 1);
163
145
  updatedModifications.splice(newPosition, 0, movedItem);
146
+ beforeUuid = updatedModifications[newPosition + 1]?.uuid ?? null;
164
147
  setComposedModifications(updatedModifications);
165
- const before = updatedModifications[newPosition + 1]?.uuid ?? null;
166
- changeNetworkModificationOrder(studyUuid, currentNodeUuid, movedItem.uuid, before).catch((error) => {
167
- snackWithFallback(snackError, error, { headerId: "errReorderModificationMsg" });
168
- setComposedModifications(previousModifications);
169
- });
170
148
  }
149
+ moveModification(
150
+ studyUuid,
151
+ currentNodeUuid,
152
+ movingUuid,
153
+ {
154
+ id: sourceContainerId,
155
+ type: sourceContainerId ? ModificationContainerType.COMPOSITE : ModificationContainerType.GROUP
156
+ },
157
+ {
158
+ id: targetContainerId,
159
+ type: targetContainerId ? ModificationContainerType.COMPOSITE : ModificationContainerType.GROUP
160
+ },
161
+ beforeUuid
162
+ ).catch((error) => {
163
+ snackWithFallback(snackError, error, { headerId: "errReorderModificationMsg" });
164
+ setComposedModifications(previousModifications);
165
+ });
171
166
  },
172
167
  [
173
168
  containerRef,
174
169
  onDragEnd,
175
170
  rows,
176
171
  isDropForbidden,
177
- handleDragEndComposite,
178
172
  composedModifications,
179
173
  currentNodeUuid,
180
174
  setComposedModifications,
@@ -41,13 +41,6 @@ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
41
41
  import "mui-nested-menu";
42
42
  import "react-resizable-panels";
43
43
  import "react-papaparse";
44
- import { LineSeparator } from "./line-separator.js";
45
- import "./parameter-layout/parameter-layout-provider.js";
46
- import "./widget/parameter-line-slider.js";
47
- import "./contingency-table/contingency-table.js";
48
- import "./contingency-table/columns-definitions.js";
49
- import "@hookform/resolvers/yup";
50
- import "../../../components/composite/filter/HeaderFilterForm.js";
51
44
  function ParameterField({
52
45
  id,
53
46
  name,
@@ -117,8 +110,7 @@ function ParameterField({
117
110
  const INPUT_GRID_SIZE = 12 - LABEL_GRID_SIZE;
118
111
  return /* @__PURE__ */ jsxs(Grid2, { container: true, spacing: 1, paddingTop: 1, justifyContent: "space-between", sx: { width: "100%" }, children: [
119
112
  /* @__PURE__ */ jsx(Grid2, { size: LABEL_GRID_SIZE, children: /* @__PURE__ */ jsx(CustomTooltip, { title: description, children: /* @__PURE__ */ jsx(Typography, { sx: parametersStyles.parameterName, children: label ? /* @__PURE__ */ jsx(FormattedMessage, { id: label }) : name }) }, name) }),
120
- /* @__PURE__ */ jsx(Grid2, { container: true, size: INPUT_GRID_SIZE, sx: parametersStyles.controlItem, children: renderField() }),
121
- /* @__PURE__ */ jsx(LineSeparator, {})
113
+ /* @__PURE__ */ jsx(Grid2, { container: true, size: INPUT_GRID_SIZE, sx: parametersStyles.controlItem, children: renderField() })
122
114
  ] }, name);
123
115
  }
124
116
  export {
@@ -15,4 +15,3 @@ export declare const LOAD_MODELS_RULE = "loadModelsRule";
15
15
  export declare const LOADS_VARIATIONS = "loadsVariations";
16
16
  export declare const LOAD_FILTERS = "loadFilters";
17
17
  export declare const VARIATION = "variation";
18
- export declare const ACTIVE = "active";
@@ -9,10 +9,8 @@ const LOAD_MODELS_RULE = "loadModelsRule";
9
9
  const LOADS_VARIATIONS = "loadsVariations";
10
10
  const LOAD_FILTERS = "loadFilters";
11
11
  const VARIATION = "variation";
12
- const ACTIVE = "active";
13
12
  export {
14
13
  ACCURACY,
15
- ACTIVE,
16
14
  CALCULATION_TYPE,
17
15
  LOADS_VARIATIONS,
18
16
  LOAD_FILTERS,
@@ -1,8 +1,7 @@
1
- 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 "./constants.js";
1
+ import { ACCURACY, 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 "./constants.js";
2
2
  import { DynamicMarginCalculationInline } from "./dynamic-margin-calculation-inline.js";
3
3
  export {
4
4
  ACCURACY,
5
- ACTIVE,
6
5
  CALCULATION_TYPE,
7
6
  DynamicMarginCalculationInline,
8
7
  LOADS_VARIATIONS,
@@ -3,7 +3,7 @@ import { useMemo } from "react";
3
3
  import { useIntl } from "react-intl";
4
4
  import { Grid2 } from "@mui/material";
5
5
  import * as yup from "yup";
6
- import { LOADS_VARIATIONS, ACTIVE, VARIATION, LOAD_FILTERS, LOAD_MODELS_RULE, ACCURACY, CALCULATION_TYPE } from "./constants.js";
6
+ import { LOADS_VARIATIONS, VARIATION, LOAD_FILTERS, LOAD_MODELS_RULE, ACCURACY, CALCULATION_TYPE } from "./constants.js";
7
7
  import { ID } from "../../../utils/constants/filterConstant.js";
8
8
  import { YUP_REQUIRED } from "../../../utils/constants/translationKeys.js";
9
9
  import "../../../utils/conversionUtils.js";
@@ -21,7 +21,7 @@ import "localized-countries/data/en";
21
21
  import "notistack";
22
22
  import "../../../components/ui/reactHookForm/provider/CustomFormProvider.js";
23
23
  import "../../../components/ui/treeViewFinder/TreeViewFinder.js";
24
- import { NAME } from "../../../components/ui/reactHookForm/constants.js";
24
+ import { ACTIVE, NAME } from "../../../components/ui/reactHookForm/constants.js";
25
25
  import "../../../components/ui/reactHookForm/numbers/RangeInput.js";
26
26
  import "@material-symbols/svg-400/outlined/left_panel_open.svg?react";
27
27
  import "@material-symbols/svg-400/outlined/arrows_output.svg?react";
@@ -47,12 +47,11 @@ import { COLUMNS_DEFINITIONS_HVDCS, COLUMNS_DEFINITIONS_INJECTIONS, COLUMNS_DEFI
47
47
  import { DynamicSimulationInline } from "./dynamic-simulation/dynamic-simulation-inline.js";
48
48
  import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION } from "./dynamic-security-analysis/constants.js";
49
49
  import { DynamicSecurityAnalysisInline } from "./dynamic-security-analysis/dynamic-security-analysis-inline.js";
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";
50
+ import { ACCURACY, 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
52
  import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./parameters-style.js";
53
53
  export {
54
54
  ACCURACY,
55
- ACTIVE,
56
55
  ADVANCED_PARAMETERS,
57
56
  BALANCE_TYPE,
58
57
  CALCULATION_TYPE,
@@ -3,8 +3,8 @@ import { Grid2 } from "@mui/material";
3
3
  import { FormattedMessage } from "react-intl";
4
4
  import { useState, useEffect } from "react";
5
5
  import { MAP_BASE_MAP, NetworkVisualizationTabValues, PARAM_MAP_BASEMAP, PARAM_LINE_FULL_PATH, PARAM_LINE_PARALLEL_PATH, INTL_LINE_FLOW_MODE_OPTIONS, LINE_FLOW_MODE, PARAM_LINE_FLOW_MODE, MAP_MANUAL_REFRESH, PARAM_MAP_MANUAL_REFRESH } from "./constants.js";
6
- import "@mui/icons-material";
7
6
  import { parametersStyles } from "../parameters-style.js";
7
+ import "@mui/icons-material";
8
8
  import "../../../components/ui/overflowableText/OverflowableText.js";
9
9
  import "../../../utils/conversionUtils.js";
10
10
  import { snackWithFallback } from "../../../utils/error.js";
@@ -35,13 +35,6 @@ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
35
35
  import "mui-nested-menu";
36
36
  import "react-resizable-panels";
37
37
  import "react-papaparse";
38
- import { LineSeparator } from "../common/line-separator.js";
39
- import "../common/parameter-layout/parameter-layout-provider.js";
40
- import "../common/widget/parameter-line-slider.js";
41
- import "../common/contingency-table/contingency-table.js";
42
- import "../common/contingency-table/columns-definitions.js";
43
- import "@hookform/resolvers/yup";
44
- import "../../../components/composite/filter/HeaderFilterForm.js";
45
38
  const fetchMapBaseOption = async () => {
46
39
  const studyMetadata = await fetchStudyMetadata();
47
40
  return studyMetadata.baseMapOptions;
@@ -96,13 +89,9 @@ function MapParameters() {
96
89
  justifyContent: "space-between",
97
90
  children: [
98
91
  lineSwitch(PARAM_LINE_FULL_PATH, PARAM_LINE_FULL_PATH),
99
- /* @__PURE__ */ jsx(LineSeparator, {}),
100
92
  lineSwitch(PARAM_LINE_PARALLEL_PATH, PARAM_LINE_PARALLEL_PATH),
101
- /* @__PURE__ */ jsx(LineSeparator, {}),
102
93
  lineFlow(PARAM_LINE_FLOW_MODE, LINE_FLOW_MODE, INTL_LINE_FLOW_MODE_OPTIONS),
103
- /* @__PURE__ */ jsx(LineSeparator, {}),
104
94
  lineSwitch(PARAM_MAP_MANUAL_REFRESH, MAP_MANUAL_REFRESH),
105
- /* @__PURE__ */ jsx(LineSeparator, {}),
106
95
  mapBaseMap
107
96
  ]
108
97
  },
@@ -2,8 +2,8 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { Grid2 } from "@mui/material";
3
3
  import { useMemo } from "react";
4
4
  import { FormattedMessage } from "react-intl";
5
+ import { INTL_SUBSTATION_LAYOUT_OPTIONS, SUBSTATION_LAYOUT, NetworkVisualizationTabValues, PARAM_SUBSTATION_LAYOUT, COMPONENT_LIBRARY, PARAM_COMPONENT_LIBRARY, DIAGONAL_LABEL, PARAM_DIAGONAL_LABEL, CENTER_LABEL, PARAM_CENTER_LABEL, CUSTOM_REAL_TIME_STATE_ESTIMATION, PARAM_STATE_ESTIMATION } from "./constants.js";
5
6
  import "@mui/icons-material";
6
- import { parametersStyles } from "../parameters-style.js";
7
7
  import "../../../components/ui/overflowableText/OverflowableText.js";
8
8
  import "../../../utils/conversionUtils.js";
9
9
  import "../../../utils/types/equipmentType.js";
@@ -32,14 +32,7 @@ import "../../../components/ui/snackbarProvider/SnackbarProvider.js";
32
32
  import "mui-nested-menu";
33
33
  import "react-resizable-panels";
34
34
  import "react-papaparse";
35
- import { LineSeparator } from "../common/line-separator.js";
36
- import "../common/parameter-layout/parameter-layout-provider.js";
37
- import "../common/widget/parameter-line-slider.js";
38
- import "../common/contingency-table/contingency-table.js";
39
- import "../common/contingency-table/columns-definitions.js";
40
- import "@hookform/resolvers/yup";
41
- import "../../../components/composite/filter/HeaderFilterForm.js";
42
- import { INTL_SUBSTATION_LAYOUT_OPTIONS, SUBSTATION_LAYOUT, NetworkVisualizationTabValues, PARAM_SUBSTATION_LAYOUT, COMPONENT_LIBRARY, PARAM_COMPONENT_LIBRARY, DIAGONAL_LABEL, PARAM_DIAGONAL_LABEL, CENTER_LABEL, PARAM_CENTER_LABEL, CUSTOM_REAL_TIME_STATE_ESTIMATION, PARAM_STATE_ESTIMATION } from "./constants.js";
35
+ import { parametersStyles } from "../parameters-style.js";
43
36
  function SingleLineDiagramParameters({ componentLibraries }) {
44
37
  const componentLibsRenderCache = useMemo(
45
38
  () => Object.fromEntries(componentLibraries.filter(Boolean).map((libLabel) => [libLabel, libLabel])),
@@ -88,13 +81,9 @@ function SingleLineDiagramParameters({ componentLibraries }) {
88
81
  justifyContent: "space-between",
89
82
  children: [
90
83
  labelPosition(PARAM_DIAGONAL_LABEL, DIAGONAL_LABEL),
91
- /* @__PURE__ */ jsx(LineSeparator, {}),
92
84
  labelPosition(PARAM_CENTER_LABEL, CENTER_LABEL),
93
- /* @__PURE__ */ jsx(LineSeparator, {}),
94
85
  substationLineDropDown,
95
- /* @__PURE__ */ jsx(LineSeparator, {}),
96
86
  componentLineDropDown,
97
- /* @__PURE__ */ jsx(LineSeparator, {}),
98
87
  labelPosition(PARAM_STATE_ESTIMATION, CUSTOM_REAL_TIME_STATE_ESTIMATION)
99
88
  ]
100
89
  },
@@ -15,7 +15,6 @@ export declare const parametersStyles: {
15
15
  minWidth: string;
16
16
  };
17
17
  readonly parameterName: (theme: import('@mui/material').Theme) => {
18
- fontWeight: string;
19
18
  marginTop: string;
20
19
  };
21
20
  readonly controlItem: {
@@ -6,7 +6,6 @@ const parametersStyles = {
6
6
  minWidth: theme.spacing(20)
7
7
  }),
8
8
  parameterName: (theme) => ({
9
- fontWeight: "bold",
10
9
  marginTop: theme.spacing(1)
11
10
  }),
12
11
  controlItem: {
@@ -4,9 +4,14 @@ export declare enum ProcessType {
4
4
  SECURITY_ANALYSIS = "SECURITY_ANALYSIS",
5
5
  LOADFLOW = "LOADFLOW"
6
6
  }
7
+ export interface ModificationInfo {
8
+ modificationUuid: UUID;
9
+ description: string | null;
10
+ active: boolean;
11
+ }
7
12
  export interface ProcessConfigBaseBackend {
8
13
  processType: ProcessType;
9
- modificationUuids: UUID[];
14
+ modifications: ModificationInfo[];
10
15
  }
11
16
  export interface SecurityAnalysisProcessConfigBackend extends ProcessConfigBaseBackend {
12
17
  processType: ProcessType.SECURITY_ANALYSIS;
@@ -18,9 +23,9 @@ export type PersistedProcessConfigBackend = {
18
23
  id: UUID;
19
24
  processConfig: ProcessConfigBackend;
20
25
  };
21
- export type SecurityAnalysisProcessConfig = Omit<SecurityAnalysisProcessConfigBackend, 'securityAnalysisParametersUuid' | 'loadflowParametersUuid' | 'modificationUuids'> & {
26
+ export type SecurityAnalysisProcessConfig = Omit<SecurityAnalysisProcessConfigBackend, 'securityAnalysisParametersUuid' | 'loadflowParametersUuid' | 'modifications'> & {
22
27
  modifications: (IdName & {
23
- enabled: boolean;
28
+ active: boolean;
24
29
  description?: string;
25
30
  })[];
26
31
  loadflowParameters: IdName;
@@ -14,6 +14,8 @@ export declare function getSAProcessConfigFormDataFromFetchedElement(processConf
14
14
  id: `${string}-${string}-${string}-${string}-${string}`;
15
15
  name: string | undefined;
16
16
  }[];
17
+ description: string;
18
+ active: boolean;
17
19
  }[];
18
20
  securityAnalysisParameters: import('../../..').IdName[];
19
21
  loadflowParameters: import('../../..').IdName[];
@@ -23,6 +25,8 @@ export declare const updateSAProcessConfigFormSchema: yup.ObjectSchema<{
23
25
  name: string;
24
26
  description: string | undefined;
25
27
  modifications: {
28
+ description?: string | null | undefined;
29
+ active: NonNullable<boolean | undefined>;
26
30
  modification: {
27
31
  id: string;
28
32
  name: string;
@@ -49,8 +53,8 @@ export declare function toSAProcessConfig(persistedProcessConfig: PersistedProce
49
53
  modifications: {
50
54
  id: `${string}-${string}-${string}-${string}-${string}`;
51
55
  name: string;
52
- enabled: true;
53
- description: undefined;
56
+ active: boolean;
57
+ description: string | undefined;
54
58
  }[];
55
59
  securityAnalysisParameters: {
56
60
  id: `${string}-${string}-${string}-${string}-${string}`;
@@ -12,7 +12,9 @@ function getSAProcessConfigFormDataFromFetchedElement(processConfig, name, descr
12
12
  name,
13
13
  description: description ?? void 0,
14
14
  modifications: processConfig.modifications.map((modification) => ({
15
- modification: [{ id: modification.id, name: modification.name }]
15
+ modification: [{ id: modification.id, name: modification.name }],
16
+ description: modification.description ?? "",
17
+ active: modification.active
16
18
  })),
17
19
  securityAnalysisParameters: [processConfig.securityAnalysisParameters],
18
20
  loadflowParameters: [processConfig.loadflowParameters]
@@ -23,7 +25,11 @@ function getSAProcessConfigBackendFromFormData(formData) {
23
25
  processType: ProcessType.SECURITY_ANALYSIS,
24
26
  loadflowParametersUuid: formData.loadflowParameters[0].id,
25
27
  securityAnalysisParametersUuid: formData.securityAnalysisParameters[0].id,
26
- modificationUuids: formData.modifications.map((modification) => modification.modification[0].id)
28
+ modifications: formData.modifications.map((row) => ({
29
+ modificationUuid: row.modification[0].id,
30
+ description: row.description ?? null,
31
+ active: row.active
32
+ }))
27
33
  };
28
34
  }
29
35
  const updateSAProcessConfigFormSchema = yup.object().shape({
@@ -36,7 +42,9 @@ const updateSAProcessConfigFormSchema = yup.object().shape({
36
42
  id: yup.string().required(),
37
43
  name: yup.string().required()
38
44
  }).required()
39
- ).length(1, YUP_REQUIRED)
45
+ ).length(1, YUP_REQUIRED),
46
+ description: yup.string().nullable(),
47
+ active: yup.boolean().required()
40
48
  })
41
49
  ),
42
50
  [FieldConstants.LOADFLOW_PARAMETERS]: yup.array().required().of(yup.object().shape({ id: yup.string().required(), name: yup.string().required() })).length(1, YUP_REQUIRED),
@@ -45,18 +53,18 @@ const updateSAProcessConfigFormSchema = yup.object().shape({
45
53
  async function toSAProcessConfig(persistedProcessConfig) {
46
54
  const { processConfig } = persistedProcessConfig;
47
55
  const allUuids = /* @__PURE__ */ new Set([
48
- ...processConfig.modificationUuids,
56
+ ...processConfig.modifications.map((modification) => modification.modificationUuid),
49
57
  processConfig.securityAnalysisParametersUuid,
50
58
  processConfig.loadflowParametersUuid
51
59
  ]);
52
60
  const elementNamesByUuid = await fetchElementNames(allUuids);
53
61
  return {
54
62
  processType: processConfig.processType,
55
- modifications: processConfig.modificationUuids.map((uuid) => ({
56
- id: uuid,
57
- name: elementNamesByUuid[uuid],
58
- enabled: true,
59
- description: void 0
63
+ modifications: processConfig.modifications.map((modification) => ({
64
+ id: modification.modificationUuid,
65
+ name: elementNamesByUuid[modification.modificationUuid],
66
+ active: modification.active,
67
+ description: modification.description ?? void 0
60
68
  })),
61
69
  securityAnalysisParameters: {
62
70
  id: processConfig.securityAnalysisParametersUuid,
@@ -22,6 +22,7 @@ import "@material-symbols/svg-400/outlined/arrows_input.svg?react";
22
22
  import "@material-symbols/svg-400/outlined/left_panel_close.svg?react";
23
23
  import "@material-symbols/svg-400/outlined/add_notes.svg?react";
24
24
  import "../../components/ui/dialogs/descriptionModificationDialog/DescriptionModificationDialog.js";
25
+ import { DESCRIPTION, ACTIVE } from "../../components/ui/reactHookForm/constants.js";
25
26
  import "../../components/ui/reactHookForm/expandableInput/ExpandableInput.js";
26
27
  import "../../components/ui/reactHookForm/directory-item-input/directory-item-utils.js";
27
28
  import "../../components/ui/treeViewFinder/TreeViewFinder.js";
@@ -33,6 +34,7 @@ import "react-resizable-panels";
33
34
  import "react-papaparse";
34
35
  import { DndTable } from "../../components/composite/dnd-table/dnd-table.js";
35
36
  import { DndColumnType } from "../../components/composite/dnd-table/dnd-table.type.js";
37
+ import { getDefaultRowData } from "../../components/composite/dnd-table/dnd-table-utils.js";
36
38
  import "autosuggest-highlight/match";
37
39
  import "autosuggest-highlight/parse";
38
40
  import "clsx";
@@ -71,7 +73,7 @@ function UpdateProcessConfigModifications({ name }) {
71
73
  name: `${name}[${rowIndex}].modification`,
72
74
  allowMultiSelect: false,
73
75
  elementType: ElementType.MODIFICATION,
74
- titleId: "modifications",
76
+ titleId: "process_config/modifications",
75
77
  label: void 0
76
78
  }
77
79
  ),
@@ -86,10 +88,31 @@ function UpdateProcessConfigModifications({ name }) {
86
88
  editable: true,
87
89
  label: intl.formatMessage({ id: "process_config/modifications" }),
88
90
  component: modificationSelector
91
+ },
92
+ {
93
+ label: intl.formatMessage({ id: "description" }),
94
+ sxHeader: { textAlign: "center" },
95
+ dataKey: DESCRIPTION,
96
+ initialValue: "",
97
+ editable: true,
98
+ width: "8rem",
99
+ type: DndColumnType.DESCRIPTIONS
100
+ },
101
+ {
102
+ label: intl.formatMessage({ id: "Active" }),
103
+ sxHeader: { textAlign: "center" },
104
+ dataKey: ACTIVE,
105
+ initialValue: true,
106
+ editable: true,
107
+ width: "4rem",
108
+ type: DndColumnType.SWITCH
89
109
  }
90
110
  ];
91
111
  }, [modificationSelector, name, intl]);
92
- const createModification = () => [{ modification: [] }];
112
+ const createModification = useCallback(
113
+ () => [{ ...getDefaultRowData(columnsDefinition), modification: [] }],
114
+ [columnsDefinition]
115
+ );
93
116
  return /* @__PURE__ */ jsx(
94
117
  DndTable,
95
118
  {
package/dist/index.js CHANGED
@@ -43,7 +43,7 @@ import { SubmitButton } from "./components/ui/reactHookForm/utils/SubmitButton.j
43
43
  import { TextFieldWithAdornment } from "./components/ui/reactHookForm/utils/TextFieldWithAdornment.js";
44
44
  import { genHelperError, gridItem, identity, isFieldRequired, toFloatOrNullValue } from "./components/ui/reactHookForm/utils/functions.js";
45
45
  import { HelperPreviousValue } from "./components/ui/reactHookForm/utils/HelperPreviousValue.js";
46
- import { DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./components/ui/reactHookForm/constants.js";
46
+ import { ACTIVE, DESCRIPTION, DIRECTORY_ITEM, DIRECTORY_ITEM_FULL_PATH, DIRECTORY_ITEM_ID, NAME } from "./components/ui/reactHookForm/constants.js";
47
47
  import { ExpandableInput } from "./components/ui/reactHookForm/expandableInput/ExpandableInput.js";
48
48
  import { CountrySelectionInput } from "./components/ui/reactHookForm/CountrySelectionInput.js";
49
49
  import { CheckboxNullableInput } from "./components/ui/reactHookForm/CheckboxNullableInput.js";
@@ -225,7 +225,7 @@ import { COLUMNS_DEFINITIONS_HVDCS, COLUMNS_DEFINITIONS_INJECTIONS, COLUMNS_DEFI
225
225
  import { DynamicSimulationInline } from "./features/parameters/dynamic-simulation/dynamic-simulation-inline.js";
226
226
  import { CONTINGENCIES_LIST_INFOS, CONTINGENCIES_START_TIME, SCENARIO_DURATION } from "./features/parameters/dynamic-security-analysis/constants.js";
227
227
  import { DynamicSecurityAnalysisInline } from "./features/parameters/dynamic-security-analysis/dynamic-security-analysis-inline.js";
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";
228
+ import { ACCURACY, 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
230
  import { getTabIndicatorStyle, getTabStyle, parametersStyles } from "./features/parameters/parameters-style.js";
231
231
  import { filledTextField, italicFontTextField, standardTextField } from "./features/network-modifications/common/form.utils.js";
@@ -340,7 +340,7 @@ import { fetchCurrentAnnouncement, fetchUserDetails } from "./services/userAdmin
340
340
  import { DEFAULT_TIMEOUT_MS, IGNORE_SIGNAL, backendFetch, backendFetchFile, backendFetchJson, backendFetchText, getRequestParamFromList, handleNotOkResponse, parseError, safeEncodeURIComponent } from "./services/utils.js";
341
341
  import { getVoltageInitParameters, getVoltageInitUrl } from "./services/voltage-init.js";
342
342
  import { fetchShortCircuitParameters, getShortCircuitSpecificParametersDescription, updateShortCircuitParameters } from "./services/short-circuit-analysis.js";
343
- import { changeCompositeSubModificationOrder, changeNetworkModificationOrder, fetchBusBarSectionsForNewCoupler, fetchNetworkModification, getBaseNetworkModificationUrl, getNetworkModificationsFromComposite, getStudyUrlWithNodeUuid, setModificationMetadata, updateModification, updateModificationStatusByRootNetwork, updateNetworkModificationsMetadata } from "./services/networkModification.js";
343
+ import { ModificationContainerType, fetchBusBarSectionsForNewCoupler, fetchNetworkModification, getBaseNetworkModificationUrl, getNetworkModificationsFromComposite, getStudyUrlWithNodeUuid, moveModification, setModificationMetadata, updateModification, updateModificationStatusByRootNetwork, updateNetworkModificationsMetadata } from "./services/networkModification.js";
344
344
  import { fetchDynamicSimulationModels } from "./services/dynamic-mapping.js";
345
345
  import { fetchDynamicSimulationParameters, fetchDynamicSimulationProviders, updateDynamicSimulationParameters } from "./services/dynamic-simulation.js";
346
346
  import { fetchContingencyAndFiltersLists, fetchDynamicSecurityAnalysisProviders } from "./services/dynamic-security-analysis.js";
@@ -864,6 +864,7 @@ export {
864
864
  MicroSusceptanceAdornment,
865
865
  MidFormError,
866
866
  ModificationByAssignmentForm,
867
+ ModificationContainerType,
867
868
  ModificationRow,
868
869
  ModificationType,
869
870
  ModifyElementSelection,
@@ -1165,8 +1166,6 @@ export {
1165
1166
  cardErrorBoundaryEn,
1166
1167
  cardErrorBoundaryFr,
1167
1168
  catchErrorHandler,
1168
- changeCompositeSubModificationOrder,
1169
- changeNetworkModificationOrder,
1170
1169
  commonButtonEn,
1171
1170
  commonButtonFr,
1172
1171
  componentsEn,
@@ -1519,6 +1518,7 @@ export {
1519
1518
  modificationByAssignmentFormSchema,
1520
1519
  modificationByAssignmentFormToDto,
1521
1520
  modificationPropertiesSchema,
1521
+ moveModification,
1522
1522
  moveSubModificationInTree,
1523
1523
  multipleSelectionDialogEn,
1524
1524
  multipleSelectionDialogFr,
@@ -12,7 +12,7 @@ import { fetchCurrentAnnouncement, fetchUserDetails } from "./userAdmin.js";
12
12
  import { DEFAULT_TIMEOUT_MS, IGNORE_SIGNAL, backendFetch, backendFetchFile, backendFetchJson, backendFetchText, getRequestParamFromList, handleNotOkResponse, parseError, safeEncodeURIComponent } from "./utils.js";
13
13
  import { getVoltageInitParameters, getVoltageInitUrl } from "./voltage-init.js";
14
14
  import { fetchShortCircuitParameters, getShortCircuitSpecificParametersDescription, updateShortCircuitParameters } from "./short-circuit-analysis.js";
15
- import { changeCompositeSubModificationOrder, changeNetworkModificationOrder, fetchBusBarSectionsForNewCoupler, fetchNetworkModification, getBaseNetworkModificationUrl, getNetworkModificationsFromComposite, getStudyUrlWithNodeUuid, setModificationMetadata, updateModification, updateModificationStatusByRootNetwork, updateNetworkModificationsMetadata } from "./networkModification.js";
15
+ import { ModificationContainerType, fetchBusBarSectionsForNewCoupler, fetchNetworkModification, getBaseNetworkModificationUrl, getNetworkModificationsFromComposite, getStudyUrlWithNodeUuid, moveModification, setModificationMetadata, updateModification, updateModificationStatusByRootNetwork, updateNetworkModificationsMetadata } from "./networkModification.js";
16
16
  import { fetchDynamicSimulationModels } from "./dynamic-mapping.js";
17
17
  import { fetchDynamicSimulationParameters, fetchDynamicSimulationProviders, updateDynamicSimulationParameters } from "./dynamic-simulation.js";
18
18
  import { fetchContingencyAndFiltersLists, fetchDynamicSecurityAnalysisProviders } from "./dynamic-security-analysis.js";
@@ -20,14 +20,13 @@ import { fetchDynamicMarginCalculationParameters, fetchDynamicMarginCalculationP
20
20
  export {
21
21
  DEFAULT_TIMEOUT_MS,
22
22
  IGNORE_SIGNAL,
23
+ ModificationContainerType,
23
24
  PREFIX_STUDY_QUERIES,
24
25
  PermissionType,
25
26
  backendFetch,
26
27
  backendFetchFile,
27
28
  backendFetchJson,
28
29
  backendFetchText,
29
- changeCompositeSubModificationOrder,
30
- changeNetworkModificationOrder,
31
30
  createFilter,
32
31
  createParameter,
33
32
  elementAlreadyExists,
@@ -94,6 +93,7 @@ export {
94
93
  hasElementPermission,
95
94
  isExploreMetadata,
96
95
  isStudyMetadata,
96
+ moveModification,
97
97
  parseError,
98
98
  safeEncodeURIComponent,
99
99
  saveFilter,
@@ -2,6 +2,14 @@ import { UUID } from 'node:crypto';
2
2
  import { ComposedModificationMetadata, NetworkModificationMetadata } from '../utils';
3
3
  export declare const getBaseNetworkModificationUrl: () => string;
4
4
  export declare const getStudyUrlWithNodeUuid: (studyUuid: string | null | undefined, nodeUuid: string | undefined) => string;
5
+ export declare enum ModificationContainerType {
6
+ GROUP = "GROUP",
7
+ COMPOSITE = "COMPOSITE"
8
+ }
9
+ export type ModificationContainer = {
10
+ id: UUID | null;
11
+ type: ModificationContainerType | null;
12
+ };
5
13
  export declare function fetchNetworkModification(modificationUuid: UUID): Promise<Response>;
6
14
  export declare function fetchBusBarSectionsForNewCoupler(voltageLevelId: string, busBarCount: number, sectionCount: number, switchKindList: string[]): Promise<string[]>;
7
15
  export declare function updateModification({ modificationUuid, body }: {
@@ -14,22 +22,6 @@ export declare function updateModification({ modificationUuid, body }: {
14
22
  */
15
23
  export declare function updateNetworkModificationsMetadata(modificationUuids: UUID[], metadata: Partial<ComposedModificationMetadata>): Promise<Response>;
16
24
  export declare function getNetworkModificationsFromComposite(compositeModificationUuids: string[], onlyMetadata?: boolean): Promise<Record<UUID, NetworkModificationMetadata[]>>;
17
- /**
18
- * Move a composite sub-modification within or between composites, or between a composite and the group root.
19
- *
20
- * The four scenarios are encoded by the nullable sourceCompositeUuid / targetCompositeUuid:
21
- * - both present → sub-to-sub (same composite = reorder, different = cross-composite move)
22
- * - source only → extract from composite to root level
23
- * - target only → embed root-level modification into a composite
24
- *
25
- * @param studyUuid
26
- * @param nodeUuid
27
- * @param modificationUuid
28
- * @param sourceCompositeUuid UUID of the composite that currently owns the modification; null if at root
29
- * @param targetCompositeUuid UUID of the target composite; null to place at root level
30
- * @param beforeUuid insert before this UUID in the target collection; null to append at end
31
- */
32
- export declare function changeCompositeSubModificationOrder(studyUuid: UUID | null, nodeUuid: UUID | undefined, modificationUuid: UUID, sourceCompositeUuid: UUID | null, targetCompositeUuid: UUID | null, beforeUuid: UUID | null): Promise<Response>;
33
- export declare function changeNetworkModificationOrder(studyUuid: UUID | null, nodeUuid: UUID | undefined, itemUuid: UUID, beforeUuid: UUID | null): Promise<Response>;
25
+ export declare function moveModification(studyUuid: UUID | null, nodeUuid: UUID | undefined, modificationUuid: UUID, sourceContainer: ModificationContainer, targetContainer: ModificationContainer, beforeUuid: UUID | null): Promise<Response>;
34
26
  export declare function setModificationMetadata(studyUuid: UUID | null, nodeUuid: UUID | undefined, modificationUuid: UUID | undefined, metadata: Partial<NetworkModificationMetadata | ComposedModificationMetadata>): Promise<Response>;
35
27
  export declare function updateModificationStatusByRootNetwork(studyUuid: UUID, nodeUuid: UUID, rootNetworkUuid: UUID, modificationUuid: UUID, activated: boolean): Promise<Response>;
@@ -1,4 +1,4 @@
1
- import { backendFetch, backendFetchJson, safeEncodeURIComponent, backendFetchText } from "./utils.js";
1
+ import { backendFetchJson, backendFetch, safeEncodeURIComponent, backendFetchText } from "./utils.js";
2
2
  import { PREFIX_STUDY_QUERIES } from "./loadflow.js";
3
3
  const PREFIX_NETWORK_MODIFICATION_QUERIES = `${"api/gateway"}/network-modification`;
4
4
  const getBaseNetworkModificationUrl = () => `${PREFIX_NETWORK_MODIFICATION_QUERIES}/v1`;
@@ -6,6 +6,11 @@ const getStudyUrlWithNodeUuid = (studyUuid, nodeUuid) => `${PREFIX_STUDY_QUERIES
6
6
  function getUrl() {
7
7
  return `${PREFIX_NETWORK_MODIFICATION_QUERIES}/v1/network-modifications`;
8
8
  }
9
+ var ModificationContainerType = /* @__PURE__ */ ((ModificationContainerType2) => {
10
+ ModificationContainerType2["GROUP"] = "GROUP";
11
+ ModificationContainerType2["COMPOSITE"] = "COMPOSITE";
12
+ return ModificationContainerType2;
13
+ })(ModificationContainerType || {});
9
14
  function fetchNetworkModification(modificationUuid) {
10
15
  const modificationFetchUrl = `${getUrl()}/${safeEncodeURIComponent(modificationUuid)}`;
11
16
  console.debug(modificationFetchUrl);
@@ -58,23 +63,15 @@ function getNetworkModificationsFromComposite(compositeModificationUuids, onlyMe
58
63
  console.debug(url);
59
64
  return backendFetchJson(url);
60
65
  }
61
- function changeCompositeSubModificationOrder(studyUuid, nodeUuid, modificationUuid, sourceCompositeUuid, targetCompositeUuid, beforeUuid) {
62
- console.info(`move composite sub-modification ${modificationUuid} in node ${nodeUuid}`);
63
- const params = new URLSearchParams();
64
- if (sourceCompositeUuid) params.set("sourceCompositeUuid", sourceCompositeUuid);
65
- if (targetCompositeUuid) params.set("targetCompositeUuid", targetCompositeUuid);
66
- if (beforeUuid) params.set("beforeUuid", beforeUuid);
67
- const paramsStr = params.toString() ? `?${params.toString()}` : ``;
68
- const url = `${getStudyUrlWithNodeUuid(studyUuid, nodeUuid)}/composite-sub-modification/${modificationUuid}${paramsStr}`;
66
+ function moveModification(studyUuid, nodeUuid, modificationUuid, sourceContainer, targetContainer, beforeUuid) {
67
+ console.info(`move modification ${modificationUuid} in node ${nodeUuid}`);
68
+ const url = `${getStudyUrlWithNodeUuid(studyUuid, nodeUuid)}/network-modification/${modificationUuid}`;
69
69
  console.debug(url);
70
- return backendFetch(url, { method: "put" });
71
- }
72
- function changeNetworkModificationOrder(studyUuid, nodeUuid, itemUuid, beforeUuid) {
73
- console.info(`reorder node ${nodeUuid} of study ${studyUuid}`);
74
- const beforeParam = new URLSearchParams({ beforeUuid: beforeUuid || "" }).toString();
75
- const url = `${getStudyUrlWithNodeUuid(studyUuid, nodeUuid)}/network-modification/${itemUuid}?${beforeParam}`;
76
- console.debug(url);
77
- return backendFetch(url, { method: "put" });
70
+ return backendFetch(url, {
71
+ method: "put",
72
+ headers: { "Content-Type": "application/json" },
73
+ body: JSON.stringify({ source: sourceContainer, target: targetContainer, beforeUuid })
74
+ });
78
75
  }
79
76
  const getStudyUrlWithNodeUuidAndRootNetworkUuid = (studyUuid, nodeUuid, rootNetworkUuid) => `${PREFIX_STUDY_QUERIES}/v1/studies/${safeEncodeURIComponent(studyUuid)}/root-networks/${safeEncodeURIComponent(
80
77
  rootNetworkUuid
@@ -104,13 +101,13 @@ function updateModificationStatusByRootNetwork(studyUuid, nodeUuid, rootNetworkU
104
101
  return backendFetch(url, { method: "PUT" });
105
102
  }
106
103
  export {
107
- changeCompositeSubModificationOrder,
108
- changeNetworkModificationOrder,
104
+ ModificationContainerType,
109
105
  fetchBusBarSectionsForNewCoupler,
110
106
  fetchNetworkModification,
111
107
  getBaseNetworkModificationUrl,
112
108
  getNetworkModificationsFromComposite,
113
109
  getStudyUrlWithNodeUuid,
110
+ moveModification,
114
111
  setModificationMetadata,
115
112
  updateModification,
116
113
  updateModificationStatusByRootNetwork,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gridsuite/commons-ui",
3
- "version": "0.251.0",
3
+ "version": "0.253.0",
4
4
  "description": "common react components for gridsuite applications",
5
5
  "author": "gridsuite team",
6
6
  "homepage": "https://github.com/gridsuite",