fix(frontend): pilot-only юзер → auto-redirect на /trade-in/ вместо «Доступа нет» (#799) #812

Closed
bot-frontend wants to merge 1 commit from feat/799-pilot-redirect-v2 into main
Collaborator

Summary

RouteGuard (главный фронт frontend/): когда путь запрещён для роли (!isPathAllowed), но единственная рабочая зона роли — trade-in (isPathAllowed(allowed, deny, "/trade-in/") === true), вместо дед-энда NoAccessScreen делаем window.location.replace("/trade-in/"). Вариант 2 из issue.

Поведение

  • pilot-only (kopylov, user1..10, pilottest) на / (или любом denied main-пути) → авто-redirect в /trade-in/. replace → back-кнопка не возвращает на дед-энд.
  • admin / multi-scope с разрешённым / → не затронуты (isPathAllowed("/")=true), остаются на главной.
  • Loop-guard: не редиректим, если путь уже под /trade-in.

Why

kopylov (клиент Практики) — pilot-only; на демо при заходе на корень gendsgn.ru/ видел «Доступа нет». Демо Praktika 2026-06-01.

Test plan

  • npx tsc --noEmit + npm run build (main frontend, после npm ci) → ✓ Compiled, 19/19 pages, lint+types pass
  • Smoke (qa): pilot-логин на / → /trade-in/; admin остаётся; нет redirect-loop

Замена polluted-PR #809 (туда из-за гонки shared-.git index в параллельном окне попали посторонние .claude/* файлы). Этот PR — чистый, 1 файл (+15).

Refs #799

## Summary `RouteGuard` (главный фронт `frontend/`): когда путь запрещён для роли (`!isPathAllowed`), но единственная рабочая зона роли — trade-in (`isPathAllowed(allowed, deny, "/trade-in/") === true`), вместо дед-энда `NoAccessScreen` делаем `window.location.replace("/trade-in/")`. Вариант 2 из issue. ## Поведение - **pilot-only** (kopylov, user1..10, pilottest) на `/` (или любом denied main-пути) → авто-redirect в `/trade-in/`. `replace` → back-кнопка не возвращает на дед-энд. - **admin / multi-scope** с разрешённым `/` → не затронуты (`isPathAllowed("/")=true`), остаются на главной. - **Loop-guard**: не редиректим, если путь уже под `/trade-in`. ## Why kopylov (клиент Практики) — pilot-only; на демо при заходе на корень `gendsgn.ru/` видел «Доступа нет». Демо Praktika 2026-06-01. ## Test plan - [x] `npx tsc --noEmit` + `npm run build` (main frontend, после `npm ci`) → ✓ Compiled, 19/19 pages, lint+types pass - [ ] Smoke (qa): pilot-логин на `/` → /trade-in/; admin остаётся; нет redirect-loop > Замена polluted-PR #809 (туда из-за гонки shared-`.git` index в параллельном окне попали посторонние `.claude/*` файлы). Этот PR — чистый, 1 файл (+15). Refs #799
bot-frontend added 1 commit 2026-05-30 18:23:17 +00:00
RouteGuard: при denied path главного фронта (корень / и пр.) если у роли
единственная рабочая зона — trade-in (isPathAllowed(/trade-in/)=true) →
window.location.replace('/trade-in/') вместо дед-энда NoAccessScreen.
Guard от петли: не редиректить если путь уже под /trade-in. admin/multi-scope
с разрешённым / не затронуты. Вариант 2 из issue (без Caddy/backend).

Refs #799
bot-frontend closed this pull request 2026-05-30 18:25:19 +00:00

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#812
No description provided.