Skip to content

Commit 41e2d70

Browse files
add switch for operational limits group edition (#3306)
Signed-off-by: Mathieu DEHARBE <[email protected]>
1 parent f8cf4cd commit 41e2d70

File tree

13 files changed

+146
-87
lines changed

13 files changed

+146
-87
lines changed

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
APPLICABIlITY,
1111
CURRENT_LIMITS,
1212
DELETION_MARK,
13+
ENABLE_OLG_MODIFICATION,
1314
ID,
1415
LIMIT_SETS_MODIFICATION_TYPE,
1516
LIMITS,
@@ -102,6 +103,7 @@ const limitsValidationSchemaCreation = (id: string, isModification: boolean) =>
102103
}),
103104
[SELECTED_LIMITS_GROUP_1]: yup.string().nullable(),
104105
[SELECTED_LIMITS_GROUP_2]: yup.string().nullable(),
106+
[ENABLE_OLG_MODIFICATION]: yup.boolean(),
105107
};
106108
return { [id]: yup.object().shape(completeLimitsGroupSchema) };
107109
};
@@ -115,6 +117,7 @@ const limitsEmptyFormData = (id: string) => {
115117
[OPERATIONAL_LIMITS_GROUPS]: [],
116118
[SELECTED_LIMITS_GROUP_1]: null,
117119
[SELECTED_LIMITS_GROUP_2]: null,
120+
[ENABLE_OLG_MODIFICATION]: false,
118121
};
119122

120123
return { [id]: limitsGroup };
@@ -148,13 +151,15 @@ export const getAllLimitsFormData = (
148151
operationalLimitsGroups: OperationalLimitsGroupFormInfos[] = [],
149152
selectedOperationalLimitsGroup1: string | null = null,
150153
selectedOperationalLimitsGroup2: string | null = null,
154+
enableOLGModification?: boolean,
151155
id = LIMITS
152156
) => {
153157
return {
154158
[id]: {
155159
[OPERATIONAL_LIMITS_GROUPS]: operationalLimitsGroups,
156160
[SELECTED_LIMITS_GROUP_1]: selectedOperationalLimitsGroup1,
157161
[SELECTED_LIMITS_GROUP_2]: selectedOperationalLimitsGroup2,
162+
[ENABLE_OLG_MODIFICATION]: !!enableOLGModification,
158163
},
159164
};
160165
};
@@ -220,6 +225,21 @@ export const updateTemporaryLimits = (
220225
return updatedTemporaryLimits;
221226
};
222227

