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
}))
}