From eff3fda5b0fac8c4e3c88f73b5530801a915d8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=20=D0=9B=D0=B5=D0=B1=D0=B5=D0=B4=D0=B8=D0=BD=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D0=B9?= Date: Wed, 29 Apr 2026 14:55:43 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F.=20=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=201=20=D0=A8?= =?UTF-8?q?=D0=B0=D0=BF=D0=BA=D0=B0+=D0=92=D0=B5=D1=80=D1=85=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20brick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 10244 bytes DOC/ШАГИ/Untitled | 1 + README.md | 297 ++++---- docker-compose.dev.yml | 82 +-- docs/PROJECT_STATUS.md | 174 +++-- ...ая_IA_—_страница_теста.md | 340 +++++++++ docs/screens/01_header_intro.jpg | Bin 0 -> 29786 bytes docs/screens/02_about_test.jpg | Bin 0 -> 19613 bytes docs/screens/03_questions_top.jpg | Bin 0 -> 52474 bytes docs/screens/04_questions_mid.jpg | Bin 0 -> 52342 bytes docs/screens/05_questions_bottom.jpg | Bin 0 -> 38132 bytes docs/screens/06_save_history.jpg | Bin 0 -> 25250 bytes docs/screens/07_catalog_visibility.jpg | Bin 0 -> 22942 bytes docs/screens/08_catalog_employees.jpg | Bin 0 -> 21370 bytes ...ии UX по экранам теста.md | 72 ++ ...ловарь UX-UI-IA терминов.md | 298 ++++++++ flask_app/README.md | 49 +- flask_app/app/__init__.py | 29 + flask_app/app/services/editor_content.py | 10 + flask_app/app/services/test_attempt.py | 354 ++++++++++ flask_app/app/static/css/app.css | 661 +++++++++++++++++- flask_app/app/static/img/clinic-logo.png | Bin 0 -> 52911 bytes flask_app/app/static/js/editor.js | 339 ++++++++- flask_app/app/templates/auth/login.html | 144 ++-- flask_app/app/templates/base.html | 171 +++-- flask_app/app/templates/settings.html | 7 +- flask_app/app/templates/tests/attempt.html | 136 ++++ .../app/templates/tests/attempt_review.html | 40 ++ flask_app/app/templates/tests/editor.html | 238 ++++--- flask_app/app/templates/tests/list.html | 186 +++-- flask_app/app/tests/routes.py | 112 +++ frontend/index.html | 2 +- frontend/src/img/clinic-logo.png | Bin 0 -> 52911 bytes frontend/src/pages/TestDetail.jsx | 137 +++- 34 files changed, 3321 insertions(+), 558 deletions(-) create mode 100644 DOC/ШАГИ/Untitled create mode 100644 docs/UX_аудит_и_новая_IA_—_страница_теста.md create mode 100644 docs/screens/01_header_intro.jpg create mode 100644 docs/screens/02_about_test.jpg create mode 100644 docs/screens/03_questions_top.jpg create mode 100644 docs/screens/04_questions_mid.jpg create mode 100644 docs/screens/05_questions_bottom.jpg create mode 100644 docs/screens/06_save_history.jpg create mode 100644 docs/screens/07_catalog_visibility.jpg create mode 100644 docs/screens/08_catalog_employees.jpg create mode 100644 docs/Рекомендации UX по экранам теста.md create mode 100644 docs/Словарь UX-UI-IA терминов.md create mode 100644 flask_app/app/services/test_attempt.py create mode 100644 flask_app/app/static/img/clinic-logo.png create mode 100644 flask_app/app/templates/tests/attempt.html create mode 100644 flask_app/app/templates/tests/attempt_review.html create mode 100644 frontend/src/img/clinic-logo.png diff --git a/.DS_Store b/.DS_Store index 273274aa6427b3e65db21c52c0669a9c12320ee4..5d52eee2471330d12f55690eece63b688524d701 100644 GIT binary patch literal 10244 zcmeHMX>8m?6rSg#iA~+sNt2~_U6vy%2~AHLKy2ZMSr~!=ybdpo7!310tDOZKyhyh$3`D!2+3+N=LT%AC0_<*2g2u>)#T1WdT z6DJVkG<=612t6>}12kO9Ns?$JMaGKH@97K`F8g4^xzi=mPIGh8a*|jh9(!if!tdTW z(s(8*{ZB|`w$s}J-dg#6Dw@F+K_?FO$7`{iRL~CXXB?kPer1V@ot8_EdznD)X z`ZP1FR8EoWGW6?Cv$`iTC{uNs!E9aS8iqYM>Y94T$cSh7eMR~H0c~e@!TKC83F7ZI(Gk%httsF8|fB%#KFdMI0YRUTIFpqTo386GDW9vtED9ktHX{vzVD>_HP_Yb zQ6oMSZCORO7-jFvL((ddRBxTB-7&U~hZXA~0U8H93GJ{M4kzM*}=@=~|$ z*oG91wFXrpsUuCKjr5QmWP;p79wvLqK602GBj1oyP!1Ikg%z+K8sQpfgC5udqmY5? zAqV5!f{+KolE7j>U=lNhIk&uA69;xldw$MOKmcqyX)}xuj@fw}&3!ChFuBlHy6-V;J;Yb(OqERCK9_L65U8l^aB*RqD-g zoO0$B@|9u*)JlE0oTYI*9%na3nndM*cpYuKP4oPYjA7?{wJCD7s2mjsyzQE6bd2M= z!*w=A+C-5}AM&ZvM&0zCpmJ%XQxyBDxkg<_OVo>9iAV$yVA?qoS2+wFzSt?paQTbI z%tslzrsF%doK=tl(3zW~v3kzNJ=s#SiZmn8w-J}zia>viJWF0AZ<2%L5Q6;#`I>x7 zej>j>36vr1MFf5&R6#W?fs3F9mczv?2;$HL9nc5;FbG4S!44RMG}z$5jj$VThDo>u z?uL8dUbqh)g2&+r*b7g=^YALX1_$7Eco#l`kKt1|0bj%S@B{oPlnAmgOPDRp6P5{U zgmuED!g`@Whzki}NHByQy#IwD+Zv1~AcBXP;vfqaR^i}Tf=q3>rnRm8+SdO8`88A_RrYE|+Dc6ysAm zzG%V1`EpE+OLSFG2$OBzh?Z!y{f(&qkbF+QA}7fyMEy)q5bNhd9jt~1#CR*TLnmy8 zF2wm(7=~>O>lPy2!R3Dfb|KntLcHGwd*BYZ6Yhfh;Q@G%Vg5;m`KMtY?1z`&Wq1V+ z!C^Q8N8v4a8{UU6;UxS7KTkn+#}s7K<4^(FxrA$5jy;Mz`neIw2u87k|7iT_JH68V zZ_hoGOz~dtk=)41&)#Euy=k`6>FWAITN(_sVKA*d*>hJ>2cN*eCk`$SdCc(CRRS z9tb@UdLZ<`U+jSrZcnB6{~OQ#|Nk#;H8dA`AoRe$$pcW@oM@((Yxz5gshy*D?J7Ro z@S%yyO>)Xq@I^%^pIygefnLY6D;DJCPm{Dh7RXI>+8;s5{u literal 10244 zcmeHMdu$X%7@u!jV3)FX`@#ZSI5?FeEtEo$mw3Gvp%f_eu5fKBb?wnCSay0nJM^34De45z|65d;`bk6l9?0mX2x;+nZZAy zfPe6Skk_3+gvlTe5C{;MhyXpi=M$A!Bt@KY=l3YKE&0n!o?)(Ea?ly@&-w2p2MpbD zYihm#E-!z|)M-4=7w}!NK5H=MDsI||Dt0HW#VyN7X3I))r>+flOQj8#=_F5OhE!KjrsRmZc9u?Aicgl?&P|Nh##RaK$owKWH;Li<MU7tXy&Mpum@f zm#%H?-fQ%m))BT;@V5&hvU)B*ily9oR3~L5@%?D$oKjC^{6)f*>>|IBin7ZTrWec* z?<7eB}pZI>MT)$RL-E&b!IC%zL&@w=qoSmBOpzM~$*(ACQC8-%LX4G zqQkT&9SzsC-PY(x-fP4Ll$37vh9CHi0UeHP&lW0KK_X#Rz~7yv*^)0I{J!$7R~F)? zWokk=((E_!q?$C4Eu@V+OoqvEa)P`@PLp%wBKd**0n?xe!mt!pK|O4SEzkx#p%(^V zA7o&VjlgAzFxMZ^7chc_oX-s>)4+(Gm(2S7GWf)19+wmCiH=UOE9cLNQ0z)sM!Mg0 zx}~C&Vx-cB;%fDVL4EH0qld;&W4t3e9Lsi*061>9B&8j#Rl{NRjMj*Q<4ia4W;jyA z7Ac%6EDzniXvy+b_t!tTd0XqKN7^z`?7+A(UA;%w?6yH&b^F>CC#9Jxx^P!Ucl4y8 z#Z9GOD}pLP7)5eRa)mrE+ce&Um%@A^oz(ZGb$58Qq^MXD7sz)B(%bxQ6<>0zrP7&H zuSH%USMq!()i>B0=1eUvma7Fx;o}Zs#fGR6YX!*>;(KvZV5W8AeY~U!Z5}n5YK^## zmzsrL8OCF#EE6NVkVskm{kTYn=^Eq>ymX%5Lnq#%IBv^;W@cZhL2lyt4yRACwU$BL zlClZ!>FRd+3$p|L>T!Sn5OuzFR+airOEX2s&Nj4sm6jE);1Mitu!rHi;T zh9mbfm*j#VM|lruVM0jY&!TyxlB^+7vXdypAqU7Y@*FuyJ|Gv!$K)&WJ^6)PC4a(H zD1bYl5G0rd^I;(@gIZVtb+8^b!X}K0W=MbnNl1YOLof{c;Q$a|PTCZZ5ZwtK=4O%ei%2 z3%7%7*9Jii*va&TWT)y_ON<3=MH0OY~=a7EqC@7kr&$3v}tp*xb^=Od6(D+ zq71(c^Y2+)Q@473G{;Cr;4Ejy#)3!x8-m88zekbr)WxWjE9Q!!HjEE#Xnag&V^x|) zW0Vs$D;535#Hhe8sELCdPkYD1!whau_3zr3;hY9GQ0vO;S>`8O{D%Aco)vX zdvG2uz$fr2eCCC~ckm!HfX{0RoeT0OU8u8tG-)158*=-?Ki@t zXM&k`9gotxj>ihUj`yy7Q0HGmcy/edit`: правка названия/описания/проходного + балла, добавление/удаление/перемещение вопросов и вариантов, + переключатель «Цепочка активна», авто-форк новой версии при правке + после первой попытки. +- **AI-помощник** в редакторе: + - «По названию» — генерация всего теста по теме (количество вопросов + и вариантов задаёт автор); + - «По текущей сетке» — генерация по уже расставленным карточкам; + - «Проверить» — рецензия теста с вердиктом и разделами рекомендаций; + - «Улучшить» — массовое «было → стало» с чекбоксами; + - «AI: вопрос/переформулировать» — на отдельной карточке вопроса. +- **Импорт документа** в редакторе: PDF / DOCX / TXT / MD до 16 МБ, + через `pypdf` и `python-docx` → AI-черновик. +- **Настройки** `/settings` — статус общего LLM-ключа из ENV (DeepSeek + или OpenAI-совместимый), кнопка «Проверить подключение». + +Подробная инструкция для тестировщика (только UI, без консоли) — +[`docs/QA-versioning-and-ai.md`](docs/QA-versioning-and-ai.md). + +## Что ещё не реализовано + +| Спринт | Что включает | +|---|---| +| **E1.4** — Назначение и прохождение | Назначить тест сотруднику, экран прохождения, экран результата с разбором ошибок. | +| **E1.5** — Трекер и настройки модуля | Единый список попыток с фильтрами, страница настроек цепочки. | +| **E1.6** — Cutover внутри репозитория | Удаление `backend/` и `frontend/`, чистка `docker-compose.dev.yml` от legacy-сервисов. | +| **E1.7** — UX-полировка редактора | 4 аккордеона (Шапка / AI / Вопросы / Действия) и drag-n-drop из [Спринта 3](docs/СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md). | --- -## Состояние реализации (сводка) - -Коротко и по-человечески: [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md) (черновики и версии, разбор попыток, список тестов, dev-стенд). -Как пользоваться локальным **dev** без чтения кода: [docs/DEV_CONTOUR_USER_GUIDE.md](docs/DEV_CONTOUR_USER_GUIDE.md). - ---- - -## Функциональные возможности - -### Управление пользователями и подразделениями - -- Создание/редактирование/деактивация учётных записей сотрудников -- Каждый сотрудник принадлежит одному подразделению -- Создание/редактирование справочника подразделений -- Назначение роли сотруднику: HR-менеджер / Руководитель подразделения / Сотрудник - -### Создание и редактирование тестов - -**Тест содержит:** -- Название теста -- Описание (опционально) -- Список вопросов (минимум 7) -- Порог зачёта — минимальный % правильных ответов -- Таймер прохождения — лимит в минутах (опционально) - -**Вопрос содержит:** -- Текст вопроса -- Минимум 3 варианта ответа -- Один или несколько правильных ответов +## Установка и запуск -**Настройки теста:** -- Разрешить возврат к предыдущему вопросу: да / нет +### Предпосылка: общий Postgres -**Версионирование:** -- Автор может редактировать тест пока никто его не проходил -- Если тест уже проходили — создаётся новая версия (`version + 1`), старая сохраняется -- Все версии теста хранятся; результаты привязаны к конкретной версии -- Активная версия — та, которую видят сотрудники; автор может вручную переключить активную версию -- Тест можно деактивировать (скрыть из списка, не удалять) +Используется **тот же** PostgreSQL, что и в +[Postgres_TG_Bots](../Postgres_TG_Bots) (контейнер `hr_postgres_dev`, +сеть `hr_postgres_dev_net`, учётка `hr_bot_user`). -### Назначение теста +```bash +# (один раз) создать базу +psql "postgresql://hr_bot_user:hrbot123@localhost:5432/postgres" \ + -c "CREATE DATABASE clinic_tests;" -- Список получателей (отдел или конкретные сотрудники) -- Срок сдачи — дата дедлайна -- Допустимое количество попыток (1 или более) +# (один раз) внешняя сеть, если ещё не создана соседом +docker network create hr_postgres_dev_net || true +``` -### Прохождение теста +### Dev-стенд -- На главной странице сотрудник видит список назначенных тестов со статусами: - - `Не начат` — ещё не открывал - - `В процессе` — начал, не завершил - - `Завершён` — сдал/не сдал - - `Просрочен` — дедлайн прошёл, не сдан -- Если задан таймер — отображается обратный отсчёт, по истечении тест завершается автоматически -- Порядок вопросов **случайный** при каждом прохождении -- Возможность вернуться к предыдущему вопросу — определяется настройкой теста +Выбор интерфейса задаётся через env-переменную `COMPOSE_PROFILES`: -### Результаты после завершения теста +- `modern` — основной интерфейс на Flask/Jinja; +- `legacy` — legacy-раскладка интерфейса на том же Flask-стеке. -- Итоговый балл и процент правильных ответов -- Факт зачёта: **сдал / не сдал** -- Разбор ошибок: по каждому вопросу — его ответ и правильный ответ +```bash +# Новый стек (рекомендуется) +COMPOSE_PROFILES=modern docker compose -f docker-compose.dev.yml up -d --build -### Трекер попыток +# Legacy-раскладка (тот же Flask) +COMPOSE_PROFILES=legacy docker compose -f docker-compose.dev.yml up -d --build +``` -Единый интерфейс просмотра всех попыток прохождения тестов: -- Фильтрация по подразделению, сотруднику, тесту, статусу, результату -- Пагинация и сортировка +| Что | URL | +|---|---| +| Приложение (Flask modern) | | +| Health-check | | +| Приложение (Flask legacy) | | -### AI-помощник +`docker-compose.dev.yml` пробрасывает в `testing-flask`: +- `DATABASE_URL` (по умолчанию на контейнерный Postgres `clinic_tests`); +- `HR_AUTH=1` / `HR_DATABASE_URL` по умолчанию — вход через HR-кабинет; +- `DEEPSEEK_API_KEY` / `OPENAI_API_KEY` / `LLM_BASE_URL` / `LLM_MODEL` — + для AI-функций. Достаточно положить ключ в корневой `.env` репозитория. -Интеграция с LLM для помощи при создании тестов: +### Локально без Docker -| Функция | Описание | -|---------|----------| -| Генерация теста | AI генерирует готовый набор вопросов с вариантами ответов по теме | -| Улучшение формулировки | AI переформулирует выбранный вопрос более чётко | -| Добавление дистракторов | AI генерирует правдоподобные неправильные варианты ответов | -| Проверка качества | AI анализирует весь тест и выдаёт рекомендации | +См. [`flask_app/README.md`](flask_app/README.md) — `venv` + +`pip install -r requirements.txt` + `python run.py`. --- -## Роли и права доступа - -| Роль | Кто | Создаёт тесты | Назначает тесты | Видит результаты | -|------|-----|:---:|:---:|:---:| -| **HR-менеджер** | Руководитель службы HR, Директор клиники | ✅ | Всем сотрудникам клиники | Всех сотрудников | -| **Руководитель подразделения** | Главный врач, рук. службы администраторов | ✅ | Только своему подразделению | Только своего подразделения | -| **Сотрудник** | Все остальные работники | ❌ | ❌ | Только свои | +## Данные и интеграция с HR + +- **Две роли кластера Postgres.** В **`clinic_tests`** — только сущности + модуля тестирования (тесты, версии, назначения, попытки, локальные + технические учётки). В **`hr_bot_test`** (Postgres_TG_Bots / + hr_web_viewer) — штат, справочники, RBAC и веб-логины. Схемы не + смешиваем, второй кадровый учёт в `clinic_tests` не ведём. +- **Сотрудник** во всех бизнес-процессах — по + **`staff_members.id`** из `hr_bot_test`. В `clinic_tests` храним тот же + идентификатор; ФИО / отдел / роли подтягиваем из HR при отображении. +- **`telegram_id` сотрудника** в бизнес-логике модуля **не участвует** + (ни вход, ни проверка прав, ни выбор сотрудника, ни фильтрация). +- **Целевой RBAC** — единая система разрешений HR + (`staff_role_assignments`, `permissions`). Модуль тестирования + не дублирует матрицу; пока единый API не готов — в `clinic_tests` + допустимы временные флаги, явно помеченные как MVP. +- **`HR_AUTH=1`**: в Flask-контуре включает вход через `hr_bot_test.users` + (Werkzeug-хеши) с UPSERT в `clinic_tests.users`. См. + [`flask_app/.env.example`](flask_app/.env.example). --- -## Установка и запуск - -### База данных (как в HR_TG_Bot / Postgres_TG_Bots) - -Используется **тот же** экземпляр PostgreSQL, что и в [Postgres_TG_Bots](../Postgres_TG_Bots) (`docker-compose.dev.yml`, контейнер `hr_postgres_dev`, учётка `hr_bot_user` / сеть `hr_postgres_dev_net` — см. [HR_TG_Bot docker-compose](../HR_TG_Bot/docker-compose.dev.yml)). - -Схема приложения (таблицы `users`, `tests`, `departments`, …) **не** совмещается с БД `hr_bot_test` — для TestingWebApp заведена отдельная база **`clinic_tests`**. - -1. Поднять Postgres из `Postgres_TG_Bots` (и при необходимости внешнюю сеть: `docker network create hr_postgres_dev_net` — как в compose этих репозиториев). -2. Один раз создать базу: - `psql "postgresql://hr_bot_user:hrbot123@localhost:5432/postgres" -c "CREATE DATABASE clinic_tests;"` -3. Скопировать `backend/.env.example` в `backend/.env`, при необходимости поправить `DATABASE_URL` (внутри Docker кластера — хост `hr_postgres_dev`, порт `5432`). -4. Миграции: из каталога `backend/`: `npm run migrate`, затем `npm start` (и фронт из `frontend/` — `npm run dev`). - -**Docker (UI + API + общий Postgres):** поднять `Postgres_TG_Bots` (сеть `hr_postgres_dev_net`), создать БД `clinic_tests`, затем из корня `TestingWebApp`: -`docker compose -f docker-compose.dev.yml up --build` — интерфейс **http://localhost:3107** (Nginx проксирует `/api` в backend), API с хоста **http://localhost:3001** (см. [docker-compose.dev.yml](docker-compose.dev.yml), миграции в entrypoint). **Новый Flask-контур** (тот же стек, что кабинет HR): **http://localhost:3108** — сервис `testing-flask`, см. [flask_app/README.md](flask_app/README.md). Локальный `npm run dev` фронта (Vite) — тоже **:3107**, прокси `/api` на **:3001**. В БД `clinic_tests` для локального логина нужен активный `users` с bcrypt-паролем, либо включите `HR_AUTH=1` + `HR_DATABASE_URL` в compose/`.env` (см. `backend/.env.example`). В `backend/.env` задайте `PORT=3001`, если поднимаете API отдельно от compose. +## Роли и права (по ТЗ) -`docker compose -f docker-compose.dev.yml down` — остановка. +| Роль | Кто | Создаёт тесты | Назначает | Видит результаты | +|---|---|:---:|:---:|:---:| +| **HR-менеджер** | Руководитель HR, директор | ✅ | Всем | Всех | +| **Руководитель подразделения** | Главврач, рук. отделения | ✅ | Только своему подразделению | Только своего подразделения | +| **Сотрудник** | Все остальные | ❌ | ❌ | Только свои | -**Без общего кластера** (только отладка): `docker compose --profile standalone up -d` в TestingWebApp — Postgres на **5433**, тогда в `.env` укажите `DATABASE_URL=...localhost:5433/clinic_tests` или `DB_PORT=5433` с `DB_NAME`/`DB_USER` из compose. - -**Если `npm run migrate` пишет `ECONNREFUSED ...:5433`:** в `backend/.env` нет (или кривой) `DATABASE_URL` на **5432**, и сработал старый `DB_PORT=5433`. Задайте `DATABASE_URL` как в `backend/.env.example` для общего Postgres. - -### Данные, сотрудники, интеграция с HR - -- **Две роли кластера Postgres:** в **`clinic_tests`** — только сущности модуля тестирования (тесты, версии, назначения, попытки, локальные технические учётки при необходимости). В **`hr_bot_test`** (Postgres_TG_Bots / hr_web_viewer) — штат, справочники, существующий **RBAC** и веб-логины. Так мы не смешиваем схемы и не дублируем «источник правды» по людям. -- **Сотрудник в процессах** (назначения, дашборды, доступ к результатам) — везде по **`staff_members.id`**. Ссылки в `clinic_tests` храним как **тот же идентификатор** (логическая связь с `staff_members` в `hr_bot_test`); **ФИО, отдел, роли** подтягиваем из HR при отображении или кэшируем по согласованной политике, а не ведём второй кадровый учёт. -- **`telegram_id`** в данных сотрудника **не участвует** в бизнес-логике модуля: ни вход, ни проверка прав, ни выбор сотрудника в сценариях, ни фильтрация — только **справочная** информация при необходимости (отображение, история). -- **RBAC в перспективе:** единая система разрешений — та, что уже в HR (роли, `staff_role_assignments`, permissions). Модуль тестирования **не** развивает отдельную полную копию матрицы; проверка действий в целевом виде — через **HR** (внутренний API / токен / согласованные запросы к БД). Пока договор и API не готовы — допустимы временные флаги в `clinic_tests`, явно помечаемые как MVP. - -Детализация задач и варианты A.x: [docs/revision_task/card1.md](docs/revision_task/card1.md). +> На текущем Flask-контуре (E1.0–E1.3, E1.8) проверяется только +> `@login_required`; разделение по ролям задействуется на E1.4–E1.5. --- ## Нефункциональные требования | Параметр | Значение | -|----------|----------| +|---|---| | Количество пользователей | 50–200 человек | -| Платформа | Веб-приложение, браузер (desktop-first) | +| Платформа | Веб, браузер; mobile-friendly | | Доступность | Внутренняя сеть клиники | | Язык интерфейса | Русский | | Время отклика | < 2 секунды | ---- +## Вне scope (в текущей версии не делаем) + +- Интеграция с AD / LDAP. +- Нативное мобильное приложение. +- Вопросы с вложениями (картинки, видео). +- Экспорт отчётов в Excel / PDF. +- Уведомления в MAX (отдельный спринт). -## Вне scope (не реализуется в данной версии) +--- -- Интеграция с AD/LDAP -- Мобильное приложение -- Вопросы с вложениями (изображения, видео) -- Экспорт отчётов в Excel / PDF -- Уведомления в MAX (отдельный спринт) +## Документация + +| Файл | О чём | +|---|---| +| [`docs/PROJECT_STATUS.md`](docs/PROJECT_STATUS.md) | Что работает «прямо сейчас», что в работе, что в бэклоге. | +| [`docs/migration-final.md`](docs/migration-final.md) | Главный трекер миграции: спринты Этапа 1, журнал, критерии готовности. | +| [`docs/migration-final-inventory.md`](docs/migration-final-inventory.md) | Карта 22 эндпоинтов Express + gap-analysis с `tgFlaskForm`. | +| [`docs/migration-to-tgflaskform.md`](docs/migration-to-tgflaskform.md) | План Этапа 2 (слияние с HR-кабинетом). | +| [`docs/QA-versioning-and-ai.md`](docs/QA-versioning-and-ai.md) | Инструкция для тестировщика — только через сайт. | +| [`docs/СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md`](docs/СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md) | Целевой мобильный UX редактора (база для E1.7). | +| [`docs/РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md`](docs/РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md) | Кратко для врачей-кураторов. | +| [`flask_app/README.md`](flask_app/README.md) | Конкретные команды для нового контура. | +| [`docs/ТЗ.md`](docs/ТЗ.md) | Исходное ТЗ заказчика. | diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c4233ca..14614ea 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -4,73 +4,67 @@ # База clinic_tests: один раз # psql "postgresql://hr_bot_user:hrbot123@localhost:5432/postgres" -c "CREATE DATABASE clinic_tests;" # -# Запуск: из каталога TestingWebApp -# docker compose -f docker-compose.dev.yml up --build -# UI (Node): http://localhost:3107 (Nginx: /api → backend:3001), API: http://localhost:3001 -# UI (Flask, новый контур): http://localhost:3108 +# Flask-only режим. Выбор варианта интерфейса через profile: +# COMPOSE_PROFILES=modern docker compose -f docker-compose.dev.yml up -d --build +# COMPOSE_PROFILES=legacy docker compose -f docker-compose.dev.yml up -d --build +# Оба варианта работают на одном Flask-стеке, отличаются только UI-раскладкой. +# UI (Flask modern): http://localhost:3108 +# UI (Flask legacy): http://localhost:3107 services: - testing-backend: + # Flask modern UI + testing-flask: + profiles: ["modern"] build: - context: ./backend + context: ./flask_app dockerfile: Dockerfile - container_name: testing_webapp_backend - # LLM и прочие секреты из хоста (не копируются в образ — см. .dockerignore) - env_file: - - ./backend/.env + container_name: testing_webapp_flask environment: - DATABASE_URL: postgresql://hr_bot_user:hrbot123@hr_postgres_dev:5432/clinic_tests - JWT_SECRET: ${JWT_SECRET:-testing_webapp_jwt_dev} - # development: httpOnly-cookie без Secure (иначе на http://localhost:3107 логин не сработает) - NODE_ENV: development - FRONTEND_URL: http://localhost:3107 - PORT: "3001" - # Вход теми же учётками, что в HR: проверка пароля в hr_bot_test + привязка сотрудника по web_login. - # Без HR_AUTH / HR_DATABASE_URL логин ищется только в clinic_tests.users (локальные dev-учётки). + PORT: "3108" + WEB_USE_WAITRESS: "1" + FLASK_DEBUG: "0" + SECRET_KEY: ${FLASK_SECRET_KEY:-testing_flask_dev_change_me} + # БД (clinic_tests) в общей сети hr_postgres_dev_net. + # По умолчанию используем те же dev-учётки, что и в backend-сервисе. + DATABASE_URL: ${DATABASE_URL:-postgresql+psycopg2://hr_bot_user:hrbot123@hr_postgres_dev:5432/clinic_tests} + # HR-аутентификация включена по умолчанию: + # пароль проверяется в hr_bot_test.users + staff по web_login. HR_AUTH: ${HR_AUTH:-1} - HR_DATABASE_URL: postgresql://hr_bot_user:hrbot123@hr_postgres_dev:5432/hr_bot_test - # Прямой доступ к API с хоста (Vite proxy в dev: см. frontend/vite.config.js) + HR_DATABASE_URL: ${HR_DATABASE_URL:-postgresql://hr_bot_user:hrbot123@hr_postgres_dev:5432/hr_bot_test} + UI_VARIANT: ${UI_VARIANT_MODERN:-modern} + # LLM (E1.2/E1.3/E1.8): один общий ключ, читается из .env проекта. + DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-} + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + LLM_BASE_URL: ${LLM_BASE_URL:-} + LLM_MODEL: ${LLM_MODEL:-} ports: - - "3001:3001" + - "3108:3108" networks: - app - postgres - testing-web: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: testing_webapp_nginx - depends_on: - - testing-backend - ports: - - "3107:80" - networks: - - app - - # Новый контур: Flask (тот же стек, что кабинет HR), отдельный порт - testing-flask: + # Flask legacy UI (старое расположение элементов на новом стеке) + testing-flask-legacy: + profiles: ["legacy"] build: context: ./flask_app dockerfile: Dockerfile - container_name: testing_webapp_flask + container_name: testing_webapp_flask_legacy environment: - PORT: "3108" + PORT: "3107" WEB_USE_WAITRESS: "1" FLASK_DEBUG: "0" SECRET_KEY: ${FLASK_SECRET_KEY:-testing_flask_dev_change_me} - # БД (clinic_tests). Хост postgres — в общей сети hr_postgres_dev_net. - DATABASE_URL: ${DATABASE_URL:-postgresql+psycopg2://app:app@postgres:5432/clinic_tests} - # Опц. HR-кабинет (E1.1): включается флагом + URL базы hr_bot_test. - HR_AUTH: ${HR_AUTH:-0} - HR_DATABASE_URL: ${HR_DATABASE_URL:-} - # LLM (E1.2/E1.3/E1.8): один общий ключ, читается из .env проекта. + DATABASE_URL: ${DATABASE_URL:-postgresql+psycopg2://hr_bot_user:hrbot123@hr_postgres_dev:5432/clinic_tests} + HR_AUTH: ${HR_AUTH:-1} + HR_DATABASE_URL: ${HR_DATABASE_URL:-postgresql://hr_bot_user:hrbot123@hr_postgres_dev:5432/hr_bot_test} + UI_VARIANT: ${UI_VARIANT_LEGACY:-legacy} DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-} OPENAI_API_KEY: ${OPENAI_API_KEY:-} LLM_BASE_URL: ${LLM_BASE_URL:-} LLM_MODEL: ${LLM_MODEL:-} ports: - - "3108:3108" + - "3107:3107" networks: - app - postgres diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index 54d9397..14216bf 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -1,78 +1,148 @@ -# Состояние проекта (человеческий обзор) +# Состояние проекта -**Репозиторий:** [TestingWebApp](https://git.pirogov.ai/l_konstantin/TestingWebApp) · ветка разработки: **`dev`** -**Дата среза:** 2026-04-24 +**Репозиторий:** [TestingWebApp](https://git.pirogov.ai/l_konstantin/TestingWebApp) · ветка разработки **`dev`** +**Прод:** **[https://edullm.pirogov.ai/](https://edullm.pirogov.ai/)** +**Дата среза:** 2026-04-28 -Этот документ — не дублирование ТЗ, а **короткое объяснение**, что уже работает в коде и что логично делать дальше. Подробные задачи: [revision_task/card1.md](revision_task/card1.md), [revision_task/BACKLOG.md](revision_task/BACKLOG.md). +Не дубль ТЗ, а карта «что реально работает в коде, на каком контуре, +и что логично сделать дальше». --- -## Что уже сделано (как это устроено) +## TL;DR -### Вход и роли +- Прод и dev работают **только на Flask-контуре** (`flask_app/`, + Python 3.11 + Flask 3 + Jinja2 + Tailwind CDN + SQLAlchemy). +- Каталоги `backend/` (Express) и `frontend/` (React) — архив, не + разворачиваются и не используются; удаление запланировано в + спринте **E1.6**. +- БД — **`clinic_tests`** (PostgreSQL). Схема в Этапе 1 не меняется. +- Этап 2 (слияние с `HR_TG_Bot/tgFlaskForm`) пока не делаем — + [`migration-to-tgflaskform.md`](migration-to-tgflaskform.md). -- Сотрудник входит по **логину и паролю** (сессия через cookie + JWT). -- В шапке показываются **роль** и **Фамилия с инициалами** (например, *Иванов И. О.*), полное ФИО — во всплывающей подсказке. -- В **режиме разработки** (`NODE_ENV=development`) у удобного тестирования могут быть дополнительные кнопки (например, создание теста сотрудником — `devUi` в ответе `/api/auth/me`). +Главный трекер по спринтам — [`migration-final.md`](migration-final.md). -### «Цепочка» теста и черновики +--- -- У каждого теста есть **одна логическая цепочка** в базе: все правки вопросов относятся к ней, но **версия контента** (`v1`, `v2`, …) может расти. -- **Пока никто не проходил** этот тест — автор правит **на месте**: сохраняет черновик, и меняется текущая активная версия **без** лишнего дублирования строк в истории. -- **Как только по цепочке появилась хотя бы одна завершённая попытка** — каждое **содержательное** сохранение с изменениями создаёт **новую версию** (новый номер, старая остаётся в истории). Старые результаты остаются привязаны к **той** версии, с которой человек реально отвечал. -- **Активная версия** — та, с которой сейчас стартуют новые попытки. Автор может **вручную** переключить активную версию в таблице истории (с подтверждением), если бизнесу так нужно. -- **Публикация / видимость:** в кабинете (аккордеон **«Показ в каталоге»**, подсекция **«Видимость»**) тест можно **скрыть из общего списка** (цепочка остаётся в базе) или **снова показать**; **назначения** (подсекция **«Кому выдать»**) — при включённой фиче, см. раздел «Назначения» ниже. -- **Мобильный UI** кабинета (колонка списка на узком экране, фикс-футер, группировка разделов, копи): [СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md) · [РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md) (тезисы для врачей/кураторов). -- **Унификация стека (Этап 1, текущий)**: Express → Flask + React → Jinja **внутри TestingWebApp** (`flask_app/`). БД остаётся `clinic_tests`, схема не меняется. План и журнал — [migration-final.md](migration-final.md). -- **Слияние с HR-кабинетом (Этап 2, на будущее, без сроков)**: перенос в `HR_TG_Bot/tgFlaskForm` как blueprint `cabinet/testing`, ETL `clinic_tests → hr_bot_test`. План — [migration-to-tgflaskform.md](migration-to-tgflaskform.md). Карта Express-функционала и справочный gap-analysis с уже существующим модулем HR-кабинета — [migration-final-inventory.md](migration-final-inventory.md). +## Что уже работает на новом контуре (E1.0–E1.3, E1.8) + +### Вход +- `/login` (форма) и `/api/auth/login` (JSON), `/api/auth/logout`, + `/api/auth/me`. +- По умолчанию — bcrypt-хеши из `clinic_tests.users`. +- `HR_AUTH=1` + `HR_DATABASE_URL` — вход через `hr_bot_test.users` + (Werkzeug); запись синхронизируется в `clinic_tests.users` UPSERT-ом по + `staff_id`. Сценарий «пользователь без `staff_id`» — пропускается с + предупреждением в логах. + +### Каталог тестов (`/tests`) +- Видны цепочки, где вы автор, и активные публичные. +- Создание теста через модалку («Название» + «Описание»). +- Кнопка «Скрыть» / «Вернуть» работает на цепочку целиком. + +### Редактор теста (`/tests//edit`) +- Поля шапки: название, описание, проходной балл, переключатель + «Цепочка активна». +- Вопросы и варианты: добавить / удалить / переместить, отметить верные. +- **Версионирование.** Пока по цепочке нет завершённых попыток — + правки идут «на месте». После первой попытки любое содержательное + сохранение делает форк (`version + 1`, `parent_id` = прежняя), + старая версия остаётся в БД и не видна в каталоге. +- Подробная модель поведения и проверочные сценарии — + [`QA-versioning-and-ai.md`](QA-versioning-and-ai.md). + +### AI-помощник в редакторе +| Кнопка | Что делает | +|---|---| +| По названию | Генерирует весь набор вопросов по теме. Параметры — кол-во вопросов и вариантов. | +| По текущей сетке | Дописывает варианты для уже расставленных карточек. | +| Проверить | Рецензирует тест: вердикт + блоки рекомендаций. | +| Улучшить | «Было → стало» по каждому вопросу/варианту с чекбоксами. | +| AI: вопрос | На карточке вопроса — переформулировка / генерация дистракторов. | + +При отсутствии ключа — единая ошибка с ссылкой на `/settings`. + +### Импорт документа +- PDF / DOCX / TXT / MD до 16 МБ. +- `pypdf` для PDF, `python-docx` для DOCX, плоский текст — как есть. +- Извлечённый текст идёт в LLM, на выходе — черновик теста, который + открывается в редакторе. + +### Настройки (`/settings`) +- Статус общего LLM-ключа (берётся из ENV: `DEEPSEEK_API_KEY` → + `OPENAI_API_KEY`). +- Провайдер, модель, base URL. +- Кнопка «Проверить подключение» — пинг `/v1/chat/completions` через + `ping_llm()`. +- Ключ на клиента не уходит и в БД не пишется. -### Список тестов и доступ +--- -- В каталоге **«Тесты»** видны цепочки, где вы **автор**, и тесты, **назначенные вам** (через назначение на пользователя; в dev назначения обычно **включены**). -- Под названием показывается **«Автор: Вы»** для своих тестов и **«Автор: Фамилия И. О.»** для чужих (назначенных). -- **Пройти** тест — кнопка **справа** в строке; **карточка** теста — клик по названию **слева** (попытка с карточки не стартует сама). +## Чего на Flask пока нет -### Прохождение и результат +Эти сценарии будут реализованы в E1.4–E1.5. До этого в приложении они +просто отсутствуют (старый Express-контур не используется и не +поднимается): -- Открывается экран вопросов (один или несколько верных вариантов); после **«Завершить тест»** — итог: сколько верно, процент, **зачёт** по порогу. -- **Разбор:** после сдачи показывается, по **каждому вопросу**, что выбрал пользователь и какие варианты верны. Отдельная страница разбора доступна по ссылке; **автор** в аккордеоне **«История»** (подсекция **«Прохождения»**) видит **завершённые** попытки и кнопку **«Разбор»** (раньше секция называлась **«Прогоны и разбор»**). +- **Назначение теста сотруднику** — поиск по справочнику, «Выбрать + всех», фильтры по подразделениям. +- **Прохождение** — экран вопросов, таймер, сохранение попытки. +- **Результат и разбор ошибок** — отдельная страница с ответами + пользователя и правильными вариантами. +- **Трекер попыток** — единый список завершённых попыток с фильтрами + (подразделение / сотрудник / тест / статус / результат). -### Импорт и ИИ (MVP) +--- -- Можно загрузить **файл** (PDF, DOCX, текст): сервер **извлекает текст** и при настроенном ключе **LLM** (например, `DEEPSEEK_API_KEY` / `OPENAI_API_KEY` в окружении) предлагает **черновик** вопросов. В UI: подсекция **«Документ в вопросы»** внутри **«Вопросы»** (раньше — отдельный блок «Импорт из файла»). Дальше тот же поток, что и при ручном редактировании: правки → **сохранить черновик** (с учётом правил версий выше). -- **Полный** набор сценариев из ТЗ (отдельная страница настроек ключа, «проверить тест целиком», модалки с чекбоксами и т.д.) — в [sprint-02](revision_task/sprint-02.md); часть уже заложена в сервисах, UI доводится. +## Что в работе и в планах -### Назначения (MVP) +### Этап 1 — паритет внутри TestingWebApp -- **Автор** в **«Показ в каталоге»** → **«Кому выдать»** может **назначить** сотрудников из справочника (поиск, фильтры, **«Выбрать всех»** в текущем списке; в dev — при включённой фиче в `docker-compose` / `.env`). Назначение **не** перепривязывается автоматически к каждой новой версии контента: **старт попытки** всегда берёт **текущую активную** версию на момент нажатия **«Пройти»**. +| Спринт | Содержание | Статус | +|---|---|---| +| E1.0 | База Flask-приложения (БД-пул, сессии, `base.html`). | ✅ | +| E1.1 | Auth + `/api/me` (bcrypt + Werkzeug, опц. `HR_AUTH`). | ✅ | +| E1.2 | Каталог тестов и редактор (функциональный минимум). | ✅ | +| E1.3 | Импорт документов (PDF / DOCX / TXT / MD). | ✅ | +| E1.4 | Назначения и прохождение тестов. | ⬜ Следующий. | +| E1.5 | Трекер попыток + страница настроек цепочки. | ⬜ | +| E1.6 | Cutover внутри репозитория (удаление `backend/` + `frontend/`). | ⬜ | +| E1.7 | UX-полировка редактора: 4 аккордеона + drag-n-drop. | ⬜ | +| E1.8 | AI-функции v2 (`/settings`, generate-by-title, check, improve). | ✅ | -### Интеграция с HR (в зачатке) +Подробности — [`migration-final.md`](migration-final.md). -- Поддержан сценарий **входа через учётки HR** (`HR_AUTH` + `HR_DATABASE_URL`) для проверок на одном кластере Postgres с экосистемой `Postgres_TG_Bots` (см. [README — установка](../README.md)). -- Целевой **RBAC** из HR-таблиц — [card1, часть A](revision_task/card1.md#часть-a--авторизация-по-паролю-бд-postgres_tg_bots); сейчас — упрощённое сопоставление ролей. +### Этап 2 — слияние с HR-кабинетом (на будущее) ---- +- Перенос blueprint'ом в `HR_TG_Bot/tgFlaskForm` под путь + `/cabinet/testing`. +- ETL `clinic_tests → hr_bot_test`. Скрипт-заготовка: + [`HR_TG_Bot/tgFlaskForm/tools/migrate_clinic_tests_to_hr.py`](../../HR_TG_Bot/tgFlaskForm/tools/migrate_clinic_tests_to_hr.py) + (`--dry-run` / `--apply`). +- Авторизация — через сессию HR-кабинета. +- Подробности и риски — [`migration-to-tgflaskform.md`](migration-to-tgflaskform.md) + (и [простыми словами](migration-to-tgflaskform-plain.md)). -## Что в планах (логичный следующий слой) +### Долгий бэклог | Направление | Суть | -|-------------|------| -| **AI по ТЗ §4.2** | Ключ в настройках (не на клиенте), кнопки «сгенерировать/проверить/улучшить» с превью и подтверждением, регресс с версиями. | -| **Дашборды (ТЗ этап 2)** | Единая картина по отделу / клинике, фильтры, история. | -| **MAX / мини-приложение** | Встраивание в общий HR-контур клиники. | -| **Таймер, подсказки, медиа в вопросах** | Режимы прохождения и вложения — отдельные этапы ТЗ. | -| **E2E и интеграционные тесты** | Расширение `V.9`, стабильный CI. | -| **Назначения** | Сроки, лимит попыток, назначения «по отделу» (частично в бэклоге [BACKLOG_IDEAS](revision_task/BACKLOG_IDEAS.md)). | - -Журнал приёмок и чек-листы: [TESTING_JOURNAL.md](revision_task/TESTING_JOURNAL.md). +|---|---| +| Дашборды (ТЗ этап 2) | Единая картина по отделу / клинике, фильтры, история. | +| MAX / мини-приложение | Встраивание в общий HR-контур клиники. | +| Таймер, подсказки, медиа в вопросах | Режимы прохождения и вложения — отдельные этапы ТЗ. | +| E2E и интеграционные тесты | Расширение `V.9`, стабильный CI. | +| Назначения по отделу | Сроки, лимит попыток, групповые назначения. | --- -## Связанные файлы - -- [Руководство пользователя dev-контура](DEV_CONTOUR_USER_GUIDE.md) -- [Руководство кабинета (простыми словами)](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md) -- [Спринты: мобильный UI](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md) -- [Предложение по дизайну (ист. + актуализация)](ПРЕДЛОЖЕНИЕ_ДИЗАЙН_СОЗДАНИЕ_ТЕСТА.md) -- [README с установкой](../README.md) -- [Карта задач card1](revision_task/card1.md) +## Связанные документы + +- [README репозитория](../README.md) +- [Главный трекер миграции — `migration-final.md`](migration-final.md) +- [Карта Express + gap-analysis с `tgFlaskForm` — `migration-final-inventory.md`](migration-final-inventory.md) +- [План Этапа 2 — `migration-to-tgflaskform.md`](migration-to-tgflaskform.md) +- [Инструкция тестировщику — `QA-versioning-and-ai.md`](QA-versioning-and-ai.md) +- [Спринты мобильного UX редактора](СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md) +- [Кратко для врачей-кураторов](РУКОВОДСТВО_КАБИНЕТ_ТЕСТОВ.md) +- [Руководство по dev-контуру](DEV_CONTOUR_USER_GUIDE.md) +- [ТЗ заказчика](ТЗ.md) diff --git a/docs/UX_аудит_и_новая_IA_—_страница_теста.md b/docs/UX_аудит_и_новая_IA_—_страница_теста.md new file mode 100644 index 0000000..d59e45a --- /dev/null +++ b/docs/UX_аудит_и_новая_IA_—_страница_теста.md @@ -0,0 +1,340 @@ +# UX-аудит страницы теста и предложение новой информационной архитектуры + +**Продукт:** HR system — модуль тестирования +**Платформа:** Цифровые сервисы клиники им. Е. Н. Оленевой +**Объект анализа:** страница `/tests/{id}` — создание/редактирование теста +**Дата:** 29 апреля 2026 + +--- + +## Краткая сводка + +Текущая страница `/tests/{id}` совмещает три разные пользовательские задачи в одном экране: + +1. **Авторскую** — придумать и оформить тест (название, описание, вопросы, варианты). +2. **Управленческую** — назначить тест 1–N сотрудникам. +3. **Аналитическую** — посмотреть, кто из сотрудников и какие версии проходил. + +Эти задачи различаются по ролям, частоте, объёму данных и контексту. Сейчас они смешаны в одном длинном аккордеоне, что приводит к ряду проблем — от потери изменений до невозможности масштабировать список аудитории за пределы 100–200 человек. + +Документ состоит из двух частей: + +- **Часть 1** — аудит текущей страницы с приоритизированными проблемами (critical / major / minor) и ссылками на скриншоты. +- **Часть 2** — предложение новой IA с раздельными разделами «Тесты», «Назначения», «Отчёты», ролевой моделью и описанием жизненного цикла версии теста. + +--- + +# Часть 1. Аудит текущей страницы + +Все скриншоты сделаны 29.04.2026 на странице `https://edullm.pirogov.ai/tests/298a64af-...` под ролью `employee` (см. п. M-3). + +## 1.1. Шапка, заголовок и баннер версионирования + +![Шапка и баннер](screens/01_header_intro.jpg) + +Что мы видим: глобальная шапка «Тестирование», подпись пользователя `Разорвин А. М. · employee`, кнопка «Выйти». Ниже — хлебная крошка «← к списку», название теста, автор, дата обновления, **жёлтый баннер «При сохранении будет создана новая версия теста.»** и схлопнутый аккордеон «О тесте». + +Замечания: + +- **C-1 [critical] Баннер о новой версии показывается ВСЕГДА**, независимо от того, изменил ли пользователь хоть что-то. Это сбивает с толку: автор открывает существующий тест, ничего не трогает — и думает, что версия уже создана. Должен показываться только при наличии несохранённых изменений (dirty state). +- **m-2 [minor] Роль `employee` написана по-английски** в шапке. В русском интерфейсе должно быть «сотрудник» / «автор» / другое (см. ролевую модель в Части 2). +- **m-3 [minor] Опечатка** в `` вкладки: «Система тестирования» (нет «и»). Влияет на закладки, историю, поиск. + +--- + +## 1.2. Секция «О тесте» + +![О тесте раскрытый](screens/02_about_test.jpg) + +Замечания: + +- **M-1 [major] Аккордеон по умолчанию схлопнут.** Чтобы начать редактировать главный объект страницы (вопросы), нужно сделать лишний клик. На странице редактирования теста раздел «Вопросы» (а возможно, и «О тесте») должен быть открыт по умолчанию. +- **M-2 [major] Поле «Порог зачёта, %» не имеет валидации min/max.** Что произойдёт при вводе 0, 100, 150, –5, 70.5, или вообще буквы? Минимум: подсказка «от 1 до 100», атрибуты `min/max/step` на input, инлайн-ошибка при некорректном вводе. + +--- + +## 1.3. Раздел «Вопросы» — генерация и Вопрос 1 + +![Генерация и Вопрос 1](screens/03_questions_top.jpg) + +Что мы видим: блок **«Генерация сетки вопросов (ИИ)»** с полями «Тема», «Вопросов: 7», «Вариантов: 3» и кнопкой «Сгенерировать тест (ИИ)». Ниже — Вопрос 1 с собственной кнопкой «Сгенерировать вопрос (ИИ)» в правом верхнем углу, чекбоксом «Несколько верных ответов», тремя вариантами с радиокнопками и крестиками «удалить». + +Замечания: + +- **C-2 [critical] ИИ-генерация без подтверждения и без отображения хода работы.** Кнопка «Сгенерировать тест (ИИ)» одной нажатием перезаписывает существующие вопросы — а они уже могут быть наполовину написаны вручную. То же касается кнопки «Сгенерировать вопрос (ИИ)» рядом с уже заполненным вопросом. + - Нужно: confirm-диалог «Заменить текущие N вопросов?», индикатор прогресса генерации, возможность откатить (undo) последний результат генерации. +- **M-3 [major] Чекбокс «Несколько верных ответов» меняет семантику варианта без явного намёка.** Когда выкл — радиокнопки (один верный), когда вкл — должны стать чекбоксами (несколько). Лучше переписать подпись в зависимости от состояния: «один верный» / «несколько верных», и/или показать рядом подсказку, как изменится контрол. + +--- + +## 1.4. Вопросы 3–5 + +![Вопросы 3-5](screens/04_questions_mid.jpg) + +Замечания: + +- **M-4 [major] Нет нумерации/перетаскивания вопросов.** «Вопрос 1, 2, 3…» — порядок фиксирован тем, в каком порядке добавляли. Для длинных тестов нужен drag-handle или хотя бы стрелки «вверх / вниз». +- **M-5 [major] «Удалить вопрос» без подтверждения.** Случайный клик уничтожит написанный вопрос. Минимум — confirm-диалог; лучше — undo-toast «Вопрос удалён · Отменить». +- **m-4 [minor] Маленькая видимая «вода» между вопросами.** Карточки вопросов мало отделены друг от друга визуально, при пролистывании они сливаются в стену форм. Стоит увеличить вертикальный отступ между карточками или добавить разделитель. + +--- + +## 1.5. Вопрос 7 — обрыв длинного варианта + +![Q7 с обрезанным вариантом + загрузка файла](screens/05_questions_bottom.jpg) + +Это один из самых наглядных багов: + +- **M-6 [major] Длинный текст варианта обрезается.** В Q7 первый вариант отображается как «Максимальное количество токенов, которое модель может о…» — текст уходит за правый край однострочного `<input>`. Для содержательных тестов (особенно медицинских) ответы часто длинные. Нужно: либо `<textarea>` с автовысотой, либо горизонтальный скролл с tooltip всего текста на ховере. +- **m-5 [minor] Загрузка файла «Документ в вопросы» — без drag-and-drop, без ограничений по размеру/формату на UI, без обратной связи.** Подсказка «PDF, Word или текст — вставьте в черновик вопросов» — хорошая по-человечески, но не объясняет, что произойдёт после загрузки: заменит ли существующие вопросы, добавит ли в конец, есть ли превью результата. + +--- + +## 1.6. Кнопка «Сохранить черновик» в середине + История + +![Сохранить + История](screens/06_save_history.jpg) + +Здесь главная архитектурная проблема страницы: + +- **C-3 [critical] Кнопка «Сохранить черновик» расположена в середине страницы.** Сразу после неё ниже идут ещё две большие секции — «История» и «Показ в каталоге». Пользователь, открывший «Показ в каталоге» и поменявший там аудиторию, психологически ищет «Сохранить» внизу страницы — но там его нет. Очень высокий риск потерять изменения. + - Решения, любое или все: (а) sticky-панель сохранения внизу страницы; (б) дубль кнопки после последней секции; (в) автосохранение черновика; (г) предупреждение перед уходом со страницы при наличии несохранённых изменений. +- **M-7 [major] Раздел «Прохождения» показывает сырые ENUM-значения.** Видно `v1 · in_progress` — это техническое значение, а не пользовательский текст. Должно быть «в процессе» / «пройдено» / «не пройдено», лучше с цветной плашкой-индикатором. +- **M-8 [major] Дубль кнопки «К списку».** Хлебная крошка «← к списку» наверху + кнопка «К списку» рядом с «Сохранить черновик» — две точки выхода с разным визуальным весом. Кнопка справа от primary-кнопки создаёт ложное ощущение симметричности с действием. Оставить либо крошку, либо превратить вторую кнопку в текстовую ссылку «Отмена». + +--- + +## 1.7. «Показ в каталоге» — Видимость и фильтры + +![Видимость](screens/07_catalog_visibility.jpg) + +- **M-9 [major] Контрол «Видимость» неясен по текущему состоянию.** Кнопка «Скрыть из списка» — это сейчас действие или текущее состояние? Если тест уже скрыт — кнопка должна называться «Показать в списке». Лучше — переключатель (toggle/switch) с подписью «Тест виден в каталоге», чтобы текущее состояние читалось без действий. +- **m-6 [minor] Поле поиска и два селекта** «Все отделы» / «Все» расположены без подписей — что делает второй селект, без раскрытия не понятно. Нужны явные label или persistent placeholder. + +--- + +## 1.8. Список «Кому выдать» — 147 сотрудников + +![Список сотрудников](screens/08_catalog_employees.jpg) + +Этот блок — корень главной IA-проблемы (см. Часть 2): + +- **C-4 [critical] Назначение тестов не должно жить на странице теста.** Это управленческая задача отдельной роли (HR-менеджер, руководитель отделения), а не авторская. Подробно — в Часть 2. +- **M-10 [major] Список из 147 человек без виртуализации и счётчика выбранных.** Нужно как минимум: счётчик «выбрано N из 147», фильтр «только выбранные», сохранение выбранного при изменении фильтра, виртуальный скролл (на 1000+ сотрудников страница встанет колом). +- **M-11 [major] «Назначить выбранных» внутри контейнера списка.** Кнопка стоит на нижней границе скролл-контейнера — её очень легко не заметить. И непонятно: «Назначить» — это отдельное действие или часть общего «Сохранить черновик» наверху? +- **m-7 [minor] Подпись «нет учётки (создадим при назначении)»** — хорошая идея (ленивая выдача учёток), но требует пояснения: что значит «при назначении», что получит сотрудник после, как ему придёт первый пароль. + +--- + +## 1.9. Сводная таблица замечаний + +| ID | Приоритет | Что | Место | +|---|---|---|---| +| C-1 | critical | Баннер «новая версия» виден всегда, не только при изменениях | 1.1 | +| C-2 | critical | ИИ-генерация без confirm и без прогресса | 1.3 | +| C-3 | critical | Кнопка «Сохранить» в середине страницы | 1.6 | +| C-4 | critical | Назначение сотрудников не должно жить на странице теста | 1.8 | +| M-1 | major | Аккордеоны схлопнуты по умолчанию, включая «Вопросы» | 1.2 | +| M-2 | major | «Порог зачёта» без валидации min/max | 1.2 | +| M-3 | major | Чекбокс «Несколько верных» меняет семантику без подсказки | 1.3 | +| M-4 | major | Нет переупорядочивания вопросов | 1.4 | +| M-5 | major | «Удалить вопрос» без подтверждения и undo | 1.4 | +| M-6 | major | Длинный текст варианта ответа обрезается | 1.5 | +| M-7 | major | Сырые ENUM-значения в статусах прохождений | 1.6 | +| M-8 | major | Дубль точек выхода («← к списку» + «К списку») | 1.6 | +| M-9 | major | Контрол «Видимость» неясен по состоянию | 1.7 | +| M-10 | major | Список 147 сотрудников без виртуализации/счётчиков | 1.8 | +| M-11 | major | «Назначить выбранных» теряется внутри контейнера | 1.8 | +| m-1 | minor | Логотип на странице логина обрезан | вне скрина | +| m-2 | minor | Роль `employee` латиницей в шапке | 1.1 | +| m-3 | minor | Опечатка «тестирования» в `<title>` | 1.1 | +| m-4 | minor | Карточки вопросов слабо отделены друг от друга | 1.4 | +| m-5 | minor | Загрузка файла без drag-and-drop и описания результата | 1.5 | +| m-6 | minor | Селекты в фильтрах без явных label | 1.7 | +| m-7 | minor | «Нет учётки (создадим при назначении)» — нужно пояснение | 1.8 | + +Не проверено и стоит протестировать отдельно: валидация при сохранении пустого вопроса/вариантов, мобильная вёрстка, клавиатурная навигация и focus ring, контрастность по WCAG 2.2, поведение под другими ролями (руководитель, HR, директор). + +--- + +# Часть 2. Предлагаемая новая IA + +## 2.1. Что не так с текущей IA + +Сейчас одна страница `/tests/{id}` решает три разные задачи разных ролей: + +| Задача | Кто делает | Как часто | Какие данные | +|---|---|---|---| +| Сочинить тест | автор / методолог | один раз при создании, далее редко | вопросы, варианты, порог | +| Назначить кому проходить | автор (иногда) или HR / руководитель | каждый раз для нового сотрудника или потока | список из 100–10 000 сотрудников, фильтры | +| Посмотреть кто прошёл | руководитель / HR / директор | регулярно | результаты, динамика, агрегаты | + +Это три разных пользовательских ритма, три разных набора фильтров, три разных уровня доступа. Складывать их в один аккордеон — экономия на маршрутизации и проигрыш во всём остальном (см. C-3, C-4, M-9, M-10, M-11). + +## 2.2. Карта разделов после редизайна + +``` +HR system (модуль «Тестирование») +│ +├── Главная / Дашборд +│ сводка: «назначено N тестов, X% прошли, Y просрочены» +│ (вид зависит от роли — см. 2.4) +│ +├── Тесты +│ ├── Каталог тестов ← список, поиск, фильтры +│ ├── Создать тест ← минимальный wizard: название → пустой черновик +│ └── /tests/{id} ← страница теста +│ ├── Просмотр ← все, у кого есть доступ +│ │ краткая сводка прохождений (89 / 147, средний 6.2/7) +│ │ кнопка «Назначить» (открывает модалку из 2.3) +│ │ кнопка «Редактировать» (если есть права) +│ └── Редактирование ← только автор / методолог +│ ├── О тесте +│ ├── Вопросы +│ └── Версии теста ← (вместо «История» — только версии) +│ +├── Назначения ← новый раздел +│ ├── Список назначений ← таблица «тест × сотрудник × срок × статус» +│ ├── Создать назначение ← массовый wizard (см. 2.3) +│ └── /assignments/{id} ← страница назначения, где можно отозвать, +│ продлить срок, посмотреть прогресс +│ +├── Отчёты ← новый раздел +│ ├── По тесту ← кто прошёл, средний балл, кривые +│ ├── По сотруднику ← все тесты сотрудника, история +│ └── По отделу ← агрегаты для руководителей +│ +├── Сотрудники ← справочник, синхронизация с кадрами +│ +└── Настройки ← роли, подразделения, шаблоны уведомлений +``` + +## 2.3. Сценарий «Назначить тест» через модалку + +Поскольку автор иногда сам назначает тест, а иногда передаёт это HR/руководителю, кнопка «Назначить» нужна **в двух местах**: + +- На странице теста (для автора, который сразу выдаёт тест). +- В разделе «Назначения → Создать» (для HR/руководителя, который отбирает аудиторию массово). + +Обе точки открывают **одну и ту же модалку / визард** с шагами: + +1. **Кому.** Сначала фильтры по отделу/должности → одной кнопкой «Все из отделения хирургии (38)» или вручную чекбоксами. Сохранение выбранного при смене фильтра. Виртуализированный список. +2. **Когда.** Дедлайн, опционально дата старта (например, новый сотрудник получает тест на 3-й рабочий день). +3. **Параметры.** Сколько попыток допустимо, нужен ли пересдача после неуспеха, кому уведомления о результате. +4. **Подтверждение.** «Назначить тест „Введение про LLM v1“ 38 сотрудникам отделения хирургии до 15 мая 2026 — назначить?» + +После назначения автор/HR попадает на страницу созданного назначения, где видит прогресс: кто открыл, кто проходит, кто завершил. + +## 2.4. Ролевая модель и матрица доступа + +Четыре роли из ваших пояснений: **сотрудник**, **руководитель подразделения**, **HR-менеджер**, **директор**. Плюс отдельно — **методолог/автор**, которая может присваиваться поверх любой из роли (директор, HR или руководитель могут также быть авторами). + +| Раздел / действие | Сотрудник | Рук. подр. | HR | Директор | Автор | +|---|---|---|---|---|---| +| Главная | свои назначения | свой отдел | вся клиника | вся клиника | свои тесты | +| Каталог тестов — просмотр | да (только видимые) | да | да | да | да | +| Создать тест | — | — | да | да | да | +| Редактировать тест | — | — | (свои) | да | свои | +| Опубликовать новую версию | — | — | (свои) | да | свои | +| Удалить/архивировать тест | — | — | (свои) | да | свои | +| Назначить тест | — | свой отдел | вся клиника | вся клиника | (если сам назначает) | +| Отозвать назначение | — | свои | свои + HR-уровня | все | свои | +| Отчёты по сотруднику | свои | подчинённые | все | все | свои тесты | +| Отчёты по отделу | — | свой отдел | все | все | — | +| Настройки ролей | — | — | да | да | — | + +«—» — действие не доступно. Точные границы (например, может ли HR редактировать чужой тест) уточняются на этапе требований. + +## 2.5. Жизненный цикл версии теста и поведение при активных прохождениях + +Версионирование уже сделано правильно — оно фиксирует, какую именно версию проходил сотрудник, и не ломает прошлые результаты. Но в UI нужно явно показать состояния и поведение при апдейте. + +``` + ┌──────────┐ + │ Черновик │ ← автор может править свободно, + └────┬─────┘ назначения нельзя выдать + │ + «Опубликовать как v2» + │ + ▼ + ┌──────────┐ + │ Активная │ ← новые назначения идут на эту версию; + └────┬─────┘ уже идущие прохождения остаются на старой + │ + «Опубликовать как v3» + │ + ▼ + ┌──────────┐ + │ Архив │ ← новые назначения нельзя; старые + └──────────┘ прохождения видны в отчётах +``` + +Что должно быть видно в UI: + +- **Бейдж версии** рядом с названием теста: `Введение про LLM · v2 (активна)`. +- **На странице редактирования** — явно: «Редактируется черновик v3 на основе активной v2». +- **При публикации новой версии** — диалог: «Сейчас тест проходят 12 сотрудников на v2. Они закончат на v2; новые назначения пойдут на v3. Опубликовать v3?» +- **В отчётах** — фильтр по версии теста. +- **В назначении** — версия зафиксирована: «Назначен на тесте Введение про LLM v2». + +## 2.6. Состояние «черновик» страницы теста + +Сейчас единственная кнопка — «Сохранить черновик». Лучше добавить два глагола: + +- **«Сохранить черновик»** — сохранить промежуточно, не публиковать. Не создаёт новой версии. +- **«Опубликовать как новую версию»** — фиксирует версию, делает её активной, открывает диалог из 2.5. + +Тогда жёлтый баннер из C-1 превращается в осмысленную подсказку: он показывается **только при наличии несохранённых изменений** и говорит «Чтобы изменения попали в назначения — опубликуйте новую версию». + +--- + +# Часть 3. Чеклист изменений + +Разбит на три волны по приоритету и независимости работ. + +## Волна 1 — быстрые правки на текущей странице (1–2 спринта) + +Не требуют структурных изменений, можно делать параллельно с разработкой новой IA: + +- [ ] **C-1** Скрыть баннер версионирования при отсутствии изменений (dirty state). +- [ ] **C-2** Confirm-диалог + прогресс для ИИ-генерации, undo последнего результата. +- [ ] **C-3** Sticky-панель «Сохранить» внизу + предупреждение `beforeunload` при unsaved changes. +- [ ] **M-1** Аккордеон «Вопросы» открыт по умолчанию. +- [ ] **M-2** Валидация порога зачёта (1–100, целое число). +- [ ] **M-3** Поясняющий текст для «Несколько верных ответов». +- [ ] **M-5** Confirm + undo для «Удалить вопрос». +- [ ] **M-6** Длинные варианты — `textarea` с автовысотой. +- [ ] **M-7** Перевод ENUM-значений статусов прохождения. +- [ ] **M-9** Toggle-switch для «Видимость» вместо одной кнопки. +- [ ] **m-1, m-2, m-3** Косметика: логотип логина, роль, опечатка title. + +## Волна 2 — выделение разделов (новая IA) + +- [ ] Выделить раздел «Назначения» с собственной таблицей и фильтрами. +- [ ] Перенести «Кому выдать» со страницы теста в модалку «Назначить» из 2.3. +- [ ] Выделить раздел «Отчёты» из секции «История», расширить фильтрами и агрегатами. +- [ ] Реализовать ролевую модель из 2.4 (RBAC): меню, разделы и действия зависят от роли. +- [ ] Реализовать жизненный цикл версии (2.5) и явную публикацию. + +## Волна 3 — масштабирование и качество + +- [ ] Виртуализация списков сотрудников (поддержка 5 000+). +- [ ] Drag-and-drop для перестановки вопросов (M-4). +- [ ] Drag-and-drop загрузка файла с превью результата (m-5). +- [ ] Аудит доступности (WCAG 2.2 AA): клавиатурная навигация, focus-ring, контрастность. +- [ ] Адаптивная вёрстка для мобильных и планшетов. +- [ ] Уведомления (e-mail, в системе) для назначений, дедлайнов, результатов. +- [ ] Связка с курсами/треками (когда появятся). + +--- + +# Что дальше + +После согласования этого документа имеет смысл: + +1. Сделать кликабельный прототип в Figma на 2 ключевых сценария: «автор создаёт и сразу назначает тест», «HR назначает существующий тест 200 сотрудникам». Это покажет, как именно ложится новая IA на реальные действия и где остались дыры. +2. Прогнать прототип на 2–3 пользователях каждой роли (автор, HR, руководитель) — модерируемое юзабилити-тестирование на 30–40 минут. По итогам — финальные правки до старта разработки. +3. Параллельно запустить Волну 1 — она независима от IA и сразу снимает большую часть пользовательской боли. + +--- + +*Если по какому-то пункту нужно больше деталей или хочется, чтобы я подготовил визард-сценарий «Назначить» в виде последовательных макетов — скажите.* diff --git a/docs/screens/01_header_intro.jpg b/docs/screens/01_header_intro.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0c02388313c6a02aee12b83fc5a887c7a4045e5 GIT binary patch literal 29786 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 literal 0 HcmV?d00001 diff --git a/docs/screens/02_about_test.jpg b/docs/screens/02_about_test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9011ac472f11c4b93659806dfea70a492b5d6938 GIT binary patch literal 19613 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 TpN{@(Tw~wAe|Jd8PS5`b0*GAO literal 0 HcmV?d00001 diff --git a/docs/screens/03_questions_top.jpg b/docs/screens/03_questions_top.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4b09ca68ea7f8c5b722aad5c17984e009a91483 GIT binary patch literal 52474 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 literal 0 HcmV?d00001 diff --git a/docs/screens/04_questions_mid.jpg b/docs/screens/04_questions_mid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..244db73ce3dee596b6d158e81619723c90642f1a GIT binary patch literal 52342 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 Oaeep~$r5&a9r`EcF54&o literal 0 HcmV?d00001 diff --git a/docs/screens/05_questions_bottom.jpg b/docs/screens/05_questions_bottom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab166f6313d88fc7d8babda2f05c0eacb2697fea GIT binary patch literal 38132 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 literal 0 HcmV?d00001 diff --git a/docs/screens/06_save_history.jpg b/docs/screens/06_save_history.jpg new file mode 100644 index 0000000000000000000000000000000000000000..189184db38ebc870ee239e3a8fc414d7dc185be3 GIT binary patch literal 25250 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 W>{1s@6@;8*08JP~PYu=ozX<@k<IP3@ literal 0 HcmV?d00001 diff --git a/docs/screens/07_catalog_visibility.jpg b/docs/screens/07_catalog_visibility.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3c09ebface9cef93c3eac1acdee67c04b9600c6 GIT binary patch literal 22942 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 I*#Ex?02e0Yw*UYD literal 0 HcmV?d00001 diff --git a/docs/screens/08_catalog_employees.jpg b/docs/screens/08_catalog_employees.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be9a543980d1812119ac3086e0e99debc6956039 GIT binary patch literal 21370 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 literal 0 HcmV?d00001 diff --git a/docs/Рекомендации UX по экранам теста.md b/docs/Рекомендации UX по экранам теста.md new file mode 100644 index 0000000..dae418e --- /dev/null +++ b/docs/Рекомендации UX по экранам теста.md @@ -0,0 +1,72 @@ +# Рекомендации UX по экранам редактирования теста + +*Основание: скриншоты в `docs/screens`, словарь `docs/Словарь UX-UI-IA терминов.md`. Дата фиксации: 29.04.2026.* + +--- + +## Навигация и IA + +- **Хлебные крошки.** Сейчас только «← к списку». Имеет смысл добавить полную цепочку вроде «Тесты → Введение про LLM → Редактирование», чтобы снизить когнитивную нагрузку и отразить иерархию сущностей (Тест → Версия). +- **Якоря по длинной странице.** Блоки «О тесте», «Вопросы», «История», «Показ в каталоге» образуют длинную вертикаль. Полезны боковое оглавление или «прыжки» по разделам / закреплённая поднавигация внутри страницы теста, чтобы не терять контекст при работе с нижними вопросами и назначением. + +--- + +## Состояния интерфейса и обратная связь + +- **ИИ-кнопки.** Для «Сгенерировать тест (ИИ)» и «Сгенерировать вопрос (ИИ)» нужны явные состояния: загрузка (спиннер, disabled), успех/ошибка, при необходимости — отмена длительной операции (видимость статуса системы). +- **Черновик и риск потери данных.** Уже есть заметный «Сохранить черновик» и жёлтый баннер про новую версию — хорошо. Дополнительно: предупреждение при уходе со страницы с несохранёнными изменениями; для длинной формы — **закреплённая панель** с сохранением (или дублирование primary-действия после блока вопросов), чтобы не скроллить вниз каждый раз. + +--- + +## Редактор вопросов (UI и логика) + +- **Один vs несколько верных ответов.** При включённом «Несколько верных ответов» визуально должны быть **чекбоксы**, а не радиокнопки — соответствие метафоре, ожиданиям пользователя и доступности (скринридер, множественный выбор). +- **Разделение действий.** «+ вариант» и «Удалить вопрос» сейчас визуально близки по весу — риск ошибочного клика. Деструктивное действие: вторичный стиль, отступ, по желанию подтверждение или «Удалить» в меню «⋯». +- **Иерархия ИИ vs ручное редактирование.** Блок «Генерация сетки (ИИ)» логично оформить как сворачиваемый «продвинутый» блок или визуально отделить (заголовок, граница), чтобы отличать массовую генерацию от точечной «Сгенерировать вопрос» у карточки. +- **Длинные варианты ответа.** Обрезка текста в однострочном поле мешает автору. Варианты: многострочное поле с авто-ростом по высоте или предпросмотр полной строки при фокусе/hover. + +--- + +## Локализация и терминология + +- В истории статус **`in_progress` на английском** при русском интерфейсе — заменить на «В процессе» или единый глоссарий статусов прохождения. +- В шапке роль **`employee`** — унифицировать с русскими названиями ролей из словаря проекта (сотрудник, HR и т.д.). + +--- + +## «Показ в каталоге» и список сотрудников + +- **Кнопка «Назначить выбранных».** Сейчас выглядит как вторичная; это главное действие сценария выдачи теста. Имеет смысл сделать её **заполненной primary** при наличии выбора и **disabled с подсказкой**, если никто не выбран. +- **Повтор строки «нет учётки (создадим при назначении)».** На каждой строке создаётся шум. Лучше: один информационный блок над списком; в строке — компактный бейдж/иконка только где уместно. +- **Крайний случай: много сотрудников.** При сотнях/тысячах записей — виртуализация, пагинация или «выбрать всех по фильтру» с явным числом «будет назначено N человек». + +--- + +## История и версии + +- При росте списка карточки версий и прохождений превращаются в длинную простыню — предусмотреть **свёрнутый список**, пагинацию или табы «Версии» / «Прохождения» с фильтром по версии и статусу. + +--- + +## Доступность и плотность + +- Мелкий серый текст в списке сотрудников — проверить контраст (WCAG). +- Чекбоксы и переключатели: достаточная зона клика, связь подписи с полем, логичный порядок табуляции. + +--- + +## Пустые состояния + +- Пустая история, нет вопросов, поиск «никого не нашёл» — короткий текст **почему пусто** и **следующий шаг** («Добавьте вопрос», «Измените фильтр»). + +--- + +## Приоритизация внедрения + +1. **Высокий эффект / низкий риск:** локализация статусов и ролей; визуальное различие «Удалить вопрос» vs «+ вариант»; primary для «Назначить выбранных»; убрать повтор длинного текста про учётку в каждой строке. +2. **Средний:** чекбоксы при нескольких верных ответах; многострочные варианты; состояния загрузки для ИИ; закреплённое сохранение. +3. **Стратегический:** хлебные крошки и внутренняя навигация по разделу; масштабирование списка назначений; пустые состояния; продуктовая аналитика (например, доходят ли авторы до «Показ в каталоге»). + +--- + +*Документ можно дополнять по мере внедрения и новых скринов.* diff --git a/docs/Словарь UX-UI-IA терминов.md b/docs/Словарь UX-UI-IA терминов.md new file mode 100644 index 0000000..e9839ad --- /dev/null +++ b/docs/Словарь UX-UI-IA терминов.md @@ -0,0 +1,298 @@ +# Словарь терминов проектирования + +**UX · UI · IA и смежные понятия** + +*Контекст: HR system / Платформа Цифровых Сервисов клиники им. Е. Н. Оленевой* + +--- + +Короткий справочник, чтобы команда говорила на одном языке. Для каждого термина: русское название, английский эквивалент, короткое определение и пример из вашего продукта, чтобы было понятно, как термин применяется в реальной работе. + +Файл живой: добавляйте сюда термины, которые регулярно всплывают в обсуждениях. + +--- + +## 1. Три основных слоя проектирования + +Три понятия, которые часто путают друг с другом. Это не синонимы и не одно и то же — это три разных профессиональных взгляда на один и тот же продукт. + +### UX (User Experience) — *опыт взаимодействия / пользовательский опыт* + +Совокупность ощущений пользователя от взаимодействия с продуктом: насколько просто понять, как достичь цели, насколько быстро это получается, насколько мало раздражения по дороге. UX — это про задачу пользователя, а не про конкретный экран. + +> *Пример из HR system:* HR-менеджер хочет назначить тест 50 сотрудникам отделения. Хороший UX — он делает это в три клика через фильтр по отделу. Плохой UX — он скроллит список из 147 человек и отмечает чекбоксами вручную. + +### UI (User Interface) — *пользовательский интерфейс* + +Видимая и кликабельная часть продукта: кнопки, поля, цвета, иконки, типографика, состояния (наведение, фокус, ошибка). UI — это про то, как продукт выглядит и как откликается на действия. + +> *Пример из HR system:* Кнопка «Сохранить черновик» на странице теста — её цвет, размер, скруглённые углы, текст внутри, реакция на наведение курсора — это всё UI. + +### IA (Information Architecture) — *информационная архитектура* + +Структура продукта на уровне «что где лежит и как связано»: какие есть разделы, какие сущности живут внутри, по какой логике пользователь переходит с одной страницы на другую. IA — это скелет, на который потом натягиваются UX и UI. + +> *Пример из HR system:* Решение «авторская работа над тестом, назначение и отчётность — это три разных раздела меню, а не один длинный аккордеон» — это IA-решение. + +--- + +## 2. Исследования и работа с пользователем + +### Целевая аудитория — *target audience* + +Группы людей, для которых проектируется продукт. У каждой группы своя задача и контекст использования. + +> *Пример из HR system:* В вашей системе четыре аудитории: сотрудник, руководитель подразделения, HR-менеджер, директор. У них разные потребности и разные роли в системе. + +### Персона — *persona* + +Собирательный образ типичного представителя аудитории: имя, должность, цели, ограничения, частые сценарии. Помогает команде договориться, для кого мы решаем задачу. + +> *Пример из HR system:* «Ольга, HR-менеджер, 35 лет. Раз в квартал назначает массовое обучение 200 сотрудникам. Не любит интерфейсы, где надо кликать каждого по отдельности. Открывает систему с рабочего ноутбука и иногда с телефона на ходу.» + +### Сценарий использования — *user scenario / use case* + +История: пользователь приходит с какой-то задачей и проходит шаги, чтобы её решить. Сценарий описывает, что он делает и какие ожидания у него есть. + +> *Пример из HR system:* «Руководитель отделения хочет, чтобы все его подчинённые прошли тест по пожарной безопасности до конца квартала. Он входит в систему, выбирает свой отдел, выбирает тест, ставит дедлайн, отправляет.» + +### Пользовательский путь / CJM — *Customer Journey Map* + +Развёрнутая визуализация пути пользователя: шаги, точки контакта, эмоции на каждом этапе, где возникают проблемы (pain points) и где можно улучшить. + +> *Пример из HR system:* CJM сотрудника: получил уведомление → открыл письмо → перешёл по ссылке → ввёл логин → увидел список назначенных тестов → выбрал → прошёл → получил результат. На каждом шаге — что ему легко, а что мешает. + +### JTBD (Jobs To Be Done) — *работы, которые нужно выполнить* + +Подход: люди не «пользуются продуктом», они «нанимают» его, чтобы сделать конкретную работу. Помогает увидеть истинную мотивацию, а не поверхностный запрос. + +> *Пример из HR system:* HR не «нанимает» вашу систему, чтобы кликать по чекбоксам. Он нанимает её, чтобы доказать аудиту, что 100% персонала прошли инструктаж в срок. + +### Pain point — *болевая точка* + +Конкретное место, где пользователю плохо: непонятно, медленно, страшно, обидно. Pain points — главные кандидаты на улучшение. + +> *Пример из HR system:* На странице теста пользователь не понимает, где кнопка «Сохранить», и боится потерять изменения — это pain point. + +--- + +## 3. Информационная архитектура и навигация + +### Карта сайта / структура продукта — *sitemap* + +Иерархическое описание всех экранов и разделов продукта. Показывает, что есть в продукте и в каких отношениях разделы стоят друг к другу. + +> *Пример из HR system:* Главная → Тесты → [страница теста] → Назначения → Отчёты → Сотрудники → Настройки. + +### Навигация — *navigation* + +Способ перемещаться по продукту: главное меню, хлебные крошки, ссылки, табы, кнопки «назад». Навигация бывает первичной (основной), вторичной и контекстной. + +> *Пример из HR system:* Шапка с логотипом «Тестирование», меню справа («Тесты», «Назначения», «Отчёты»), ссылка «← к списку» наверху страницы — всё это элементы навигации. + +### Хлебные крошки — *breadcrumbs* + +Цепочка ссылок, показывающая, где пользователь находится в иерархии и куда можно вернуться: «Тесты / Введение про LLM / Редактирование». + +> *Пример из HR system:* Сейчас на странице теста есть только «← к списку». Полные крошки помогли бы быстрее ориентироваться. + +### Таксономия — *taxonomy* + +Набор категорий и тегов, по которым классифицируются объекты. Хорошая таксономия позволяет быстро находить нужное и не плодит дубликаты. + +> *Пример из HR system:* Тест может иметь категории: «обязательные», «рекомендованные», «по специальности», «обучающие». Это таксономия. + +### Сущность / объект предметной области — *entity / domain object* + +Главные «существительные» вашей системы: Тест, Версия теста, Вопрос, Вариант, Сотрудник, Назначение, Прохождение, Отчёт. Дизайн начинается с понимания, какие сущности есть и как они связаны. + +> *Пример из HR system:* Связь «Тест → Версия → Прохождение» позволяет фиксировать результаты конкретной версии, даже если автор потом изменил вопросы. + +--- + +## 4. Проектирование интерфейса + +### Вайрфрейм — *wireframe* + +Скелетный набросок экрана без цвета и стилей: просто блоки, поля, кнопки, чтобы показать структуру и иерархию. Используется на ранних этапах для быстрого обсуждения. + +> *Пример из HR system:* Перед прорисовкой страницы создания теста — простой набросок: «слева 70% — форма, справа 30% — превью теста». + +### Макет — *mockup* + +Визуально проработанный вариант экрана: с реальными цветами, шрифтами, иконками, но обычно статичный (не кликается). + +> *Пример из HR system:* Готовый Figma-макет страницы теста, согласованный с вашим зелёным брендом и шрифтом. + +### Прототип — *prototype* + +Кликабельная модель продукта: можно жать на кнопки, переходить между экранами, увидеть переходы. Прототип бывает разной степени проработанности — от карандашных набросков до почти-настоящего продукта. + +> *Пример из HR system:* Кликабельный прототип в Figma, на котором можно «пройти» сценарий «создал тест → назначил отделению → получил уведомление о результате». + +### Состояния интерфейса — *states* + +Один и тот же элемент или экран в разных ситуациях: пустой, загрузка, ошибка, успех, наведение, фокус, отключённый. Хорошие проекты прорисовывают все состояния, а не только «всё хорошо». + +> *Пример из HR system:* Кнопка «Назначить выбранных» имеет состояния: disabled (никто не выбран), normal, hover, loading (отправка идёт), success (готово). + +### Empty state — *пустое состояние* + +Что пользователь видит, когда данных нет: список пуст, поиск ничего не нашёл, ещё ничего не назначено. Хороший empty state объясняет, почему пусто, и предлагает следующий шаг. + +> *Пример из HR system:* Сотрудник заходит и видит пустой список «Мои тесты». Empty state: «Сейчас вам ничего не назначено. Когда руководитель добавит тест — он появится здесь.» + +### Edge case — *крайний случай* + +Редкая, но возможная ситуация: ноль элементов, тысяча элементов, очень длинный текст, обрыв сети. Игнорирование edge cases ломает интерфейс именно тогда, когда пользователь меньше всего этого ожидает. + +> *Пример из HR system:* Что если в клинике 5000 сотрудников, а не 147? Список «Кому выдать» сегодня этого не выдержит — это edge case, который нужно учесть. + +### Happy path — *счастливый сценарий* + +Идеальное прохождение сценария без ошибок и непредвиденных ситуаций. Полезно как стартовая точка, но проектирование только под happy path — частая ошибка. + +> *Пример из HR system:* «Автор создаёт тест, заполняет 7 вопросов, сохраняет, назначает отделу, все проходят» — это happy path. А что если у автора оборвался интернет на полпути? + +--- + +## 5. Дизайн-система и компоненты + +### Дизайн-система — *design system* + +Набор готовых правил, компонентов и токенов (цветов, отступов, шрифтов), которыми пользуется вся команда. Цель — единообразие и скорость: не изобретать каждый раз кнопку с нуля. + +> *Пример из HR system:* Внутри Платформы Цифровых Сервисов клиники должна быть единая дизайн-система: HR system, регистратура, эндовидеоплатформа выглядят как продукты одной семьи. + +### UI-кит — *UI kit* + +Библиотека готовых интерфейсных элементов (кнопки, поля, модалки, таблицы) в Figma или коде, которой пользуются дизайнеры и разработчики. + +> *Пример из HR system:* Если у вас есть UI-кит, новая страница «Назначения» собирается из готовых компонентов за день, а не за неделю. + +### Компонент — *component* + +Самостоятельный кусочек интерфейса с понятным API: входные параметры, состояния, поведение. Кнопка, поле ввода, аккордеон, модалка — всё это компоненты. + +> *Пример из HR system:* Аккордеон «О тесте» / «Вопросы» / «История» / «Показ в каталоге» — четыре экземпляра одного и того же компонента «аккордеон». + +### Токен дизайна — *design token* + +Атомарная переменная стиля: цвет, отступ, размер шрифта, радиус скругления. Токены позволяют менять оформление всего продукта централизованно. + +> *Пример из HR system:* Цвет `primary-green = #2E7D5B` — токен. Если решите перейти на другой оттенок зелёного, меняете в одном месте, и все кнопки обновляются. + +### Паттерн — *pattern* + +Типовое решение типовой задачи: «как реализовать поиск с фильтрами», «как показать длинный список». Паттерны — это коллективная мудрость комьюнити. + +> *Пример из HR system:* Паттерн «master-detail»: слева список тестов, справа детали выбранного. Хорошо ложится на ваш будущий раздел «Назначения». + +--- + +## 6. Качество и проверка дизайна + +### Юзабилити — *usability* + +Свойство интерфейса быть простым и эффективным в использовании. Измеряется через эффективность (получилось ли), скорость и количество ошибок. + +> *Пример из HR system:* Если сотрудник не может с первого раза найти, как пройти тест — у интерфейса проблема с юзабилити. + +### Доступность — *accessibility / a11y* + +Возможность использовать продукт людям с особенностями: слабовидящим, незрячим (через скринридеры), людям с моторными ограничениями (только клавиатура), дальтоникам. Стандарт — WCAG. + +> *Пример из HR system:* Радиокнопки выбора правильного варианта должны быть доступны с клавиатуры (Tab + Space) и понятны скринридеру («Вариант 1 из 3, выбран»). + +### Юзабилити-тестирование — *usability testing* + +Метод исследования: реальный пользователь выполняет задание, исследователь наблюдает, где он спотыкается. Дешёвый способ найти большую часть проблем. + +> *Пример из HR system:* Дать HR-менеджеру задание «назначь этот тест всему отделению хирургии до 1 мая» и записать, где он зависнет. + +### Эвристическая оценка — *heuristic evaluation* + +Эксперт сверяет интерфейс с набором эвристик (правил хорошего дизайна, например, эвристиками Нильсена) и фиксирует нарушения. Быстрее теста с пользователями, но менее точно. + +> *Пример из HR system:* Анализ страницы теста, который мы делаем сейчас — это, по сути, эвристическая оценка. + +### A/B-тест — *A/B testing* + +Сравнение двух вариантов интерфейса на реальной аудитории: половина видит вариант A, половина — B; измеряем, какой работает лучше. + +> *Пример из HR system:* Сравнить две формулировки кнопки: «Сохранить черновик» vs «Сохранить и назначить» — что чаще ведёт к завершению задачи. + +### Аналитика продукта — *product analytics* + +Сбор и анализ данных о том, как пользователи реально пользуются продуктом: где кликают, где бросают, сколько времени проводят. Подсказывает, где искать проблемы. + +> *Пример из HR system:* Если в аналитике видно, что 40% авторов не доходят до раздела «Показ в каталоге» — это сигнал, что его упускают. + +--- + +## 7. Технические понятия, нужные дизайнеру + +### Респонсив / адаптивность — *responsive design* + +Способность интерфейса корректно работать на разных размерах экрана: от телефона до большого монитора. Не путать с «мобильной версией». + +> *Пример из HR system:* Список «Кому выдать» должен оставаться удобным на 13-дюймовом ноутбуке руководителя и на телефоне HR-менеджера в дороге. + +### Брейкпойнт — *breakpoint* + +Ширина экрана, на которой меняется раскладка интерфейса. Типовые: 360, 768, 1024, 1440 px. + +> *Пример из HR system:* На брейкпойнте 768 px (планшет) две колонки на странице теста схлопываются в одну. + +### RBAC — *Role-Based Access Control / ролевая модель доступа* + +Правила, что какая роль видит и может делать в системе. Дизайн интерфейса должен учитывать роль: один и тот же экран показывается по-разному сотруднику, руководителю, HR и директору. + +> *Пример из HR system:* Сотрудник видит только «Мои тесты». Руководитель — ещё «Мой отдел». HR — все назначения. Директор — сводный отчёт. + +### Версионирование — *versioning* + +Подход, при котором у объекта (теста, документа) есть несколько версий, и история фиксируется. Полезно для аудита и неизменности результатов. + +> *Пример из HR system:* В вашей системе тест имеет версии v1, v2 и т.д. Прохождение всегда привязано к конкретной версии — изменения автора не «переписывают» прошлые результаты. + +### Состояние черновика — *draft state* + +Промежуточное состояние объекта: ещё не опубликован/не активирован, можно безопасно править. + +> *Пример из HR system:* Кнопка «Сохранить черновик» означает: тест сохранён, но пока не выдан сотрудникам. Можно ещё дорабатывать. + +### Уведомление — *notification* + +Сообщение системы пользователю: всплывающее (toast), баннер на странице, push, e-mail. Каждый канал имеет свои правила использования. + +> *Пример из HR system:* Тост «Тест сохранён» после нажатия кнопки. E-mail сотруднику с дедлайном по назначенному тесту. + +--- + +## 8. Терминология этого проекта + +Чтобы команда не путалась, фиксируем основные сущности HR system явно. + +- **Тест** — учебный материал, состоящий из вопросов с вариантами ответов. Один тест может иметь несколько версий. +- **Версия теста** — снимок содержимого теста на момент сохранения. Прохождение всегда привязано к конкретной версии. +- **Вопрос** — отдельный пункт теста с формулировкой и набором вариантов. Может допускать один или несколько верных ответов. +- **Вариант ответа** — один из предложенных ответов на вопрос. Помечается как верный или нет. +- **Назначение** — связь «тест × сотрудник × срок». Формирует у сотрудника обязательство пройти этот тест. +- **Прохождение** — попытка сотрудника пройти конкретную версию теста. Имеет статус (в процессе, пройдено, не пройдено) и результат (X из Y). +- **Порог зачёта** — процент правильных ответов, начиная с которого прохождение засчитывается. +- **Каталог** — общий список тестов, видимый сотрудникам с правами. +- **Роль** — профиль доступа: сотрудник, руководитель подразделения, HR-менеджер, директор. + +--- + +## Полезные ссылки и стандарты + +- **Эвристики Якоба Нильсена** — 10 базовых правил юзабилити: [nngroup.com](https://www.nngroup.com/articles/ten-usability-heuristics/) +- **WCAG 2.2** — стандарт доступности: [w3.org/TR/WCAG22](https://www.w3.org/TR/WCAG22/) +- **Material Design** — [m3.material.io](https://m3.material.io/) и **Apple HIG** — [developer.apple.com/design](https://developer.apple.com/design/human-interface-guidelines/) — два больших источника готовых паттернов и принципов. +- **Refactoring UI** (Adam Wathan, Steve Schoger) — настольная книга по практическому UI-дизайну. + +--- + +*— Справочник можно дополнять по мере появления новых терминов —* diff --git a/flask_app/README.md b/flask_app/README.md index 8508fcd..1b85514 100644 --- a/flask_app/README.md +++ b/flask_app/README.md @@ -1,17 +1,24 @@ -# Flask-контур тестирования (тот же стек, отдельный деплой) +# Flask-контур тестирования (целевой стек) -Здесь — **новое** приложение на **Python / Flask** в духе `HR_TG_Bot/tgFlaskForm` (шаблоны + серверный рендер, без React). Старый стек (`backend/` + `frontend/`) пока не удаляется: оба контура могут существовать параллельно, пока не зафиксирована политика «один источник записи» и cutover. +Приложение на **Python 3.11 / Flask 3 / Jinja2** в духе +`HR_TG_Bot/tgFlaskForm` (серверный рендер, без React). На этом контуре +работает прод **[edullm.pirogov.ai](https://edullm.pirogov.ai/)**. + +Старый стек (`backend/` + `frontend/`) пока не удаляется: оба контура +существуют параллельно до закрытия паритета (спринты **E1.4–E1.6** в +[`docs/migration-final.md`](../docs/migration-final.md)). ## Запуск в Docker (рекомендуется) -Из **корня** репозитория TestingWebApp. Сервис **не** зависит от `testing-backend` и **не** требует внешней сети Postgres для старта (только внутренняя сеть compose). +Из **корня** репозитория TestingWebApp. `docker-compose.dev.yml` уже +подключён к сети `postgres` (`hr_postgres_dev_net`) и пробрасывает +`DATABASE_URL`, `HR_AUTH`, `HR_DATABASE_URL`, `DEEPSEEK_API_KEY` / +`OPENAI_API_KEY` / `LLM_BASE_URL` / `LLM_MODEL` из корневого `.env`. ```bash docker compose -f docker-compose.dev.yml up -d --build testing-flask ``` -Когда подключите БД из контейнера к `hr_postgres_dev` / `clinic_tests`, в `docker-compose.dev.yml` у сервиса `testing-flask` добавьте сеть `postgres` (как у `testing-backend`). - - **URL:** http://localhost:3108 - **Проверка:** http://localhost:3108/health @@ -42,16 +49,28 @@ python run.py - Один **стек** с кабинетом / мини-приложением — проще переносить экраны и запросы из `HR_TG_Bot/tgFlaskForm/webApp/interfaces/testing/`. - **Отдельный** процесс и порт — без риска сломать текущий `docker-compose.dev.yml` с Node до готовности. -## Дальнейшие шаги (код) - -Этот каталог — место разработки **Этапа 1** ([migration-final.md](../docs/migration-final.md)). - -1. Подключить БД **`clinic_tests`** (схема не меняется), psycopg2-пул в стиле `tgFlaskForm/db/`. -2. Перенести 22 эндпоинта Express из `backend/` в blueprint'ы Flask, ориентируясь на чек-лист в [migration-final-inventory.md](../docs/migration-final-inventory.md). -3. Перенести экраны React (`frontend/src/pages/*`) в Jinja-шаблоны `app/templates/`, повторяя мобильный UX [Спринта 3](../docs/СПРИНТЫ_МОБИЛЬНЫЙ_ДИЗАЙН.md). -4. Когда паритет закрыт — `docker-compose.dev.yml` указывает на этот сервис как основной, `backend/` и `frontend/` уходят. - -ETL `clinic_tests → hr_bot_test` и слияние с `tgFlaskForm` — это **Этап 2**, на будущее ([migration-to-tgflaskform.md](../docs/migration-to-tgflaskform.md)). +## Состояние спринтов + +Этот каталог — место разработки **Этапа 1** +([migration-final.md](../docs/migration-final.md)). + +| Спринт | Что входит | Статус | +|---|---|---| +| E1.0 | База Flask-приложения, БД-пул, сессии, `base.html`. | ✅ | +| E1.1 | Auth + `/api/me` (bcrypt + Werkzeug, опц. `HR_AUTH`). | ✅ | +| E1.2 | Каталог тестов и редактор (функциональный минимум). | ✅ | +| E1.3 | Импорт документов (PDF / DOCX / TXT / MD). | ✅ | +| E1.4 | Назначения и прохождение тестов. | ⬜ | +| E1.5 | Трекер попыток + страница настроек цепочки. | ⬜ | +| E1.6 | Cutover: удаление `backend/` и `frontend/`. | ⬜ | +| E1.7 | UX-полировка: 4 аккордеона + drag-n-drop. | ⬜ | +| E1.8 | AI-функции v2 (`/settings`, generate / check / improve). | ✅ | + +Чек-лист эндпоинтов и gap-analysis с `tgFlaskForm` — +[`migration-final-inventory.md`](../docs/migration-final-inventory.md). +ETL `clinic_tests → hr_bot_test` и слияние с `tgFlaskForm` — это +**Этап 2**, на будущее +([migration-to-tgflaskform.md](../docs/migration-to-tgflaskform.md)). ## Связанные документы diff --git a/flask_app/app/__init__.py b/flask_app/app/__init__.py index e2678b8..e7af15b 100644 --- a/flask_app/app/__init__.py +++ b/flask_app/app/__init__.py @@ -13,6 +13,31 @@ from datetime import timedelta from flask import Flask, jsonify, render_template, request +_ROLE_LABELS = { + 'employee': 'Сотрудник', + 'manager': 'Руководитель', + 'hr': 'HR', +} + + +def _format_role(role: str | None) -> str: + return _ROLE_LABELS.get((role or '').strip().lower(), '') + + +def _format_surname_with_initials(full_name: str | None, fallback: str | None = None) -> str: + name = (full_name or '').strip() + if not name: + return (fallback or '—').strip() or '—' + parts = [p for p in name.replace('\xa0', ' ').split(' ') if p] + if len(parts) < 2: + return name + surname = parts[0] + initials = [] + for p in parts[1:3]: + initials.append(f'{p[0].upper()}.') + return f"{surname} {' '.join(initials)}".strip() + + def create_app() -> Flask: app = Flask( __name__, @@ -49,11 +74,15 @@ def create_app() -> Flask: @app.context_processor def _inject_globals(): + ui_variant = (os.environ.get('UI_VARIANT') or 'modern').strip().lower() or 'modern' return { 'current_user': _current_user(), 'hr_auth_enabled': is_hr_auth_enabled(), 'dev_ui': is_dev_ui(), 'assignment_ui': is_assignment_feature_enabled(), + 'ui_variant': ui_variant, + 'format_name_short': _format_surname_with_initials, + 'format_role': _format_role, } @app.errorhandler(404) diff --git a/flask_app/app/services/editor_content.py b/flask_app/app/services/editor_content.py index c1339a8..c1cef83 100644 --- a/flask_app/app/services/editor_content.py +++ b/flask_app/app/services/editor_content.py @@ -10,6 +10,7 @@ from sqlalchemy import text from ..db import get_engine from ..messages import RU from .test_access import is_test_author +from .test_chain import has_any_attempt_for_test class HttpError(Exception): @@ -81,7 +82,13 @@ def get_editor_content(user_id: str, test_id: str) -> dict: if not tv: raise HttpError(400, 'Нет активной версии теста.') version_id = tv['id'] + version_count_row = conn.execute( + text('SELECT COUNT(*) AS n FROM test_versions WHERE test_id = :id'), + {'id': test_id}, + ).mappings().first() + version_count = int(version_count_row['n'] or 0) questions = load_questions_for_version(conn, version_id, include_correct=True) + has_attempts = has_any_attempt_for_test(conn, test_id) return { 'test': { @@ -89,6 +96,9 @@ def get_editor_content(user_id: str, test_id: str) -> dict: 'title': tr['title'], 'description': tr['description'], 'passingThreshold': tr['passing_threshold'], + 'hasAttempts': bool(has_attempts), + 'versionCount': version_count, + 'hasForkRisk': bool(has_attempts) or version_count > 1, }, 'activeVersionId': str(version_id), 'questions': questions, diff --git a/flask_app/app/services/test_attempt.py b/flask_app/app/services/test_attempt.py new file mode 100644 index 0000000..ac85ffe --- /dev/null +++ b/flask_app/app/services/test_attempt.py @@ -0,0 +1,354 @@ +from __future__ import annotations + +from sqlalchemy import text + +from ..services.test_access import is_test_author, user_has_test_access + + +class HttpError(Exception): + def __init__(self, status: int, message: str): + super().__init__(message) + self.status = status + self.message = message + + +def _sort_uuid_strings(items) -> list[str]: + return sorted({str(x) for x in (items or []) if x is not None}) + + +def _same_selection(selected, correct_ids) -> bool: + a = _sort_uuid_strings(selected) + b = _sort_uuid_strings(correct_ids) + return a == b + + +def load_questions_for_version(conn, test_version_id, *, include_correct: bool) -> list[dict]: + qrows = conn.execute( + text( + 'SELECT id, text, question_order, has_multiple_answers ' + 'FROM questions WHERE test_version_id = :v ORDER BY question_order' + ), + {'v': test_version_id}, + ).mappings().all() + out = [] + for q in qrows: + orows = conn.execute( + text( + 'SELECT id, text, is_correct, option_order ' + 'FROM answer_options WHERE question_id = :q ORDER BY option_order' + ), + {'q': q['id']}, + ).mappings().all() + opts = [] + for o in orows: + base = { + 'id': str(o['id']), + 'text': o['text'], + 'optionOrder': o['option_order'], + } + if include_correct: + base['isCorrect'] = bool(o['is_correct']) + opts.append(base) + out.append( + { + 'id': str(q['id']), + 'text': q['text'], + 'questionOrder': q['question_order'], + 'hasMultipleAnswers': bool(q['has_multiple_answers']), + 'options': opts, + } + ) + return out + + +def start_attempt(eng, user_id: str, test_id: str) -> dict: + acc = user_has_test_access(user_id, test_id) + if not acc.ok: + raise HttpError(404, 'Тест не найден.') + with eng.begin() as conn: + tv = conn.execute( + text( + 'SELECT id AS test_version_id FROM test_versions ' + 'WHERE test_id = :id AND is_active = true LIMIT 1' + ), + {'id': test_id}, + ).mappings().first() + if not tv: + raise HttpError(404, 'Нет активной версии теста.') + version_id = tv['test_version_id'] + mx = conn.execute( + text( + 'SELECT COALESCE(MAX(attempt_number), 0) AS n FROM test_attempts ' + 'WHERE test_version_id = :v AND user_id = :u' + ), + {'v': version_id, 'u': user_id}, + ).mappings().first() + next_n = int(mx['n'] or 0) + 1 + a = conn.execute( + text( + "INSERT INTO test_attempts (test_version_id, user_id, attempt_number, status) " + "VALUES (:v, :u, :n, 'in_progress') " + 'RETURNING id, test_version_id, user_id, attempt_number, status, started_at' + ), + {'v': version_id, 'u': user_id, 'n': next_n}, + ).mappings().first() + return {'attempt': dict(a)} + + +def get_play_content(eng, user_id: str, test_id: str, attempt_id: str) -> dict: + with eng.connect() as conn: + a = conn.execute( + text( + 'SELECT ta.id, ta.user_id, ta.status, ta.test_version_id, tv.test_id, ' + 't.title, t.passing_threshold ' + 'FROM test_attempts ta ' + 'INNER JOIN test_versions tv ON tv.id = ta.test_version_id ' + 'INNER JOIN tests t ON t.id = tv.test_id ' + 'WHERE ta.id = :a' + ), + {'a': attempt_id}, + ).mappings().first() + if not a: + raise HttpError(404, 'Попытка не найдена.') + if str(a['test_id']) != str(test_id): + raise HttpError(404, 'Попытка не найдена.') + if str(a['user_id']) != str(user_id): + raise HttpError(403, 'Доступ запрещён.') + if a['status'] != 'in_progress': + raise HttpError(400, 'Попытка уже завершена.') + qs = load_questions_for_version(conn, a['test_version_id'], include_correct=False) + return { + 'testTitle': a['title'], + 'passingThreshold': a['passing_threshold'], + 'attemptId': str(a['id']), + 'questions': qs, + } + + +def submit_attempt(eng, user_id: str, test_id: str, attempt_id: str, raw_answers: dict | None) -> dict: + answers = raw_answers if isinstance(raw_answers, dict) else {} + with eng.begin() as conn: + a = conn.execute( + text( + 'SELECT id, user_id, status, test_version_id ' + 'FROM test_attempts WHERE id = :a FOR UPDATE' + ), + {'a': attempt_id}, + ).mappings().first() + if not a: + raise HttpError(404, 'Попытка не найдена.') + link = conn.execute( + text( + 'SELECT t.passing_threshold, tv.test_id ' + 'FROM test_versions tv ' + 'INNER JOIN tests t ON t.id = tv.test_id ' + 'WHERE tv.id = :v' + ), + {'v': a['test_version_id']}, + ).mappings().first() + if not link: + raise HttpError(404, 'Тест не найден.') + if str(link['test_id']) != str(test_id): + raise HttpError(404, 'Попытка не найдена.') + if str(a['user_id']) != str(user_id): + raise HttpError(403, 'Доступ запрещён.') + if a['status'] != 'in_progress': + raise HttpError(400, 'Попытка уже завершена.') + + qrows = conn.execute( + text('SELECT id FROM questions WHERE test_version_id = :v'), + {'v': a['test_version_id']}, + ).mappings().all() + if not qrows: + raise HttpError(400, 'В тесте нет вопросов.') + + opts = conn.execute( + text( + 'SELECT a.id, a.question_id, a.is_correct ' + 'FROM answer_options a ' + 'INNER JOIN questions q ON q.id = a.question_id ' + 'WHERE q.test_version_id = :v' + ), + {'v': a['test_version_id']}, + ).mappings().all() + + by_q = {} + for o in opts: + qid = str(o['question_id']) + if qid not in by_q: + by_q[qid] = {'all': set(), 'correct': []} + by_q[qid]['all'].add(str(o['id'])) + if o['is_correct']: + by_q[qid]['correct'].append(str(o['id'])) + + correct_count = 0 + for q in qrows: + qid = str(q['id']) + selected = answers.get(qid, []) + if not isinstance(selected, list): + selected = [str(selected)] + selected = [str(x) for x in selected] + g = by_q.get(qid, {'all': set(), 'correct': []}) + for sid in selected: + if sid not in g['all']: + raise HttpError(400, 'Некорректный вариант ответа.') + if _same_selection(selected, g['correct']): + correct_count += 1 + + total = len(qrows) + percent = (correct_count / total) * 100 if total else 0 + threshold = int(link['passing_threshold'] or 0) + passed = percent + 1e-9 >= threshold + + conn.execute(text('DELETE FROM user_answers WHERE attempt_id = :a'), {'a': attempt_id}) + for q in qrows: + qid = str(q['id']) + selected = answers.get(qid, []) + if not isinstance(selected, list): + selected = [str(selected)] + selected = [str(x) for x in selected] + conn.execute( + text( + 'INSERT INTO user_answers (attempt_id, question_id, selected_options) ' + 'VALUES (:a, :q, :s::uuid[])' + ), + {'a': attempt_id, 'q': q['id'], 's': selected}, + ) + conn.execute( + text( + "UPDATE test_attempts SET status = 'completed', completed_at = CURRENT_TIMESTAMP, " + 'correct_count = :c, total_questions = :t, passed = :p WHERE id = :a' + ), + {'a': attempt_id, 'c': correct_count, 't': total, 'p': passed}, + ) + + review = build_review_from_db(eng, attempt_id) + return { + 'attemptId': attempt_id, + 'correctCount': correct_count, + 'totalQuestions': total, + 'percent': round(percent, 1), + 'passed': passed, + 'passingThreshold': threshold, + 'review': review, + } + + +def build_review_from_db(eng, attempt_id: str) -> dict: + with eng.connect() as conn: + a = conn.execute( + text( + 'SELECT ta.id, ta.status, ta.test_version_id, ta.user_id, ta.correct_count, ta.total_questions, ' + 'ta.passed, ta.started_at, ta.completed_at, ' + 't.id AS test_id, t.title, t.passing_threshold, ' + 'u.full_name AS attempter_name, u.login AS attempter_login ' + 'FROM test_attempts ta ' + 'INNER JOIN test_versions tv ON tv.id = ta.test_version_id ' + 'INNER JOIN tests t ON t.id = tv.test_id ' + 'INNER JOIN users u ON u.id = ta.user_id ' + 'WHERE ta.id = :a' + ), + {'a': attempt_id}, + ).mappings().first() + if not a: + raise HttpError(404, 'Попытка не найдена.') + if a['status'] != 'completed': + raise HttpError(400, 'Попытка не завершена.') + questions = load_questions_for_version(conn, a['test_version_id'], include_correct=True) + uans = conn.execute( + text('SELECT question_id, selected_options FROM user_answers WHERE attempt_id = :a'), + {'a': attempt_id}, + ).mappings().all() + + sel_by_q = {str(r['question_id']): [str(x) for x in (r['selected_options'] or [])] for r in uans} + total = int(a['total_questions'] or len(questions)) + percent = round(((a['correct_count'] or 0) / total) * 100, 1) if total else 0 + + q_out = [] + for q in questions: + selected = _sort_uuid_strings(sel_by_q.get(str(q['id']), [])) + correct = _sort_uuid_strings([o['id'] for o in q['options'] if o.get('isCorrect')]) + selected_set = set(selected) + q_out.append( + { + 'id': q['id'], + 'text': q['text'], + 'hasMultipleAnswers': q['hasMultipleAnswers'], + 'isUserCorrect': _same_selection(selected, correct), + 'options': [ + { + 'id': o['id'], + 'text': o['text'], + 'isCorrect': o.get('isCorrect', False), + 'selected': o['id'] in selected_set, + } + for o in q['options'] + ], + } + ) + + return { + 'attemptId': str(a['id']), + 'testId': str(a['test_id']), + 'testTitle': a['title'], + 'passingThreshold': int(a['passing_threshold'] or 0), + 'correctCount': int(a['correct_count'] or 0), + 'totalQuestions': total, + 'percent': percent, + 'passed': bool(a['passed']), + 'startedAt': a['started_at'].isoformat() if a['started_at'] else None, + 'completedAt': a['completed_at'].isoformat() if a['completed_at'] else None, + 'attempterUserId': str(a['user_id']), + 'attempterName': a['attempter_name'], + 'attempterLogin': a['attempter_login'], + 'questions': q_out, + } + + +def get_attempt_review_for_user(eng, current_user_id: str, test_id: str, attempt_id: str) -> dict: + with eng.connect() as conn: + row = conn.execute( + text( + 'SELECT ta.user_id, t.created_by, tv.test_id ' + 'FROM test_attempts ta ' + 'INNER JOIN test_versions tv ON tv.id = ta.test_version_id ' + 'INNER JOIN tests t ON t.id = tv.test_id ' + 'WHERE ta.id = :a' + ), + {'a': attempt_id}, + ).mappings().first() + if not row: + raise HttpError(404, 'Попытка не найдена.') + if str(row['test_id']) != str(test_id): + raise HttpError(404, 'Попытка не найдена.') + is_owner = str(row['user_id']) == str(current_user_id) + is_author = is_test_author(row['created_by'], current_user_id) + if not is_owner and not is_author: + raise HttpError(403, 'Доступ запрещён.') + return build_review_from_db(eng, attempt_id) + + +def list_test_attempts_for_author(eng, author_id: str, test_id: str) -> list[dict]: + with eng.connect() as conn: + t = conn.execute( + text('SELECT id, created_by FROM tests WHERE id = :id'), + {'id': test_id}, + ).mappings().first() + if not t: + raise HttpError(404, 'Тест не найден.') + if not is_test_author(t['created_by'], author_id): + raise HttpError(403, 'Доступ запрещён.') + rows = conn.execute( + text( + 'SELECT ta.id, ta.user_id, ta.status, ta.attempt_number, ta.started_at, ta.completed_at, ' + 'ta.correct_count, ta.total_questions, ta.passed, tv.version AS test_version, ' + 'u.full_name AS attempter_name, u.login AS attempter_login ' + 'FROM test_attempts ta ' + 'INNER JOIN test_versions tv ON tv.id = ta.test_version_id ' + 'INNER JOIN users u ON u.id = ta.user_id ' + 'WHERE tv.test_id = :id ' + 'ORDER BY ta.started_at DESC NULLS LAST LIMIT 200' + ), + {'id': test_id}, + ).mappings().all() + return [dict(r) for r in rows] diff --git a/flask_app/app/static/css/app.css b/flask_app/app/static/css/app.css index 643152e..058891c 100644 --- a/flask_app/app/static/css/app.css +++ b/flask_app/app/static/css/app.css @@ -1,17 +1,668 @@ -/* Точечные стили поверх Tailwind CDN. - В E1.0 файл почти пустой — задаёт только сглаживание иконок и базовый focus-ring, - чтобы кнопки/ссылки были консистентны со стилем кабинета HR. */ +/* Базовые токены и точечные стили в духе webapp-nginx/cabinet-theme. */ + +:root { + --surface: #ffffff; + --surface-container-low: #f3f8f9; + --surface-container: #eaf3f5; + --on-surface: #0d1b1d; + --on-surface-variant: #3d5357; + --primary: #007168; + --primary-hover: #00645b; + --outline-variant: #b9bc94; + --shadow-card: 0 8px 40px rgba(0, 0, 0, 0.08); + --radius-card: 2rem; + --max-content: 42rem; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +body { + margin: 0; + min-height: 100dvh; + font-family: 'Inter', system-ui, -apple-system, sans-serif; + background: var(--surface-container-low); + color: var(--on-surface); + -webkit-tap-highlight-color: transparent; + line-height: 1.45; +} + +h1, +h2, +h3 { + letter-spacing: -0.02em; +} .material-symbols-outlined { + font-family: 'Material Symbols Outlined', sans-serif; + font-weight: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, - 'opsz' 20; + 'opsz' 24; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; } :focus-visible { - outline: 2px solid #6366f1; /* brand-500 */ + outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 6px; } + +/* Небольшой "cabinet" акцент карточек/кнопок без переписывания шаблонов. */ +.rounded-2xl.bg-white, +.rounded-xl.bg-white { + border-color: color-mix(in srgb, var(--outline-variant) 38%, transparent); +} + +.bg-brand-600 { + background-color: var(--primary) !important; +} + +.hover\:bg-brand-700:hover { + background-color: var(--primary-hover) !important; +} + +/* ------------------------------------------------------------------ */ +/* UI variants (оба режима на Flask, отличие только в компоновке UI). */ +/* ------------------------------------------------------------------ */ + +/* Modern: плотная колонка и акцент на карточный контент. */ +body.ui-modern .max-w-2xl { + max-width: 42rem !important; +} + +body.ui-modern main { + padding-top: 1.25rem; +} + +/* Legacy: идентичный cabinet layout. */ +body.ui-legacy .max-w-2xl { + max-width: 42rem !important; +} + +body.ui-legacy .cabinet-app { + min-height: 100dvh; + display: flex; + flex-direction: column; + background: var(--surface); +} + +body.ui-legacy .cabinet-header { + position: sticky; + top: 0; + z-index: 20; + background: color-mix(in srgb, var(--surface) 88%, transparent); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); +} + +body.ui-legacy .cabinet-header__inner { + max-width: var(--max-content); + margin: 0 auto; + padding-top: max(0.75rem, env(safe-area-inset-top, 0px)); + padding-bottom: 0.75rem; + padding-left: max(1.25rem, env(safe-area-inset-left, 0px) + 0.5rem); + padding-right: max(1.25rem, env(safe-area-inset-right, 0px) + 0.5rem); + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +body.ui-legacy .cabinet-brand { + display: flex; + align-items: center; + gap: 0.65rem; + color: var(--on-surface); + text-decoration: none; + min-width: 0; +} + +body.ui-legacy .cabinet-brand:hover { + text-decoration: none; + color: var(--on-surface); +} + +body.ui-legacy .cabinet-brand__logo { + width: 2rem; + height: 2rem; + object-fit: contain; + display: block; +} +body.ui-legacy .login-logo__img { + width: 96px; + height: 96px; + object-fit: contain; + display: block; + margin: 0 auto 0.5rem; +} +body.ui-legacy .cabinet-brand__icon { + font-size: 1.75rem; + color: var(--primary); + background: var(--surface-container-low); + border-radius: 0.75rem; + padding: 0.35rem; + border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); + flex-shrink: 0; +} + +body.ui-legacy .cabinet-brand__title { + font-family: 'Manrope', 'Inter', sans-serif; + font-weight: 800; + font-size: 1rem; + line-height: 1.2; + letter-spacing: -0.02em; +} + +body.ui-legacy .cabinet-header__actions { + display: flex; + align-items: center; + gap: 0.75rem; + flex-shrink: 0; +} + +body.ui-legacy .cabinet-user { + font-size: 0.8rem; + color: var(--on-surface-variant); + text-align: right; + max-width: 12rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: none; +} + +@media (min-width: 480px) { + body.ui-legacy .cabinet-user { + display: inline; + } +} + +body.ui-legacy .cabinet-user__role { + color: var(--secondary, #506965); + font-weight: 500; +} + +body.ui-legacy .cabinet-main { + flex: 1; + max-width: var(--max-content); + width: 100%; + margin: 0 auto; + padding: 1.25rem 1.25rem calc(2.5rem + env(safe-area-inset-bottom, 0px)); +} + +body.ui-legacy main { + padding-top: 0; +} + +body.ui-legacy .rounded-2xl.bg-white, +body.ui-legacy .rounded-xl.bg-white { + border-radius: 0.85rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +/* Legacy catalog (портировано из старого webapp) */ +body.ui-legacy .legacy-list-shell { + max-width: 42rem; + margin: 0 auto; +} + +body.ui-legacy .legacy-list-title { + font-size: 1.5rem; + margin: 0 0 0.75rem; +} + +body.ui-legacy .legacy-list-toolbar { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin: 0 0 1rem; +} + +body.ui-legacy .legacy-list-subtitle { + font-size: 1.1rem; + margin: 1.5rem 0 0.5rem; +} + +body.ui-legacy .btn { + font-family: inherit; + font-size: 0.9375rem; + font-weight: 600; + padding: 0.55rem 1.1rem; + border-radius: 0.75rem; + border: 1.5px solid transparent; + cursor: pointer; + transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s; + text-decoration: none; +} + +body.ui-legacy .btn-ghost { + background: transparent; + color: var(--primary); + border-color: color-mix(in srgb, var(--outline-variant) 70%, transparent); +} + +body.ui-legacy .btn-ghost:hover { + background: var(--surface-container); + border-color: var(--primary); + text-decoration: none; +} + +body.ui-legacy .text-muted { + color: var(--on-surface-variant); + font-size: 0.875rem; +} + +body.ui-legacy .list-stack { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +body.ui-legacy .list-row { + display: block; + border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); + border-radius: 1rem; + padding: 0.9rem 1rem; + background: var(--surface); + transition: border-color 0.15s, box-shadow 0.15s; +} + +body.ui-legacy .list-row--split { + display: flex; + flex-direction: row; + align-items: stretch; + padding: 0; + overflow: hidden; + gap: 0; +} + +body.ui-legacy .list-row__main { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; +} + +body.ui-legacy .list-row__link { + display: flex; + flex-direction: column; + flex: 1 1 auto; + padding: 0.9rem 1rem; + text-decoration: none; + color: inherit; +} + +body.ui-legacy .list-row__title { + display: block; + color: var(--on-surface); + font-weight: 600; +} + +body.ui-legacy .list-row__meta { + color: var(--on-surface-variant); + font-size: 0.8rem; + display: block; + margin-top: 0.25rem; +} + +body.ui-legacy .list-row__meta-tail { + white-space: nowrap; +} + +body.ui-legacy .list-row__side { + display: flex; + align-items: center; + padding: 0.5rem 0.9rem 0.5rem 0; + flex-shrink: 0; + border-left: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); +} + +body.ui-legacy .list-row--hidden { + border-style: dashed; + opacity: 0.95; +} + +body.ui-legacy .link-back { + display: inline-flex; + align-items: center; + gap: 0.25rem; + font-size: 0.9rem; + font-weight: 500; + margin: 0 0 1rem; +} + +body.ui-legacy .callout { + border-radius: 1rem; + padding: 0.75rem 1rem; + font-size: 0.9rem; + font-weight: 500; + margin: 0 0 1rem; +} + +body.ui-legacy .callout--warning { + background: #fffbeb; + border: 1px solid #fde68a; + color: #92400e; +} + +body.ui-legacy .muted, +body.ui-legacy .text-muted, +body.ui-legacy .text-secondary { + color: #506965; + font-size: 0.875rem; +} + +body.ui-legacy .mono { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; +} + +body.ui-legacy .form-label { + display: block; + font-size: 0.9rem; + font-weight: 500; + color: var(--on-surface); + margin-bottom: 0.35rem; +} + +body.ui-legacy .form-input { + width: 100%; + padding: 11px 13px; + border: 1.5px solid var(--outline-variant); + border-radius: 0.75rem; + font-size: 15px; + font-family: inherit; + outline: none; + background: var(--surface-container-low); + color: var(--on-surface); + transition: border-color 0.15s, box-shadow 0.15s, background 0.15s; +} + +body.ui-legacy .form-input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(0, 113, 104, 0.12); + background: #fff; +} + +body.ui-legacy .surface-card { + background: var(--surface); + border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); + border-radius: 1rem; + padding: 1rem 1.1rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +body.ui-legacy .cabinet-brick { + margin-bottom: 1.1rem; +} + +body.ui-legacy .cabinet-brick--hero { + padding: 0.1rem 0 0.6rem; + border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent); + margin-bottom: 1.25rem; +} + +.hero-brick__nav { + display: flex; + justify-content: space-between; + align-items: baseline; + flex-wrap: wrap; + gap: 0.5rem; + font-size: 0.85rem; + color: var(--ink-500, #6b7280); +} +.hero-brick__meta { + display: inline-flex; + flex-wrap: wrap; + gap: 0.4rem; + align-items: baseline; + color: var(--ink-500, #6b7280); +} +.hero-brick__sep { opacity: 0.55; } + +.hero-brick__title { + display: block; + width: 100%; + margin-top: 0.5rem; + border: 1px solid transparent; + background: transparent; + font-size: 1.65rem; + line-height: 1.2; + font-weight: 700; + padding: 0.3rem 0.4rem; + border-radius: 0.5rem; + outline: none; + resize: none; + overflow: hidden; + white-space: pre-wrap; + word-break: break-word; + font-family: inherit; + min-height: 2.4rem; +} +.hero-brick__title:hover { border-color: color-mix(in srgb, var(--outline-variant) 50%, transparent); } +.hero-brick__title:focus { border-color: var(--primary, #0d9488); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary, #0d9488) 18%, transparent); background: #fff; } + +.hero-brick__desc { + display: block; + width: 100%; + margin-top: 0.35rem; + border: 1px solid transparent; + background: transparent; + font-size: 0.95rem; + color: var(--ink-700, #374151); + padding: 0.3rem 0.4rem; + border-radius: 0.5rem; + resize: none; + overflow: hidden; + outline: none; + font-family: inherit; +} +.hero-brick__desc:hover { border-color: color-mix(in srgb, var(--outline-variant) 50%, transparent); } +.hero-brick__desc:focus { border-color: var(--primary, #0d9488); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary, #0d9488) 18%, transparent); background: #fff; } + +.hero-brick__chips { + margin-top: 0.65rem; + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + align-items: center; +} +.hero-brick__chip { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.25rem 0.55rem; + background: color-mix(in srgb, var(--surface, #fff) 80%, var(--outline-variant, #e5e7eb)); + border: 1px solid color-mix(in srgb, var(--outline-variant, #e5e7eb) 70%, transparent); + border-radius: 999px; + font-size: 0.85rem; + color: var(--ink-700, #374151); + cursor: pointer; +} +.hero-brick__chip--readonly { cursor: default; } +.hero-brick__chip input[type="number"] { + width: 3.2rem; + border: none; + background: transparent; + text-align: right; + font: inherit; + outline: none; + padding: 0; +} +.hero-brick__chip input[type="checkbox"] { accent-color: var(--primary, #0d9488); } + +body.ui-legacy .cabinet-disclosure { + border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); + border-radius: 1rem; + background: var(--surface); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); +} + +body.ui-legacy .cabinet-disclosure__summary { + cursor: pointer; + list-style: none; + user-select: none; + padding: 0.85rem 1rem 0.75rem; + font-size: 1.05rem; + border-radius: 1rem 1rem 0 0; + min-height: 2.75rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +body.ui-legacy .cabinet-disclosure__summary::-webkit-details-marker { display: none; } + +body.ui-legacy .cabinet-disclosure__summary::after { + content: 'expand_more'; + font-family: 'Material Symbols Outlined', sans-serif; + margin-left: auto; + font-size: 1.25rem; + opacity: 0.55; + transition: transform 0.2s ease; +} + +body.ui-legacy .cabinet-disclosure[open] .cabinet-disclosure__summary::after { + transform: rotate(180deg); +} + +body.ui-legacy .cabinet-disclosure__summary-text { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 0.15rem; + min-width: 0; +} + +body.ui-legacy .cabinet-disclosure__summary-title { + font-size: 1.05rem; + line-height: 1.25; +} + +body.ui-legacy .cabinet-disclosure__summary-sub { + display: block; + font-size: 0.8rem; + font-weight: 400; + line-height: 1.3; + color: #506965; +} + +body.ui-legacy .cabinet-disclosure__body { + padding: 0.7rem 1rem 1.05rem; + border-top: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); +} + +body.ui-legacy .test-detail-subsection { + margin-top: 1.25rem; + padding-top: 1.15rem; + border-top: 1px solid color-mix(in srgb, var(--outline-variant) 32%, transparent); +} + +body.ui-legacy .test-detail-subsection--tight { + margin-top: 0; + padding-top: 0; + border-top: none; +} + +body.ui-legacy .test-detail-subsection__title { + margin: 0 0 0.35rem; + font-size: 0.95rem; + font-weight: 600; +} + +body.ui-legacy .test-detail-hint { + margin: 0 0 0.6rem; + font-size: 0.8rem; + line-height: 1.4; + color: #506965; +} + +body.ui-legacy .test-detail-ai-panel { + padding: 0.9rem 1rem; + margin-bottom: 1.15rem; + background: var(--surface-container-low); + border: 1px solid color-mix(in srgb, var(--outline-variant) 32%, transparent); + border-radius: 0.85rem; + box-shadow: none; +} + +body.ui-legacy .assign-toolbar { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 0.65rem; +} + +@media (min-width: 520px) { + body.ui-legacy .assign-toolbar { + flex-direction: row; + flex-wrap: wrap; + align-items: center; + } +} + +body.ui-legacy .assign-toolbar__search { + flex: 1 1 200px; +} + +body.ui-legacy .assign-list { + max-height: min(40vh, 18rem); + overflow: auto; + border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); + border-radius: 0.75rem; + background: var(--surface-container-low); +} + +body.ui-legacy .assign-row { + display: flex; + gap: 0.5rem; + padding: 0.65rem 0.75rem; + border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 40%, transparent); + cursor: pointer; + align-items: center; +} + +body.ui-legacy .assign-row:last-child { border-bottom: none; } +body.ui-legacy .assign-row--selected, +body.ui-legacy .assign-row:hover { background: color-mix(in srgb, var(--primary) 8%, transparent); } + +body.ui-legacy .assign-row__text { + display: flex; + flex-direction: column; + gap: 0.2rem; + min-width: 0; + flex: 1; +} + +body.ui-legacy .assign-row__fio { font-weight: 600; font-size: 0.95rem; } +body.ui-legacy .assign-row__login { font-size: 0.8rem; color: #506965; font-family: ui-monospace, Menlo, monospace; } +body.ui-legacy .assign-row__meta { font-size: 0.8rem; color: #506965; line-height: 1.35; } + +body.ui-legacy .version-card-list, +body.ui-legacy .attempts-card-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 0.5rem; +} diff --git a/flask_app/app/static/img/clinic-logo.png b/flask_app/app/static/img/clinic-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..18f0accbd614f03d428592a6fe2f6d07f2bc3b7e GIT binary patch literal 52911 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 literal 0 HcmV?d00001 diff --git a/flask_app/app/static/js/editor.js b/flask_app/app/static/js/editor.js index b535bb2..fd51a65 100644 --- a/flask_app/app/static/js/editor.js +++ b/flask_app/app/static/js/editor.js @@ -25,14 +25,74 @@ const saveStatusEl = $('#save-status'); const aiStatusEl = $('#ai-status'); const chainActiveEl = $('#chain-active'); + const aiTopicEl = $('#ai-topic'); + const aiQCountEl = $('#ai-q-count'); + const aiOCountEl = $('#ai-o-count'); + const introUpdatedEl = $('#intro-updated'); + const introForkBannerEl = $('#intro-fork-banner'); + const versionsListEl = $('#versions-list'); + const attemptsListEl = $('#attempts-list'); + const visibilityBtn = $('#btn-toggle-visibility'); + const assignSearchEl = $('#assign-search'); + const assignDeptEl = $('#assign-dept'); + const assignClinicEl = $('#assign-clinic'); + const assignListEl = $('#assign-list'); + const assignSelectAllBtn = $('#assign-select-all'); + const assignSubmitBtn = $('#assign-submit'); + const assignStatusEl = $('#assign-status'); const tplQ = $('#tpl-question'); const tplO = $('#tpl-option'); let chainActive = true; + let assignPeople = []; + let assignSelected = new Set(); + let hasAnyAttempts = false; + let hasForkRisk = Boolean(initial?.test?.hasForkRisk) + || (introForkBannerEl && introForkBannerEl.dataset.forkRisk === '1'); + let baselineDraftKey = ''; + let dirtyCheckQueued = false; + + function currentDraftKey() { + return JSON.stringify(collectPayload()); + } + + function isDirty() { + return baselineDraftKey !== '' && baselineDraftKey !== currentDraftKey(); + } + + function updateForkBanner() { + if (!introForkBannerEl) return; + introForkBannerEl.style.display = (hasForkRisk && isDirty()) ? '' : 'none'; + } + + function scheduleDirtyCheck() { + if (dirtyCheckQueued) return; + dirtyCheckQueued = true; + requestAnimationFrame(() => { + dirtyCheckQueued = false; + updateForkBanner(); + }); + } + + function resetBaselineDraft() { + baselineDraftKey = currentDraftKey(); + updateForkBanner(); + } // ─── render ───────────────────────────────────────────────────────── + function syncOptionInputTypes(qNode) { + const isMulti = $('.q-multi', qNode).checked; + const qName = `q-correct-${Math.random().toString(36).slice(2)}`; + $$('.opt-correct', qNode).forEach((input) => { + input.type = isMulti ? 'checkbox' : 'radio'; + if (isMulti) input.removeAttribute('name'); + else input.setAttribute('name', qName); + input.classList.add('question-option-row__mark'); + }); + } + function renderQuestion(q) { const node = tplQ.content.firstElementChild.cloneNode(true); node._q = { id: q.id || null }; @@ -43,6 +103,7 @@ (q.options || []).forEach((o) => optsEl.appendChild(renderOption(o))); bindQuestionEvents(node); + syncOptionInputTypes(node); return node; } @@ -61,41 +122,86 @@ if (!confirm('Удалить вопрос?')) return; node.remove(); renumber(); + scheduleDirtyCheck(); }); $('.q-up', node).addEventListener('click', () => { if (node.previousElementSibling) { node.parentNode.insertBefore(node, node.previousElementSibling); renumber(); + scheduleDirtyCheck(); } }); $('.q-down', node).addEventListener('click', () => { if (node.nextElementSibling) { node.parentNode.insertBefore(node.nextElementSibling, node); renumber(); + scheduleDirtyCheck(); } }); $('.q-add-option', node).addEventListener('click', () => { $('.q-options', node).appendChild(renderOption({ text: '', isCorrect: false })); + syncOptionInputTypes(node); + scheduleDirtyCheck(); }); $('.q-ai', node).addEventListener('click', () => aiGenerateQuestion(node)); + $('.q-multi', node).addEventListener('change', () => { + syncOptionInputTypes(node); + scheduleDirtyCheck(); + }); } function renumber() { $$('#questions .q-item').forEach((li, i) => { $('.q-num', li).textContent = `Вопрос #${i + 1}`; }); - qCountEl.textContent = $$('#questions .q-item').length; + const n = $$('#questions .q-item').length; + if (qCountEl) qCountEl.textContent = n; + const mirror = document.getElementById('q-count-mirror'); + if (mirror) mirror.textContent = n; + } + + function autoResize(el) { + if (!el) return; + el.style.height = 'auto'; + el.style.height = el.scrollHeight + 'px'; } function loadInitial() { titleEl.value = initial.test.title || ''; descEl.value = initial.test.description || ''; + autoResize(titleEl); + autoResize(descEl); + if (titleEl && titleEl.tagName === 'TEXTAREA') { + titleEl.addEventListener('input', () => autoResize(titleEl)); + titleEl.addEventListener('keydown', (e) => { + if (e.key === 'Enter') e.preventDefault(); + }); + } + if (descEl) descEl.addEventListener('input', () => autoResize(descEl)); thresholdEl.value = initial.test.passingThreshold == null ? '' : Number(initial.test.passingThreshold); questionsEl.innerHTML = ''; (initial.questions || []).forEach((q) => questionsEl.appendChild(renderQuestion(q))); renumber(); + if (aiTopicEl && !aiTopicEl.value.trim()) { + aiTopicEl.value = initial.test.title || ''; + } + } + + function fmtDt(iso) { + if (!iso) return '—'; + try { + return new Date(iso).toLocaleString('ru-RU', { dateStyle: 'short', timeStyle: 'short' }); + } catch { + return '—'; + } + } + + function escHtml(s) { + return String(s == null ? '' : s) + .replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') + .replace(/"/g, '"').replace(/'/g, '''); } // ─── collect ─────────────────────────────────────────────────────── @@ -144,6 +250,7 @@ }), ); renumber(); + scheduleDirtyCheck(); }); $('#save-draft').addEventListener('click', async () => { @@ -167,6 +274,7 @@ saveStatusEl.textContent = data.forked ? 'Сохранено (создана новая версия — есть попытки прохождения).' : 'Сохранено.'; + resetBaselineDraft(); setTimeout(() => (saveStatusEl.textContent = ''), 4000); } catch (e) { saveStatusEl.textContent = ''; @@ -175,18 +283,24 @@ }); $('#ai-generate-test').addEventListener('click', async () => { - const shape = collectShape(); - if (!shape.length) { - alert('Сначала добавьте хотя бы один вопрос (его настройки определяют сетку).'); + const topic = (aiTopicEl?.value || titleEl.value || '').trim(); + if (!topic) { + alert('Укажите тему.'); return; } + const nQ = Math.min(30, Math.max(1, Number(aiQCountEl?.value || 7) || 7)); + const nO = Math.min(8, Math.max(2, Number(aiOCountEl?.value || 3) || 3)); + const shape = Array.from({ length: nQ }, () => ({ + optionsCount: nO, + hasMultipleAnswers: false, + })); aiStatusEl.textContent = 'Генерируем…'; try { const r = await fetch(`/api/tests/${TEST_ID}/ai/generate-test`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - testTitle: titleEl.value, + testTitle: topic, testDescription: descEl.value, shape, }), @@ -194,11 +308,15 @@ const data = await r.json(); if (!r.ok) throw new Error(data.error || 'AI: ошибка.'); const draft = data.draft; - if (draft.title) titleEl.value = draft.title; + if (draft.title) { + titleEl.value = draft.title; + if (aiTopicEl) aiTopicEl.value = draft.title; + } if (draft.description) descEl.value = draft.description; questionsEl.innerHTML = ''; (draft.questions || []).forEach((q) => questionsEl.appendChild(renderQuestion(q))); renumber(); + scheduleDirtyCheck(); aiStatusEl.textContent = `Готово: ${draft.questions?.length || 0} вопросов.`; setTimeout(() => (aiStatusEl.textContent = ''), 4000); } catch (e) { @@ -242,6 +360,7 @@ questionsEl.innerHTML = ''; (draft.questions || []).forEach((q) => questionsEl.appendChild(renderQuestion(q))); renumber(); + scheduleDirtyCheck(); aiStatusEl.textContent = `Применено: ${draft.questions?.length || 0} вопросов.`; setTimeout(() => (aiStatusEl.textContent = ''), 4000); } catch (e) { @@ -263,12 +382,6 @@ alert(msg); } - function escHtml(s) { - return String(s == null ? '' : s) - .replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>') - .replace(/"/g, '"').replace(/'/g, '''); - } - const modal = $('#ai-modal'); const modalTitle = $('#ai-modal-title'); const modalBody = $('#ai-modal-body'); @@ -290,7 +403,8 @@ modal.showModal(); } - $('#ai-generate-by-title').addEventListener('click', async () => { + const aiGenerateByTitleBtn = $('#ai-generate-by-title'); + if (aiGenerateByTitleBtn) aiGenerateByTitleBtn.addEventListener('click', async () => { const title = titleEl.value.trim(); if (!title) { alert('Сначала заполните название теста.'); @@ -334,6 +448,7 @@ questionsEl.innerHTML = ''; (draft.questions || []).forEach((q) => questionsEl.appendChild(renderQuestion(q))); renumber(); + scheduleDirtyCheck(); aiStatusEl.textContent = `Применено: ${draft.questions.length} вопросов.`; setTimeout(() => (aiStatusEl.textContent = ''), 4000); } catch (e) { @@ -342,7 +457,8 @@ } }); - $('#ai-check').addEventListener('click', async () => { + const aiCheckBtn = $('#ai-check'); + if (aiCheckBtn) aiCheckBtn.addEventListener('click', async () => { const payload = collectPayload(); if (!payload.questions.length) { alert('В тесте нет вопросов — нечего проверять.'); @@ -394,7 +510,8 @@ } }); - $('#ai-improve').addEventListener('click', async () => { + const aiImproveBtn = $('#ai-improve'); + if (aiImproveBtn) aiImproveBtn.addEventListener('click', async () => { const payload = collectPayload(); if (!payload.questions.length) { alert('В тесте нет вопросов — нечего улучшать.'); @@ -480,6 +597,7 @@ it.suggested.options.forEach((o) => optsEl.appendChild(renderOption(o))); }); modal.close(); + scheduleDirtyCheck(); aiStatusEl.textContent = 'Изменения применены. Не забудьте сохранить.'; setTimeout(() => (aiStatusEl.textContent = ''), 5000); }, @@ -517,6 +635,7 @@ data.options.forEach((o) => optsEl.appendChild(renderOption(o))); $('.q-multi', node).checked = !!data.hasMultipleAnswers; } + scheduleDirtyCheck(); aiStatusEl.textContent = data.mode === 'full' ? 'AI: вопрос сгенерирован.' : 'AI: формулировка обновлена.'; setTimeout(() => (aiStatusEl.textContent = ''), 4000); } catch (e) { @@ -542,5 +661,195 @@ chainActiveEl.checked = true; }); + function renderVersions(rows) { + if (!versionsListEl) return; + versionsListEl.innerHTML = ''; + (rows || []).forEach((r) => { + const li = document.createElement('li'); + li.className = 'surface-card version-card-list__item'; + li.innerHTML = ` + <div class="version-card-list__row"> + <div class="version-card-list__main"> + <div class="version-card-list__title-line"> + <span class="font-headline" style="font-size:1rem;">v${r.version}</span> + ${r.is_active ? '<span class="code-inline" style="font-size:0.7rem;">текущая</span>' : ''} + </div> + <p class="muted mono" style="margin:.4rem 0 0; font-size:.8rem;">${fmtDt(r.created_at)}</p> + <p class="muted" style="margin:.2rem 0 0; font-size:.8rem;">Активна: ${r.is_active ? 'да' : 'нет'}</p> + </div> + </div>`; + versionsListEl.appendChild(li); + }); + } + + function renderAttempts(rows) { + if (!attemptsListEl) return; + attemptsListEl.innerHTML = ''; + (rows || []).forEach((a) => { + const when = a.completedAt ? fmtDt(a.completedAt) : (a.startedAt ? fmtDt(a.startedAt) : '—'); + const result = a.status === 'completed' && a.totalQuestions != null + ? `${a.correctCount}/${a.totalQuestions}${a.passed ? ' · зачёт' : ' · незачёт'}` + : a.status; + const li = document.createElement('li'); + li.className = 'surface-card attempts-card-list__item'; + li.innerHTML = ` + <div class="attempts-card-list__row"> + <div class="attempts-card-list__main"> + <p class="muted mono" style="margin:0; font-size:.8rem;">${when}</p> + <p style="margin:.35rem 0 0; font-weight:600;">${escHtml(a.attempterName || '—')} + ${a.attempterLogin ? `<span class="code-inline" style="font-size:11px; margin-left:6px;">${escHtml(a.attempterLogin)}</span>` : ''} + </p> + <p class="muted" style="margin:.25rem 0 0; font-size:.85rem;">v${a.testVersion} · ${escHtml(result)}</p> + </div> + ${a.status === 'completed' + ? `<a class="btn btn-ghost btn--sm attempts-card-list__action" href="/tests/${TEST_ID}/attempts/${a.id}/review">Разбор</a>` + : ''} + </div>`; + attemptsListEl.appendChild(li); + }); + } + + function renderAssignList() { + if (!assignListEl) return; + assignListEl.innerHTML = ''; + assignPeople.forEach((p) => { + const row = document.createElement('label'); + row.className = `assign-row${assignSelected.has(String(p.staffId)) ? ' assign-row--selected' : ''}`; + row.innerHTML = ` + <input type="checkbox" ${assignSelected.has(String(p.staffId)) ? 'checked' : ''} /> + <span class="assign-row__text"> + <span class="assign-row__fio">${escHtml(p.fio || '—')}</span> + ${p.webLogin ? `<span class="assign-row__login">${escHtml(p.webLogin)}</span>` : ''} + <span class="assign-row__meta">${escHtml(p.department || '—')}${p.clinicUserId ? ' · есть учётка' : ' · нет учётки (создадим при назначении)'}</span> + </span>`; + const cb = row.querySelector('input'); + cb.addEventListener('change', () => { + const k = String(p.staffId); + if (cb.checked) assignSelected.add(k); else assignSelected.delete(k); + row.classList.toggle('assign-row--selected', cb.checked); + }); + assignListEl.appendChild(row); + }); + if (!assignPeople.length) assignListEl.innerHTML = '<p class="muted" style="padding:.75rem;">Никого не найдено.</p>'; + } + + async function loadDirectory() { + if (!assignListEl) return; + assignStatusEl.textContent = 'Загружаем…'; + try { + const params = new URLSearchParams(); + if (assignSearchEl.value.trim()) params.set('q', assignSearchEl.value.trim()); + if (assignDeptEl.value && assignDeptEl.value !== '__all__') params.set('department', assignDeptEl.value); + params.set('clinic', assignClinicEl.value || 'all'); + const r = await fetch(`/api/auth/dev/assignment-directory?${params.toString()}`); + const data = await r.json(); + if (!r.ok) throw new Error(data.error || 'Не удалось загрузить сотрудников'); + assignPeople = data.people || []; + const depts = data.departments || []; + if (assignDeptEl.options.length <= 1) { + depts.forEach((d) => { + const o = document.createElement('option'); + o.value = d; + o.textContent = d; + assignDeptEl.appendChild(o); + }); + } + assignSelected = new Set(); + renderAssignList(); + assignStatusEl.textContent = ''; + } catch (e) { + assignStatusEl.textContent = e.message || 'Ошибка загрузки'; + } + } + + if (assignSearchEl) { + let t = null; + assignSearchEl.addEventListener('input', () => { + clearTimeout(t); + t = setTimeout(loadDirectory, 350); + }); + assignDeptEl.addEventListener('change', loadDirectory); + assignClinicEl.addEventListener('change', loadDirectory); + assignSelectAllBtn.addEventListener('click', () => { + assignPeople.forEach((p) => assignSelected.add(String(p.staffId))); + renderAssignList(); + }); + assignSubmitBtn.addEventListener('click', async () => { + const selectedRows = assignPeople.filter((p) => assignSelected.has(String(p.staffId))); + const userIds = selectedRows.filter((p) => p.clinicUserId).map((p) => p.clinicUserId); + const staffIds = selectedRows.filter((p) => !p.clinicUserId && p.staffId != null).map((p) => p.staffId); + if (!userIds.length && !staffIds.length) return; + assignStatusEl.textContent = 'Назначаем…'; + try { + const r = await fetch(`/api/tests/${TEST_ID}/assign`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ userIds, staffIds }), + }); + const data = await r.json(); + if (!r.ok) throw new Error(data.error || 'Ошибка назначения'); + assignStatusEl.textContent = `Назначено: ${data.count ?? selectedRows.length}`; + } catch (e) { + assignStatusEl.textContent = e.message || 'Ошибка назначения'; + } + }); + loadDirectory(); + } + + if (visibilityBtn) { + visibilityBtn.addEventListener('click', async () => { + const next = !chainActiveEl.checked; + try { + const r = await fetch(`/api/tests/${TEST_ID}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ chainActive: next }), + }); + const data = await r.json(); + if (!r.ok) throw new Error(data.error || 'Ошибка изменения видимости'); + chainActiveEl.checked = !!next; + chainActive = !!next; + visibilityBtn.textContent = chainActive ? 'Скрыть из списка' : 'Снова показать в списке'; + } catch (e) { + alert(e.message || 'Ошибка изменения видимости'); + } + }); + } + + Promise.all([ + fetch(`/api/tests/${TEST_ID}/versions`).then((r) => r.json()).catch(() => null), + fetch(`/api/tests/${TEST_ID}/attempts`).then((r) => r.json()).catch(() => null), + fetch(`/api/tests/${TEST_ID}/summary`).then((r) => r.json()).catch(() => null), + ]).then(([v, a, s]) => { + if (v && Array.isArray(v.versions)) { + renderVersions(v.versions); + hasForkRisk = hasForkRisk || (v.versions.length > 1); + if (typeof v.hasAttempts === 'boolean') { + hasAnyAttempts = hasAnyAttempts || v.hasAttempts; + hasForkRisk = hasForkRisk || v.hasAttempts; + } + } + if (a && Array.isArray(a.attempts)) { + renderAttempts(a.attempts); + hasAnyAttempts = a.attempts.length > 0; + } + if (s && s.test) { + if (introUpdatedEl) introUpdatedEl.textContent = fmtDt(s.test.updated_at || s.test.updatedAt); + const versionEl = document.getElementById('intro-version'); + if (versionEl && s.test.version != null) versionEl.textContent = s.test.version; + if (typeof s.test.hasAttempts === 'boolean') { + hasAnyAttempts = hasAnyAttempts || s.test.hasAttempts; + hasForkRisk = hasForkRisk || s.test.hasAttempts; + } + if (typeof s.test.versionCount === 'number') { + hasForkRisk = hasForkRisk || s.test.versionCount > 1; + } + } + updateForkBanner(); + }); + loadInitial(); + resetBaselineDraft(); + root.addEventListener('input', scheduleDirtyCheck); + root.addEventListener('change', scheduleDirtyCheck); })(); diff --git a/flask_app/app/templates/auth/login.html b/flask_app/app/templates/auth/login.html index 01763ca..a74c465 100644 --- a/flask_app/app/templates/auth/login.html +++ b/flask_app/app/templates/auth/login.html @@ -2,57 +2,99 @@ {% block title %}Вход — Тестирование{% endblock %} {% block content %} -<section class="mx-auto max-w-md mt-8"> - <div class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-6"> - <div class="flex items-center gap-2"> - <span class="material-symbols-outlined text-brand-600">login</span> - <h1 class="text-xl font-semibold">Вход в систему</h1> +{% if ui_variant == 'legacy' %} + <div class="login-page"> + <div class="login-shell"> + <div class="login-logo"> + <img src="{{ url_for('static', filename='img/clinic-logo.png') }}" + alt="Логотип клиники" class="login-logo__img" /> + <h1 class="font-headline">Тестирование</h1> + </div> + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + <div class="callout callout--error" style="margin-bottom: 1rem;"> + {% for category, msg in messages %} + {% if category == 'error' %}{{ msg }}{% endif %} + {% endfor %} + </div> + {% endif %} + {% endwith %} + + <div class="login-card"> + <form method="post" action="{{ url_for('auth.login_submit') }}" novalidate> + <input type="hidden" name="next" value="{{ next or '/' }}"> + + <div class="form-field"> + <label class="form-label" for="login-username">Логин</label> + <input id="login-username" class="form-input" type="text" name="login" + value="{{ login or '' }}" required autofocus autocomplete="username" /> + </div> + + <div class="form-field"> + <label class="form-label" for="login-password">Пароль</label> + <input id="login-password" class="form-input" type="password" name="password" + required autocomplete="current-password" /> + </div> + + <button type="submit" class="btn btn-primary">Войти</button> + </form> + </div> </div> - <p class="mt-1 text-sm text-ink-500"> - Используйте логин и пароль. - {% if hr_auth_enabled %} - Учётка кадровой системы (HR). - {% endif %} - </p> - - {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} - <div class="mt-4 space-y-2"> - {% for category, msg in messages %} - <div class="px-3 py-2 rounded-lg text-sm - {% if category == 'error' %}bg-red-50 text-red-700 border border-red-200 - {% else %}bg-brand-50 text-brand-700 border border-brand-100{% endif %}"> - {{ msg }} - </div> - {% endfor %} - </div> - {% endif %} - {% endwith %} - - <form method="post" action="{{ url_for('auth.login_submit') }}" class="mt-5 space-y-4" novalidate> - <input type="hidden" name="next" value="{{ next or '/' }}"> - - <label class="block"> - <span class="text-sm font-medium text-ink-700">Логин</span> - <input type="text" name="login" value="{{ login or '' }}" required autofocus autocomplete="username" - class="mt-1 w-full rounded-lg border border-ink-300 bg-white px-3 py-2 text-ink-900 - focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> - </label> - - <label class="block"> - <span class="text-sm font-medium text-ink-700">Пароль</span> - <input type="password" name="password" required autocomplete="current-password" - class="mt-1 w-full rounded-lg border border-ink-300 bg-white px-3 py-2 text-ink-900 - focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> - </label> - - <button type="submit" - class="w-full inline-flex items-center justify-center gap-2 rounded-lg - bg-brand-600 hover:bg-brand-700 text-white font-medium px-4 py-2 transition"> - <span class="material-symbols-outlined text-base">login</span> - Войти - </button> - </form> </div> -</section> +{% else %} + <section class="mx-auto max-w-md mt-8"> + <div class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-6"> + <div class="flex items-center gap-2"> + <span class="material-symbols-outlined text-brand-600">login</span> + <h1 class="text-xl font-semibold">Вход в систему</h1> + </div> + <p class="mt-1 text-sm text-ink-500"> + Используйте логин и пароль. + {% if hr_auth_enabled %} + Учётка кадровой системы (HR). + {% endif %} + </p> + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + <div class="mt-4 space-y-2"> + {% for category, msg in messages %} + <div class="px-3 py-2 rounded-lg text-sm + {% if category == 'error' %}bg-red-50 text-red-700 border border-red-200 + {% else %}bg-brand-50 text-brand-700 border border-brand-100{% endif %}"> + {{ msg }} + </div> + {% endfor %} + </div> + {% endif %} + {% endwith %} + + <form method="post" action="{{ url_for('auth.login_submit') }}" class="mt-5 space-y-4" novalidate> + <input type="hidden" name="next" value="{{ next or '/' }}"> + + <label class="block"> + <span class="text-sm font-medium text-ink-700">Логин</span> + <input type="text" name="login" value="{{ login or '' }}" required autofocus autocomplete="username" + class="mt-1 w-full rounded-lg border border-ink-300 bg-white px-3 py-2 text-ink-900 + focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> + </label> + + <label class="block"> + <span class="text-sm font-medium text-ink-700">Пароль</span> + <input type="password" name="password" required autocomplete="current-password" + class="mt-1 w-full rounded-lg border border-ink-300 bg-white px-3 py-2 text-ink-900 + focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> + </label> + + <button type="submit" + class="w-full inline-flex items-center justify-center gap-2 rounded-lg + bg-brand-600 hover:bg-brand-700 text-white font-medium px-4 py-2 transition"> + <span class="material-symbols-outlined text-base">login</span> + Войти + </button> + </form> + </div> + </section> +{% endif %} {% endblock %} diff --git a/flask_app/app/templates/base.html b/flask_app/app/templates/base.html index 483e698..c6837aa 100644 --- a/flask_app/app/templates/base.html +++ b/flask_app/app/templates/base.html @@ -8,7 +8,7 @@ {# Tailwind CDN — на E1.0 этого достаточно. В Этапе 2/CI можно заменить на сборку. #} <script src="https://cdn.tailwindcss.com"></script> <script> - // Минимальная палитра в стиле кабинета HR. Без зависимостей от HR-репо. + // Палитра/типографика в стиле webapp-nginx (cabinet-theme). tailwind.config = { theme: { extend: { @@ -17,18 +17,19 @@ }, colors: { brand: { - 50: '#eef2ff', - 100: '#e0e7ff', - 500: '#6366f1', - 600: '#4f46e5', - 700: '#4338ca', + 50: '#ecf7f6', + 100: '#d9efec', + 300: '#9bd7d0', + 500: '#007168', + 600: '#00645b', + 700: '#00574f', }, ink: { - 900: '#0f172a', - 700: '#334155', - 500: '#64748b', - 300: '#cbd5e1', - 100: '#f1f5f9', + 900: '#0d1b1d', + 700: '#3d5357', + 500: '#506965', + 300: '#b9bc94', + 100: '#f3f8f9', }, }, }, @@ -39,7 +40,7 @@ <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link - href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap" + href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@600;700;800&display=swap" rel="stylesheet" /> <link @@ -50,65 +51,97 @@ <link rel="stylesheet" href="{{ url_for('static', filename='css/app.css') }}" /> {% block head %}{% endblock %} </head> -<body class="min-h-screen bg-ink-100 text-ink-900 font-sans antialiased"> - <header class="sticky top-0 z-30 bg-white/90 backdrop-blur border-b border-ink-300/60"> - <div class="mx-auto max-w-6xl px-4 h-14 flex items-center justify-between"> - <a href="{{ url_for('main.index') }}" class="flex items-center gap-2 font-semibold text-ink-900"> - <span class="material-symbols-outlined text-brand-600">quiz</span> - <span>Тестирование</span> - </a> - <nav class="flex items-center gap-1 sm:gap-2 text-sm"> - {% if current_user %} - <a href="{{ url_for('tests.tests_list_page') }}" - class="inline-flex items-center justify-center gap-1 - min-w-10 min-h-10 px-2 sm:px-3 rounded-lg - text-ink-700 hover:bg-ink-100" - title="Каталог тестов" aria-label="Каталог тестов"> - <span class="material-symbols-outlined text-base">list_alt</span> - <span class="hidden sm:inline">Тесты</span> +<body data-ui-variant="{{ ui_variant }}" + class="min-h-screen bg-ink-100 text-ink-900 font-sans antialiased ui-{{ ui_variant }}"> + {% if ui_variant == 'legacy' %} + <div class="cabinet-app"> + <header class="cabinet-header"> + <div class="cabinet-header__inner"> + <a href="{{ url_for('tests.tests_list_page') }}" class="cabinet-brand"> + <img src="{{ url_for('static', filename='img/clinic-logo.png') }}" + alt="Логотип клиники" class="cabinet-brand__logo" /> + <div> + <div class="cabinet-brand__title">Тестирование</div> + </div> </a> - <a href="{{ url_for('settings.settings_page') }}" - class="inline-flex items-center justify-center gap-1 - min-w-10 min-h-10 px-2 sm:px-3 rounded-lg - text-ink-700 hover:bg-ink-100" - title="Настройки" aria-label="Настройки"> - <span class="material-symbols-outlined text-base">settings</span> - <span class="hidden sm:inline">Настройки</span> - </a> - <span class="hidden md:inline text-ink-500"> - {{ current_user.full_name or current_user.login }} - <span class="text-ink-300">·</span> - <span class="text-brand-700">{{ current_user.role }}</span> - </span> - <form method="post" action="{{ url_for('auth.logout') }}" class="inline"> - <button type="submit" - class="inline-flex items-center justify-center gap-1 - min-w-10 min-h-10 px-2 sm:px-3 rounded-lg - text-ink-700 hover:bg-ink-100 transition" - title="Выйти" aria-label="Выйти"> - <span class="material-symbols-outlined text-base">logout</span> - <span class="hidden sm:inline">Выйти</span> - </button> - </form> - {% else %} - <a href="{{ url_for('auth.login_page') }}" - class="inline-flex items-center gap-1 px-3 py-2 rounded-lg - text-brand-700 hover:bg-brand-50 transition min-h-10"> - <span class="material-symbols-outlined text-base">login</span> - Войти - </a> - {% endif %} - </nav> + <div class="cabinet-header__actions"> + {% if current_user %} + <span class="cabinet-user" title="{{ (current_user.full_name or current_user.login) ~ (' · ' ~ format_role(current_user.role) if format_role(current_user.role) else '') }}"> + {{ format_name_short(current_user.full_name, current_user.login) }} + {% if format_role(current_user.role) %}<span class="cabinet-user__role"> · {{ format_role(current_user.role) }}</span>{% endif %} + </span> + <form method="post" action="{{ url_for('auth.logout') }}" class="inline"> + <button type="submit" class="btn btn-ghost">Выйти</button> + </form> + {% else %} + <a href="{{ url_for('auth.login_page') }}" class="btn btn-ghost">Войти</a> + {% endif %} + </div> + </div> + </header> + <main class="cabinet-main"> + {% block content scoped %}{% endblock %} + </main> </div> - </header> - - <main class="mx-auto max-w-6xl px-4 py-6"> - {% block content %}{% endblock %} - </main> - - <footer class="mx-auto max-w-6xl px-4 py-8 text-xs text-ink-500"> - {% block footer %}testing-flask-app · Этап 1{% endblock %} - </footer> + {% else %} + <header class="sticky top-0 z-30 bg-white/90 backdrop-blur border-b border-ink-300/50"> + <div class="mx-auto max-w-2xl px-4 h-14 flex items-center justify-between"> + <a href="{{ url_for('main.index') }}" class="flex items-center gap-2 font-semibold text-ink-900"> + <img src="{{ url_for('static', filename='img/clinic-logo.png') }}" + alt="Логотип клиники" class="h-7 w-7 object-contain" /> + <span>Тестирование</span> + </a> + <nav class="flex items-center gap-1 sm:gap-2 text-sm"> + {% if current_user %} + <a href="{{ url_for('tests.tests_list_page') }}" + class="inline-flex items-center justify-center gap-1 + min-w-10 min-h-10 px-2 sm:px-3 rounded-lg + text-ink-700 hover:bg-ink-100" + title="Каталог тестов" aria-label="Каталог тестов"> + <span class="material-symbols-outlined text-base">list_alt</span> + <span class="hidden sm:inline">Тесты</span> + </a> + <a href="{{ url_for('settings.settings_page') }}" + class="inline-flex items-center justify-center gap-1 + min-w-10 min-h-10 px-2 sm:px-3 rounded-lg + text-ink-700 hover:bg-ink-100" + title="Настройки" aria-label="Настройки"> + <span class="material-symbols-outlined text-base">settings</span> + <span class="hidden sm:inline">Настройки</span> + </a> + <span class="hidden md:inline text-ink-500"> + {{ current_user.full_name or current_user.login }} + <span class="text-ink-300">·</span> + <span class="text-brand-700">{{ format_role(current_user.role) }}</span> + </span> + <form method="post" action="{{ url_for('auth.logout') }}" class="inline"> + <button type="submit" + class="inline-flex items-center justify-center gap-1 + min-w-10 min-h-10 px-2 sm:px-3 rounded-lg + text-ink-700 hover:bg-ink-100 transition" + title="Выйти" aria-label="Выйти"> + <span class="material-symbols-outlined text-base">logout</span> + <span class="hidden sm:inline">Выйти</span> + </button> + </form> + {% else %} + <a href="{{ url_for('auth.login_page') }}" + class="inline-flex items-center gap-1 px-3 py-2 rounded-lg + text-brand-700 hover:bg-brand-50 transition min-h-10"> + <span class="material-symbols-outlined text-base">login</span> + Войти + </a> + {% endif %} + </nav> + </div> + </header> + <main class="mx-auto max-w-2xl px-4 py-6"> + {{ self.content() }} + </main> + <footer class="mx-auto max-w-2xl px-4 py-8 text-xs text-ink-500"> + {% block footer %}testing-flask-app · Этап 1{% endblock %} + </footer> + {% endif %} {% block scripts %}{% endblock %} </body> diff --git a/flask_app/app/templates/settings.html b/flask_app/app/templates/settings.html index 39cc89d..43444cf 100644 --- a/flask_app/app/templates/settings.html +++ b/flask_app/app/templates/settings.html @@ -2,13 +2,13 @@ {% block title %}Настройки — LLM{% endblock %} {% block content %} -<section class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-6 max-w-2xl"> +<section class="{% if ui_variant == 'legacy' %}surface-card{% else %}rounded-2xl bg-white shadow-sm border border-ink-300/60{% endif %} p-6 max-w-2xl"> <div class="flex items-center gap-2"> <span class="material-symbols-outlined text-brand-600">settings</span> <h1 class="text-2xl font-semibold">Настройки</h1> </div> - <h2 class="mt-5 font-semibold">Подключение к LLM</h2> + <h2 class="mt-5 font-semibold {% if ui_variant == 'legacy' %}font-headline{% endif %}">Подключение к LLM</h2> <p class="mt-1 text-sm text-ink-500"> Ключ задаётся в <code class="px-1 py-0.5 rounded bg-ink-100">.env</code> сервера (общий, не на пользователя). Поддерживаются DeepSeek и OpenAI-совместимые API. @@ -53,8 +53,7 @@ OPENAI_API_KEY=sk-... <div class="mt-5 flex items-center gap-3"> <button id="btn-ping" - class="inline-flex items-center gap-2 px-4 py-2 rounded-lg - bg-brand-600 hover:bg-brand-700 text-white text-sm"> + class="{% if ui_variant == 'legacy' %}btn btn-primary{% else %}inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-brand-600 hover:bg-brand-700 text-white text-sm{% endif %}"> <span class="material-symbols-outlined text-base">cable</span> Проверить подключение </button> diff --git a/flask_app/app/templates/tests/attempt.html b/flask_app/app/templates/tests/attempt.html new file mode 100644 index 0000000..34c8f1f --- /dev/null +++ b/flask_app/app/templates/tests/attempt.html @@ -0,0 +1,136 @@ +{% extends "base.html" %} +{% block title %}Прохождение теста{% endblock %} + +{% block content %} +<div class="test-detail-page" id="attempt-root" data-test-id="{{ test_id }}" data-attempt-id="{{ attempt_id }}"> + <p class="link-back"><a href="/tests">← к списку тестов</a></p> + <h1 class="font-headline" style="font-size:1.35rem;margin-top:0;" id="attempt-title">Загрузка…</h1> + <p class="text-muted" style="margin-top:0;" id="attempt-subtitle"></p> + <p class="error-text" id="attempt-error" style="display:none;"></p> + + <ol id="questions-list" style="padding-left:1.25rem;"></ol> + + <div class="inline-actions" style="margin-top:1rem;"> + <button type="button" class="btn btn-primary" id="submit-attempt-btn">Завершить тест</button> + </div> + + <div id="attempt-result" class="surface-card" style="display:none;margin-top:1rem;padding:1rem;"></div> +</div> + +<script> +(() => { + const root = document.getElementById('attempt-root'); + const testId = root.dataset.testId; + const attemptId = root.dataset.attemptId; + const titleEl = document.getElementById('attempt-title'); + const subEl = document.getElementById('attempt-subtitle'); + const errEl = document.getElementById('attempt-error'); + const listEl = document.getElementById('questions-list'); + const resultEl = document.getElementById('attempt-result'); + const submitBtn = document.getElementById('submit-attempt-btn'); + let playData = null; + const selections = {}; + + function esc(s) { + return String(s ?? '').replace(/[&<>"']/g, (m) => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m])); + } + function setErr(msg) { + errEl.textContent = msg || 'Ошибка.'; + errEl.style.display = ''; + } + function isSelected(qid, oid) { + return (selections[String(qid)] || []).includes(String(oid)); + } + function toggle(qid, oid, multi) { + const k = String(qid); + const cur = selections[k] || []; + const id = String(oid); + if (multi) { + selections[k] = cur.includes(id) ? cur.filter(x => x !== id) : [...cur, id]; + return; + } + selections[k] = [id]; + } + function renderQuestions() { + listEl.innerHTML = ''; + for (const q of (playData.questions || [])) { + const li = document.createElement('li'); + li.style.marginBottom = '1.5rem'; + li.innerHTML = '<p style="margin-top:0;margin-bottom:0.5rem;">' + esc(q.text) + '</p>'; + const ul = document.createElement('ul'); + ul.style.listStyle = 'none'; + ul.style.padding = '0'; + ul.style.margin = '0'; + for (const o of (q.options || [])) { + const row = document.createElement('li'); + row.style.marginBottom = '6px'; + const type = q.hasMultipleAnswers ? 'checkbox' : 'radio'; + const name = 'q-' + q.id; + row.innerHTML = + '<label style="display:flex;align-items:flex-start;gap:8px;cursor:pointer;">' + + '<input type="' + type + '" ' + (q.hasMultipleAnswers ? '' : ('name="' + name + '"')) + ' ' + (isSelected(q.id, o.id) ? 'checked' : '') + ' />' + + '<span>' + esc(o.text) + '</span>' + + '</label>'; + const input = row.querySelector('input'); + input.addEventListener('change', () => { + toggle(q.id, o.id, q.hasMultipleAnswers); + renderQuestions(); + }); + ul.appendChild(row); + } + li.appendChild(ul); + listEl.appendChild(li); + } + } + + async function load() { + try { + const r = await fetch('/api/tests/' + testId + '/attempts/' + attemptId + '/play'); + const data = await r.json().catch(() => ({})); + if (!r.ok) throw new Error(data.error || 'Не удалось открыть попытку.'); + playData = data; + titleEl.textContent = data.testTitle || 'Прохождение теста'; + subEl.textContent = 'Порог зачёта: ' + (data.passingThreshold ?? 0) + '%.'; + if (!Array.isArray(data.questions) || !data.questions.length) { + setErr('В активной версии нет вопросов.'); + submitBtn.disabled = true; + return; + } + renderQuestions(); + } catch (e) { + setErr(e.message); + submitBtn.disabled = true; + } + } + + async function submit() { + submitBtn.disabled = true; + submitBtn.textContent = 'Отправка…'; + try { + const r = await fetch('/api/tests/' + testId + '/attempts/' + attemptId + '/submit', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ answers: selections }), + }); + const data = await r.json().catch(() => ({})); + if (!r.ok) throw new Error(data.error || 'Не удалось завершить попытку.'); + resultEl.style.display = ''; + resultEl.innerHTML = + '<h3 style="margin-top:0;">Результат</h3>' + + '<p>Правильно: <strong>' + data.correctCount + '</strong> из ' + data.totalQuestions + + ' (' + data.percent + '%). Порог: ' + data.passingThreshold + '%.</p>' + + '<p class="' + (data.passed ? 'text-muted' : 'error-text') + '">' + (data.passed ? 'Зачёт.' : 'Незачёт.') + '</p>' + + '<p><a href="/tests/' + testId + '/attempts/' + data.attemptId + '/review">Разбор попытки</a></p>'; + submitBtn.style.display = 'none'; + } catch (e) { + setErr(e.message); + submitBtn.disabled = false; + submitBtn.textContent = 'Завершить тест'; + } + } + + submitBtn.addEventListener('click', submit); + load(); +})(); +</script> +{% endblock %} diff --git a/flask_app/app/templates/tests/attempt_review.html b/flask_app/app/templates/tests/attempt_review.html new file mode 100644 index 0000000..18a55f0 --- /dev/null +++ b/flask_app/app/templates/tests/attempt_review.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} +{% block title %}Разбор попытки{% endblock %} + +{% block content %} +<div class="test-detail-page"> + <p class="link-back"><a href="/tests">← к списку тестов</a></p> + <h1 class="font-headline" style="font-size:1.35rem;margin-top:0;">Разбор: {{ review.testTitle }}</h1> + <p> + Правильно: <strong>{{ review.correctCount }}</strong> из {{ review.totalQuestions }} + ({{ review.percent }}%). Порог: {{ review.passingThreshold }}%. + {% if review.passed %} + <span class="text-muted">Зачёт.</span> + {% else %} + <span class="error-text">Незачёт.</span> + {% endif %} + </p> + + <div class="attempts-card-list"> + {% for q in review.questions %} + <article class="attempt-card"> + <div class="attempt-card__meta"> + <span>{{ 'Верно' if q.isUserCorrect else 'Ошибка' }}</span> + </div> + <p style="margin-top:.25rem;"><strong>{{ loop.index }}.</strong> {{ q.text }}</p> + <ul style="list-style:none;padding-left:0;margin:0;"> + {% for o in q.options %} + <li style="margin:.25rem 0;"> + <span> + {% if o.selected %}☑{% else %}☐{% endif %} + {{ o.text }} + {% if o.isCorrect %}<strong> (правильный)</strong>{% endif %} + </span> + </li> + {% endfor %} + </ul> + </article> + {% endfor %} + </div> +</div> +{% endblock %} diff --git a/flask_app/app/templates/tests/editor.html b/flask_app/app/templates/tests/editor.html index ce84228..264d57c 100644 --- a/flask_app/app/templates/tests/editor.html +++ b/flask_app/app/templates/tests/editor.html @@ -3,88 +3,86 @@ {% block content %} <div id="editor-root" - class="space-y-4 sm:space-y-5 pb-24" + class="space-y-4 sm:space-y-5 pb-24 {% if ui_variant == 'legacy' %}test-detail-page test-detail-page--with-fixed-actions{% endif %}" data-test-id="{{ test_id }}" data-initial='{{ content | tojson | safe }}'> - {# ── 1. Шапка теста ─────────────────────────────────────────── #} - <section class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-4 sm:p-5"> - <h2 class="text-xs font-medium text-ink-500 uppercase tracking-wide">Тест</h2> - - <label class="mt-2 block"> - <span class="sr-only">Название</span> - <input id="test-title" type="text" maxlength="200" placeholder="Название теста" - class="w-full rounded-lg border border-ink-300 px-3 py-3 text-lg font-semibold - focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> - </label> + <section class="cabinet-brick cabinet-brick--hero hero-brick"> + <div class="hero-brick__nav"> + <a href="{{ url_for('tests.tests_list_page') }}" class="link-back">← к списку</a> + <span class="hero-brick__meta"> + <span>Автор: <b id="intro-author">Вы</b></span> + <span class="hero-brick__sep">·</span> + <span>Обновлён: <span id="intro-updated">—</span></span> + <span class="hero-brick__sep">·</span> + <span>Версия <span id="intro-version">—</span></span> + </span> + </div> - <label class="mt-3 block"> - <span class="text-xs font-medium text-ink-500">Описание</span> - <textarea id="test-description" rows="2" placeholder="Краткое описание (необязательно)" - class="mt-1 w-full rounded-lg border border-ink-300 px-3 py-2 - focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20"></textarea> - </label> + <textarea id="test-title" maxlength="200" rows="1" placeholder="Название теста" + class="hero-brick__title font-headline"></textarea> - <label class="mt-3 flex items-center justify-between gap-3"> - <span class="text-xs font-medium text-ink-500">Проходной балл, %</span> - <input id="test-threshold" type="number" min="0" max="100" step="1" - inputmode="numeric" - class="w-24 text-right rounded-lg border border-ink-300 px-3 py-2 - focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" /> - </label> - </section> + <textarea id="test-description" rows="2" placeholder="Краткое описание (необязательно)" + class="hero-brick__desc"></textarea> - {# ── 2. AI-помощник ─────────────────────────────────────────── #} - <section class="rounded-2xl bg-brand-50/60 border border-brand-100 p-4 sm:p-5"> - <div class="flex items-center gap-2"> - <span class="material-symbols-outlined text-brand-600">auto_awesome</span> - <h2 class="font-semibold text-brand-700">AI-помощник</h2> + <div class="hero-brick__chips"> + <label class="hero-brick__chip"> + <span>Порог зачёта</span> + <input id="test-threshold" type="number" min="0" max="100" step="1" inputmode="numeric" /> + <span>%</span> + </label> + <span class="hero-brick__chip hero-brick__chip--readonly"> + Вопросов: <b id="q-count">0</b> + </span> + <label class="hero-brick__chip"> + <input id="chain-active" type="checkbox" /> + <span>Активна в каталоге</span> + </label> </div> - {# Группа A — генерация. Главные действия. На sm+ — в одну строку. #} - <div class="mt-3"> - <p class="text-xs font-medium text-ink-500 uppercase tracking-wide">Создать вопросы</p> - <div class="mt-2 grid grid-cols-1 sm:grid-cols-2 gap-2"> - <button id="ai-generate-by-title" - class="inline-flex items-center justify-center gap-2 px-3 py-3 rounded-lg - bg-brand-600 hover:bg-brand-700 text-white text-sm font-medium min-h-11"> - <span class="material-symbols-outlined text-base">edit_note</span> - По названию - </button> - <button id="ai-generate-test" - class="inline-flex items-center justify-center gap-2 px-3 py-3 rounded-lg - bg-white border border-brand-300/60 text-brand-700 hover:bg-brand-50 - text-sm font-medium min-h-11"> - <span class="material-symbols-outlined text-base">stars</span> - По текущей сетке - </button> - </div> + <div id="intro-fork-banner" class="callout callout--warning" data-fork-risk="{{ '1' if content.test.hasForkRisk else '0' }}" style="margin-top:0.85rem; display:none;"> + При сохранении будет создана новая версия теста. </div> + </section> - {# Группа B — анализ существующего. #} - <div class="mt-4"> - <p class="text-xs font-medium text-ink-500 uppercase tracking-wide">Улучшить существующее</p> - <div class="mt-2 grid grid-cols-2 gap-2"> - <button id="ai-check" - class="inline-flex items-center justify-center gap-2 px-3 py-3 rounded-lg - bg-white border border-ink-300/60 hover:border-brand-300 - text-sm min-h-11"> - <span class="material-symbols-outlined text-base">fact_check</span> - Проверить - </button> - <button id="ai-improve" - class="inline-flex items-center justify-center gap-2 px-3 py-3 rounded-lg - bg-white border border-ink-300/60 hover:border-brand-300 - text-sm min-h-11"> - <span class="material-symbols-outlined text-base">tune</span> - Улучшить + <details class="cabinet-disclosure cabinet-brick" open> + <summary class="cabinet-disclosure__summary"> + <span class="cabinet-disclosure__summary-text"> + <span class="cabinet-disclosure__summary-title font-headline">Вопросы</span> + <span class="cabinet-disclosure__summary-sub">Тексты, варианты и при необходимости загрузка из файла</span> + </span> + </summary> + <div class="cabinet-disclosure__body"> + <section class="rounded-2xl bg-brand-50/60 border border-brand-100 p-4 sm:p-5 test-detail-ai-panel"> + <div class="question-editor-block question-editor-block--first"> + <h3 class="test-detail-subsection__title" style="margin-top:0;">Генерация сетки вопросов (ИИ)</h3> + <label class="block"> + <span class="form-label">Тема</span> + <input id="ai-topic" type="text" class="form-input" placeholder="Например: Введение про LLM" /> + </label> + <div class="mt-3 flex flex-wrap items-end gap-3"> + <label class="block"> + <span class="form-label">Вопросов</span> + <input id="ai-q-count" type="number" min="1" max="30" step="1" value="7" + class="form-input" style="width:90px;" /> + </label> + <label class="block"> + <span class="form-label">Вариантов</span> + <input id="ai-o-count" type="number" min="2" max="8" step="1" value="3" + class="form-input" style="width:90px;" /> + </label> + <button id="ai-generate-test" + class="btn btn-ghost" type="button" style="min-height:43px;"> + Сгенерировать тест (ИИ) </button> </div> </div> - {# Группа C — импорт. #} - <div class="mt-4"> - <p class="text-xs font-medium text-ink-500 uppercase tracking-wide">Импортировать</p> + <div class="question-editor-block test-detail-subsection test-detail-subsection--import"> + <h3 class="test-detail-subsection__title">Документ в вопросы</h3> + <p class="muted test-detail-hint" style="margin-top:0;"> + PDF, Word или текст — вставьте в черновик вопросов. + </p> <label class="mt-2 inline-flex w-full items-center justify-center gap-2 px-3 py-3 rounded-lg bg-white border border-ink-300/60 hover:border-brand-300 text-sm cursor-pointer min-h-11"> @@ -103,10 +101,11 @@ {# ── 3. Вопросы ─────────────────────────────────────────────── #} <section> <div class="flex items-center justify-between gap-2 px-1"> - <h2 class="font-semibold">Вопросы (<span id="q-count">0</span>)</h2> + <h2 class="font-semibold">Вопросы (<span id="q-count-mirror">0</span>)</h2> <button id="add-question" class="inline-flex items-center gap-1 px-3 py-2 rounded-lg - bg-white border border-ink-300/60 hover:border-brand-300 text-sm min-h-10"> + bg-white border border-ink-300/60 hover:border-brand-300 text-sm min-h-10 + btn btn-ghost btn--sm question-editor__add-question"> <span class="material-symbols-outlined text-base">add</span> <span class="hidden sm:inline">Добавить вопрос</span> <span class="sm:hidden">Добавить</span> @@ -114,37 +113,91 @@ </div> <ol id="questions" class="mt-3 space-y-3"></ol> </section> + </div> + </details> + + <details class="cabinet-disclosure cabinet-brick" open> + <summary class="cabinet-disclosure__summary"> + <span class="cabinet-disclosure__summary-text"> + <span class="cabinet-disclosure__summary-title font-headline">История</span> + <span class="cabinet-disclosure__summary-sub">Версии теста и кто проходил</span> + </span> + </summary> + <div class="cabinet-disclosure__body"> + <div class="test-detail-subsection test-detail-subsection--tight"> + <h3 class="test-detail-subsection__title">Версии</h3> + <ul id="versions-list" class="version-card-list"></ul> + </div> + <div class="test-detail-subsection"> + <h3 class="test-detail-subsection__title">Прохождения</h3> + <ul id="attempts-list" class="attempts-card-list"></ul> + </div> + </div> + </details> + + <details class="cabinet-disclosure cabinet-brick" open> + <summary class="cabinet-disclosure__summary"> + <span class="cabinet-disclosure__summary-text"> + <span class="cabinet-disclosure__summary-title font-headline">Показ в каталоге</span> + <span class="cabinet-disclosure__summary-sub">Видимость в списке и выдача сотрудникам</span> + </span> + </summary> + <div class="cabinet-disclosure__body"> + <div class="test-detail-subsection test-detail-subsection--tight"> + <h3 class="test-detail-subsection__title">Видимость</h3> + <p class="test-detail-hint">Скрытые тесты в общем списке не показываются; ссылку на тест по-прежнему можно открыть.</p> + <div class="publication-visibility__actions"> + <button id="btn-toggle-visibility" class="btn btn-ghost" type="button">Скрыть из списка</button> + </div> + </div> + <div class="test-detail-subsection"> + <h3 class="test-detail-subsection__title">Кому выдать</h3> + <p class="test-detail-hint">Список с учётом поиска и фильтров; можно отметить всех на экране.</p> + <div class="assign-toolbar"> + <input id="assign-search" class="form-input assign-toolbar__search" type="text" placeholder="Поиск: ФИО, логин" /> + <select id="assign-dept" class="form-input"><option value="__all__">Все отделы</option></select> + <select id="assign-clinic" class="form-input"> + <option value="all">Все</option> + <option value="with">С учёткой в модуле</option> + <option value="without">Без учётки (создадим при назначении)</option> + </select> + <button id="assign-select-all" class="btn btn-ghost btn--sm" type="button">Выбрать всех</button> + </div> + <div id="assign-list" class="assign-list"></div> + <div class="inline-actions" style="margin-top:0.75rem;"> + <button id="assign-submit" class="btn btn-primary" type="button">Назначить выбранных</button> + <span id="assign-status" class="muted"></span> + </div> + </div> + </div> + </details> </div> {# ── Sticky-footer: «Цепочка активна» + «Сохранить» ────────────── #} <div class="fixed bottom-0 inset-x-0 z-30 bg-white/95 backdrop-blur border-t border-ink-300/60 pb-[env(safe-area-inset-bottom)]"> - <div class="mx-auto max-w-6xl px-4 py-3 + <div class="mx-auto {% if ui_variant == 'legacy' %}max-w-2xl{% else %}max-w-6xl{% endif %} px-4 py-3 flex items-center justify-between gap-3"> - <label class="inline-flex items-center gap-2 text-sm min-w-0"> - <input id="chain-active" type="checkbox" - class="rounded border-ink-300 text-brand-600 focus:ring-brand-500" /> - <span class="truncate">Цепочка активна</span> - </label> + <span class="text-xs text-ink-500 truncate">Активность цепочки и поля теста — в шапке.</span> <div class="flex items-center gap-2 shrink-0"> <a href="{{ url_for('tests.tests_list_page') }}" - class="hidden sm:inline-flex px-3 py-2 rounded-lg text-ink-700 hover:bg-ink-100 text-sm"> + class="hidden sm:inline-flex px-3 py-2 rounded-lg text-ink-700 hover:bg-ink-100 text-sm btn btn-ghost"> К каталогу </a> <button id="save-draft" class="inline-flex items-center gap-2 px-4 py-2.5 rounded-lg - bg-brand-600 hover:bg-brand-700 text-white font-medium min-h-11"> + bg-brand-600 hover:bg-brand-700 text-white font-medium min-h-11 btn btn-primary"> <span class="material-symbols-outlined text-base">save</span> Сохранить </button> </div> </div> - <p id="save-status" class="mx-auto max-w-6xl px-4 pb-2 text-xs text-ink-500"></p> + <p id="save-status" class="mx-auto {% if ui_variant == 'legacy' %}max-w-2xl{% else %}max-w-6xl{% endif %} px-4 pb-2 text-xs text-ink-500"></p> </div> {# ── Шаблон вопроса ─────────────────────────────────────────────── #} <template id="tpl-question"> - <li class="rounded-xl bg-white border border-ink-300/60 p-3 sm:p-4 q-item"> + <li class="rounded-xl bg-white border border-ink-300/60 p-3 sm:p-4 q-item question-editor-block"> {# Шапка карточки вопроса: номер слева, кнопки справа. #} <div class="flex items-center justify-between gap-2"> <span class="inline-flex items-center px-2 py-0.5 rounded-md @@ -165,27 +218,28 @@ </div> </div> - <textarea class="q-text mt-3 w-full rounded-lg border border-ink-300 px-3 py-2 + <div class="question-editor-block__header"> + <h4 class="question-editor-block__title q-num">Вопрос #</h4> + <button class="q-ai btn btn-ghost btn--sm question-editor-block__ai-btn"> + Сгенерировать вопрос (ИИ) + </button> + </div> + + <textarea class="q-text mt-2 w-full rounded-lg border border-ink-300 px-3 py-2 focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" rows="2" placeholder="Формулировка вопроса"></textarea> - {# Тип ответа + AI — две полные строки на мобиле, в строку на sm+. #} <div class="mt-3 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 text-sm"> <label class="inline-flex items-center gap-2 min-h-9"> <input type="checkbox" class="q-multi rounded border-ink-300 text-brand-600 focus:ring-brand-500" /> <span>Несколько правильных ответов</span> </label> - <button class="q-ai inline-flex items-center justify-center gap-1 px-2.5 py-2 rounded-lg - bg-brand-50 hover:bg-brand-100 text-brand-700 text-sm min-h-10"> - <span class="material-symbols-outlined text-base">auto_awesome</span> - AI: вопрос/переформулировать - </button> </div> <ul class="q-options mt-3 space-y-2"></ul> <button class="q-add-option mt-2 inline-flex items-center gap-1 px-2 py-2 rounded - text-sm text-brand-700 hover:bg-brand-50 min-h-10"> + text-sm text-brand-700 hover:bg-brand-50 min-h-10 btn btn-ghost btn--sm"> <span class="material-symbols-outlined text-base">add</span> Добавить вариант </button> @@ -194,19 +248,19 @@ {# ── Шаблон варианта ────────────────────────────────────────────── #} <template id="tpl-option"> - <li class="flex items-center gap-2 opt-item"> + <li class="flex items-center gap-2 opt-item question-option-row"> {# Чекбокс «Правильный» — обёрнут в большой tap-target. #} <label class="inline-flex items-center justify-center w-10 h-10 shrink-0 cursor-pointer rounded hover:bg-ink-100" title="Правильный ответ"> <input type="checkbox" - class="opt-correct w-5 h-5 rounded border-ink-300 text-brand-600 focus:ring-brand-500" /> + class="opt-correct w-5 h-5 rounded border-ink-300 text-brand-600 focus:ring-brand-500 question-option-row__mark" /> </label> <input type="text" - class="opt-text flex-1 min-w-0 rounded-lg border border-ink-300 px-3 py-2 + class="opt-text flex-1 min-w-0 rounded-lg border border-ink-300 px-3 py-2 question-option-row__text focus:border-brand-500 focus:ring-2 focus:ring-brand-500/20" placeholder="Вариант ответа" /> <button class="opt-delete shrink-0 w-10 h-10 inline-flex items-center justify-center - rounded hover:bg-red-50 text-red-600" + rounded hover:bg-red-50 text-red-600 question-option-remove" title="Удалить" aria-label="Удалить вариант"> <span class="material-symbols-outlined text-base">close</span> </button> diff --git a/flask_app/app/templates/tests/list.html b/flask_app/app/templates/tests/list.html index 1c4d124..5e453dd 100644 --- a/flask_app/app/templates/tests/list.html +++ b/flask_app/app/templates/tests/list.html @@ -2,66 +2,122 @@ {% block title %}Тесты — каталог{% endblock %} {% block content %} -<section class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-4 sm:p-6"> - <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3"> - <div> - <h1 class="text-xl sm:text-2xl font-semibold">Каталог тестов</h1> - <p class="mt-1 text-sm text-ink-500">Активные тесты, к которым у вас есть доступ.</p> +{% if ui_variant == 'legacy' %} + <section class="legacy-list-shell"> + <h1 class="font-headline legacy-list-title">Тесты</h1> + <div class="legacy-list-toolbar"> + <button id="btn-create-test" class="btn btn-ghost" type="button"> + Создать + </button> </div> - <button id="btn-create-test" - class="inline-flex items-center justify-center gap-2 px-4 py-3 rounded-lg - bg-brand-600 hover:bg-brand-700 text-white font-medium transition - min-h-11 w-full sm:w-auto"> - <span class="material-symbols-outlined text-base">add</span> - Создать тест - </button> - </div> - {% if visible %} - <ul class="mt-5 grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"> - {% for t in visible %} - <li class="rounded-xl border border-ink-300/60 hover:border-brand-300 hover:shadow-sm transition bg-white"> - <a href="{{ url_for('tests.tests_editor_page', test_id=t.id) }}" - class="block p-4 active:bg-ink-100/40"> - <div class="flex items-start justify-between gap-2"> - <h3 class="font-semibold text-ink-900 line-clamp-2 min-w-0">{{ t.title }}</h3> - <span class="text-xs text-ink-500 shrink-0 mt-0.5">v{{ t.version }}</span> + {% if visible %} + <ul class="list-stack" aria-label="Тесты в общем списке"> + {% for t in visible %} + <li class="list-row list-row--split"> + <div class="list-row__main"> + <a href="{{ url_for('tests.tests_editor_page', test_id=t.id) }}" class="list-row__link"> + <span class="list-row__title">{{ t.title }}</span> + <span class="list-row__meta"> + {{ t.author_full_name or '—' }} + <span class="list-row__meta-tail"> · v{{ t.version }}</span> + </span> + </a> </div> - {% if t.description %} - <p class="mt-1 text-sm text-ink-500 line-clamp-3">{{ t.description }}</p> - {% endif %} - <div class="mt-3 flex items-center justify-between gap-2 text-xs text-ink-500"> - <span class="truncate">Автор: {{ t.author_full_name or '—' }}</span> - <span class="inline-flex items-center gap-1 text-brand-700"> - <span class="material-symbols-outlined text-sm">edit_note</span> - Открыть - </span> + <div class="list-row__side"> + <button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">Пройти</button> </div> - </a> - </li> - {% endfor %} - </ul> - {% else %} - <p class="mt-5 text-ink-500 text-sm">Доступных тестов пока нет.</p> - {% endif %} + </li> + {% endfor %} + </ul> + {% else %} + <p class="text-muted">Нет тестов</p> + {% endif %} - {% if hidden %} - <details class="mt-6 rounded-xl border border-ink-300/60 bg-ink-100/50 p-4"> - <summary class="cursor-pointer font-medium text-ink-700"> - Скрытые вами цепочки ({{ hidden|length }}) - </summary> - <ul class="mt-3 space-y-2"> + {% if hidden %} + <h2 class="font-headline legacy-list-subtitle">Скрытые вами из списка</h2> + <ul class="list-stack" aria-label="Скрытые тесты автора"> {% for t in hidden %} - <li class="flex items-center justify-between gap-2 text-sm"> - <span>{{ t.title }} <span class="text-ink-500">· v{{ t.version }}</span></span> + <li class="list-row list-row--split list-row--hidden"> + <div class="list-row__main"> + <a href="{{ url_for('tests.tests_editor_page', test_id=t.id) }}" class="list-row__link"> + <span class="list-row__title">{{ t.title }}</span> + <span class="list-row__meta"> + {{ t.author_full_name or '—' }} + <span class="list-row__meta-tail"> · v{{ t.version }} · скрыт</span> + </span> + </a> + </div> + <div class="list-row__side"> + <button type="button" class="btn btn-ghost btn-start-pass" data-test-id="{{ t.id }}">Пройти</button> + </div> + </li> + {% endfor %} + </ul> + {% endif %} + </section> +{% else %} + <section class="rounded-2xl bg-white shadow-sm border border-ink-300/60 p-4 sm:p-6"> + <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3"> + <div> + <h1 class="text-xl sm:text-2xl font-semibold">Каталог тестов</h1> + <p class="mt-1 text-sm text-ink-500">Активные тесты, к которым у вас есть доступ.</p> + </div> + <button id="btn-create-test" + class="inline-flex items-center justify-center gap-2 px-4 py-3 rounded-lg + bg-brand-600 hover:bg-brand-700 text-white font-medium transition + min-h-11 w-full sm:w-auto"> + <span class="material-symbols-outlined text-base">add</span> + Создать тест + </button> + </div> + + {% if visible %} + <ul class="mt-5 grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"> + {% for t in visible %} + <li class="rounded-xl border border-ink-300/60 hover:border-brand-300 hover:shadow-sm transition bg-white"> <a href="{{ url_for('tests.tests_editor_page', test_id=t.id) }}" - class="text-brand-700 hover:underline">Открыть</a> + class="block p-4 active:bg-ink-100/40"> + <div class="flex items-start justify-between gap-2"> + <h3 class="font-semibold text-ink-900 line-clamp-2 min-w-0">{{ t.title }}</h3> + <span class="text-xs text-ink-500 shrink-0 mt-0.5">v{{ t.version }}</span> + </div> + {% if t.description %} + <p class="mt-1 text-sm text-ink-500 line-clamp-3">{{ t.description }}</p> + {% endif %} + <div class="mt-3 flex items-center justify-between gap-2 text-xs text-ink-500"> + <span class="truncate">Автор: {{ t.author_full_name or '—' }}</span> + <span class="inline-flex items-center gap-1 text-brand-700"> + <span class="material-symbols-outlined text-sm">edit_note</span> + Открыть + </span> + </div> + </a> </li> {% endfor %} </ul> - </details> - {% endif %} -</section> + {% else %} + <p class="mt-5 text-ink-500 text-sm">Доступных тестов пока нет.</p> + {% endif %} + + {% if hidden %} + <details class="mt-6 rounded-xl border border-ink-300/60 bg-ink-100/50 p-4"> + <summary class="cursor-pointer font-medium text-ink-700"> + Скрытые вами цепочки ({{ hidden|length }}) + </summary> + <ul class="mt-3 space-y-2"> + {% for t in hidden %} + <li class="flex items-center justify-between gap-2 text-sm"> + <span>{{ t.title }} <span class="text-ink-500">· v{{ t.version }}</span></span> + <a href="{{ url_for('tests.tests_editor_page', test_id=t.id) }}" + class="text-brand-700 hover:underline">Открыть</a> + </li> + {% endfor %} + </ul> + </details> + {% endif %} + </section> +{% endif %} <dialog id="dlg-create" class="m-0 p-0 w-full h-full sm:h-auto sm:max-w-md sm:w-full sm:m-auto @@ -136,6 +192,36 @@ alert(e.message || 'Не удалось создать тест.'); } }); + + const passButtons = Array.from(document.querySelectorAll('.btn-start-pass')); + passButtons.forEach((btn) => { + btn.addEventListener('click', async () => { + const testId = btn.dataset.testId; + if (!testId) return; + btn.disabled = true; + const oldText = btn.textContent; + btn.textContent = '…'; + try { + const r = await fetch(`/api/tests/${testId}/attempts/start`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({}), + }); + let data = {}; + try { data = await r.json(); } catch (_) {} + if (!r.ok || !data.attempt || !data.attempt.id) { + // В Flask legacy контуре пока может отсутствовать отдельная UI-страница попытки. + // Тогда ведём в карточку теста, чтобы пользователь не попадал на not_found. + window.location.href = `/tests/${testId}/edit`; + return; + } + window.location.href = `/tests/${testId}/attempt/${data.attempt.id}`; + } catch (e) { + window.location.href = `/tests/${testId}/edit`; + return; + } + }); + }); })(); </script> {% endblock %} diff --git a/flask_app/app/tests/routes.py b/flask_app/app/tests/routes.py index f319cea..0823089 100644 --- a/flask_app/app/tests/routes.py +++ b/flask_app/app/tests/routes.py @@ -42,6 +42,14 @@ from ..services.document_extract import ( from ..services.document_gen import generation_for_import_document from ..services.draft_validator import LlmError from ..services.editor_content import HttpError as EditorHttpError, get_editor_content +from ..services.test_attempt import ( + HttpError as AttemptHttpError, + get_attempt_review_for_user, + get_play_content, + list_test_attempts_for_author, + start_attempt, + submit_attempt, +) from ..services.test_access import is_test_author, list_hidden_by_author, list_visible_tests from ..services.test_chain import has_any_attempt_for_test from ..services.test_draft import ( @@ -150,6 +158,10 @@ def api_test_summary(test_id): if not acc.ok: return jsonify(error=RU['notFound']), 404 + has_attempts = False + with eng.connect() as conn: + has_attempts = has_any_attempt_for_test(conn, test_id) + return jsonify( test={ 'id': str(row['id']), @@ -163,6 +175,7 @@ def api_test_summary(test_id): 'updatedAt': row['updated_at'].isoformat() if row['updated_at'] else None, 'createdBy': str(row['created_by']) if row['created_by'] else None, 'authorFullName': row['author_full_name'], + 'hasAttempts': bool(has_attempts), }, isAuthor=is_author, hasActiveVersion=row['active_version_id'] is not None, @@ -293,6 +306,85 @@ def api_patch_test(test_id): return jsonify(id=test_id, chainActive=chain) +@tests_bp.route('/api/tests/<test_id>/attempts/start', methods=['POST']) +@login_required +def api_start_attempt(test_id): + user = current_user() + eng = get_engine() + try: + out = start_attempt(eng, user.id, test_id) + except AttemptHttpError as e: + return jsonify(error=e.message), e.status + return jsonify(out), 201 + + +@tests_bp.route('/api/tests/<test_id>/attempts/<attempt_id>/play', methods=['GET']) +@login_required +def api_attempt_play(test_id, attempt_id): + user = current_user() + eng = get_engine() + try: + out = get_play_content(eng, user.id, test_id, attempt_id) + except AttemptHttpError as e: + return jsonify(error=e.message), e.status + return jsonify(out) + + +@tests_bp.route('/api/tests/<test_id>/attempts/<attempt_id>/submit', methods=['POST']) +@login_required +def api_attempt_submit(test_id, attempt_id): + user = current_user() + eng = get_engine() + body = request.get_json(silent=True) or {} + try: + out = submit_attempt(eng, user.id, test_id, attempt_id, body.get('answers')) + except AttemptHttpError as e: + return jsonify(error=e.message), e.status + return jsonify(out) + + +@tests_bp.route('/api/tests/<test_id>/attempts/<attempt_id>/review', methods=['GET']) +@login_required +def api_attempt_review(test_id, attempt_id): + user = current_user() + eng = get_engine() + try: + out = get_attempt_review_for_user(eng, user.id, test_id, attempt_id) + except AttemptHttpError as e: + return jsonify(error=e.message), e.status + return jsonify(out) + + +@tests_bp.route('/api/tests/<test_id>/attempts', methods=['GET']) +@login_required +def api_attempts_list(test_id): + user = current_user() + eng = get_engine() + try: + rows = list_test_attempts_for_author(eng, user.id, test_id) + except AttemptHttpError as e: + return jsonify(error=e.message), e.status + return jsonify( + attempts=[ + { + 'id': str(r['id']), + 'userId': str(r['user_id']), + 'status': r['status'], + 'attemptNumber': r['attempt_number'], + 'startedAt': r['started_at'].isoformat() if r['started_at'] else None, + 'completedAt': r['completed_at'].isoformat() if r['completed_at'] else None, + 'correctCount': r['correct_count'], + 'totalQuestions': r['total_questions'], + 'passed': r['passed'], + 'testVersion': r['test_version'], + 'attempterName': r['attempter_name'], + 'attempterLogin': r['attempter_login'], + } + for r in rows + ] + ) + + # ─── AI ────────────────────────────────────────────────────────────── @tests_bp.route('/api/tests/<test_id>/ai/generate-test', methods=['POST']) @@ -463,3 +555,23 @@ def tests_editor_page(test_id): return ('Доступ запрещён.', 403) return render_template('500.html'), 500 return render_template('tests/editor.html', content=content, test_id=test_id) + + +@tests_bp.route('/tests/<test_id>/attempt/<attempt_id>', methods=['GET']) +@login_required +def tests_attempt_page(test_id, attempt_id): + return render_template('tests/attempt.html', test_id=test_id, attempt_id=attempt_id) + + +@tests_bp.route('/tests/<test_id>/attempts/<attempt_id>/review', methods=['GET']) +@login_required +def tests_attempt_review_page(test_id, attempt_id): + user = current_user() + eng = get_engine() + try: + review = get_attempt_review_for_user(eng, user.id, test_id, attempt_id) + except AttemptHttpError as e: + if e.status == 404: + return render_template('404.html'), 404 + return (e.message, e.status) + return render_template('tests/attempt_review.html', test_id=test_id, review=review) diff --git a/frontend/index.html b/frontend/index.html index 42ef58e..022b5da 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -15,7 +15,7 @@ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap" rel="stylesheet" /> - <title>Система тестрования + Система тестирования
diff --git a/frontend/src/img/clinic-logo.png b/frontend/src/img/clinic-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..18f0accbd614f03d428592a6fe2f6d07f2bc3b7e GIT binary patch literal 52911 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 z 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 ({ + text: q.text ?? '', + hasMultipleAnswers: !!q.hasMultipleAnswers, + options: (q.options || []).map((o) => ({ + text: o.text ?? '', + isCorrect: !!o.isCorrect, + })), + })), + }); +} + +function postDebugLog({ runId, hypothesisId, location, message, data }) { + fetch('http://127.0.0.1:7419/ingest/a86fc408-7178-4abe-8dd9-f3e6bfb05d76', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Debug-Session-Id': '034e19', + }, + body: JSON.stringify({ + sessionId: '034e19', + runId, + hypothesisId, + location, + message, + data, + timestamp: Date.now(), + }), + }).catch(() => {}); +} + export default function TestDetail() { const { id } = useParams(); const nav = useNavigate(); @@ -83,6 +118,7 @@ export default function TestDetail() { const [draftDescription, setDraftDescription] = useState(''); const [draftPassing, setDraftPassing] = useState('70'); const [draftQuestions, setDraftQuestions] = useState(() => [createEmptyQuestion()]); + const [draftSnapshotOnLoad, setDraftSnapshotOnLoad] = useState(null); const [draftStatus, setDraftStatus] = useState(''); const [deactivateBusy, setDeactivateBusy] = useState(false); const [importPreview, setImportPreview] = useState(null); @@ -106,6 +142,16 @@ export default function TestDetail() { const [assignLoadBusy, setAssignLoadBusy] = useState(false); const [attemptsList, setAttemptsList] = useState(undefined); const [attemptsErr, setAttemptsErr] = useState(null); + const debugRunId = 'pre-fix'; + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H1', + location: 'frontend/src/pages/TestDetail.jsx:component-start', + message: 'TestDetail render start', + data: { hasData: !!data, hasTaker: !!taker, hasErr: !!err, testId: id != null }, + }); + // #endregion async function load() { setErr(null); @@ -127,14 +173,26 @@ export default function TestDetail() { setData(v); setChain(c); if (ed?.test) { - setDraftTitle(ed.test.title || ''); - setAiGenTopic((ed.test.title || '').trim()); - setDraftDescription(ed.test.description || ''); + const loadedTitle = ed.test.title || ''; + const loadedDescription = ed.test.description || ''; const th = ed.test.passingThreshold; - setDraftPassing( - th !== undefined && th !== null && String(th) !== '' ? String(th) : '70' + const loadedPassing = + th !== undefined && th !== null && String(th) !== '' ? String(th) : '70'; + const loadedQuestions = mapEditorToDraftQuestions(ed); + + setDraftSnapshotOnLoad( + buildDraftSnapshot({ + title: loadedTitle, + description: loadedDescription, + passing: loadedPassing, + questions: loadedQuestions, + }) ); - setDraftQuestions(mapEditorToDraftQuestions(ed)); + setDraftTitle(loadedTitle); + setAiGenTopic(loadedTitle.trim()); + setDraftDescription(loadedDescription); + setDraftPassing(loadedPassing); + setDraftQuestions(loadedQuestions); } } catch (e) { if (e.status === 401) { @@ -590,13 +648,40 @@ export default function TestDetail() { } if (err) { + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H3', + location: 'frontend/src/pages/TestDetail.jsx:return-err', + message: 'Returning error branch before memo hook', + data: { hasErr: true }, + }); + // #endregion return

