Files
iptvnator/docs/architecture/workspace-dashboard.md
T
4gray 4211f22a69 feat(dashboard): create separate workspace-dashboard lib with widgets
- Implemented `DashboardActivityItemsComponent` with styles and functionality for displaying activity items in list and grid views.
- Created `DashboardWidgetShellComponent` for consistent widget layout with header and content areas.
- Developed `GlobalFavoritesWidgetComponent` to manage and display global favorites with filtering options.
- Added `RecentSourcesWidgetComponent` to show recently accessed sources with links to manage them.
- Introduced `RecentlyWatchedWidgetComponent` to track and display recently watched content with filtering capabilities.
- Created `SourceStatsWidgetComponent` to present statistics of different source types.
- Established TypeScript configuration files for the dashboard UI library.
2026-02-24 19:08:10 +01:00

189 lines
6.0 KiB
Markdown

# Workspace Dashboard Plan
## Context
The workspace shell is now the primary app entrypoint. The dashboard should evolve from a placeholder into an operational home page that helps users:
1. Quickly continue playback/work.
2. Switch context across M3U, Xtream, and Stalker sources.
3. Monitor relevant content (recent items, EPG, status) in one place.
This document defines the implementation plan before Phase 1 work starts.
## Status Snapshot (February 22, 2026)
### Delivered
1. Dashboard route is active in workspace shell with persisted widget layout.
2. Widget host and configurable widget model are implemented.
3. `Customize` mode supports:
1. Enable/disable widgets
2. Reorder widgets (up/down)
3. Widget scope (provider + playlist selection)
4. Active widgets in production:
1. Continue Watching
2. Recent Sources
3. Source Statistics
4. Recently Watched (global)
5. Global Favorites
5. Recently Watched and Global Favorites support:
1. Content-kind chips (channels/vod/series)
2. List/grid toggle
3. Direct deep linking from widget item to target view/detail
6. Xtream live deep links now auto-start playback when opened from dashboard widgets.
7. Dashboard now uses a shared Material-based widget shell for consistent visual structure.
8. Customize mode now supports drag-and-drop ordering and widget size presets (`1/3`, `1/2`, `2/3`, `full`).
### Partially Delivered / Deviation From Initial Phase 1 List
1. EPG Radar was intentionally removed from the current dashboard scope and is postponed.
2. Recent Activity / Recently Added widget was intentionally removed from current scope.
### Not Started
1. Phase 4 external widgets (RSS/scores/news adapters).
### Immediate Next Widget Tasks (Recommended)
1. Expand widget settings UX (scope presets, bulk provider toggles).
## Product Direction
The dashboard should be a configurable widget system, but introduced in stages:
1. Start with useful, stable widgets and a constrained layout.
2. Add edit/customization workflows after widget value is proven.
3. Add advanced drag/resize and external integrations later.
This avoids building heavy layout mechanics before core data widgets are solid.
## UX Direction
Design style: professional operator console (dense, calm, high-signal).
Target layout:
1. Top row: continue actions, recent sources, health/status.
2. Middle row: discovery widgets (recently viewed, recently added, favorites).
3. Edit mode: add/remove/reorder widgets and configure source scope.
## Architecture
## Core Components
1. `DashboardPageComponent` (container/layout/edit mode orchestration)
2. `DashboardWidgetHostComponent` (widget factory/renderer by type)
3. `DashboardLayoutStore` (signal-based state for layout, settings, edit mode)
4. `DashboardPersistenceService` (save/load layout, version migration)
5. `DashboardDataFacade` (aggregate provider data for widgets)
## Widget Contract
```ts
type WidgetSize = 'one-third' | 'half' | 'two-thirds' | 'full';
interface WidgetScope {
providers: Array<'m3u' | 'xtream' | 'stalker'>;
playlistIds?: string[];
}
interface DashboardWidget {
id: string;
type: string;
title: string;
size: WidgetSize;
order: number;
enabled: boolean;
scope: WidgetScope;
settings: Record<string, unknown>;
}
interface DashboardLayout {
version: number;
widgets: DashboardWidget[];
}
```
## Capability Rules
Widgets must degrade gracefully per provider:
1. If a source/provider does not support required data (for example EPG), show a clear empty/unsupported state.
2. Widgets never hard fail the page; each widget owns loading/error states.
3. Scope defaults to "all supported providers" unless user config overrides it.
## Phased Delivery
## Phase 1 (Now): Production Dashboard V1
Scope:
1. Replace placeholder dashboard with real widget host + predefined layout.
2. Fixed grid slots (no free drag/resize yet).
3. Initial widgets:
1. Recent Sources
2. Continue Watching
3. Source Statistics
4. Recently Added / Recently Viewed (provider-aware)
4. Persist enabled/disabled and order (simple list reorder if needed).
Out of scope:
1. Freeform drag-and-drop grid resizing.
2. External data providers (RSS/sports/news).
3. Full widget marketplace.
Acceptance criteria:
1. Dashboard loads with useful content for at least one active source type.
2. Empty states are clear and actionable (links to Sources/settings).
3. No route regressions for existing workspace sections.
4. Layout/settings survive app restart.
## Phase 2: Edit Mode and Configuration
Scope:
1. "Customize dashboard" mode.
2. Enable/disable widgets.
3. Widget-level source scoping (providers + selected playlists).
4. Order management (move up/down or drag reorder within constrained grid).
## Phase 3: Advanced Layout (Drag/Resize)
Scope:
1. True grid layout manager with size presets and drag repositioning.
2. Collision handling and responsive breakpoint behavior.
3. Optional "reset layout" and preset templates.
## Phase 4: External Widgets
Scope:
1. Adapter interface for non-playlist data widgets (RSS, scores, news).
2. Polling/cache strategy with rate limits.
3. User opt-in and failure isolation per external source.
## Data and Performance Notes
1. Use memoized/computed selectors for widget inputs.
2. Avoid redundant provider fetches; reuse existing stores/services where possible.
3. Update widgets incrementally and isolate heavy computations in facade/store utilities.
## File/Module Placement (Proposed)
1. `libs/workspace/dashboard/feature/` (page + edit mode orchestration)
2. `libs/workspace/dashboard/ui/` (widget host + widget components)
3. `libs/workspace/dashboard/data-access/` (state model + persistence + data facade/service)
4. Route integration remains in `apps/web/src/app/app.routes.ts` and workspace shell.
## Open Questions
1. Should dashboard layout be global per app profile, or per active workspace/provider mix?
2. Which widgets are enabled by default for new users vs migrated users?
## Next Step
Start Phase 1 implementation using this document as the source of truth and track deviations explicitly in follow-up updates.