Дизайн утверждён пользователем 17.10.2026 («В целом да»). Figma V1.
Организатору доступны два входа вокруг аватара программы: «Оценка проектов» и «Управление программой». Последний открывает участников. Старые отдельные кнопки участников и проектов у организатора убраны. Эксперт без роли организатора сохраняет прежний маршрут оценивания.
- Участники: таблица ФИО, почты, города и даты регистрации именно в программе; только чтение, поиск по имени/почте, серверная пагинация.
- Проекты: сдача и оценивание раздельно, кейс, руководитель и прямая ссылка на презентацию. Выбор одной строки открывает одну панель с просмотром команды и переходом к оценке.
- Команда: состав и роли; desktop side panel, mobile full screen. Закрытие возвращает фокус; возврат из оценки восстанавливает выбор и query списка.
- Оценивание: чтение оценок выбранного проекта. Существующий эксперт дополнительно получает переход в прежнюю форму с точным
project_id. Роль организатора сама по себе не даёт право выставлять оценки. Несданное решение и неконкурсная программа блокируют переход из списка. - Аналитика: существующий компонент и API, без изменения определений показателей.
- Настройки: Основное, Сроки, Материалы. Явное сохранение, предупреждение об уходе, сохранение введённых значений при ошибке, optimistic concurrency. Даты явно в Москве UTC+3. Повторное открытие истёкшего срока требует подтверждения сервера.
- Материалы: файл через существующий FileService либо URL; изменение и удаление записи программы сохраняют исходный UserFile.
Индивидуальные действия с участниками, массовые операции, исключение проектов, возврат на доработку и смена кейса отложены.
В «Настройки → Организаторы» добавлены приватный список с поиском/статусом, приглашение по email, повторная отправка, отзыв ссылки и снятие доступа. Все организаторы равны в пределах программы. Последнего активного организатора нельзя убрать; непринятые приглашения его не заменяют. Выход из организаторов очищает приватный список и возвращает на страницу программы. Сервер проверяет права, версию состава и последнее активное членство под блокировкой строки программы.
Новый ProgramOrganizersUseCase использует отдельный port/repository/HTTP adapter,
без общего EntityCache для email. Выбор строки не запрашивает данные: одна
фиксированная плашка расположена вне потока таблицы. Кнопки 32 px с областью
нажатия 44 px на телефоне; модалки по центру. Шесть вкладок настроек на телефоне
занимают два ряда по три вкладки. Mont и существующие DS-компоненты сохранены.
/organizer-invitation/:token использует общий компонент приглашения с отдельной
ролью маршрута и API. Открытие ссылки не выдаёт права; требуется принятие под
приглашённой почтой. Для нового организатора обязательны имя, фамилия, дата
рождения, пароль и согласия. Регистрация эксперта остаётся без даты рождения.
Восстановление пароля проходит через /organizer-password-reset и возвращает к
приглашению. Роль организатора не добавляет право оценивания или доступ к Django.
Backend: API #796, миграция partner_programs.0023_organizerinvitation_and_more.
Backend разворачивается до frontend. Ссылка приглашения действует 7 дней;
повторная отправка меняет токен, отзыв и снятие доступа закрывают прежние ссылки.
Проверены 20 новых PostgreSQL tests (включая две гонки), 20 прежних expert tests,
36 focused Vitest и полный набор 2243 tests. Реальная доставка внешнему получателю
отдельно в эти проверки не входит: локальный браузер использует locmem-почту.
Новый приватный port/use case/repository/HTTP adapter использует /programs/:id/management/. CamelcaseInterceptor сохраняет существующее преобразование JSON. Почта и прочие приватные данные не попадают в общий EntityCache. После записи событие ProgramUpdated очищает кеш страницы и списка программ, включая persistent cache; старый ответ списка не заменяет новые данные.
Backend проверяет manager именно этой программы либо существующий staff/superuser scope. Прямые чужие ID и эксперт без manager не получают доступ. Полный контракт находится в backend docs/modules/program-management.md. Backend PR должен попасть в dev раньше UI.
Native adapters Button/Field/Choice/Table, существующие Modal/Icon/Pagination/Alert и Mont сохраняют PROCOLLAB DS. Foundation подключена локально также на desktop; глобальные компоненты не менялись.
Поиск остаётся в DOM при обновлении списка; завершение навигации предыдущего запроса не заменяет более новый ввод. Кейс и сдача привязаны через Reactive Forms, включая отложенное появление вариантов. Повторный клик по выбранному кружку или строке и клавиша пробела снимают выбор; ссылки сохраняют свои переходы. Подсказка недоступной оценки находится под общим рядом действий.
Кнопки организатора занимают доступную ширину колонок, текст остаётся в одну строку. На 360px более длинной подписи управления выделено больше места. В составе команды используются существующий AvatarComponent и полная почта из приватного API; старый ответ без этих полей поддерживается. В материалах заголовок/описание и действие разнесены, empty/list состояния имеют отдельные отступы.
Проверки: 2122 Vitest / 416 файлов PASS, dev build, ESLint/Stylelint и 18 API tests на PostgreSQL. Chrome + реальный локальный Django/PostgreSQL: медленный посимвольный поиск в обоих списках с сохранением DOM/focus, кейс после reload и совместно со сдачей, toggle мышью/клавиатурой, геометрия действий, почты/загруженные аватары, материалы CRUD и desktop1440/mobile390/360. Снимки: кнопки, панель действий, команда, материалы.
Backend dependency: API #780, additive members[].email/avatar; существующие права сохранены, миграций нет. Live авторизованная сессия организатора и реальный Selectel transport не проверялись.
52 теста Vitest в семи файлах: management facade, компонент, HTTP contract, утилиты дат/статусов, ProgramRepository, ProgramShellInfoService и существующий FileService. Проверены отмена устаревших запросов и сброс приватных данных при 403, выбор, dirty confirmation, версия записи, загрузка multipart через FileService и кеш после сохранения.
Полный настроенный Vitest-прогон: 2117 PASS / 416 файлов. Ожидание ссылки organizer role widget обновлено на /management/analytics; прежний экспертный маршрут сохранён. Общая проверка Prettier проходит с --end-of-line auto для Windows checkout с CRLF; изменённые файлы отдельно проходят обычный --check.
ng build social_platform --configuration=production проходит. Сохраняются предупреждения Sass/CommonJS и budget warnings; ошибок сборки нет. Новая SCSS укладывается в error budget. Targeted ESLint, Stylelint и форматирование проверены отдельно.
Headless Chrome, реальная production-сборка + локальный Django/PostgreSQL: участники, почта, no-results/reset, выбор и команда с возвратом фокуса, возврат из оценки, readonly manager, settings save/error/dirty leave, обновление публичной страницы, повторное открытие срока (cancel/save), material URL CRUD, аналитика, 403. Проверены desktop1440/mobile390/360; переполнения нет. Часовой пояс браузера America/Los_Angeles подтверждает независимость московских полей.
Снимки локальной проверки: участники desktop, проекты mobile, команда desktop. Данные демонстрационные; внешний placeholder аватара заблокирован в тестовом браузере.
Реальная загрузка в Selectel CDN, dev после merge и production не проверялись. FileService не менялся; ownership, переключение file→URL и сохранность исходного файла проверены backend tests. Нужна обычная приёмка на dev после обоих merge; merge/deploy выполняет пользователь.