Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesDashboard ShellQA plan — dashboard shell

QA plan — dashboard shell

Flat dashboard navigation

  • /dashboard/* always renders DashboardSidebar and the original header — Spotter, one UserButton in 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/programs forwards 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/:id that still has upcoming published sessions or active enrollments shows the “still in use” toast (programs.deleteBlocked) rather than the generic failure toast, on a 409 program_in_use response. A successful delete lands on Coaching.

Schedule

  • /dashboard/schedule renders 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 query WeeklyCalendar already 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/programming does 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; a programId on 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/coaching shows 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 /enrollments fetch).
  • “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-blockers requires owner/admin, same as the other program routes.
  • Deactivating a program that’s still in use via the API directly (DELETE or PATCH { isActive: false }) returns 409 with { 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-log renders the same content as Settings > Admin.
  • /dashboard/home is only reachable directly; no first visit, remembered choice, or /dashboard/overview navigation 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-web all 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) and settings-preferences-page.int.spec.tsx (no API writes) pass unmodified.