-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathiframe.selectArena.js
More file actions
106 lines (106 loc) · 3.63 KB
/
iframe.selectArena.js
File metadata and controls
106 lines (106 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
'use strict'
function a(){
console.log('// TODO: Fix height of iframe or scroll of parent when this takes two rows on small screen.');
let _arenas = [];
let _preSelectedArena = '';
let sourceWindow = undefined;
let arenaList = document.getElementById('arena');
let arenaFilter = document.getElementById('arena-filter');
let inputSortByStars = document.getElementById('sort-by-stars');
arenaFilter.addEventListener('change', getArenas);
arenaList.onchange = event => {
let option;
switch(event.target.tagName){
case 'OPTION':
option = event.target;
break;
case 'SELECT':
if(event.target.selectedOptions.length){
option = event.target.selectedOptions[0];
}
break;
}
if(option){
let json = JSON.parse(option.dataset.json);
document.getElementById('link-arena').href = json.html_url;
let github_logo = document.getElementById('GitHub-logo');
github_logo.style.height = 0;
sourceWindow.postMessage({type: 'arena-changed', value: {option: json, settings: {sortByStars: inputSortByStars.checked, height: document.documentElement.offsetHeight}}});
github_logo.style.height = document.documentElement.offsetHeight+'px';
}
}
window.onmessage = messageEvent => {
switch(messageEvent.data.type){
case 'get-arenas':
if(sourceWindow === undefined){
sourceWindow = messageEvent.source;
}
_preSelectedArena = messageEvent.data.value.preSelectedArena;
getArenas();
break;
case 'add-arena':
addArena_local(messageEvent.data.value);
break;
}
}
function addArena_local(json){
let option = document.createElement('option');
option.classList.add('local');
option.innerHTML = json.name;
option.dataset.json = JSON.stringify(json);
arenaList.appendChild(option);
Array.from(arenaList.options).forEach(option => {
if(option.selected){
option.selected = false;
}
});
option.selected = true;
arenaList.onchange({target: option});
}
function getArenas(){
[...arenaList.getElementsByTagName('option')].filter(o => !o.classList.contains('local')).forEach(o => arenaList.removeChild(o));
GitHubApi.fetchArenas().then(arenas => {
_arenas = arenas;
filterPreviews();
});
}
function filterPreviews(){
let preSelected = undefined;
let options = [...arenaFilter.selectedOptions].flatMap(selectedOption => selectedOption.value);
_arenas.filter(arena => arena.version).forEach(arena => {
if(options.includes('all') || (arena.official && options.includes('official')) || (!arena.official && options.includes('community'))){
let cssStar = getComputedStyle(document.documentElement).getPropertyValue('--github-stars').trim();
cssStar = cssStar.substring(1,cssStar.length-1);
let option = document.createElement('option');
if(_preSelectedArena === arena.full_name){
preSelected = option;
}
option.innerHTML = arena.name + ' ' + cssStar + arena.stars;
option.dataset.json = JSON.stringify(arena);
arenaList.appendChild(option);
}
});
sortOptions(arenaList);
if(preSelected){
arenaList.options[0].selected = false;
preSelected.selected = true;
arenaList.onchange({target: preSelected});
}else{
arenaList.onchange({target: arenaList.options[0]});
}
}
function sortOptions(selectElement){
function value(option){
return inputSortByStars.checked ? JSON.parse(option.dataset.json).stars : option.value;
}
let options = [...selectElement.options];
options.sort(function(a, b){
if(a.classList.contains('local') ? true : value(a) < value(b)){return -1;}
if(b.classList.contains('local') ? true : value(b) < value(a)){return 1;}
return 0;
});
for(let option of options){
selectElement.add(option);
}
}
}