From 6d1d1e265896c962144e590c28492dc13f4153a0 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 24 Mar 2026 12:14:30 -0400 Subject: [PATCH] Prettier for Event Exhibitor Leads --- .../events/[event_id]/(leads)/README.md | 53 +- .../[event_id]/(leads)/leads/+layout.svelte | 11 +- .../[event_id]/(leads)/leads/+layout.ts | 2 +- .../[event_id]/(leads)/leads/+page.svelte | 416 ++++----- .../events/[event_id]/(leads)/leads/+page.ts | 2 +- .../leads/ae_comp__exhibit_search.svelte | 87 +- .../leads/exhibit/[exhibit_id]/+layout.svelte | 36 +- .../leads/exhibit/[exhibit_id]/+layout.ts | 4 +- .../leads/exhibit/[exhibit_id]/+page.svelte | 801 +++++++++--------- .../ae_comp__exhibit_custom_questions.svelte | 272 +++--- .../ae_comp__exhibit_license_list.svelte | 240 +++--- .../ae_comp__exhibit_payment.svelte | 10 +- .../ae_comp__exhibit_signin.svelte | 289 ++++--- .../ae_comp__exhibit_tracking_obj_li.svelte | 155 ++-- .../ae_comp__exhibit_tracking_search.svelte | 191 +++-- .../ae_comp__lead_manual_search.svelte | 299 ++++--- .../ae_comp__lead_qr_scanner.svelte | 583 +++++++------ .../ae_comp__lead_qr_scanner_multi.svelte | 708 +++++++++------- .../exhibit/[exhibit_id]/ae_tab__add.svelte | 200 +++-- .../exhibit/[exhibit_id]/ae_tab__list.svelte | 20 +- .../[exhibit_id]/ae_tab__manage.svelte | 468 ++++++---- .../exhibit/[exhibit_id]/ae_tab__start.svelte | 88 +- .../lead/[exhibit_tracking_id]/+page.svelte | 419 +++++---- .../ae_comp__lead_detail_form.svelte | 224 ++--- 24 files changed, 3116 insertions(+), 2462 deletions(-) diff --git a/src/routes/events/[event_id]/(leads)/README.md b/src/routes/events/[event_id]/(leads)/README.md index f040411a..a54b1f7a 100644 --- a/src/routes/events/[event_id]/(leads)/README.md +++ b/src/routes/events/[event_id]/(leads)/README.md @@ -4,6 +4,7 @@ **PWA only** — no Electron involvement. The Electron app is exclusively for the Launcher. Spec docs: + - `documentation/PROJECT__AE_Events_Exhibitor_Leads_v3.md` — overview - `documentation/PROJECT__AE_Events_Exhibitor_Leads_v3_detail.md` — tab-level detail @@ -31,36 +32,36 @@ All data is cached in IndexedDB (Dexie.js) for offline use, with background API ### Routes -| File | Role | -| --- | --- | -| `leads/+page.svelte` | Exhibit search/landing — find your booth | -| `leads/+page.ts` | Layout data load | -| `leads/exhibit/[exhibit_id]/+page.svelte` | Main exhibitor view — orchestrates all tabs | -| `leads/exhibit/[exhibit_id]/+layout.svelte` / `+layout.ts` | Exhibit layout / data load | -| `leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte` | Lead detail view/edit | -| `leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.ts` | Lead data load | +| File | Role | +| -------------------------------------------------------------------- | ------------------------------------------- | +| `leads/+page.svelte` | Exhibit search/landing — find your booth | +| `leads/+page.ts` | Layout data load | +| `leads/exhibit/[exhibit_id]/+page.svelte` | Main exhibitor view — orchestrates all tabs | +| `leads/exhibit/[exhibit_id]/+layout.svelte` / `+layout.ts` | Exhibit layout / data load | +| `leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.svelte` | Lead detail view/edit | +| `leads/exhibit/[exhibit_id]/lead/[exhibit_tracking_id]/+page.ts` | Lead data load | ### Components (within `exhibit/[exhibit_id]/`) -| File | Role | -| --- | --- | -| `ae_tab__start.svelte` | Tab 1 — welcome + sign-in | -| `ae_tab__add.svelte` | Tab 2 — QR/search toggle + scan mode toggle | -| `ae_tab__manage.svelte` | Tab 4 — admin tools, booth config, app settings | -| `ae_comp__exhibit_signin.svelte` | Sign-in: shared passcode + licensed user | -| `ae_comp__lead_qr_scanner.svelte` | QR scanner (rapid vs. qualify mode) | -| `ae_comp__lead_manual_search.svelte` | Manual badge search + add | -| `ae_comp__exhibit_tracking_search.svelte` | Lead list search/filter bar | -| `ae_comp__exhibit_tracking_obj_li.svelte` | Lead list item renderer | -| `ae_comp__exhibit_license_list.svelte` | License slot manager (admin) | -| `ae_comp__exhibit_custom_questions.svelte` | Custom question config editor (admin) | -| `ae_comp__exhibit_payment.svelte` | **STUB** — Stripe placeholder, not functional | -| `ae_comp__exhibit_search.svelte` | Exhibit search input on the landing page | +| File | Role | +| ------------------------------------------ | ----------------------------------------------- | +| `ae_tab__start.svelte` | Tab 1 — welcome + sign-in | +| `ae_tab__add.svelte` | Tab 2 — QR/search toggle + scan mode toggle | +| `ae_tab__manage.svelte` | Tab 4 — admin tools, booth config, app settings | +| `ae_comp__exhibit_signin.svelte` | Sign-in: shared passcode + licensed user | +| `ae_comp__lead_qr_scanner.svelte` | QR scanner (rapid vs. qualify mode) | +| `ae_comp__lead_manual_search.svelte` | Manual badge search + add | +| `ae_comp__exhibit_tracking_search.svelte` | Lead list search/filter bar | +| `ae_comp__exhibit_tracking_obj_li.svelte` | Lead list item renderer | +| `ae_comp__exhibit_license_list.svelte` | License slot manager (admin) | +| `ae_comp__exhibit_custom_questions.svelte` | Custom question config editor (admin) | +| `ae_comp__exhibit_payment.svelte` | **STUB** — Stripe placeholder, not functional | +| `ae_comp__exhibit_search.svelte` | Exhibit search input on the landing page | ### Lead detail components (within `lead/[exhibit_tracking_id]/`) -| File | Role | -| --- | --- | +| File | Role | +| ---------------------------------- | ------------------------------- | | `ae_comp__lead_detail_form.svelte` | Custom question response editor | --- @@ -68,12 +69,14 @@ All data is cached in IndexedDB (Dexie.js) for offline use, with background API ## Data Model ### `event_exhibit` + Represents one exhibitor's presence at an event. Key fields: `event_exhibit_id`, `name`, `code` (booth #), `staff_passcode`, `priority` (paid flag), `license_max`, `license_li_json` (array of `{full_name, email, passcode}`), `leads_custom_questions_json` (array of question defs), `leads_device_sm_qty`, `leads_device_lg_qty`. ### `event_exhibit_tracking` + One captured lead — links an exhibit to a badge. Key fields: `event_exhibit_tracking_id`, `event_exhibit_id`, `event_badge_id`, `external_person_id` (capturer's email), `exhibitor_notes` (HTML), @@ -87,6 +90,7 @@ Denormalized badge fields: `event_badge_full_name`, `event_badge_email`, ## Sign-In Model Three auth levels in this module: + 1. **Aether platform auth** (manager_access / trusted_access) — full admin bypass 2. **Shared exhibit passcode** (`event_exhibit.staff_passcode`) — grants booth management access 3. **Licensed user** (email + passcode from `license_li_json`) — grants lead capture access @@ -102,6 +106,7 @@ Scanner reads this, checks for duplicate in IDB, loads badge info, then creates `event_exhibit_tracking` record via `events_func.create_ae_obj__exhibit_tracking`. Two scan modes (toggled per exhibit): + - **Rapid** — auto-resets after 2 seconds to scan the next person - **Qualify** — navigates to lead detail immediately to fill in notes/responses diff --git a/src/routes/events/[event_id]/(leads)/leads/+layout.svelte b/src/routes/events/[event_id]/(leads)/leads/+layout.svelte index b2612b31..8cbb02f4 100644 --- a/src/routes/events/[event_id]/(leads)/leads/+layout.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/+layout.svelte @@ -1,11 +1,10 @@ - {@render children?.()} diff --git a/src/routes/events/[event_id]/(leads)/leads/+layout.ts b/src/routes/events/[event_id]/(leads)/leads/+layout.ts index 6ee93f7a..98d058bf 100644 --- a/src/routes/events/[event_id]/(leads)/leads/+layout.ts +++ b/src/routes/events/[event_id]/(leads)/leads/+layout.ts @@ -22,4 +22,4 @@ export async function load({ params, parent }) { return { ...parent_data }; -} \ No newline at end of file +} diff --git a/src/routes/events/[event_id]/(leads)/leads/+page.svelte b/src/routes/events/[event_id]/(leads)/leads/+page.svelte index c9317307..4b3be2e9 100644 --- a/src/routes/events/[event_id]/(leads)/leads/+page.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/+page.svelte @@ -1,254 +1,258 @@
+ class="ae_events_leads_new flex h-full w-full flex-col items-center space-y-4 p-4">

