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 = `
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 = '| Set | '; data.users.forEach((u) => { html += `${escapeHtml(u.username)} | `; }); html += '
|---|---|
| ${escapeHtml(s.name)} | `; data.users.forEach((u) => { const role = roleMap[s.id]?.[u.id] || ''; const selectId = `perm-${s.id}-${u.id}`; html += ``; }); html += ' |
No deleted items.
'; return; } el.innerHTML = `