Slon/Http/AdminServer: Implement Manage>Instance

This commit is contained in:
Alec Murphy 2025-02-24 15:00:24 -05:00
parent c44f5b482e
commit 4b7e5b2836
2 changed files with 55 additions and 5 deletions

View file

@ -324,6 +324,10 @@ U0 @slon_admin_server_get(SlonHttpSession* session)
@slon_admin_manage_accounts(session);
return;
}
if (!StrICmp("/manage/instance", session->path())) {
session->send(db->o("instance"));
return;
}
if (!StrICmp("/", session->path())) {
@slon_http_send_html_file(session, "M:/Slon/Static/html/admin/main.html");
@ -357,7 +361,7 @@ U0 @slon_admin_server_post(SlonHttpSession* session)
@slon_http_parse_request_as_json(session);
}
if (!StrICmp("/setup/instance", session->path())) {
if (!StrICmp("/setup/instance", session->path()) || !StrICmp("/save/instance", session->path())) {
@slon_admin_setup_instance(session);
return;
}

View file

@ -93,6 +93,30 @@
setContent(html);
setActiveLink("accounts");
}
async function manageInstance() {
clearActiveLinks();
const request = new Request("/manage/instance");
const response = await fetch(request);
const instance = await response.json();
let html = "<h4 class=\"title is-4\">Instance</h4><div class=spacer></div>";
html += "<form action=\"javascript:saveInstance()\"><div>";
html += "<div class=\"section is-inline-block\" style=\"width:420px;vertical-align:top\">";
html += "<label class=label>URI</label><div class=control><input id=uri class=input placeholder=my-slon-instance.foo required autocomplete=off value=\"" + instance["uri"] + "\"></div><div class=spacer></div>";
html += "<label class=label>Title</label><div class=control><input id=title class=input placeholder=\"My Slon Instance\" required autocomplete=off value=\"" + instance["title"] + "\"></div><div class=spacer></div>";
html += "<label class=label>Description</label><div class=control><input id=description class=input placeholder=\"A fediverse instance running on TempleOS\" required autocomplete=off value=\"" + instance["description"] + "\"></div><div class=spacer></div>";
html += "<label class=label>Email</label><div class=control><input id=email class=input type=email placeholder=\"alec@checksum.fail\" required autocomplete=off value=\"" + instance["email"] + "\"></div><div class=spacer></div>";
html += "<label class=label>Enable Registrations</label><div class=control><input id=registrations type=checkbox" + (instance["registrations"] ? " checked" : "") + "></div><div class=spacer></div>";
html += "</div>";
html += "</div>";
html += "<div class=\"control next\"><input class=\"button is-link\" type=submit value=Save></div>"
html += "</div></form>";
setContent(html);
setActiveLink("instance");
}
async function confirmDeleteUser(user, id) {
if (confirm("Are you sure you want to delete '" + user + "' ?")) {
const request = new Request("/delete/account?id=" + id);
@ -158,6 +182,28 @@
alert(JSON.stringify(json));
}
}
async function saveInstance() {
let data = {};
let fields = document.getElementsByTagName("input");
for (var i = 0; i < fields.length; i++) {
switch (fields[i].type) {
case "checkbox":
data[fields[i].id] = fields[i].checked;
break;
case "submit":
break;
default:
data[fields[i].id] = fields[i].value;
break;
}
}
const request = new Request("/save/instance", {
headers: { "Content-Type": "application/json" },
method: "POST",
body: JSON.stringify(data)
});
const response = await fetch(request);
}
function updateBase64(el) {
let reader = new FileReader();
reader.readAsDataURL(el.files[0]);