* feat(dashboard): detail-first continue watching cards with quick actions (#1441) Continue Watching cards now open the detail page on click like movie cards; resuming the saved episode, marking it watched, and removing the entry from history move into a per-card ⋮ menu. Series details land on the earliest season with unwatched episodes (or the latest once all are watched) instead of always season 1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(dashboard): address review findings and season auto-select regressions - A session's own watched toggles no longer re-resolve the selected season when the positions map first fills — marking season 1 watched used to jump the view to season 2 (CI regression in the web and Electron season-watched-toggle E2Es). - The all-watched season fallback skips loaded-but-empty seasons and picks the latest season that has episodes (Greptile P1). - Mark as Watched uses the strict failure-propagating save boundary (Codex P2), and both card mutations surface persistence failures via a snackbar with the new WORKSPACE.DASHBOARD.ACTION_FAILED key in all 19 languages (Greptile P2). - Season E2Es now assert the intended post-reload behavior: the fresh mount lands on the earliest unwatched season while season 1 keeps its watched state behind its tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: 4gray <fourgray@proton.me> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Workspace Dashboard Feature
This library owns the workspace dashboard rails UI. The dashboard is a read-only surface over existing playlist, recent, favorites, EPG, and Xtream catalog data; it should not introduce Electron IPC, SQLite schema, or route contracts on its own.
Dashboard Surfaces
The dashboard renders a surface only when the matching setting is enabled. Data rails also require the underlying data slice to have at least one item.
heroshows the large top banner for the most recent global item. When that item is a live TV channel, the hero looks up the current XMLTV programme and displays the programme title, time range, and EPG progress bar when data is available.continueWatchingshows recent movies and series fromDashboardDataService.globalRecentVodItems()using cover cards with playback progress when a saved resume position is available.liveFavoritesshows favorited live TV channels fromDashboardDataService.globalFavoriteLiveItems()using the channel layout with EPG title, time range, and progress when XMLTV data is available.recentlyWatchedLiveshows recently watched live TV channels fromDashboardDataService.globalRecentLiveItems()using the same channel layout.favoriteMoviesAndSeriesshows favorited movies and series fromDashboardDataService.globalFavoriteItems(), excluding live favorites, using cover cards.recentSourcesshows recently used playlist/source entries.xtreamRecentlyAddedshows recently added Xtream catalog items.tmdbRecommendationsshows "Because you watched X" — TMDB recommendations seeded from recently watched movies/series, kept to titles that exist in an imported Xtream library. Needs the TMDB opt-in and the Electron DB worker (hidden in the PWA), and hides itself below five matched cards. Data:DashboardRecommendationsServiceinworkspace/dashboard/data-access.tmdbTrendingshows TMDB's weekly trending titles, matched against the imported Xtream libraries. Same TMDB/Electron gating; unmatched cards open the global search prefilled. Data:DashboardTrendingService.
Settings
Per-surface visibility lives on Settings.dashboardRails as a
DashboardRailsSettings object. Every surface defaults to enabled. Stored
settings are deep-merged with DEFAULT_DASHBOARD_RAILS_SETTINGS by
SettingsStore, so existing users and older partial settings keep newly added
surfaces visible unless they explicitly turn them off.
The global showDashboard flag remains a top-level Settings property because
workspace startup and route guards already depend on that contract. The Settings
UI groups showDashboard and the per-surface checkboxes in the Dashboard
section. When showDashboard is off, the per-surface checkboxes are disabled
because the dashboard route itself is hidden.
Navigation
Rail cards use the navigation state provided by DashboardDataService for the
underlying item. Rail "See all" links may also pass router state:
- live rails open the relevant collection on Live TV.
- cover rails for movies/series open Global Recent or Global Favorites on Movies when movie items are present, otherwise on Series.
This keeps the global collection pages from defaulting to Live TV when a dashboard rail is clearly about movies or series.