From 914bd7cd6aa14e839332a98d91c30b19865b0cf2 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 17 May 2026 15:25:52 +0300 Subject: Restructure repo: move Go server into player-server/ --- web/js/admin.js | 168 -------------------------------------------------------- 1 file changed, 168 deletions(-) delete mode 100644 web/js/admin.js (limited to 'web/js/admin.js') diff --git a/web/js/admin.js b/web/js/admin.js deleted file mode 100644 index ac43643..0000000 --- a/web/js/admin.js +++ /dev/null @@ -1,168 +0,0 @@ -import { API } from './api.js'; -import { escapeHtml, toast } from './utils.js'; -import { triggerRescan } from './views/admin-status.js'; - -export function initAdmin() { - const btn = document.getElementById('admin-toggle'); - const modal = document.getElementById('admin-modal'); - const closeBtn = document.getElementById('admin-close'); - const rescanBtn = document.getElementById('admin-rescan'); - const trashBtn = document.getElementById('admin-trash'); - const form = document.getElementById('admin-user-form'); - - btn?.addEventListener('click', () => { - modal?.classList.add('open'); - refreshAdmin(); - }); - closeBtn?.addEventListener('click', () => modal?.classList.remove('open')); - modal?.addEventListener('click', (e) => { if (e.target === modal) modal.classList.remove('open'); }); - - rescanBtn?.addEventListener('click', async () => { - rescanBtn.disabled = true; - try { await triggerRescan(); } - finally { rescanBtn.disabled = false; } - }); - - trashBtn?.addEventListener('click', async () => { - try { - const data = await API.trash(); - renderTrash(data); - } catch (err) { toast(err.message, 'error'); } - }); - - form?.addEventListener('submit', async (e) => { - e.preventDefault(); - const fd = new FormData(form); - const body = { - username: fd.get('username'), - password: fd.get('password'), - is_admin: !!fd.get('is_admin'), - }; - try { - await API.createUser(body); - form.reset(); - toast('User created'); - await refreshAdmin(); - } catch (err) { toast(err.message, 'error'); } - }); -} - -async function refreshAdmin() { - try { - const [users, perms] = await Promise.all([API.users(), API.permissions()]); - renderUsers(users); - renderPermissions(perms); - } catch (err) { toast(err.message, 'error'); } -} - -function renderUsers(users) { - const el = document.getElementById('admin-users'); - if (!el) return; - el.innerHTML = ``; - el.querySelectorAll('button[data-id]').forEach((b) => { - b.addEventListener('click', async () => { - try { - await API.deleteUser(b.dataset.id); - toast('User removed'); - await refreshAdmin(); - } catch (err) { - const msg = err.message || ''; - if (msg.toLowerCase().includes('cannot delete yourself') || msg.toLowerCase().includes('self-delete')) { - toast('You cannot delete yourself', 'error'); - } else { - toast(err.message, 'error'); - } - } - }); - }); -} - -function renderPermissions(data) { - const el = document.getElementById('admin-permissions'); - if (!el || !data) return; - if (!data.sets?.length || !data.users?.length) { - el.innerHTML = '

No sets or users to manage.

'; - return; - } - - // Build a lookup: setId -> userId -> role - const roleMap = {}; - data.permissions?.forEach((p) => { - if (!roleMap[p.set_id]) roleMap[p.set_id] = {}; - roleMap[p.set_id][p.user_id] = p.role; - }); - - let html = ''; - data.users.forEach((u) => { - html += ``; - }); - html += ''; - - data.sets.forEach((s) => { - html += ``; - data.users.forEach((u) => { - const role = roleMap[s.id]?.[u.id] || ''; - const selectId = `perm-${s.id}-${u.id}`; - html += ``; - }); - html += ''; - }); - - html += '
Set${escapeHtml(u.username)}
${escapeHtml(s.name)} - -
'; - el.innerHTML = html; - - el.querySelectorAll('.perm-select').forEach((sel) => { - sel.addEventListener('change', async () => { - const setId = sel.dataset.set; - const userId = sel.dataset.user; - const role = sel.value; - try { - if (role) { - await API.setPermissions({ set_id: parseInt(setId), user_id: parseInt(userId), role }); - toast('Permission granted'); - } else { - await API.delPermissions({ set_id: parseInt(setId), user_id: parseInt(userId) }); - toast('Permission revoked'); - } - } catch (err) { toast(err.message, 'error'); } - }); - }); -} - -function renderTrash(data) { - const el = document.getElementById('admin-users'); - if (!el || !Array.isArray(data)) return; - if (!data.length) { - el.innerHTML = '

Trash

No deleted items.

'; - return; - } - el.innerHTML = `

Trash

`; - - el.querySelectorAll('button[data-id]').forEach((b) => { - b.addEventListener('click', async () => { - try { - await API.restore(b.dataset.id); - toast('Item restored'); - const data = await API.trash(); - renderTrash(data); - } catch (err) { toast(err.message, 'error'); } - }); - }); -} -- cgit v1.2.3