Add a basic GUI with database upload and basic state handling

This commit is contained in:
chylex 2016-10-24 19:54:06 +02:00
parent 66070febcc
commit 3a4da84c55

View File

@ -1 +1,109 @@
/* gui.js */
var GUI = (function(){
var controller;
var root = {
showController: function(){
controller = {};
// styles
controller.styles = DOM.createStyle([
".app, .connecting { bottom: 48px !important; }",
"#dht-ctrl { position: absolute; bottom: 0; width: 100%; height: 48px; background-color: #fff; }",
"#dht-ctrl button { height: 32px; margin: 8px 0 8px 8px; font-size: 18px; padding: 0 12px; background-color: #adf; }",
"#dht-ctrl button:disabled { background-color: #d0d0d0; cursor: default; }",
"#dht-ctrl p { display: inline-block; margin: 14px 12px; }",
"#dht-ctrl input { display: none; }"
]);
// main
controller.ele = DOM.createElement("div", document.body);
controller.ele.id = "dht-ctrl";
controller.ele.innerHTML = [
"<button id='dht-ctrl-upload'>Upload Previous File</button>",
"<button id='dht-ctrl-track'>Start Tracking</button>",
"<button id='dht-ctrl-download'>Download</button>",
"<button id='dht-ctrl-reset'>Reset</button>",
"<p id='dht-ctrl-status'></p>",
"<input id='dht-ctrl-upload-input' type='file' multiple>"
].join("");
// elements
controller.ui = {
btnUpload: DOM.id("dht-ctrl-upload"),
btnToggleTracking: DOM.id("dht-ctrl-track"),
btnDownload: DOM.id("dht-ctrl-download"),
btnReset: DOM.id("dht-ctrl-reset"),
textStatus: DOM.id("dht-ctrl-status"),
inputUpload: DOM.id("dht-ctrl-upload-input")
};
// events
controller.ui.btnUpload.addEventListener("click", () => {
controller.ui.inputUpload.click();
});
controller.ui.btnToggleTracking.addEventListener("click", () => {
STATE.toggleTracking();
});
controller.ui.btnDownload.addEventListener("click", () => {
STATE.downloadSavefile();
});
controller.ui.btnReset.addEventListener("click", () => {
STATE.resetState();
});
controller.ui.inputUpload.addEventListener("change", () => {
for(var file of controller.ui.inputUpload.files){
var reader = new FileReader();
reader.onload = function(){
var obj = {};
try{
obj = JSON.parse(reader.result); // TODO check content validity
}catch(e){
alert("Could not parse '"+file.name+"', see console for details.");
console.error(e);
return;
}
if (SAVEFILE.isValid(obj)){
STATE.uploadSavefile(new SAVEFILE(obj));
}
else{
alert("File '"+file.name+"' has an invalid format.");
}
};
reader.readAsText(file, "UTF-8");
}
controller.ui.inputUpload.value = null;
});
STATE.onStateChanged(() => {
if (controller){
controller.ui.btnDownload.disabled = controller.ui.btnReset.disabled = !STATE.hasSavedData();
controller.ui.btnToggleTracking.innerHTML = STATE.isTracking() ? "Pause Tracking" : "Start Tracking";
}
}, true);
},
hideController: function(){
if (controller){
DOM.removeElement(controller.ele);
DOM.removeElement(controller.styles);
controller = null;
}
}
};
return root;
})();