feat(badges): show print status strip for trusted staff on printed badges

Adds a compact print info row below each printed badge for trusted users
(not in edit mode — debug row already covers that):
  Printed 2×  ·  First: June 9 9:14 AM  ·  Last: June 9 11:32 AM

Gives staff quick at-a-glance confirmation that a badge was printed and when,
without needing to enter edit mode.

Also fixes a logic bug in the attendee "Checked in" card: the "last print"
line was comparing == (same datetime) instead of !== (different datetime),
so it only appeared when first = last (single print) — backwards. Fixed to
show only when multiple prints have occurred.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-06-02 17:27:40 -04:00
parent b7969bc46e
commit 3466d6552c

View File

@@ -228,13 +228,17 @@ let visible_badge_obj_li = $derived(
<Check size="1.1em" class="text-success-600 dark:text-success-400 shrink-0" />
<div class="flex flex-col min-w-0">
<span class="truncate font-semibold">{display_name}</span>
<span class="text-xs text-success-700 dark:text-success-300 opacity-80">
<span class="text-sm text-success-700 dark:text-success-300 opacity-80">
Checked in &middot; {print_count}&times;
{#if event_badge_obj.print_first_datetime}
&middot; First: {ae_util.iso_datetime_formatter(event_badge_obj.print_first_datetime, 'datetime_iso_12_no_seconds')}
&middot;
{ae_util.iso_datetime_formatter(event_badge_obj.print_first_datetime, 'date_full_no_year')}
{ae_util.iso_datetime_formatter(event_badge_obj.print_first_datetime, 'time_12_long')}
{/if}
{#if event_badge_obj.print_last_datetime}
&middot; Last: {ae_util.iso_datetime_formatter(event_badge_obj.print_last_datetime, 'datetime_iso_12_no_seconds')}
{#if event_badge_obj.print_last_datetime && event_badge_obj.print_last_datetime !== event_badge_obj.print_first_datetime}
&middot; last print:
{ae_util.iso_datetime_formatter(event_badge_obj.print_last_datetime, 'date_full_no_year')}
{ae_util.iso_datetime_formatter(event_badge_obj.print_last_datetime, 'time_12_long')}
{/if}
</span>
</div>
@@ -359,6 +363,22 @@ let visible_badge_obj_li = $derived(
</div>
</div>
<!-- Print status strip — Trusted staff, not in Edit Mode (debug row covers it there) -->
{#if is_trusted && is_printed && !is_edit_mode}
<div class="flex flex-row flex-wrap items-center gap-x-1.5 gap-y-0.5 px-2 text-xs text-success-700 dark:text-success-300 opacity-70">
<Check size="0.85em" class="shrink-0" />
<span>Printed {print_count}&times;</span>
{#if event_badge_obj.print_first_datetime}
<span class="opacity-50">&middot;</span>
<span>First: {ae_util.iso_datetime_formatter(event_badge_obj.print_first_datetime, 'date_full_no_year')} {ae_util.iso_datetime_formatter(event_badge_obj.print_first_datetime, 'time_12_long')}</span>
{/if}
{#if event_badge_obj.print_last_datetime && event_badge_obj.print_last_datetime !== event_badge_obj.print_first_datetime}
<span class="opacity-50">&middot;</span>
<span>Last: {ae_util.iso_datetime_formatter(event_badge_obj.print_last_datetime, 'date_full_no_year')} {ae_util.iso_datetime_formatter(event_badge_obj.print_last_datetime, 'time_12_long')}</span>
{/if}
</div>
{/if}
<!-- Debug/metadata row — Edit Mode staff only -->
{#if is_edit_mode && is_trusted}
<div