@@ -429,9 +467,13 @@
if (!el) return;
renderSkeleton(el);
try {
- const data = await LS.adminGetOverview();
+ // Обзор + перенесённые из бывшей вкладки «Статистика» итоги за всё время.
+ const [data, stats] = await Promise.all([
+ LS.adminGetOverview(),
+ LS.adminGetStats().catch(() => null),
+ ]);
_lastLoadTs = Date.now();
- render(data);
+ render(data, stats);
startTsInterval();
} catch (e) {
LS.state.error(el, e, () => load());
diff --git a/frontend/js/admin/sections/stats.js b/frontend/js/admin/sections/stats.js
deleted file mode 100644
index 432a929..0000000
--- a/frontend/js/admin/sections/stats.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-/* admin → stats section */
-(function () {
- 'use strict';
- let inited = false;
-
- async function load() {
- try {
- const s = await LS.adminGetStats();
- document.getElementById('stats-grid').innerHTML = `
-
-
-
${s.totalUsers}
-
Пользователей
-
-
-
-
${s.totalTests}
-
Тестов пройдено
-
-
-
-
${s.avgScore ?? '—'}%
-
Средний результат
-
`;
- if (window.lucide) lucide.createIcons();
- const subjEl = document.getElementById('subj-stats');
- if (!s.bySubject?.length) { subjEl.innerHTML = '
Нет данных
'; return; }
- subjEl.innerHTML = s.bySubject.map(b => {
- const pct = b.avg_pct ?? 0;
- const barColor = pct >= 75 ? 'var(--green)' : pct >= 50 ? 'var(--amber)' : 'var(--pink)';
- return `
-
${esc(b.name)}
${b.tests} тестов
-
-
${b.avg_pct ?? '—'}%
-
-
-
`;
- }).join('');
- } catch (e) {
- LS.state.error(document.getElementById('stats-grid'), e, load);
- }
- }
-
- window.AdminSections = window.AdminSections || {};
- window.AdminSections.stats = {
- init: async () => { if (inited) return; inited = true; await load(); },
- reload: load,
- };
-})();