feat(web): посадочная страница-хаб на / с переходами в дашборд, каталог, клубы и мастера #117

Open
opened 2026-06-01 19:22:15 +03:00 by Toutsu · 0 comments
Owner

Проблема

Сейчас Home.razor (/) — это сразу дашборд со списком клубов пользователя. Это единственная точка входа, до которой реально доходит обычный пользователь:

  • В NavMenu.razor ссылки только: Главная (/), Шаблоны (/templates), Профиль (/profile).
  • Showcase (каталог игр, PR #109), PublicClub (публичные страницы клубов, PR #107), PublicMasterProfile (витрина мастеров, PR #113), PublicSession — существуют как страницы, но в навигации не выведены.
  • Неавторизованный пользователь, попадая на /, сразу упрётся в редирект на /access-denied — приветствия и понимания «куда я попал и что здесь можно» у него нет вообще.
  • Авторизованный игрок/мастер видит «список клубов», но не понимает, что есть публичный каталог Showcase, что можно посмотреть витрину мастера или зайти на публичную страницу клуба.

Результат: фичи этапа 3.0 (публичные страницы клубов, каталог игр, витрина мастеров) фактически недоступны — про них знают только те, кто вручную вбил URL.

Цель

Сделать / полноценной посадочной страницей GM-Relay: пользователь с любой стороны (аноним/участник/ГМ) понимает, куда можно пойти, и попадает туда в один клик. Дашборд остаётся, но перестаёт быть единственной точкой входа.

UX

Неавторизованный (@NotAuthorized)

  • Заголовок-приветствие с кратким описанием продукта.
  • Плитки (те же карточки, что и для авторизованного, но с акцентом на то, что доступно сразу):
    • Каталог игр/showcase (доступен анонимам)
    • Публичные клубы/clubs (новая индексная страница, см. ниже)
    • Войти/login (отдельная крупная CTA)
  • Никаких клубов пользователя, никакого профиля — отображается только публичный контент.

Авторизованный (@Authorized)

  • Приветствие «Добро пожаловать, @userName» + краткий сабтайтл.
  • Сетка крупных плиток-карточек (дизайн в стилистике Home.razor/GroupDetails.razor, fantasy RPG):
    1. 📊 Дашборд/dashboard (см. раздел про редирект)
    2. 🎲 Каталог игр/showcase
    3. 🏰 Клубы/clubs (новая индексная страница)
    4. 👤 Мой профиль/profile
    5. 📋 Шаблоны/templates
    6. (опционально, если есть данные) 🌟 Мастера/masters (индекс публичных профилей, см. ниже)
  • Под плитками — краткий блок «Мои клубы» (превью, как сейчас в Home.razor, но с лимитом 3–6 и кнопкой «Открыть дашборд»).

Поведение URL

  • Главная Home.razor остаётся на /, но перестаёт быть дашбордом. Логика:
    • @Authorized → рендерит новый хаб.
    • @NotAuthorized → рендерит приветственную версию.
  • Старый дашборд (список клубов пользователя, кнопки «Открыть» на каждый клуб) переезжает на /dashboard (новая страница Dashboard.razor, логика копируется из текущего Home.razor 1:1).
  • Редирект для уже авторизованных пользователей со старых закладок: при заходе на / редирект НЕ делаем — / теперь и есть хаб. Старые внешние ссылки, если такие есть, обновляем в коде на /dashboard.

Технические требования

  • Новая страница хаба — отдельный компонент src/GmRelay.Web/Components/Pages/Landing.razor либо перепрофилированный Home.razor (на усмотрение исполнителя, согласовать в плане).
  • Новая страница /dashboardsrc/GmRelay.Web/Components/Pages/Dashboard.razor (вынесенный текущий код Home.razor).
  • Новая индексная страница клубов /clubssrc/GmRelay.Web/Components/Pages/PublicClubIndex.razor (или Clubs.razor):
    • Список всех публичных клубов (is_public = true, без учёта membership текущего юзера).
    • Ссылка на детальную PublicClub.razor.
    • Если пользователь авторизован — над списком блок «Мои клубы» с быстрым переходом в Dashboard.razor.
  • Новая индексная страница мастеров /masterssrc/GmRelay.Web/Components/Pages/PublicMasterIndex.razor:
    • Сетка карточек мастеров, у каждого кликабельное имя → PublicMasterProfile.razor.
    • Показывать только мастеров, у которых есть публичный профиль (см. PR #113).
  • Репозиторий-методы для индексов (если отсутствуют):
    • IWebGameGroupRepository.GetPublicClubsAsync() — публичные клубы с пагинацией.
    • IPlayerRepository.GetPublicMastersAsync() — мастера с публичными профилями.
  • NavMenu.razor дополнить ссылками (для авторизованных): Каталог, Клубы, Мастера. Бренд-ссылка <a href=""> оставляет вести на / (новый хаб).
  • CLAUDE.md / README.md обновить: v3.5.1 → указать новые маршруты, обновить список страниц.

Definition of Done

  1. На /:
    • неавторизованный — приветствие + плитки Каталог, Клубы, Войти.
    • авторизованный — приветствие + плитки Дашборд, Каталог, Клубы, Профиль, Шаблоны, Мастера (последняя — если есть публичные мастера).
  2. Старый список клубов пользователя перенесён на /dashboard, контент идентичен.
  3. /clubs отдаёт список публичных клубов с пагинацией.
  4. /masters отдаёт сетку публичных мастеров.
  5. Все 4 маршрута (/, /dashboard, /clubs, /masters) покрыты bUnit-тестами:
    • Landing_AsAnonymous_ShowsPublicTiles
    • Landing_AsAuthorized_ShowsPersonalizedTiles
    • Dashboard_AsAuthorized_RendersUserGroups
    • PublicClubIndex_AsAnonymous_ShowsPublicClubs
    • PublicMasterIndex_AsAuthorized_ShowsMasters
  6. Mobile (≤ 768px): плитки переходят в 1 колонку, бургер-меню работает (см. pitfall «MOBILE UI — BURGER MENU OVERLAY FIX»).
  7. NavMenu.razor дополнен ссылками; версия в NavMenu.razor синхронизирована с Directory.Build.props (pitfall «NavMenu version string»).
  8. dotnet test tests/GmRelay.Web.Tests/ — все тесты зелёные, новые тесты добавлены.
  9. dotnet build — 0 warnings, 0 errors.
  10. CI/CD Gitea Actions run — success.
  11. README + вики обновлены (новые маршруты, скриншоты/описание плиток).

Связанные issues / PR

  • Будет опираться на:
    • #107 (публичные страницы клубов — есть),
    • #109 (каталог игр Showcase — есть),
    • #113 (публичные профили мастеров — есть).
  • Может пересекаться с:
    • #110 (приватные клубные витрины) — если индекс /clubs будет фильтровать, надо согласовать.
    • #115 (несколько мастеров в клубе) — для /masters нужно понимать, кто именно «мастер клуба».

Версия

  • Тип изменения: feature (новая пользовательская поверхность) + refactor (вынос дашборда).
  • Bump: minorv3.5.1v3.6.0.

План

План реализации (RED-GREEN-REFACTOR, тесты, PR, релиз) согласуется отдельным сообщением после согласен от пользователя.

## Проблема Сейчас `Home.razor` (`/`) — это сразу дашборд со списком клубов пользователя. Это **единственная** точка входа, до которой реально доходит обычный пользователь: - В `NavMenu.razor` ссылки только: **Главная** (`/`), **Шаблоны** (`/templates`), **Профиль** (`/profile`). - **Showcase** (каталог игр, PR #109), **PublicClub** (публичные страницы клубов, PR #107), **PublicMasterProfile** (витрина мастеров, PR #113), **PublicSession** — существуют как страницы, но **в навигации не выведены**. - Неавторизованный пользователь, попадая на `/`, сразу упрётся в редирект на `/access-denied` — приветствия и понимания «куда я попал и что здесь можно» у него нет вообще. - Авторизованный игрок/мастер видит «список клубов», но не понимает, что есть публичный каталог Showcase, что можно посмотреть витрину мастера или зайти на публичную страницу клуба. Результат: фичи этапа 3.0 (публичные страницы клубов, каталог игр, витрина мастеров) фактически **недоступны** — про них знают только те, кто вручную вбил URL. ## Цель Сделать `/` полноценной посадочной страницей GM-Relay: пользователь с любой стороны (аноним/участник/ГМ) понимает, куда можно пойти, и попадает туда в один клик. Дашборд остаётся, но перестаёт быть единственной точкой входа. ## UX ### Неавторизованный (`@NotAuthorized`) - Заголовок-приветствие с кратким описанием продукта. - Плитки (те же карточки, что и для авторизованного, но с акцентом на то, что доступно сразу): - **Каталог игр** → `/showcase` (доступен анонимам) - **Публичные клубы** → `/clubs` (новая индексная страница, см. ниже) - **Войти** → `/login` (отдельная крупная CTA) - Никаких клубов пользователя, никакого профиля — отображается только публичный контент. ### Авторизованный (`@Authorized`) - Приветствие «Добро пожаловать, @userName» + краткий сабтайтл. - Сетка крупных плиток-карточек (дизайн в стилистике `Home.razor`/`GroupDetails.razor`, fantasy RPG): 1. **📊 Дашборд** → `/dashboard` *(см. раздел про редирект)* 2. **🎲 Каталог игр** → `/showcase` 3. **🏰 Клубы** → `/clubs` *(новая индексная страница)* 4. **👤 Мой профиль** → `/profile` 5. **📋 Шаблоны** → `/templates` 6. *(опционально, если есть данные)* **🌟 Мастера** → `/masters` *(индекс публичных профилей, см. ниже)* - Под плитками — краткий блок «Мои клубы» (превью, как сейчас в `Home.razor`, но с лимитом 3–6 и кнопкой «Открыть дашборд»). ### Поведение URL - Главная `Home.razor` остаётся на `/`, но **перестаёт быть дашбордом**. Логика: - `@Authorized` → рендерит новый хаб. - `@NotAuthorized` → рендерит приветственную версию. - Старый дашборд (список клубов пользователя, кнопки «Открыть» на каждый клуб) переезжает на `/dashboard` (новая страница `Dashboard.razor`, логика копируется из текущего `Home.razor` 1:1). - Редирект для уже авторизованных пользователей со старых закладок: при заходе на `/` редирект НЕ делаем — `/` теперь и есть хаб. Старые внешние ссылки, если такие есть, обновляем в коде на `/dashboard`. ## Технические требования - Новая страница хаба — отдельный компонент `src/GmRelay.Web/Components/Pages/Landing.razor` **либо** перепрофилированный `Home.razor` (на усмотрение исполнителя, согласовать в плане). - Новая страница `/dashboard` — `src/GmRelay.Web/Components/Pages/Dashboard.razor` (вынесенный текущий код `Home.razor`). - Новая индексная страница клубов `/clubs` — `src/GmRelay.Web/Components/Pages/PublicClubIndex.razor` (или `Clubs.razor`): - Список всех **публичных** клубов (`is_public = true`, без учёта membership текущего юзера). - Ссылка на детальную `PublicClub.razor`. - Если пользователь авторизован — над списком блок «Мои клубы» с быстрым переходом в `Dashboard.razor`. - Новая индексная страница мастеров `/masters` — `src/GmRelay.Web/Components/Pages/PublicMasterIndex.razor`: - Сетка карточек мастеров, у каждого кликабельное имя → `PublicMasterProfile.razor`. - Показывать только мастеров, у которых есть публичный профиль (см. PR #113). - Репозиторий-методы для индексов (если отсутствуют): - `IWebGameGroupRepository.GetPublicClubsAsync()` — публичные клубы с пагинацией. - `IPlayerRepository.GetPublicMastersAsync()` — мастера с публичными профилями. - `NavMenu.razor` дополнить ссылками (для авторизованных): **Каталог**, **Клубы**, **Мастера**. Бренд-ссылка `<a href="">` оставляет вести на `/` (новый хаб). - `CLAUDE.md` / `README.md` обновить: `v3.5.1` → указать новые маршруты, обновить список страниц. ## Definition of Done 1. На `/`: - неавторизованный — приветствие + плитки `Каталог`, `Клубы`, `Войти`. - авторизованный — приветствие + плитки `Дашборд`, `Каталог`, `Клубы`, `Профиль`, `Шаблоны`, `Мастера` (последняя — если есть публичные мастера). 2. Старый список клубов пользователя перенесён на `/dashboard`, контент идентичен. 3. `/clubs` отдаёт список публичных клубов с пагинацией. 4. `/masters` отдаёт сетку публичных мастеров. 5. Все 4 маршрута (`/`, `/dashboard`, `/clubs`, `/masters`) покрыты bUnit-тестами: - `Landing_AsAnonymous_ShowsPublicTiles` - `Landing_AsAuthorized_ShowsPersonalizedTiles` - `Dashboard_AsAuthorized_RendersUserGroups` - `PublicClubIndex_AsAnonymous_ShowsPublicClubs` - `PublicMasterIndex_AsAuthorized_ShowsMasters` 6. Mobile (≤ 768px): плитки переходят в 1 колонку, бургер-меню работает (см. pitfall «MOBILE UI — BURGER MENU OVERLAY FIX»). 7. `NavMenu.razor` дополнен ссылками; версия в `NavMenu.razor` синхронизирована с `Directory.Build.props` (pitfall «NavMenu version string»). 8. `dotnet test tests/GmRelay.Web.Tests/` — все тесты зелёные, новые тесты добавлены. 9. `dotnet build` — 0 warnings, 0 errors. 10. CI/CD Gitea Actions run — success. 11. README + вики обновлены (новые маршруты, скриншоты/описание плиток). ## Связанные issues / PR - Будет опираться на: - #107 (публичные страницы клубов — есть), - #109 (каталог игр Showcase — есть), - #113 (публичные профили мастеров — есть). - Может пересекаться с: - #110 (приватные клубные витрины) — если индекс `/clubs` будет фильтровать, надо согласовать. - #115 (несколько мастеров в клубе) — для `/masters` нужно понимать, кто именно «мастер клуба». ## Версия - Тип изменения: **feature** (новая пользовательская поверхность) + **refactor** (вынос дашборда). - Bump: **minor** → `v3.5.1` → `v3.6.0`. ## План План реализации (RED-GREEN-REFACTOR, тесты, PR, релиз) согласуется отдельным сообщением после `согласен` от пользователя.
Toutsu added this to the Версия 3.0 — Platform & Club Expansion milestone 2026-06-01 19:22:15 +03:00
Toutsu added the type:featurearea:webpriority:p2platform:multi labels 2026-06-01 19:22:44 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Toutsu/GmRelayBot#117