fix: toggle now works — JSON response + immediate CSS flip

- /toggle-admin returns JSON {ok, adminMode} instead of redirect
- onclick: toggle CSS instantly, then fetch, then reload on ok
This commit is contained in:
2026-06-11 14:42:31 +04:00
parent f739754c3b
commit fa4d5646fa
3 changed files with 6 additions and 8 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ipwhitelist", "name": "ipwhitelist",
"version": "0.5.47", "version": "0.5.48",
"description": "IP WhiteList microservice for cloud provider", "description": "IP WhiteList microservice for cloud provider",
"main": "server.js", "main": "server.js",
"scripts": { "scripts": {
+1 -2
View File
@@ -176,8 +176,7 @@ function createRouter({ auth, MOCK_USERS, authLimiter }) {
if (!canAdmin) return res.status(403).send('Forbidden'); if (!canAdmin) return res.status(403).send('Forbidden');
req.session.adminMode = !req.session.adminMode; req.session.adminMode = !req.session.adminMode;
// Редирект туда же откуда пришли res.json({ ok: true, adminMode: req.session.adminMode });
res.redirect(req.get('Referer') || '/');
}); });
// GET /logout // GET /logout
+4 -5
View File
@@ -160,12 +160,11 @@
<!-- Кнопки правой части header: admin-ссылки + чекбокс + выход --> <!-- Кнопки правой части header: admin-ссылки + чекбокс + выход -->
<span style="margin-left:auto;display:flex;gap:.5rem;align-items:center;"> <span style="margin-left:auto;display:flex;gap:.5rem;align-items:center;">
<% if (typeof canAdminMode !== 'undefined' && canAdminMode) { %> <% if (typeof canAdminMode !== 'undefined' && canAdminMode) { %>
<span style="font-size:.8rem;color:var(--muted);display:flex;align-items:center;gap:.3rem;padding:.2rem .6rem;border:1px solid var(--border);border-radius:5px;background:#fff;cursor:pointer;" <span id="admin-toggle" style="font-size:.8rem;color:var(--muted);display:flex;align-items:center;gap:.3rem;padding:.2rem .6rem;border:1px solid var(--border);border-radius:5px;background:#fff;cursor:pointer;user-select:none;"
onclick="const t=this.querySelector('input');t.checked=!t.checked;fetch('/toggle-admin',{method:'POST'}).then(()=>location.reload())"> onclick="var bg=this.querySelector('.tg-bg'),kn=this.querySelector('.tg-knob');if(bg.style.background==='var(--blue)'||getComputedStyle(bg).background.includes('37,99,235')){bg.style.background='var(--border)';kn.style.left='2px';kn.style.right='auto'}else{bg.style.background='var(--blue)';kn.style.right='2px';kn.style.left='auto'};fetch('/toggle-admin',{method:'POST'}).then(r=>r.json()).then(d=>{if(d.ok)location.reload()})">
<label style="cursor:pointer;">Администратор</label> <label style="cursor:pointer;">Администратор</label>
<input type="checkbox" <%= adminMode ? 'checked' : '' %> style="display:none;"> <span class="tg-bg" style="position:relative;width:36px;height:20px;background:<%= adminMode ? 'var(--blue)' : 'var(--border)' %>;border-radius:10px;transition:background .2s;">
<span style="position:relative;width:36px;height:20px;background:<%= adminMode ? 'var(--blue)' : 'var(--border)' %>;border-radius:10px;transition:background .2s;"> <span class="tg-knob" style="position:absolute;top:2px;<%= adminMode ? 'right:2px;' : 'left:2px;' %>width:16px;height:16px;background:#fff;border-radius:50%;transition:all .2s;"></span>
<span style="position:absolute;top:2px;<%= adminMode ? 'right:2px;' : 'left:2px;' %>width:16px;height:16px;background:#fff;border-radius:50%;transition:all .2s;"></span>
</span> </span>
</span> </span>
<% } %> <% } %>