diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
index a9d22d9..3fb9ae2 100644
--- a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
+++ b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
@@ -364,34 +364,35 @@ export default function EventResults({
)}
- {/* Current Results */}
-
-
-
-
- Results
-
- {results.length} of {participants.length} participants have
- results
-
+ {/* Current Results - Hide for playoff events since they use the bracket */}
+ {event.eventType !== "playoff_game" && (
+
+
+
+
+ Results
+
+ {results.length} of {participants.length} participants have
+ results
+
+
diff --git a/app/routes/leagues/$leagueId.standings.$seasonId.teams.$teamId.tsx b/app/routes/leagues/$leagueId.standings.$seasonId.teams.$teamId.tsx
new file mode 100644
index 0000000..a2ec337
--- /dev/null
+++ b/app/routes/leagues/$leagueId.standings.$seasonId.teams.$teamId.tsx
@@ -0,0 +1,49 @@
+import { useLoaderData } from "react-router";
+import type { Route } from "./+types/$leagueId.standings.$seasonId.teams.$teamId";
+import { TeamScoreBreakdown } from "~/components/standings/TeamScoreBreakdown";
+import { getTeamScoreBreakdown, getTeamStanding } from "~/models/standings";
+
+/**
+ * Team score breakdown page
+ * Shows all drafted participants with their placements and points
+ * Phase 4.3: Team breakdown pages
+ */
+export async function loader({ params }: Route.LoaderArgs) {
+ const { leagueId, seasonId, teamId } = params;
+
+ // Get team breakdown with all picks
+ const breakdown = await getTeamScoreBreakdown(teamId, seasonId);
+
+ if (!breakdown) {
+ throw new Response("Team not found", { status: 404 });
+ }
+
+ // Get team standing for additional context
+ const standing = await getTeamStanding(teamId, seasonId);
+
+ return {
+ leagueId,
+ seasonId,
+ teamId,
+ breakdown: {
+ ...breakdown,
+ team: breakdown.team || null,
+ },
+ standing,
+ };
+}
+
+export default function TeamBreakdownPage() {
+ const { leagueId, seasonId, breakdown, standing } = useLoaderData();
+
+ return (
+
+
+
+ );
+}
diff --git a/app/routes/leagues/$leagueId.standings.$seasonId.tsx b/app/routes/leagues/$leagueId.standings.$seasonId.tsx
index dd10679..568e718 100644
--- a/app/routes/leagues/$leagueId.standings.$seasonId.tsx
+++ b/app/routes/leagues/$leagueId.standings.$seasonId.tsx
@@ -125,7 +125,12 @@ export default function LeagueStandings() {
) : (
-
+
)}
diff --git a/plans/scoring-system.md b/plans/scoring-system.md
index 2f0c7ae..e66de49 100644
--- a/plans/scoring-system.md
+++ b/plans/scoring-system.md
@@ -1321,12 +1321,33 @@ scoring_events {
- Comprehensive test suite with 15 unit tests in `app/models/__tests__/standings-snapshots.test.ts`
- All 386 tests passing β
-- [ ] **4.3** Team breakdown pages
- - [ ] `TeamScoreBreakdown` component
- - [ ] List all drafted participants
- - [ ] Show placement and points per participant
- - [ ] Group by sport season
- - [ ] Link to sport season pages
+- [x] **4.3** Team breakdown pages β *Completed*
+ - [x] `TeamScoreBreakdown` component
+ - [x] List all drafted participants
+ - [x] Show placement and points per participant
+ - [x] Group by sport season
+ - [x] Link to sport season pages
+
+ **Implementation Notes**:
+ - Created `TeamScoreBreakdown` component (app/components/standings/TeamScoreBreakdown.tsx)
+ - Created team breakdown route at `/leagues/:leagueId/standings/:seasonId/teams/:teamId`
+ - Updated `getTeamScoreBreakdown` model to include sportsSeasonId in grouping
+ - Added clickable team name links in `StandingsTable` component
+ - Each sport section includes "View Details β" link to sport season page
+ - Displays summary stats: total points, rank badge, participant completion
+ - Shows placement breakdown with top finishes highlighted
+ - Groups participants by sport with per-sport totals
+ - All participants show pick number, round, name, placement badge, and points
+ - "Back to Standings" navigation link
+ - Comprehensive test suite with 18 tests (all passing)
+ - Files created/updated:
+ - app/components/standings/TeamScoreBreakdown.tsx (new component)
+ - app/routes/leagues/$leagueId.standings.$seasonId.teams.$teamId.tsx (new route)
+ - app/components/standings/StandingsTable.tsx (added links)
+ - app/models/standings.ts (enhanced bySport grouping)
+ - app/routes.ts (added team breakdown route)
+ - app/components/standings/__tests__/TeamScoreBreakdown.test.tsx (new tests)
+ - app/components/standings/__tests__/StandingsTable.test.tsx (updated for router context)
- [x] **4.4** Sport season pages with ownership β *Completed in Phase 3.4*
- [x] Create sport season detail route (`/leagues/:leagueId/sports-seasons/:sportsSeasonId`)
@@ -1451,6 +1472,6 @@ scoring_events {
- β³ **Phase 5**: Expected Value - TODO
- β³ **Phase 6**: Polish & Optimization - TODO
-**Current Focus**: Phase 4 - Standings & Display (4.1 and 4.2 complete, 4.5 partially complete)
+**Current Focus**: Phase 4 - Standings & Display (4.1, 4.2, and 4.3 complete, 4.5 partially complete)
-**Total Test Count**: 386 tests passing β
+**Total Test Count**: 404 tests passing β