Saving notes and things. Done for the night. Tomorrow need to work on the Leads - Manage/Config and then Leads - Sign In/Licenses/Payment

This commit is contained in:
Scott Idem
2026-02-07 19:16:41 -05:00
parent acf69c3deb
commit 356eda5ab4
6 changed files with 203 additions and 104 deletions

View File

@@ -99,102 +99,62 @@
- **Secondary:** V3 API Migration and System Health Stability.
### 🚧 Active Workstreams
- **[Leads Module V3]:** Transitioning Exhibitor Leads to V3 API and mobile-first dashboard.
- **[Hydration Optimization]:** Implemented SWR pattern and non-blocking layouts to eliminate "white page" delays.
- **[Search Hardening]:** Standardized debounced reactive search logic across Recovery Meetings, Badge Search, and Journals modules.
- **[Service Worker]:** Re-enabled registration and implemented robust asset caching.
- **[Native Bridge]:** Phase 5 AppleScript handlers for macOS (PowerPoint/Keynote).
- **[Telemetry]:** Modern dashboard in Launcher Config with visual CPU/RAM gauges.
- **[Journals Module]:** Standardized naming (`ae_comp__*`), normalized props to snake_case, and unified icons.
### 🧠 Recent Learnings & Decisions
- **V3 Search Context:** POST search for child objects (e.g. `event_exhibit_tracking`) requires explicit `for_obj_type` and `for_obj_id` query parameters to assist the backend in partitioning, otherwise it may inject incorrect legacy filters like `event_id_random`.
- **SWR Pattern:** Crucial for eliminating page load delays in Sites, Events, and Journals.
- **Debounced Search:** Replacing manual triggers and loops (like setInterval) with reactive debounced effects significantly improves UX and reduces API noise.
- **Quiet Logs:** Silenced noisy `AbortError` and `NetworkError` in background fetches to reduce noise.
- **Details Toggle:** Optimized Event Session list by deferring expensive sub-components.
- **CodeMirror Fix:** Resolved line-wrapping issues in editors.
---
---
## 3. 🧠 Short Term Memory (Session Context)
- **Status:** Session Concluded / System Stable.
- **Last Action:** Hardened Event File processing, implemented loader safety nets, and enabled verbose tracking.
- **Last Action:** Finalized V3 Leads foundations, fixed dashboard routing, and implemented booth management.
- **Key Learnings:**
- **Backend API Bug:** Identified a 400 Database Schema error in `event_exhibit_tracking` search caused by the backend incorrectly injecting legacy `event_id_random` filters. Frontend is verified clean and strictly follows base `_id` standards.
- **Nested Routing Logic:** Lead Detail routes MUST be nested under the Exhibit ID to maintain context and resolve 404 errors in the capturing workflow.
- **ID Clobbering:** The generic processor was blindly overwriting clean IDs with `null` random IDs from the API; truthy checks on `_random` variants are essential to preserve relationship integrity.
- **Loader Safety Net:** Implementing minimal, type-aware ID injection in `_refresh_file_li_background` ensures records are correctly indexed in Dexie even when the backend response is partially incomplete.
- **Relationship Sync:** Synchronizing `for_id` with specific object IDs (e.g., `event_presenter_id`) in the processor ensures UI components can reliably retrieve files using either the generic or specific keys.
- **Property Processor Hardening:** Hardened processors to prioritize base `_id` mapping to internal `id` fields, ensuring robust Dexie synchronization for string-only identifiers.
- **Accomplishments:**
- **V3 Leads Module Foundations:** Modularized `ae_events__exhibit` and `ae_events__exhibit_tracking` with V3 SWR standards and trace-ready performance logging.
- **String-Only ID Standardization:** Standardized all Lead capture and search functions to use base `_id` keys instead of the `_random` suffix dependency.
- **Event File Upload Restoration:** Fixed 422 errors in `ae_comp__event_files_upload.svelte` by identifying a backend Pydantic integer vs string mismatch and standardizing on the V3 action endpoint.
- **Leads Dashboard Orchestration:** Implemented a mobile-first, high-contrast dashboard with persistent tab navigation (Add Lead, Lead List, Manage).
- **Lead Detail Profile:** Implemented a comprehensive read-only Lead Profile view featuring custom responses and exhibitor notes.
- **Booth Management:** Implemented the Manage/Config tab using `Element_ae_crud_v2` for live-revalidating booth profile updates.
- **Relationship Integrity:** Resolved missing `event_id` and cross-contaminated IDs in `ae_events_db.file` by hardening `_process_generic_props` and the background loader.
- **UI Retrieval Fix:** Reverted `element_manage_event_file_li_direct.svelte` to robust `for_type`/`for_id` filtering and enhanced `li_all` with combined ID filters to ensure linked files show up for all objects.
- **Batch Formatting:** Finalized module-wide formatting (printWidth: 80) across Archives, Settings, and root Events components.
- **Surgical Debugging:** Enabled verbose tracking in Presenter load functions and the Event File loader to isolate data flow issues.
- **Current Blocker:** None.
- **Immediate Next Step:** Verify Bulletin Board email notifications and Recovery Meetings Zoom/Jitsi logic.
- **Current Blocker:** Backend Search Bug for `event_exhibit_tracking` (injecting `event_id_random`).
- **Immediate Next Step:** Verify Staff Sign-in workflow and License assignment logic once the search bug is resolved.
---
## 4. 📂 Reference: Directory & Whitelist
*Low-density reference data. Keep at the bottom to avoid cluttering the prompt's "hot zone".*
### 🛡️ File Whitelist
- `~/tmp`, `~/Downloads`, `~/temp`, `~/agents_sync`
### 🗺️ Standard Directory Map
- **`src/lib/ae_api/`**: API V3 standard helpers.
@@ -203,29 +163,23 @@
- **`src/lib/types/ae_types.ts`**: Unified TypeScript interfaces.
### 📦 Modules Overview
- **Core:** Identity (`accounts`, `people`, `users`), Infrastructure (`sites`, `site_domains`), Storage (`hosted_files`).
- **Feature:** Events (Badge printing, QR, Pres Mgmt), Journals (Notes, AI), IDAA (Logistics, Jitsi).
### 🔗 Resources
- **Reference Stubs:** `agents_sync/technical/references/` (Svelte 5, Dexie, FastAPI).
- **Official Docs:** [Svelte Runes](https://svelte.dev/blog/runes) | [Dexie Quick Ref](https://dexie.org/docs/API-Reference#quick-reference)
## Gemini Added Memories
- The Aether Docker environment now has a robust physical database management suite: restore_db.sh, check_and_import.sh, and export_db.sh. Password escaping issues resolved using single quotes in .env.
- Standalone DB tests in API project: Use virtual environment at 'environment/bin/python3', extract credentials from container env, and manually construct SQLAlchemy URI to bypass 'app.config' dependencies.
- Standalone DB tests in API project: Use virtual environment at 'environment/bin/python3', extract credentials from container env, and manually construct SQLAlchemy URI to bypass 'app.config' dependency issues.
- [Harden: ID Integrity] Generic object processors MUST use truthy checks when mapping `_random` variants to clean keys to prevent `null` or `undefined` values from clobbering valid linking IDs received from V3 API responses.
@@ -239,4 +193,6 @@
- The user prefers snake_case or Snake_Case over CamelCase for all naming and identifiers.
- Formatting Standard: Prettier printWidth is set to 80 to force multi-line expansion for attributes and calls.
- Formatting Standard: Prettier printWidth is set to 80 to force multi-line expansion for attributes and calls.
- The Aether API V3 search for 'event_exhibit_tracking' currently has a backend bug where it incorrectly injects a filter for 'event_id_random' instead of 'event_id', causing a 400 Database Schema error (MariaDB code 1054). The frontend is sending the correct V3 payload, but the backend mapping needs to be updated by the API agent.

View File

@@ -107,6 +107,15 @@ This is a list of tasks to be completed before the next event/show/conference.
- [x] **Compiler Error Resolution:** Fixed 40+ critical errors including duplicate attributes in multi-line tags and missing `untrack` imports in Svelte 5 effects.
- [x] **Hosted Files Modernization:** Standardized all download, link, and upload components across the platform.
## Recent Accomplishments (Feb 7, 2026)
- [x] **Exhibitor Leads V3 Core Foundations:** Modularized `ae_events__exhibit` and `ae_events__exhibit_tracking` with V3 SWR standards and trace-ready performance logging.
- [x] **String-Only ID Standardization (Phase 3):** Refactored Lead capture, search, and property processing to use base `_id` keys instead of `_random` suffixes, aligning with the backend's semantic string primary keys.
- [x] **Leads Dashboard Orchestration:** Implemented mobile-first dashboard with persistent sticky tabs for Add Lead, Lead List, and Manage.
- [x] **Lead Detail Profile:** Implemented nested routing and a comprehensive read-only Lead Profile view featuring custom responses and exhibitor notes.
- [x] **Booth Self-Service:** Implemented the Manage/Config tab using `Element_ae_crud_v2` for live-revalidating booth profile updates.
- [x] **Search Protocol Hardening:** Identified and resolved logical field mismatches in V3 POST search by correctly injecting parent context parameters.
## Recent Accomplishments (Feb 5, 2026)
- [x] **BB Creation Stabilized:** Resolved 'post_id' IntegrityErrors by correctly mapping 'post_id_random' in payloads.

View File

@@ -0,0 +1,177 @@
<script lang="ts">
/**
* src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_tab__manage.svelte
* Tab 4: Manage/Config - Exhibitor Settings and Profile.
*/
import { page } from '$app/state';
import { liveQuery } from 'dexie';
import { db_events } from '$lib/ae_events/db_events';
import { ae_api, ae_loc } from '$lib/stores/ae_stores';
import { events_func } from '$lib/ae_events_functions';
import Element_ae_crud_v2 from '$lib/elements/element_ae_crud_v2.svelte';
import {
Store,
Settings,
Lock,
Info,
MessageSquare,
CreditCard,
Key,
Users,
ChevronRight
} from 'lucide-svelte';
const exhibit_id = $derived(page.params.exhibit_id);
let lq__exhibit_obj = $derived(
liveQuery(async () => {
if (!exhibit_id) return null;
return await db_events.exhibit.get(exhibit_id);
})
);
// Track local status for specific actions
let updating = $state(false);
</script>
<div class="ae-tab-manage w-full space-y-8 animate-in fade-in slide-in-from-bottom-2 duration-300">
<!-- Section: Booth Profile -->
<section class="space-y-4">
<div class="flex items-center gap-2 border-b border-surface-500/10 pb-2">
<Store size="1.2em" class="text-primary-500" />
<h3 class="text-lg font-bold uppercase tracking-wider">Booth Profile</h3>
</div>
<div class="grid grid-cols-1 gap-6">
<!-- Name -->
<div class="card p-4 variant-soft shadow-sm">
<label class="label mb-2">
<span class="text-xs uppercase font-black opacity-40 tracking-widest">Exhibitor Name</span>
</label>
<Element_ae_crud_v2
api_cfg={$ae_api}
object_type="event_exhibit"
object_id={exhibit_id}
field_name="name"
field_type="text"
current_field_value={$lq__exhibit_obj?.name}
hide_element={false}
display_block={true}
class_li="font-bold text-xl"
/>
<p class="text-[10px] opacity-50 mt-2 italic">This name is visible to attendees when you scan their badges.</p>
</div>
<!-- Description -->
<div class="card p-4 variant-soft shadow-sm">
<label class="label mb-2">
<span class="text-xs uppercase font-black opacity-40 tracking-widest">Booth Description / Promo</span>
</label>
<Element_ae_crud_v2
api_cfg={$ae_api}
object_type="event_exhibit"
object_id={exhibit_id}
field_name="description"
field_type="textarea"
current_field_value={$lq__exhibit_obj?.description}
textarea_rows={4}
hide_element={false}
display_block={true}
class_li="text-sm"
/>
</div>
</div>
</section>
<!-- Section: Staff Access -->
<section class="space-y-4">
<div class="flex items-center gap-2 border-b border-surface-500/10 pb-2">
<Lock size="1.2em" class="text-warning-500" />
<h3 class="text-lg font-bold uppercase tracking-wider">Access & Security</h3>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<!-- Staff Passcode -->
<div class="card p-4 bg-surface-500/5 border border-surface-500/10">
<div class="flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40 tracking-widest">Staff Passcode</div>
<div class="font-mono text-xl tracking-widest font-bold">{$lq__exhibit_obj?.staff_passcode || '----'}</div>
</div>
<Key size="1.5em" class="opacity-20" />
</div>
<p class="text-[9px] opacity-40 mt-2 italic">Shared code for your team to sign in to this booth.</p>
</div>
<!-- Booth Code -->
<div class="card p-4 bg-surface-500/5 border border-surface-500/10">
<div class="flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40 tracking-widest">Booth Identifier</div>
<div class="font-mono text-xl font-bold">#{$lq__exhibit_obj?.code || 'N/A'}</div>
</div>
<Info size="1.5em" class="opacity-20" />
</div>
<p class="text-[9px] opacity-40 mt-2 italic">Official floor plan booth number.</p>
</div>
</div>
</section>
<!-- Section: Lead Settings -->
<section class="space-y-4">
<div class="flex items-center gap-2 border-b border-surface-500/10 pb-2">
<Settings size="1.2em" class="text-secondary-500" />
<h3 class="text-lg font-bold uppercase tracking-wider">Lead Retrieval Config</h3>
</div>
<div class="card p-0 divide-y divide-surface-500/10 overflow-hidden shadow-md">
<!-- Licenses -->
<div class="p-4 flex items-center justify-between hover:bg-surface-500/5 transition-colors cursor-pointer group">
<div class="flex items-center gap-4">
<div class="bg-primary-500/10 p-2 rounded-lg text-primary-500"><Users size="1.2em" /></div>
<div>
<div class="font-bold text-sm">Staff Licenses</div>
<div class="text-xs opacity-50">Active: 0 / Max: {$lq__exhibit_obj?.license_max || 1}</div>
</div>
</div>
<ChevronRight size="1.2em" class="opacity-20 group-hover:translate-x-1 transition-transform" />
</div>
<!-- Custom Questions -->
<div class="p-4 flex items-center justify-between hover:bg-surface-500/5 transition-colors cursor-pointer group">
<div class="flex items-center gap-4">
<div class="bg-secondary-500/10 p-2 rounded-lg text-secondary-500"><MessageSquare size="1.2em" /></div>
<div>
<div class="font-bold text-sm">Qualifiers & Questions</div>
<div class="text-xs opacity-50">Configure follow-up responses</div>
</div>
</div>
<ChevronRight size="1.2em" class="opacity-20 group-hover:translate-x-1 transition-transform" />
</div>
<!-- Billing -->
<div class="p-4 flex items-center justify-between hover:bg-surface-500/5 transition-colors cursor-pointer group">
<div class="flex items-center gap-4">
<div class="bg-success-500/10 p-2 rounded-lg text-success-500"><CreditCard size="1.2em" /></div>
<div>
<div class="font-bold text-sm">Billing & Upgrades</div>
<div class="text-xs opacity-50">Manage subscription and extra devices</div>
</div>
</div>
<ChevronRight size="1.2em" class="opacity-20 group-hover:translate-x-1 transition-transform" />
</div>
</div>
</section>
<!-- Help Footer -->
<div class="pt-10 pb-20 text-center space-y-2 opacity-40">
<p class="text-xs">Exhibitor Management Module v3.0</p>
<p class="text-[10px] font-mono">Exhibit ID: {$lq__exhibit_obj?.event_exhibit_id}</p>
</div>
</div>
<style lang="postcss">
/* Custom tab styles if needed */
</style>

View File

@@ -1,7 +0,0 @@
<script lang="ts">
// Page for viewing/editing a single lead
</script>
<h1 class="h1">Lead Details</h1>
<p>This page will show the details for a single lead. A Lead is actually in the event_exhibit_tracking table in the MariaDB or exhibit_tracking table in the Indexed DB ae_events_db.</p>

View File

@@ -1,25 +0,0 @@
/**
* src/routes/events/[event_id]/(leads)/leads/lead/[exhibit_tracking_id]/+page.ts
* Lead Detail Page Loader.
* Responsible for loading a single exhibit tracking record and its associated badge data.
*/
import { browser } from '$app/environment';
import { events_func } from '$lib/ae_events_functions';
export async function load({ params, parent }) {
const parent_data = await parent();
const account_id = parent_data.account_id;
const ae_acct = parent_data[account_id];
const exhibit_tracking_id = params.exhibit_tracking_id;
if (browser && exhibit_tracking_id) {
// Refresh the specific Lead (Tracking) object
events_func.load_ae_obj_id__exhibit_tracking({
api_cfg: ae_acct.api,
exhibit_tracking_id: exhibit_tracking_id,
log_lvl: 0
});
}
return {};
}

View File

@@ -1,11 +0,0 @@
<script lang="ts">
/**
* src/routes/events/[event_id]/(leads)/leads/lead/[exhibit_tracking_id]/ae_comp__lead_detail_form.svelte
* Lead Detail Form Stub.
*/
</script>
<div class="lead-detail-form p-4 card">
<h3 class="h3">Lead Details</h3>
<p>Placeholder for qualifiers and notes.</p>
</div>