6689351ef0
- новая вкладка: заявки интервала на карте, выбор заявки кликом/инспектором, расчёт слотов покрытия, бронирование и снятие брони - выбор заявки без выпадающего списка (не масштабируется на ~10к): все заявки на карте, панель справа с кнопкой «Выбрать», имя выбранной заявки в тулбаре, кнопка «Сброс», фильтр заявок по интервалу - бронь отмечаем по ответу POST booking/request (by-request отдаёт слот в чужом cycle-фрейме — ключ не совпадал, бейдж «бронь» не появлялся) - подсветка и автоскролл активной строки по клику на слот (ручной scrollBy) - меню выбора при плотном наложении слотов (SlotPickMenu); контур заявки pickable:false, чтобы не «съедать» меню; панель не закрывается при выборе - фильтр отображения по суткам (SlotDaySelector) - gateway: маршрут slots (/api/pcp-slots/**) - карточка полосы обзора (swath): КА и виток в инспекторе
pcp-tgu-ui-service
Фронтенд «ТГУ — Операции». Сервис собран с нуля на чистой базе исходного
pcp-tgu-ops-ui (React + Vite, своя тёмная тема), в которую добавлены только две
вещи с платформы NStart:
- Авторизация — headless-ядро
@nstart/auth(New Start ID / Keycloak): токен, login, logout, refresh. Без@nstart/ui— UI-компоненты библиотеки (ProfilePage/UserPanel) намеренно не подключены, экраны ТГУ остаются на своём UI. - Сборка и деплой — платформенный контракт: hardened
Dockerfile(non-root, healthcheck), runtime-config (config.jsизAPP_*),docker-bake.hcl,.gitlab-ci.yml(build → trivy/semgrep → push в registry),nginx.conf.
В отличие от pcp-tgu-ops-ui-template, здесь нет демо-страниц шаблона, @nstart/ui,
Tailwind, i18n и борьбы тем — только рабочий ТГУ + auth + контур сборки/деплоя.
Авторизация (headless)
- Режим выбирается переменной
authMode(anonymous|new-start-id). anonymous(дефолт): приложение открывается сразу, токена нет, заголовокAuthorizationне добавляется — поведение как у исходного сервиса.new-start-id: вход редиректом на New Start ID; токен подставляется в каждый запросsrc/api/*через мостapiFetch+AuthTokenBridge. В шапке появляется кнопка «Выйти».- Конфиг входа берётся из
src/config/env.ts(runtimeAPP_*имеют приоритет над buildVITE_*).
Конфигурация окружения
| Назначение | DEV (npm run dev) |
PROD (Docker) |
|---|---|---|
| источник | .env (VITE_*) |
APP_* контейнера → config.js |
| api | VITE_API_URL |
APP_API_URL |
| режим auth | VITE_AUTH_MODE |
APP_AUTH_MODE |
| New Start ID | VITE_NEW_START_ID_* |
APP_NEW_START_ID_* |
Доступ к приватному реестру @nstart/*: scope @nstart:registry=... должен быть в
~/.npmrc (или в конфиге CI-раннера). Проектный .npmrc задаёт только
min-release-age=7.
Запуск
cp .env.example .env # режим anonymous, открывается сразу
npm install # нужен доступ к repo.nstart.cloud (scope @nstart)
npm run dev # http://localhost:5174
npm run build # tsc -b + vite build
npm run test # vitest
Прод-прокси (осталось настроить)
В nginx.conf активный /api/ — заглушка (127.0.0.1:8000), а
блоки pcp-* закомментированы (зеркало server.proxy из vite.config.ts).
Подставьте реальные UPSTREAM_* кластера и раскомментируйте, либо вынесите
маршрутизацию на gateway/ingress.