1- import { useEffect , useState } from "react" ;
1+ import React , { useEffect , useState , useRef } from "react" ;
22import { DataTable } from "primereact/datatable" ;
33import { Column } from "primereact/column" ;
44import Head from "next/head" ;
55import { weatherTemplate , getWeatherIndex } from "../components/weatherTemplate" ;
6+ import { OverlayPanel } from 'primereact/overlaypanel' ;
7+ import MaintainerMapping from "../maintainers.yml" ;
68
79
810export default function Home ( ) {
@@ -76,9 +78,11 @@ export default function Home() {
7678 ) ;
7779 } ;
7880
81+ const maintainRefs = useRef ( [ ] ) ;
82+
7983 const rowExpansionTemplate = ( data ) => {
8084 const job = jobs . find ( ( job ) => job . name === data . name ) ;
81-
85+
8286 // Prepare run data
8387 const runs = [ ] ;
8488 for ( let i = 0 ; i < job . runs ; i ++ ) {
@@ -88,14 +92,30 @@ export default function Home() {
8892 url : job . urls [ i ] ,
8993 } ) ;
9094 }
95+
96+ // Find maintainers for the given job
97+ const maintainerData = MaintainerMapping . mappings
98+ . filter ( ( { regex } ) => new RegExp ( regex ) . test ( job . name ) )
99+ . flatMap ( ( match ) =>
100+ match . owners . map ( ( owner ) => ( {
101+ ...owner ,
102+ group : match . group ,
103+ } ) )
104+ ) ;
105+
106+ // Group maintainers by their group name
107+ const groupedMaintainers = maintainerData . reduce ( ( acc , owner ) => {
108+ if ( ! acc [ owner . group ] ) {
109+ acc [ owner . group ] = [ ] ;
110+ }
111+ acc [ owner . group ] . push ( owner ) ;
112+ return acc ;
113+ } , { } ) ;
91114
92115 return (
93- < div
94- key = { `${ job . name } -runs` }
95- className = "p-3 bg-gray-100"
96- style = { { marginLeft : "4.5rem" , marginTop : "-2.0rem" } }
97- >
98- < div >
116+ < div key = { `${ job . name } -runs` } className = "p-3 bg-gray-100" >
117+ { /* Display last 10 runs */ }
118+ < div className = "flex flex-wrap gap-4" >
99119 { runs . length > 0 ? (
100120 runs . map ( ( run ) => {
101121 const emoji =
@@ -117,6 +137,93 @@ export default function Home() {
117137 < div > No Nightly Runs associated with this job</ div >
118138 ) }
119139 </ div >
140+
141+ { /* Display Maintainers, if there's any */ }
142+ < div className = "mt-4 p-2 bg-gray-300 w-full" >
143+ { Object . keys ( groupedMaintainers ) . length > 0 ? (
144+ < div className = "grid grid-cols-2 p-2 gap-6" >
145+ { Object . entries ( groupedMaintainers ) . map (
146+ ( [ group , owners ] , groupIndex ) => (
147+ < div key = { groupIndex } className = "flex flex-col max-w-xs" >
148+ { /* List the group name */ }
149+ < strong className = "pl-2" > { group } :</ strong >
150+ < div >
151+ { /* List all maintainers for the group */ }
152+ { owners . map ( ( owner , ownerIndex ) => {
153+ const badgeMaintain = `maintain-${ owner . github } ` ;
154+ maintainRefs . current [ badgeMaintain ] =
155+ maintainRefs . current [ badgeMaintain ] || React . createRef ( ) ;
156+
157+ return (
158+ // Create the OverlayPanel with contact information.
159+ < span key = { ownerIndex } >
160+ < span
161+ onMouseEnter = { ( e ) =>
162+ maintainRefs . current [ badgeMaintain ] . current . toggle ( e )
163+ }
164+ >
165+ < a
166+ href = { `https://github.com/${ owner . github } ` }
167+ target = "_blank"
168+ rel = "noopener noreferrer"
169+ className = "text-blue-500 underline pl-2 whitespace-nowrap"
170+ >
171+ { owner . fullname }
172+ </ a >
173+ { ownerIndex < owners . length - 1 && ", " }
174+ </ span >
175+ < OverlayPanel
176+ ref = { maintainRefs . current [ badgeMaintain ] }
177+ dismissable
178+ onMouseLeave = { ( e ) =>
179+ maintainRefs . current [ badgeMaintain ] . current . toggle ( e )
180+ }
181+ >
182+ < ul className = "bg-white border rounded shadow-lg p-2" >
183+ < li className = "p-2 hover:bg-gray-200" >
184+ < span className = "font-bold mr-4" > Email:</ span > { " " }
185+ { owner . email }
186+ </ li >
187+ < a
188+ href = { `https://github.com/${ owner . github } ` }
189+ target = "_blank"
190+ rel = "noopener noreferrer"
191+ >
192+ < li className = "p-2 hover:bg-gray-200 flex justify-between" >
193+ < span className = "font-bold mr-4" >
194+ GitHub:
195+ </ span >
196+ < span className = "text-right" >
197+ { owner . github }
198+ </ span >
199+ </ li >
200+ </ a >
201+ < a
202+ href = { `${ owner . slackurl } ` }
203+ target = "_blank"
204+ rel = "noopener noreferrer"
205+ >
206+ < li className = "p-2 hover:bg-gray-200 flex justify-between" >
207+ < span className = "font-bold mr-4" > Slack:</ span >
208+ < span className = "text-right" >
209+ @{ owner . slack }
210+ </ span >
211+ </ li >
212+ </ a >
213+ </ ul >
214+ </ OverlayPanel >
215+ </ span >
216+ ) ;
217+ } ) }
218+ </ div >
219+ </ div >
220+ )
221+ ) }
222+ </ div >
223+ ) : (
224+ < div > No Maintainer Information Available</ div >
225+ ) }
226+ </ div >
120227 </ div >
121228 ) ;
122229 } ;
0 commit comments