From b064d8c235dfb7438210f4ab33a0fd5cb26639c3 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 3 Mar 2026 18:49:57 -0500 Subject: [PATCH] feat(leads): V3 API migration, QR Scanner v3, and Exhibitor Leads UI overhaul - Migrate event_exhibit and event_exhibit_tracking CRUD to V3 API (parent_type/child_type params). - Implement Element_qr_scanner_v3.svelte: A Svelte 5 / Runes component using html5-qrcode with auto-start and unique viewfinder IDs. - Integrate QR Scanner v3 into ae_comp__badge_search.svelte and lead capture. - Refactor Exhibitor Leads UI: - Add 'Rapid Scan' vs 'Qualify Mode' toggles for efficient lead capture. - Upgrade ae_comp__lead_detail_form.svelte to support new question/response schema with backward compatibility. - Implement 'Sign Out of Booth' functionality in exhibit management. - Optimize lead detail layout for mobile readability and high information density. - Fix component prop sync for event_id and exhibit_id. - UI/UX refinements: standardizing icons (SquarePen), cleaning up unused imports, and improving responsive states. --- src/lib/ae_events/ae_events__exhibit.ts | 14 +- .../ae_events/ae_events__exhibit_tracking.ts | 14 +- src/lib/element_qr_scanner_v3.svelte | 143 ++++++++++++++++++ .../badges/ae_comp__badge_search.svelte | 29 +--- .../leads/exhibit/[exhibit_id]/+page.svelte | 24 +-- .../ae_comp__exhibit_custom_questions.svelte | 127 ++++++++++++---- .../ae_comp__exhibit_license_list.svelte | 4 +- .../ae_comp__exhibit_tracking_obj_li.svelte | 50 +++++- .../ae_comp__lead_manual_search.svelte | 72 ++++++--- .../ae_comp__lead_qr_scanner.svelte | 42 +++-- .../exhibit/[exhibit_id]/ae_tab__add.svelte | 82 +++++++--- .../[exhibit_id]/ae_tab__manage.svelte | 49 ++++-- .../lead/[exhibit_tracking_id]/+page.svelte | 91 ++++++----- .../ae_comp__lead_detail_form.svelte | 91 ++++++++--- 14 files changed, 605 insertions(+), 227 deletions(-) create mode 100644 src/lib/element_qr_scanner_v3.svelte diff --git a/src/lib/ae_events/ae_events__exhibit.ts b/src/lib/ae_events/ae_events__exhibit.ts index aad42052..1ad087c9 100644 --- a/src/lib/ae_events/ae_events__exhibit.ts +++ b/src/lib/ae_events/ae_events__exhibit.ts @@ -309,9 +309,9 @@ export async function create_ae_obj__exhibit({ }): Promise { const result = await api.create_nested_obj_v3({ api_cfg, - for_obj_type: 'event', - for_obj_id: event_id, - obj_type: 'event_exhibit', + parent_type: 'event', + parent_id: event_id, + child_type: 'event_exhibit', fields: { ...data_kv }, log_lvl }); @@ -353,10 +353,10 @@ export async function update_ae_obj__exhibit({ }): Promise { const result = await api.update_nested_obj_v3({ api_cfg, - for_obj_type: 'event', - for_obj_id: event_id, - obj_type: 'event_exhibit', - obj_id: exhibit_id, + parent_type: 'event', + parent_id: event_id, + child_type: 'event_exhibit', + child_id: exhibit_id, fields: data_kv, log_lvl }); diff --git a/src/lib/ae_events/ae_events__exhibit_tracking.ts b/src/lib/ae_events/ae_events__exhibit_tracking.ts index a8475f27..f0d145fa 100644 --- a/src/lib/ae_events/ae_events__exhibit_tracking.ts +++ b/src/lib/ae_events/ae_events__exhibit_tracking.ts @@ -326,9 +326,9 @@ export async function create_ae_obj__exhibit_tracking({ }): Promise { const result = await api.create_nested_obj_v3({ api_cfg, - for_obj_type: 'event_exhibit', - for_obj_id: exhibit_id, - obj_type: 'event_exhibit_tracking', + parent_type: 'event_exhibit', + parent_id: exhibit_id, + child_type: 'event_exhibit_tracking', fields: { event_badge_id: event_badge_id, external_person_id, @@ -374,10 +374,10 @@ export async function update_ae_obj__exhibit_tracking({ }): Promise { const result = await api.update_nested_obj_v3({ api_cfg, - for_obj_type: 'event_exhibit', - for_obj_id: exhibit_id, - obj_type: 'event_exhibit_tracking', - obj_id: exhibit_tracking_id, + parent_type: 'event_exhibit', + parent_id: exhibit_id, + child_type: 'event_exhibit_tracking', + child_id: exhibit_tracking_id, fields: data, log_lvl }); diff --git a/src/lib/element_qr_scanner_v3.svelte b/src/lib/element_qr_scanner_v3.svelte new file mode 100644 index 00000000..0ff44a3f --- /dev/null +++ b/src/lib/element_qr_scanner_v3.svelte @@ -0,0 +1,143 @@ + + + +
+
+ + {#if status === 'starting'} +
+

Starting camera...

+
+ {:else if status === 'error'} +
+

{error_msg}

+ +
+ {/if} +
diff --git a/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_search.svelte b/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_search.svelte index fbd03742..ec87b227 100644 --- a/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_search.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_search.svelte @@ -10,16 +10,14 @@ import { Library, RemoveFormatting, - X, QrCode, Search, - Check, LoaderCircle } from 'lucide-svelte'; import { ae_loc, ae_api } from '$lib/stores/ae_stores'; import { events_loc, events_sess } from '$lib/stores/ae_events_stores'; - import Element_qr_scanner_v2 from '$lib/element_qr_scanner_v2.svelte'; + import Element_qr_scanner_v3 from '$lib/element_qr_scanner_v3.svelte'; import { ae_util } from '$lib/ae_utils/ae_utils'; // ISHLT 2024 badge type codes @@ -53,7 +51,7 @@ }; } - function handle_qr_scan_result(event: CustomEvent) { + function handle_qr_scan_result(event: { detail: { result: string; entry_method: string } }) { let qr_scan_result = event.detail.result; let obj = ae_util.process_data_string(qr_scan_result); @@ -202,9 +200,9 @@
-
{/if} @@ -240,24 +238,7 @@ {/if} - - - {#if $ae_loc.edit_mode} +{#if $ae_loc.edit_mode}