felt/static/admin.js

104 lines
No EOL
2.6 KiB
JavaScript

let adminToken = null;
const adminWrapper = document.getElementById("adminWrapper");
const adminZone = document.getElementById("adminZone");
const createTableForm = document.getElementById("createTableForm");
const newTableName = document.getElementById("newTableName");
const newTablePass = document.getElementById("newTablePass");
async function getTables() {
try {
const headers = new Headers();
headers.set('Authorization', 'Bearer ' + adminToken.access_token);
const res = await fetch('/admin/api/table/', {
method: 'GET',
headers: headers
});
if (res.ok) {
const tableList = await res.json();
let tableListHTML = "<ul>\n";
for (const t of tableList) {
tableListHTML += `<li><a href="#">${t.Name}</a></li>\n`
}
tableListHTML += "</ul>"
adminZone.innerHTML = tableListHTML;
} else {
if (res.status == 404) {
return;
}
setErr(await res.headers.get("Quartzgun-Error"));
}
} catch {
}
}
async function doLogin() {
const adminUsrInput = document.getElementById("input_admin_usr");
const adminPassInput = document.getElementById("input_admin_pass");
if (adminUsrInput && adminPassInput) {
adminToken = await getAdminToken(adminUsrInput.value, adminPassInput.value);
if (adminToken) {
adminWrapper.style.display="block";
getTables();
} else {
setErr("Incorrect credentials");
}
}
}
async function getAdminToken(user, pass) {
const headers = new Headers();
headers.set('Authorization', 'Basic ' + btoa(user + ":" + pass));
try {
const res = await fetch('/admin/api/auth/', {
method: 'POST',
headers: headers
});
if (res.ok) {
return await res.json();
}
return null;
} catch (err) {
return null;
}
}
function setTableCreateFormVisible(v) {
if (createTableForm) {
createTableForm.style.display = v ? "block" : "none";
}
if (!v) {
if (newTableName) {
newTableName.value = "";
}
if (newTablePass) {
newTablePass.value = "";
}
}
}
async function createTable() {
const headers = new Headers();
headers.set('Authorization', 'Bearer ' + adminToken.access_token);
const formData = new FormData();
formData.set("name", newTableName.value);
formData.set("passcode", newTablePass.value);
let bodyStr = "{";
for (const pair of formData.entries()) {
bodyStr += `"${pair[0]}": "${pair[1]}",`;
}
bodyStr = bodyStr.slice(0, -1);
bodyStr += "}";
const res = await fetch('/admin/api/table/', {
method: 'POST',
headers: headers,
body: bodyStr,
});
if (res.ok) {
getTables();
setTableCreateFormVisible(false);
}
}