2 Commits

Author SHA1 Message Date
Scott Idem
4292aebc56 Fine tuning the layout of things. 2026-06-02 17:47:27 -04:00
Scott Idem
3466d6552c 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>
2026-06-02 17:27:40 -04:00

View File

@@ -36,6 +36,7 @@ import {
Printer,
Tags,
User,
UserCheck,
UserSearch
} from '@lucide/svelte';
// Track per-badge copy state for the "Review Link" clipboard button
@@ -191,13 +192,17 @@ let visible_badge_obj_li = $derived(
{#if row_clickable}
<a
href={row_href}
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-3 justify-start px-3 py-2 text-left text-lg font-bold flex-1 transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg"
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-3 justify-start px-3 py-2 text-left text-lg font-bold flex-1 transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg
max-w-4xl
"
title={is_trusted
? `Print badge for ${display_name} · ${event_badge_obj?.affiliations_override ?? event_badge_obj?.affiliations ?? ''} · ${event_badge_obj?.badge_type ?? ''} · id: ${event_badge_obj.event_badge_id}`
: `Review your badge info`}
>
{#if event_badge_obj?.hide}
<EyeOff size="1.1em" class="text-gray-400" />
{:else if is_printed}
<UserCheck size="1.1em" class="text-success-600 dark:text-success-400" />
{:else}
<User size="1.1em" class="text-primary-500" />
{/if}
@@ -228,23 +233,31 @@ 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>
</div>
{:else}
<div
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-3 justify-start px-3 py-2 text-left text-lg font-bold flex-1 transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg cursor-not-allowed"
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-3 justify-start px-3 py-2 text-left text-lg font-bold flex-1 transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg cursor-not-allowed
max-w-4xl
"
title="Printing not permitted">
{#if event_badge_obj?.hide}
<EyeOff size="1.1em" class="text-gray-400" />
{:else if is_printed}
<UserCheck size="1.1em" class="text-success-600 dark:text-success-400" />
{:else}
<User size="1.1em" class="text-surface-400" />
{/if}
@@ -359,6 +372,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-base 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>{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 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')}</span>
{/if}
</div>
{/if}
<!-- Debug/metadata row — Edit Mode staff only -->
{#if is_edit_mode && is_trusted}
<div