diff --git a/src/lib/components/crew/GwEventScoreRow.svelte b/src/lib/components/crew/GwEventScoreRow.svelte index 46a608b9..3d9eb92e 100644 --- a/src/lib/components/crew/GwEventScoreRow.svelte +++ b/src/lib/components/crew/GwEventScoreRow.svelte @@ -22,7 +22,7 @@ GW #{eventScore.gwEvent.eventNumber} - {formatScore(eventScore.totalScore)} + {formatScore(eventScore.totalScore ?? 0)} diff --git a/src/lib/types/api/gw.ts b/src/lib/types/api/gw.ts index 68d3db26..00257e33 100644 --- a/src/lib/types/api/gw.ts +++ b/src/lib/types/api/gw.ts @@ -160,13 +160,22 @@ export interface GwEventMinimal { export interface EventScoreSummary { gwEvent: GwEventMinimal - totalScore: number + totalScore: number | null // null = gap (player wasn't in crew during this event) + inCrew: boolean // false = gap event, true = player was in crew +} + +export interface MembershipPeriod { + id: string + joinedAt: string | null + retiredAt: string | null + retired: boolean } export interface MemberGwScores { member: CrewMembership eventScores: EventScoreSummary[] grandTotal: number + membershipPeriods: MembershipPeriod[] // All membership periods for boomerang players } export interface PhantomGwScores { diff --git a/src/lib/utils/gw.ts b/src/lib/utils/gw.ts index af4e1df2..b46981b6 100644 --- a/src/lib/utils/gw.ts +++ b/src/lib/utils/gw.ts @@ -32,8 +32,9 @@ export interface PlayerRoundScore { export interface HistoryDataPoint { eventNumber: number eventLabel: string // "GW #72" - totalScore: number + totalScore: number | null // null = gap (player wasn't in crew) date: string // For tooltip + isGap: boolean // true if player wasn't in crew during this event } // ============================================================================ @@ -216,24 +217,26 @@ export function toCrewHistoryChartData( eventNumber: e.eventNumber, eventLabel: `GW #${e.eventNumber}`, totalScore: e.crewTotalScore ?? 0, - date: formatDate(e.startDate) + date: formatDate(e.startDate), + isGap: false })) } /** * Transform player event scores into history chart data + * Includes gap events (when player wasn't in crew) with null scores */ export function toPlayerHistoryChartData( eventScores: EventScoreSummary[], formatDate: (date: string) => string ): HistoryDataPoint[] { return eventScores - .filter((e) => e.totalScore > 0) .sort((a, b) => a.gwEvent.eventNumber - b.gwEvent.eventNumber) .map((e) => ({ eventNumber: e.gwEvent.eventNumber, eventLabel: `GW #${e.gwEvent.eventNumber}`, - totalScore: e.totalScore, - date: formatDate(e.gwEvent.startDate) + totalScore: e.inCrew ? e.totalScore : null, + date: formatDate(e.gwEvent.startDate), + isGap: !e.inCrew })) }