feat(access): вид «по классу», массовые действия, бейджи состояния + чистка orphan-правил

По итогам ревью системы прав:
- админка: переключатель режимов «По контенту» / «По классу»
- кнопки «Открыть всем классам» / «Закрыть у всех» (и зеркально по классу)
- бейджи N/M (сколько классов открыто) в списке контента
- эндпоинты /api/access/summary и /api/access/class/:id
- вкладка «Доступ к учебникам» перенесена к «Права доступа» (группа Пользователи)
- чистка content_access при удалении класса/ученика (нет FK)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 12:47:05 +03:00
parent 5dc9164ee3
commit 76df3b4594
6 changed files with 306 additions and 99 deletions
+5 -18
View File
@@ -956,9 +956,6 @@
<button class="admin-nav-item" data-tab="topics" onclick="switchTab(this)">
<i data-lucide="list-tree" style="width:15px;height:15px"></i> Темы
</button>
<button class="admin-nav-item" data-tab="access" onclick="switchTab(this)">
<i data-lucide="book-lock" style="width:15px;height:15px"></i> Доступ к учебникам
</button>
</div>
</div>
@@ -974,6 +971,9 @@
<button class="admin-nav-item" data-tab="permissions" onclick="switchTab(this)" id="btn-tab-permissions" style="display:none">
<i data-lucide="shield" style="width:15px;height:15px"></i> Права доступа
</button>
<button class="admin-nav-item" data-tab="access" onclick="switchTab(this)">
<i data-lucide="book-lock" style="width:15px;height:15px"></i> Доступ к учебникам
</button>
<button class="admin-nav-item" data-tab="avatars" onclick="switchTab(this);loadAvatarRequests()">
<i data-lucide="image" style="width:15px;height:15px"></i> Аватары
<span class="admin-badge" id="av-badge" style="display:none"></span>
@@ -1515,25 +1515,12 @@
<!-- ── Доступ к учебникам / экзаменам ── -->
<div class="tab-pane" id="tab-access">
<div class="section-title">Доступ к учебникам и экзаменам</div>
<p style="color:var(--muted);font-size:13px;margin:4px 0 16px;max-width:720px">
<p style="color:var(--muted);font-size:13px;margin:4px 0 16px;max-width:760px">
По умолчанию доступ <b>закрыт</b>. Откройте учебник или экзамен-модуль нужным классам.
Внутри класса можно сделать точечное исключение для отдельного ученика —
индивидуальное правило важнее правила класса.
</p>
<div class="acc-layout" style="display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap">
<div class="acc-list adm-panel" style="flex:0 0 280px;max-width:320px;padding:10px">
<div class="acc-list-head" style="font-weight:600;font-size:13px;color:var(--text-3);padding:6px 8px">Учебники</div>
<div id="acc-textbooks"></div>
<div class="acc-list-head" style="font-weight:600;font-size:13px;color:var(--text-3);padding:12px 8px 6px">Экзамены</div>
<div id="acc-exams"></div>
</div>
<div class="acc-detail adm-panel" style="flex:1;min-width:340px;padding:18px">
<div id="acc-detail-empty" style="color:var(--muted);font-size:14px">
Выберите учебник или экзамен слева, чтобы настроить доступ.
</div>
<div id="acc-detail" style="display:none"></div>
</div>
</div>
<div id="acc-root"></div>
</div>
<!-- ── Рассылка ── -->