# LearnSpace — Полный UX-аудит фронтенда **Дата проверки:** 2026-03-16 **Проверено файлов:** 40 **Методология:** ручной просмотр каждого HTML-файла, оценка по 10 категориям --- ## Сводная таблица критических проблем | # | Файл | Проблема | Серьёзность | |---|------|----------|-------------| | 1 | board.html | Кнопка «Перейти» ведёт на `/dashboard`, а не запускает тест | HIGH | | 2 | login.html | После регистрации всегда редирект на `/dashboard` — учителя попадают не туда | HIGH | | 3 | homework.html | `catch {}` — пустой обработчик ошибок, студент не знает о сбое | HIGH | | 4 | test-result.html | Обе кнопки «К тестам» и «В кабинет» ведут на `/dashboard` — дублирование без смысла | HIGH | | 5 | live-quiz.html | Кнопка «Завершить сессию» без подтверждения — деструктивное действие | HIGH | | 6 | admin.html | Смена роли пользователя без подтверждения (inline select) | HIGH | | 7 | board.html | Ссылка `href="/red-book.html"` — с расширением `.html`, все остальные роуты без расширения | MEDIUM | | 8 | Все страницы | Analytics, Gradebook, Question Bank, Live Quiz, Lesson Editor — нет в сайдбаре | MEDIUM | | 9 | profile.html | `overflow: hidden` на `body` — может сломаться при виртуальной клавиатуре на мобиле | MEDIUM | | 10 | profile.html | Форма смены пароля без поля «текущий пароль» | MEDIUM | --- ## Детальный разбор по файлам --- ### login.html #### [HIGH] Flow: редирект после регистрации всегда на `/dashboard` Учителя и администраторы после создания аккаунта попадают на страницу студента. Им нужны `/classes` или `/admin`. **Фикс:** после успешной регистрации получать роль из ответа API и редиректить по роли: `student → /dashboard`, `teacher → /classes`, `admin → /admin`. #### [MEDIUM] Flow: нет выбора роли при регистрации Непонятно, как учитель или администратор создаёт аккаунт. Нет поля «роль» в форме регистрации. **Фикс:** добавить `` без подтверждения ```html ``` Неосторожный клик меняет роль немедленно. Это деструктивное действие: учитель превращается в студента без возможности отмены. **Фикс:** при `change` события показывать confirmation modal «Изменить роль пользователя X с Y на Z?», только после подтверждения отправлять PATCH-запрос. #### [HIGH] Confirmation: кнопка `btn-del-q` (удалить вопрос) без видимого диалога подтверждения Удаление вопроса из банка — необратимое действие. **Фикс:** confirmation modal с предупреждением об необратимости. #### [MEDIUM] Error handling: нет отображения ошибок при провале admin-операций Если PATCH /api/users/:id/role вернул 500, пользователь не узнает об этом. **Фикс:** показывать toast/alert с текстом ошибки из ответа API. #### [LOW] UX: `max-height: 0` → `max-height: 4000px` в session drawer Анимация открытия непредсказуема по скорости — CSS считает переход от 0 до 4000px, хотя реальная высота 200px. **Фикс:** использовать JavaScript для установки точной `max-height: element.scrollHeight + 'px'`. --- ### test-run.html #### [MEDIUM] Feedback: кнопка «Завершить тест» доступна с первого вопроса без минимального порога Студент может нечаянно нажать и завершить тест, ответив на 0 вопросов. **Фикс:** показывать предупреждение в confirmation modal: «Ты ответил на X из Y вопросов. Уверен, что хочешь завершить?» #### [MEDIUM] Accessibility: `` — пустой атрибут alt у изображений в вопросах Студенты с нарушениями зрения не получат описание изображения. **Фикс:** заполнять `alt` из поля описания вопроса в БД (например, `alt="Изображение к вопросу: ..."`). #### [MEDIUM] Loading: нет серверного сохранения прогресса теста в процессе SessionStorage работает только в рамках одной вкладки. При сбое браузера прогресс теряется. **Фикс:** периодически (каждые 30 сек) отправлять автосохранение через PATCH `/api/sessions/:id/autosave` с текущими ответами. #### [LOW] Feedback: предупреждение таймера только за 120 секунд — мало для коротких тестов **Фикс:** добавить предупреждение при достижении 25% оставшегося времени (независимо от абсолютного значения). --- ### test-result.html #### [HIGH] Flow: обе кнопки «К тестам» и «В кабинет» ведут на `/dashboard` ```html К тестам В кабинет ``` Дублирование кнопок с одинаковым назначением сбивает с толку. **Фикс:** «К тестам» → `/board` (список заданий), «В кабинет» → `/dashboard`, добавить третью кнопку «Пройти ещё раз» → `/test-run?...` с теми же параметрами. #### [MEDIUM] Navigation: нет возврата к заданию на борде, если тест был из assignment Если студент пришёл с `/board?class=5`, после теста нет ссылки «Вернуться к классу». **Фикс:** передавать `returnUrl` параметром и использовать его в кнопке «Назад». --- ### homework.html #### [HIGH] Error handling: пустой `catch {}` при загрузке данных класса в `initStudent()` ```js catch {} ``` Студент видит пустую форму без объяснения причины. **Фикс:** заменить на `catch(e) { showError('Не удалось загрузить задания. ' + e.message); }`. #### [HIGH] Forms: при нескольких классах у студента задание всегда подаётся в `classes[0].id` Студент в 2+ классах может случайно отправить работу не в тот класс. **Фикс:** добавить `