add types and utils for membership gaps

This commit is contained in:
Justin Edmund 2025-12-18 19:36:36 -08:00
parent 3ec31434aa
commit c100d6c311
3 changed files with 19 additions and 7 deletions

View file

@ -22,7 +22,7 @@
<span class="event-number">GW #{eventScore.gwEvent.eventNumber}</span>
<ElementBadge element={eventScore.gwEvent.element} />
</div>
<span class="event-score">{formatScore(eventScore.totalScore)}</span>
<span class="event-score">{formatScore(eventScore.totalScore ?? 0)}</span>
</button>
</li>

View file

@ -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 {

View file

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