Skip to content

Commit 1ab6ca8

Browse files
authored
Merge pull request #29 from a1icja/maintainers-list
dashboard: Add Maintainers List
2 parents 2b7e4c2 + 1bd9f88 commit 1ab6ca8

File tree

5 files changed

+265
-11
lines changed

5 files changed

+265
-11
lines changed

maintainers.yml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# maintainers.yaml
2+
#
3+
# @kata-containers/arch-s390x: BbolroC
4+
# @kata-containers/arch-ppc64le: Amulyam24?
5+
# @kata-containers/cri-o: ?
6+
# @kata-containers/dragonball: bergwolf
7+
# @kata-containers/rust: pmores, lifupan
8+
# @kata-containers/amd: AdithyaKrishnan, arvindskumar99
9+
10+
11+
## slack: member id, display name, or link to profile?
12+
13+
mappings:
14+
# @kata-containers/arch-s390x: BbolroC
15+
- regex: ".*s390x.*"
16+
group: "Arch-s390x"
17+
owners:
18+
- fullname: "Hyounggyu Choi"
19+
20+
slackurl: "https://katacontainers.slack.com/team/U0369UMM69M"
21+
slack: "Hyounggyu Choi"
22+
github: "BbolroC"
23+
24+
# @kata-containers/arch-ppc64le: Amulyam24?
25+
- regex: ".*ppc64le.*"
26+
group: "Arch-ppc64le"
27+
owners:
28+
- fullname: "Amulya Meka"
29+
30+
slackurl: "https://katacontainers.slack.com/team/UV7RP34GK"
31+
slack: "Amulyam24"
32+
github: "Amulyam24"
33+
34+
35+
# @kata-containers/dragonball: bergwolf
36+
- regex: ".*dragonball.*"
37+
group: "Dragonball"
38+
owners:
39+
- fullname: "Peng Tao"
40+
email: "http://bergwolf.github.io/"
41+
slackurl: "https://katacontainers.slack.com/team/U8709NBSM"
42+
slack: "bergwolf"
43+
github: "bergwolf"
44+
45+
46+
# @kata-containers/rust: pmores, lifupan
47+
- regex: ".*runtime-rs.*"
48+
group: "Rust"
49+
owners:
50+
- fullname: "Pavel Mores"
51+
52+
slackurl: "https://katacontainers.slack.com/team/U03CCR6KGBC"
53+
slack: "Pavel Mores"
54+
github: "pmores"
55+
56+
- fullname: "Fupan Li"
57+
58+
slackurl: "https://katacontainers.slack.com/team/U059Y60DZPW"
59+
slack: "fupan li"
60+
github: "lifupan"
61+
62+
# @kata-containers/amd: AdithyaKrishnan, arvindskumar99
63+
- regex: ".*(qemu-(sev(-snp)?|snp(-experimental)?)|ovmf(-sev)?).*"
64+
group: "AMD"
65+
owners:
66+
- fullname: "Adithya Krishnan Kannan"
67+
68+
slackurl: "https://cloud-native.slack.com/team/U05TX2URB16"
69+
slack: "Adi"
70+
github: "AdithyaKrishnan"
71+
72+
- fullname: "Arvind Kumar"
73+
74+
slackurl: "https://cloud-native.slack.com/team/U06HXU0312P"
75+
slack: "Arvind Kumar"
76+
github: "arvindskumar99"

next.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ module.exports = {
66
unoptimized: true,
77
},
88
webpack: (config, { dev }) => {
9+
10+
config.module.rules.push({
11+
test: /\.yml$/,
12+
use: 'yaml-loader',
13+
});
14+
915
if (dev) {
1016
config.devtool = false;
1117
}

package-lock.json

Lines changed: 66 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"primereact": "^10.8.3",
1616
"react": "^18.3.1",
1717
"react-dom": "^18.3.1",
18-
"react-transition-group": "^4.4.5"
18+
"react-transition-group": "^4.4.5",
19+
"yaml-loader": "^0.8.1"
1920
},
2021
"devDependencies": {
2122
"autoprefixer": "^10.4.20",

pages/index.js

Lines changed: 115 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { useEffect, useState } from "react";
1+
import React, { useEffect, useState, useRef } from "react";
22
import { DataTable } from "primereact/datatable";
33
import { Column } from "primereact/column";
44
import Head from "next/head";
55
import { weatherTemplate, getWeatherIndex } from "../components/weatherTemplate";
6+
import { OverlayPanel } from 'primereact/overlaypanel';
7+
import MaintainerMapping from "../maintainers.yml";
68

79

810
export 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

Comments
 (0)