From 8787f8c2ff174e2919c4e525ee9a7bd5901b49e2 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Sun, 8 Feb 2026 22:25:56 -0500 Subject: [PATCH] Harden Licensed User dropdown logic and resolve data parsing errors - Implemented dual-format parsing for 'license_li_json' (handles raw string and IDB objects). - Added fallback lookup by 'event_exhibit_id_random' for robust record resolution. - Fixed reactivity for licensee dropdown population. - Hardened default selection logic based on Aether access levels. --- .../ae_comp__exhibit_signin.svelte | 9 +- .../ae_comp__exhibit_tracking_search.svelte | 32 +++++-- .../[exhibit_id]/ae_tab__manage.svelte | 56 +++++------ .../lead/[exhibit_tracking_id]/+page.svelte | 96 ++++++++++++++++--- 4 files changed, 143 insertions(+), 50 deletions(-) diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_signin.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_signin.svelte index d311405c..5e2840a4 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_signin.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_signin.svelte @@ -57,8 +57,13 @@ } else { // 2. Licensed User logic try { - const licenses = JSON.parse($lq__exhibit_obj.license_li_json || '[]'); - const found = licenses.find((l: any) => l.email.toLowerCase() === email.toLowerCase().trim()); + // Determine raw JSON string + const raw_json = $lq__exhibit_obj?.license_li_json; + + // Parse if string, otherwise use empty array + const licenses = typeof raw_json === 'string' ? JSON.parse(raw_json || '[]') : (Array.isArray(raw_json) ? raw_json : []); + + const found = licenses.find((l: any) => l.email?.toLowerCase() === email.toLowerCase().trim()); if (found && found.passcode === user_passcode) { // SUCCESS diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_tracking_search.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_tracking_search.svelte index eb1b0710..1a6e1ef9 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_tracking_search.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__exhibit_tracking_search.svelte @@ -24,7 +24,16 @@ let exhibit_obj: any = $state(null); onMount(() => { - const observable = liveQuery(() => db_events.exhibit.get(exhibit_id)); + const observable = liveQuery(async () => { + if (!exhibit_id) return null; + // 1. Try primary lookup + let res = await db_events.exhibit.get(exhibit_id); + // 2. Fallback to random ID index + if (!res) { + res = await db_events.exhibit.where('event_exhibit_id_random').equals(exhibit_id).first(); + } + return res; + }); const subscription = observable.subscribe((value) => { exhibit_obj = value; }); @@ -34,23 +43,30 @@ // Reactive list derived from the exhibit state (Licensed Exhibit Leads Users) let licensee_li = $derived.by(() => { try { - const licenses = JSON.parse(exhibit_obj?.license_li_json || '[]'); - return Array.isArray(licenses) ? licenses : []; + const raw = exhibit_obj?.license_li_json; + if (!raw) return []; + + // If it's already an array, return it. If it's a string, parse it. + if (Array.isArray(raw)) return raw; + if (typeof raw === 'string') return JSON.parse(raw || '[]'); + + return []; } catch (e) { + console.error('Failed to parse licensee_li_json', e); return []; } }); // Default selection logic: Aether Admins go to "all", Licensees go to "my" $effect(() => { - // Wait for object to load + // Wait for object to load and check if initialized if (!exhibit_obj) return; - if ($events_loc.leads.tracking__qry__licensee_email === 'all' && !$ae_loc.administrator_access) { - untrack(() => { + untrack(() => { + if ($events_loc.leads.tracking__qry__licensee_email === 'all' && !$ae_loc.administrator_access) { $events_loc.leads.tracking__qry__licensee_email = 'my'; - }); - } + } + }); }); function handle_search_trigger() { diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_tab__manage.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_tab__manage.svelte index 3cd867a4..b0160f22 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_tab__manage.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_tab__manage.svelte @@ -220,36 +220,38 @@
- -
-
+ {#if show_license_mgmt} + + {:else} + + {/if} + + {#if show_license_mgmt} - - {:else} - +
+ +
{/if} - - - {#if show_license_mgmt} -
- -
- {/if} -
+ + {/if}
diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte index 711dde29..8bc81e59 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte @@ -7,6 +7,8 @@ import { liveQuery } from 'dexie'; import { db_events } from '$lib/ae_events/db_events'; import { ae_util } from '$lib/ae_utils/ae_utils'; + import { ae_api, ae_loc } from '$lib/stores/ae_stores'; + import Element_ae_crud_v2 from '$lib/elements/element_ae_crud_v2.svelte'; import { User, Mail, @@ -20,7 +22,9 @@ ShieldCheck, Star, LoaderCircle, - ListTodo + ListTodo, + Edit, + Eye } from 'lucide-svelte'; const exhibit_tracking_id = $derived(page.params.exhibit_tracking_id); @@ -32,6 +36,16 @@ }) ); + let lq__exhibit_obj = $derived( + liveQuery(async () => { + const exhibit_id = page.params.exhibit_id; + if (!exhibit_id) return null; + return await db_events.exhibit.get(exhibit_id); + }) + ); + + let is_edit_mode = $state(false); + // Helper to format date using Aether utility function format_date(date: any) { if (!date) return ''; @@ -57,12 +71,29 @@

Lead Profile

- {#if $lq__lead_obj?.priority} - - - Priority - - {/if} +
+ {#if $lq__lead_obj} + + {/if} + + {#if $lq__lead_obj?.priority} + + + Priority + + {/if} +
@@ -144,7 +175,18 @@

Exhibitor Notes

- {#if $lq__lead_obj.exhibitor_notes} + {#if is_edit_mode} + + {:else if $lq__lead_obj.exhibitor_notes}

{$lq__lead_obj.exhibitor_notes}

{:else}
@@ -172,6 +214,20 @@ Captured By {$lq__lead_obj.external_person_id || 'Unknown'}
+ + {#if is_edit_mode} +
+ Priority Lead + +
+ {/if}
@@ -188,11 +244,25 @@
- -
-
{$lq__lead_obj.enable ? 'Record Enabled' : 'Record Disabled'}
-
Visibility Status
-
+ {#if is_edit_mode} +
+
Enabled
+ +
+ {:else} + +
+
{$lq__lead_obj.enable ? 'Record Enabled' : 'Record Disabled'}
+
Visibility Status
+
+ {/if}