diff --git a/backend/src/permissions/registry.js b/backend/src/permissions/registry.js index df36290..8ccde6f 100644 --- a/backend/src/permissions/registry.js +++ b/backend/src/permissions/registry.js @@ -31,6 +31,7 @@ const PERMISSIONS = { role: 'teacher', roles: ['teacher'], default: 0, label: 'Управление вопросами', desc: 'Создавать, редактировать и копировать вопросы в банке', + requireConfirmOff: true, }, 'questions.delete': { role: 'teacher', roles: ['teacher'], default: 0, @@ -46,6 +47,7 @@ const PERMISSIONS = { role: 'teacher', roles: ['teacher'], default: 1, label: 'Сброс попыток', desc: 'Сбрасывать прохождение теста ученика в своём классе', + requireConfirmOff: true, }, 'results.export': { role: 'teacher', roles: ['teacher'], default: 1, @@ -56,11 +58,13 @@ const PERMISSIONS = { role: 'teacher', roles: ['teacher'], default: 1, label: 'Управление классами', desc: 'Создавать, редактировать и удалять свои классы', + requireConfirmOff: true, }, 'library.upload': { role: 'teacher', roles: ['teacher'], default: 1, label: 'Загрузка файлов', desc: 'Загружать файлы в библиотеку', + requireConfirmOff: true, }, 'library.folders': { role: 'teacher', roles: ['teacher'], default: 1, @@ -91,6 +95,7 @@ const PERMISSIONS = { role: 'teacher', roles: ['teacher'], default: 1, label: 'Управление курсами', desc: 'Создавать и редактировать теоретические курсы и уроки', + requireConfirmOff: true, }, 'courses.interactive': { role: 'teacher', roles: ['teacher'], default: 1, @@ -138,11 +143,13 @@ const PERMISSIONS = { role: 'student', roles: ['student', 'free_student'], default: 1, label: 'Доступ к теории', desc: 'Просматривать теоретические курсы и уроки', + requireConfirmOff: true, }, 'simulations.access': { role: 'student', roles: ['student', 'free_student'], default: 1, label: 'Доступ к симуляциям', desc: 'Открывать лабораторию с физическими, химическими и биологическими симуляциями', + requireConfirmOff: true, }, 'simulations.quiz': { role: 'student', roles: ['student', 'free_student'], default: 1, @@ -171,7 +178,7 @@ function listKeys() { function byRole(role) { return Object.entries(PERMISSIONS) .filter(([, v]) => v.role === role) - .map(([key, v]) => ({ key, role: v.role, default: v.default, label: v.label, desc: v.desc })); + .map(([key, v]) => ({ key, role: v.role, default: v.default, label: v.label, desc: v.desc, requireConfirmOff: !!v.requireConfirmOff })); } /** diff --git a/frontend/admin.html b/frontend/admin.html index 816e69b..b82a23a 100644 --- a/frontend/admin.html +++ b/frontend/admin.html @@ -261,6 +261,12 @@ .perm-toggle input:checked ~ .perm-track { background: var(--green, #06d6a0); } .perm-toggle input:checked ~ .perm-thumb { transform: translateX(20px); } .perm-toggle input:focus-visible ~ .perm-track { outline: 2px solid var(--violet); } + /* dot shown when a role-level perm differs from its registry default */ + .perm-modified-dot { + display: inline-block; width: 8px; height: 8px; border-radius: 50%; + background: var(--amber, #FFB347); flex-shrink: 0; + vertical-align: middle; margin-left: 6px; + } /* toolbar */ .t-toolbar { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 24px; } @@ -1223,6 +1229,12 @@
Настройте, что могут делать учителя и ученики. Администраторы имеют все права всегда.
+Индивидуальные настройки переопределяют права роли для этого учителя.
+Индивидуальные настройки переопределяют права роли для этого пользователя.