Skip to content

Commit a5b7d63

Browse files
committed
Add color map to DirectoryItemInput so we can give different color by equipment type and add new Fields for Aleas by filter
Signed-off-by: basseche <[email protected]>
1 parent 0c9d3bc commit a5b7d63

File tree

6 files changed

+82
-27
lines changed

6 files changed

+82
-27
lines changed

src/components/directoryItemSelector/DirectoryItemSelector.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export interface DirectoryItemSelectorProps extends TreeViewFinderProps {
159159
itemFilter?: (val: ElementAttributes) => boolean;
160160
expanded?: UUID[];
161161
selected?: UUID[];
162+
fetchMetaData?: boolean;
162163
}
163164

164165
function sortHandlingDirectories(a: TreeViewFinderNodeProps, b: TreeViewFinderNodeProps): number {
@@ -180,6 +181,7 @@ export function DirectoryItemSelector({
180181
expanded,
181182
selected,
182183
onClose,
184+
fetchMetaData,
183185
...otherTreeViewFinderProps
184186
}: Readonly<DirectoryItemSelectorProps>) {
185187
const [data, setData] = useState<TreeViewFinderNodeProps[]>([]);
@@ -268,7 +270,10 @@ export function DirectoryItemSelector({
268270
contentFilter().has(item.type)
269271
);
270272

271-
if (childrenMatchedTypes.length > 0 && equipmentTypes && equipmentTypes.length > 0) {
273+
if (
274+
childrenMatchedTypes.length > 0 &&
275+
((equipmentTypes && equipmentTypes.length > 0) || fetchMetaData)
276+
) {
272277
fetchElementsInfos(
273278
childrenMatchedTypes.map((e: ElementAttributes) => e.elementUuid),
274279
types,
@@ -296,7 +301,7 @@ export function DirectoryItemSelector({
296301
console.warn(`Could not update subs (and content) of '${nodeId}' : ${error.message}`);
297302
});
298303
},
299-
[types, equipmentTypes, itemFilter, contentFilter, addToDirectory]
304+
[types, equipmentTypes, fetchMetaData, contentFilter, itemFilter, addToDirectory]
300305
);
301306

302307
// Helper function to fetch children for a node if not already loaded

src/components/inputs/reactHookForm/DirectoryItemsInput.tsx

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

8-
import { Chip, FormControl, Grid, IconButton, Theme, Tooltip } from '@mui/material';
8+
import { Box, Chip, FormControl, FormHelperText, Grid, IconButton, Theme, Tooltip } from '@mui/material';
99
import { Folder as FolderIcon } from '@mui/icons-material';
1010
import { useCallback, useMemo, useState } from 'react';
1111
import { FieldValues, useController, useFieldArray } from 'react-hook-form';
12-
import { useIntl } from 'react-intl';
12+
import { FormattedMessage, useIntl } from 'react-intl';
1313
import { UUID } from 'crypto';
1414
import { RawReadOnlyInput } from './RawReadOnlyInput';
15-
import { FieldLabel } from './utils/FieldLabel';
16-
import { useCustomFormContext } from './provider/useCustomFormContext';
17-
import { isFieldRequired } from './utils/functions';
18-
import { ErrorInput } from './errorManagement/ErrorInput';
19-
import { useSnackMessage } from '../../../hooks/useSnackMessage';
15+
import { FieldLabel, isFieldRequired } from './utils';
16+
import { useCustomFormContext } from './provider';
17+
import { ErrorInput, MidFormError } from './errorManagement';
18+
import { useSnackMessage } from '../../../hooks';
2019
import { TreeViewFinderNodeProps } from '../../treeViewFinder';
21-
import { mergeSx } from '../../../utils/styles';
2220
import { OverflowableText } from '../../overflowableText';
23-
import { MidFormError } from './errorManagement/MidFormError';
24-
import { DirectoryItemSelector } from '../../directoryItemSelector/DirectoryItemSelector';
21+
import { DirectoryItemSelector } from '../../directoryItemSelector';
2522
import { fetchDirectoryElementPath } from '../../../services';
26-
import { ElementAttributes } from '../../../utils';
23+
import { BASE_EQUIPMENTS, ElementAttributes, EquipmentType, mergeSx } from '../../../utils';
2724
import { NAME } from './constants';
2825

2926
const styles = {
@@ -67,6 +64,12 @@ export interface DirectoryItemsInputProps {
6764
disable?: boolean;
6865
allowMultiSelect?: boolean;
6966
labelRequiredFromContext?: boolean;
67+
equipmentColorsMap?: Map<string, string>;
68+
}
69+
70+
interface EquipmentMetaData {
71+
color: string;
72+
translateLabel: string | undefined;
7073
}
7174

7275
export function DirectoryItemsInput({
@@ -82,6 +85,7 @@ export function DirectoryItemsInput({
8285
disable = false,
8386
allowMultiSelect = true,
8487
labelRequiredFromContext = true,
88+
equipmentColorsMap,
8589
}: Readonly<DirectoryItemsInputProps>) {
8690
const { snackError } = useSnackMessage();
8791
const intl = useIntl();
@@ -90,6 +94,7 @@ export function DirectoryItemsInput({
9094
const [multiSelect, setMultiSelect] = useState(allowMultiSelect);
9195
const types = useMemo(() => [elementType], [elementType]);
9296
const [directoryItemSelectorOpen, setDirectoryItemSelectorOpen] = useState(false);
97+
const [elementsMetadata, setElementsMetadata] = useState<EquipmentMetaData[]>([]);
9398
const {
9499
fields: elements,
95100
append,
@@ -118,6 +123,7 @@ export function DirectoryItemsInput({
118123
remove(getValues(name).findIndex((item: FieldValues) => item.id === chip));
119124
});
120125
}
126+
const currentColors = [...elementsMetadata];
121127
values.forEach((value) => {
122128
const { icon, children, ...otherElementAttributes } = value;
123129

@@ -129,23 +135,49 @@ export function DirectoryItemsInput({
129135
});
130136
} else {
131137
append(otherElementAttributes);
138+
if (equipmentColorsMap && value?.specificMetadata?.equipmentType) {
139+
const type: EquipmentType = value?.specificMetadata?.equipmentType as EquipmentType;
140+
currentColors.push({
141+
color: equipmentColorsMap.get(value.specificMetadata.equipmentType) ?? '',
142+
translateLabel:
143+
type !== EquipmentType.HVDC_LINE ? BASE_EQUIPMENTS[type]?.label : 'HvdcLines',
144+
});
145+
}
132146
onRowChanged?.(true);
133147
onChange?.(getValues(name));
134148
}
135149
});
136150
setDirectoryItemSelectorOpen(false);
137151
setSelected([]);
152+
if (equipmentColorsMap) {
153+
setElementsMetadata(currentColors);
154+
}
138155
},
139-
[append, getValues, snackError, name, onRowChanged, onChange, selected, remove]
156+
[
157+
selected,
158+
elementsMetadata,
159+
equipmentColorsMap,
160+
remove,
161+
getValues,
162+
name,
163+
snackError,
164+
append,
165+
onRowChanged,
166+
onChange,
167+
]
140168
);
141169

142170
const removeElements = useCallback(
143171
(index: number) => {
144172
remove(index);
145173
onRowChanged?.(true);
146174
onChange?.(getValues(name));
175+
if (elementsMetadata.length > 0) {
176+
const currentColors = [...elementsMetadata.slice(0, index), ...elementsMetadata.slice(index + 1)];
177+
setElementsMetadata(currentColors);
178+
}
147179
},
148-
[onRowChanged, remove, getValues, name, onChange]
180+
[remove, onRowChanged, onChange, getValues, name, elementsMetadata]
149181
);
150182

151183
const handleChipClick = useCallback(
@@ -189,18 +221,28 @@ export function DirectoryItemsInput({
189221
{elements?.length > 0 && (
190222
<FormControl sx={styles.formDirectoryElements2}>
191223
{elements.map((item, index) => (
192-
<Chip
193-
key={item.id}
194-
size="small"
195-
onDelete={() => removeElements(index)}
196-
onClick={() => handleChipClick(index)}
197-
label={
198-
<OverflowableText
199-
text={<RawReadOnlyInput name={`${name}.${index}.${NAME}`} />}
200-
sx={{ width: '100%' }}
201-
/>
202-
}
203-
/>
224+
<Box key={`Box${item.id}`} sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>
225+
<Chip
226+
key={item.id}
227+
size="small"
228+
sx={{ backgroundColor: elementsMetadata?.[index].color }}
229+
onDelete={() => removeElements(index)}
230+
onClick={() => handleChipClick(index)}
231+
label={
232+
<OverflowableText
233+
text={<RawReadOnlyInput name={`${name}.${index}.${NAME}`} />}
234+
sx={{ width: '100%' }}
235+
/>
236+
}
237+
/>
238+
<FormHelperText>
239+
{elementsMetadata?.[index]?.translateLabel ? (
240+
<FormattedMessage id={elementsMetadata?.[index]?.translateLabel} />
241+
) : (
242+
''
243+
)}
244+
</FormHelperText>
245+
</Box>
204246
))}
205247
</FormControl>
206248
)}
@@ -241,6 +283,7 @@ export function DirectoryItemsInput({
241283
selected={selected}
242284
expanded={expanded}
243285
multiSelect={multiSelect}
286+
fetchMetaData={!!equipmentColorsMap}
244287
/>
245288
</>
246289
);

src/components/treeViewFinder/TreeViewFinder.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ export interface TreeViewFinderNodeProps {
8282
childrenCount?: number;
8383
children?: TreeViewFinderNodeProps[];
8484
parents?: TreeViewFinderNodeProps[];
85+
specificMetadata?: {
86+
equipmentType: string;
87+
};
8588
}
8689

8790
interface TreeViewFinderNodeMapProps {

src/translations/en/equipmentsEn.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ export const equipmentsEn = {
2424
LccConverterStations: 'LCC converter stations',
2525
VscConverterStations: 'VSC converter stations',
2626
StaticVarCompensators: 'Static var compensators',
27+
HvdcLines: 'HVDC lines',
2728
};

src/translations/fr/equipmentsFr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ export const equipmentsFr = {
2424
LccConverterStations: 'Stations de conversion LCC',
2525
VscConverterStations: 'Stations de conversion VSC',
2626
StaticVarCompensators: 'CSPR',
27+
HvdcLines: 'lignes HVDC',
2728
};

src/utils/constants/fieldConstants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export enum FieldConstants {
2727
EQUIPMENT_TABLE = 'equipmentTable',
2828
EQUIPMENT_TYPE = 'equipmentType',
2929
FILTER_TYPE = 'filterType',
30+
FILTERS = 'filters',
3031
FOLDER_ID = 'folderId',
3132
FOLDER_NAME = 'folderName',
3233
FORMATTED_CASE_PARAMETERS = 'formattedCaseParameters',
@@ -37,6 +38,7 @@ export enum FieldConstants {
3738
NOMINAL_VOLTAGE_3 = 'nominalVoltage3',
3839
NOMINAL_VOLTAGE = 'nominalVoltage',
3940
OPERATION_TYPE = 'type',
41+
PATH_NAME = 'pathName',
4042
PROPERTY_NAME = 'propertyName',
4143
PROPERTY_OPERATOR = 'propertyOperator',
4244
PROPERTY = 'PROPERTY',

0 commit comments

Comments
 (0)