forked from y-scope/yscope-log-viewer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResultsGroup.tsx
126 lines (113 loc) · 3.71 KB
/
ResultsGroup.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import {
useEffect,
useState,
} from "react";
import * as React from "react";
import {
Accordion,
AccordionDetails,
AccordionSummary,
Box,
Chip,
List,
Stack,
Typography,
} from "@mui/joy";
import DescriptionOutlinedIcon from "@mui/icons-material/DescriptionOutlined";
import {QueryResults} from "../../../../../typings/worker";
import Result from "./Result";
import "./ResultsGroup.css";
interface ResultsGroupProps {
isAllExpanded: boolean,
queryResults: QueryResults,
}
/**
*
* @param props
* @param props.isAllExpanded
* @param props.queryResults
*/
const ResultsGroup = ({
isAllExpanded,
queryResults,
}: ResultsGroupProps) => {
const [expandedMap, setExpandedMap] = useState<Record<number, boolean>>({});
const handleAccordionChange = (
pageNum: number
) => (_: React.SyntheticEvent, newValue: boolean) => {
setExpandedMap((prev) => ({
...prev,
[pageNum]: newValue,
}));
};
// On `isAllExpanded` updates, sync current results group's expand status.
useEffect(() => {
const newExpandedMap = Object.fromEntries(
Object.entries(expandedMap).map(([key]) => [key,
isAllExpanded])
);
setExpandedMap(newExpandedMap);
}, [isAllExpanded]);
useEffect(() => {
setExpandedMap((prevMap) => {
const updatedMap = {...prevMap};
queryResults.forEach((_, pageNum) => {
// Only set for entries not already in expandedMap
if (!(pageNum in updatedMap)) {
updatedMap[pageNum] = isAllExpanded;
}
});
return updatedMap;
});
}, [
isAllExpanded,
queryResults,
]);
return (
<>
{Array.from(queryResults.entries()).map(([pageNum, results]) => (
<Accordion
expanded={expandedMap[pageNum] ?? isAllExpanded}
key={pageNum}
onChange={handleAccordionChange(pageNum)}
>
<AccordionSummary
slotProps={{
button: {className: "results-group-title-button"},
}}
>
<Box className={"results-group-title-container"}>
<Stack
className={"results-group-title-text-container"}
direction={"row"}
>
<DescriptionOutlinedIcon fontSize={"inherit"}/>
<Typography
level={"title-sm"}
>
Page
{" "}
{pageNum}
</Typography>
</Stack>
<Chip size={"sm"}>
{results.length}
</Chip>
</Box>
</AccordionSummary>
<AccordionDetails className={"results-group-content"}>
<List size={"sm"}>
{results.map((r) => (
<Result
key={r.logEventNum}
matchRange={r.matchRange}
message={r.message}/>
))}
</List>
</AccordionDetails>
</Accordion>
))}
</>
);
};
export default ResultsGroup;