docs: document Sprint 2 UX improvements
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,12 @@
|
|||||||
- Разбор ошибок: вопрос, ответ сотрудника, правильный ответ
|
- Разбор ошибок: вопрос, ответ сотрудника, правильный ответ
|
||||||
- [x] Фронт: кнопка «Пройти тест» прямо в строке таблицы списка тестов
|
- [x] Фронт: кнопка «Пройти тест» прямо в строке таблицы списка тестов
|
||||||
|
|
||||||
|
### Доработки после тестирования
|
||||||
|
- [x] Страница теста разделена на два вида:
|
||||||
|
- `/tests/:id` — вид сотрудника: вопросы и варианты ответов без отметок правильных
|
||||||
|
- `/tests/:id/edit` — вид автора: правильные ответы отмечены, жёлтый баннер, кнопка «Редактировать» (задизаблена до Спринта 4)
|
||||||
|
- [x] Список тестов: три кнопки действий заменены на выпадающее меню «⋯» — колонка с названием стала полноширинной
|
||||||
|
|
||||||
### Баги, найденные и исправленные при тестировании
|
### Баги, найденные и исправленные при тестировании
|
||||||
- [x] «Не удалось загрузить тест» × 2 при нажатии «Пройти тест» — миграция `002_attempts` не применилась, т.к. `--reload` перезапускает только код приложения, но не `entrypoint.sh` → исправлено: `docker compose restart backend`
|
- [x] «Не удалось загрузить тест» × 2 при нажатии «Пройти тест» — миграция `002_attempts` не применилась, т.к. `--reload` перезапускает только код приложения, но не `entrypoint.sh` → исправлено: `docker compose restart backend`
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
# ШАГ 009 — Спринт 2: Доработки UX после тестирования
|
||||||
|
|
||||||
|
**Дата:** 2026-03-21
|
||||||
|
**Контекст:** Мастер-класс по разработке системы тестирования сотрудников клиники.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Запросы
|
||||||
|
|
||||||
|
> 1. На странице теста видны правильные ответы — зачем тогда проходить тест?
|
||||||
|
> 2. На главной колонка с названием теста стала слишком узкой из-за трёх кнопок действий.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Изменения
|
||||||
|
|
||||||
|
### 1. Разделение страницы теста на два вида
|
||||||
|
|
||||||
|
**Проблема:** `/tests/:id` показывала зелёные галочки у правильных ответов. Пользователь мог подсмотреть ответы до прохождения теста.
|
||||||
|
|
||||||
|
**Решение:** два отдельных маршрута с разным содержимым.
|
||||||
|
|
||||||
|
| Маршрут | Для кого | Что показывает |
|
||||||
|
|---------|----------|----------------|
|
||||||
|
| `/tests/:id` | Сотрудник | Вопросы и варианты ответов без отметок |
|
||||||
|
| `/tests/:id/edit` | Автор | Все ответы с отметками ✓/✗ + жёлтый баннер «Вид автора» |
|
||||||
|
|
||||||
|
Кнопка «Редактировать» на странице автора пока задизаблена — активируется в Спринте 4 вместе с авторизацией.
|
||||||
|
|
||||||
|
**Затронутые файлы:**
|
||||||
|
```
|
||||||
|
frontend/src/pages/TestDetail/index.tsx ← убраны CheckCircleTwoTone / CloseCircleTwoTone
|
||||||
|
frontend/src/pages/TestEdit/index.tsx ← новый файл, бывший TestDetail + баннер
|
||||||
|
frontend/src/App.tsx ← добавлен маршрут /tests/:id/edit
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Выпадающее меню «⋯» в списке тестов
|
||||||
|
|
||||||
|
**Проблема:** Три кнопки («Открыть», «Изменить», «Пройти тест») в одной ячейке сжимали колонку с названием теста.
|
||||||
|
|
||||||
|
**Решение:** Все три действия убраны в `Dropdown` по кнопке `MoreOutlined` (⋯). Колонка действий сужена до 60px, колонка с названием занимает всю оставшуюся ширину.
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/src/pages/TestList/index.tsx ← Space + 3 Button → Dropdown с menu.items
|
||||||
|
```
|
||||||
|
|
||||||
|
**Структура меню:**
|
||||||
|
```
|
||||||
|
Открыть
|
||||||
|
Изменить
|
||||||
|
─────────
|
||||||
|
Пройти тест
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Архитектурное решение для джуниора
|
||||||
|
|
||||||
|
> Разделение «вид сотрудника» / «вид автора» сделано через **два отдельных React-компонента** на разных маршрутах, а не через условный рендеринг внутри одного компонента.
|
||||||
|
>
|
||||||
|
> Почему: в Спринте 4 эти маршруты будут защищены разными ролями (`ProtectedRoute`). Если бы логика была в одном компоненте, пришлось бы прятать данные на фронте — это ненадёжно. Два маршрута = два разных запроса = чистое разграничение доступа.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Следующие шаги
|
||||||
|
|
||||||
|
- [x] Спринт 1: Инфраструктура + Создание тестов
|
||||||
|
- [x] Спринт 2: Прохождение теста + результат
|
||||||
|
- [ ] Спринт 3: Трекер результатов
|
||||||
|
- [ ] Спринт 4: Авторизация и роли
|
||||||
|
- [ ] Спринт 5: Уведомления в MAX
|
||||||
Reference in New Issue
Block a user