Skip to content

DEV: ролевой виджет аналитики на странице программы - #348

Draft
TThanos3000 wants to merge 3 commits into
devfrom
feature/dev-program-role-analytics-widget
Draft

TThanos3000 wants to merge 3 commits into
devfrom
feature/dev-program-role-analytics-widget

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Заглушка «аналитика» на странице программы заменена отдельным ролевым Angular-виджетом с безопасным read-only backend-контрактом. Исправлена регрессия: организатор без member-роли теперь загружает и видит существующие и созданные им новости. Переработана внутренняя композиция карточки: служебные подписи и полный срок эксперта помещаются при прежних внешних размерах.

Продолжение существующего Draft PR, только DEV. Без merge, deploy и действий с PROD.

SHA и зависимость

  • Base: 99c8813a66f89560a946eab7d1de73ab2925d0f5
  • Head: c97eb8b61c4982b23dbae743104d5b1de71dedef
  • Диагностический follow-up меняет только документацию; проверенный код приложения: 239e3a5eafe653291daf95930ecac9824314f365.
  • Предыдущий head: f9ee3c397acf0fc6ed643246b44760fa82705313; follow-up добавлен обычным коммитом.
  • Backend Draft PR #742, base ed5244bd4a098bd0f1cee0f5e380dd67bdd61a96, head 3d84c7f4090985e4f42a13654e8fb05856f65cb3.
  • Для будущего DEV-развёртывания сначала нужны backend GET /programs/{id}/analytics-widget/ и is_user_expert, затем этот Angular. Миграций нет.

Поведение и границы

  • Роль текущей программы: организатор → эксперт → участник; эксперт без member/назначений сохраняет экспертное состояние. Backend авторизует доступ; участник/эксперт не вызывают manager-only API.
  • Участник получает participant_project через Project.leader / Collaborator / PartnerProgramProject текущей программы, точный системный name="case" и серверный этап. Лидер и член команды видят один проект. Текущая «Проверка» без галочки; серверный evaluated завершает все три этапа.
  • Организатор: общие серверные агрегаты участников, связей проектов, отправленных решений и участников без проекта. Черновики и члены команды учтены. 19/248 = 7,7%, зелёный; цвет определяется до округления.
  • Эксперт: персональные назначения/остаток по общему completion SQL, включая not_ready. Допустимый 0 считается внесённой оценкой. Срок из datetime_evaluation_ends, приоритет отсутствия назначений/завершения над просрочкой. Open: «—»/«—», режим и один срок.
  • Ошибки не подменяются нулями. Loading, retry, отсутствие доступа и нулевые состояния сохраняют размер. Смена программы/пользователя/роли и logout очищают данные и отменяют старые запросы.
  • После успешных изменений case/полей, сдачи и оценки — обновление через существующую EventBus; локальные часы без HTTP polling.
  • Нет выбора проекта/команды, поддержки нескольких команд или произвольного первого проекта. Противоречивые связи дают контролируемый 409.
  • React, current_application, правила команд/редактирования/сдачи/оценивания, shared app-modal/app-soon-card, зависимости, CI/Docker/workflows не меняются.

Доработка композиции

Заголовок и вторичный бейдж разведены по горизонтали. Подписи метрик 10 px, значения 14 px полужирные, отдельная зона нижнего действия. Кейс и проект оформлены двумя строками, этапы соединены тонкой линией. Только динамические названия сокращаются многоточием с hover/focus tooltip.

Организатор: «Сдано решений» с контролируемым переносом, выровненные числа; компактная цветная точка и процент возле «Без проектов».

Эксперт: ровно два счётчика и один статусный блок. «До конца оценивания» + полные «2 дня», «5 часов», «25 минут» на второй строке. Нет ellipsis служебных статусов, срока и единиц времени.

Геометрия и скриншоты

Viewport 1280 × 1000, DPR 1, scale 1, Mont загружен: карточка 157 × 140,984375 CSS px, x/y 285,828125 / 262,59375, как на DEV-базе. «О программе» также не сдвинут. Все 23 состояния, Retry и границы 1000/1440 совпали с baseline; при 1000 карточка скрыта по прежнему правилу.

Полные страницы при 100%, кропы без масштабирования, hover/focus, все состояния и измерения.

Полная страница эксперта, 100%

Участник Организатор Эксперт
Участник Организатор Эксперт
Нет проекта Нули Нет назначений

Кропы 158 × 143 физических px охватывают дробную CSS-рамку; изображения не масштабировались.

