Skip to content

Commit d42ee4f

Browse files
Spreadsheet types alone and sorted (more readable)
1 parent 473c399 commit d42ee4f

File tree

10 files changed

+163
-152
lines changed

10 files changed

+163
-152
lines changed

src/components/spreadsheet-view/hooks/use-fetch-equipment.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
*/
77

88
import { useCallback } from 'react';
9-
import { EquipmentFetcher, SpreadsheetEquipmentsByNodes, SpreadsheetEquipmentType } from '../types/spreadsheet.type';
10-
import { UUID } from 'crypto';
9+
import {
10+
type EquipmentFetcher,
11+
type SpreadsheetEquipmentsByNodes,
12+
SpreadsheetEquipmentType,
13+
} from '../types/spreadsheet.type';
14+
import type { UUID } from 'crypto';
1115
import { useDispatch, useSelector } from 'react-redux';
12-
import { AppState } from '../../../redux/reducer';
16+
import { type AppState } from '../../../redux/reducer';
1317
import { loadEquipments } from '../../../redux/actions';
1418
import { useSnackMessage } from '@gridsuite/commons-ui';
15-
import { EQUIPMENT_TYPES } from '../../utils/equipment-types';
1619
import {
1720
fetchBatteries,
1821
fetchBusbarSections,
@@ -36,39 +39,39 @@ import { mapSpreadsheetEquipments } from '../../../utils/spreadsheet-equipments-
3639

3740
const getFetcher = (equipmentType: SpreadsheetEquipmentType): EquipmentFetcher => {
3841
switch (equipmentType) {
39-
case EQUIPMENT_TYPES.SUBSTATION:
42+
case SpreadsheetEquipmentType.SUBSTATION:
4043
return fetchSubstations;
41-
case EQUIPMENT_TYPES.VOLTAGE_LEVEL:
44+
case SpreadsheetEquipmentType.VOLTAGE_LEVEL:
4245
return fetchVoltageLevels;
43-
case EQUIPMENT_TYPES.LINE:
46+
case SpreadsheetEquipmentType.LINE:
4447
return fetchLines;
45-
case EQUIPMENT_TYPES.TIE_LINE:
48+
case SpreadsheetEquipmentType.TIE_LINE:
4649
return fetchTieLines;
47-
case EQUIPMENT_TYPES.TWO_WINDINGS_TRANSFORMER:
50+
case SpreadsheetEquipmentType.TWO_WINDINGS_TRANSFORMER:
4851
return fetchTwoWindingsTransformers;
49-
case EQUIPMENT_TYPES.THREE_WINDINGS_TRANSFORMER:
52+
case SpreadsheetEquipmentType.THREE_WINDINGS_TRANSFORMER:
5053
return fetchThreeWindingsTransformers;
51-
case EQUIPMENT_TYPES.HVDC_LINE:
54+
case SpreadsheetEquipmentType.HVDC_LINE:
5255
return fetchHvdcLines;
53-
case EQUIPMENT_TYPES.GENERATOR:
56+
case SpreadsheetEquipmentType.GENERATOR:
5457
return fetchGenerators;
55-
case EQUIPMENT_TYPES.BATTERY:
58+
case SpreadsheetEquipmentType.BATTERY:
5659
return fetchBatteries;
57-
case EQUIPMENT_TYPES.LOAD:
60+
case SpreadsheetEquipmentType.LOAD:
5861
return fetchLoads;
59-
case EQUIPMENT_TYPES.SHUNT_COMPENSATOR:
62+
case SpreadsheetEquipmentType.SHUNT_COMPENSATOR:
6063
return fetchShuntCompensators;
61-
case EQUIPMENT_TYPES.DANGLING_LINE:
64+
case SpreadsheetEquipmentType.DANGLING_LINE:
6265
return fetchDanglingLines;
63-
case EQUIPMENT_TYPES.STATIC_VAR_COMPENSATOR:
66+
case SpreadsheetEquipmentType.STATIC_VAR_COMPENSATOR:
6467
return fetchStaticVarCompensators;
65-
case EQUIPMENT_TYPES.VSC_CONVERTER_STATION:
68+
case SpreadsheetEquipmentType.VSC_CONVERTER_STATION:
6669
return fetchVscConverterStations;
67-
case EQUIPMENT_TYPES.LCC_CONVERTER_STATION:
70+
case SpreadsheetEquipmentType.LCC_CONVERTER_STATION:
6871
return fetchLccConverterStations;
69-
case EQUIPMENT_TYPES.BUS:
72+
case SpreadsheetEquipmentType.BUS:
7073
return fetchBuses;
71-
case EQUIPMENT_TYPES.BUSBAR_SECTION:
74+
case SpreadsheetEquipmentType.BUSBAR_SECTION:
7275
return fetchBusbarSections;
7376
}
7477
};

src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-equipment-modification.tsx

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,74 +14,72 @@ import ShuntCompensatorModificationDialog from 'components/dialogs/network-modif
1414
import SubstationModificationDialog from 'components/dialogs/network-modifications/substation/modification/substation-modification-dialog';
1515
import TwoWindingsTransformerModificationDialog from 'components/dialogs/network-modifications/two-windings-transformer/modification/two-windings-transformer-modification-dialog';
1616
import VoltageLevelModificationDialog from 'components/dialogs/network-modifications/voltage-level/modification/voltage-level-modification-dialog';
17-
import { useCallback, useMemo, useState } from 'react';
17+
import { type FunctionComponent, type ReactElement, useCallback, useMemo, useState } from 'react';
1818
import { useSelector } from 'react-redux';
19-
import { AppState } from 'redux/reducer';
19+
import { type AppState } from 'redux/reducer';
2020
import { SpreadsheetEquipmentType } from '../../../types/spreadsheet.type';
21-
import { EQUIPMENT_TYPES } from 'components/utils/equipment-types';
2221

23-
interface UseEquipmentModificationProps {
22+
export type UseEquipmentModificationProps = {
2423
equipmentType: SpreadsheetEquipmentType;
25-
}
24+
};
2625

2726
type EditableEquipmentType = Exclude<
2827
SpreadsheetEquipmentType,
29-
| EQUIPMENT_TYPES.TIE_LINE
30-
| EQUIPMENT_TYPES.THREE_WINDINGS_TRANSFORMER
31-
| EQUIPMENT_TYPES.BUS
32-
| EQUIPMENT_TYPES.BUSBAR_SECTION
33-
| EQUIPMENT_TYPES.DANGLING_LINE
34-
| EQUIPMENT_TYPES.STATIC_VAR_COMPENSATOR
35-
| EQUIPMENT_TYPES.VSC_CONVERTER_STATION
36-
| EQUIPMENT_TYPES.LCC_CONVERTER_STATION
37-
| EQUIPMENT_TYPES.HVDC_LINE
28+
| SpreadsheetEquipmentType.TIE_LINE
29+
| SpreadsheetEquipmentType.THREE_WINDINGS_TRANSFORMER
30+
| SpreadsheetEquipmentType.BUS
31+
| SpreadsheetEquipmentType.BUSBAR_SECTION
32+
| SpreadsheetEquipmentType.DANGLING_LINE
33+
| SpreadsheetEquipmentType.STATIC_VAR_COMPENSATOR
34+
| SpreadsheetEquipmentType.VSC_CONVERTER_STATION
35+
| SpreadsheetEquipmentType.LCC_CONVERTER_STATION
36+
| SpreadsheetEquipmentType.HVDC_LINE
3837
>;
3938

40-
const EQUIPMENT_DIALOG_MAPPING: Record<EditableEquipmentType, React.FC<any>> = {
41-
[EQUIPMENT_TYPES.SUBSTATION]: SubstationModificationDialog,
42-
[EQUIPMENT_TYPES.VOLTAGE_LEVEL]: VoltageLevelModificationDialog,
43-
[EQUIPMENT_TYPES.LINE]: LineModificationDialog,
44-
[EQUIPMENT_TYPES.TWO_WINDINGS_TRANSFORMER]: TwoWindingsTransformerModificationDialog,
45-
[EQUIPMENT_TYPES.GENERATOR]: GeneratorModificationDialog,
46-
[EQUIPMENT_TYPES.LOAD]: LoadModificationDialog,
47-
[EQUIPMENT_TYPES.BATTERY]: BatteryModificationDialog,
48-
[EQUIPMENT_TYPES.SHUNT_COMPENSATOR]: ShuntCompensatorModificationDialog,
39+
const EQUIPMENT_DIALOG_MAPPING: Readonly<Record<EditableEquipmentType, FunctionComponent<any>>> = {
40+
[SpreadsheetEquipmentType.SUBSTATION]: SubstationModificationDialog,
41+
[SpreadsheetEquipmentType.VOLTAGE_LEVEL]: VoltageLevelModificationDialog,
42+
[SpreadsheetEquipmentType.LINE]: LineModificationDialog,
43+
[SpreadsheetEquipmentType.TWO_WINDINGS_TRANSFORMER]: TwoWindingsTransformerModificationDialog,
44+
[SpreadsheetEquipmentType.GENERATOR]: GeneratorModificationDialog,
45+
[SpreadsheetEquipmentType.LOAD]: LoadModificationDialog,
46+
[SpreadsheetEquipmentType.BATTERY]: BatteryModificationDialog,
47+
[SpreadsheetEquipmentType.SHUNT_COMPENSATOR]: ShuntCompensatorModificationDialog,
4948
};
5049

51-
export const useEquipmentModification = ({ equipmentType }: UseEquipmentModificationProps) => {
52-
const [modificationDialog, setModificationDialog] = useState<React.ReactElement | null>(null);
50+
function isEditableEquipmentType(type: SpreadsheetEquipmentType): type is EditableEquipmentType {
51+
return type in EQUIPMENT_DIALOG_MAPPING;
52+
}
53+
54+
export function useEquipmentModification({ equipmentType }: UseEquipmentModificationProps) {
55+
const [modificationDialog, setModificationDialog] = useState<ReactElement | null>(null);
5356

5457
const currentNode = useSelector((state: AppState) => state.currentTreeNode);
5558
const currentRootNetworkUuid = useSelector((state: AppState) => state.currentRootNetworkUuid);
5659
const studyUuid = useSelector((state: AppState) => state.studyUuid);
5760

5861
const createDialogWithProps = useCallback(
59-
(Dialog: React.FC<any>, equipmentId: string) => {
60-
return (
61-
<Dialog
62-
onClose={() => setModificationDialog(null)}
63-
currentNode={currentNode}
64-
studyUuid={studyUuid}
65-
currentRootNetworkUuid={currentRootNetworkUuid}
66-
editData={undefined}
67-
isUpdate={false}
68-
editDataFetchStatus={FetchStatus.IDLE}
69-
defaultIdValue={equipmentId}
70-
/>
71-
);
72-
},
62+
(Dialog: FunctionComponent<any>, equipmentId: string) => (
63+
<Dialog
64+
onClose={() => setModificationDialog(null)}
65+
currentNode={currentNode}
66+
studyUuid={studyUuid}
67+
currentRootNetworkUuid={currentRootNetworkUuid}
68+
editData={undefined}
69+
isUpdate={false}
70+
editDataFetchStatus={FetchStatus.IDLE}
71+
defaultIdValue={equipmentId}
72+
/>
73+
),
7374
[currentNode, studyUuid, currentRootNetworkUuid]
7475
);
7576

7677
const getDialogForEquipment = useCallback(
7778
(equipmentId: string) => {
78-
const DialogComponent = EQUIPMENT_DIALOG_MAPPING[equipmentType as EditableEquipmentType];
79-
80-
if (!DialogComponent) {
79+
if (!isEditableEquipmentType(equipmentType)) {
8180
return null;
8281
}
83-
84-
return createDialogWithProps(DialogComponent, equipmentId);
82+
return createDialogWithProps(EQUIPMENT_DIALOG_MAPPING[equipmentType as EditableEquipmentType], equipmentId);
8583
},
8684
[createDialogWithProps, equipmentType]
8785
);
@@ -93,10 +91,7 @@ export const useEquipmentModification = ({ equipmentType }: UseEquipmentModifica
9391
[getDialogForEquipment]
9492
);
9593

96-
const isModificationDialogForEquipmentType = useMemo(() => {
97-
const DialogComponent = EQUIPMENT_DIALOG_MAPPING[equipmentType as EditableEquipmentType];
98-
return DialogComponent !== undefined;
99-
}, [equipmentType]);
94+
const isModificationDialogForEquipmentType = useMemo(() => isEditableEquipmentType(equipmentType), [equipmentType]);
10095

10196
return { modificationDialog, handleOpenModificationDialog, isModificationDialogForEquipmentType };
102-
};
97+
}

src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-equipments.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,21 @@ import { useCallback, useEffect, useMemo, useState } from 'react';
1111
import { useDispatch, useSelector } from 'react-redux';
1212
import {
1313
deleteEquipments,
14-
EquipmentToDelete,
14+
type EquipmentToDelete,
1515
removeNodeData,
1616
resetEquipments,
1717
resetEquipmentsByTypes,
1818
updateEquipments,
1919
} from 'redux/actions';
2020
import { type AppState, EquipmentUpdateType } from 'redux/reducer';
21-
import type { SpreadsheetEquipmentType } from '../../../types/spreadsheet.type';
21+
import { SpreadsheetEquipmentType } from '../../../types/spreadsheet.type';
2222
import { fetchAllEquipments } from 'services/study/network-map';
2323
import type { NodeAlias } from '../../../types/node-alias.type';
2424
import { isStatusBuilt } from '../../../../graph/util/model-functions';
2525
import { useFetchEquipment } from '../../../hooks/use-fetch-equipment';
2626
import { isStudyNotification } from 'types/notification-types';
2727
import { NodeType } from '../../../../graph/tree-node.type';
2828
import { validAlias } from '../../../hooks/use-node-aliases';
29-
import { EQUIPMENT_TYPES } from 'components/utils/equipment-types';
3029
import { fetchNetworkElementInfos } from 'services/study/network';
3130

3231
const getEquipmentUpdateTypeFromType = (type: SpreadsheetEquipmentType) => {
@@ -172,7 +171,7 @@ export const useSpreadsheetEquipments = (
172171

173172
// Handle updates and resets based on impacted element types
174173
if (impactedElementTypes.length > 0) {
175-
if (impactedElementTypes.includes(EQUIPMENT_TYPES.SUBSTATION)) {
174+
if (impactedElementTypes.includes(SpreadsheetEquipmentType.SUBSTATION)) {
176175
dispatch(resetEquipments());
177176
return;
178177
}
@@ -187,8 +186,8 @@ export const useSpreadsheetEquipments = (
187186
if (impactedSubstationsIds.length > 0 && studyUuid && currentRootNetworkUuid && currentNode?.id) {
188187
// The formatting of the fetched equipments is done in the reducer
189188
if (
190-
type === EQUIPMENT_TYPES.SUBSTATION ||
191-
type === EQUIPMENT_TYPES.VOLTAGE_LEVEL ||
189+
type === SpreadsheetEquipmentType.SUBSTATION ||
190+
type === SpreadsheetEquipmentType.VOLTAGE_LEVEL ||
192191
!equipmentToUpdateId
193192
) {
194193
// we must fetch data for all equipments, as substation data (country) and voltage level data(nominalV)

src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-gs-filter.ts

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

8-
import { RefObject, useCallback, useEffect, useState } from 'react';
9-
import { FilterChangedEvent, IRowNode } from 'ag-grid-community';
10-
import { UUID } from 'crypto';
8+
import { type RefObject, useCallback, useEffect, useState } from 'react';
9+
import { type FilterChangedEvent, type IRowNode } from 'ag-grid-community';
10+
import type { UUID } from 'crypto';
1111
import { useSelector } from 'react-redux';
12-
import { AppState } from '../../../../../redux/reducer';
12+
import { type AppState } from '../../../../../redux/reducer';
1313
import { evaluateFilters, evaluateJsonFilter } from '../../../../../services/study/filter';
1414
import { buildExpertFilter } from '../../../../dialogs/parameters/dynamicsimulation/curve/dialog/curve-selector-utils';
1515
import { SpreadsheetEquipmentType } from '../../../types/spreadsheet.type';
16-
import { GlobalFilter } from '../../../../results/common/global-filter/global-filter-types';
17-
import { AgGridReact } from 'ag-grid-react';
16+
import type { GlobalFilter } from '../../../../results/common/global-filter/global-filter-types';
17+
import { type AgGridReact } from 'ag-grid-react';
1818
import { ROW_INDEX_COLUMN_ID } from '../../../constants';
1919

2020
export const refreshSpreadsheetAfterFilterChanged = (event: FilterChangedEvent) => {
@@ -87,6 +87,7 @@ export const useSpreadsheetGlobalFilter = (
8787
}
8888

8989
const computedFilter = buildExpertFilter(
90+
//@ts-expect-error TODO: what to do with BRANCH type?
9091
equipmentType,
9192
undefined,
9293
countries,

src/components/spreadsheet-view/spreadsheet/spreadsheet-content/spreadsheet-content.tsx

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

8-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
8+
import { memo, type RefObject, useCallback, useEffect, useMemo, useState } from 'react';
99
import { useSpreadsheetEquipments } from './hooks/use-spreadsheet-equipments';
1010
import { EquipmentTable } from './equipment-table';
11-
import { Identifiable } from '@gridsuite/commons-ui';
12-
import { CustomColDef } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type';
13-
import { SpreadsheetTabDefinition } from '../../types/spreadsheet.type';
14-
import { CurrentTreeNode } from 'components/graph/tree-node.type';
15-
import { AgGridReact } from 'ag-grid-react';
16-
import { Alert, Box, Theme } from '@mui/material';
11+
import { type Identifiable } from '@gridsuite/commons-ui';
12+
import { type CustomColDef } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type';
13+
import { SpreadsheetEquipmentType, type SpreadsheetTabDefinition } from '../../types/spreadsheet.type';
14+
import { type CurrentTreeNode } from 'components/graph/tree-node.type';
15+
import { type AgGridReact } from 'ag-grid-react';
16+
import { Alert, Box, type Theme } from '@mui/material';
1717
import { useEquipmentModification } from './hooks/use-equipment-modification';
18-
import { NodeAlias } from '../../types/node-alias.type';
18+
import { type NodeAlias } from '../../types/node-alias.type';
1919
import { FormattedMessage } from 'react-intl';
2020
import { useSpreadsheetGlobalFilter } from './hooks/use-spreadsheet-gs-filter';
2121
import { useFilterSelector } from 'hooks/use-filter-selector';
2222
import { FilterType } from 'types/custom-aggrid-types';
2323
import { updateFilters } from 'components/custom-aggrid/custom-aggrid-filters/utils/aggrid-filters-utils';
2424
import { useGridCalculations } from 'components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-grid-calculations';
2525
import { useColumnManagement } from './hooks/use-column-management';
26-
import { EQUIPMENT_TYPES } from 'components/utils/equipment-types';
2726
import { DiagramType } from 'components/diagrams/diagram.type';
2827

2928
const styles = {
@@ -48,7 +47,7 @@ interface RecursiveIdentifiable extends Identifiable {
4847
}
4948

5049
interface SpreadsheetContentProps {
51-
gridRef: React.RefObject<AgGridReact>;
50+
gridRef: RefObject<AgGridReact>;
5251
currentNode: CurrentTreeNode;
5352
tableDefinition: SpreadsheetTabDefinition;
5453
columns: CustomColDef[];
@@ -60,7 +59,7 @@ interface SpreadsheetContentProps {
6059
active: boolean;
6160
}
6261

63-
export const SpreadsheetContent = React.memo(
62+
export const SpreadsheetContent = memo(
6463
({
6564
gridRef,
6665
currentNode,
@@ -203,7 +202,7 @@ export const SpreadsheetContent = React.memo(
203202
const handleOpenDiagram = useCallback(
204203
(equipmentId: string) => {
205204
const diagramType =
206-
tableDefinition?.type === EQUIPMENT_TYPES.SUBSTATION
205+
tableDefinition?.type === SpreadsheetEquipmentType.SUBSTATION
207206
? DiagramType.SUBSTATION
208207
: DiagramType.VOLTAGE_LEVEL;
209208
openDiagram?.(equipmentId, diagramType);

src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/global-filter/spreadsheet-global-filter.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import type { UUID } from 'crypto';
99
import { useCallback, useEffect, useMemo } from 'react';
1010
import { debounce } from '@mui/material';
1111
import { useDispatch, useSelector } from 'react-redux';
12-
import { SpreadsheetTabDefinition } from '../../../types/spreadsheet.type';
13-
import { AppState } from '../../../../../redux/reducer';
12+
import { SpreadsheetEquipmentType, type SpreadsheetTabDefinition } from '../../../types/spreadsheet.type';
13+
import { type AppState } from '../../../../../redux/reducer';
1414
import { setGlobalFiltersToSpreadsheetConfig } from 'services/study/study-config';
15-
import { GlobalFilter } from '../../../../results/common/global-filter/global-filter-types';
15+
import type { GlobalFilter } from '../../../../results/common/global-filter/global-filter-types';
1616
import { FilterType } from '../../../../results/common/utils';
1717
import GlobalFilterSelector from '../../../../results/common/global-filter/global-filter-selector';
1818
import { EQUIPMENT_TYPES } from '@powsybl/network-viewer';
@@ -32,7 +32,7 @@ export default function SpreadsheetGlobalFilter({ tableDefinition }: Readonly<Sp
3232
);
3333
const { countriesFilter, voltageLevelsFilter, propertiesFilter } = useGlobalFilterOptions();
3434

35-
// eslint-disable-next-line react-hooks/exhaustive-deps
35+
// eslint-disable-next-line react-hooks/exhaustive-deps -- useCallback received a function whose dependencies are unknown. Pass an inline function instead.
3636
const debouncedSetFilters = useCallback(
3737
debounce((uuid: UUID, filters: GlobalFilter[]) => {
3838
if (!studyUuid) {
@@ -52,13 +52,14 @@ export default function SpreadsheetGlobalFilter({ tableDefinition }: Readonly<Sp
5252
[debouncedSetFilters, tableDefinition.uuid]
5353
);
5454

55-
const filters = useMemo(() => {
56-
if (tableDefinition.type === EQUIPMENT_TYPES.SUBSTATION) {
57-
return [...countriesFilter, ...propertiesFilter];
58-
} else {
59-
return [...voltageLevelsFilter, ...countriesFilter, ...propertiesFilter];
60-
}
61-
}, [countriesFilter, propertiesFilter, tableDefinition.type, voltageLevelsFilter]);
55+
const filters = useMemo(
56+
() => [
57+
...(tableDefinition.type === SpreadsheetEquipmentType.SUBSTATION ? voltageLevelsFilter : []),
58+
...countriesFilter,
59+
...propertiesFilter,
60+
],
61+
[countriesFilter, propertiesFilter, tableDefinition.type, voltageLevelsFilter]
62+
);
6263

6364
useEffect(() => {
6465
if (globalFilterSpreadsheetState) {
@@ -73,7 +74,7 @@ export default function SpreadsheetGlobalFilter({ tableDefinition }: Readonly<Sp
7374
return (
7475
<GlobalFilterSelector
7576
filterableEquipmentTypes={[
76-
tableDefinition.type as unknown as EQUIPMENT_TYPES,
77+
tableDefinition.type as unknown as EQUIPMENT_TYPES, //TODO what to do with BRANCH type?
7778
EQUIPMENT_TYPES.SUBSTATION,
7879
EQUIPMENT_TYPES.VOLTAGE_LEVEL,
7980
]}

0 commit comments

Comments
 (0)