From 3898080f0475c3bf5ab025e24444687c86c8f4e0 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Tue, 23 Jun 2026 16:59:51 +0300 Subject: [PATCH] =?UTF-8?q?fix(features):=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D0=B5=D0=B9=D0=B4=D0=B6-=D0=B3=D0=B5=D0=B9=D1=82=D1=8B?= =?UTF-8?q?=20=D1=83=D0=B2=D0=B0=D0=B6=D0=B0=D1=8E=D1=82=20admin-override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Причина бага «из админа конструктор симуляций редиректит на дашборд»: у sim-builder.html свой пейдж-гейт, который при feature_sim_builder=false уводил на /dashboard НЕЗАВИСИМО от роли (мой прошлый admin-override был только в hideDisabledFeatures, а этот гейт его не знал). Тот же недочёт нашёлся ещё у 3 страниц с собственным фича-редиректом (на /403): collection.html, knowledge-map.html, red-book.html. Во все 4 добавил обход для админа (админ управляет модулями → видит и открывает всё, даже отключённое) — согласно правилу admin-override. Поведение для ученика/учителя не изменилось. node --check инлайна всех 4 страниц — OK. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/collection.html | 2 +- frontend/knowledge-map.html | 2 +- frontend/red-book.html | 2 +- frontend/sim-builder.html | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/collection.html b/frontend/collection.html index 6a2610d..165676f 100644 --- a/frontend/collection.html +++ b/frontend/collection.html @@ -365,7 +365,7 @@ LS.sidebar?.init(); lucide.createIcons(); const feats = await LS.loadFeatures(); - if (feats.collection === false) { window.location.replace('/403'); return; } + if (feats.collection === false && user?.role !== 'admin') { window.location.replace('/403'); return; } LS.hideDisabledFeatures?.(); await loadCollection(); })(); diff --git a/frontend/knowledge-map.html b/frontend/knowledge-map.html index 1737cd8..ce54048 100644 --- a/frontend/knowledge-map.html +++ b/frontend/knowledge-map.html @@ -585,7 +585,7 @@ let _dashOffset = 0; // animated dash offset for link flow LS.notif.init(); lucide.createIcons(); const feats = await LS.loadFeatures(); - if (feats.knowledge_map === false) { window.location.replace('/403'); return; } + if (feats.knowledge_map === false && user?.role !== 'admin') { window.location.replace('/403'); return; } LS.hideDisabledFeatures?.(); document.querySelector('.sb-toggle')?.addEventListener('click', () => { diff --git a/frontend/red-book.html b/frontend/red-book.html index 3ed34ad..67477c7 100644 --- a/frontend/red-book.html +++ b/frontend/red-book.html @@ -792,7 +792,7 @@ const XP_MAP = { CR: 50, EN: 40, VU: 30, NT: 20, LC: 10 }; async function init() { lucide.createIcons(); const feats = await LS.loadFeatures().catch(() => ({})); - if (feats.red_book === false) { window.location.replace('/403'); return; } + if (feats.red_book === false && LS.getUser()?.role !== 'admin') { window.location.replace('/403'); return; } LS.hideDisabledFeatures?.(); // Auth (sidebar) diff --git a/frontend/sim-builder.html b/frontend/sim-builder.html index 71daaa4..5d6aaef 100644 --- a/frontend/sim-builder.html +++ b/frontend/sim-builder.html @@ -196,7 +196,8 @@ if (!(ip.isTeacher || ip.isAdmin)) { location.href = '/dashboard'; return; } // Фича-гейт: «Конструктор симуляций» можно отключить в админке (feature_sim_builder_enabled). - if (LS.loadFeatures) { + // Админ имеет доступ всегда (он управляет модулями) — для него гейт не срабатывает. + if (LS.loadFeatures && !ip.isAdmin) { LS.loadFeatures().then(function (feats) { if (feats && feats.sim_builder === false) { LS.toast && LS.toast('Конструктор симуляций отключён', 'warn'); location.href = '/dashboard'; } }).catch(function () {});