www.spaceplanner.app

Web client to the spaceplanner API
git clone git://jacobedwards.org/www.spaceplanner.app
Log | Files | Refs

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 }