feat(dashboard): full-screen team-scoped TV-view dashboard mode #280

Merged
David merged 3 commits from feat/MAPPS-256-tv-view-dashboard into main 2026-06-26 01:41:52 +02:00
Owner

Add a chrome-less wall-monitor "TV view" of the dashboard for labs / dispatch centers, scoped to the viewer's team so a board never shows tickets outside that team (IT vs HR vs service-vendor).

New Route::DashboardTv (/dashboard/tv) sits behind the same AuthGuard as the other authenticated routes, but DashboardTvPage() renders WITHOUT AppLayout: a bare h-screen w-screen container with one KPI strip and two essential tables (today's technician/location/appointment board from the dispatch payload, and team-scoped ticket status). Because it never mounts AppLayout, no TopBar, Sidebar, UpdateBanner, or ToastRoot chrome renders over it, and there are no action buttons. main.rs mounts no global chrome above the router outlet, so nothing else leaks in.

Data is team-scoped via the PMS-406 parameters: the ticket list uses ?team_id=<uuid> when a single team is pinned in settings, otherwise the server-resolved ?my_teams=true union; the KPI aggregate (/reports/dashboard) is team-scoped via ?team_id= only when a single team is pinned (the endpoint scopes to one team, not a union). Every resource re-runs on org switch (active_tenant_generation()) and on a 30s timer so an unattended monitor stays current.

A per-user setting (localStorage mokosh_tv_view plus optional mokosh_tv_team, via a new hooks/tv_view.rs mirroring the theme precedent) toggles the entry point, surfaced both from a new Settings hub card / /settings/tv-view page and as a link on the normal dashboard header.

#MAPPS-256

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

Add a chrome-less wall-monitor "TV view" of the dashboard for labs / dispatch centers, scoped to the viewer's team so a board never shows tickets outside that team (IT vs HR vs service-vendor). New `Route::DashboardTv` (`/dashboard/tv`) sits behind the same `AuthGuard` as the other authenticated routes, but `DashboardTvPage()` renders WITHOUT `AppLayout`: a bare `h-screen w-screen` container with one KPI strip and two essential tables (today's technician/location/appointment board from the dispatch payload, and team-scoped ticket status). Because it never mounts `AppLayout`, no `TopBar`, `Sidebar`, `UpdateBanner`, or `ToastRoot` chrome renders over it, and there are no action buttons. `main.rs` mounts no global chrome above the router outlet, so nothing else leaks in. Data is team-scoped via the PMS-406 parameters: the ticket list uses `?team_id=<uuid>` when a single team is pinned in settings, otherwise the server-resolved `?my_teams=true` union; the KPI aggregate (`/reports/dashboard`) is team-scoped via `?team_id=` only when a single team is pinned (the endpoint scopes to one team, not a union). Every resource re-runs on org switch (`active_tenant_generation()`) and on a 30s timer so an unattended monitor stays current. A per-user setting (localStorage `mokosh_tv_view` plus optional `mokosh_tv_team`, via a new `hooks/tv_view.rs` mirroring the theme precedent) toggles the entry point, surfaced both from a new Settings hub card / `/settings/tv-view` page and as a link on the normal dashboard header. #MAPPS-256 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(dashboard): full-screen team-scoped TV-view dashboard mode
All checks were successful
Check / clippy + fmt + tests (pull_request) Successful in 1m2s
b2efe1b75e
Add a chrome-less wall-monitor "TV view" of the dashboard for labs / dispatch centers, scoped to the viewer's team so a board never shows tickets outside that team (IT vs HR vs service-vendor).

