Full implementation of ae_comp__exhibit_payment.svelte (was a 9-line stub).
Reads Stripe config from $ae_loc.site_cfg_json per-event. License tier
selector (1/3/6/10 users) uses {#key} remount pattern to work around
stripe-buy-button web component ignoring attribute changes after mount.
Three states: paid confirmation (priority=true), not-configured hint, payment
form. client_reference_id=exhibit_id ties payments to booth records.
TypeScript declaration for stripe-buy-button added to app.d.ts via
svelte/elements augmentation. exhibit_id prop wired in +page.svelte and
ae_tab__manage.svelte.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
14 KiB
Frontend Agent Task List
Use this file to track steps for complex features or bug fixes. Status: Stable — ongoing development.
🚧 Upcoming High Priority
[Stores] Refactor — Phase 2c (deferred)
Phases 1, 2a, 2b are complete (see ✅ Completed below). One phase remaining:
- Phase 2c — Actual separate stores (
ae_auth,ae_app): Requires touching ~471$ae_loc.*auth-field read sites across 150+ files. Deferred until a Svelte runes migration of the store layer itself (touching every component anyway makes the callsite sweep cheap).
[Backend] Join event_location_id onto event_presenter API view
The event_presenter object currently has event_session_id but not event_location_id.
When navigating from the Presenter View to the Launcher, the frontend has to do a secondary
session lookup to discover the location (magic redirect in launcher base +page.svelte).
Joining event_session.event_location_id into the presenter view/response would let the
frontend pass the location directly in the Launcher URL without the extra lookup.
- Backend: add
event_location_id(andevent_location_id_random) to theevent_presenterview or API response - Frontend: add
event_location_idtoae_EventPresentertype andproperties_to_save; pass asevents__launcher_idinpresenter_page_menu.svelte
[Launcher] Active features (identified 2026-03-06)
-
Font size cycler (Launcher sidebar): Font size cycler and light/dark toggle added to new
menu_launcher_controls.sveltecomponent; wired intolauncher_menu.svelte. Visibility toggles (All Files / All Sessions) moved to same component and restyled topreset-tonal-tertiary. (2026-03-11) -
Minor Svelte warning:
slct_event_location_idinmenu_location_list.svelte— prop already has$bindable(null); stale comment in file updated. (2026-03-11)
[Svelte] State reference warnings
svelte-checkfully clean — 0 errors, 0 warnings. All 42state_referenced_locallywarnings fixed (2026-03-11). CSS@apply/@referencewarnings inae_idaa_comp__event_obj_id_edit.sveltealso resolved — Tailwind utilities inlined,<style>block removed. (2026-03-16)
[Badges] Remaining badge work before first live event
- Badge print controls UX polish: Scott has improvements in mind — TBD next session.
File:
ae_comp__badge_print_controls.svelte.
[Badges] Zebra ZC10L Hardware Testing
- Hardware test day complete. Real-world badge printing tested on Zebra ZC10L. Driver installed, test data set up, print verified. (2026-03-27)
[Leads] Exhibitor Lead Scanning — IN PROGRESS (demo-ready prep)
Module is substantially built as a PWA (no Electron). Core flow works end-to-end.
Spec: documentation/PROJECT__AE_Events_Exhibitor_Leads_v3.md and _detail.md.
Full audit: src/routes/events/[event_id]/(leads)/ and src/lib/ae_events/ae_events__exhibit*.ts.
What's working:
- Exhibit search/landing (
/leads/) — SWR, local + API search, sort - Exhibit detail page — 4-tab layout, sticky header with Add/List toggle, auto-refresh timer
- Tab 1 (Start): sign-in via shared passcode OR licensed user (email + passcode)
- Tab 2 (Add): QR scan (confirm mode — replaced rapid/qualify) + manual badge search; duplicate/re-enable detection on both
- Tab 3 (List): SWR lead list, licensee filter (All / My Leads), sort options, export button
- Tab 4 (Manage): admin tools, booth profile edit, passcode, license mgmt, custom questions config, app settings (refresh interval, clear IDB/localStorage, reload)
- Lead detail page: view/edit custom question responses, exhibitor notes (TipTap), priority/enable flags
- Export wired to V3 action endpoint
/v3/action/event_exhibit/{id}/tracking_export(CSV/XLSX)
Remaining before demo:
- Export endpoint — V3 action endpoint confirmed live on backend (2026-03-16). Returns 403 if
leads_api_accessis not enabled on the exhibit — expected behavior. Export button now gated in UI: only renders when$lq__exhibit_obj?.leads_api_access === true. Enable via:PATCH /v3/crud/event_exhibit/{id}with{ "leads_api_access": true }. allow_trackinggate — implemented (2026-03-16). QR scanner shows a warning card and blocks the add. Manual search shows a ShieldOff "Opt-Out" badge per row and guardsadd_as_lead. Opt-in model:allow_trackingmust be explicitlytrueon the badge. Also addedallow_trackingandagree_to_tctoae_EventBadgeinae_types.ts. Demo note: ensure test badges haveallow_tracking = trueor no one can be added.- Payment component —
ae_comp__exhibit_payment.sveltefully implemented (2026-03-27). Reads Stripe config from$ae_loc.site_cfg_json(stripe_publishable_key,stripe_btn_1/3/6/10_license). License tier selector (1/3/6/10 users) with{#key}remount pattern for Stripe web component. 3 states: paid confirmation (priority=true), admin setup hint / "contact organizer" (no Stripe config), payment form.client_reference_id=exhibit_id. TypeScript declaration inapp.d.ts. Stripe keys verified visible in$ae_loc.site_cfg_jsonon dev/demo site. Keys need validity check in Stripe dashboard. - End-to-end smoke test — sign in with shared passcode, scan/search a badge, add a lead, view detail, add notes/responses, export CSV; verify on mobile (Chrome/Safari PWA)
- Install prompt — PWA install nudge implemented (2026-03-16).
pwa_install.svelte.tssingleton capturesbeforeinstallprompt(Chrome/Android/desktop) and detects iOS Safari for manual "Share → Add to Home Screen" instructions. Reusableelement_pwa_install_prompt.svelteplaced on the Leads Start tab between the feature grid and sign-in.pwa_install.init()wired into root+layout.svelte; dismiss persists 7 days via localStorage. svelte-check: 0 errors.
[DevOps] Remaining deployment items
- Wire AE_APP_REPLICAS:
docker-compose.ymlline 147 already hasscale: ${AE_APP_REPLICAS:-1}. (verified 2026-03-11) - Archive ae_env_node_app: Archived as tar.gz under
~/OSIT_dev/backups/; old history/docs moved to~/OSIT_dev/for_reference_only/. (2026-03-11) - Build Optimization: Current state finalized. Local Gitea instance stood up at
git.dgrzone.com(Docker, home server) — future: migrate repos from Bitbucket, verify Backblaze/restic backups cover Gitea data. (2026-03-11) - Remote deploy script:
aether_container_env/deploy.sh— SSH-triggered from workstation vianpm run deploy:remote:test/prod. Handles git pull (ff-only) + docker build + restart. Tested and working on test env. (2026-03-25) .env.defaultcleanup: Removed 16 dead variables, added missingAE_NETWORK_NAME/CONTAINER_DOZZLE/AE_DOZZLE_PORT, parameterized all container names (CONTAINER_MARIADB,CONTAINER_PMA,CONTAINER_AE_OPS) with:-defaultfallbacks in compose. ("Dozzle" = log viewer container.) (2026-03-26)- Prod deploy: Run
npm run deploy:remote:prod(off-peak). Prerequisites: both repos pushed to Bitbucket ✓; verify.env.prodexists in/srv/apps/prod_aether_app_sveltekit/on Linode before running. - Bitbucket → SSH migration: Switched all three repos (
aether_app_sveltekit,aether_container_env,aether_api_fastapi) to SSH remotes (git@bitbucket.org) on workstation. App passwords deprecated — SSH unaffected. (2026-03-27) - Branch strategy cleanup: All environments (test, prod, bak) currently pull from same branches.
deploy.shdefaults areae_app_3x_llm/development— acceptable for now but should establish proper branch separation (e.g.main/masterfor prod). - Tier 2 deploy (Gitea webhook): Push-triggered deploys via Gitea webhook → listener on Linode →
deploy.sh. Deferred until Gitea usage is more established.
[General]
- Temp Cleanup:
cleanup_tmp_fileswired inlauncher_background_sync.svelte; called at launcher startup. Confirmed working. (2026-03-11) window.print()for badge print button: Wired inae_comp__badge_print_controls.svelte— increments count, fireswindow.print(), redirects to badge search. (done)- Input Field Audit: Several input fields are missing
name/idattributes ordata-testid. Known examples: badge override fields inae_comp__badge_obj_view.svelte; template name input inae_comp__badge_template_form.svelte. Matters for: accessibility, autofill, label associations, and test targeting. (For tests, usegetByLabel()rather thaninput[value*=...]which only checks the HTML attribute, not the Svelte-bound DOM property.)
✅ Completed (2026-03)
- [Stores] Phase 1 — Dead code cleanup (
ae_stores.ts,ae_events_stores.ts,ae_idaa_stores.ts): removedver_idb, stale comments,console.loglines, Stripe button block (zero consumers), personal Novi UUIDs, dead alternatives. Net: −202 lines across 3 files. svelte-check: 0 errors. (2026-03-16) - [Stores] Phase 2a — Split defaults into domain sub-files:
ae_stores__auth_loc_defaults.ts;ae_events_stores__badges/launcher/leads/pres_mgmt_defaults.ts. Spread-merged back into store structs — zero consumer changes. (2026-03-16) - [Stores] Phase 2b — TypeScript interfaces for defaults sub-files:
SiteCfgJson,AePerson,AeUser,AccessType,AuthLocState;BadgesLocState/SessState;SectionState,LauncherLocState/SessState;LeadsLocState/SessState,TmpLicense;PresMgmtLocState/SessState. svelte-check: 0 errors. (2026-03-16) - [UI] Style Review Phase 1 & 2 complete — all non-frozen, non-IDAA routes migrated: FA→Lucide (events, pres_mgmt, core, badges, leads, hosted_files),
variant-*→preset-*(all modules),code_to_htmlbadge dict refactored to Lucide component map, FA CDN scoped to IDAA layout, globalsvg.lucide { display: inline }CSS rule added to fix icon inline flow. Seedocumentation/PROJECT__AE_Style_Review.md. (2026-03-16) - [UI] Pres Mgmt Phase 3 — FA→Lucide icon migration across all 24 pres_mgmt files. (2026-03-16)
- [IDAA]
ae_idaa_comp__event_obj_id_edit.svelte— inlined Tailwind utilities, removed<style>block; eliminated all 23@apply/@referencesvelte-check warnings. (2026-03-16) - [Badges] Badge print page svelte-check fix: extracted print CSS to
static/ae-print-badge.css; fixed unclosed<script>tag inprint/+page.svelte. (2026-03-16) - [Svelte/Tests] svelte-check cleanup: fixed
select_ref_badge_type$state()declaration; two<svelte:component>deprecations in launcher components;page.evaluate()two-arg pattern inbadge_print_layout.test.ts. (2026-03-16) - [Launcher] Hosted file download button
require_authprop — addedrequire_auth?: boolean(defaulttrue) toae_comp__hosted_files_download_button.svelte; all existing consumers unchanged. Launcherlauncher_file_cont.sveltepassesrequire_auth={false}so unauthenticated kiosk users can open/download files without being blocked. (2026-03-16) - [Security]
PUBLIC_AE_API_SECRET_KEYaudit complete. Key isPUBLIC_*by design (always in client bundle). Highest-risk anonymous path uses limited-permissionPUBLIC_AE_BOOTSTRAP_KEY. Full server-side migration not justified given JWT + account_id auth layers. Current state acceptable. (2026-03-11) - [UX] Session Expired banner —
ae_auth_errorstore wired to API helpers; root layout setsflag_expiredon 401/403; non-blocking dismissible banner rendered. (2026-03-12) - [UX] Access Denied UI standardized —
element_access_denied.sveltecreated;/corelayout,/events/settings, and/events/badges/reviewupdated to use it. (2026-03-12) - [Build] Rollup/Vite circular dependency warnings eliminated —
manualChunksinvite.config.tscolocates allsvelte/*internals into a singlesvelte-vendorchunk, preventingruntime.js/index-client.jssplit (~35 warnings gone). (2026-03-11) - [Refactor]
try_cacheaudit + sponsorship/event_file/hosted_file SWR alignment — removed vestigialtry_cacheparams fromgenerate_qr_code,ae_core_functionswrappers; added SWR fast/slow path to sponsorship loaders; changedevent_fileandhosted_filesingle-object loader defaults fromfalse→truefor consistency. (2026-03-11) - [DevOps] Frontend + Backend unified into single
aether_container_envDocker Compose.ae_appservice live with healthcheck, single exposed port (AE_APP_NODE_PORT), internalae_apinetworking. Deploy scripts inpackage.jsonboth target../aether_container_env/docker-compose.yml. (2026-03-10) - [DevOps]
/healthendpoint live atsrc/routes/health/+server.ts. DockerHEALTHCHECKuses it. (2026-03-10) - [UI] Dark mode
color-schemefix —html.dark/light { color-scheme }inapp.css; all native browser controls now sync to app dark mode. (2026-03-10) - [Launcher] Location select → session auto-load bug fixed via
$derived.by()liveQuery pattern. (2026-03-10) - [Svelte]
state_referenced_locallywarning fixes — 10 warnings resolved in IDAA archives/BB. (2026-03-09) - [TypeScript] Sign In/Out TS errors fixed —
user_id/person_idtyped asstring | null. (2026-03-09) - [Tests] All badge data integrity and attendee workflow Playwright tests passing. Root causes documented in
tests/README.md. (2026-03) - [Badges] Badge print controls panel, QR code, duplex wiring, review form, print button, multi-word fulltext search,
data-testidattributes. (2026-03) - [UI] Firefly Theme + Pres Mgmt Visual Redesign (5 files). (2026-03-06)
- [Docs] UI Style Guidelines + Component Patterns docs created. (2026-03-06)
- [API] V3 Lookup system integration; Event File V3 mapping;
event_sessionsearch 400-error fix. (2026-02/03) - [API] All CRUD helpers on V3
/v3/crud/...paths. (2026-02) - [Security] Purged
x-aether-api-token; fixed misplaced CORS headers; Account ID Scavenging. (2026-02) - [Security] Playwright integration tests replace
verify_jwt_logic.jssimulation tests. (2026-03) - [Framework]
AE_Obj_Field_Editor_V3with Svelte 5 Runes. CRUD v2 fully retired. (2026-03-05) - [IDAA] Bulletin Board and Recovery Meetings functionality verified. (2026-02)