Окончательные проверки

  • Targeted Vitest: 39 файлов / 349 тестов PASS, exit 0; новости, роли, переходы, обновления, сброс контекста, границы процентов/времени.
  • Full Vitest на окончательном коде: 367 файлов / 1560 тестов прошли, 1 unhandled error, exit 1. Полный suite не объявляется успешным.
  • Тот же full suite на точном base 99c8813…: 361 файл / 1489 тестов прошли, та же ошибка, exit 1. В обоих случаях window is not defined из ngx-autosize после teardown. Node 24.18.0, npm 11.16.0, Vitest 3.2.6, ngx-autosize 2.0.4, один node_modules, одинаковая команда. Точный head stack, base stack. Ошибка подтверждена без изменений PR; не подавлялась.
  • npm run lint:ts: 0 ошибок / 6 предупреждений.
  • Scoped Stylelint, Prettier и git diff --check: PASS.
  • npm run build:pr: PASS, Angular strict compilation; Sass deprecation warnings. Генерируемый Windows sprite не включён в diff.
  • Backend PostgreSQL CI 34849441959: success на точном backend head 3d84c7f…. Локальные PostgreSQL/SQLite/mypy ограничения отдельно сохранены в backend PR.
  • Глобальный pre-commit stylelint --fix не запускался; scoped проверки выполнены явно, посторонние файлы не форматировались.

Реальная локальная интеграция и ограничения

На отдельной PostgreSQL 18 БД, без DEV/PROD данных, проверены реальные Angular + Django: организатор без member видит старую и созданную через форму новость; лидер и член команды видят одинаковый проект/case; рабочие переходы проекта, аналитики, оценивания; сохранение нового case, сдача и допустимая оценка 0 через существующие формы; итог «Оценён»; нулевые состояния; logout и смена программы; посторонний пользователь без внутренних данных. Временный локальный HTTP 503 проверил ошибку и восстановление кнопкой «Повторить» с неизменным rect.

Сценарии, скриншоты и фактические ограничения интеграции. Живой DEV не проверялся. Последующая диагностика на точном base/head установила причину фонового PUT /projects/NaN/: root ActivatedRoute в cleanup-autosave. На обоих вариантах удаление презентации не сохраняется даже после сообщения об успехе. Это отдельный существующий дефект редактора P1; новый вход виджета его не усиливает. Подробности и отдельная задача ниже. Пограничные комбинации и обновление EventBus без навигации покрыты автоматическими тестами, не все повторены в браузере.

Источники данных и архитектура. Полный отчёт доработки и команды.

Диагностика PUT /projects/NaN/ — 14.09.2026

Angular base 99c8813a66f89560a946eab7d1de73ab2925d0f5, проверенный код head 239e3a5eafe653291daf95930ecac9824314f365, итоговый head с документацией c97eb8b61c4982b23dbae743104d5b1de71dedef; backend в обоих прогонах 3d84c7f4090985e4f42a13654e8fb05856f65cb3.

Семь прогонов на локальных Angular + Django и отдельной PostgreSQL БД, одинаковые Node/dependencies и восстановленные синтетические данные, 10-секундные окна наблюдения, 23 повторных чтения API. На head проверены вход из виджета и существующий путь; на точном base — существующий путь.

Причина: root ProjectFormAutosaveService читает params["projectId"] из root ActivatedRoute (params={}), хотя ID 31 есть на leaf-маршруте; Number(undefined) становится NaN. Начальный patchValue пустого файлового поля запускает cleanup-autosave. При удалении файла запускается тот же ошибочный PUT. Он возникает до ProgramWidgetChanged и повторяется на base без нового виджета. После destroy в контрольных окнах новых PUT не было.

Обычное непустое название и case текущей связи 73 сохраняются явной кнопкой на base/head. Удаление презентации не сохраняется: файл удалён, URL проекта остаётся прежним; после повторного открытия UI показывает «Файл успешно загружен». Явный save тоже не очищает URL: stripNullish исключает пустую строку из payload, PUT /projects/31/ возвращает 200 и UI показывает «данные успешно сохранены». Подтверждено API-readback и содержимым запросов на обеих версиях.

Отдельная задача P1, препятствие для дальнейшего релиза редактора. В проверенных сценариях это существующий дефект, не регрессия #348; редактор в рамках виджета не ремонтировался. Описание задачи, полная диагностика, initiator/stack, маршруты, payload и скриншоты, машиночитаемые evidence.

Production-код не менялся; повторные full suite/lint:ts/production build не требовались и не запускались. Две diagnostic development-сборки PASS; проверка логов, scoped Prettier документов и git diff --check PASS. Прежний full suite с ngx-autosize teardown не объявляется успешным. Внешний CDN заменён только локальным тестовым storage; живые DEV/PROD/CDN не проверялись. Backend production-файлы и SHA неизменны. Оба PR остаются Draft → dev, без merge/deploy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants