feat(admin): Phase 6 sub-commit 2 — remove .user-panel overlay

Now that the deep pages (sub-commit 1) work, retire the legacy
.user-panel inline overlay entirely.

* admin.html: removed <div class="user-panel" id="user-panel"> block
  inside #tab-users, removed dead .user-panel* CSS (kept .btn-close
  for any external use).
* users.js: removed openUserPanel / closeUserPanel / reloadUserPanel
  and their closure state (activeTr, activeUserRole). User row onclick
  switched from openUserPanel(...) → AdminRouter.navigate('#users/N').
  clearUserHistory / toggleBanUser / confirmDeleteUser / openEditUserModal
  / openUserPermsModal / doSet/doReset* all refactored to use the
  getActiveUid() helper (reads window.activeUid, set by user-detail.init)
  + reloadDetailAndList() helper (refreshes deep page + list together).
* sessions.js: row click + eye-button switched from toggleDrawer(id)
  → gotoSession(id) → AdminRouter.navigate('#sessions/N'). Removed
  toggleDrawer + renderDrawer functions (~60L) and openDrawerId state.
  Inline drawer markup removed from the row template.

Verified node --check on all touched JS. ast-index confirms zero
remaining usages of openUserPanel / closeUserPanel / reloadUserPanel /
toggleDrawer across the repo.