Exhibitor Leads

{#if $events_sess.leads.submit_status__search === 'searching' && exhibit_id_li.length === 0}
- + class="flex flex-col items-center justify-center p-10 text-center opacity-50"> +

Searching exhibits...

{:else if $lq__event_exhibit_obj_li && $lq__event_exhibit_obj_li.length > 0}

Select your exhibit from the list

+ class="grid w-full max-w-6xl grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"> {#each $lq__event_exhibit_obj_li as exhibit_obj (exhibit_obj.event_exhibit_id)} + class="card card-hover preset-tonal flex flex-col items-center justify-center space-y-2 p-4 text-center"> -
{exhibit_obj.name}
+
{exhibit_obj.name}
Booth #{exhibit_obj.code}
@@ -256,6 +260,6 @@ {/each}
{:else} -

No exhibits found matching your search.

+

No exhibits found matching your search.

{/if}
diff --git a/src/routes/events/[event_id]/(leads)/leads/+page.ts b/src/routes/events/[event_id]/(leads)/leads/+page.ts index 75066f69..ddb66572 100644 --- a/src/routes/events/[event_id]/(leads)/leads/+page.ts +++ b/src/routes/events/[event_id]/(leads)/leads/+page.ts @@ -21,4 +21,4 @@ export async function load({ params, parent }) { } return {}; -} \ No newline at end of file +} diff --git a/src/routes/events/[event_id]/(leads)/leads/ae_comp__exhibit_search.svelte b/src/routes/events/[event_id]/(leads)/leads/ae_comp__exhibit_search.svelte index 076659f7..94b7ef9b 100644 --- a/src/routes/events/[event_id]/(leads)/leads/ae_comp__exhibit_search.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/ae_comp__exhibit_search.svelte @@ -1,44 +1,46 @@