docs: update portal detail navigation and workspace dashboard architecture for collection detail handling

Entire-Checkpoint: c6e522b4276c
This commit is contained in:
4gray committed 2026-04-18 10:16:39 +02:00
1 parent 5e41e3d1ce
commit 2edb5fe296
2 files changed
+116 -32

No files matched your search

+82 -14
View File
@@ -8,54 +8,111 @@ Related:
## Summary
- Xtream uses a route-first detail model.
- Xtream category browsing uses a route-first detail model.
- Stalker uses an inline/store-state detail model.
- Keep favorites/recent/search behavior aligned with the canonical detail model of the same portal.
- Do not force both portals into the same behavior unless the full portal detail architecture is being changed.
- Favorites and recently viewed collections now use collection-owned inline detail
for non-live Xtream and Stalker items.
- Provider-scoped collection routes fall back to the matching global collection
route when `All playlists` shows a non-live item from the other portal type,
so the correct detail host still opens without switching playlist context.
- Dashboard `Global Favorites` and `Recently Watched` widgets hand off Xtream and
Stalker movies/series into the matching global collection route with detail
pre-opened.
- Do not force both portals into the same browse/detail behavior unless the full
portal detail architecture is being changed.
## Xtream
Xtream details are represented by canonical routes.
Xtream category and search details are represented by canonical routes.
Examples:
- `/xtreams/:id/vod/:categoryId/:vodId`
- `/xtreams/:id/series/:categoryId/:serialId`
Implication:
- Favorites, recently viewed, and search should redirect to the original Xtream content route and item route.
- This keeps the URL, browser history, and detail rendering model aligned with normal Xtream browsing.
- Category browsing and search can still redirect to the original Xtream content
route and item route.
- This keeps the URL, browser history, and detail rendering model aligned with
normal Xtream browsing.
Current code paths:
- `libs/portal/xtream/feature/src/lib/favorites/favorites.component.ts`
- `libs/portal/xtream/feature/src/lib/search-results/search-results.component.ts`
- `libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.ts`
Behavior to preserve:
- Selecting an Xtream item from favorites/recent/search should navigate to the Xtream content type/category/item route when the item is not a live stream.
- Live streams can still open through the player path rather than a detail route.
Collection behavior to preserve:
- Selecting a non-live Xtream item from favorites/recent should keep the current
collection route and open inline detail inside the collection pane when the
current collection host is already Xtream-aware.
- If a Stalker or M3U collection route is showing `All playlists` and the user
selects an Xtream movie/series item, route into `/workspace/global-favorites`
or `/workspace/global-recent` with detail pre-opened instead of trying to
render Xtream detail inside the wrong host.
- The current playlist context must stay unchanged even when the selected item
belongs to a different Xtream source playlist.
- The workspace/sidebar category panel should stay hidden for these collection
detail opens.
- Back from a collection-owned detail should restore the previous collection
view state, including the active content tab and playlist/all-playlists
scope.
- Live streams can still open through the player path rather than a detail
route.
Dashboard behavior to preserve:
- Dashboard `Global Favorites` and `Recently Watched` widgets should route
Xtream movie/series items into `/workspace/global-favorites` or
`/workspace/global-recent` with collection detail pre-opened from navigation
state.
- Back from the collection detail should return to the dashboard handoff state,
not switch the active playlist.
Search behavior to preserve:
- Selecting an Xtream item from search should still navigate to the canonical
Xtream content type/category/item route when the item is not a live stream.
## Stalker
Stalker details are represented by store state and inline detail rendering on the current screen.
Examples:
- Category content sets `selectedItem` and renders details inline.
- Search sets `selectedItem` and stays on the search view.
- Favorites and recently viewed stay on their current collection screen and open inline detail.
- Favorites and recently viewed stay on their current collection screen and open
inline detail when the current collection host is already Stalker-aware.
Implication:
- Favorites, recently viewed, and search should remain in the current Stalker view when opening VOD/series details.
- This keeps Stalker behavior aligned with its normal category-content and search flow.
Current code paths:
- `libs/portal/stalker/feature/src/lib/stalker-favorites/stalker-favorites.component.ts`
- `libs/portal/stalker/feature/src/lib/recently-viewed/recently-viewed.component.ts`
- `libs/portal/stalker/feature/src/lib/stalker-search/stalker-search.component.ts`
- `libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.ts` (Stalker branch)
Behavior to preserve:
- Favorites/recent/search should not navigate away to a canonical Stalker detail route because Stalker does not currently use one.
- If an Xtream or M3U collection route is showing `All playlists` and the user
selects a Stalker VOD/series item, route into `/workspace/global-favorites`
or `/workspace/global-recent` with detail pre-opened so the Stalker inline
detail host still renders on a compatible screen.
- ITV/live items can still trigger playback immediately.
- Dashboard `Global Favorites` and `Recently Watched` widgets should route
Stalker movie/series items into `/workspace/global-favorites` or
`/workspace/global-recent` with detail pre-opened inline, again without
switching playlist context or showing the workspace category sidebar.
- Back from the collection-owned detail should restore the previous collection
tab and scope instead of resetting the collection screen to its defaults.
## Decision Rule For Future Changes
@@ -66,16 +123,27 @@ When deciding how a favorites/recent/search click should behave:
3. Only unify Xtream and Stalker behavior if the full detail architecture is being unified as well.
That means:
- Xtream: navigate to the canonical route.
- Stalker: stay in the current screen and open inline detail.
- Xtream browse/search: navigate to the canonical route.
- Xtream favorites/recent/global collection widgets: open collection-owned
detail without switching playlist context. Use the current route when it can
host Xtream detail, otherwise fall back to the matching global collection
route.
- Stalker non-live items: open collection-owned detail without switching
playlist context. Use the current route when it can host Stalker detail,
otherwise fall back to the matching global collection route.
## Refactor Guidance
If a future change proposes that Stalker favorites/recent should deep-link into category routes:
- also update Stalker category-content and search behavior
- define a canonical Stalker detail route model first
- update architecture docs and portal skills together
If a future change proposes that Xtream favorites/recent should stay inline:
- also replace Xtream route-based detail pages with a portal-local inline detail model
- verify history/back behavior and deep links still make sense
- keep the existing route-based detail pages reusable from the collection-owned
detail host
- verify history/back behavior, playlist preservation, and dashboard handoff
behavior still make sense
+34 -18
View File
@@ -35,20 +35,20 @@ Registered widget types:
Default layout:
1. `continue-watching`
1. Enabled by default
2. Size `full`
1. Enabled by default
2. Size `full`
2. `recently-watched`
1. Enabled by default
2. Size `two-thirds`
3. Scope-aware
1. Enabled by default
2. Size `two-thirds`
3. Scope-aware
3. `global-favorites`
1. Enabled by default
2. Size `one-third`
3. Scope-aware
1. Enabled by default
2. Size `one-third`
3. Scope-aware
4. `source-stats`
1. Present in the registry
2. Disabled by default
3. Size `one-third`
1. Present in the registry
2. Disabled by default
3. Size `one-third`
The old refactor summary mentioned `Recent Sources`, but that widget is not in
the current registry and should not be documented as shipped behavior.
@@ -62,13 +62,13 @@ Current storage details:
1. Storage key: `workspace-dashboard-layout-v3`
2. Schema version: `12`
3. Size presets:
1. `one-third`
2. `half`
3. `two-thirds`
4. `full`
1. `one-third`
2. `half`
3. `two-thirds`
4. `full`
4. Scope settings:
1. `providers: Array<'m3u' | 'xtream' | 'stalker'>`
2. `playlistIds: string[]`
1. `providers: Array<'m3u' | 'xtream' | 'stalker'>`
2. `playlistIds: string[]`
Normalization rules in `DashboardLayoutService`:
@@ -89,6 +89,19 @@ Normalization rules in `DashboardLayoutService`:
5. Data comes from `DashboardDataService` and existing provider/state services.
6. Widget actions deep-link back into workspace/provider routes.
Dashboard detail handoff contract:
1. Live items continue to activate their existing playback/provider route flows.
2. Xtream and Stalker movies/series from `global-favorites` or
`recently-watched` should route into `/workspace/global-favorites` or
`/workspace/global-recent` with collection detail pre-opened from navigation
state.
3. Those collection detail opens must not switch the active playlist in the
header playlist switcher.
4. Those collection detail opens must not show the workspace category sidebar.
5. The detail close/back action should return to the dashboard-origin view
rather than reopening provider/category navigation.
## Customize Mode
Customize mode is part of the current product, not future work.
@@ -111,7 +124,10 @@ than per-widget custom query systems.
2. Each widget must own its loading, empty, and error states.
3. Dashboard failures must stay isolated to the widget that failed.
4. Widget navigation should resolve directly into the relevant content context.
5. New widgets should fit the existing constrained layout model unless the
5. Dashboard favorites/recent movie/series activations should preserve the
current playlist context and use the collection-owned detail host instead of
forcing provider/category side-navigation.
6. New widgets should fit the existing constrained layout model unless the
dashboard architecture is explicitly being expanded.
## Adding Or Changing Widgets