feat(badges): allow public_access to print first-print badges
Badge print kiosks authenticate at the public_access level (site-wide passcode). Previously the print gate was trusted_access, meaning kiosk operators had to sign in at the trusted level just to print. Changed in both the list view and the badge detail controls panel: - First print: public_access and above (kiosk use case) - Reprint: still requires trusted_access + edit_mode ae_comp__badge_obj_li.svelte: added is_public derived; updated can_print and the print button #if condition. ae_comp__badge_print_controls.svelte: added is_public derived; updated can_print comment and logic. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,9 @@ let {
|
|||||||
// trusted_access is true for Trusted and every level above it (Administrator,
|
// trusted_access is true for Trusted and every level above it (Administrator,
|
||||||
// Manager, Super). No need to OR in administrator_access — it's already covered.
|
// Manager, Super). No need to OR in administrator_access — it's already covered.
|
||||||
let is_trusted = $derived($ae_loc.trusted_access === true);
|
let is_trusted = $derived($ae_loc.trusted_access === true);
|
||||||
|
// public_access — site-wide passcode or higher. Badge print kiosks run at this level.
|
||||||
|
// Sufficient for first-print only; reprints require trusted + edit_mode.
|
||||||
|
let is_public = $derived($ae_loc.public_access === true);
|
||||||
// Minimum bar to edit any field. Anonymous/public users see values but cannot edit.
|
// Minimum bar to edit any field. Anonymous/public users see values but cannot edit.
|
||||||
let is_auth = $derived($ae_loc.authenticated_access === true);
|
let is_auth = $derived($ae_loc.authenticated_access === true);
|
||||||
|
|
||||||
@@ -200,8 +203,9 @@ function toggle_section(which: 'attendee' | 'staff') {
|
|||||||
let print_count = $derived($lq__event_badge_obj?.print_count ?? 0);
|
let print_count = $derived($lq__event_badge_obj?.print_count ?? 0);
|
||||||
let is_printed = $derived(print_count >= 1);
|
let is_printed = $derived(print_count >= 1);
|
||||||
|
|
||||||
// Print is available to Trusted+ when: not yet printed, OR global edit mode is on (reprint).
|
// Print is available to Public+ for first prints (kiosk use case).
|
||||||
let can_print = $derived(is_trusted && (!is_printed || is_global_edit_mode));
|
// Reprints require Trusted + global edit mode.
|
||||||
|
let can_print = $derived((is_public && !is_printed) || (is_trusted && is_global_edit_mode));
|
||||||
|
|
||||||
type PrintStatus = 'idle' | 'loading' | 'done' | 'error';
|
type PrintStatus = 'idle' | 'loading' | 'done' | 'error';
|
||||||
let print_status: PrintStatus = $state('idle');
|
let print_status: PrintStatus = $state('idle');
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ let copy_status: Record<string, 'idle' | 'copied'> = $state({});
|
|||||||
|
|
||||||
// Access level shortcuts
|
// Access level shortcuts
|
||||||
let is_trusted = $derived($ae_loc.trusted_access === true);
|
let is_trusted = $derived($ae_loc.trusted_access === true);
|
||||||
|
let is_public = $derived($ae_loc.public_access === true); // public passcode or higher — may print first prints
|
||||||
let is_edit_mode = $derived($ae_loc.edit_mode === true);
|
let is_edit_mode = $derived($ae_loc.edit_mode === true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -140,7 +141,7 @@ let visible_badge_obj_li = $derived(
|
|||||||
event_badge_obj?.full_name_override ??
|
event_badge_obj?.full_name_override ??
|
||||||
event_badge_obj?.full_name ??
|
event_badge_obj?.full_name ??
|
||||||
`${event_badge_obj?.given_name ?? ''} ${event_badge_obj?.family_name ?? ''}`.trim()}
|
`${event_badge_obj?.given_name ?? ''} ${event_badge_obj?.family_name ?? ''}`.trim()}
|
||||||
{@const can_print = is_trusted && (!is_printed || is_edit_mode)}
|
{@const can_print = (is_public && !is_printed) || (is_trusted && is_edit_mode)}
|
||||||
{@const print_href = `/events/${event_badge_obj?.event_id}/badges/${event_badge_obj?.event_badge_id}/print`}
|
{@const print_href = `/events/${event_badge_obj?.event_id}/badges/${event_badge_obj?.event_badge_id}/print`}
|
||||||
{@const review_href = build_review_url(event_badge_obj)}
|
{@const review_href = build_review_url(event_badge_obj)}
|
||||||
|
|
||||||
@@ -242,8 +243,8 @@ let visible_badge_obj_li = $derived(
|
|||||||
|
|
||||||
<!-- Right: up to 4 action buttons -->
|
<!-- Right: up to 4 action buttons -->
|
||||||
<div class="flex shrink-0 flex-row items-center gap-1">
|
<div class="flex shrink-0 flex-row items-center gap-1">
|
||||||
<!-- 1. Print Badge: Trusted+, not yet printed OR in Edit Mode (reprint) -->
|
<!-- 1. Print Badge: Public+ first print; Trusted + Edit Mode for reprint -->
|
||||||
{#if is_trusted && (!is_printed || is_edit_mode)}
|
{#if (is_public && !is_printed) || (is_trusted && is_edit_mode)}
|
||||||
<a
|
<a
|
||||||
href={`/events/${event_badge_obj?.event_id}/badges/${event_badge_obj?.event_badge_id}/print`}
|
href={`/events/${event_badge_obj?.event_id}/badges/${event_badge_obj?.event_badge_id}/print`}
|
||||||
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-1 px-3 py-2 text-base font-bold transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg border border-primary-200-800
|
class="hover:text-primary-800-200 hover:bg-primary-200-800 active:bg-surface-200-700 flex items-center gap-1 px-3 py-2 text-base font-bold transition-colors duration-1000 hover:duration-300 min-w-0 preset-tonal-primary rounded-lg border border-primary-200-800
|
||||||
|
|||||||
Reference in New Issue
Block a user