# Phase 5: Per-row quick actions **Status:** ⬜ Not Started **Parent plan:** [PLAN.md](./PLAN.md) **Domain:** frontend **Parallelizable with:** Phase 3, Phase 4 ## Objective На hover-строке user / session показывать кнопки частых action прямо в таблице — без открытия overlay-панели. Сокращает 2-3 клика до 1 для типичных задач (бан, выдача монет, удаление сессии). ## Tasks - [ ] **Users table** (`frontend/js/admin/sections/users.js`): - Добавить в каждый `` дополнительную ячейку или абсолютно-позиционированный блок с action-кнопками - Visible: только на `:hover` строки (via CSS) - Кнопки: - **🔒 Ban / Unban** — открывает confirm modal, на confirm вызывает существующий `toggleBanUser()` (или его эквивалент с userId) - **🪙 Award coins** — открывает быстрый prompt-modal "Сколько монет?", вызывает существующий `shopAdminAwardCoins` без перехода в shop tab - **📜 Sessions** — навигирует через `AdminRouter.navigate('#sessions?user=' + uid)` (param Phase 6 будет обрабатывать; пока fallback — переход на sessions tab) - **🗑 Delete** — confirm, вызывает существующий `confirmDeleteUser` - **ВАЖНО:** иконки только inline SVG (.ic класс) или Lucide — НИКАКИХ эмоджи - Кнопки `event.stopPropagation()` чтобы не триггерить `openUserPanel` - [ ] **Sessions table** (`frontend/js/admin/sections/sessions.js`): - **👁 View** — открыть session detail (текущий механизм) - **🗑 Delete** — confirm + DELETE /admin/sessions/:id (если такой endpoint есть, иначе добавить) - [ ] **Если delete session endpoint отсутствует** — добавить в backend: - `DELETE /api/admin/sessions/:id` с auth admin only - Контроллер: удалить из `test_sessions` + connected `session_answers` - Audit log entry - [ ] **CSS** (в admin.html style блоке или новый файл): ```css .row-actions { opacity: 0; transition: opacity .15s; display: inline-flex; gap: 4px; } tr:hover .row-actions { opacity: 1; } .row-action-btn { width: 28px; height: 28px; border-radius: 6px; ... } ``` - [ ] Подсказки через `title="..."` атрибут на каждой кнопке - [ ] Confirm-модалки используют `LS.confirm` (не reinventing) ## Files to Modify/Create - `frontend/js/admin/sections/users.js` — модификация renderRow + action handlers (~50-100L добавления) - `frontend/js/admin/sections/sessions.js` — same (~30-50L) - `frontend/admin.html` — стили для `.row-actions` (~30L) - `backend/src/controllers/adminController.js` — `deleteSession` если отсутствует - `backend/src/routes/admin.js` — `DELETE /sessions/:id` если отсутствует ## Acceptance Criteria - Hover на user row → видны 4 кнопки справа без раздвигания layout - Hover на session row → видны 2 кнопки - Каждая кнопка работает (ban / coins / sessions / delete) - Click на кнопку НЕ открывает user-panel overlay (stopPropagation) - Tooltip на hover каждой кнопки - Confirm для деструктивных action (delete, ban) - LS.toast после success - Auth check — все action available только admin - Mobile: actions hidden (tap-only context), либо альтернативный UI (long-press → menu) — пока минимум скрыть на ≤768px ## Notes ### Существующие helpers использовать - `LS.confirm(message, { okText, danger })` для подтверждений - `LS.modal(...)` если нужна форма (например award coins amount) - `LS.toast` для feedback - Существующие admin* функции (toggleBanUser, awardCoins, etc.) — не дублировать ### Визуальный паттерн Inspired by Linear / Vercel admin: actions visible on row hover, positioned right-aligned, ghost-style buttons (transparent bg, border on hover). Иконки только. ### Что НЕ делать в этой фазе - Не делать bulk-actions (select multiple → action) — это после merge - Не делать undo (toast с "отменить" внутри) — Phase 6+ - Не менять структуру таблицы radically ## Review Checklist - [ ] Кнопки не сдвигают layout (используют absolute / hidden / opacity) - [ ] Все action эскейпят пользовательский ввод - [ ] No emoji — только SVG - [ ] event.stopPropagation на всех кнопках - [ ] Confirm для destructive actions - [ ] Tooltip присутствует - [ ] Mobile-friendly (hidden или альтернативный UI) - [ ] Build passes ## Handoff to Next Phase