{err}

; } if (!data && !taker) { + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H1', + location: 'frontend/src/pages/TestDetail.jsx:return-loading', + message: 'Returning loading branch before memo hook', + data: { hasData: false, hasTaker: false }, + }); + // #endregion return

Загрузка…

; } if (taker) { + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H1', + location: 'frontend/src/pages/TestDetail.jsx:return-taker', + message: 'Returning taker branch before memo hook', + data: { hasTaker: true }, + }); + // #endregion const { test: t, hasActiveVersion } = taker.summary; const title = t?.title || 'Тест'; return ( @@ -635,6 +720,42 @@ export default function TestDetail() { const assignSelectedInList = assignPeople.filter((p) => assignSelected.has(assignPersonKey(p)) ); + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H1', + location: 'frontend/src/pages/TestDetail.jsx:before-useMemo', + message: 'Reached line right before hasDraftChanges useMemo', + data: { hasData: !!data, hasTaker: !!taker }, + }); + // #endregion + const hasDraftChanges = useMemo(() => { + // #region agent log + postDebugLog({ + runId: debugRunId, + hypothesisId: 'H2', + location: 'frontend/src/pages/TestDetail.jsx:inside-useMemo', + message: 'Computing hasDraftChanges', + data: { + hasDraftSnapshotOnLoad: !!draftSnapshotOnLoad, + titleLen: (draftTitle || '').length, + descriptionLen: (draftDescription || '').length, + passing: String(draftPassing || ''), + questionsCount: Array.isArray(draftQuestions) ? draftQuestions.length : -1, + }, + }); + // #endregion + if (!draftSnapshotOnLoad) { + return false; + } + const currentSnapshot = buildDraftSnapshot({ + title: draftTitle, + description: draftDescription, + passing: draftPassing, + questions: draftQuestions, + }); + return currentSnapshot !== draftSnapshotOnLoad; + }, [draftDescription, draftPassing, draftQuestions, draftSnapshotOnLoad, draftTitle]); return (
@@ -667,7 +788,7 @@ export default function TestDetail() {
)} - {chain?.hasAnyAttempt && ( + {chain?.hasAnyAttempt && hasDraftChanges && (
При сохранении будет создана новая версия теста.