Skip to content

Commit 71975f6

Browse files
authored
Agregate voltage levels in the nominal voltage filter of the map (#3387)
The voltage level filter of the map now applies to ranges of voltage levels, instead of individual nominal voltages for each line.
1 parent 3497bf4 commit 71975f6

File tree

7 files changed

+125
-40
lines changed

7 files changed

+125
-40
lines changed

src/components/network/constants.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,22 @@ export const REGULATING_TERMINAL_TYPES = [
210210
export const NUMBER = 'number';
211211
export const ENUM = 'enum';
212212
export const BOOLEAN = 'boolean';
213+
214+
export interface VoltageLevelInterval {
215+
name: string;
216+
vlValue: number;
217+
minValue: number;
218+
maxValue: number;
219+
}
220+
221+
export const BASE_VOLTAGES: VoltageLevelInterval[] = [
222+
{ name: 'vl300to500', vlValue: 400, minValue: 300, maxValue: Infinity },
223+
{ name: 'vl180to300', vlValue: 225, minValue: 180, maxValue: 300 },
224+
{ name: 'vl120to180', vlValue: 150, minValue: 120, maxValue: 180 },
225+
{ name: 'vl70to120', vlValue: 90, minValue: 70, maxValue: 120 },
226+
{ name: 'vl50to70', vlValue: 63, minValue: 50, maxValue: 70 },
227+
{ name: 'vl30to50', vlValue: 45, minValue: 30, maxValue: 50 },
228+
{ name: 'vl0to30', vlValue: 20, minValue: 0, maxValue: 30 },
229+
];
230+
231+
export const MAX_VOLTAGE = 500;

src/components/network/network-map-panel.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import GuidancePopup from './guidance-popup';
6969
import SelectionCreationPanel from './selection-creation-panel/selection-creation-panel';
7070
import { useEquipmentMenu } from '../../hooks/use-equipment-menu';
7171
import useEquipmentDialogs from 'hooks/use-equipment-dialogs';
72+
import { getNominalVoltageColor } from 'utils/colors';
7273

7374
const INITIAL_POSITION = [0, 0] as const;
7475
const INITIAL_ZOOM = 9;
@@ -1188,6 +1189,7 @@ export const NetworkMapPanel = forwardRef<NetworkMapPanelRef, NetworkMapPanelPro
11881189
onDrawEvent(event);
11891190
}}
11901191
shouldDisableToolTip={!visible || isInDrawingMode.value}
1192+
getNominalVoltageColor={getNominalVoltageColor}
11911193
/>
11921194
{mapEquipments && mapEquipments?.substations?.length > 0 && renderNominalVoltageFilter()}
11931195
{renderSearchEquipment()}

src/components/network/nominal-voltage-filter.tsx

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

8-
import { useCallback, useMemo } from 'react';
9-
import { Button, Checkbox, List, ListItem, ListItemButton, ListItemText, Paper } from '@mui/material';
8+
import { useCallback, useEffect, useMemo, useState } from 'react';
9+
import { Button, Checkbox, List, ListItem, ListItemButton, ListItemText, Paper, Tooltip } from '@mui/material';
1010
import { FormattedMessage } from 'react-intl';
1111
import { type MuiStyles } from '@gridsuite/commons-ui';
12+
import { BASE_VOLTAGES, MAX_VOLTAGE, VoltageLevelInterval } from './constants';
13+
import { getNominalVoltageIntervalName } from './utils/nominal-voltage-filter-utils';
1214

