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> <span class="event-number">GW #{eventScore.gwEvent.eventNumber}</span>
<ElementBadge element={eventScore.gwEvent.element} /> <ElementBadge element={eventScore.gwEvent.element} />
</div> </div>
<span class="event-score">{formatScore(eventScore.totalScore)}</span> <span class="event-score">{formatScore(eventScore.totalScore ?? 0)}</span>
</button> </button>
</li> </li>

View file

@ -160,13 +160,22 @@ export interface GwEventMinimal {
export interface EventScoreSummary { export interface EventScoreSummary {
gwEvent: GwEventMinimal 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 { export interface MemberGwScores {
member: CrewMembership member: CrewMembership
eventScores: EventScoreSummary[] eventScores: EventScoreSummary[]
grandTotal: number grandTotal: number
membershipPeriods: MembershipPeriod[] // All membership periods for boomerang players
} }
export interface PhantomGwScores { export interface PhantomGwScores {

View file

@ -32,8 +32,9 @@ export interface PlayerRoundScore {
export interface HistoryDataPoint { export interface HistoryDataPoint {
eventNumber: number eventNumber: number
eventLabel: string // "GW #72" eventLabel: string // "GW #72"
totalScore: number totalScore: number | null // null = gap (player wasn't in crew)
date: string // For tooltip 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, eventNumber: e.eventNumber,
eventLabel: `GW #${e.eventNumber}`, eventLabel: `GW #${e.eventNumber}`,
totalScore: e.crewTotalScore ?? 0, totalScore: e.crewTotalScore ?? 0,
date: formatDate(e.startDate) date: formatDate(e.startDate),
isGap: false
})) }))
} }
/** /**
* Transform player event scores into history chart data * Transform player event scores into history chart data
* Includes gap events (when player wasn't in crew) with null scores
*/ */
export function toPlayerHistoryChartData( export function toPlayerHistoryChartData(
eventScores: EventScoreSummary[], eventScores: EventScoreSummary[],
formatDate: (date: string) => string formatDate: (date: string) => string
): HistoryDataPoint[] { ): HistoryDataPoint[] {
return eventScores return eventScores
.filter((e) => e.totalScore > 0)
.sort((a, b) => a.gwEvent.eventNumber - b.gwEvent.eventNumber) .sort((a, b) => a.gwEvent.eventNumber - b.gwEvent.eventNumber)
.map((e) => ({ .map((e) => ({
eventNumber: e.gwEvent.eventNumber, eventNumber: e.gwEvent.eventNumber,
eventLabel: `GW #${e.gwEvent.eventNumber}`, eventLabel: `GW #${e.gwEvent.eventNumber}`,
totalScore: e.totalScore, totalScore: e.inCrew ? e.totalScore : null,
date: formatDate(e.gwEvent.startDate) date: formatDate(e.gwEvent.startDate),
isGap: !e.inCrew
})) }))
} }