diff --git a/deploy/nginx/rustadmin.conf b/deploy/nginx/rustadmin.conf index 665f0c2..4474e94 100644 --- a/deploy/nginx/rustadmin.conf +++ b/deploy/nginx/rustadmin.conf @@ -33,18 +33,6 @@ server { proxy_set_header X-Forwarded-Proto $scheme; } - location = /superuser { - return 302 /superuser/; - } - - location = /superuser/ { - try_files /superuser/ui/index.html =404; - } - - location /superuser/ { - try_files $uri $uri/ /superuser/ui/index.html; - } - location / { try_files $uri /index.html; } diff --git a/frontend/assets/app.js b/frontend/assets/app.js index faacfc1..daaf722 100644 --- a/frontend/assets/app.js +++ b/frontend/assets/app.js @@ -119,12 +119,9 @@ lastUpdate: 'Last update timestamp' }; - const superuserUi = Boolean(typeof window !== 'undefined' && window.SUPERUSER_MODE); - const defaultPanel = superuserUi - ? 'admin' - : (typeof window !== 'undefined' && window.DEFAULT_PANEL) - ? String(window.DEFAULT_PANEL) - : 'dashboard'; + const defaultPanel = (typeof window !== 'undefined' && window.DEFAULT_PANEL) + ? String(window.DEFAULT_PANEL) + : 'dashboard'; const state = { API: '', TOKEN: localStorage.getItem('token') || '', @@ -159,7 +156,6 @@ selectedUserId: null, loading: false }, - superuserUi }; let adminUserFilter = ''; const loginUsername = $('#username'); @@ -4794,12 +4790,11 @@ } function applyPermissionGates() { - const adminOnlyMode = state.superuserUi === true; - const canManageServers = adminOnlyMode ? false : hasGlobalPermission('manageServers'); - const canManageUsers = adminOnlyMode ? false : hasGlobalPermission('manageUsers'); - const canManageRoles = adminOnlyMode ? false : hasGlobalPermission('manageRoles'); - const canAccessTeam = adminOnlyMode ? false : (canManageUsers || canManageRoles); - const canAccessLinked = adminOnlyMode ? false : canAccessTeam; + const canManageServers = hasGlobalPermission('manageServers'); + const canManageUsers = hasGlobalPermission('manageUsers'); + const canManageRoles = hasGlobalPermission('manageRoles'); + const canAccessTeam = canManageUsers || canManageRoles; + const canAccessLinked = canAccessTeam; const canAccessAdminPanel = isSuperuser() && hasGlobalPermission('manageUsers'); if (addServerPrompt) { addServerPrompt.classList.toggle('hidden', !canManageServers); @@ -4897,19 +4892,14 @@ } function switchPanel(panel = 'dashboard') { - const adminOnlyMode = state.superuserUi === true; const superuser = isSuperuser(); - const canAccessTeam = adminOnlyMode ? false : (hasGlobalPermission('manageUsers') || hasGlobalPermission('manageRoles')); - const canAccessLinked = adminOnlyMode ? false : canAccessTeam; - const canAccessAdmin = adminOnlyMode ? superuser : (superuser && hasGlobalPermission('manageUsers')); - const canAccessDiscord = adminOnlyMode ? false : canManageTeamDiscord(); + const canAccessTeam = hasGlobalPermission('manageUsers') || hasGlobalPermission('manageRoles'); + const canAccessLinked = canAccessTeam; + const canAccessAdmin = superuser && hasGlobalPermission('manageUsers'); + const canAccessDiscord = canManageTeamDiscord(); const canAccessSettings = Boolean(state.currentUser); - const fallbackPanel = adminOnlyMode - ? (canAccessAdmin ? 'admin' : (canAccessSettings ? 'settings' : 'dashboard')) - : 'dashboard'; - let nextPanel = adminOnlyMode - ? (panel === 'settings' ? 'settings' : 'admin') - : panel; + const fallbackPanel = 'dashboard'; + let nextPanel = panel; if ( (nextPanel === 'team' && !canAccessTeam) || (nextPanel === 'discord' && !canAccessDiscord) @@ -6712,12 +6702,6 @@ } async function refreshServers() { - if (state.superuserUi) { - if (serversEl) serversEl.innerHTML = ''; - if (serversEmpty) serversEmpty.classList.add('hidden'); - hideAddServerCard({ force: true }); - return; - } try { const list = await api('/servers'); syncServerPermissions(list); @@ -7439,7 +7423,7 @@ if (user.superuser) { const badge = document.createElement('span'); badge.className = 'badge strong'; - badge.textContent = 'Superuser'; + badge.textContent = 'Global admin'; trailing.appendChild(badge); } const chevron = document.createElement('span'); @@ -7607,7 +7591,7 @@ const roleChanged = !!role && role !== user.role; const superuserChanged = Boolean(desiredSuperuser) !== Boolean(user.superuser); if (!roleChanged && !superuserChanged) { - showNotice(adminUserRoleStatus, 'Select a different role or superuser state before updating.', 'error'); + showNotice(adminUserRoleStatus, 'Select a different role or global admin state before updating.', 'error'); return; } try { @@ -8223,9 +8207,8 @@ } function toggleUserCard() { - const adminOnlyMode = state.superuserUi === true; - const canUsers = adminOnlyMode ? false : hasGlobalPermission('manageUsers'); - const canRoles = adminOnlyMode ? false : hasGlobalPermission('manageRoles'); + const canUsers = hasGlobalPermission('manageUsers'); + const canRoles = hasGlobalPermission('manageRoles'); if (canUsers || canRoles) { userCard.classList.remove('hidden'); if (canUsers) { @@ -8865,22 +8848,14 @@ } function updateTeamAccessView({ refreshUsers = false, refreshAdmin = false } = {}) { - const adminOnlyMode = state.superuserUi === true; const superuser = isSuperuser(); - const canUsers = adminOnlyMode ? false : hasGlobalPermission('manageUsers'); - const canRoles = adminOnlyMode ? false : hasGlobalPermission('manageRoles'); - const canAccessTeam = adminOnlyMode ? false : (canUsers || canRoles); - const canManageDiscord = adminOnlyMode ? false : canManageTeamDiscord(); - const canAccessLinked = adminOnlyMode ? false : (canUsers || canRoles); + const canUsers = hasGlobalPermission('manageUsers'); + const canRoles = hasGlobalPermission('manageRoles'); + const canAccessTeam = canUsers || canRoles; + const canManageDiscord = canManageTeamDiscord(); + const canAccessLinked = canUsers || canRoles; const canAccessAdmin = superuser && hasGlobalPermission('manageUsers'); - if (navDashboard) { - navDashboard.classList.toggle('hidden', adminOnlyMode); - navDashboard.setAttribute('aria-hidden', adminOnlyMode ? 'true' : 'false'); - navDashboard.disabled = adminOnlyMode; - if (adminOnlyMode) navDashboard.classList.remove('active'); - } - if (navTeam) { navTeam.classList.toggle('hidden', !canAccessTeam); navTeam.setAttribute('aria-hidden', canAccessTeam ? 'false' : 'true'); @@ -8909,11 +8884,6 @@ if (!canAccessAdmin) navAdmin.classList.remove('active'); } - if (teamSwitcher && adminOnlyMode) { - teamSwitcher.classList.add('hidden'); - teamSwitcher.setAttribute('aria-hidden', 'true'); - } - if (!canAccessTeam) { if (teamPanel) teamPanel.classList.add('hidden'); if (state.activePanel === 'team') switchPanel('dashboard'); @@ -9482,10 +9452,6 @@ }); navAdmin?.addEventListener('click', () => { if (navAdmin.disabled) return; - if (!state.superuserUi) { - window.location.href = '/superuser/ui/'; - return; - } hideWorkspace('nav'); switchPanel('admin'); closeProfileMenu(); diff --git a/frontend/assets/styles.css b/frontend/assets/styles.css index d482209..568bd87 100644 --- a/frontend/assets/styles.css +++ b/frontend/assets/styles.css @@ -1010,35 +1010,6 @@ label.inline input[type="checkbox"]:focus-visible, .team-section-head h4 { font-size: 1.15rem; } .team-section-head p { margin: 0; } -.superuser-ui { - background: radial-gradient(420px 320px at 10% 10%, rgba(59, 130, 246, 0.16), transparent 70%), - radial-gradient(520px 400px at 80% 0%, rgba(248, 113, 113, 0.16), transparent 70%), - #0e1118; -} - -.mode-pill { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 6px 10px; - border-radius: 999px; - font-size: 0.9rem; - font-weight: 700; - letter-spacing: 0.01em; - color: #e0f2fe; - background: linear-gradient(120deg, rgba(59, 130, 246, 0.2), rgba(45, 212, 191, 0.16)); - border: 1px solid rgba(124, 221, 252, 0.35); - box-shadow: 0 12px 28px rgba(14, 165, 233, 0.18); - width: fit-content; -} - -.mode-pill.subtle { - color: #c7d2fe; - background: rgba(148, 163, 184, 0.12); - border-color: rgba(148, 163, 184, 0.32); - box-shadow: none; -} - .global-admin { display: flex; flex-direction: column; gap: 24px; } .global-admin-head { display: flex; justify-content: space-between; gap: 18px; align-items: flex-start; flex-wrap: wrap; } @@ -1095,28 +1066,6 @@ label.inline input[type="checkbox"]:focus-visible, gap: 6px; } -.superuser-guide { - display: grid; - grid-template-columns: 1.1fr 0.9fr; - gap: 18px; - padding: 16px 18px; - border-radius: var(--radius-md); - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(255, 255, 255, 0.06); - box-shadow: inset 0 0 0 1px rgba(45, 212, 191, 0.14); - align-items: center; -} - -.superuser-checklist { - display: grid; - gap: 10px; - padding-left: 18px; - margin: 0; - color: #e5e7eb; -} - -.superuser-checklist li { line-height: 1.4; } - .admin-stat-card h3 { font-size: 1.8rem; } .admin-teams { gap: 14px; } diff --git a/frontend/index.html b/frontend/index.html index 7060c8f..cde7459 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -367,7 +367,7 @@

Discord authentication