This completes Phase 6 and the admin-redesign feature.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-17 00:08:13 +03:00
parent bd3020067b
commit 3f89030b6e
6 changed files with 138 additions and 224 deletions
+47 -19
View File
@@ -1,6 +1,6 @@
# Phase 6: Deep entity pages
**Status:** 🟡 In Progress (sub-commit 1 of 2 done)
**Status:** ✅ Done (sub-commits: bd30200 + final remove-overlay commit)
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** frontend
@@ -10,7 +10,7 @@
## Tasks
- [ ] **User detail page** (`frontend/js/admin/sections/user-detail.js`):
- [x] **User detail page** (`frontend/js/admin/sections/user-detail.js`):
- Реагирует на route `#users/:id`
- Layout:
- **Header**: avatar, name, role badge, email, action buttons (ban/edit/perms/delete), back-link to `#users`
@@ -22,23 +22,19 @@
- **Graphs** (опционально, можно отдельным таб'ом):
- Простой SVG-чарт: успеваемость по неделям
- Mini-bar chart: avg % по предметам
- [ ] **Session detail page** (`frontend/js/admin/sections/session-detail.js`):
- [x] **Session detail page** (`frontend/js/admin/sections/session-detail.js`):
- Реагирует на route `#sessions/:id`
- Layout: header (user, subject, score, дата) + список вопросов/ответов (правильно/нет, текст), back-link
- [ ] **Router updates** (`frontend/js/admin/router.js` если ещё не поддерживает):
- `#users/123` → emit { route: 'users', params: ['123'] }
- `#sessions/456` → emit { route: 'sessions', params: ['456'] }
- [ ] **Admin.js dispatch**:
- При route с params → init detail-section вместо list-section
- При route без params → init list-section (как раньше)
- [ ] **Удалить overlay-код:**
- В `frontend/admin.html` удалить `<div class="user-panel" id="user-panel">` блок
- В `sections/users.js` удалить `openUserPanel`, `closeUserPanel`, `reloadUserPanel`
- В `sections/users.js` поменять onclick: `onclick="openUserPanel(event,${u.id},'${u.role}')"``onclick="AdminRouter.navigate('#users/${u.id}')"`
- [ ] **Replace** в Phase 5 quick action "Sessions" — теперь `AdminRouter.navigate('#users/${uid}/sessions')`:
- Парсить sub-tab из route
- [x] **Router updates** (`frontend/js/admin/router.js` если ещё не поддерживает): router из Phase 1 уже парсит params — обновлять не пришлось
- [x] **Admin.js dispatch**: добавлена `DEEP_ROUTES` map + `activateDeepPane()` + `activate(route, params)`
- [x] **Удалить overlay-код:**
- [x] В `frontend/admin.html` удалён `<div class="user-panel" id="user-panel">` блок + `.user-panel*` CSS
- [x] В `sections/users.js` удалены `openUserPanel`, `closeUserPanel`, `reloadUserPanel`
- [x] В `sections/users.js` onclick переключён на `AdminRouter.navigate('#users/${u.id}')`
- [x] **Replace** в Phase 5 quick action "Sessions": `quickOpenUserSessions(uid)``AdminRouter.navigate('#users/' + uid + '/sessions')`
- Парсить sub-tab из route (выполнено через `params[1]` в `activate()`)
- Открывать user-detail page с активным Sessions tab
- [ ] **Глоссарий routes после фазы:**
- [x] **Глоссарий routes после фазы:**
- `#overview` — dashboard (Phase 3)
- `#users` — list
- `#users/123` — user detail (overview tab default)
@@ -112,6 +108,38 @@
## Handoff to Next Phase
<!-- Это финальная фаза. Implementer записывает: что ещё не сделано,
какие follow-up задачи стоит зафиксировать (графики, realtime, мобильная версия).
Эти заметки помогут final-reviewer и при подготовке merge-summary. -->
Это финальная фаза. Что реализовано в этой фазе:
### Done
- Deep page `#users/:id` с sub-tabs (overview/sessions/classes/audit) и URL-sync sub-routing
- Deep page `#sessions/:id` с полным разбором ответов
- F5 / browser-back / закладки работают на любом deep-URL
- Overlay `.user-panel` полностью удалён (HTML + CSS + JS)
- Sessions row-click переключён с inline drawer на deep page navigation (`gotoSession(id)`)
- Audit sub-tab фильтрует system-wide audit-log по uid client-side
- Inline SVG bar chart для per-subject avg % на Overview sub-tab (no chart.js dep)
- Cmd+K palette user-pick (Phase 4) теперь открывает deep page (ранее был fallback на `#users`)
- 2 sub-commit разбивка для безопасности: `bd30200` (add deep pages, overlay still works) → finale (remove overlay)
### Post-merge follow-ups (NOT блокирующие для merge)
1. **Classes sub-tab — placeholder.** Нет backend endpoint `GET /admin/users/:id/classes`. Текущий UI показывает empty-state со ссылкой на `/classes`. После merge добавить endpoint (выбрать из `class_members` по `user_id`).
2. **Audit sub-tab — client-side filter.** Фильтрация делается на 500 строк из общего лога — для бóльших инсталляций нужен `GET /admin/audit-log?user_id=N` (server-side). Сейчас работает корректно для типичной нагрузки LearnSpace (<10k записей).
3. **Charts — single bar chart only.** План включал опциональные графики "успеваемость по неделям" — оставил на post-merge. Использовать тот же inline SVG паттерн (`.ud-bars` + `.ud-bar-fill`).
4. **Mobile.** Header кнопки сжимаются на ≤640px (см. CSS `.ud-header` block в user-detail.js), но при большом количестве действий могут перекрыть. Можно добавить overflow menu (`<details>`) post-merge если жалобы.
5. **`.user-panel` CSS не полностью удалён** — оставлен только `.btn-close` (используется ещё где-то?). Если нет — можно удалить тоже.
6. **`window.activeUid` — глобальное состояние.** Сейчас и user-detail.js, и users.js пишут/читают `window.activeUid`. Это работает, но в идеале нужно перенести user-only modals (eu-modal, up-modal) в user-detail.js целиком. Не критично, но улучшит изоляцию.
### Final smoke checklist (для final-reviewer)
- [ ] Открыть `/admin#overview` — dashboard
- [ ] Cmd+K → найти юзера → пик из списка → открыть deep page
- [ ] На deep page переключить sub-tabs (URL обновляется)
- [ ] F5 на `#users/N/sessions` → page восстановлен
- [ ] Browser back → возврат на `#users` list
- [ ] Header action: Изменить → modal → save → header обновлён
- [ ] Header action: Бан → toast → header обновлён (метка "Разблокировать")
- [ ] Click on session row in Sessions sub-tab → `#sessions/M` (deep session page)
- [ ] Session page: Delete → toast → navigate back to `#sessions` list
- [ ] No console errors