From b3114c619a6d3193e7b555df921e346bcb15ec9a Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Sun, 8 Feb 2026 19:23:26 -0500 Subject: [PATCH] Complete Exhibitor Leads Authentication and Portal Structure - Implemented dual-mode Sign-In (Shared Passcode / Licensed User) with persistent state. - Added Manager Bypass logic for seamless admin access. - Implemented Welcome/Start tab with redirection to Lead List upon authentication. - Added Sign-Out functionality and Header navigation improvements. - Integrated all Manage tab sub-sections (Licenses, Questions, Payment). --- .../leads/exhibit/[exhibit_id]/+page.svelte | 110 ++++++---- .../ae_comp__exhibit_signin.svelte | 200 +++++++++++++++++- .../exhibit/[exhibit_id]/ae_tab__start.svelte | 63 +++++- 3 files changed, 328 insertions(+), 45 deletions(-) diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/+page.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/+page.svelte index e1bdb614..5436804b 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/+page.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/+page.svelte @@ -19,7 +19,8 @@ List as ListIcon, LogIn, LayoutGrid, - Search + Search, + LogOut } from 'lucide-svelte'; import Comp_exhibit_tracking_search from './ae_comp__exhibit_tracking_search.svelte'; import Comp_exhibit_tracking_obj_li from './ae_comp__exhibit_tracking_obj_li.svelte'; @@ -45,8 +46,22 @@ $events_loc.leads.refresh_interval_sec = 25; } + // --- Sign-In State (Derived) --- + // 1. Manager Access (Bypass) OR 2. Valid Exhibit Auth entry + let is_signed_in = $derived( + $ae_loc.manager_access || + !!$events_loc.leads.auth_exhibit_kv?.[page.params.exhibit_id ?? ''] + ); + // --- Tab State (Sticky via Store) --- - let active_tab = $derived($events_loc.leads.tab?.[page.params.exhibit_id ?? ''] ?? 'list'); + let active_tab = $derived.by(() => { + const exhibit_id = page.params.exhibit_id; + if (!exhibit_id) return 'start'; + const saved_tab = $events_loc.leads.tab?.[exhibit_id] ?? 'list'; + // If signed in but stuck on start tab, go to list + if (is_signed_in && saved_tab === 'start') return 'list'; + return saved_tab; + }); let previous_main_tab = $state('list'); // To remember if we were on 'add' or 'list' before going to 'manage' function set_active_tab(new_tab: string) { @@ -56,9 +71,6 @@ $events_loc.leads.tab[exhibit_id] = new_tab; } - // Mock sign-in state for now - let is_signed_in = $state(true); - let tracking_id_li: Array = $state([]); let search_debounce_timer: any = null; let last_search_id = 0; let last_executed_key = ''; @@ -296,6 +308,16 @@ set_active_tab('manage'); } } + + function handle_signout() { + const exhibit_id = page.params.exhibit_id; + if (!exhibit_id) return; + if (confirm('Sign out from this booth?')) { + delete $events_loc.leads.auth_exhibit_kv[exhibit_id]; + $events_sess.leads.entered_passcode = null; + set_active_tab('start'); + } + }
- - + {#if is_signed_in} + + - - {#if $ae_loc.show_leads_payment} + + {#if $ae_loc.show_leads_payment} + + {/if} + + + + + {/if} - - -
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 56126e61..7bbf437b 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 @@ -1,11 +1,203 @@ -