Portal requirements (POR-*)
@enode/portal — the browser-first coach/admin console (responsive, no native
shell). Shared behavior (auth flow, i18n, units, error engine) lives in
shared.md. See the overview for the ID scheme and
status legend. Test cases:
portal-system-tests.md.
Areas: AUTH · DASH (dashboard) · PLAN (planner) · DEVICES · USERS ·
EXER (exercises) · WKT (workout templates) · TAGS · INS (insights) ·
PROF (profiles/performance) · HIST (history) · MIGR (migration) ·
EXP (export) · NOTIF (notifications) · RBAC (privilege gating).
Auth & entry (POR-AUTH)
| ID | Requirement | Status | Tests |
|---|
| POR-AUTH-01 | Both One and Pro users can sign in via the shared flow (SHR-AUTH-01); registration is Pro-only; One users are supported primarily to migrate legacy data. | stable | POR-ST-1.1..1.3 |
| POR-AUTH-02 | Device-limit (310), onboarding (311), and invitation (312) responses are handled with their dedicated dialogs/redirects (SHR-AUTH-06..08). | stable | POR-ST-1.6..1.8 |
Dashboard (POR-DASH)
| ID | Requirement | Status | Tests |
|---|
| POR-DASH-01 | The dashboard shows time-range-scoped summaries (active athletes, completed sessions, total volume, sets) with trends vs the prior period. | stable | POR-ST-2.1, POR-ST-2.2 |
| POR-DASH-02 | Top-exercise and athlete-activity rankings and a completed-sessions table are shown for the selected range. | stable | POR-ST-2.3, POR-ST-2.4 |
Planner (POR-PLAN)
Covered in depth by the dedicated
Planner manual test protocol.
| ID | Requirement | Status | Tests |
|---|
| POR-PLAN-01 | The planner offers month/week/day calendar views of scheduled and recurring workouts. | stable | Planner protocol §1–§5 |
| POR-PLAN-02 | Workouts can be created, edited, deleted, and rescheduled (including drag & drop); recurring schedules are supported. | stable | Planner protocol §6, §8, §9 + POR-ST-3.1 |
| POR-PLAN-03 | Saving a change to a shared workout plan surfaces the shared-definition conflict dialog (HTTP 313) with fork/update/cancel options. | stable | Planner protocol §7 |
Devices (POR-DEVICES)
| ID | Requirement | Status | Tests |
|---|
| POR-DEVICES-01 | Connected device sessions (stations) can be listed, searched, and removed. | stable | POR-ST-4.1, POR-ST-4.2 |
Users & roster (POR-USERS)
| ID | Requirement | Status | Tests |
|---|
| POR-USERS-01 | Users are listed in a searchable table filterable by role (admin/coach/athlete). | stable | POR-ST-5.1 |
| POR-USERS-02 | A user can be created and edited in the user drawer, including athlete metadata; height/weight respect the metric/imperial setting. | stable | POR-ST-5.2, POR-ST-5.6 |
| POR-USERS-03 | Bulk operations: add tags to multiple users; delete multiple users (with confirmation). | stable | POR-ST-5.3, POR-ST-5.4 |
| POR-USERS-04 | A roster CSV can be uploaded through the wizard: dropzone → parse → column auto-mapping → validation → review → asynchronous creation with live progress. Privilege: featureUserBatchUpload. | stable | POR-ST-5.5 |
| POR-USERS-05 | Per-user actions include data export and viewing upcoming workouts. | stable | POR-ST-5.7 |
Exercises (POR-EXER)
| ID | Requirement | Status | Tests |
|---|
| POR-EXER-01 | The exercise catalogue is searchable by name/tag and filterable by equipment and muscle category; exercises can be favourited. | stable | POR-ST-6.1, POR-ST-6.2 |
| POR-EXER-02 | The exercise detail drawer shows catalogue data and lets the user override name/details with custom values. | stable | POR-ST-6.3 |
Workout templates (POR-WKT)
| ID | Requirement | Status | Tests |
|---|
| POR-WKT-01 | Workout templates are listed as cards with search and tag filtering; templates can be created and edited in a drawer and bulk-deleted. The page is an early build (in-code note: structural first pass). | stable | POR-ST-7.1..7.3 |
| ID | Requirement | Status | Tests |
|---|
| POR-TAGS-01 | Tags are listed with access-level filter chips; a tag can be created/edited (color, details) and bulk-deleted; tag relations are shown. | stable | POR-ST-8.1..8.3 |
Insights — custom charts (POR-INS)
| ID | Requirement | Status | Tests |
|---|
| POR-INS-01 | Users with the writeCustomCharts privilege can build custom charts (5 chart types) on a draggable board; charts persist per user. | stable | POR-ST-9.1..9.3 |
| POR-INS-02 | The builder preview, empty state, and walkthrough render synthetic example charts (educational visuals, not real data). | mocked | — (known behaviour) |
| ID | Requirement | Status | Tests |
|---|
| POR-PROF-01 | The Profiles page shows a two-axis athlete × exercise performance matrix with list/grid views (persisted preference), pair detail, and per-athlete trend. | stable | POR-ST-10.1..10.3 |
History & session details (POR-HIST)
| ID | Requirement | Status | Tests |
|---|
| POR-HIST-01 | Completed sessions can be searched with filters and paginated; the default window is the last year. | stable | POR-ST-11.1, POR-ST-11.2 |
| POR-HIST-02 | A session opens in a drawer with a summary tab and technique board. | stable | POR-ST-11.3 |
| POR-HIST-03 | The session summary's zone-distribution and muscle-map cards render from the V2 history-stats DTO; marked WIP in code, zone card limited to conventional-strength exercises. | wip | — (known behaviour) |
| POR-HIST-04 | A dedicated date-range picker is planned for a later milestone (dev-only all-time toggle exists). | wip | — |
| POR-HIST-05 | An Archived filter splits the sessions table into disjoint compartments: by default sessions from archived athletes are hidden; the filter shows only those (SHR-ARCH-03). Like the page's other facets it narrows the loaded page only, so the counts are page-scoped. | stable | POR-ST-17.2 |
Migration (POR-MIGR)
| ID | Requirement | Status | Tests |
|---|
| POR-MIGR-01 | A wizard migrates athletes, groups, and history from enode Pro; reachable as a route and as a sidebar drawer. Privilege: featureMigration. | stable | POR-ST-12.1, POR-ST-12.2 |
| POR-MIGR-02 | Exercise mapping during migration is chosen manually by the coach (auto-suggestion intentionally stubbed — backend returns no targets by design). | stable | POR-ST-12.3 |
Export (POR-EXP)
| ID | Requirement | Status | Tests |
|---|
| POR-EXP-01 | The export flow produces data exports (including PDF); reachable as a route (deep-linkable via URL params) and as a sidebar drawer. Privilege: featureDataExport. | stable | POR-ST-13.1, POR-ST-13.2 |
Notifications (POR-NOTIF)
| ID | Requirement | Status | Tests |
|---|
| POR-NOTIF-01 | Notifications arrive live (stream + arrival peek + bell unread badge) and are listed in an inbox with filter segments, mark-read, delete, and deep-link expansion. | stable | POR-ST-14.1..14.3 |
| POR-NOTIF-02 | Long-running roster uploads report progress live (stream host + peek). | stable | POR-ST-5.5 |
Privileges & roles (POR-RBAC)
| ID | Requirement | Status | Tests |
|---|
| POR-RBAC-01 | Navigation entries and routes are gated by privileges (useHasPrivilege): Users pages, Insights, roster upload, migration, and export are hidden/blocked without the corresponding privilege. | stable | POR-ST-15.1, POR-ST-15.2 |
| POR-RBAC-02 | The role model is owner → administrator ("Facility") → coach → athlete; the owner is an all-access singleton excluded from role filters. | stable | POR-ST-15.3 |
Dev-only surfaces
/dashboard/debug, /dashboard/debug/wizard, and /dashboard/debug/benchmark
plus the mock-data harness render only in dev builds (render-time guards; all
mock setters no-op in production). Not release-tested beyond confirming they
are absent in production builds (POR-ST-16.5).