feat: adminMode — чек-бокс переключения админского интерфейса

Шаг 1: /toggle-admin роут в ui/routes/auth.js
  - переключает req.session.adminMode
  - canAdmin = isAdmin || clientId === WZ01112 (временно)

Шаг 2: resolveUser в ui/index.js
  - req.user.adminMode из req.session.adminMode
  - isAdmin = IAM.isAdmin || clientId === WZ01112 (временно)

Шаг 3: adminMode вместо isAdmin в интерфейсе
  - ui/routes/entries.js: adminMode решает админский view
  - ui/routes/admin.js: requireAdmin проверяет adminMode

Шаг 4: views/index.ejs
  - чек-бокс «Администратор» (виден только если isAdmin)
  - ссылки Аудит/Лимиты видны только при adminMode
  - селектор компаний — при adminMode
This commit is contained in:
2026-06-11 11:08:03 +04:00
parent 8c1787df19
commit 4f1f64dd6c
6 changed files with 35 additions and 9 deletions
+12 -4
View File
@@ -157,9 +157,17 @@
</svg>
<span>|</span>
<span style="font-weight:500;color:var(--text);">Белые списки IP v<%= appVersion %></span>
<!-- Кнопки правой части header: admin-ссылки + выход -->
<!-- Кнопки правой части header: admin-ссылки + чекбокс + выход -->
<span style="margin-left:auto;display:flex;gap:.5rem;align-items:center;">
<% if (isAdmin) { %>
<% if (typeof isAdmin !== 'undefined' && isAdmin) { %>
<form method="POST" action="/toggle-admin" style="display:inline;font-size:.8rem;color:var(--muted);padding:.2rem .6rem;border:1px solid var(--border);border-radius:5px;background:#fff;">
<label>
<input type="checkbox" onchange="this.form.submit()" <%= adminMode ? 'checked' : '' %>>
Администратор
</label>
</form>
<% } %>
<% if (typeof adminMode !== 'undefined' && adminMode) { %>
<a href="/audit" style="font-size:.8rem;color:var(--muted);text-decoration:none;padding:.2rem .6rem;border:1px solid var(--border);border-radius:5px;background:#fff;">Аудит</a>
<a href="/admin" style="font-size:.8rem;color:var(--muted);text-decoration:none;padding:.2rem .6rem;border:1px solid var(--border);border-radius:5px;background:#fff;">Лимиты</a>
<% } %>
@@ -179,8 +187,8 @@
const companyPk = selectedCompany ? selectedCompany.id : null;
%>
<!-- Переключатель компании — для администратора -->
<% if (isAdmin && companies) { %>
<!-- Переключатель компании — для администратора в режиме admin -->
<% if (adminMode && companies) { %>
<div class="card">
<div class="card-body" style="padding:.75rem 1rem;">
<form method="GET" action="/" style="display:flex;align-items:center;gap:1rem;flex-wrap:wrap;">