228+
export const mapServerLimitsGroupsToFormInfos = (currentLimits: CurrentLimits[]) => {
229+
return currentLimits?.map((currentLimit: CurrentLimits) => {
230+
return {
231+
id: currentLimit.id + currentLimit.applicability,
232+
name: currentLimit.id,
233+
applicability: currentLimit.applicability,
234+
currentLimits: {
235+
id: currentLimit.id,
236+
permanentLimit: null,
237+
temporaryLimits: formatToTemporaryLimitsFormInfos(currentLimit.temporaryLimits),
238+
},
239+
};
240+
});
241+
};
242+
223243
/**
224244
* extract data loaded from the map server and merge it with local data
225245
* in order to fill the operational limits groups modification interface
@@ -228,10 +248,10 @@ export const combineFormAndMapServerLimitsGroups = (
228248
formBranchModification: LineModificationFormInfos,
229249
mapServerBranch: BranchInfos
230250
): OperationalLimitsGroupFormInfos[] => {
231-
let updatedOpLG: OperationalLimitsGroupFormInfos[] = formBranchModification.limits.operationalLimitsGroups ?? [];
251+
let updatedOpLG: OperationalLimitsGroupFormInfos[] = formBranchModification?.limits?.operationalLimitsGroups ?? [];
232252

233253
// updates limit values :
234-
updatedOpLG.forEach((opLG: OperationalLimitsGroupFormInfos) => {
254+
for (const opLG of updatedOpLG) {
235255
const equivalentFromMapServer = mapServerBranch.currentLimits?.find(
236256
(currentLimit: CurrentLimits) =>
237257
currentLimit.id === opLG.name && currentLimit.applicability === opLG[APPLICABIlITY]
@@ -242,7 +262,7 @@ export const combineFormAndMapServerLimitsGroups = (
242262
formatTemporaryLimits(equivalentFromMapServer.temporaryLimits)
243263
);
244264
}
245-
});
265+
}
246266

247267
// adds all the operational limits groups from mapServerBranch THAT ARE NOT DELETED by the netmod
248268
mapServerBranch.currentLimits?.forEach((currentLimit: CurrentLimits) => {
@@ -321,6 +341,7 @@ export const addModificationTypeToOpLimitsGroups = (
321341
applicability: limitsGroupForm.applicability,
322342
currentLimits: currentLimits,
323343
modificationType: LIMIT_SETS_MODIFICATION_TYPE.MODIFY_OR_ADD,
344+
temporaryLimitsModificationType: TEMPORARY_LIMIT_MODIFICATION_TYPE.REPLACE,
324345
};
325346
});
326347
};

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

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88
import { Grid } from '@mui/material';
99
import {
1010
CURRENT_LIMITS,
11+
ENABLE_OLG_MODIFICATION,
1112
LIMITS,
1213
OPERATIONAL_LIMITS_GROUPS,
1314
SELECTED_LIMITS_GROUP_1,
1415
SELECTED_LIMITS_GROUP_2,
1516
} from 'components/utils/field-constants';
1617
import { LimitsSidePane } from './limits-side-pane';
1718
import { SelectedOperationalLimitGroup } from './selected-operational-limit-group.js';
18-
import { useCallback, useRef, useState } from 'react';
19-
import { useWatch } from 'react-hook-form';
19+
import { useCallback, useMemo, useRef, useState } from 'react';
20+
import { useFormContext, useWatch } from 'react-hook-form';
2021
import { CurrentLimits } from '../../../services/network-modification-types';
2122
import { OperationalLimitsGroupsTabs } from './operational-limits-groups-tabs';
2223
import { tabStyles } from 'components/utils/tab-utils';
@@ -27,6 +28,8 @@ import { styles } from '../dialog-utils';
2728
import AddIcon from '@mui/icons-material/ControlPoint';
2829
import { APPLICABILITY } from '../../network/constants';
2930
import { OperationalLimitsGroupFormInfos } from '../network-modifications/line/modification/line-modification-type';
31+
import { InputWithPopupConfirmation, SwitchInput } from '@gridsuite/commons-ui';
32+
import { mapServerLimitsGroupsToFormInfos } from './limits-pane-utils';
3033
import { BranchInfos } from '../../../services/study/network-map.type';
3134

3235
export interface LimitsPaneProps {
@@ -43,12 +46,18 @@ export function LimitsPane({
4346
clearableFields,
4447
}: Readonly<LimitsPaneProps>) {
4548
const [indexSelectedLimitSet, setIndexSelectedLimitSet] = useState<number | null>(null);
49+
const { reset, getValues } = useFormContext();
4650

4751
const myRef: any = useRef<any>(null);
4852

4953
const limitsGroups: OperationalLimitsGroupFormInfos[] = useWatch({
5054
name: `${id}.${OPERATIONAL_LIMITS_GROUPS}`,
5155
});
56+
const olgEditable: boolean = useWatch({
57+
name: `${id}.${ENABLE_OLG_MODIFICATION}`,
58+
});
59+
60+
const isAModification: boolean = useMemo(() => !!equipmentToModify, [equipmentToModify]);
5261

5362
const onAddClick = useCallback(() => myRef.current?.addNewLimitSet(), []);
5463

@@ -101,6 +110,20 @@ export function LimitsPane({
101110
[indexSelectedLimitSet, limitsGroups]
102111
);
103112

113+
const handlePopupConfirmation = () => {
114+
const resetOLGs: OperationalLimitsGroupFormInfos[] = mapServerLimitsGroupsToFormInfos(
115+
equipmentToModify?.currentLimits ?? []
116+
);
117+
const currentValues = getValues();
118+
reset({
119+
...currentValues,
120+
[LIMITS]: {
121+
[OPERATIONAL_LIMITS_GROUPS]: resetOLGs,
122+
[ENABLE_OLG_MODIFICATION]: false,
123+
},
124+
});
125+
};
126+
104127
return (
105128
<>
106129
{/* active limit sets */}
@@ -126,6 +149,20 @@ export function LimitsPane({
126149
isABranchModif={!!equipmentToModify}
127150
/>
128151
</Grid>
152+
<Grid item xs={3}>
153+
{/* if the user wants to switch off the modification a modal asks him to confirm */}
154+
{isAModification && (
155+
<InputWithPopupConfirmation
156+
Input={SwitchInput}
157+
name={`${id}.${ENABLE_OLG_MODIFICATION}`}
158+
label={olgEditable ? 'Edit' : 'View'}
159+
shouldOpenPopup={() => olgEditable}
160+
resetOnConfirmation={handlePopupConfirmation}
161+
message="disableOLGedition"
162+
validateButtonLabel="button.changeType"
163+
/>
164+
)}
165+
</Grid>
129166
</Grid>
130167

131168
{/* limits */}
@@ -134,7 +171,7 @@ export function LimitsPane({
134171
<GridSection title="LimitSets" />
135172
</Grid>
136173
<Grid container item xs={0.5}>
137-
<IconButton color="primary" sx={styles.button} onClick={onAddClick}>
174+
<IconButton color="primary" sx={styles.button} onClick={onAddClick} disabled={!olgEditable}>
138175
<AddIcon />
139176
</IconButton>
140177
</Grid>
@@ -149,6 +186,7 @@ export function LimitsPane({
149186
setIndexSelectedLimitSet={setIndexSelectedLimitSet}
150187
checkLimitSetUnicity={checkLimitSetUnicity}
151188
isAModification={!!equipmentToModify}
189+
editable={olgEditable}
152190
currentLimitsToModify={equipmentToModify?.currentLimits ?? []}
153191
/>
154192
</Grid>
@@ -173,6 +211,7 @@ export function LimitsPane({
173211
currentNode={currentNode}
174212
selectedLimitSetName={operationalLimitsGroup.name}
175213
checkLimitSetUnicity={checkLimitSetUnicity}
214+
disabled={!olgEditable}
176215
/>
177216
)
178217
)}

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

Lines changed: 33 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import { TemporaryLimit } from '../../../services/network-modification-types';
3333
import TemporaryLimitsTable from './temporary-limits-table';
3434
import LimitsChart from './limitsChart';
3535
import { CurrentTreeNode } from '../../graph/tree-node.type';
36-
import GridSection from '../commons/grid-section';
3736
import { APPLICABILITY } from '../../network/constants';
3837

3938
export interface LimitsSidePaneProps {
@@ -46,6 +45,7 @@ export interface LimitsSidePaneProps {
4645
currentNode?: CurrentTreeNode;
4746
selectedLimitSetName?: string;
4847
checkLimitSetUnicity: (editedLimitGroupName: string, newSelectedApplicability: string) => string;
48+
disabled: boolean;
4949
}
5050

5151
export function LimitsSidePane({
@@ -58,6 +58,7 @@ export function LimitsSidePane({
5858
currentNode,
5959
selectedLimitSetName,
6060
checkLimitSetUnicity,
61+
disabled,
6162
}: Readonly<LimitsSidePaneProps>) {
6263
const intl = useIntl();
6364
const { setError, getValues } = useFormContext();
@@ -163,31 +164,6 @@ export function LimitsSidePane({
163164
[findTemporaryLimit, shouldReturnPreviousValue]
164165
);
165166

166-
const disableTableCell = useCallback(
167-
(
168-
rowIndex: number,
169-
column: ColumnText | ColumnNumeric,
170-
arrayFormName: string,
171-
temporaryLimits?: TemporaryLimit[]
172-
) => {
173-
// If the temporary limit is added, all fields are editable
174-
// otherwise, only the value field is editable
175-
let disable: boolean =
176-
temporaryLimitHasPreviousValue(rowIndex, arrayFormName, temporaryLimits) &&
177-
column.dataKey !== TEMPORARY_LIMIT_VALUE;
178-
179-
if (
180-
getValues(arrayFormName) &&
181-
getValues(arrayFormName)[rowIndex]?.modificationType === TEMPORARY_LIMIT_MODIFICATION_TYPE.ADD
182-
) {
183-
disable = false;
184-
}
185-
186-
return disable;
187-
},
188-
[getValues, temporaryLimitHasPreviousValue]
189-
);
190-
191167
const isValueModified = useCallback(
192168
(rowIndex: number, arrayFormName: string) => {
193169
const temporaryLimits = getValues(arrayFormName);
@@ -211,45 +187,44 @@ export function LimitsSidePane({
211187
label="PermanentCurrentLimitText"
212188
adornment={AmpereAdornment}
213189
previousValue={permanentCurrentLimitPreviousValue ?? undefined}
214-
clearable={clearableFields}
190+
clearable={!disabled && clearableFields}
191+
disabled={disabled}
215192
/>
216193
),
217-
[clearableFields, limitsGroupFormName, permanentCurrentLimitPreviousValue]
194+
[clearableFields, disabled, limitsGroupFormName, permanentCurrentLimitPreviousValue]
218195
);
219196

220197
return (
221198
<Box sx={{ p: 2 }}>
222199
{limitsGroupApplicabilityName && (
223-
<>
224-
<GridSection title={selectedLimitSetName ?? ''} isLiteralText />
225-
<Grid container justifyContent="flex-start" alignItems="center" sx={{ paddingBottom: '15px' }}>
226-
<Grid item xs={2}>
227-
<FormattedMessage id="Applicability" />
228-
</Grid>
229-
<Grid item xs={4}>
230-
<SelectInput
231-
options={Object.values(APPLICABILITY)}
232-
name={`${limitsGroupApplicabilityName}.${APPLICABIlITY}`}
233-
previousValue={applicabilityPreviousValue}
234-
sx={{ flexGrow: 1 }}
235-
disableClearable
236-
size="small"
237-
onCheckNewValue={(value: Option | null) => {
238-
if (value) {
239-
const errorMessage: string = checkLimitSetUnicity(
240-
selectedLimitSetName ?? '',
241-
typeof value === 'string' ? value : value.id
242-
);
243-
setError(`${limitsGroupApplicabilityName}.${APPLICABIlITY}`, {
244-
message: errorMessage,
245-
});
246-
}
247-
return true;
248-
}}
249-
/>
250-
</Grid>
200+
<Grid container justifyContent="flex-start" alignItems="center" sx={{ paddingBottom: '15px' }}>
201+
<Grid item xs={2}>
202+
<FormattedMessage id="Applicability" />
203+
</Grid>
204+
<Grid item xs={4}>
205+
<SelectInput
206+
options={Object.values(APPLICABILITY)}
207+
name={`${limitsGroupApplicabilityName}.${APPLICABIlITY}`}
208+
previousValue={applicabilityPreviousValue}
209+
sx={{ flexGrow: 1 }}
210+
disableClearable
211+
size="small"
212+
disabled={disabled}
213+
onCheckNewValue={(value: Option | null) => {
214+
if (value) {
215+
const errorMessage: string = checkLimitSetUnicity(
216+
selectedLimitSetName ?? '',
217+
typeof value === 'string' ? value : value.id
218+
);
219+
setError(`${limitsGroupApplicabilityName}.${APPLICABIlITY}`, {
220+
message: errorMessage,
221+
});
222+
}
223+
return true;
224+
}}
225+
/>
251226
</Grid>
252-
</>
227+
</Grid>
253228
)}
254229
<Box>
255230
<LimitsChart
@@ -266,9 +241,9 @@ export function LimitsSidePane({
266241
createRow={createRows}
267242
columnsDefinition={columnsDefinition}
268243
previousValues={temporaryLimitsPreviousValues}
269-
disableTableCell={disableTableCell}
270244
getPreviousValue={getPreviousValue}
271245
isValueModified={isValueModified}
246+
disabled={disabled}
272247
/>
273248
</Box>
274249
);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export interface OperationalLimitsGroupsTabsProps {
6161
setIndexSelectedLimitSet: React.Dispatch<React.SetStateAction<number | null>>;
6262
checkLimitSetUnicity: (editedLimitGroupName: string, newSelectedApplicability: string) => string;
6363
isAModification: boolean;
64+
editable: boolean;
6465
currentLimitsToModify: CurrentLimits[];
6566
}
6667

@@ -90,6 +91,7 @@ export const OperationalLimitsGroupsTabs = forwardRef<any, OperationalLimitsGrou
9091
indexSelectedLimitSet,
9192
checkLimitSetUnicity,
9293
isAModification,
94+
editable,
9395
currentLimitsToModify,
9496
},
9597
ref
@@ -343,7 +345,7 @@ export const OperationalLimitsGroupsTabs = forwardRef<any, OperationalLimitsGrou
343345
handleOpenMenu(e, index)
344346
}
345347
// during the naming of a limit set no other limit set manipulation is allowed :
346-
disabled={editingTabIndex !== -1}
348+
disabled={!editable || editingTabIndex !== -1}
347349
>
348350
<MenuIcon fontSize="small" />
349351
</IconButton>

0 commit comments

Comments
 (0)