@@ -12,6 +12,7 @@ export default function Home() {
1212 const [ jobs , setJobs ] = useState ( [ ] ) ;
1313 const [ rows , setRows ] = useState ( [ ] ) ;
1414 const [ expandedRows , setExpandedRows ] = useState ( [ ] ) ;
15+ const [ requiredFilter , setRequiredFilter ] = useState ( false ) ;
1516
1617 useEffect ( ( ) => {
1718 const fetchData = async ( ) => {
@@ -44,17 +45,34 @@ export default function Home() {
4445 fetchData ( ) ;
4546 } , [ ] ) ;
4647
48+
49+ // Filter based on required tag.
50+ const filterRequired = ( filteredJobs ) => {
51+ if ( requiredFilter ) {
52+ filteredJobs = filteredJobs . filter ( ( job ) => job . required ) ;
53+ }
54+ return filteredJobs ;
55+ } ;
56+
4757 useEffect ( ( ) => {
4858 setLoading ( true ) ;
4959
50- // Create rows to set into table.
51- const rows = jobs . map ( ( job ) => ( {
52- ...job ,
53- weather : getWeatherIndex ( job ) ,
54- } ) ) ;
55- setRows ( rows ) ;
60+ // Filter based on required tag.
61+ let filteredJobs = filterRequired ( jobs ) ;
62+
63+ //Set the rows for the table.
64+ setRows (
65+ filteredJobs . map ( ( job ) => ( {
66+ name : job . name ,
67+ runs : job . runs ,
68+ fails : job . fails ,
69+ skips : job . skips ,
70+ required : job . required ,
71+ weather : getWeatherIndex ( job ) ,
72+ } ) )
73+ ) ;
5674 setLoading ( false ) ;
57- } , [ jobs ] ) ;
75+ } , [ jobs , requiredFilter ] ) ;
5876
5977 const toggleRow = ( rowData ) => {
6078 const isRowExpanded = expandedRows . includes ( rowData ) ;
@@ -69,6 +87,11 @@ export default function Home() {
6987 setExpandedRows ( updatedExpandedRows ) ;
7088 } ;
7189
90+ const buttonClass = ( active ) => `tab md:px-4 px-2 py-2 border-2
91+ ${ active ? "border-blue-500 bg-blue-500 text-white"
92+ : "border-gray-300 bg-white hover:bg-gray-100" } `;
93+
94+
7295 // Template for rendering the Name column as a clickable item
7396 const nameTemplate = ( rowData ) => {
7497 return (
@@ -292,6 +315,11 @@ export default function Home() {
292315 "m-0 h-full p-4 overflow-x-hidden overflow-y-auto bg-surface-ground font-normal text-text-color antialiased select-text"
293316 }
294317 >
318+ < button
319+ className = { buttonClass ( requiredFilter ) }
320+ onClick = { ( ) => setRequiredFilter ( ! requiredFilter ) } >
321+ Required Jobs Only
322+ </ button >
295323 < div className = "mt-4 text-lg" > Total Rows: { rows . length } </ div >
296324 < div > { renderTable ( ) } </ div >
297325 </ main >
0 commit comments