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 @@