Skip to content

Commit 9951b26

Browse files
rework limits modification (#3278)
removes the comparison to the current state of the network + MODIFY_OR_ADD modification Signed-off-by: Mathieu DEHARBE <[email protected]>
1 parent ca6ce59 commit 9951b26

File tree

11 files changed

+206
-205
lines changed

11 files changed

+206
-205
lines changed

src/components/dialogs/limits/limits-groups-contextual-menu.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ import ListItemIcon from '@mui/material/ListItemIcon';
1818
import { ContentCopy, Delete, Edit } from '@mui/icons-material';
1919
import ListItemText from '@mui/material/ListItemText';
2020
import { useIntl } from 'react-intl';
21-
import { OperationalLimitsGroup } from '../../../services/network-modification-types';
2221
import { PopoverProps } from '@mui/material/Popover';
2322
import { APPLICABILITY } from '../../network/constants';
23+
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';
2424

2525
export interface LimitsGroupsContextualMenuProps {
2626
parentFormName: string;
@@ -81,11 +81,11 @@ export function LimitsGroupsContextualMenu({
8181
const handleDuplicateTab = () => {
8282
let newName: string = '';
8383
if (indexSelectedLimitSet !== null) {
84-
const duplicatedLimits1: OperationalLimitsGroup = getValues(
84+
const duplicatedLimits1: OperationalLimitsGroupFormInfos = getValues(
8585
`${operationalLimitsGroupsFormName}[${indexSelectedLimitSet}]`
8686
);
8787
newName = duplicatedLimits1.name + '_COPY';
88-
const newLimitsGroup1: OperationalLimitsGroup = {
88+
const newLimitsGroup1: OperationalLimitsGroupFormInfos = {
8989
...duplicatedLimits1,
9090
[ID]: newName,
9191
};

src/components/dialogs/limits/limits-pane-utils.ts

Lines changed: 79 additions & 154 deletions
Large diffs are not rendered by default.

src/components/dialogs/limits/limits-pane.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { LimitsSidePane } from './limits-side-pane';
1717
import { SelectedOperationalLimitGroup } from './selected-operational-limit-group.js';
1818
import { useCallback, useRef, useState } from 'react';
1919
import { useWatch } from 'react-hook-form';
20-
import { CurrentLimits, OperationalLimitsGroup } from '../../../services/network-modification-types';
20+
import { CurrentLimits } from '../../../services/network-modification-types';
2121
import { OperationalLimitsGroupsTabs } from './operational-limits-groups-tabs';
2222
import { tabStyles } from 'components/utils/tab-utils';
2323
import IconButton from '@mui/material/IconButton';
@@ -26,6 +26,7 @@ import GridSection from '../commons/grid-section';
2626
import { styles } from '../dialog-utils';
2727
import AddIcon from '@mui/icons-material/ControlPoint';
2828
import { APPLICABILITY } from '../../network/constants';
29+
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';
2930

3031
export interface LimitsPaneProps {
3132
id?: string;
@@ -44,7 +45,7 @@ export function LimitsPane({
4445

4546
const myRef: any = useRef<any>(null);
4647

47-
const limitsGroups: OperationalLimitsGroup[] = useWatch({
48+
const limitsGroups: OperationalLimitsGroupFormInfos[] = useWatch({
4849
name: `${id}.${OPERATIONAL_LIMITS_GROUPS}`,
4950
});
5051

@@ -72,10 +73,11 @@ export function LimitsPane({
7273
}
7374

7475
// checks if limit sets with that name already exist
75-
const sameNameInLs: OperationalLimitsGroup[] = limitsGroups
76+
const sameNameInLs: OperationalLimitsGroupFormInfos[] = limitsGroups
7677
.filter((_ls, index: number) => index !== indexSelectedLimitSet)
7778
.filter(
78-
(limitsGroup: OperationalLimitsGroup) => limitsGroup.name.trim() === editedLimitGroupName.trim()
79+
(limitsGroup: OperationalLimitsGroupFormInfos) =>
80+
limitsGroup.name.trim() === editedLimitGroupName.trim()
7981
);
8082

8183
// only 2 limit sets with the same name are allowed and only if there have SIDE1 and SIDE2 applicability
@@ -151,7 +153,7 @@ export function LimitsPane({
151153
<Grid item xs={6} sx={tabStyles.parametersBox} marginLeft={2}>
152154
{indexSelectedLimitSet !== null &&
153155
limitsGroups.map(
154-
(operationalLimitsGroup: OperationalLimitsGroup, index: number) =>
156+
(operationalLimitsGroup: OperationalLimitsGroupFormInfos, index: number) =>
155157
index === indexSelectedLimitSet && (
156158
<LimitsSidePane
157159
key={operationalLimitsGroup.id}

src/components/dialogs/limits/operational-limits-groups-tabs.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { tabStyles } from 'components/utils/tab-utils';
3232
import { APPLICABILITY } from '../../network/constants';
3333
import { type MuiStyles, NAME } from '@gridsuite/commons-ui';
3434
import { grey } from '@mui/material/colors';
35+
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';
3536

3637
const limitsStyles = {
3738
limitsBackground: {
@@ -55,7 +56,7 @@ const limitsStyles = {
5556

5657
export interface OperationalLimitsGroupsTabsProps {
5758
parentFormName: string;
58-
limitsGroups: OperationalLimitsGroup[];
59+
limitsGroups: OperationalLimitsGroupFormInfos[];
5960
indexSelectedLimitSet: number | null;
6061
setIndexSelectedLimitSet: React.Dispatch<React.SetStateAction<number | null>>;
6162
checkLimitSetUnicity: (editedLimitGroupName: string, newSelectedApplicability: string) => string;
@@ -285,7 +286,7 @@ export const OperationalLimitsGroupsTabs = forwardRef<any, OperationalLimitsGrou
285286
sx={tabStyles.listDisplay}
286287
visibleScrollbar
287288
>
288-
{limitsGroups.map((opLg: OperationalLimitsGroup, index: number) => (
289+
{limitsGroups.map((opLg: OperationalLimitsGroupFormInfos, index: number) => (
289290
<Tab
290291
onMouseEnter={() => setHoveredRowIndex(index)}
291292
onMouseLeave={() => setHoveredRowIndex(-1)}

src/components/dialogs/limits/selected-operational-limit-group.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { useMemo } from 'react';
88
import { useWatch } from 'react-hook-form';
99
import { Box } from '@mui/material';
1010
import { AutocompleteInput } from '@gridsuite/commons-ui';
11-
import { OperationalLimitsGroup } from '../../../services/network-modification-types';
1211
import { APPLICABILITY } from '../../network/constants';
1312
import { useIntl } from 'react-intl';
13+
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';
1414

1515
export interface SelectedOperationalLimitGroupProps {
1616
selectedFormName: string;
@@ -29,7 +29,7 @@ export const SelectedOperationalLimitGroup = ({
2929
previousValue,
3030
isABranchModif,
3131
}: Readonly<SelectedOperationalLimitGroupProps>) => {
32-
const optionsValues: OperationalLimitsGroup[] = useWatch({
32+
const optionsValues: OperationalLimitsGroupFormInfos[] = useWatch({
3333
name: optionsFormName,
3434
});
3535
const intl = useIntl();
@@ -38,12 +38,12 @@ export const SelectedOperationalLimitGroup = ({
3838
const finalOptions: string[] = optionsValues
3939
? optionsValues
4040
.filter(
41-
(optionObj: OperationalLimitsGroup) =>
41+
(optionObj: OperationalLimitsGroupFormInfos) =>
4242
optionObj.applicability &&
4343
(optionObj.applicability === filteredApplicability ||
4444
optionObj.applicability === APPLICABILITY.EQUIPMENT.id)
4545
)
46-
.map((filteredoptionObj: OperationalLimitsGroup) => filteredoptionObj.name)
46+
.map((filteredoptionObj: OperationalLimitsGroupFormInfos) => filteredoptionObj.name)
4747
.filter((id: string) => id != null)
4848
: [];
4949
if (isABranchModif) {

src/components/dialogs/limits/temporary-limits-table.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
77

8-
import { useState } from 'react';
9-
import { useFieldArray } from 'react-hook-form';
8+
import { useCallback, useState } from 'react';
9+
import { useFieldArray, useFormContext } from 'react-hook-form';
1010
import { Box, Grid, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';
1111
import {
1212
type ColumnNumeric,
@@ -21,7 +21,7 @@ import {
2121
import IconButton from '@mui/material/IconButton';
2222
import AddCircleIcon from '@mui/icons-material/AddCircle';
2323
import DeleteIcon from '@mui/icons-material/Delete';
24-
import { SELECTED } from '../../utils/field-constants';
24+
import { DELETION_MARK, SELECTED } from '../../utils/field-constants';
2525
import { TemporaryLimit } from '../../../services/network-modification-types';
2626

2727
const styles = {
@@ -92,8 +92,9 @@ function TemporaryLimitsTable({
9292
isValueModified,
9393
disableAddingRows = false,
9494
}: Readonly<TemporaryLimitsTableProps>) {
95-
const { fields, append, remove } = useFieldArray({ name: arrayFormName });
95+
const { fields, append } = useFieldArray({ name: arrayFormName });
9696
const [hoveredRowIndex, setHoveredRowIndex] = useState(-1);
97+
const { setValue, getValues } = useFormContext();
9798

9899
function renderTableCell(rowId: string, rowIndex: number, column: ColumnText | ColumnNumeric) {
99100
const name = `${arrayFormName}[${rowIndex}].${column.dataKey}`;
@@ -144,11 +145,19 @@ function TemporaryLimitsTable({
144145
);
145146
}
146147

148+
const deletionMarkFormName = useCallback(
149+
(index: number) => `${arrayFormName}[${index}].${DELETION_MARK}`,
150+
[arrayFormName]
151+
);
152+
147153
const renderTableRow = (rowId: string, index: number) => (
148154
<TableRow onMouseEnter={() => setHoveredRowIndex(index)} onMouseLeave={() => setHoveredRowIndex(-1)}>
149155
{columnsDefinition.map((column) => renderTableCell(rowId, index, column))}
150156
<TableCell key={rowId + 'delete'}>
151-
<IconButton color="primary" onClick={() => remove(index)}>
157+
<IconButton
158+
color="primary"
159+
onClick={() => setValue(deletionMarkFormName(index), true, { shouldDirty: true })}
160+
>
152161
<DeleteIcon visibility={index === hoveredRowIndex ? 'visible' : 'hidden'} />
153162
</IconButton>
154163
</TableCell>
@@ -158,7 +167,10 @@ function TemporaryLimitsTable({
158167
function renderTableBody() {
159168
return (
160169
<TableBody>
161-
{fields.map((value: Record<'id', string>, index: number) => renderTableRow(value.id, index))}
170+
{fields.map(
171+
(value: Record<'id', string>, index: number) =>
172+
!getValues(deletionMarkFormName(index)) && renderTableRow(value.id, index)
173+
)}
162174
</TableBody>
163175
);
164176
}

src/components/dialogs/network-modifications/line/modification/line-modification-dialog.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ import {
5858
getLimitsValidationSchema,
5959
addModificationTypeToOpLimitsGroups,
6060
getAllLimitsFormData,
61-
formatOpLimitGroups,
62-
updateOpLimitsGroups,
61+
formatOpLimitGroupsToFormInfos,
62+
combineFormAndMapServerLimitsGroups,
6363
addOperationTypeToSelectedOpLG,
6464
} from '../../../limits/limits-pane-utils';
6565
import {
@@ -101,7 +101,7 @@ import { UUID } from 'crypto';
101101
import { CurrentTreeNode } from '../../../../graph/tree-node.type';
102102
import { BranchInfos } from '../../../../../services/study/network-map.type';
103103
import { useIntl } from 'react-intl';
104-
import { LineModificationFormInfos } from './line-modification-type';
104+
import { LimitsDialogFormInfos, LineModificationFormInfos } from './line-modification-type';
105105
import { LineModificationInfos } from '../../../../../services/network-modification-types';
106106
import { toModificationOperation } from '../../../../utils/utils';
107107

@@ -205,7 +205,7 @@ const LineModificationDialog = ({
205205
b2: convertInputValue(FieldType.B2, lineModification.b2?.value ?? null),
206206
}),
207207
...getAllLimitsFormData(
208-
formatOpLimitGroups(lineModification.operationalLimitsGroups),
208+
formatOpLimitGroupsToFormInfos(lineModification.operationalLimitsGroups),
209209
lineModification.selectedOperationalLimitsGroup1?.value ?? null,
210210
lineModification.selectedOperationalLimitsGroup2?.value ?? null
211211
),
@@ -227,7 +227,7 @@ const LineModificationDialog = ({
227227
const connectivity2 = line[CONNECTIVITY]?.[CONNECTIVITY_2];
228228
const characteristics = line[CHARACTERISTICS];
229229
const stateEstimationData = line[STATE_ESTIMATION];
230-
const limits = line[LIMITS];
230+
const limits: LimitsDialogFormInfos = line[LIMITS];
231231

232232
modifyLine({
233233
studyUuid: studyUuid,
@@ -241,12 +241,7 @@ const LineModificationDialog = ({
241241
b1: convertOutputValue(FieldType.B1, characteristics[B1]),
242242
g2: convertOutputValue(FieldType.G2, characteristics[G2]),
243243
b2: convertOutputValue(FieldType.B2, characteristics[B2]),
244-
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(
245-
limits[OPERATIONAL_LIMITS_GROUPS],
246-
lineToModify,
247-
editData,
248-
currentNode
249-
),
244+
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(limits[OPERATIONAL_LIMITS_GROUPS]),
250245
selectedOperationalLimitsGroup1: addOperationTypeToSelectedOpLG(
251246
limits[SELECTED_LIMITS_GROUP_1],
252247
intl.formatMessage({
@@ -287,7 +282,7 @@ const LineModificationDialog = ({
287282
});
288283
});
289284
},
290-
[studyUuid, currentNodeUuid, editData, selectedId, lineToModify, currentNode, intl, snackError]
285+
[studyUuid, currentNodeUuid, editData, selectedId, intl, snackError]
291286
);
292287

293288
const clear = useCallback(() => {
@@ -315,7 +310,10 @@ const LineModificationDialog = ({
315310
...formValues,
316311
...{
317312
[LIMITS]: {
318-
[OPERATIONAL_LIMITS_GROUPS]: updateOpLimitsGroups(formValues, line),
313+
[OPERATIONAL_LIMITS_GROUPS]: combineFormAndMapServerLimitsGroups(
314+
formValues,
315+
line
316+
),
319317
},
320318
},
321319
[ADDITIONAL_PROPERTIES]: getConcatenatedProperties(line, getValues),

src/components/dialogs/network-modifications/line/modification/line-modification-type.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@
88
import { UUID } from 'crypto';
99
import { OperationalLimitsGroup } from '../../../../../services/network-modification-types';
1010
import { Property } from '../../common/properties/property-utils';
11+
import {
12+
APPLICABIlITY,
13+
CURRENT_LIMITS,
14+
DELETION_MARK,
15+
ID,
16+
NAME,
17+
OPERATIONAL_LIMITS_GROUPS,
18+
PERMANENT_LIMIT,
19+
SELECTED_LIMITS_GROUP_1,
20+
SELECTED_LIMITS_GROUP_2,
21+
TEMPORARY_LIMIT_DURATION,
22+
TEMPORARY_LIMIT_NAME,
23+
TEMPORARY_LIMIT_VALUE,
24+
TEMPORARY_LIMITS,
25+
} from '../../../../utils/field-constants';
1126

1227
export interface LineModificationFormInfos {
1328
equipmentId?: string;
@@ -51,5 +66,33 @@ export interface LineModificationFormInfos {
5166
AdditionalProperties: any;
5267
characteristics: any;
5368
stateEstimation: any;
54-
limits: any;
69+
limits: LimitsDialogFormInfos;
70+
}
71+
72+
export interface LimitsDialogFormInfos {
73+
[SELECTED_LIMITS_GROUP_1]: string | null;
74+
[SELECTED_LIMITS_GROUP_2]: string | null;
75+
[OPERATIONAL_LIMITS_GROUPS]: OperationalLimitsGroupFormInfos[];
76+
}
77+
78+
export interface OperationalLimitsGroupFormInfos {
79+
// here 'id' is a concatenation of NAME and APPLICABIlITY because 2 limits sets on side1 and 2 may have the same name
80+
// "ID" from the map server is stored as NAME in the form because of this
81+
[ID]: string;
82+
[APPLICABIlITY]?: string;
83+
[NAME]: string;
84+
[CURRENT_LIMITS]: CurrentLimitsFormInfos;
85+
}
86+
87+
export interface CurrentLimitsFormInfos {
88+
[ID]: string;
89+
[PERMANENT_LIMIT]: number | null;
90+
[TEMPORARY_LIMITS]: TemporaryLimitFormInfos[];
91+
}
92+
93+
export interface TemporaryLimitFormInfos {
94+
[TEMPORARY_LIMIT_NAME]: string;
95+
[TEMPORARY_LIMIT_DURATION]: number | null;
96+
[TEMPORARY_LIMIT_VALUE]: number | null;
97+
[DELETION_MARK]: boolean;
5598
}

src/components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog.jsx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,11 @@ import {
9191
import {
9292
addModificationTypeToOpLimitsGroups,
9393
addOperationTypeToSelectedOpLG,
94-
formatOpLimitGroups,
94+
formatOpLimitGroupsToFormInfos,
9595
getAllLimitsFormData,
9696
getLimitsEmptyFormData,
9797
getLimitsValidationSchema,
98-
updateOpLimitsGroups,
98+
combineFormAndMapServerLimitsGroups,
9999
} from '../../../limits/limits-pane-utils';
100100
import { useOpenShortWaitFetching } from 'components/dialogs/commons/handle-modification-form';
101101
import TwoWindingsTransformerModificationDialogHeader from './two-windings-transformer-modification-dialog-header';
@@ -247,7 +247,7 @@ const TwoWindingsTransformerModificationDialog = ({
247247
}),
248248
...getStateEstimationEditData(STATE_ESTIMATION, twtModification),
249249
...getAllLimitsFormData(
250-
formatOpLimitGroups(twtModification.operationalLimitsGroups),
250+
formatOpLimitGroupsToFormInfos(twtModification.operationalLimitsGroups),
251251
twtModification.selectedOperationalLimitsGroup1?.value ?? null,
252252
twtModification.selectedOperationalLimitsGroup2?.value ?? null
253253
),
@@ -483,12 +483,7 @@ const TwoWindingsTransformerModificationDialog = ({
483483
ratedS: toModificationOperation(characteristics[RATED_S]),
484484
ratedU1: toModificationOperation(characteristics[RATED_U1]),
485485
ratedU2: toModificationOperation(characteristics[RATED_U2]),
486-
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(
487-
limits[OPERATIONAL_LIMITS_GROUPS],
488-
twtToModify,
489-
editData,
490-
currentNode
491-
),
486+
operationalLimitsGroups: addModificationTypeToOpLimitsGroups(limits[OPERATIONAL_LIMITS_GROUPS]),
492487
selectedLimitsGroup1: addOperationTypeToSelectedOpLG(
493488
limits[SELECTED_LIMITS_GROUP_1],
494489
intl.formatMessage({
@@ -538,8 +533,6 @@ const TwoWindingsTransformerModificationDialog = ({
538533
currentNodeUuid,
539534
editData,
540535
selectedId,
541-
twtToModify,
542-
currentNode,
543536
intl,
544537
computeRatioTapForSubmit,
545538
computePhaseTapForSubmit,
@@ -660,7 +653,10 @@ const TwoWindingsTransformerModificationDialog = ({
660653
...formValues,
661654
...{
662655
[LIMITS]: {
663-
[OPERATIONAL_LIMITS_GROUPS]: updateOpLimitsGroups(formValues, twt),
656+
[OPERATIONAL_LIMITS_GROUPS]: combineFormAndMapServerLimitsGroups(
657+
formValues,
658+
twt
659+
),
664660
},
665661
},
666662
...getRatioTapChangerFormData({

src/components/utils/field-constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ export const TEMPORARY_LIMIT_DURATION = 'acceptableDuration';
204204
export const TEMPORARY_LIMIT_VALUE = 'value';
205205
export const TEMPORARY_LIMIT_MODIFICATION_TYPE = {
206206
MODIFY: 'MODIFY',
207+
MODIFY_OR_ADD: 'MODIFY_OR_ADD', // if the limit exists it is modified, if not it is created
207208
ADD: 'ADD',
208209
DELETE: 'DELETE',
209210
REPLACE: 'REPLACE',

0 commit comments

Comments
 (0)