// admin.js — admin user management page let resetTargetId = null; let deleteTargetId = null; let currentAdminId = null; document.addEventListener('DOMContentLoaded', async () => { if (!Auth.requireAuth()) return; await Auth.renderNav(); const user = Auth.getUser(); if (!user || !user.is_admin) { window.location.href = '/dashboard.html'; return; } currentAdminId = user.id; await loadUsers(); }); async function loadUsers() { try { const users = await API.admin.listUsers(); renderUsers(users); } catch (err) { showMsg(err.message, 'error'); } } function renderUsers(users) { const tbody = document.getElementById('users-body'); if (!users.length) { tbody.innerHTML = 'No users found.'; return; } tbody.innerHTML = users.map(u => { const isSelf = u.id === currentAdminId; const name = escHtml(u.display_name || u.email); const roleLabel = u.is_admin ? 'Admin' : 'User'; const statusLabel = u.is_disabled ? 'Disabled' : 'Active'; const joined = new Date(u.created_at).toLocaleDateString(); const toggleBtn = u.is_disabled ? `` : ``; const impersonateBtn = !isSelf ? `` : ''; const deleteBtn = !isSelf ? `` : ''; return ` ${name} ${escHtml(u.email)} ${roleLabel} ${statusLabel} ${joined} ${toggleBtn} ${impersonateBtn} ${deleteBtn} `; }).join(''); } function showResetModal(id, name) { resetTargetId = id; document.getElementById('reset-username').textContent = name; document.getElementById('reset-password').value = ''; document.getElementById('reset-msg').innerHTML = ''; document.getElementById('reset-modal').style.display = 'flex'; document.getElementById('reset-password').focus(); } function hideResetModal() { document.getElementById('reset-modal').style.display = 'none'; resetTargetId = null; } async function submitReset() { const password = document.getElementById('reset-password').value; const msgEl = document.getElementById('reset-msg'); if (password.length < 8) { msgEl.innerHTML = '
Password must be at least 8 characters.
'; return; } try { await API.admin.resetPassword(resetTargetId, { new_password: password }); msgEl.innerHTML = '
Password reset successfully.
'; setTimeout(hideResetModal, 1200); } catch (err) { msgEl.innerHTML = `
${escHtml(err.message)}
`; } } async function toggleUser(id, disable) { try { if (disable) await API.admin.disable(id); else await API.admin.enable(id); await loadUsers(); } catch (err) { showMsg(err.message, 'error'); } } async function impersonateUser(id) { try { const data = await API.admin.impersonate(id); Auth.saveToken(data.access_token); const user = await API.users.me(); Auth.saveUser(user); window.location.href = '/dashboard.html'; } catch (err) { showMsg(err.message, 'error'); } } function showDeleteModal(id, name) { deleteTargetId = id; document.getElementById('delete-username').textContent = name; document.getElementById('delete-modal').style.display = 'flex'; } function hideDeleteModal() { document.getElementById('delete-modal').style.display = 'none'; deleteTargetId = null; } async function submitDelete() { try { await API.admin.delete(deleteTargetId); hideDeleteModal(); showMsg('User deleted.', 'success'); await loadUsers(); } catch (err) { hideDeleteModal(); showMsg(err.message, 'error'); } } function showMsg(text, type) { const el = document.getElementById('msg'); if (!el) return; const cls = type === 'success' ? 'alert-success' : 'alert-error'; el.innerHTML = `
${escHtml(text)}
`; if (type === 'success') setTimeout(() => { el.innerHTML = ''; }, 3000); } document.addEventListener('click', (e) => { if (e.target.id === 'reset-modal') hideResetModal(); if (e.target.id === 'delete-modal') hideDeleteModal(); });