@@ -36,9 +36,14 @@ function computeStatusClass(awaitingReview) {
36
36
const state = {
37
37
"prs" : null ,
38
38
"reviewer_filter" : "" ,
39
+ "region_filter" : "" ,
39
40
}
40
41
41
42
async function onLoad ( ) {
43
+ const urlParams = new URLSearchParams ( window . location . search ) ;
44
+ const region = urlParams . get ( "region" ) ;
45
+ state . region_filter = region ;
46
+
42
47
render ( ) ;
43
48
state . prs = ( await fetchPrsWithoutLoadingReviews ( ) ) . filter ( ( pr ) => pr . status === "Needs Review" ) ;
44
49
render ( ) ;
@@ -47,6 +52,18 @@ async function onLoad() {
47
52
}
48
53
49
54
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
+
50
67
if ( state . prs === null ) {
51
68
document . querySelector ( "#pr-list" ) . innerText = "Loading..." ;
52
69
return ;
@@ -66,6 +83,9 @@ function render() {
66
83
}
67
84
68
85
for ( const pr of state . prs ) {
86
+ if ( state . region_filter && ! regionMatches ( state . region_filter , pr . title ) ) {
87
+ continue ;
88
+ }
69
89
for ( const review of pr . reviews ) {
70
90
if ( ! review . isPrAuthor ) {
71
91
reviewers . add ( review . userName ) ;
@@ -163,6 +183,36 @@ function render() {
163
183
}
164
184
}
165
185
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
+
166
216
const fillWithModuleHeading = ( container , module , pending ) => {
167
217
container . innerText = "" ;
168
218
const link = document . createElement ( "a" ) ;
@@ -172,6 +222,14 @@ const fillWithModuleHeading = (container, module, pending) => {
172
222
container . append ( link , text ) ;
173
223
}
174
224
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
+
175
233
onLoad ( ) ;
176
234
177
235
document . querySelector ( "#reviewer-filter" ) . addEventListener ( "keyup" , ( event ) => {
0 commit comments