Skip to content

Commit eb18831

Browse files
committed
Save selected line segments infos used to generate limitsets from line catalog
Signed-off-by: basseche <bassel.el-cheikh_externe@rte-france.com>
1 parent fe89e94 commit eb18831

9 files changed

Lines changed: 183 additions & 11 deletions

File tree

src/components/dialogs/line-types-catalog/line-type-segment-dialog.tsx

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
TOTAL_SUSCEPTANCE,
2323
} from '../../utils/field-constants';
2424
import { InferType } from 'yup';
25+
import { LineSegmentInfos } from '../../../services/network-modification-types';
2526

2627
const LineTypeSegmentSchema = yup
2728
.object()
@@ -46,22 +47,50 @@ export interface LineTypeSegmentDialogProps {
4647
open: boolean;
4748
onClose: () => void;
4849
onSave: (data: ComputedLineCharacteristics) => void;
50+
editData?: LineSegmentInfos[];
51+
setSegments?: (segments: LineSegmentInfos[]) => void;
4952
}
5053

5154
export type LineTypeSegmentDialogSchemaForm = InferType<typeof LineTypeSegmentSchema>;
5255

53-
export default function LineTypeSegmentDialog({ open, onSave, onClose }: Readonly<LineTypeSegmentDialogProps>) {
56+
export default function LineTypeSegmentDialog({
57+
open,
58+
onSave,
59+
onClose,
60+
editData,
61+
setSegments,
62+
}: Readonly<LineTypeSegmentDialogProps>) {
5463
const formMethods = useForm<DeepNullable<LineTypeSegmentDialogSchemaForm>>({
5564
defaultValues: emptyFormData,
5665
resolver: yupResolver<DeepNullable<LineTypeSegmentDialogSchemaForm>>(LineTypeSegmentSchema),
5766
});
5867

5968
const { reset } = formMethods;
60-
69+
const { getValues } = formMethods;
6170
const handleClear = useCallback(() => {
6271
reset(emptyFormData);
6372
}, [reset]);
6473

74+
const onSubmit = useCallback(
75+
(data: ComputedLineCharacteristics) => {
76+
const segmentsData = getValues(`${SEGMENTS}`);
77+
if (segmentsData && setSegments) {
78+
const segments: LineSegmentInfos[] = segmentsData.map((segment) => {
79+
return {
80+
segmentTypeId: segment?.segmentTypeId ?? '',
81+
segmentDistanceValue: segment?.segmentDistanceValue ?? 0,
82+
area: segment?.area ?? '',
83+
temperature: segment?.temperature ?? '',
84+
shapeFactor: segment?.shapeFactor ?? null,
85+
};
86+
});
87+
setSegments(segments ?? []);
88+
}
89+
onSave(data);
90+
},
91+
[getValues, onSave, setSegments]
92+
);
93+
6594
return (
6695
<CustomFormProvider validationSchema={LineTypeSegmentSchema} {...formMethods}>
6796
<ModificationDialog
@@ -71,9 +100,9 @@ export default function LineTypeSegmentDialog({ open, onSave, onClose }: Readonl
71100
titleId="LineTypesCatalogDialogTitle"
72101
open={open}
73102
onClose={onClose}
74-
onSave={onSave}
103+
onSave={onSubmit}
75104
>
76-
<LineTypeSegmentForm />
105+
<LineTypeSegmentForm editData={editData} />
77106
</ModificationDialog>
78107
</CustomFormProvider>
79108
);

src/components/dialogs/line-types-catalog/line-type-segment-form.tsx

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Box, Grid } from '@mui/material';
1111
import { FormattedMessage, useIntl } from 'react-intl';
1212
import { ReadOnlyInput } from '../../utils/rhf-inputs/read-only/read-only-input';
1313
import {
14+
AREA,
1415
FINAL_CURRENT_LIMITS,
1516
SEGMENT_CURRENT_LIMITS,
1617
SEGMENT_DISTANCE_VALUE,
@@ -20,6 +21,8 @@ import {
2021
SEGMENT_TYPE_ID,
2122
SEGMENT_TYPE_VALUE,
2223
SEGMENTS,
24+
SHAPE_FACTOR,
25+
TEMPERATURE,
2326
TOTAL_REACTANCE,
2427
TOTAL_RESISTANCE,
2528
TOTAL_SUSCEPTANCE,
@@ -48,6 +51,7 @@ import {
4851
import { emptyLineSegment, SegmentFormData } from './segment-utils';
4952
import { ColDef } from 'ag-grid-community';
5053
import GridSection from '../commons/grid-section';
54+
import { LineSegmentInfos } from '../../../services/network-modification-types';
5155

5256
const styles = {
5357
h3: {
@@ -64,7 +68,11 @@ const styles = {
6468
},
6569
} as const satisfies MuiStyles;
6670

67-
export const LineTypeSegmentForm = () => {
71+
export interface LineTypeSegmentFormProps {
72+
editData?: LineSegmentInfos[];
73+
}
74+
75+
export const LineTypeSegmentForm = ({ editData }: Readonly<LineTypeSegmentFormProps>) => {
6876
const { setValue, getValues, clearErrors } = useFormContext();
6977
const [lineTypesCatalog, setLineTypesCatalog] = useState<LineTypeInfo[]>([]);
7078
const [openCatalogDialogIndex, setOpenCatalogDialogIndex] = useState<number | null>(null);
@@ -117,6 +125,15 @@ export const LineTypeSegmentForm = () => {
117125
[setValue]
118126
);
119127

128+
const updateLimits = useCallback(
129+
(index: number, id: string, area: string | null, temperature: string | null, shapeFactor: number | null) => {
130+
getLineTypeWithLimits(id, area, temperature, shapeFactor).then((lineTypeWithLimits) => {
131+
updateSegmentLimitsValues(index, lineTypeWithLimits.limitsForLineType);
132+
});
133+
},
134+
[updateSegmentLimitsValues]
135+
);
136+
120137
const updateTotals = useCallback(() => {
121138
const segments: SegmentFormData[] = getValues(SEGMENTS);
122139
const totalResistance = segments.reduce(
@@ -179,6 +196,42 @@ export const LineTypeSegmentForm = () => {
179196
setValue(FINAL_CURRENT_LIMITS, Array.from(mostContrainingLimits.values()));
180197
}, [getValues, setValue, setCurrentLimitResult]);
181198

199+
useEffect(() => {
200+
if (!editData) {
201+
return;
202+
}
203+
for (let index = 0; index < editData?.length; index++) {
204+
const segmentCatalogId = editData[index][SEGMENT_TYPE_ID];
205+
setValue(`${SEGMENTS}.${index}.${SEGMENT_TYPE_ID}`, segmentCatalogId);
206+
const lineTypeInfo: LineTypeInfo | undefined = lineTypesCatalog.find(
207+
(segment) => segment.id === segmentCatalogId
208+
);
209+
setValue(`${SEGMENTS}.${index}.${SEGMENT_TYPE_VALUE}`, lineTypeInfo?.type ?? '');
210+
setValue(`${SEGMENTS}.${index}.${SEGMENT_DISTANCE_VALUE}`, Number(editData[index][SEGMENT_DISTANCE_VALUE]));
211+
setValue(`${SEGMENTS}.${index}.${AREA}`, editData[index][AREA]);
212+
setValue(`${SEGMENTS}.${index}.${TEMPERATURE}`, editData[index][TEMPERATURE]);
213+
setValue(`${SEGMENTS}.${index}.${SHAPE_FACTOR}`, editData[index][SHAPE_FACTOR]);
214+
updateLimits(
215+
index,
216+
segmentCatalogId,
217+
editData[index][AREA],
218+
editData[index][TEMPERATURE],
219+
editData[index][SHAPE_FACTOR]
220+
);
221+
updateSegmentValues(index);
222+
updateTotals();
223+
keepMostConstrainingLimits();
224+
}
225+
}, [
226+
editData,
227+
updateLimits,
228+
keepMostConstrainingLimits,
229+
lineTypesCatalog,
230+
setValue,
231+
updateSegmentValues,
232+
updateTotals,
233+
]);
234+
182235
const onSelectCatalogLine = useCallback(
183236
(selectedLine: LineTypeInfo, selectedAreaAndTemperature2LineTypeData: AreaTemperatureShapeFactorInfo) => {
184237
getLineTypeWithLimits(
@@ -193,6 +246,18 @@ export const LineTypeSegmentForm = () => {
193246
const selectedTypeId = lineTypeWithLimits.id ?? '';
194247
setValue(`${SEGMENTS}.${openCatalogDialogIndex}.${SEGMENT_TYPE_VALUE}`, selectedType);
195248
setValue(`${SEGMENTS}.${openCatalogDialogIndex}.${SEGMENT_TYPE_ID}`, selectedTypeId);
249+
setValue(
250+
`${SEGMENTS}.${openCatalogDialogIndex}.${AREA}`,
251+
selectedAreaAndTemperature2LineTypeData?.area
252+
);
253+
setValue(
254+
`${SEGMENTS}.${openCatalogDialogIndex}.${TEMPERATURE}`,
255+
selectedAreaAndTemperature2LineTypeData?.temperature
256+
);
257+
setValue(
258+
`${SEGMENTS}.${openCatalogDialogIndex}.${SHAPE_FACTOR}`,
259+
selectedAreaAndTemperature2LineTypeData?.shapeFactor
260+
);
196261
clearErrors(`${SEGMENTS}.${openCatalogDialogIndex}.${SEGMENT_TYPE_VALUE}`);
197262
updateSegmentValues(openCatalogDialogIndex);
198263
updateSegmentLimitsValues(openCatalogDialogIndex, lineTypeWithLimits.limitsForLineType);
@@ -249,6 +314,17 @@ export const LineTypeSegmentForm = () => {
249314
[getValues]
250315
);
251316

317+
const getPreselectedRowData = useCallback(
318+
(index: number) => {
319+
return {
320+
temperature: getValues(`${SEGMENTS}.${index}.${TEMPERATURE}`),
321+
area: getValues(`${SEGMENTS}.${index}.${AREA}`),
322+
shapeFactor: getValues(`${SEGMENTS}.${index}.${SHAPE_FACTOR}`),
323+
};
324+
},
325+
[getValues]
326+
);
327+
252328
const segmentTypeHeader = (
253329
<Box sx={styles.header}>
254330
<FormattedMessage id={'lineTypes.type'} />
@@ -415,6 +491,7 @@ export const LineTypeSegmentForm = () => {
415491
rowData={lineTypesCatalog}
416492
onSelectLine={onSelectCatalogLine}
417493
preselectedRowId={getPreselectedRowIdForCatalog(openCatalogDialogIndex)}
494+
preselectedParams={getPreselectedRowData(openCatalogDialogIndex)}
418495
/>
419496
)}
420497
</>

src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { getLineTypeWithAreaAndTemperature } from '../../../services/network-mod
2222
import { ModificationDialog } from '../commons/modificationDialog';
2323
import yup from '../../utils/yup-config';
2424
import { yupResolver } from '@hookform/resolvers/yup';
25-
import LineTypesCatalogSelectorForm from './line-types-catalog-selector-form';
25+
import LineTypesCatalogSelectorForm, { LineCatalogParams } from './line-types-catalog-selector-form';
2626

2727
const formSchema = yup
2828
.object()
@@ -86,13 +86,15 @@ export type LineTypesCatalogSelectorDialogProps = {
8686
preselectedRowId: string;
8787
rowData: LineTypeInfo[];
8888
onClose: () => void;
89+
preselectedParams?: LineCatalogParams;
8990
};
9091

9192
export default function LineTypesCatalogSelectorDialog({
9293
onSelectLine,
9394
preselectedRowId,
9495
rowData,
9596
onClose,
97+
preselectedParams,
9698
...dialogProps
9799
}: Readonly<LineTypesCatalogSelectorDialogProps>) {
98100
const { snackError } = useSnackMessage();
@@ -222,6 +224,7 @@ export default function LineTypesCatalogSelectorDialog({
222224
areasOptions={areasOptions}
223225
aerialTemperatures={aerialTemperatures}
224226
undergroundShapeFactor={undergroundShapeFactors}
227+
preselectedRowData={preselectedParams}
225228
/>
226229
</ModificationDialog>
227230
</CustomFormProvider>

src/components/dialogs/line-types-catalog/line-types-catalog-selector-form.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ import { useColumnDefinitions } from './use-column-definitions';
2525
import { useRowData } from './use-row-data';
2626
import { AgGridReact } from 'ag-grid-react';
2727

28+
export interface LineCatalogParams {
29+
area: string;
30+
temperature: string;
31+
shapeFactor: number;
32+
}
33+
2834
interface LineTypesCatalogSelectorFormProps {
2935
gridRef: React.RefObject<AgGridReact | null>;
3036
selectedRow: LineTypeInfo | null;
@@ -34,6 +40,7 @@ interface LineTypesCatalogSelectorFormProps {
3440
areasOptions: Option[];
3541
aerialTemperatures: Option[];
3642
undergroundShapeFactor: Option[];
43+
preselectedRowData?: LineCatalogParams;
3744
}
3845

3946
export default function LineTypesCatalogSelectorForm({
@@ -45,6 +52,7 @@ export default function LineTypesCatalogSelectorForm({
4552
areasOptions,
4653
aerialTemperatures,
4754
undergroundShapeFactor,
55+
preselectedRowData,
4856
}: Readonly<LineTypesCatalogSelectorFormProps>) {
4957
const [tabIndex, setTabIndex] = useState<number>(CATEGORIES_TABS.AERIAL.id);
5058
const { setValue } = useFormContext();
@@ -69,7 +77,13 @@ export default function LineTypesCatalogSelectorForm({
6977
: CATEGORIES_TABS.AERIAL.id;
7078
setValue(SELECTED_CATEGORIES_TAB, newTabIndex);
7179
}
72-
}, [rowData, preselectedRowId, setValue]);
80+
if (preselectedRowData) {
81+
setValue(AERIAL_AREAS, preselectedRowData.area);
82+
setValue(AERIAL_TEMPERATURES, preselectedRowData.temperature);
83+
setValue(UNDERGROUND_AREAS, preselectedRowData.area);
84+
setValue(UNDERGROUND_SHAPE_FACTORS, preselectedRowData.shapeFactor);
85+
}
86+
}, [rowData, preselectedRowId, setValue, preselectedRowData]);
7387

7488
// Tries to find the selected row to highlight it
7589
const highlightSelectedRow = useCallback(() => {

src/components/dialogs/line-types-catalog/segment-utils.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
import {
9+
AREA,
910
LIMIT_SET_NAME,
1011
LIMIT_VALUE,
1112
PERMANENT_LIMIT,
@@ -16,6 +17,8 @@ import {
1617
SEGMENT_SUSCEPTANCE,
1718
SEGMENT_TYPE_ID,
1819
SEGMENT_TYPE_VALUE,
20+
SHAPE_FACTOR,
21+
TEMPERATURE,
1922
TEMPORARY_LIMIT_DURATION,
2023
TEMPORARY_LIMIT_NAME,
2124
TEMPORARY_LIMITS,
@@ -32,6 +35,9 @@ export const SegmentSchema = yup.object().shape({
3235
.required()
3336
.test('empty-check', 'SegmentTypeMissing', (value) => (value ? value.length > 0 : false)),
3437
[SEGMENT_TYPE_ID]: yup.string().required(),
38+
[AREA]: yup.string().nullable(),
39+
[TEMPERATURE]: yup.string().nullable(),
40+
[SHAPE_FACTOR]: yup.number().nullable(),
3541
[SEGMENT_RESISTANCE]: yup.number().required(),
3642
[SEGMENT_REACTANCE]: yup.number().required(),
3743
[SEGMENT_SUSCEPTANCE]: yup.number().required(),
@@ -61,6 +67,9 @@ export type SegmentFormData = {
6167
[SEGMENT_REACTANCE]: number;
6268
[SEGMENT_SUSCEPTANCE]: number;
6369
[SEGMENT_CURRENT_LIMITS]: [];
70+
[AREA]: string;
71+
[TEMPERATURE]: string;
72+
[SHAPE_FACTOR]: number | null;
6473
};
6574

6675
export const emptyLineSegment: SegmentFormData = {
@@ -71,4 +80,7 @@ export const emptyLineSegment: SegmentFormData = {
7180
[SEGMENT_REACTANCE]: 0.0,
7281
[SEGMENT_SUSCEPTANCE]: 0.0,
7382
[SEGMENT_CURRENT_LIMITS]: [],
83+
[AREA]: '',
84+
[TEMPERATURE]: '',
85+
[SHAPE_FACTOR]: null,
7486
};

0 commit comments

Comments
 (0)