@@ -49,7 +49,14 @@ section: Extend:Update Sites
49
49
<div id =" controls " >
50
50
<div class =" grid " >
51
51
<label class =" heading " >Update Site:</label >
52
- <select id =" site " onchange =" updateChart ()" ></select >
52
+ <div class =" widgets " >
53
+ <select id="sort" onchange="updateSiteList()">
54
+ <option value="alpha">Sort: A-Z</option>
55
+ <option value="ips">Sort: Most Used</option>
56
+ <option value="date">Sort: Newest</option>
57
+ </select>
58
+ <select id="site" onchange="updateChart()"></select>
59
+ </div >
53
60
54
61
<label class =" heading " >Compare To:</label >
55
62
<div class =" widgets " >
@@ -106,6 +113,79 @@ section: Extend:Update Sites
106
113
return { site, op, site2, timeWindow, countType, rollingAverage };
107
114
}
108
115
116
+ function updateSiteList () {
117
+ const sortMode = document .getElementById (' sort' ).value ;
118
+ const siteSelect = document .getElementById (' site' );
119
+ const site2Select = document .getElementById (' site2' );
120
+
121
+ // Remember current selections
122
+ const currentSite = siteSelect .value ;
123
+ const currentSite2 = site2Select .value ;
124
+
125
+ // Sort sites according to selected mode
126
+ let sortedSites = [... window .availableSites ];
127
+
128
+ switch (sortMode) {
129
+ case ' alpha' :
130
+ sortedSites .sort ();
131
+ break ;
132
+ case ' ips' :
133
+ sortedSites .sort ((a , b ) => {
134
+ const ipsA = window .sitesMetadata [a]? .total_unique_ips || 0 ;
135
+ const ipsB = window .sitesMetadata [b]? .total_unique_ips || 0 ;
136
+ return ipsB - ipsA; // Descending
137
+ });
138
+ break ;
139
+ case ' date' :
140
+ sortedSites .sort ((a , b ) => {
141
+ const dateA = window .sitesMetadata [a]? .date_range ? .start || ' 00000000' ;
142
+ const dateB = window .sitesMetadata [b]? .date_range ? .start || ' 00000000' ;
143
+ return dateB .localeCompare (dateA); // Newest first
144
+ });
145
+ break ;
146
+ }
147
+
148
+ // Clear and repopulate dropdowns
149
+ siteSelect .innerHTML = ' ' ;
150
+ site2Select .innerHTML = ' ' ;
151
+
152
+ for (const siteName of sortedSites) {
153
+ const siteOption = new Option ();
154
+ const site2Option = new Option ();
155
+ siteOption .value = site2Option .value = siteName;
156
+
157
+ // Add metadata to option text if available
158
+ const metadata = window .sitesMetadata [siteName];
159
+ if (metadata && metadata .total_unique_ips ) {
160
+ siteOption .innerHTML = site2Option .innerHTML =
161
+ ` ${ siteName} (${ metadata .total_unique_ips .toLocaleString ()} )` ;
162
+ } else {
163
+ siteOption .innerHTML = site2Option .innerHTML = siteName;
164
+ }
165
+
166
+ siteSelect .appendChild (siteOption);
167
+ site2Select .appendChild (site2Option);
168
+ }
169
+
170
+ // Restore selections if possible
171
+ if (sortedSites .includes (currentSite)) {
172
+ siteSelect .value = currentSite;
173
+ } else if (sortedSites .length > 0 ) {
174
+ siteSelect .selectedIndex = 0 ;
175
+ }
176
+
177
+ if (sortedSites .includes (currentSite2)) {
178
+ site2Select .value = currentSite2;
179
+ } else if (sortedSites .includes (' Java-8' )) {
180
+ site2Select .value = ' Java-8' ;
181
+ } else if (sortedSites .length > 1 ) {
182
+ site2Select .selectedIndex = 1 ;
183
+ }
184
+
185
+ // Update chart with new selection
186
+ updateChart ();
187
+ }
188
+
109
189
function updateCompareMode () {
110
190
const op = document .getElementById (' op' ).value ;
111
191
const site2Select = document .getElementById (' site2' );
@@ -432,30 +512,22 @@ section: Extend:Update Sites
432
512
const sitesData = await response .json ();
433
513
window .sitesMetadata = sitesData;
434
514
435
- // Extract site names and sort them
436
- window .availableSites = Object .keys (sitesData). sort () ;
515
+ // Extract site names (will be sorted by updateSiteList)
516
+ window .availableSites = Object .keys (sitesData);
437
517
438
- // Add sites as options to dropdown list
518
+ // Set default selections
439
519
const siteSelect = document .getElementById (' site' );
440
520
const site2Select = document .getElementById (' site2' );
441
- for (const siteName of window .availableSites ) {
442
- const siteOption = new Option ();
443
- const site2Option = new Option ();
444
- siteOption .value = site2Option .value = siteName;
445
-
446
- // Add metadata to option text if available
447
- const metadata = sitesData[siteName];
448
- if (metadata && metadata .total_unique_ips ) {
449
- siteOption .innerHTML = site2Option .innerHTML =
450
- ` ${ siteName} (${ metadata .total_unique_ips .toLocaleString ()} )` ;
451
- } else {
452
- siteOption .innerHTML = site2Option .innerHTML = siteName;
453
- }
454
521
455
- if (siteName === ' Fiji' ) siteOption .selected = true ;
456
- else if (siteName === ' Java-8' ) site2Option .selected = true ;
457
- siteSelect .appendChild (siteOption);
458
- site2Select .appendChild (site2Option);
522
+ // Populate and sort site lists
523
+ updateSiteList ();
524
+
525
+ // Set initial selections after population
526
+ if (window .availableSites .includes (' Fiji' )) {
527
+ siteSelect .value = ' Fiji' ;
528
+ }
529
+ if (window .availableSites .includes (' Java-8' )) {
530
+ site2Select .value = ' Java-8' ;
459
531
}
460
532
461
533
// Initialize compare mode state and chart
@@ -466,18 +538,21 @@ section: Extend:Update Sites
466
538
console .error (' Failed to initialize page:' , error);
467
539
// Fallback to hardcoded list if sites.json fails
468
540
window .availableSites = [' Java-8' , ' Fiji' ];
541
+ window .sitesMetadata = {}; // Empty metadata for fallback
542
+
469
543
const siteSelect = document .getElementById (' site' );
470
544
const site2Select = document .getElementById (' site2' );
471
- for ( const siteName of window . availableSites ) {
472
- const siteOption = new Option ();
473
- const site2Option = new Option ();
474
- siteOption . value = site2Option . value =
475
- siteOption . innerHTML = site2Option . innerHTML = siteName;
476
- if (siteName === ' Fiji' ) siteOption . selected = true ;
477
- else if (siteName === ' Java-8 ' ) site2Option . selected = true ;
478
- siteSelect . appendChild (siteOption);
479
- site2Select .appendChild (site2Option) ;
545
+
546
+ updateSiteList ();
547
+
548
+ // Set fallback selections
549
+ if ( window . availableSites . includes ( ' Fiji ' )) {
550
+ siteSelect . value = ' Fiji' ;
551
+ }
552
+ if ( window . availableSites . includes ( ' Java-8 ' )) {
553
+ site2Select .value = ' Java-8 ' ;
480
554
}
555
+
481
556
updateCompareMode ();
482
557
updateChart ();
483
558
}
0 commit comments