Skip to content

Commit 079bc0b

Browse files
committed
Added the missing js file for real this time
1 parent 42c9e07 commit 079bc0b

File tree

2 files changed

+184
-1
lines changed

2 files changed

+184
-1
lines changed

common/build.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
/* This file is generated by git */
2-
#define BUILD "634"
2+
#define BUILD "635"

webui/modal.js

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
2+
3+
/**
4+
* A class for creating a modal window
5+
*/
6+
class Modal {
7+
constructor(width, height, title, okText, cancelText, okFunc) {
8+
if (Modal._instance)
9+
throw 'Only one instance of this class can exist at once';
10+
Modal._instance = this;
11+
this.main = this.create('div', null, {
12+
'position': 'absolute',
13+
'top': '0',
14+
'bottom': '0',
15+
'left': '0',
16+
'right': '0',
17+
});
18+
this.overlay = this.create('div', null, {
19+
'position': 'absolute',
20+
'top': '0',
21+
'bottom': '0',
22+
'left': '0',
23+
'right': '0',
24+
'background-color': 'black',
25+
'opacity': '0.5'
26+
});
27+
this.overlay.click(() => { this.close(); });
28+
document.body.append(this.main);
29+
this.main.append(this.overlay);
30+
let dialogOffset = (this.overlay.offsetHeight - height) / 2;
31+
this.dialog = this.create('div', null, {
32+
'padding': '0.2em',
33+
'outline': '1px solid black',
34+
'font-weight': 'bold',
35+
'text-align': 'center',
36+
'background-color': 'white',
37+
'margin': 'auto',
38+
'position': 'relative',
39+
'margin-top': dialogOffset + 'px',
40+
'width': width + 'px',
41+
'height': height + 'px',
42+
'z-index': '3'
43+
});
44+
this.main.prepend(this.dialog);
45+
if (title) {
46+
let heading = this.create('h3', title);
47+
this.dialog.append(heading);
48+
}
49+
let canceler = this.create('div', null, {
50+
'position': 'absolute',
51+
'bottom': '0.5em',
52+
'right': '1em',
53+
});
54+
this.dialog.append(canceler);
55+
if (okText) {
56+
let okButton = this.create('button', okText)
57+
okButton.click(okFunc);
58+
canceler.append(okButton);
59+
}
60+
if (cancelText) {
61+
let cancelButton = this.create('button', cancelText)
62+
cancelButton.click(evt => {
63+
this.close();
64+
});
65+
canceler.append(cancelButton);
66+
}
67+
}
68+
69+
/**
70+
* Creates a new HTML element
71+
*
72+
* @param element The element type (e.g. div, span, etc)
73+
* @param text Text to be inserted into the element. Pass null/undefined
74+
* to leave the element empty
75+
* @param style An object containing any additional style attributes to be
76+
* added to the object
77+
*/
78+
create(element, text, style) {
79+
let el = document.createElement(element);
80+
if (text)
81+
el.innerText = text
82+
if (style) {
83+
for (let key in style)
84+
el.style.setProperty(key, style[key]);
85+
}
86+
return el;
87+
}
88+
close() {
89+
this.main.remove();
90+
Modal._instance = null;
91+
}
92+
}
93+
94+
/**
95+
* Creates a modal for loading & storing flags
96+
*/
97+
class FlagsModal extends Modal {
98+
constructor() {
99+
super(400, 300, 'Presets', null, 'Cancel');
100+
let builtinPresets = {
101+
'Standard': 'IVIAAVCAKACAAAAAAAAAAEAA',
102+
'Fast Standard': 'IVIAAVCAKACFAAAAAAAAAIAA',
103+
'Easy Standard': 'IVIAAVCFKACACQAAAAAAAZAA',
104+
'Tiebreaker': 'IVKQAVCEKEAFKRIAAAAAAYAA',
105+
}
106+
this.dialog.append(this.create('div', 'Save', {
107+
'font-weight': 'normal',
108+
'margin-bottom': '0.5em',
109+
}));
110+
let saver = this.create('div');
111+
let nameBox = this.create('input');
112+
nameBox.placeholder = 'Preset Name';
113+
nameBox.setAttribute('maxlength', '50');
114+
saver.append(nameBox);
115+
let saveButton = this.create('button', 'Save current');
116+
saver.append(saveButton)
117+
this.dialog.append(saver);
118+
this.dialog.append(saver)
119+
let flagSelect = this.create('select');
120+
for (let [key,value] of Object.entries(builtinPresets)) {
121+
let opt = this.create('option', key)
122+
opt.value = value
123+
flagSelect.append(opt);
124+
}
125+
this.dialog.append(this.create('div', 'Load/Delete', {
126+
'font-weight': 'normal',
127+
'margin-top': '2em',
128+
'margin-bottom': '0.5em',
129+
}));
130+
let loader = this.create('div');
131+
let storedPresets = localStorage.getItem('storedPresets');
132+
if (storedPresets) {
133+
storedPresets = JSON.parse(storedPresets);
134+
for (let [key,value] of Object.entries(storedPresets)) {
135+
let opt = this.create('option', key)
136+
opt.value = value
137+
flagSelect.append(opt);
138+
}
139+
} else {
140+
storedPresets = {};
141+
}
142+
loader.append(flagSelect)
143+
let loadButton = this.create('button', 'Load preset', {
144+
'margin-left': '1em',
145+
});
146+
let deleteButton = this.create('button', 'Delete Preset', {
147+
'margin-left': '1em',
148+
});
149+
loader.append(this.create('br'));
150+
loader.append(this.create('br'));
151+
loader.append(loadButton)
152+
loader.append(deleteButton)
153+
this.dialog.append(loader)
154+
// init events
155+
saveButton.click(evt => {
156+
if (nameBox.value) {
157+
storedPresets[nameBox.value] = Interface.getFlags()
158+
localStorage.setItem('storedPresets',
159+
JSON.stringify(storedPresets));
160+
this.close()
161+
}
162+
});
163+
loadButton.click(evt => {
164+
Interface.setFlags(flagSelect.value)
165+
this.close();
166+
});
167+
deleteButton.click(evt => {
168+
let option = flagSelect.selectedOptions[0]
169+
delete storedPresets[option.innerText];
170+
localStorage.setItem('storedPresets',
171+
JSON.stringify(storedPresets));
172+
option.remove();
173+
});
174+
deleteButton.disabled = 'true';
175+
flagSelect.change(function() {
176+
if (this.selectedIndex < Object.keys(builtinPresets).length) {
177+
deleteButton.disabled = 'true';
178+
} else {
179+
deleteButton.disabled = undefined;
180+
}
181+
});
182+
}
183+
}

0 commit comments

Comments
 (0)