fix(lab): значок «связанной симуляции» на карточках учебников не скрывался при выключенной лаборатории

В каталоге учебников (textbooks.html) у карточек есть кнопка .tb-lab-btn «открыть
связанную симуляцию» (openLabSim → /lab?sim=…). Это <button onclick>, а не <a href="/lab">,
поэтому kill-switch `[href="/lab"]` её не ловил, и значок-колба оставался при отключённой
«Лаборатории».

Фикс: добавил `.tb-lab-btn` в FEATURE_WIDGETS.lab → api.js скрывает её через инъекцию
при lab=false (работает и без ls.css). Плюс страховка в openLabSim: при lab=false не
открываем (тост «Лаборатория отключена»); админ — всегда (admin-override).

Verified vm-смоук на реальном api.js 4/4 (lab off → .tb-lab-btn скрыта; lab on → нет;
admin → ничего). node --check api.js + инлайн textbooks.html.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-23 23:36:11 +03:00
parent 8027d9fda0
commit 40df8893cc
2 changed files with 13 additions and 1 deletions
+9
View File
@@ -479,6 +479,15 @@
/* Фаза 5: открыть связанную симуляцию из карточки учебника (не уходя в учебник). */
function openLabSim(simId, ev) {
if (ev) ev.stopPropagation();
// Страховка: если «Лаборатория» отключена — не открываем (кнопка и так скрыта
// kill-switch'ем). Админ имеет доступ всегда (admin-override).
try {
const u = LS.getUser && LS.getUser();
if (!(u && u.role === 'admin')) {
const f = JSON.parse(localStorage.getItem('ls_feat_cache') || 'null');
if (f && f.lab === false) { if (LS.toast) LS.toast('Лаборатория отключена', 'warn'); return; }
}
} catch (e) { /* нет кэша — открываем как раньше */ }
location.href = '/lab?sim=' + encodeURIComponent(simId);
}
window.openLabSim = openLabSim;
+4 -1
View File
@@ -866,7 +866,10 @@ const FEATURE_HREFS = {
матчит, поэтому прячем по СТАБИЛЬНОМУ id #hc-lab (аналогично pet/чтение). */
const FEATURE_WIDGETS = {
flashcards: ['#w-flashcard'],
lab: ['#hc-lab'],
// #hc-lab — hero-карточка дашборда; .tb-lab-btn — кнопка «открыть связанную
// симуляцию» на карточках каталога учебников (openLabSim → /lab?sim=…). Это
// <button onclick>, а не <a href="/lab">, поэтому [href="/lab"] её не ловит.
lab: ['#hc-lab', '.tb-lab-btn'],
pet: ['#hc-pet'],
textbooks: ['#hc-read'],
};