feat(dashboard): «Активность» в нижний ряд + удалён остаток «Теории»

- Блок «Активность» (heatmap + календарь) вынесен из 3-й колонки в
  отдельный нижний ряд .bottom-grid рядом с «Мои сдачи» и «Испытания».
- Удалён остаток разметки «Теория — в процессе» и разметка рейтинга
  (lb-section) с дашборда; конфиг виджетов обновлён (Активность вместо
  Теории/Рейтинга).
- Селектор скрытия для учителя и адаптив обновлены под .bottom-grid.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-31 11:39:54 +03:00
parent 5a93751ccc
commit edfa799d9c
+45 -62
View File
@@ -148,6 +148,15 @@
margin-bottom: 22px;
}
.full-row { margin-bottom: 22px; }
/* Bottom row: Activity · My submissions · Challenges side by side */
.bottom-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 22px;
margin-bottom: 22px;
align-items: start;
}
.bottom-grid > * { margin-bottom: 0; }
.qa-btn {
display: flex; align-items: center; gap: 8px;
@@ -1602,31 +1611,6 @@
</div>
<div id="fcw-body"></div>
</div>
<!-- Combined Activity Widget (heatmap + streak calendar) -->
<div id="w-activity" style="display:none">
<div class="w-head">
<div class="w-title">Активность</div>
<div class="act-tabs">
<button class="act-tab active" onclick="switchActTab('heatmap',this)">Карта</button>
<button class="act-tab" onclick="switchActTab('calendar',this)">Месяц</button>
</div>
</div>
<!-- Pane 1: Heatmap -->
<div class="act-pane visible" id="act-heatmap-pane">
<div style="display:flex;justify-content:flex-end;margin-bottom:6px">
<div class="act-scale-btns" id="hm-scale-btns">
<button class="act-scale-btn" onclick="setHmScale(6,this)"></button>
<button class="act-scale-btn active" onclick="setHmScale(12,this)">12н</button>
<button class="act-scale-btn" onclick="setHmScale(26,this)"></button>
</div>
</div>
<div id="activity-heatmap"></div>
</div>
<!-- Pane 2: Streak calendar -->
<div class="act-pane" id="act-cal-pane">
<div id="streak-cal-body"></div>
</div>
</div>
<!-- Day popup (floating) -->
<div class="hm-day-popup" id="hm-day-popup" style="display:none"></div>
<!-- Subject progress bars -->
@@ -1645,42 +1629,50 @@
</div>
</div>
<!-- My submissions compact widget (student only) -->
<div class="full-row" id="w-my-subs" style="display:none">
<div class="widget">
<!-- ZONE 4: Bottom row — Activity · My submissions · Challenges -->
<div class="bottom-grid">
<!-- Combined Activity Widget (heatmap + streak calendar) -->
<div class="widget" id="w-activity" style="display:none">
<div class="w-head">
<div class="w-title">Активность</div>
<div class="act-tabs">
<button class="act-tab active" onclick="switchActTab('heatmap',this)">Карта</button>
<button class="act-tab" onclick="switchActTab('calendar',this)">Месяц</button>
</div>
</div>
<!-- Pane 1: Heatmap -->
<div class="act-pane visible" id="act-heatmap-pane">
<div style="display:flex;justify-content:flex-end;margin-bottom:6px">
<div class="act-scale-btns" id="hm-scale-btns">
<button class="act-scale-btn" onclick="setHmScale(6,this)"></button>
<button class="act-scale-btn active" onclick="setHmScale(12,this)">12н</button>
<button class="act-scale-btn" onclick="setHmScale(26,this)"></button>
</div>
</div>
<div id="activity-heatmap"></div>
</div>
<!-- Pane 2: Streak calendar -->
<div class="act-pane" id="act-cal-pane">
<div id="streak-cal-body"></div>
</div>
</div>
<!-- My submissions compact widget (student only) -->
<div class="widget" id="w-my-subs" style="display:none">
<div class="w-head">
<div class="w-title">Мои сдачи</div>
<a class="ae-btn-submit" href="/homework" style="text-decoration:none">Загрузить работу</a>
</div>
<div class="my-subs-list" id="my-subs-list"></div>
</div>
</div>
<!-- Leaderboard (students only) -->
<div class="full-row" id="lb-section" style="display:none">
<div class="lb-widget">
<div class="lb-head">
<div class="lb-title" id="lb-title">Рейтинг</div>
<div style="display:flex;gap:8px;align-items:center">
<select class="lb-class-sel" id="lb-class-sel" onchange="loadLeaderboard()">
<option value="">Все</option>
</select>
<div class="lb-tabs">
<button class="lb-tab active" onclick="setLbPeriod('week',this)">Неделя</button>
<button class="lb-tab" onclick="setLbPeriod('all',this)">Всё время</button>
</div>
</div>
</div>
<div class="lb-list" id="lb-list"></div>
</div>
</div>
<!-- Challenges (students only) -->
<div class="full-row" id="ch-section" style="display:none">
<div class="widget ch-widget">
<!-- Challenges (students only) -->
<div class="widget ch-widget" id="ch-section" style="display:none">
<div class="w-head"><div class="w-title" id="ch-title">Испытания недели</div></div>
<div class="ch-list" id="ch-list"></div>
</div>
</div>
<!-- Statistics Charts (students only) -->
@@ -1710,14 +1702,6 @@
</div>
</div>
<!-- Full width: Theory -->
<div class="full-row">
<div class="widget" id="w-theory-progress" style="display:none">
<div class="w-head"><div class="w-title">Теория — в процессе</div></div>
<div id="theory-progress-grid" class="theory-courses-grid"></div>
</div>
</div>
<!-- Full width: Full history (hidden) -->
<div class="full-row">
<div class="widget" id="w-full-history" style="display:none">
@@ -1779,7 +1763,7 @@
document.getElementById('dh-greeting').innerHTML = `${gr}, <span>${esc(user?.name?.split(' ')[0] || 'Администратор')}</span>`;
document.getElementById('dh-sub').textContent = user?.role === 'admin' ? 'Панель администратора' : 'Панель учителя';
// teacher/admin: hide student-only widgets, show admin compact layout
document.querySelectorAll('.action-zone,.main-grid,#w-theory-progress,.full-row').forEach(el => { if (el) el.style.display = 'none'; });
document.querySelectorAll('.action-zone,.main-grid,.bottom-grid,.full-row').forEach(el => { if (el) el.style.display = 'none'; });
if (isAdmin) {
// admin: full command center (redesign) instead of compact layout
const dh = document.querySelector('.dash-header'); if (dh) dh.style.display = 'none';
@@ -4002,11 +3986,10 @@
/* ── Dashboard widget visibility ──────────────────────────────────── */
const _DASH_WIDGETS = [
{ id: 'lb-section', label: 'Рейтинг' },
{ id: 'ch-section', label: 'Испытания недели' },
{ id: 'stats-section', label: 'Статистика' },
{ id: 'w-my-subs', label: 'Мои сдачи' },
{ id: 'w-theory-progress',label: 'Теория' },
{ id: 'w-activity', label: 'Активность' },
];
async function applyDashboardPrefs() {