Files
BetterDesk/web-nodejs/views/permissions.ejs
T
UNITRONIX a710580b7a Add RBAC permissions UI and server handlers
Implement RBAC Phase 52: add server-side role & permission handlers and wire API routes, plus frontend UI, styles and translations.

Server: new role_handlers.go exposing endpoints to list roles, get effective role permissions, list/set/delete role permission overrides; routes registered in server.go with permission checks (PermUserView / PermServerConfig). Protects super-admin defaults and validates inputs.

Frontend (management & web UI): add permissions page assets (CSS, JS, view), add i18n strings for en/pl/zh, update sidebar to filter items by canView, show user role badge in topbar and empty access-denied state when no permission. Add role badges styling in users.css and small UX/i18n improvements in organizationDetail.js.

Also several route and service adjustments to support the new permissions UI. This change introduces RBAC UI/API plumbing for managing role-based permissions and overrides.
2026-04-11 00:47:08 +02:00

86 lines
3.5 KiB
HTML

<%- include('layouts/main', {
title: _('permissions.title'),
pageStyles: ['permissions'],
pageScripts: ['permissions'],
currentPage: 'permissions',
breadcrumb: [{ label: _('permissions.title') }],
body: `
<div class="permissions-page">
<!-- Header -->
<div class="page-header">
<div class="page-title">
<h1>${_('permissions.title')}</h1>
</div>
<p class="page-subtitle">${_('permissions.subtitle')}</p>
</div>
<!-- Info Card -->
<div class="permissions-info-card">
<span class="material-icons">info</span>
<div class="info-content">
<strong>${_('permissions.info_title')}</strong>
<p>${_('permissions.info_desc')}</p>
</div>
</div>
<!-- Role Selector -->
<div class="permissions-toolbar">
<div class="toolbar-left">
<div class="role-selector">
<label>${_('permissions.select_role')}</label>
<select id="role-select">
<option value="" disabled selected>${_('permissions.select_role_placeholder')}</option>
</select>
</div>
</div>
<div class="toolbar-right">
<button class="btn btn-secondary" id="btn-reset-overrides" disabled>
<span class="material-icons">restart_alt</span>
${_('permissions.reset_overrides')}
</button>
</div>
</div>
<!-- Role Info Banner -->
<div class="role-info-banner hidden" id="role-info-banner">
<div class="role-info-left">
<span class="material-icons role-info-icon" id="role-info-icon">shield</span>
<div>
<div class="role-info-name" id="role-info-name"></div>
<div class="role-info-level" id="role-info-level"></div>
</div>
</div>
<div class="role-info-right">
<div class="role-info-stat">
<span class="stat-num" id="role-perm-count">0</span>
<span class="stat-label">${_('permissions.granted')}</span>
</div>
<div class="role-info-stat">
<span class="stat-num" id="role-override-count">0</span>
<span class="stat-label">${_('permissions.overrides')}</span>
</div>
</div>
</div>
<!-- Permissions Matrix -->
<div class="permissions-matrix hidden" id="permissions-matrix">
<!-- Categories rendered by JS -->
</div>
<!-- Empty State -->
<div class="permissions-empty" id="permissions-empty">
<span class="material-icons">admin_panel_settings</span>
<h3>${_('permissions.empty_title')}</h3>
<p>${_('permissions.empty_desc')}</p>
</div>
<!-- Super Admin Notice -->
<div class="permissions-locked hidden" id="permissions-locked">
<span class="material-icons">lock</span>
<h3>${_('permissions.locked_title')}</h3>
<p>${_('permissions.locked_desc')}</p>
</div>
</div>
`
}) %>