main.js (2045B)
1 import * as dev from "/lib/dev.js" 2 3 main() 4 5 function main() { 6 let f = document.getElementById("settings") 7 8 9 for (let k in dev.settings) { 10 f.append(makeLabel(dev.settings[k])) 11 f.append(makeInput(dev.settings[k])) 12 f.append(makeDescription(dev.settings[k])) 13 f.append(document.createElement("br")) 14 } 15 let inputs = document.querySelectorAll("#settings > input") 16 17 let reset = f.appendChild(document.createElement("input")) 18 reset.type = "button" 19 reset.value = "Restore" 20 reset.setAttribute("title", "Restore default settings") 21 reset.addEventListener("click", function(ev) { 22 inputs.forEach(function(i) { 23 if (dev.settings[i.id].type === "bool") { 24 i.checked = false 25 } else if (dev.settings[i.id].type === "string") { 26 i.value = "" 27 } else { 28 throw new Error("Invalid type") 29 } 30 dev.setting(i.id, null) 31 }) 32 }) 33 } 34 35 function makeLabel(setting) { 36 let l = document.createElement("label") 37 38 l.append(document.createTextNode(setting.name + ": ")) 39 l.setAttribute("for", setting.key) 40 l.setAttribute("title", setting.brief) 41 42 return l 43 } 44 45 function makeInput(setting) { 46 let c = document.createElement("input") 47 let i = c 48 49 i.id = setting.key 50 i.setAttribute("title", setting.brief) 51 let v = dev.setting(setting.key) 52 if (setting.type === "bool") { 53 i.type = "checkbox" 54 if (v) { 55 i.setAttribute("checked", true) 56 } 57 } else if (setting.type === "string") { 58 i.value = v 59 } else { 60 throw new Error("Invalid type") 61 } 62 63 i.addEventListener("change", inputChangeHandler) 64 65 return c 66 } 67 68 function makeDescription(setting) { 69 let l = document.createElement("label") 70 71 l.classList.add("description") 72 l.setAttribute("for", setting.key) 73 l.append(document.createTextNode(setting.description ?? setting.brief)) 74 75 return l 76 } 77 78 function inputChangeHandler(ev) { 79 console.log("inputChangeHandler", ev.target.id, ev.target.value) 80 try { 81 dev.setting(ev.target.id, dev.settings[ev.target.id].type === "bool" ? ev.target.checked : ev.target.value) 82 } 83 catch(err) { 84 ev.target.setCustomValidity(err) 85 ev.target.reportValidity() 86 } 87 }