Skip to content

Commit 4c2b481

Browse files
committed
Add filter
1 parent 502fb84 commit 4c2b481

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

packages/spec-dashboard/src/components/dashboard-table.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ function getCompletedRatio(
148148
}
149149
}
150150

151-
return coveredCount / filtered.length;
151+
return filtered.length > 0 ? coveredCount / filtered.length : 0;
152152
}
153153

154154
interface DashboardHeaderRowProps {

packages/spec-dashboard/src/components/dashboard.tsx

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Card, CardHeader, Text } from "@fluentui/react-components";
2-
import { FunctionComponent } from "react";
1+
import { Card, CardHeader, Dropdown, Option, Text } from "@fluentui/react-components";
2+
import { FunctionComponent, useState } from "react";
33
import { CoverageSummary } from "../apis.js";
44
import { DashboardTable } from "./dashboard-table.js";
55
import { InfoEntry, InfoReport } from "./info-table.js";
@@ -9,20 +9,78 @@ export interface DashboardProps {
99
}
1010

1111
export const Dashboard: FunctionComponent<DashboardProps> = ({ coverageSummaries }) => {
12-
const summaryTables = coverageSummaries.map((coverageSummary, i) => (
12+
const [selectedTier, setSelectedTier] = useState<string | undefined>(undefined);
13+
14+
// Filter scenarios by tier if a tier is selected
15+
const filteredCoverageSummaries = selectedTier
16+
? coverageSummaries.map((summary) => ({
17+
...summary,
18+
manifest: {
19+
...summary.manifest,
20+
scenarios: summary.manifest.scenarios.filter(
21+
(scenario) => scenario.tier === selectedTier,
22+
),
23+
},
24+
}))
25+
: coverageSummaries;
26+
27+
const summaryTables = filteredCoverageSummaries.map((coverageSummary, i) => (
1328
<div key={i} css={{ margin: 5 }}>
1429
<DashboardTable coverageSummary={coverageSummary} />
1530
</div>
1631
));
1732

18-
const specsCardTable = coverageSummaries.map((coverageSummary, i) => (
33+
const specsCardTable = filteredCoverageSummaries.map((coverageSummary, i) => (
1934
<div key={i} css={{ margin: 5, flex: 0 }}>
2035
<CadlRanchSpecsCard coverageSummary={coverageSummary} />
2136
</div>
2237
));
2338

39+
// Get unique tiers from all scenarios across all coverage summaries
40+
const allTiers = Array.from(
41+
new Set(
42+
coverageSummaries
43+
.flatMap((summary) => summary.manifest.scenarios)
44+
.map((scenario) => scenario.tier),
45+
),
46+
).sort();
47+
2448
return (
2549
<div>
50+
<div
51+
css={{
52+
display: "flex",
53+
alignItems: "center",
54+
marginBottom: 20,
55+
padding: "10px 15px",
56+
backgroundColor: "#f8f9fa",
57+
borderRadius: "6px",
58+
gap: 10,
59+
}}
60+
>
61+
<Text weight="semibold">Filter by Tier:</Text>
62+
<Dropdown
63+
placeholder="All tiers"
64+
value={selectedTier ? `${selectedTier}` : ""}
65+
selectedOptions={selectedTier ? [selectedTier] : []}
66+
onOptionSelect={(_, data) => {
67+
setSelectedTier(data.optionValue === "all" ? undefined : data.optionValue);
68+
}}
69+
css={{ minWidth: 150 }}
70+
>
71+
<Option value="all">All tiers</Option>
72+
{allTiers.map((tier) => (
73+
<Option key={tier} value={tier}>
74+
{tier}
75+
</Option>
76+
))}
77+
</Dropdown>
78+
{selectedTier && (
79+
<Text size={200} style={{ color: "#666", marginLeft: 10 }}>
80+
Showing {selectedTier} tier scenarios only
81+
</Text>
82+
)}
83+
</div>
2684
<div css={{ display: "flex" }}>{specsCardTable}</div>
2785
<div css={{ height: 30 }}></div>
2886
{summaryTables}

0 commit comments

Comments
 (0)