diff --git a/plans/admin-redesign/CONTEXT.md b/plans/admin-redesign/CONTEXT.md index b7062a0..6054618 100644 --- a/plans/admin-redesign/CONTEXT.md +++ b/plans/admin-redesign/CONTEXT.md @@ -5,7 +5,7 @@ (будет обновляться после каждой фазы) - ✅ Phase 1 implemented — `window.AdminRouter` обёртывает старый `switchTab` (hash ↔ tab двусторонне). `switchTab` принимает 2-й аргумент `{ fromRouter: true }` для предотвращения рекурсии. Default = `#stats`. Файлы: `frontend/js/admin/router.js` (новый), `frontend/admin.html` (+1 строка), `frontend/js/admin/admin.js` (модификация `switchTab` + IIFE `initAdminRouter`). -- ⬜ Phase 2 not started — все 13 секций в admin.js монолите +- ✅ Phase 2 implemented (commit 92030b4) — admin.js ужат с ~3591L до 701L. Все 13 plan-tabs живут в `frontend/js/admin/sections/*.js` (IIFE pattern) + `frontend/js/admin/_shared.js` (window.AdminCtx). switchTab() диспетчит в `AdminSections[ROUTE_TO_SECTION[name]].init()`. Lazy-load работает (inited флаг внутри каждой IIFE). System tabs (topics/audit/errors/health/classroom/avatars) остались inline в admin.js — Phase 2 их не extract'ил. - ⬜ Phase 3-6 not started ## Temporary Workarounds @@ -49,23 +49,37 @@ AdminRouter.navigate('#users/123', { replace: true, silent: true }); - `goAddQuestion(slug)` и подобные cross-tab onclick handlers должны работать - Старые ссылки `` (если есть) тоже -### Конвенции вновь создаваемых модулей +### Конвенции вновь создаваемых модулей (Phase 2 закреплено) -Каждая section (фаза 2): +Каждая section: ```js // js/admin/sections/.js (function () { 'use strict'; let inited = false; - async function load() { /* ... */ } + async function load() { /* fetch + render */ } + // Optional onclick handlers used by HTML / dynamic templates: + window.handlerX = handlerX; window.AdminSections = window.AdminSections || {}; window.AdminSections. = { init: async () => { if (inited) return; inited = true; await load(); }, reload: load, + // Optional extras for cross-section calls (e.g. questions.openModal): + // openModal: (...) => { ... }, }; })(); ``` +Shared utilities — на `window.AdminCtx` (см. `_shared.js`): +- `user`, `isTeacher`, `isAdmin` (filled by admin.js) +- `MODES`, `DIFFS`, `DIFF_LABELS`, `TYPE_LABELS` +- `pctClass`, `fmtDate`, `fmtTime`, `fmtDuration` +- `renderMath`, `qTypeBadge`, `qOptsPreview` +- `renderPgnControls`, `ensurePgnStyles` + +ROUTE_TO_SECTION map в admin.js — добавлять новые ключи при добавлении секций +(Phase 3 = `overview`, Phase 6 = `user`/`session` deep pages). + Router (фаза 1): ```js // js/admin/router.js diff --git a/plans/admin-redesign/PLAN.md b/plans/admin-redesign/PLAN.md index 58d6181..8390235 100644 --- a/plans/admin-redesign/PLAN.md +++ b/plans/admin-redesign/PLAN.md @@ -36,7 +36,7 @@ ## Phases - [x] Phase 1: Hash-router [domain: frontend] → [subplan](./phase-1-hash-router.md) -- [ ] Phase 2: Split admin.html → per-section modules [domain: frontend] → [subplan](./phase-2-split-sections.md) +- [x] Phase 2: Split admin.html → per-section modules [domain: frontend] → [subplan](./phase-2-split-sections.md) - [ ] Phase 3: Dashboard #overview [domain: fullstack] → [subplan](./phase-3-dashboard.md) (parallelizable with 4, 5) - [ ] Phase 4: Cmd+K command palette [domain: fullstack] → [subplan](./phase-4-palette.md) (parallelizable with 3, 5) - [ ] Phase 5: Per-row quick actions [domain: frontend] → [subplan](./phase-5-quick-actions.md) (parallelizable with 3, 4) @@ -48,8 +48,8 @@ | Phase | Domain | Status | Review | Build | Committed | |-------|--------|--------|--------|-------|-----------| -| Phase 1: Hash-router | frontend | ✅ Implemented | ⬜ | ✅ | ⬜ | -| Phase 2: Split sections | frontend | ⬜ Not Started | ⬜ | ⬜ | ⬜ | +| Phase 1: Hash-router | frontend | ✅ Done | ✅ PASS w/ notes | ✅ | ✅ 8a7bed4 | +| Phase 2: Split sections | frontend | ✅ Done | ⬜ pending | ✅ node --check | ✅ 92030b4 | | Phase 3: Dashboard | fullstack | ⬜ Not Started | ⬜ | ⬜ | ⬜ | | Phase 4: Palette | fullstack | ⬜ Not Started | ⬜ | ⬜ | ⬜ | | Phase 5: Quick actions | frontend | ⬜ Not Started | ⬜ | ⬜ | ⬜ | diff --git a/plans/admin-redesign/phase-2-split-sections.md b/plans/admin-redesign/phase-2-split-sections.md index 8ec7397..7bfbe30 100644 --- a/plans/admin-redesign/phase-2-split-sections.md +++ b/plans/admin-redesign/phase-2-split-sections.md @@ -1,8 +1,9 @@ # Phase 2: Split admin.html → per-section modules -**Status:** ⬜ Not Started +**Status:** ✅ Done **Parent plan:** [PLAN.md](./PLAN.md) **Domain:** frontend +**Commit:** 92030b4 ## Objective @@ -10,8 +11,8 @@ ## Tasks -- [ ] Создать `frontend/js/admin/sections/` директорию -- [ ] Определить единый паттерн модуля: +- [x] Создать `frontend/js/admin/sections/` директорию +- [x] Определить единый паттерн модуля: ```js // js/admin/sections/.js (function () { @@ -29,23 +30,23 @@ }; })(); ``` -- [ ] Извлечь 13 секций (в порядке риска — от меньшего к большему): - - [ ] `stats.js` — `loadStats` + связанные функции (small, ~50L) - - [ ] `sublog.js` — submission log (medium) - - [ ] `sims.js`, `games.js`, `tpl.js` — admin-only (small каждая) - - [ ] `subjects.js` — настройка доступных тестов - - [ ] `permissions.js` - - [ ] `shop.js` — items + purchases + award coins - - [ ] `gam.js` — gamification stats + award xp - - [ ] `assignments.js` - - [ ] `tests.js` - - [ ] `questions.js` — самая большая, ~800L (включая Q-modal) - - [ ] `users.js` — users-table + pagination + user-panel (overlay остаётся!) - - [ ] `sessions.js` — sessions-table + session detail -- [ ] Модифицировать `admin.js`: +- [x] Извлечь 13 секций (в порядке риска — от меньшего к большему): + - [x] `stats.js` — `loadStats` + связанные функции (50L) + - [x] `sublog.js` — submission log (104L) + - [x] `sims.js` (118L), `games.js` (132L), `tpl.js` (73L) — admin-only + - [x] `subjects.js` — настройка доступных тестов (338L) + - [x] `permissions.js` (68L) + - [x] `shop.js` — items + purchases + award coins (207L) + - [x] `gam.js` — gamification stats + award xp (183L) + - [x] `assignments.js` (477L) + - [x] `tests.js` (283L) + - [x] `questions.js` — самая большая, 535L (включая Q-modal) + - [x] `users.js` — users-table + pagination + user-panel (343L, overlay остался) + - [x] `sessions.js` — sessions-table + session detail (159L) +- [x] Модифицировать `admin.js`: - Удалить функции, перенесённые в sections - - Заменить inline вызовы (`loadUsers()` → `AdminSections.users.init(ctx)`) - - Добавить генератор route→section маппинга: + - Заменить inline вызовы (`loadUsers()` → `AdminSections.users.init()`) + - Добавить ROUTE_TO_SECTION mapping (см. ниже) ```js const ROUTE_TO_SECTION = { stats: 'stats', users: 'users', sessions: 'sessions', @@ -53,16 +54,16 @@ subjects: 'subjects', permissions: 'permissions', shop: 'shop', gam: 'gam', tpl: 'tpl', sims: 'sims', games: 'games', sublog: 'sublog', }; - AdminRouter.on('change', ({ route }) => { - const sec = ROUTE_TO_SECTION[route]; - if (sec && AdminSections[sec]) AdminSections[sec].init(sharedCtx); - }); ``` -- [ ] Все 13 `