QA plan — dashboard shell
Flat dashboard navigation
-
/dashboard/*always rendersDashboardSidebarand the original header — Spotter, oneUserButtonin the header, and the existing sidebar footer controls. - All permitted destinations stay visible together under Clients, Training, Business, and Grow. There is no Train / Track / Thrive switcher.
- Roles, tier gates, reports availability, and organization type still govern individual flat-sidebar items.
- Training shows only enabled Schedule and Cohorts plus Workouts and Movements; Courses and Programs are hidden.
-
/dashboard/programsforwards to Settings > General’s Ways to train section; it renders no programs list. - Settings > Preferences shows no “take the guided tour” row.
-
/dashboard/programs/:id(program detail) shows the same tabs for both delivery modes. - Deleting a program from
/dashboard/programs/:idthat still has upcoming published sessions or active enrollments shows the “still in use” toast (programs.deleteBlocked) rather than the generic failure toast, on a409 program_in_useresponse. A successful delete lands on Coaching.
Schedule
-
/dashboard/schedulerenders the schedule grid directly — no tabs, no segmented control, no program selector — with the shared section greeting (eyebrow “Schedule”, time-of-day greeting + first name, today’s date) at the top. - Below the greeting, a stats strip for the currently-viewed week:
Sessions, Bookings, Members, Fill rate — sourced from the same
GET .../programs/:id?weekStart=the program detail page uses, and following the week navigator (changing week changes the strip). - A fifth “WODs posted” tile (
published/classDays) appears, reading the same board queryWeeklyCalendaralready fires (one network call, not two). - The org’s one active schedule program is used automatically; an inactive or non-schedule program is never picked.
- No schedule program: redirects to Workouts.
-
/dashboard/programmingdoes not exist (404 or 410, per Next.js’s own handling for a route with no folder) — it was deleted along with the standalone board. -
/dashboard/schedule?session=(the paste/builder return link) opens that session in the calendar; aprogramIdon the link is ignored. - The class-day workout name shows on expanded cards and condensed rows; no chip, dot or day sheet exists on Schedule.
- Setting a workout on a schedule class day publishes it; no separate publish step exists.
- Toolbar is identical in expanded and condensed views: Spotter button,
the “This week” menu (Copy last week copies sessions only; Drafts group with
Publish draft sessions / Delete sessions and a draft-session count badge;
no WOD publish row), then the view toggle. None of it renders on the
program detail page’s Schedule tab (same
WeeklyCalendar, different caller). - Condensed columns show “Add a session” on hover (always on empty days) and it opens the create sheet for that day.
- Set up timetable’s “Class types” item opens a sheet with the program’s class types (add/edit/deactivate) — present only on the Schedule screen, absent on the program detail page.
Coaching
-
/dashboard/coachingshows the shared section greeting (eyebrow “Coaching”) with “New coaching plan” as the header’s action button. - Below the greeting, a stats strip: Plans, Enrolled, Workouts this
week, Completion (— when null) — sourced from
GET .../programs/coaching-summary?weekStart=, for the current week. - The plan list always shows the org’s active coaching plans — name,
active state, and a muted line “{enrolled} · {workouts this week} ·
{completion}%” sourced from the same summary payload (no per-row
/enrollmentsfetch). - “New coaching plan” creates a coaching-mode program from a name only (no kind picker — a 1:1 and a group plan are the same thing here).
- Opening a plan navigates to
/dashboard/programs/:id, which shows every tab (Plan, Templates, Compliance, Enrolled, Comments) exactly as it does on main. - No coaching program: redirects to Workouts.
Ways to train
- Settings > General shows exactly two switches — Schedule, Cohorts — each with a one-line description, nothing else.
- Schedule switch reflects whether an active schedule program exists; turning it on with none creates one named “Classes”; turning it on with an existing inactive one reactivates that instead of creating a new one.
- Turning Schedule off with no future published sessions asks for confirmation, then deactivates the program (sessions are kept, and the Schedule sidebar item disappears).
- Turning Schedule off with at least one future published session opens the blocking “Still in use” dialog instead — states the upcoming-session count, says to cancel or unpublish them first, offers a button to Schedule and a Close — and never deactivates the program.
- Cohorts switch reflects whether at least one active coaching program exists; turning it on with none creates the first plan named “Coaching” and sends the user to Coaching to rename it.
- Turning Cohorts off with no active enrollments on any active coaching plan asks for confirmation naming the plan count, then deactivates every active coaching program.
- Turning Cohorts off with at least one active enrollment (summed across every active coaching plan) opens the blocking “Still in use” dialog instead — states the enrolled-member count, says to remove them first, offers a button to Coaching and a Close — and never deactivates any plan.
- Both switches update Home’s Train card without a reload once deactivation actually happens.
-
GET /organizations/:orgId/programs/:id/deactivation-blockersrequires owner/admin, same as the other program routes. - Deactivating a program that’s still in use via the API directly
(
DELETEorPATCH { isActive: false }) returns409with{ code: 'program_in_use', futurePublishedSessions, activeEnrollments }.
Dashboard chrome and Home
- The flat shell exposes the existing org switcher in the sidebar, and Ask Spotter plus the profile control in the dashboard header.
-
/dashboard/audit-logrenders the same content as Settings > Admin. -
/dashboard/homeis only reachable directly; no first visit, remembered choice, or/dashboard/overviewnavigation redirects there. - Home still renders the setup guide for owners/admins, not coaches, and its cards remain role-aware.
RTL
- Hebrew: the flat sidebar mirrors to the right (
data-side="right"). Home’s optional work-area cards and the Ways to train switches render correctly right-to-left. - Russian: optional Home work-area cards render correctly.
- Hebrew and Russian: Schedule’s and Coaching’s stats strips (including “WODs posted” / “אימונים שפורסמו” / “Опубликованные тренировки” and “Plans” / “תוכניות” / “Программы”) and each plan row’s stats line render correctly right-to-left / with correct plural forms.
Regression
-
pnpm exec nx typecheck web,pnpm exec nx lint web,make test-unit-web,make test-integration-weball green (the weekly-calendar “hydrates the linked week” test is a known date-bound failure, unrelated to this feature). - Existing
sidebar-nav.int.spec.tsx(flat item set) andsettings-preferences-page.int.spec.tsx(no API writes) pass unmodified.