diff --git a/src/lib/ae_events/ae_events__event_badge.ts b/src/lib/ae_events/ae_events__event_badge.ts index db19d7e0..777bfb3e 100644 --- a/src/lib/ae_events/ae_events__event_badge.ts +++ b/src/lib/ae_events/ae_events__event_badge.ts @@ -510,6 +510,7 @@ export const properties_to_save = [ 'event_id', 'event_badge_template_id', 'pronouns', + 'pronouns_override', 'informal_name', 'title_names', 'given_name', @@ -524,6 +525,8 @@ export const properties_to_save = [ 'affiliations_override', 'email', 'email_override', + 'phone', + 'phone_override', 'address_line_1', 'address_line_2', 'address_line_3', @@ -542,6 +545,10 @@ export const properties_to_save = [ 'badge_type_code', 'badge_type_override', 'badge_type_code_override', + 'registration_type', + 'registration_type_code', + 'registration_type_override', + 'registration_type_code_override', 'external_event_id', 'external_id', 'external_person_id', @@ -558,6 +565,24 @@ export const properties_to_save = [ 'print_count', 'print_first_datetime', 'print_last_datetime', + 'allow_tracking', + 'agree_to_tc', + 'other_1_code', + 'other_2_code', + 'other_3_code', + 'other_4_code', + 'other_5_code', + 'other_6_code', + 'other_7_code', + 'other_8_code', + 'ticket_1_code', + 'ticket_2_code', + 'ticket_3_code', + 'ticket_4_code', + 'ticket_5_code', + 'ticket_6_code', + 'ticket_7_code', + 'ticket_8_code', 'tmp_sort_1', 'tmp_sort_2', 'person_external_id', diff --git a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_review_form.svelte b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_review_form.svelte index 7d1b154c..579f8272 100644 --- a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_review_form.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_review_form.svelte @@ -2,24 +2,23 @@ /** * Badge Review Form * - * A form-based view of badge fields for attendees and staff to review/edit. + * Mobile-first form view for attendees and staff to review/edit badge details. * Does NOT render the badge layout — that is handled by ae_comp__badge_obj_view.svelte. * * Access: * - Attendees (passcode-validated): can edit fields listed in can_edit_fields * - Trusted staff: can_edit_fields + additional staff-only fields - * - Administrators: all override fields + * - Administrators: all fields * - * Field display is driven by the `can_edit_fields` prop, which comes from - * event.mod_badges_json.edit_permissions (see ae_comp__event_settings_badges_form.svelte). + * Field display is driven by the `can_edit_fields` prop. */ interface Props { event_id: string; event_badge_id: string; lq__event_badge_obj?: any; - can_edit_fields?: string[]; // Whitelist of field names attendee/staff may edit - is_staff?: boolean; // True = staff view (shows read-only source fields too) + can_edit_fields?: string[]; // Whitelist of field names user may edit + is_staff?: boolean; // True = staff view (shows additional fields) log_lvl?: number; } @@ -27,40 +26,137 @@ event_id, event_badge_id, lq__event_badge_obj, - can_edit_fields = ['full_name_override', 'professional_title_override', 'affiliations_override', 'location_override'], + can_edit_fields = [], is_staff = false, log_lvl = 0 }: Props = $props(); + import { browser } from '$app/environment'; import type { key_val } from '$lib/stores/ae_stores'; - import { ae_api } from '$lib/stores/ae_stores'; + import { ae_api, ae_loc } from '$lib/stores/ae_stores'; import { events_func } from '$lib/ae_events_functions'; + import { core_func } from '$lib/ae_core/ae_core_functions'; + import { ae_util } from '$lib/ae_utils/ae_utils'; + import { Modal } from 'flowbite-svelte'; + import { + Check, RotateCcw, LoaderCircle, Save, X, Pencil, ZoomIn, + User, Mail, Phone, Building, MapPin, Briefcase, + Tag, Ticket, Flag, FileText, EyeOff, Radio, FileCheck, BadgeQuestionMark + } from 'lucide-svelte'; - // *** Editable field state (only fields in can_edit_fields are active) - let editable_full_name_override: string = $state(''); - let editable_professional_title_override: string = $state(''); - let editable_affiliations_override: string = $state(''); - let editable_location_override: string = $state(''); - let editable_email: string = $state(''); - let editable_badge_type_code: string = $state(''); + // *** Local edit mode (not related to $ae_loc.edit_mode) + let local_edit_active = $state(false); + + // *** Accessibility - text enlargement + let txt_enlarge = $state(false); + + // *** Help modal + let help_modal_open = $state(false); + + // *** QR Code state + let qr_data_url: string = $state(''); + let qr_hovered = $state(false); // Hover zoom effect (overlay) + let qr_expanded = $state(false); // Click to expand (pushes content) + + // *** Editable field state + let editable_pronouns_override: string | null = $state(null); + let editable_full_name_override: string | null = $state(null); + let editable_professional_title_override: string | null = $state(null); + let editable_affiliations_override: string | null = $state(null); + let editable_phone_override: string | null = $state(null); + let editable_location_override: string | null = $state(null); + let editable_allow_tracking: boolean = $state(false); + let editable_agree_to_tc: boolean = $state(false); + + // Staff-only fields + let editable_email_override: string | null = $state(null); + let editable_badge_type_code_override: string | null = $state(null); + let editable_registration_type_code_override: string | null = $state(null); + let editable_hide: boolean = $state(false); + let editable_priority: number | null = $state(null); + let editable_notes: string | null = $state(null); + + // Options (other_1_code through other_8_code) + let editable_other_1_code: string | null = $state(null); + let editable_other_2_code: string | null = $state(null); + let editable_other_3_code: string | null = $state(null); + let editable_other_4_code: string | null = $state(null); + let editable_other_5_code: string | null = $state(null); + let editable_other_6_code: string | null = $state(null); + let editable_other_7_code: string | null = $state(null); + let editable_other_8_code: string | null = $state(null); + + // Tickets (ticket_1_code through ticket_8_code) + let editable_ticket_1_code: string | null = $state(null); + let editable_ticket_2_code: string | null = $state(null); + let editable_ticket_3_code: string | null = $state(null); + let editable_ticket_4_code: string | null = $state(null); + let editable_ticket_5_code: string | null = $state(null); + let editable_ticket_6_code: string | null = $state(null); + let editable_ticket_7_code: string | null = $state(null); + let editable_ticket_8_code: string | null = $state(null); let save_status: 'idle' | 'loading' | 'done' | 'error' = $state('idle'); // Initialize from badge object $effect(() => { if ($lq__event_badge_obj) { - editable_full_name_override = - $lq__event_badge_obj.full_name_override ?? $lq__event_badge_obj.full_name ?? ''; - editable_professional_title_override = - $lq__event_badge_obj.professional_title_override ?? $lq__event_badge_obj.professional_title ?? ''; - editable_affiliations_override = - $lq__event_badge_obj.affiliations_override ?? $lq__event_badge_obj.affiliations ?? ''; - editable_location_override = - $lq__event_badge_obj.location_override ?? $lq__event_badge_obj.location ?? ''; - editable_email = - $lq__event_badge_obj.email ?? ''; - editable_badge_type_code = - $lq__event_badge_obj.badge_type_code ?? ''; + // Reset to badge values + editable_pronouns_override = $lq__event_badge_obj.pronouns_override ?? null; + editable_full_name_override = $lq__event_badge_obj.full_name_override ?? null; + editable_professional_title_override = $lq__event_badge_obj.professional_title_override ?? null; + editable_affiliations_override = $lq__event_badge_obj.affiliations_override ?? null; + editable_phone_override = $lq__event_badge_obj.phone_override ?? null; + editable_location_override = $lq__event_badge_obj.location_override ?? null; + editable_allow_tracking = $lq__event_badge_obj.allow_tracking ?? false; + editable_agree_to_tc = $lq__event_badge_obj.agree_to_tc ?? false; + + editable_email_override = $lq__event_badge_obj.email_override ?? null; + editable_badge_type_code_override = $lq__event_badge_obj.badge_type_code_override ?? null; + editable_registration_type_code_override = $lq__event_badge_obj.registration_type_code_override ?? null; + editable_hide = $lq__event_badge_obj.hide ?? false; + editable_priority = $lq__event_badge_obj.priority ?? null; + editable_notes = $lq__event_badge_obj.notes ?? null; + + editable_other_1_code = $lq__event_badge_obj.other_1_code ?? null; + editable_other_2_code = $lq__event_badge_obj.other_2_code ?? null; + editable_other_3_code = $lq__event_badge_obj.other_3_code ?? null; + editable_other_4_code = $lq__event_badge_obj.other_4_code ?? null; + editable_other_5_code = $lq__event_badge_obj.other_5_code ?? null; + editable_other_6_code = $lq__event_badge_obj.other_6_code ?? null; + editable_other_7_code = $lq__event_badge_obj.other_7_code ?? null; + editable_other_8_code = $lq__event_badge_obj.other_8_code ?? null; + + editable_ticket_1_code = $lq__event_badge_obj.ticket_1_code ?? null; + editable_ticket_2_code = $lq__event_badge_obj.ticket_2_code ?? null; + editable_ticket_3_code = $lq__event_badge_obj.ticket_3_code ?? null; + editable_ticket_4_code = $lq__event_badge_obj.ticket_4_code ?? null; + editable_ticket_5_code = $lq__event_badge_obj.ticket_5_code ?? null; + editable_ticket_6_code = $lq__event_badge_obj.ticket_6_code ?? null; + editable_ticket_7_code = $lq__event_badge_obj.ticket_7_code ?? null; + editable_ticket_8_code = $lq__event_badge_obj.ticket_8_code ?? null; + + // Reset edit mode when badge changes + local_edit_active = false; + save_status = 'idle'; + } + }); + + // Generate QR code + $effect(() => { + if (browser && $lq__event_badge_obj?.event_badge_id) { + const params: any = { + obj_type: 'event_badge', + obj_id: $lq__event_badge_obj.event_badge_id + }; + (async () => { + try { + qr_data_url = await core_func.js_generate_qr_code('obj', params); + } catch (error: any) { + console.error('QR code generation error:', error); + qr_data_url = ''; + } + })(); } }); @@ -69,11 +165,138 @@ return can_edit_fields.includes('*') || can_edit_fields.includes(field); } + // Derived: has this field been overridden? function has_override(base_field: string, override_field: string): boolean { - return !!( - $lq__event_badge_obj?.[override_field] && - $lq__event_badge_obj[override_field] !== $lq__event_badge_obj[base_field] + const base_val = $lq__event_badge_obj?.[base_field]; + const override_val = $lq__event_badge_obj?.[override_field]; + return !!(override_val && override_val !== base_val); + } + + // Get display value (override || base || empty) + function get_display_value(base_field: string, override_field: string): string { + return $lq__event_badge_obj?.[override_field] ?? $lq__event_badge_obj?.[base_field] ?? ''; + } + + // Check if any changes have been made + let has_changes = $derived.by(() => { + if (!$lq__event_badge_obj) return false; + + return ( + editable_pronouns_override !== ($lq__event_badge_obj.pronouns_override ?? null) || + editable_full_name_override !== ($lq__event_badge_obj.full_name_override ?? null) || + editable_professional_title_override !== ($lq__event_badge_obj.professional_title_override ?? null) || + editable_affiliations_override !== ($lq__event_badge_obj.affiliations_override ?? null) || + editable_phone_override !== ($lq__event_badge_obj.phone_override ?? null) || + editable_location_override !== ($lq__event_badge_obj.location_override ?? null) || + editable_allow_tracking !== ($lq__event_badge_obj.allow_tracking ?? false) || + editable_agree_to_tc !== ($lq__event_badge_obj.agree_to_tc ?? false) || + editable_email_override !== ($lq__event_badge_obj.email_override ?? null) || + editable_badge_type_code_override !== ($lq__event_badge_obj.badge_type_code_override ?? null) || + editable_registration_type_code_override !== ($lq__event_badge_obj.registration_type_code_override ?? null) || + editable_hide !== ($lq__event_badge_obj.hide ?? false) || + editable_priority !== ($lq__event_badge_obj.priority ?? null) || + editable_notes !== ($lq__event_badge_obj.notes ?? null) || + editable_other_1_code !== ($lq__event_badge_obj.other_1_code ?? null) || + editable_other_2_code !== ($lq__event_badge_obj.other_2_code ?? null) || + editable_other_3_code !== ($lq__event_badge_obj.other_3_code ?? null) || + editable_other_4_code !== ($lq__event_badge_obj.other_4_code ?? null) || + editable_other_5_code !== ($lq__event_badge_obj.other_5_code ?? null) || + editable_other_6_code !== ($lq__event_badge_obj.other_6_code ?? null) || + editable_other_7_code !== ($lq__event_badge_obj.other_7_code ?? null) || + editable_other_8_code !== ($lq__event_badge_obj.other_8_code ?? null) || + editable_ticket_1_code !== ($lq__event_badge_obj.ticket_1_code ?? null) || + editable_ticket_2_code !== ($lq__event_badge_obj.ticket_2_code ?? null) || + editable_ticket_3_code !== ($lq__event_badge_obj.ticket_3_code ?? null) || + editable_ticket_4_code !== ($lq__event_badge_obj.ticket_4_code ?? null) || + editable_ticket_5_code !== ($lq__event_badge_obj.ticket_5_code ?? null) || + editable_ticket_6_code !== ($lq__event_badge_obj.ticket_6_code ?? null) || + editable_ticket_7_code !== ($lq__event_badge_obj.ticket_7_code ?? null) || + editable_ticket_8_code !== ($lq__event_badge_obj.ticket_8_code ?? null) ); + }); + + // Toggle edit mode + function toggle_edit_mode() { + if (local_edit_active && !has_changes) { + // Cancel with no changes + local_edit_active = false; + } else { + // Enter edit mode + local_edit_active = !local_edit_active; + } + } + + // Revert a specific override field + function revert_override(override_field: string) { + switch(override_field) { + case 'pronouns_override': editable_pronouns_override = null; break; + case 'full_name_override': editable_full_name_override = null; break; + case 'professional_title_override': editable_professional_title_override = null; break; + case 'affiliations_override': editable_affiliations_override = null; break; + case 'phone_override': editable_phone_override = null; break; + case 'location_override': editable_location_override = null; break; + case 'email_override': editable_email_override = null; break; + case 'badge_type_code_override': editable_badge_type_code_override = null; break; + case 'registration_type_code_override': editable_registration_type_code_override = null; break; + } + } + + // Helper to get option code by index + function get_option_code(idx: number): string | null { + switch(idx) { + case 1: return editable_other_1_code; + case 2: return editable_other_2_code; + case 3: return editable_other_3_code; + case 4: return editable_other_4_code; + case 5: return editable_other_5_code; + case 6: return editable_other_6_code; + case 7: return editable_other_7_code; + case 8: return editable_other_8_code; + default: return null; + } + } + + // Helper to set option code by index + function set_option_code(idx: number, value: string | null) { + switch(idx) { + case 1: editable_other_1_code = value; break; + case 2: editable_other_2_code = value; break; + case 3: editable_other_3_code = value; break; + case 4: editable_other_4_code = value; break; + case 5: editable_other_5_code = value; break; + case 6: editable_other_6_code = value; break; + case 7: editable_other_7_code = value; break; + case 8: editable_other_8_code = value; break; + } + } + + // Helper to get ticket code by index + function get_ticket_code(idx: number): string | null { + switch(idx) { + case 1: return editable_ticket_1_code; + case 2: return editable_ticket_2_code; + case 3: return editable_ticket_3_code; + case 4: return editable_ticket_4_code; + case 5: return editable_ticket_5_code; + case 6: return editable_ticket_6_code; + case 7: return editable_ticket_7_code; + case 8: return editable_ticket_8_code; + default: return null; + } + } + + // Helper to set ticket code by index + function set_ticket_code(idx: number, value: string | null) { + switch(idx) { + case 1: editable_ticket_1_code = value; break; + case 2: editable_ticket_2_code = value; break; + case 3: editable_ticket_3_code = value; break; + case 4: editable_ticket_4_code = value; break; + case 5: editable_ticket_5_code = value; break; + case 6: editable_ticket_6_code = value; break; + case 7: editable_ticket_7_code = value; break; + case 8: editable_ticket_8_code = value; break; + } } async function handle_save() { @@ -82,44 +305,49 @@ save_status = 'loading'; const data_to_update: key_val = {}; - // Only include fields in can_edit_fields that have changed - if (can_edit('full_name_override')) { - const original = $lq__event_badge_obj.full_name_override ?? $lq__event_badge_obj.full_name ?? ''; - if (editable_full_name_override !== original) { - data_to_update.full_name_override = editable_full_name_override || null; + // Helper to add changed fields + const add_if_changed = (field: string, editable_val: any, original_val: any) => { + if (can_edit(field) && editable_val !== original_val) { + data_to_update[field] = editable_val; } - } - if (can_edit('professional_title_override')) { - const original = $lq__event_badge_obj.professional_title_override ?? $lq__event_badge_obj.professional_title ?? ''; - if (editable_professional_title_override !== original) { - data_to_update.professional_title_override = editable_professional_title_override || null; - } - } - if (can_edit('affiliations_override')) { - const original = $lq__event_badge_obj.affiliations_override ?? $lq__event_badge_obj.affiliations ?? ''; - if (editable_affiliations_override !== original) { - data_to_update.affiliations_override = editable_affiliations_override || null; - } - } - if (can_edit('location_override')) { - const original = $lq__event_badge_obj.location_override ?? $lq__event_badge_obj.location ?? ''; - if (editable_location_override !== original) { - data_to_update.location_override = editable_location_override || null; - } - } - if (can_edit('email')) { - if (editable_email !== ($lq__event_badge_obj.email ?? '')) { - data_to_update.email = editable_email || null; - } - } - if (can_edit('badge_type_code')) { - if (editable_badge_type_code !== ($lq__event_badge_obj.badge_type_code ?? '')) { - data_to_update.badge_type_code = editable_badge_type_code || null; - } - } + }; + + add_if_changed('pronouns_override', editable_pronouns_override, $lq__event_badge_obj.pronouns_override ?? null); + add_if_changed('full_name_override', editable_full_name_override, $lq__event_badge_obj.full_name_override ?? null); + add_if_changed('professional_title_override', editable_professional_title_override, $lq__event_badge_obj.professional_title_override ?? null); + add_if_changed('affiliations_override', editable_affiliations_override, $lq__event_badge_obj.affiliations_override ?? null); + add_if_changed('phone_override', editable_phone_override, $lq__event_badge_obj.phone_override ?? null); + add_if_changed('location_override', editable_location_override, $lq__event_badge_obj.location_override ?? null); + add_if_changed('allow_tracking', editable_allow_tracking, $lq__event_badge_obj.allow_tracking ?? false); + add_if_changed('agree_to_tc', editable_agree_to_tc, $lq__event_badge_obj.agree_to_tc ?? false); + add_if_changed('email_override', editable_email_override, $lq__event_badge_obj.email_override ?? null); + add_if_changed('badge_type_code_override', editable_badge_type_code_override, $lq__event_badge_obj.badge_type_code_override ?? null); + add_if_changed('registration_type_code_override', editable_registration_type_code_override, $lq__event_badge_obj.registration_type_code_override ?? null); + add_if_changed('hide', editable_hide, $lq__event_badge_obj.hide ?? false); + add_if_changed('priority', editable_priority, $lq__event_badge_obj.priority ?? null); + add_if_changed('notes', editable_notes, $lq__event_badge_obj.notes ?? null); + + add_if_changed('other_1_code', editable_other_1_code, $lq__event_badge_obj.other_1_code ?? null); + add_if_changed('other_2_code', editable_other_2_code, $lq__event_badge_obj.other_2_code ?? null); + add_if_changed('other_3_code', editable_other_3_code, $lq__event_badge_obj.other_3_code ?? null); + add_if_changed('other_4_code', editable_other_4_code, $lq__event_badge_obj.other_4_code ?? null); + add_if_changed('other_5_code', editable_other_5_code, $lq__event_badge_obj.other_5_code ?? null); + add_if_changed('other_6_code', editable_other_6_code, $lq__event_badge_obj.other_6_code ?? null); + add_if_changed('other_7_code', editable_other_7_code, $lq__event_badge_obj.other_7_code ?? null); + add_if_changed('other_8_code', editable_other_8_code, $lq__event_badge_obj.other_8_code ?? null); + + add_if_changed('ticket_1_code', editable_ticket_1_code, $lq__event_badge_obj.ticket_1_code ?? null); + add_if_changed('ticket_2_code', editable_ticket_2_code, $lq__event_badge_obj.ticket_2_code ?? null); + add_if_changed('ticket_3_code', editable_ticket_3_code, $lq__event_badge_obj.ticket_3_code ?? null); + add_if_changed('ticket_4_code', editable_ticket_4_code, $lq__event_badge_obj.ticket_4_code ?? null); + add_if_changed('ticket_5_code', editable_ticket_5_code, $lq__event_badge_obj.ticket_5_code ?? null); + add_if_changed('ticket_6_code', editable_ticket_6_code, $lq__event_badge_obj.ticket_6_code ?? null); + add_if_changed('ticket_7_code', editable_ticket_7_code, $lq__event_badge_obj.ticket_7_code ?? null); + add_if_changed('ticket_8_code', editable_ticket_8_code, $lq__event_badge_obj.ticket_8_code ?? null); if (Object.keys(data_to_update).length === 0) { - save_status = 'done'; + save_status = 'idle'; + local_edit_active = false; return; } @@ -132,251 +360,834 @@ log_lvl }); save_status = 'done'; + setTimeout(() => { + save_status = 'idle'; + local_edit_active = false; + }, 2000); } catch (error) { console.error('Error saving badge review changes:', error); save_status = 'error'; + setTimeout(() => { + save_status = 'idle'; + }, 3000); } } function handle_cancel() { if ($lq__event_badge_obj) { - editable_full_name_override = - $lq__event_badge_obj.full_name_override ?? $lq__event_badge_obj.full_name ?? ''; - editable_professional_title_override = - $lq__event_badge_obj.professional_title_override ?? $lq__event_badge_obj.professional_title ?? ''; - editable_affiliations_override = - $lq__event_badge_obj.affiliations_override ?? $lq__event_badge_obj.affiliations ?? ''; - editable_location_override = - $lq__event_badge_obj.location_override ?? $lq__event_badge_obj.location ?? ''; - editable_email = $lq__event_badge_obj.email ?? ''; - editable_badge_type_code = $lq__event_badge_obj.badge_type_code ?? ''; + // Reset all fields + editable_pronouns_override = $lq__event_badge_obj.pronouns_override ?? null; + editable_full_name_override = $lq__event_badge_obj.full_name_override ?? null; + editable_professional_title_override = $lq__event_badge_obj.professional_title_override ?? null; + editable_affiliations_override = $lq__event_badge_obj.affiliations_override ?? null; + editable_phone_override = $lq__event_badge_obj.phone_override ?? null; + editable_location_override = $lq__event_badge_obj.location_override ?? null; + editable_allow_tracking = $lq__event_badge_obj.allow_tracking ?? false; + editable_agree_to_tc = $lq__event_badge_obj.agree_to_tc ?? false; + + editable_email_override = $lq__event_badge_obj.email_override ?? null; + editable_badge_type_code_override = $lq__event_badge_obj.badge_type_code_override ?? null; + editable_registration_type_code_override = $lq__event_badge_obj.registration_type_code_override ?? null; + editable_hide = $lq__event_badge_obj.hide ?? false; + editable_priority = $lq__event_badge_obj.priority ?? null; + editable_notes = $lq__event_badge_obj.notes ?? null; + + editable_other_1_code = $lq__event_badge_obj.other_1_code ?? null; + editable_other_2_code = $lq__event_badge_obj.other_2_code ?? null; + editable_other_3_code = $lq__event_badge_obj.other_3_code ?? null; + editable_other_4_code = $lq__event_badge_obj.other_4_code ?? null; + editable_other_5_code = $lq__event_badge_obj.other_5_code ?? null; + editable_other_6_code = $lq__event_badge_obj.other_6_code ?? null; + editable_other_7_code = $lq__event_badge_obj.other_7_code ?? null; + editable_other_8_code = $lq__event_badge_obj.other_8_code ?? null; + + editable_ticket_1_code = $lq__event_badge_obj.ticket_1_code ?? null; + editable_ticket_2_code = $lq__event_badge_obj.ticket_2_code ?? null; + editable_ticket_3_code = $lq__event_badge_obj.ticket_3_code ?? null; + editable_ticket_4_code = $lq__event_badge_obj.ticket_4_code ?? null; + editable_ticket_5_code = $lq__event_badge_obj.ticket_5_code ?? null; + editable_ticket_6_code = $lq__event_badge_obj.ticket_6_code ?? null; + editable_ticket_7_code = $lq__event_badge_obj.ticket_7_code ?? null; + editable_ticket_8_code = $lq__event_badge_obj.ticket_8_code ?? null; } save_status = 'idle'; + local_edit_active = false; } {#if $lq__event_badge_obj} -
+
- - {#if is_staff} -
-

Source Data (from registration system — read only)

-
- Given Name - {$lq__event_badge_obj.given_name ?? '—'} - Family Name - {$lq__event_badge_obj.family_name ?? '—'} - Full Name - {$lq__event_badge_obj.full_name ?? '—'} - Professional Title - {$lq__event_badge_obj.professional_title ?? '—'} - Affiliations - {$lq__event_badge_obj.affiliations ?? '—'} - Location - {$lq__event_badge_obj.location ?? '—'} - Badge Type - {$lq__event_badge_obj.badge_type_code ?? '—'} -
-
- {/if} - - -
-

- Fields below are what will appear on your printed badge. - {#if can_edit_fields.length > 0} - You may edit the highlighted fields. - {/if} -

- - - {#if can_edit('full_name_override') || is_staff} -
- - {#if can_edit('full_name_override')} - - {:else} -

- {$lq__event_badge_obj.full_name_override ?? $lq__event_badge_obj.full_name ?? '—'} -

- {/if} -
- {/if} - - - {#if can_edit('professional_title_override') || is_staff} -
- - {#if can_edit('professional_title_override')} - - {:else} -

- {$lq__event_badge_obj.professional_title_override ?? $lq__event_badge_obj.professional_title ?? '—'} -

- {/if} -
- {/if} - - - {#if can_edit('affiliations_override') || is_staff} -
- - {#if can_edit('affiliations_override')} - - {:else} -

- {$lq__event_badge_obj.affiliations_override ?? $lq__event_badge_obj.affiliations ?? '—'} -

- {/if} -
- {/if} - - - {#if can_edit('location_override') || is_staff} -
- - {#if can_edit('location_override')} - - {:else} -

- {$lq__event_badge_obj.location_override ?? $lq__event_badge_obj.location ?? '—'} -

- {/if} -
- {/if} - - - {#if can_edit('email')} -
- - -
- {/if} - - - {#if can_edit('badge_type_code')} -
- - -
- {/if} -
- - - {#if can_edit_fields.length > 0} -
+ +
+
+

Badge Review

+ - {#if save_status !== 'done'} + + + + {#if can_edit_fields.length > 0} +
+ {#if local_edit_active} + + {#if has_changes} + + {/if} + + + {#if save_status !== 'done'} + + {/if} + {:else} + + + {/if} +
+ {/if} +
+
+ +
+ + + {#if ($lq__event_badge_obj.print_count ?? 0) > 0 || $ae_loc.edit_mode} +
+

Print Status

+ {#if ($lq__event_badge_obj.print_count ?? 0) === 0} +

Not yet printed

+ {:else} +

+ Printed {$lq__event_badge_obj.print_count}× + {#if $lq__event_badge_obj.print_first_datetime} + — first: {ae_util.iso_datetime_formatter($lq__event_badge_obj.print_first_datetime, 'datetime_iso_12_no_seconds')} + {/if} + {#if $lq__event_badge_obj.print_last_datetime} + , last: {ae_util.iso_datetime_formatter($lq__event_badge_obj.print_last_datetime, 'datetime_iso_12_no_seconds')} + {/if} +

+ {/if} +
+ {/if} + + + + + {#if qr_data_url} +
+

Badge QR Code

- {/if} -
- {/if} +

+ {qr_expanded ? 'Click QR to collapse' : 'Scan or click to enlarge'} +

+
+ {/if} - - {#if is_staff && $lq__event_badge_obj.print_count !== undefined} -
-

Print count: {$lq__event_badge_obj.print_count ?? 0}

- {#if $lq__event_badge_obj.print_first_datetime} -

First printed: {new Date($lq__event_badge_obj.print_first_datetime).toLocaleString()}

+ +
+ + + {#if can_edit('pronouns_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('pronouns_override')} + + {#if has_override('pronouns', 'pronouns_override')} + + {/if} + {:else} +
+ {get_display_value('pronouns', 'pronouns_override') || '—'} +
+ {/if} +
+
{/if} - {#if $lq__event_badge_obj.print_last_datetime} -

Last printed: {new Date($lq__event_badge_obj.print_last_datetime).toLocaleString()}

+ + + {#if can_edit('full_name_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('full_name_override')} + + {#if has_override('full_name', 'full_name_override')} + + {/if} + {:else} +
+ {@html get_display_value('full_name', 'full_name_override') || '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('professional_title_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('professional_title_override')} + + {#if has_override('professional_title', 'professional_title_override')} + + {/if} + {:else} +
+ {@html get_display_value('professional_title', 'professional_title_override') || '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('affiliations_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('affiliations_override')} + + {#if has_override('affiliations', 'affiliations_override')} + + {/if} + {:else} +
+ {@html get_display_value('affiliations', 'affiliations_override') || '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('phone_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('phone_override')} + + {#if has_override('phone', 'phone_override')} + + {/if} + {:else} +
+ {get_display_value('phone', 'phone_override') || '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('location_override') || is_staff} +
+ +
+ {#if local_edit_active && can_edit('location_override')} + + {#if has_override('location', 'location_override')} + + {/if} + {:else} +
+ {@html get_display_value('location', 'location_override') || '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('allow_tracking')} + + {/if} + + + {#if is_staff} +
+
Staff Only
+ + + {#if can_edit('email_override') || is_staff} +
+
+ + {#if has_override('email', 'email_override')} + (overridden) + {/if} +
+
+ {#if local_edit_active && can_edit('email_override')} + + {:else} +
+ {get_display_value('email', 'email_override') || '—'} +
+ {/if} + {#if local_edit_active && can_edit('email_override') && has_override('email', 'email_override')} + + {/if} +
+
+ {/if} + + + {#if can_edit('badge_type_code_override')} +
+ +
+ {#if local_edit_active} + + {:else} +
+ {$lq__event_badge_obj.badge_type_code_override ?? $lq__event_badge_obj.badge_type_code ?? '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('registration_type_code_override')} +
+ +
+ {#if local_edit_active} + + {:else} +
+ {$lq__event_badge_obj.registration_type_code_override ?? $lq__event_badge_obj.registration_type_code ?? '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('hide')} + + {/if} + + + {#if can_edit('priority')} +
+ +
+ {#if local_edit_active} + + {:else} +
+ {$lq__event_badge_obj.priority ?? '—'} +
+ {/if} +
+
+ {/if} + + + {#if can_edit('notes')} +
+ +
+ {#if local_edit_active} + + {:else} +
+ {$lq__event_badge_obj.notes ?? '—'} +
+ {/if} +
+
+ {/if} + + +
+
Options
+
+ {#each [1, 2, 3, 4, 5, 6, 7, 8] as idx} + {#if ($lq__event_badge_obj[`other_${idx}_code`] || local_edit_active)} +
+ + {#if local_edit_active} + set_option_code(idx, e.currentTarget.value || null)} + placeholder="—" + /> + {:else} +
+ {#if $lq__event_badge_obj[`other_${idx}_code`]} + {$lq__event_badge_obj[`other_${idx}_code`]} + {:else} + (empty) + {/if} +
+ {/if} +
+ {/if} + {/each} +
+
+ + +
+
Tickets
+
+ {#each [1, 2, 3, 4, 5, 6, 7, 8] as idx} + {#if ($lq__event_badge_obj[`ticket_${idx}_code`] || local_edit_active)} +
+ + {#if local_edit_active} + set_ticket_code(idx, e.currentTarget.value || null)} + placeholder="—" + /> + {:else} +
+ {#if $lq__event_badge_obj[`ticket_${idx}_code`]} + {$lq__event_badge_obj[`ticket_${idx}_code`]} + {:else} + (empty) + {/if} +
+ {/if} +
+ {/if} + {/each} +
+
+
+ {/if} + + + {#if !is_staff} + {#each [1, 2, 3, 4, 5, 6, 7, 8] as idx} + {#if $lq__event_badge_obj[`other_${idx}_code`]} +
+ Option {idx}: {$lq__event_badge_obj[`other_${idx}_code`]} +
+ {/if} + {/each} + {#each [1, 2, 3, 4, 5, 6, 7, 8] as idx} + {#if $lq__event_badge_obj[`ticket_${idx}_code`]} +
+ Ticket {idx}: {$lq__event_badge_obj[`ticket_${idx}_code`]} +
+ {/if} + {/each} + {/if} + + + {#if can_edit('agree_to_tc')} +
+ +
{/if}
- {/if} + + +
+
+ + + +
+ +
+

Reviewing Your Badge

+

+ This page allows you to review and update the information that will appear on your event badge. + Please verify that all details are correct before your badge is printed. +

+
+ +
+

Editing Your Information

+

+ Click the "Edit Details" button to make changes to your badge information. + You can update fields like your name, professional title, affiliations, and location. +

+

+ When you're done editing, click "Save" to submit your changes, or "Cancel" to discard them. +

+
+ +
+

Accessibility

+

+ Use the "Larger" button to increase text size for easier reading. + Click again to return to normal size. +

+
+ +
+

QR Code

+

+ Your badge QR code can be scanned at the event for check-in and registration. + You can hover over or click the QR code to view it larger. +

+
+ +
+

Lead Scanning

+

+ If you check "Allow exhibitor lead scanning", exhibitors will be able to scan + your badge to collect your contact information. You can change this setting at any time. +

+
+ +
+

Need Assistance?

+

+ If you have questions or need help with your badge information, please contact event staff + at the registration desk. +

+
+
+ + +
{/if}