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" ;
33import { CoverageSummary } from "../apis.js" ;
44import { DashboardTable } from "./dashboard-table.js" ;
55import { InfoEntry , InfoReport } from "./info-table.js" ;
@@ -9,20 +9,78 @@ export interface DashboardProps {
99}
1010
1111export 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