Skip to content

Commit 754908a

Browse files
Mekloayolab
andauthored
Remove multiple severity per report (#2445)
Signed-off-by: Hugo Marcellin <[email protected]> Co-authored-by: Ayoub LABIDI <[email protected]>
1 parent 40316ef commit 754908a

File tree

7 files changed

+54
-69
lines changed

7 files changed

+54
-69
lines changed

src/components/report-viewer/log-table.tsx

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* License, v. 2.0. If a copy of the MPL was not distributed with this
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
*/
7-
import React, { memo, useCallback, useEffect, useState, useMemo, useRef } from 'react';
7+
import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
88
import { useIntl } from 'react-intl';
99
import { CustomAGGrid } from '@gridsuite/commons-ui';
1010
import { alpha, useTheme } from '@mui/material/styles';
@@ -15,13 +15,12 @@ import { getColumnFilterValue, useAggridRowFilter } from 'hooks/use-aggrid-row-f
1515
import { LOGS_STORE_FIELD } from 'utils/store-sort-filter-fields';
1616
import { useReportFetcher } from 'hooks/use-report-fetcher';
1717
import { useDispatch } from 'react-redux';
18-
import { getDefaultSeverityFilter, orderSeverityList, REPORT_SEVERITY } from '../../utils/report/report-severity';
19-
import PropTypes from 'prop-types';
18+
import { getDefaultSeverityFilter, getReportSeverities, REPORT_SEVERITY } from '../../utils/report/report-severity';
2019
import { QuickSearch } from './QuickSearch';
2120
import { Box, Chip, Theme } from '@mui/material';
2221
import { CellClickedEvent, GridApi, ICellRendererParams, IRowNode, RowClassParams, RowStyle } from 'ag-grid-community';
2322
import { AgGridReact } from 'ag-grid-react';
24-
import { ReportLog, ReportType, SeverityLevel } from 'utils/report/report.type';
23+
import { Report, ReportLog, ReportType } from 'utils/report/report.type';
2524
import { COMPUTING_AND_NETWORK_MODIFICATION_TYPE } from 'utils/report/report.constant';
2625
import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
2726
import VisibilityIcon from '@mui/icons-material/Visibility';
@@ -60,14 +59,14 @@ const styles = {
6059
const SEVERITY_COLUMN_FIXED_WIDTH = 115;
6160

6261
type LogTableProps = {
62+
report: Report;
6363
selectedReportId: string;
6464
reportType: string;
6565
reportNature: ReportType;
66-
severities: SeverityLevel[];
6766
onRowClick: (data: ReportLog) => void;
6867
};
6968

70-
const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRowClick }: LogTableProps) => {
69+
const LogTable = ({ report, selectedReportId, reportType, reportNature, onRowClick }: LogTableProps) => {
7170
const intl = useIntl();
7271

7372
const theme = useTheme<Theme>();
@@ -90,7 +89,7 @@ const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRo
9089

9190
const severityFilter = useMemo(() => getColumnFilterValue(filterSelector, 'severity') ?? [], [filterSelector]);
9291
const messageFilter = useMemo(() => getColumnFilterValue(filterSelector, 'message'), [filterSelector]);
93-
const orderedSeverities = useMemo(() => orderSeverityList(severities), [severities]);
92+
const severities = useMemo(() => getReportSeverities(report), [report]);
9493

9594
const resetSearch = useCallback(() => {
9695
setSearchResults([]);
@@ -118,10 +117,9 @@ const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRo
118117
setRowData(transformedLogs);
119118
resetSearch();
120119
});
121-
}, [fetchReportLogs, messageFilter, reportNature, severityFilter, selectedReportId, resetSearch]);
120+
}, [severityFilter, fetchReportLogs, selectedReportId, reportNature, messageFilter, resetSearch]);
122121

