diff --git a/docs/architecture/portal-detail-navigation.md b/docs/architecture/portal-detail-navigation.md index c3537adfc..52eba2b22 100644 --- a/docs/architecture/portal-detail-navigation.md +++ b/docs/architecture/portal-detail-navigation.md @@ -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 diff --git a/docs/architecture/workspace-dashboard.md b/docs/architecture/workspace-dashboard.md index 0e8fd33e7..46ba49a68 100644 --- a/docs/architecture/workspace-dashboard.md +++ b/docs/architecture/workspace-dashboard.md @@ -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