Skip to content

Commit de62e9b

Browse files
committed
tab history
1 parent 64c9889 commit de62e9b

5 files changed

Lines changed: 69 additions & 26 deletions

File tree

web-report/src/components/Dashboard.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ export const Dashboard: React.FC = () => {
5454

5555
const [testTabs, setTestTabs] = useState<Array<ITestTabs>>([]);
5656

57+
const [openExamples, setOpenExamples] = useState<string[]>([]);
58+
const [openEndpoint, setOpenEndpoint] = useState<string>("");
59+
const [openTestFiles, setOpenTestFiles] = useState<string[]>([]);
60+
5761
const addTestTab = (testName: string, event: React.MouseEvent<HTMLElement>) => {
5862
const origin = MAIN_TABS.has(activeTab)
5963
? activeTab
@@ -195,15 +199,15 @@ export const Dashboard: React.FC = () => {
195199
</TabsContent>
196200

197201
<TabsContent value="endpoints">
198-
<Endpoints addTestTab={addTestTab}/>
202+
<Endpoints addTestTab={addTestTab} openEndpoint={openEndpoint} setOpenEndpoint={setOpenEndpoint}/>
199203
</TabsContent>
200204

201205
<TabsContent value="examples">
202-
<Examples addTestTab={addTestTab}/>
206+
<Examples addTestTab={addTestTab} openExamples={openExamples} setOpenExamples={setOpenExamples}/>
203207
</TabsContent>
204208

205209
<TabsContent value="tests">
206-
<Tests/>
210+
<Tests openTestFiles={openTestFiles} setOpenTestFiles={setOpenTestFiles}/>
207211
</TabsContent>
208212

209213
<TabsContent value="warnings">

web-report/src/pages/Endpoints.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import {useAppContext} from "@/AppProvider.tsx";
66

77
interface IProps {
88
addTestTab: (value: string, event: React.MouseEvent<HTMLElement>) => void;
9+
openEndpoint: string;
10+
setOpenEndpoint: (value: string) => void;
911
}
1012

11-
export const Endpoints: React.FC<IProps> = ({addTestTab}) => {
13+
export const Endpoints: React.FC<IProps> = ({addTestTab, openEndpoint, setOpenEndpoint}) => {
1214

1315
const {transformedReport, filteredEndpoints, statusFilters, setStatusFilters} = useAppContext();
1416

@@ -21,10 +23,10 @@ export const Endpoints: React.FC<IProps> = ({addTestTab}) => {
2123
<p className="text-black-400">{filteredEndpoints.length}</p> / <p className="text-red-400">{transformedReport.length}</p>
2224
</div>
2325
</div>
24-
<Accordion type="single" collapsible className="w-full">
26+
<Accordion type="single" collapsible value={openEndpoint} onValueChange={setOpenEndpoint} className="w-full">
2527
{
2628
filteredEndpoints.map((item, index) => (
27-
<EndpointAccordion data-testid="endpoint" key={index} value={`_${index}`}
29+
<EndpointAccordion data-testid="endpoint" key={index} value={item.endpoint}
2830
endpoint={item.endpoint}
2931
statusCodes={item.httpStatusCodes} faults={item.faults}
3032
addTestTab={addTestTab}/>

web-report/src/pages/Examples.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import {ChevronRight, Code} from "lucide-react";
55

66
interface IProps {
77
addTestTab: (testName: string, event: React.MouseEvent<HTMLElement>) => void;
8+
openExamples: string[];
9+
setOpenExamples: (value: string[]) => void;
810
}
911

1012
interface ExampleEntry {
1113
name: string;
1214
cases: Array<{id: string; name: string}>;
1315
}
1416

15-
export const Examples: React.FC<IProps> = ({addTestTab}) => {
17+
export const Examples: React.FC<IProps> = ({addTestTab, openExamples, setOpenExamples}) => {
1618
const {data} = useAppContext();
1719
const testCases = useMemo(() => data?.testCases ?? [], [data]);
1820

@@ -75,11 +77,11 @@ export const Examples: React.FC<IProps> = ({addTestTab}) => {
7577
) : filteredExamples.length === 0 ? (
7678
<div className="text-gray-500 italic text-sm">No named examples match the current filter.</div>
7779
) : (
78-
<Accordion type="multiple" className="w-full">
80+
<Accordion type="multiple" value={openExamples} onValueChange={setOpenExamples} className="w-full">
7981
{filteredExamples.map((ex, idx) => (
8082
<AccordionItem
8183
key={ex.name}
82-
value={`example-${idx}`}
84+
value={ex.name}
8385
className="border-2 border-black mb-4 overflow-hidden"
8486
data-testid={`example-${idx}`}
8587
>

web-report/src/pages/Tests.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ const filterButtonClass = (active: boolean) =>
1717
: "bg-white hover:bg-gray-100"
1818
}`;
1919

20-
export const Tests: React.FC = () => {
20+
interface IProps {
21+
openTestFiles: string[];
22+
setOpenTestFiles: (value: string[]) => void;
23+
}
24+
25+
export const Tests: React.FC<IProps> = ({openTestFiles, setOpenTestFiles}) => {
2126
const {
2227
data,
2328
reviews,
@@ -153,13 +158,13 @@ export const Tests: React.FC = () => {
153158
))}
154159
</div>
155160

156-
<Accordion type="multiple" className="w-full">
161+
<Accordion type="multiple" value={openTestFiles} onValueChange={setOpenTestFiles} className="w-full">
157162
{testFilePaths.map((file, idx) => {
158163
const items = grouped.get(file) ?? [];
159164
return (
160165
<AccordionItem
161166
key={file}
162-
value={`file-${idx}`}
167+
value={file}
163168
className="border-2 border-black mb-4 overflow-hidden"
164169
data-testid={`test-file-${idx}`}
165170
>

web-report/src/pages/Warnings.tsx

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,21 @@ import {useAppContext} from "@/AppProvider.tsx";
33
import {Warning} from "@/types/GeneratedTypes.tsx";
44
import {AlertTriangle} from "lucide-react";
55

6+
type Palette = {container: string; badge: string};
7+
8+
const CATEGORY_PALETTE: Palette[] = [
9+
{container: "bg-blue-50 border-blue-500 text-blue-900", badge: "bg-blue-200 border-blue-700 text-blue-900"},
10+
{container: "bg-amber-50 border-amber-500 text-amber-900", badge: "bg-amber-200 border-amber-700 text-amber-900"},
11+
{container: "bg-emerald-50 border-emerald-500 text-emerald-900", badge: "bg-emerald-200 border-emerald-700 text-emerald-900"},
12+
{container: "bg-purple-50 border-purple-500 text-purple-900", badge: "bg-purple-200 border-purple-700 text-purple-900"},
13+
{container: "bg-pink-50 border-pink-500 text-pink-900", badge: "bg-pink-200 border-pink-700 text-pink-900"},
14+
];
15+
16+
const UNCATEGORIZED_PALETTE: Palette = {
17+
container: "bg-gray-50 border-gray-400 text-gray-900",
18+
badge: "bg-gray-200 border-gray-600 text-gray-900",
19+
};
20+
621
export const Warnings: React.FC = () => {
722
const {data} = useAppContext();
823

@@ -15,6 +30,17 @@ export const Warnings: React.FC = () => {
1530
});
1631
}, [data]);
1732

33+
const categoryPalette = useMemo<Map<string, Palette>>(() => {
34+
const map = new Map<string, Palette>();
35+
for (const w of sortedWarnings) {
36+
if (!w.category) continue;
37+
if (!map.has(w.category)) {
38+
map.set(w.category, CATEGORY_PALETTE[map.size % CATEGORY_PALETTE.length]);
39+
}
40+
}
41+
return map;
42+
}, [sortedWarnings]);
43+
1844
return (
1945
<div className="border-2 border-black p-3 sm:p-6 rounded-none" data-testid="warnings-page">
2046
<div className="flex items-center gap-2 mb-4">
@@ -31,24 +57,28 @@ export const Warnings: React.FC = () => {
3157
</div>
3258
) : (
3359
<div className="flex flex-col gap-3">
34-
{sortedWarnings.map((w, idx) => (
35-
<div
36-
key={idx}
37-
className="border-2 p-3 bg-blue-50 border-blue-500 text-blue-900"
38-
data-testid={`warning-${idx}`}
39-
>
40-
{w.category && (
41-
<div className="mb-2">
42-
<span className="font-mono text-xs px-2 py-0.5 border-2 border-black bg-white" data-testid={`warning-${idx}-category`}>
60+
{sortedWarnings.map((w, idx) => {
61+
const palette = w.category ? (categoryPalette.get(w.category) ?? UNCATEGORIZED_PALETTE) : UNCATEGORIZED_PALETTE;
62+
return (
63+
<div
64+
key={idx}
65+
className={`border-2 p-3 flex flex-col sm:flex-row sm:items-start gap-2 sm:gap-3 ${palette.container}`}
66+
data-testid={`warning-${idx}`}
67+
>
68+
{w.category && (
69+
<span
70+
className={`shrink-0 self-start font-mono text-xs px-2 py-0.5 border-2 ${palette.badge}`}
71+
data-testid={`warning-${idx}-category`}
72+
>
4373
{w.category}
4474
</span>
75+
)}
76+
<div className="text-sm whitespace-pre-wrap break-words flex-1" data-testid={`warning-${idx}-message`}>
77+
{w.message ?? <span className="italic text-gray-500">(no message)</span>}
4578
</div>
46-
)}
47-
<div className="text-sm whitespace-pre-wrap break-words" data-testid={`warning-${idx}-message`}>
48-
{w.message ?? <span className="italic text-gray-500">(no message)</span>}
4979
</div>
50-
</div>
51-
))}
80+
);
81+
})}
5282
</div>
5383
)}
5484
</div>

0 commit comments

Comments
 (0)