diff --git a/src/routes/events/[event_id]/(badges)/badges/reports/reports_badge_print_throughput.svelte b/src/routes/events/[event_id]/(badges)/badges/reports/reports_badge_print_throughput.svelte index 51996e77..ebd013a7 100644 --- a/src/routes/events/[event_id]/(badges)/badges/reports/reports_badge_print_throughput.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/reports/reports_badge_print_throughput.svelte @@ -33,6 +33,21 @@ function fmt_date(ms: number): string { return new Date(ms).toLocaleDateString([], { month: 'short', day: 'numeric' }); } +// Resolved once per page load — timezone abbreviation (e.g. "EDT", "PDT") for the separator label. +const tz_abbr: string = + Intl.DateTimeFormat('en-US', { timeZoneName: 'short' }) + .formatToParts(new Date()) + .find((p) => p.type === 'timeZoneName')?.value ?? ''; + +function fmt_date_header(ms: number): string { + const date_part = new Intl.DateTimeFormat('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric' + }).format(ms); + return tz_abbr ? `${date_part} — ${tz_abbr}` : date_part; +} + // Naive UTC strings from the backend have no timezone indicator — append Z so // the browser parses them as UTC and converts to local time, matching the badge list display. function parse_utc_ms(dt: string | null | undefined): number { @@ -82,7 +97,7 @@ let stats: PrintStats = $derived.by(() => { let prev_day = ''; const buckets: Bucket[] = raw_buckets.map((b) => { const day = fmt_date(b.start_ms); - const date_label = day !== prev_day ? day : null; + const date_label = day !== prev_day ? fmt_date_header(b.start_ms) : null; prev_day = day; return { ...b, date_label }; }); @@ -142,7 +157,7 @@ function get_effective_name(badge: any): string { {#each stats.buckets as bucket (bucket.start_ms)} {#if bucket.date_label} -