* Redesign standings page with sortable table, 7-day change, and chart repositioned - Move point progression chart below the standings table - Replace separate Points/Projected/Placement columns with: - Single stacked "actual / projected" Points column (shared PointsDisplay component) - "7-Day Change" column showing points gained + rank change over past 7 days - Remove Placement breakdown column - Sort ties alphabetically by team name (rank sort only) - All columns are sortable via new reusable useSortableData hook - Add sevenDayPointChange to TeamStandingWithChange type and model https://claude.ai/code/session_01CuCKFVYbpsKSQoFDcTYfY7 * Code review fixes: module-level comparators, correct type on SortableHead, handle negative point change, remove redundant spread - Move comparators object to module level (closes over nothing, no useMemo needed) - Use SortConfig<StandingRow> on SortableHead instead of inline duplicate type - SevenDayChange: handle negative pointChange with correct sign and color - Remove redundant sevenDayPointChange explicit assignment (already in ...standing spread) https://claude.ai/code/session_01CuCKFVYbpsKSQoFDcTYfY7 * Update StandingsTable tests to match redesigned component - Remove showPlacementBreakdown prop (no longer exists on component) - Replace Placement Breakdown test suite with 7-Day Change column tests - Update header assertion: "Placements" → "7-Day Change" - Add tests for positive/negative point change display and rank change indicators - Remove accessibility test for placement title attributes https://claude.ai/code/session_01CuCKFVYbpsKSQoFDcTYfY7 * Fix movement indicator arrow count assertion to exclude sort header arrows queryAllByText(/↑|↓/) was matching the active sort column's ↑ indicator. Narrow to /[↑↓]\d/ so only movement indicators (↑1, ↓1) are counted. https://claude.ai/code/session_01CuCKFVYbpsKSQoFDcTYfY7 --------- Co-authored-by: Claude <noreply@anthropic.com>
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
/**
|
|
* Shared types for standings that can be used in both server and client code
|
|
*/
|
|
|
|
export interface TeamStanding {
|
|
teamId: string;
|
|
teamName: string;
|
|
ownerName?: string | null;
|
|
totalPoints: number;
|
|
currentRank: number;
|
|
previousRank: number | null;
|
|
rankChange: number; // Positive = moved up, negative = moved down
|
|
placementCounts: {
|
|
first: number;
|
|
second: number;
|
|
third: number;
|
|
fourth: number;
|
|
fifth: number;
|
|
sixth: number;
|
|
seventh: number;
|
|
eighth: number;
|
|
};
|
|
participantsRemaining: number;
|
|
calculatedAt: Date;
|
|
// Phase 5.4: Expected value projections
|
|
actualPoints?: number | null;
|
|
projectedPoints?: number | null;
|
|
participantsFinished?: number | null;
|
|
// 7-day point change (optional, present when loaded with change data)
|
|
sevenDayPointChange?: number;
|
|
}
|
|
|
|
export interface TeamStandingSnapshot {
|
|
date: Date;
|
|
rank: number;
|
|
totalPoints: number;
|
|
}
|
|
|
|
export interface TeamStandingWithChange extends TeamStanding {
|
|
sevenDayRankChange: number;
|
|
sevenDayOldRank: number | null;
|
|
sevenDayPointChange: number;
|
|
}
|