www.spaceplanner.app

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

commit 99e5567ec51330edb7ae57aeb17f32996a0a34ac
parent f44740fa95485621a427db11cd6518027f8620b2
Author: Jacob R. Edwards <jacob@jacobedwards.org>
Date:   Mon,  5 Aug 2024 15:08:36 -0700

Add functional settings interface

Diffstat:
Mfiles/settings/index.html | 2++
Mfiles/settings/main.js | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/files/settings/index.html b/files/settings/index.html @@ -9,4 +9,6 @@ </head> <html> <h1>Settings</h1> + + <form id="settings"></form> </html> diff --git a/files/settings/main.js b/files/settings/main.js @@ -1,6 +1,94 @@ function init() { authorize() show_bar() + main() +} + +function main() { + errfunc = function(err) { set_error("Unable to get settings: " + err, document.querySelector("#settings")) } + api_fetch("GET", "settings") + .then(function(params) { + api_fetch("GET", "users/" + localStorage.getItem("username") + "/settings") + .then(function(current) { + show_settings(current, params) + }) + }) + .catch(errfunc) +} + +function show_settings(current, params) { + form = document.createElement("form") + form.id = "settings" + list = document.createElement("ul") + form.append(list) + for (name in params) { + id = name + "_setting" + item = document.createElement("li") + + label = document.createElement("label") + label.setAttribute("for", id) + + label.appendChild(document.createTextNode(name[0].toUpperCase() + name.substring(1) + " ")) + item.append(label) + + input = create_input(name, params[name], current[name]) + input.id = id + item.append(input) + + /* + *desc = document.createElement("label") + *desc.setAttribute("for", id) + *desc.append(document.createElement("br")) + *desc.appendChild(document.createTextNode(params[name].description)) + *item.append(desc) + */ + + list.append(item) + } + + submit = document.createElement("input") + submit.value = "Update" + submit.type = "submit" + form.append(submit) + + form.onsubmit = function () { return update_settings(current, params) } + + current_form = document.querySelector("#settings") + current_form.replaceWith(form) +} + +function update_settings(current, params) { + settings = Array.from(document.querySelectorAll("form#settings > ul > li > input")) + patch = [] + for (name in settings) { + newvalue = settings[name].value + if (params.default && newvalue == params.default) + continue + oldvalue = current[name] + if (oldvalue && newvalue == oldvalue) + continue + patch.push({ op: "add", path: settings[name].name, value: newvalue }) + } + + api_fetch("PATCH", "users/" + localStorage.getItem("username") + "/settings", patch) + .catch(function(err) { set_error("Unable to update settings: " + err) }) + return false +} + +function create_input(name, setting, current_value) { + input = document.createElement("input") + if (setting.type == "string") { + input.type = "text" + } else { + throw new Error("Unexpected setting type") + } + + input.name = name + if (current_value) { + input.value = current_value + } + + return input } window.onload = init