New `Route::DashboardTv` (`/dashboard/tv`) sits behind the same `AuthGuard` as the other authenticated routes, but `DashboardTvPage()` renders WITHOUT `AppLayout`: a bare `h-screen w-screen` container with one KPI strip and two essential tables (today's technician/location/appointment board from the dispatch payload, and team-scoped ticket status). Because it never mounts `AppLayout`, no `TopBar`, `Sidebar`, `UpdateBanner`, or `ToastRoot` chrome renders over it, and there are no action buttons. `main.rs` mounts no global chrome above the router outlet, so nothing else leaks in.

Data is team-scoped via the PMS-406 parameters: the ticket list uses `?team_id=<uuid>` when a single team is pinned in settings, otherwise the server-resolved `?my_teams=true` union; the KPI aggregate (`/reports/dashboard`) is team-scoped via `?team_id=` only when a single team is pinned (the endpoint scopes to one team, not a union). Every resource re-runs on org switch (`active_tenant_generation()`) and on a 30s timer so an unattended monitor stays current.

A per-user setting (localStorage `mokosh_tv_view` plus optional `mokosh_tv_team`, via a new `hooks/tv_view.rs` mirroring the theme precedent) toggles the entry point, surfaced both from a new Settings hub card / `/settings/tv-view` page and as a link on the normal dashboard header.

#MAPPS-256

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge branch 'main' into feat/MAPPS-256-tv-view-dashboard
Some checks failed
Check / fmt + clippy + tests (pull_request) Has been cancelled
9f248830f9
Resolve conflicts from the MAPPS-258 settings-taxonomy rewrite and the
MAPPS-323/PMS-453 additions on main:

- hooks/mod.rs: keep both the new `tv_view` module (MAPPS-256) and `unsaved_guard` (from main).
- lib.rs: keep both the `DashboardTv` route (MAPPS-256) and the `SavedDashboards`/`SavedDashboardView` routes (PMS-453/PMS-472).
- settings.rs: keep `TvViewSettingsPage` alongside main's `SettingsGroupKey` taxonomy; union the component imports (`Checkbox`/`Input` from MAPPS-256, `Breadcrumbs`/`SearchInput` from MAPPS-258).
- settings.rs: re-home the TV View settings-hub entry that main's `SettingsHomePage` rewrite dropped. Register it as a Personalization `SettingsSurface` (gets the index card, search hit, and breadcrumb for free) instead of the stray auto-merged card the toolbar row had picked up, and add the `SettingsBreadcrumb` to `TvViewSettingsPage` to match `AppearanceSettingsPage`.

fmt, wasm check, clippy -D warnings, and the 189 lib tests are green. The pre-existing `check-theme-tokens` failure (13 hardcoded color classes in untouched files) is unchanged from main.

#MAPPS-256
fix(merge): restore TV-view content dropped by the main merge
All checks were successful
Check / fmt + clippy + tests (pull_request) Successful in 8m19s
Create release / Create release from merged PR (pull_request) Has been skipped
ebe9696455
The preceding merge commit resolved the hooks/lib/settings conflicts to main's
side and lost the auto-merged dashboard.rs, so the MAPPS-256 TV view was absent
from the tree even though hooks/tv_view.rs survived as an orphan module. Re-apply
the conflict resolution on top of the merge:

- hooks/mod.rs: declare `pub mod tv_view;` alongside `unsaved_guard`.
- lib.rs: add the `DashboardTv` (/dashboard/tv) and `SettingsTvView` (/settings/tv-view) routes plus their component wrappers, next to main's `SavedDashboards`/`SavedDashboardView`.
- dashboard.rs: restore `DashboardTvPage` and the dashboard-header entry link.
- settings.rs: restore `TvViewSettingsPage`, register TV View as a Personalization `SettingsSurface` (index card, search, breadcrumb), union the `Checkbox`/`Input` imports, and add the `SettingsBreadcrumb` to match `AppearanceSettingsPage`.

fmt, wasm check, clippy -D warnings, and the lib tests pass. The pre-existing `check-theme-tokens` failure (13 hardcoded color classes in untouched files) is unchanged from main.

#MAPPS-256
David merged commit d4a27409ad into main 2026-06-26 01:41:52 +02:00
David deleted branch feat/MAPPS-256-tv-view-dashboard 2026-06-26 01:41:52 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/mokosh-apps!280
No description provided.