Identify and resolve redundant pages one-by-one
Two separate pages both showing a coach's upcoming schedule blocks/lessons. One uses the legacy Lesson entity; the other uses the newer ScheduleBlock (SSOT) entity.
Lesson
Legacy schedule view — reads from the Lesson entity. Uses list + calendar toggle. Has Stripe onboarding banner. Older architecture.
Referenced By
Recommendation: Keep CoachScheduleView (SSOT). Reassign all nav links pointing to CoachSchedule → CoachScheduleView, then delete CoachSchedule.
Two pages let parents browse and search for coaches. They have near-identical UI but different data-loading strategies and trust signal support.
Coach + User (direct)
Older version — fetches coaches directly via Coach + User entities. No trust badges. Fewer filters. Uses lime-green 'View Profile' buttons.
Referenced By
Recommendation: Keep FindCoaches (more features + trust signals). Update any links pointing to PublicCoachSearch → FindCoaches, then delete PublicCoachSearch.
Two pages display a coach's full profile. One is accessed by ID (internal), the other by slug (public URL sharing). Both use getPublicCoachData.
getPublicCoachData fn
Internal profile view — loaded by ?id=. Has tab layout (About, Skills, Reviews, Packages). Full booking/message sidebar. Used throughout the platform internally.
Referenced By
Recommendation: These serve different entry points (ID vs slug). Consider merging slug resolution into CoachProfile. If slug-based public pages are needed, keep CoachPublicProfile for that purpose only and delete otherwise.
Two gym owner dashboards. One is a financial/location overview; the other is a live daily operations grid. They link to each other but overlap in purpose.
Gym, GymLocation, Lesson, CoachGymAssignment
Main gym owner hub — shows revenue stats, locations table, coach list, AI enrichment, fee structure. Heavy data focus. Links to GymOperationsDashboard.
Referenced By
Recommendation: These serve genuinely different purposes (financials vs live ops). Recommend keeping both but clarifying navigation. Evaluate whether GymOperationsDashboard overlaps with GymLessons.
Two pages manage private lessons for gym owners — both read from ScheduleBlock as SSOT but differ in focus (tracker vs full calendar).
ScheduleBlock (SSOT)
Full-featured lesson manager — has master calendar view, list view, add/edit/soft-delete blocks, search, location/coach filters. Rich UI with BlockEditDialog.
Referenced By
Recommendation: These are complementary, not duplicates — GymLessons is day-to-day scheduling; PrivateLessonTracker is payroll processing. Keep both. Consider merging into tabs if the sidebar is too crowded.
Two admin reporting pages — one is a full analytics dashboard with charts; the other is a minimal CSV export utility.
User, Coach, Lesson, Review
Full analytics dashboard — metrics cards, daily activity line chart, monthly revenue bar chart, user growth, lesson type pie chart, top coaches table. Has inline CSV export.
Referenced By
Recommendation: Keep AdminReports (more complete). The export functionality already exists inside AdminReports. Delete AdminReportsExport — or absorb its date-range export UI into AdminReports as an enhancement.