1315
const styles = {
1416
nominalVoltageZone: {
@@ -44,56 +46,101 @@ export type NominalVoltageFilterProps = {
4446
onChange: (filteredNominalVoltages: number[]) => void;
4547
};
4648

49+
type VoltageLevelValuesInterval = VoltageLevelInterval & {
50+
vlListValues: number[];
51+
isChecked: boolean;
52+
};
53+
4754
export default function NominalVoltageFilter({
4855
nominalVoltages,
4956
filteredNominalVoltages,
5057
onChange,
5158
}: Readonly<NominalVoltageFilterProps>) {
59+
const [voltageLevelIntervals, setVoltageLevelIntervals] = useState<VoltageLevelValuesInterval[]>(
60+
BASE_VOLTAGES.map((interval) => ({ ...interval, vlListValues: [], isChecked: true }))
61+
);
62+
useEffect(() => {
63+
const newIntervals = BASE_VOLTAGES.map((interval) => {
64+
const vlListValues = nominalVoltages.filter(
65+
(vnom) => getNominalVoltageIntervalName(vnom) === interval.name
66+
);
67+
return { ...interval, vlListValues, isChecked: true };
68+
});
69+
setVoltageLevelIntervals(newIntervals);
70+
}, [nominalVoltages]);
71+
5272
const handleToggle = useCallback(
53-
(vnoms: number[], isToggle = false) => {
73+
(interval: VoltageLevelValuesInterval) => {
5474
let newFiltered: number[];
55-
if (isToggle) {
56-
// we "inverse" the selection for vnoms values
57-
newFiltered = [...filteredNominalVoltages];
58-
vnoms.forEach((vnom) => {
59-
const currentIndex = filteredNominalVoltages.indexOf(vnom);
60-
if (currentIndex === -1) {
61-
newFiltered.push(vnom); //not previously present, we add it
62-
} else {
63-
newFiltered.splice(currentIndex, 1); // previously present, we remove it
64-
}
65-
});
66-
} else {
67-
// it's just the new selection
68-
newFiltered = [...vnoms];
75+
76+
// we "inverse" the selection for vlListValues
77+
newFiltered = [...filteredNominalVoltages];
78+
for (const vnom of interval.vlListValues) {
79+
const currentIndex = newFiltered.indexOf(vnom);
80+
if (currentIndex === -1) {
81+
newFiltered.push(vnom); // not previously present, we add it
82+
} else {
83+
newFiltered.splice(currentIndex, 1); // previously present, we remove it
84+
}
6985
}
70-
onChange(newFiltered);
86+
setVoltageLevelIntervals((prev) =>
87+
prev.map((i) => (i.name === interval.name ? { ...i, isChecked: !i.isChecked } : i))
88+
);
89+
90+
onChange(newFiltered); // update filteredNominalVoltages
7191
},
7292
[filteredNominalVoltages, onChange]
7393
);
74-
const handleSelectAll = useCallback(() => handleToggle(nominalVoltages), [handleToggle, nominalVoltages]);
75-
const handleSelectNone = useCallback(() => handleToggle([]), [handleToggle]);
94+
const handleToggleCheckAll = useCallback(
95+
(check: boolean) => {
96+
// if check is true, we check all; otherwise we uncheck all
97+
setVoltageLevelIntervals((prev) => prev.map((interval) => ({ ...interval, isChecked: check })));
98+
onChange(check ? [...nominalVoltages] : []); // update filteredNominalVoltages
99+
},
100+
[nominalVoltages, onChange]
101+
);
102+
const handleSelectAll = useCallback(() => handleToggleCheckAll(true), [handleToggleCheckAll]);
103+
const handleSelectNone = useCallback(() => handleToggleCheckAll(false), [handleToggleCheckAll]);
76104

77105
const nominalVoltagesList = useMemo(
78106
() =>
79-
nominalVoltages.map((value) => (
80-
<ListItem sx={styles.nominalVoltageItem} key={value}>
81-
<ListItemButton
82-
role={undefined}
83-
dense
84-
onClick={() => handleToggle([value], true)}
85-
disabled={!filteredNominalVoltages}
86-
>
87-
<Checkbox
88-
color="default"
89-
sx={styles.nominalVoltageCheck}
90-
checked={!filteredNominalVoltages || filteredNominalVoltages.indexOf(value) !== -1}
91-
/>
92-
<ListItemText sx={styles.nominalVoltageText} disableTypography primary={`${value} kV`} />
93-
</ListItemButton>
94-
</ListItem>
95-
)),
96-
[filteredNominalVoltages, handleToggle, nominalVoltages]
107+
voltageLevelIntervals
108+
.filter((interval) => interval.vlListValues.length > 0)
109+
.map((interval) => (
110+
<ListItem sx={styles.nominalVoltageItem} key={interval.name}>
111+
<Tooltip
112+
title={
113+
<FormattedMessage
114+
id={'voltageLevelInterval'}
115+
values={{
116+
lowBound: interval.minValue,
117+
highBound: interval.maxValue === Infinity ? MAX_VOLTAGE : interval.maxValue,
118+
}}
119+
/>
120+
}
121+
>
122+
<ListItemButton
123+
role={undefined}
124+
dense
125+
onClick={() => handleToggle(interval)}
126+
disabled={!filteredNominalVoltages}
127+
>
128+
<Checkbox
129+
color="default"
130+
sx={styles.nominalVoltageCheck}
131+
checked={interval.isChecked}
132+
/>
133+
134+
<ListItemText
135+
sx={styles.nominalVoltageText}
136+
disableTypography
137+
primary={`${interval.vlValue} kV`}
138+
></ListItemText>
139+
</ListItemButton>
140+
</Tooltip>
141+
</ListItem>
142+
)),
143+
[filteredNominalVoltages, handleToggle, voltageLevelIntervals]
97144
);
98145

99146
if (nominalVoltages.length <= 0) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
import { BASE_VOLTAGES } from '../constants';
8+
9+
export const getNominalVoltageIntervalName = (voltageValue: number): string | undefined => {
10+
for (let interval of BASE_VOLTAGES) {
11+
if (voltageValue >= interval.minValue && voltageValue < interval.maxValue) {
12+
return interval.name;
13+
}
14+
}
15+
};

src/translations/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"openVoltageLevel": "Open the voltage level",
7979
"CBAll": "All",
8080
"CBNone": "None",
81+
"voltageLevelInterval": "[{lowBound} kV, {highBound} kV)",
8182
"Map": "Map",
8283
"Tree": "Tree",
8384
"modifications": "Modifications",

src/translations/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"openVoltageLevel": "Ouvrir le poste",
7979
"CBAll": "Tous",
8080
"CBNone": "Aucun",
81+
"voltageLevelInterval": "[{lowBound} kV; {highBound} kV[",
8182
"Map": "Carte",
8283
"Tree": "Arbre",
8384
"modifications": "Modifications",

src/utils/colors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
export function getNominalVoltageColor(nominalVoltage: number): number[] {
99
if (nominalVoltage >= 300) {
1010
return [255, 0, 0];
11-
} else if (nominalVoltage >= 170 && nominalVoltage < 300) {
11+
} else if (nominalVoltage >= 180 && nominalVoltage < 300) {
1212
return [34, 139, 34];
13-
} else if (nominalVoltage >= 120 && nominalVoltage < 170) {
13+
} else if (nominalVoltage >= 120 && nominalVoltage < 180) {
1414
return [1, 175, 175];
1515
} else if (nominalVoltage >= 70 && nominalVoltage < 120) {
1616
return [204, 85, 0];

0 commit comments

Comments
 (0)