123122
useEffect(() => {
124-
// initialize the filter with the severities
125123
if (filterSelector?.length === 0 && severities?.length > 0) {
126124
dispatch(
127125
setLogsFilter(reportType, [
@@ -134,19 +132,13 @@ const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRo
134132
])
135133
);
136134
}
135+
}, [severities, dispatch, reportType, filterSelector]);
136+
137+
useEffect(() => {
137138
if (selectedReportId && reportNature) {
138139
refreshLogsOnSelectedReport();
139140
}
140-
}, [
141-
dispatch,
142-
filterSelector?.length,
143-
refreshLogsOnSelectedReport,
144-
reportNature,
145-
reportType,
146-
selectedReportId,
147-
severities,
148-
updateFilter,
149-
]);
141+
}, [refreshLogsOnSelectedReport, reportNature, selectedReportId]);
150142

151143
const COLUMNS_DEFINITIONS = useMemo(
152144
() => [
@@ -328,7 +320,7 @@ const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRo
328320
/>
329321
</Box>
330322
<Box sx={styles.chipContainer}>
331-
{orderedSeverities.map((severity, index) => (
323+
{severities.map((severity, index) => (
332324
<Chip
333325
key={severity}
334326
label={severity}
@@ -354,12 +346,4 @@ const LogTable = ({ selectedReportId, reportType, reportNature, severities, onRo
354346
);
355347
};
356348

357-
LogTable.propTypes = {
358-
selectedReportId: PropTypes.string,
359-
reportType: PropTypes.string,
360-
reportNature: PropTypes.string,
361-
severities: PropTypes.arrayOf(PropTypes.string),
362-
onRowClick: PropTypes.func,
363-
};
364-
365349
export default memo(LogTable);

src/components/report-viewer/report-viewer.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import ReportItem from './report-item';
1212
import { mapReportsTree } from '../../utils/report/report-tree.mapper';
1313
import { useDispatch } from 'react-redux';
1414
import ReportTree from './report-tree';
15-
import { Report, ReportLog, ReportTree as ReportTreeType, ReportType, SeverityLevel } from 'utils/report/report.type';
15+
import { Report, ReportLog, ReportTree as ReportTreeType, ReportType } from 'utils/report/report.type';
1616

1717
// WARNING this file has been copied from commons-ui, and updated here. Putting it back to commons-ui has to be discussed.
1818

@@ -32,7 +32,6 @@ export default function ReportViewer({ report, reportType }: ReportViewerProps)
3232
const [reportVerticalPositionFromTop, setReportVerticalPositionFromTop] = useState<number | undefined>(undefined);
3333

3434
const [selectedReportId, setSelectedReportId] = useState(report?.id);
35-
const [severities, setSeverities] = useState<SeverityLevel[]>([]);
3635
const [selectedReportType, setSelectedReportType] = useState<ReportType>();
3736

3837
const reportTreeData = useRef<Record<string, ReportTreeType>>({});
@@ -47,7 +46,7 @@ export default function ReportViewer({ report, reportType }: ReportViewerProps)
4746
return (
4847
<ReportItem
4948
labelText={report.message}
50-
labelIconColor={report.highestSeverity.colorName}
49+
labelIconColor={report.severity.colorName}
5150
key={report.id}
5251
sx={styles.treeItem}
5352
nodeId={report.id}
@@ -62,7 +61,6 @@ export default function ReportViewer({ report, reportType }: ReportViewerProps)
6261
treeView.current = initializeTreeDataAndComponent(reportTree);
6362
setExpandedTreeReports([report.id]);
6463
setSelectedReportId(report.id);
65-
setSeverities([...new Set(reportTree.severities)]);
6664
setSelectedReportType(reportTreeData.current[report.id]?.type);
6765
}, [report, initializeTreeDataAndComponent, dispatch]);
6866

@@ -73,7 +71,6 @@ export default function ReportViewer({ report, reportType }: ReportViewerProps)
7371
const handleSelectNode = (_: SyntheticEvent, reportId: string) => {
7472
if (selectedReportId !== reportId) {
7573
setSelectedReportId(reportId);
76-
setSeverities([...new Set(reportTreeData.current[reportId].severities)]);
7774
setSelectedReportType(reportTreeData.current[reportId].type);
7875
}
7976
};
@@ -133,10 +130,10 @@ export default function ReportViewer({ report, reportType }: ReportViewerProps)
133130
<Grid item xs={12} sm={9} sx={{ height: '100%' }}>
134131
{selectedReportId && selectedReportType && (
135132
<LogTable
133+
report={report}
136134
selectedReportId={selectedReportId}
137135
reportType={reportType}
138136
reportNature={selectedReportType} // GlobalReport or NodeReport
139-
severities={severities}
140137
onRowClick={onLogRowClick}
141138
/>
142139
)}

src/hooks/use-report-fetcher.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import { AppState } from '../redux/reducer';
1010
import { useCallback, useMemo, useState } from 'react';
1111
import { fetchNodeReportLogs, fetchParentNodesReport } from '../services/study';
1212
import { useSnackMessage } from '@gridsuite/commons-ui';
13-
import { Log, Report, ReportLog, ReportType } from '../utils/report/report.type';
14-
import { getContainerDefaultSeverityList } from '../utils/report/report-severity';
13+
import { Log, Report, ReportLog, ReportSeverity, ReportType, SeverityLevel } from '../utils/report/report.type';
14+
import { getContainerDefaultSeverityList, REPORT_SEVERITY } from '../utils/report/report-severity';
1515
import { mapReportLogs } from '../utils/report/report-log.mapper';
1616
import { COMPUTING_AND_NETWORK_MODIFICATION_TYPE, GLOBAL_REPORT_NODE_LABEL } from '../utils/report/report.constant';
1717
import { ROOT_NODE_LABEL } from '../constants/node.constant';
@@ -26,11 +26,26 @@ function makeSingleReportAndMapNames(report: Report | Report[], nodesNames: Map<
2626
return {
2727
message: GLOBAL_REPORT_NODE_LABEL,
2828
id: GLOBAL_REPORT_NODE_LABEL,
29+
severity: getHighestSeverity(report),
2930
subReports: report.map((r) => setNodeName(r, nodesNames)),
3031
} as Report;
3132
}
3233
}
3334

35+
const getHighestSeverity = (report: Report[]): SeverityLevel => {
36+
if (report.length === 1) {
37+
return report[0].severity;
38+
}
39+
40+
const severityList = report.map((r) => r.severity);
41+
let reduceFct = (p: ReportSeverity, c: ReportSeverity) => (c.level > p.level ? c : p);
42+
let highestSeverity = REPORT_SEVERITY.UNKNOWN;
43+
44+
return Object.values(REPORT_SEVERITY)
45+
.filter((s) => severityList.includes(s.name))
46+
.reduce(reduceFct, highestSeverity).name;
47+
};
48+
3449
function setNodeName(report: Report, nodesNames: Map<string, string>) {
3550
if (report.message !== ROOT_NODE_LABEL) {
3651
report.message = nodesNames?.get(report.message) ?? report.message;

src/utils/report/report-log.mapper.ts

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

8-
import { Log, ReportLog, ReportSeverity } from './report.type';
98
import { REPORT_SEVERITY } from './report-severity';
9+
import { Log, ReportLog } from './report.type';
1010

1111
export const mapReportLogs = (reportLogs: ReportLog[]) => {
1212
const formattedLogs: Log[] = [];
@@ -17,18 +17,9 @@ export const mapReportLogs = (reportLogs: ReportLog[]) => {
1717
};
1818

1919
const formatLog = (reportLog: ReportLog, formattedLogs: Log[]) => {
20-
const highestSeverity = mapSeverity(reportLog.severity ?? [REPORT_SEVERITY.UNKNOWN.name]);
2120
formattedLogs.push({
2221
message: reportLog.message,
23-
severity: highestSeverity,
22+
severity: Object.values(REPORT_SEVERITY).find((s) => reportLog.severity === s.name) ?? REPORT_SEVERITY.UNKNOWN,
2423
parentId: reportLog.parentId,
2524
});
2625
};
27-
28-
const mapSeverity = (severities: string[]) => {
29-
let reduceFct = (p: ReportSeverity, c: ReportSeverity) => (c.level > p.level ? c : p);
30-
let highestSeverity: ReportSeverity = REPORT_SEVERITY.UNKNOWN;
31-
return Object.values(REPORT_SEVERITY)
32-
.filter((s) => severities.includes(s.name))
33-
.reduce(reduceFct, highestSeverity);
34-
};

src/utils/report/report-severity.ts

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

8-
import { ReportSeverity, SeverityLevel } from './report.type';
8+
import { ReportSeverity, SeverityLevel, Report } from './report.type';
99

1010
export const REPORT_SEVERITY: Record<SeverityLevel, ReportSeverity> = {
1111
UNKNOWN: {
@@ -80,23 +80,23 @@ export const getDefaultSeverityFilter = (severityList: string[]): string[] => {
8080
return severityFilter;
8181
};
8282

83-
export function orderSeverityList(severityList: SeverityLevel[]): SeverityLevel[] {
84-
return severityList.sort((a, b) => REPORT_SEVERITY[b].level - REPORT_SEVERITY[a].level);
85-
}
83+
export const getReportSeverities = (report: Report): SeverityLevel[] => {
84+
const severities: SeverityLevel[] = [];
85+
if (report.severity) {
86+
severities.push(report.severity);
87+
}
88+
if (report.subReports.length > 0) {
89+
report.subReports.forEach((subreport) => {
90+
severities.push(...getReportSeverities(subreport));
91+
});
92+
}
93+
severities.sort((a, b) => REPORT_SEVERITY[b].level - REPORT_SEVERITY[a].level);
94+
return [...new Set(severities)];
95+
};
8696

8797
export function getContainerDefaultSeverityList(): string[] {
8898
// return name list like ['WARN', 'INFO']
8999
return Object.values(REPORT_SEVERITY)
90100
.filter((s) => s.displayedByDefaultForReportContainer)
91101
.map((s) => s.name);
92102
}
93-
94-
export function getHighestSeverity(severityList: string[]) {
95-
// We have a un-ordered list of existing severities, like ['INFO', 'ERROR', 'DEBUG'].
96-
// Lets find out the highest level corresponding SEVERITY object, like SEVERITY.ERROR:
97-
let reduceFct = (p: ReportSeverity, c: ReportSeverity) => (c.level > p.level ? c : p);
98-
let highestSeverity = REPORT_SEVERITY.UNKNOWN;
99-
return Object.values(REPORT_SEVERITY)
100-
.filter((s) => severityList.includes(s.name))
101-
.reduce(reduceFct, highestSeverity);
102-
}

src/utils/report/report-tree.mapper.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,16 @@
66
*/
77

88
import { Report, ReportTree, ReportType } from './report.type';
9-
import { getHighestSeverity } from './report-severity';
109
import { GLOBAL_REPORT_NODE_LABEL } from './report.constant';
10+
import { REPORT_SEVERITY } from './report-severity';
1111

1212
export function mapReportsTree(report: Report, reportType?: ReportType): ReportTree {
13-
const severityList = report.severities || report.subReports.flatMap((subReport) => subReport.severities);
1413
return {
1514
type: reportType ?? (report.message === GLOBAL_REPORT_NODE_LABEL ? ReportType.GLOBAL : ReportType.NODE),
1615
id: report.id,
1716
message: report.message,
1817
parentId: report.parentId,
19-
severities: severityList,
20-
highestSeverity: getHighestSeverity(severityList),
18+
severity: Object.values(REPORT_SEVERITY).find((s) => report.severity === s.name) ?? REPORT_SEVERITY.UNKNOWN,
2119
subReports: report.subReports
2220
.filter((subReport) => subReport.subReports.length > 0 || subReport.id)
2321
.map((subReport) => mapReportsTree(subReport, ReportType.NODE)),

src/utils/report/report.type.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ export enum ReportType {
2121
NODE = 'NodeReport',
2222
}
2323

24-
export type ReportTree = Report & {
24+
export type ReportTree = Omit<Report, 'severity' | 'subReports'> & {
2525
type: ReportType;
26-
highestSeverity: ReportSeverity;
26+
severity: ReportSeverity;
2727
subReports: ReportTree[];
2828
};
2929

3030
export type Report = {
3131
message: string;
32-
severities: SeverityLevel[];
32+
severity: SeverityLevel;
3333
parentId: string | null;
3434
id: string;
3535
subReports: Report[];
@@ -43,7 +43,7 @@ export type Log = {
4343

4444
export type ReportLog = {
4545
message: string;
46-
severity: SeverityLevel[];
46+
severity: SeverityLevel;
4747
parentId: string;
4848
backgroundColor?: string;
4949
};

0 commit comments

Comments
 (0)