@@ -10,6 +10,7 @@ export default function Home() {
10
10
const [ jobs , setJobs ] = useState ( [ ] ) ;
11
11
const [ rows , setRows ] = useState ( [ ] ) ;
12
12
const [ expandedRows , setExpandedRows ] = useState ( [ ] ) ;
13
+ const [ requiredFilter , setRequiredFilter ] = useState ( false ) ;
13
14
14
15
useEffect ( ( ) => {
15
16
const fetchData = async ( ) => {
@@ -42,17 +43,34 @@ export default function Home() {
42
43
fetchData ( ) ;
43
44
} , [ ] ) ;
44
45
46
+
47
+ // Filter based on required tag.
48
+ const filterRequired = ( filteredJobs ) => {
49
+ if ( requiredFilter ) {
50
+ filteredJobs = filteredJobs . filter ( ( job ) => job . required ) ;
51
+ }
52
+ return filteredJobs ;
53
+ } ;
54
+
45
55
useEffect ( ( ) => {
46
56
setLoading ( true ) ;
47
57
48
- // Create rows to set into table.
49
- const rows = jobs . map ( ( job ) => ( {
50
- ...job ,
51
- weather : getWeatherIndex ( job ) ,
52
- } ) ) ;
53
- setRows ( rows ) ;
58
+ // Filter based on required tag.
59
+ let filteredJobs = filterRequired ( jobs ) ;
60
+
61
+ //Set the rows for the table.
62
+ setRows (
63
+ filteredJobs . map ( ( job ) => ( {
64
+ name : job . name ,
65
+ runs : job . runs ,
66
+ fails : job . fails ,
67
+ skips : job . skips ,
68
+ required : job . required ,
69
+ weather : getWeatherIndex ( job ) ,
70
+ } ) )
71
+ ) ;
54
72
setLoading ( false ) ;
55
- } , [ jobs ] ) ;
73
+ } , [ jobs , requiredFilter ] ) ;
56
74
57
75
const toggleRow = ( rowData ) => {
58
76
const isRowExpanded = expandedRows . includes ( rowData ) ;
@@ -67,6 +85,11 @@ export default function Home() {
67
85
setExpandedRows ( updatedExpandedRows ) ;
68
86
} ;
69
87
88
+ const buttonClass = ( active ) => `tab md:px-4 px-2 py-2 border-2
89
+ ${ active ? "border-blue-500 bg-blue-500 text-white"
90
+ : "border-gray-300 bg-white hover:bg-gray-100" } `;
91
+
92
+
70
93
// Template for rendering the Name column as a clickable item
71
94
const nameTemplate = ( rowData ) => {
72
95
return (
@@ -185,6 +208,11 @@ export default function Home() {
185
208
"m-0 h-full p-4 overflow-x-hidden overflow-y-auto bg-surface-ground font-normal text-text-color antialiased select-text"
186
209
}
187
210
>
211
+ < button
212
+ className = { buttonClass ( requiredFilter ) }
213
+ onClick = { ( ) => setRequiredFilter ( ! requiredFilter ) } >
214
+ Required Jobs Only
215
+ </ button >
188
216
< div className = "mt-4 text-lg" > Total Rows: { rows . length } </ div >
189
217
< div > { renderTable ( ) } </ div >
190
218
</ main >
0 commit comments