Skip to content

Commit 354be97

Browse files
authored
Add region filter to PR list (#1545)
This allows linking to a region-specific page, as well as filtering within the page.
1 parent ed08912 commit 354be97

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

org-cyf-theme/assets/custom-scripts/reviews/index.mjs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,14 @@ function computeStatusClass(awaitingReview) {
3636
const state = {
3737
"prs": null,
3838
"reviewer_filter": "",
39+
"region_filter": "",
3940
}
4041

4142
async function onLoad() {
43+
const urlParams = new URLSearchParams(window.location.search);
44+
const region = urlParams.get("region");
45+
state.region_filter = region;
46+
4247
render();
4348
state.prs = (await fetchPrsWithoutLoadingReviews()).filter((pr) => pr.status === "Needs Review");
4449
render();
@@ -47,6 +52,18 @@ async function onLoad() {
4752
}
4853

4954
function render() {
55+
const regionSelect = document.querySelector("#region-filter");
56+
regionSelect.textContent = "";
57+
regionSelect.appendChild(makeRegionOption("All Regions", ""));
58+
for (const region of Object.keys(regionAliases)) {
59+
regionSelect.appendChild(makeRegionOption(region, region));
60+
}
61+
regionSelect.appendChild(makeRegionOption("Unknown", "Unknown"));
62+
regionSelect.addEventListener("change", (event) => {
63+
state.region_filter = event.target.value;
64+
render();
65+
});
66+
5067
if (state.prs === null) {
5168
document.querySelector("#pr-list").innerText = "Loading...";
5269
return;
@@ -66,6 +83,9 @@ function render() {
6683
}
6784

6885
for (const pr of state.prs) {
86+
if (state.region_filter && !regionMatches(state.region_filter, pr.title)) {
87+
continue;
88+
}
6989
for (const review of pr.reviews) {
7090
if (!review.isPrAuthor) {
7191
reviewers.add(review.userName);
@@ -163,6 +183,36 @@ function render() {
163183
}
164184
}
165185

186+
const regionMatches = (regionToFilter, prTitle) => {
187+
if (regionToFilter == "Unknown") {
188+
for (const region of Object.keys(regionAliases)) {
189+
if (regionMatches(region, prTitle)) {
190+
return false;
191+
}
192+
}
193+
return true;
194+
}
195+
const lowerParts = prTitle.toLowerCase().split("|").map((part) => part.trim());
196+
for (const alias of [regionToFilter, ...regionAliases[regionToFilter]]) {
197+
const lowerAlias = alias.toLowerCase();
198+
for (const lowerPart of lowerParts) {
199+
if (lowerPart == lowerAlias) {
200+
return true;
201+
}
202+
}
203+
}
204+
return false;
205+
};
206+
207+
const regionAliases = {
208+
"Cape Town": ["South Africa", "SouthAfrica", "ZA", "ZA Cape Town"],
209+
"Glasgow": ["Scotland"],
210+
"London": [],
211+
"North West": ["NW", "Manchester"],
212+
"Sheffield": [],
213+
"West Midlands": ["WM", "WestMidlands", "West-Midlands"],
214+
}
215+
166216
const fillWithModuleHeading = (container, module, pending) => {
167217
container.innerText = "";
168218
const link = document.createElement("a");
@@ -172,6 +222,14 @@ const fillWithModuleHeading = (container, module, pending) => {
172222
container.append(link, text);
173223
}
174224

225+
const makeRegionOption = (label, value) => {
226+
const option = document.createElement("option");
227+
option.textContent = label;
228+
option.value = value;
229+
option.selected = state.region_filter === value;
230+
return option;
231+
}
232+
175233
onLoad();
176234

177235
document.querySelector("#reviewer-filter").addEventListener("keyup", (event) => {

org-cyf-theme/layouts/_default/needs-review.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<div id="overview" class="c-pr-overview"></div>
99

1010
<label for="reviewer-filter" class="is-invisible">Filter by reviewer</label><input id="reviewer-filter" name="reviewer-filter" list="known-reviewers" placeholder="Filter by reviewer" size="10" style="width: unset; margin-bottom: 1em;" /><datalist id="known-reviewers"></datalist>
11+
<label for="region-filter" class="is-invisible">Filter by region</label><select id="region-filter" name="region-filter" style="width: unset; margin-bottom: 1em; font: inherit; padding: 0.25em 0.5em; border: 1px solid #ccc; border-radius: 4px; background: white; height: 2em;"></select>
1112

1213
<div id="pr-list">Loading...</div>
1314

0 commit comments

Comments
 (0)