fix(sidebar): прятать пустые группы (заголовок без видимых пунктов)
Когда все пункты группы сайдбара скрыты (фичи отключены / teacher-only у ученика), оставался висеть пустой заголовок-аккордеон (напр. «Практика и игры»). Добавлена hideEmptySidebarGroups(): по .sb-group проверяет computed-display пунктов .sb-link в теле и прячет группу, если ни одного видимого. Зовётся синхронно из sidebar.js после сборки (по кэш-CSS — без мигания) и в конце hideDisabledFeatures (по свежим данным; re-show при включении). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -887,6 +887,22 @@ try {
|
|||||||
if (_cachedFeats) _applyFeatureCss(_cachedFeats);
|
if (_cachedFeats) _applyFeatureCss(_cachedFeats);
|
||||||
} catch { /* нет кэша / приватный режим — просто ждём async */ }
|
} catch { /* нет кэша / приватный режим — просто ждём async */ }
|
||||||
|
|
||||||
|
/* Прячет группы сайдбара (.sb-group), у которых не осталось ни одного видимого пункта,
|
||||||
|
чтобы не висел пустой заголовок-аккордеон (напр. «Практика и игры», когда все
|
||||||
|
модули отключены). Зовётся после построения сайдбара и после hideDisabledFeatures. */
|
||||||
|
function hideEmptySidebarGroups() {
|
||||||
|
document.querySelectorAll('.sb-group').forEach(g => {
|
||||||
|
const body = g.querySelector('.sb-group-body');
|
||||||
|
if (!body) return;
|
||||||
|
let anyVisible = false;
|
||||||
|
body.querySelectorAll('.sb-link').forEach(it => {
|
||||||
|
const cs = getComputedStyle(it);
|
||||||
|
if (cs.display !== 'none' && cs.visibility !== 'hidden') anyVisible = true;
|
||||||
|
});
|
||||||
|
g.style.display = anyVisible ? '' : 'none';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show board sidebar link only for teachers/admins and students in a class.
|
* Show board sidebar link only for teachers/admins and students in a class.
|
||||||
* Call after LS.initPage(). Uses features cache (_no_class flag).
|
* Call after LS.initPage(). Uses features cache (_no_class flag).
|
||||||
@@ -925,6 +941,7 @@ async function hideDisabledFeatures() {
|
|||||||
document.querySelector('[onclick*="tab-account"]')?.click();
|
document.querySelector('[onclick*="tab-account"]')?.click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hideEmptySidebarGroups(); // после обновления видимости пунктов — спрятать пустые группы
|
||||||
|
|
||||||
// Exam-prep track links (/exam-prep/<key>): показываем только включённые
|
// Exam-prep track links (/exam-prep/<key>): показываем только включённые
|
||||||
// (exam_tracks.enabled) и доступные пользователю треки. /api/exam-prep/tracks
|
// (exam_tracks.enabled) и доступные пользователю треки. /api/exam-prep/tracks
|
||||||
@@ -1129,6 +1146,7 @@ window.LS = {
|
|||||||
loadFeatures,
|
loadFeatures,
|
||||||
clearFeaturesCache,
|
clearFeaturesCache,
|
||||||
hideDisabledFeatures,
|
hideDisabledFeatures,
|
||||||
|
hideEmptySidebarGroups,
|
||||||
showBoardIfAllowed,
|
showBoardIfAllowed,
|
||||||
biochemGetElements, biochemGetMolecules, biochemGetMolecule, biochemValidate, biochemAnalyze,
|
biochemGetElements, biochemGetMolecules, biochemGetMolecule, biochemValidate, biochemAnalyze,
|
||||||
biochemGetReactions, biochemGetChallenges, biochemSolveChallenge,
|
biochemGetReactions, biochemGetChallenges, biochemSolveChallenge,
|
||||||
|
|||||||
@@ -228,6 +228,9 @@
|
|||||||
LS.showBoardIfAllowed?.();
|
LS.showBoardIfAllowed?.();
|
||||||
LS.hideDisabledFeatures?.();
|
LS.hideDisabledFeatures?.();
|
||||||
LS.notif?.init?.();
|
LS.notif?.init?.();
|
||||||
|
// Синхронно по кэш-состоянию (CSS уже инъектнут до сборки) — прячем пустые
|
||||||
|
// группы сразу, без мигания; hideDisabledFeatures повторит после свежих данных.
|
||||||
|
LS.hideEmptySidebarGroups?.();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Глобальная плавающая кнопка «создать карточку» (на всех страницах с шапкой)
|
// Глобальная плавающая кнопка «создать карточку» (на всех страницах с шапкой)
|
||||||
|
|||||||
Reference in New Issue
Block a user