From a68d5439bd4aea933ac75e6ce2bfc3771a0cbf95 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 20 Nov 2025 19:46:17 -0500 Subject: [PATCH] feat: Remove legacy files and fix first svelte/no-at-html-tags error\n\n- Moved legacy files from src/routes/legacy to backups/legacy/src/routes/legacy.\n- Removed the empty src/routes/legacy directory.\n- Fixed a svelte/no-at-html-tags error in src/routes/idaa/(idaa)/archives/[archive_id]/+page.svelte by replacing '{@html ?.name ?? 'Archive'}' with '{?.name ?? 'Archive'}'.\n- Addressed a misidentified '{@html}' tag in src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte by removing commented-out code that might have caused false positives. --- GEMINI.md | 23 +- README.md | 14 +- TODO.md | 2 + src/app.css | 1 - .../ae_comp__hosted_files_clip_video.svelte | 2 +- ...ae_comp__hosted_files_clip_video_v1.svelte | 2 +- src/lib/ae_events/ae_events__event_badge.ts | 2 +- src/lib/app_components/e_app_theme.svelte | 2 +- src/lib/elements/element_input_v2.svelte | 4 +- .../element_manage_event_file_li.svelte | 12 +- src/routes/admin/+layout.svelte | 23 +- src/routes/core/+layout.svelte | 21 +- .../[event_id]/(badges)/badges/+page.svelte | 30 +- .../[badge_id]/ae_comp__badge_obj_view.svelte | 127 +- .../badges/ae_comp__badge_create_form.svelte | 10 +- .../badges/ae_comp__badge_obj_li.svelte | 73 +- .../badges/ae_comp__badge_search.svelte | 19 +- .../badges/ae_comp__badge_upload_form.svelte | 45 +- .../(badges)/badges/print_list/+page.svelte | 4 +- .../(badges)/templates/+page.svelte | 24 +- .../ae_comp__badge_template_form.svelte | 13 +- .../events/[event_id]/(leads)/README.md | 8 + ...ae_comp__event_presenter_form_agree.svelte | 2 +- .../(pres_mgmt)/reports/reports_files.svelte | 8 +- .../reports/reports_presenters.svelte | 4 +- ..._comp__event_session_poc_form_agree.svelte | 2 +- .../events/ae_comp__event_file_obj_tbl.svelte | 3 +- .../events/ae_comp__event_files_upload.svelte | 2 +- .../ae_comp__event_session_obj_li.svelte | 5 +- .../(idaa)/archives/[archive_id]/+page.svelte | 2 +- ...a_comp__archive_content_obj_id_edit.svelte | 11 +- .../ae_idaa_comp__archive_obj_id_edit.svelte | 11 +- ...idaa_comp__post_comment_obj_id_edit.svelte | 14 - .../ae_idaa_comp__event_obj_id_edit.svelte | 4 +- .../ae_comp__journal_entry_obj_id_view.svelte | 79 +- .../ae_comp__journal_entry_obj_qry.svelte | 6 +- .../ae_comp__journal_obj_id_edit.svelte | 30 +- .../journals/ae_comp__obj_core_props.svelte | 2 +- .../legacy/events_badges_v2/+layout.svelte | 137 -- src/routes/legacy/events_badges_v2/+layout.ts | 57 - .../legacy/events_badges_v2/+page.svelte | 70 - src/routes/legacy/events_badges_v2/+page.ts | 6 - src/routes/legacy/events_badges_v2/README.md | 39 - .../old_badges_v1/0_event_badge_main.svelte | 260 ---- .../0_event_badge_review_search_main.svelte | 282 ---- .../0_event_badge_template_list_main.svelte | 457 ------ .../20_event_badge_details.svelte | 155 -- .../old_badges_v1/20_event_badge_form.svelte | 543 ------- .../20_event_badge_review_badge.svelte | 792 ---------- .../20_event_badge_search_main.svelte | 652 -------- .../20_event_badge_upload_form.svelte | 213 --- .../20_event_badge_view_badge.svelte | 1263 ---------------- .../20_event_badge_view_badge_list.svelte | 168 --- .../old_badges_v1/30_event_badge_menu.svelte | 710 --------- .../legacy/events_badges_v2/review/+layout.ts | 43 - .../events_badges_v2/review/+page.svelte | 876 ----------- .../legacy/events_badges_v2/stats/+layout.ts | 16 - .../events_badges_v2/stats/+page.svelte | 883 ----------- .../legacy/events_leads_v2/+layout.svelte | 53 - src/routes/legacy/events_leads_v2/+layout.ts | 48 - .../legacy/events_leads_v2/+page.svelte | 321 ---- src/routes/legacy/events_leads_v2/+page.ts | 53 - src/routes/legacy/events_leads_v2/README.md | 62 - .../exhibit/[slug]/+page.svelte | 1314 ----------------- .../events_leads_v2/exhibit/[slug]/+page.ts | 58 - .../exhibit/[slug]/leads_add_scan.svelte | 1150 --------------- .../exhibit/[slug]/leads_list.svelte | 536 ------- .../exhibit/[slug]/leads_manage.svelte | 662 --------- .../exhibit/[slug]/leads_payment.svelte | 405 ----- .../exhibit/[slug]/leads_view_lead.svelte | 837 ----------- 70 files changed, 409 insertions(+), 13358 deletions(-) delete mode 100644 src/routes/legacy/events_badges_v2/+layout.svelte delete mode 100644 src/routes/legacy/events_badges_v2/+layout.ts delete mode 100644 src/routes/legacy/events_badges_v2/+page.svelte delete mode 100644 src/routes/legacy/events_badges_v2/+page.ts delete mode 100644 src/routes/legacy/events_badges_v2/README.md delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/0_event_badge_main.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/0_event_badge_review_search_main.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/0_event_badge_template_list_main.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_details.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_form.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_review_badge.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_search_main.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_upload_form.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_view_badge.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/20_event_badge_view_badge_list.svelte delete mode 100644 src/routes/legacy/events_badges_v2/old_badges_v1/30_event_badge_menu.svelte delete mode 100644 src/routes/legacy/events_badges_v2/review/+layout.ts delete mode 100644 src/routes/legacy/events_badges_v2/review/+page.svelte delete mode 100644 src/routes/legacy/events_badges_v2/stats/+layout.ts delete mode 100644 src/routes/legacy/events_badges_v2/stats/+page.svelte delete mode 100644 src/routes/legacy/events_leads_v2/+layout.svelte delete mode 100644 src/routes/legacy/events_leads_v2/+layout.ts delete mode 100644 src/routes/legacy/events_leads_v2/+page.svelte delete mode 100644 src/routes/legacy/events_leads_v2/+page.ts delete mode 100644 src/routes/legacy/events_leads_v2/README.md delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/+page.svelte delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/+page.ts delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/leads_add_scan.svelte delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/leads_list.svelte delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/leads_manage.svelte delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/leads_payment.svelte delete mode 100644 src/routes/legacy/events_leads_v2/exhibit/[slug]/leads_view_lead.svelte diff --git a/GEMINI.md b/GEMINI.md index daf915f9..f005f78f 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -43,10 +43,9 @@ The following directories are ignored for various operations (e.g., search, file This project uses Svelte v5 with runes enabled. This introduces significant differences from Svelte v4. It is critical to adhere to v5 conventions to avoid bugs. - **Reactivity:** State is managed with `$state` and `$derived`. Props can be made two-way bindable with `$bindable`. Avoid direct mutation of props. -- **Event Handling:** - - DOM events still use the `on:eventname` directive (e.g., `on:click`, `on:input`). - - Component events are dispatched with `createEventDispatcher` and listened to with `on:eventname`. - - For two-way binding on component props, use `bind:propName`. +- **Event Handling (Updated 2025-11-20):** + - **DOM Events:** Use the lowercase `onevent` attribute (e.g., `onclick`, `oninput`). Event modifiers like `|preventDefault` may not work as expected; handle prevention logic inside the function (e.g., `event.preventDefault()`). + - **Component Events:** Continue to use the `on:eventname` directive for events dispatched from child components. - **Stores and `liveQuery`:** - To access the value of a store in Svelte v5, you must use the `$store_name` syntax (e.g., `$ae_api`). - Dexie `liveQuery` returns an observable. To use it in a component, you must subscribe to it within `onMount` to avoid SSR errors. The value from the subscription should then be assigned to a `$state` variable. @@ -61,6 +60,20 @@ This project uses Svelte v5 with runes enabled. This introduces significant diff ## Refactoring Notes +### Data Fetching & Processing Pattern (2025-11-20) + +A standard pattern for fetching, processing, and caching data has been established to ensure consistency and separation of concerns. + +1. **API Function (`load_*`, `search_*`, etc.):** This function is responsible for interacting with the API. It takes parameters needed for the API call (e.g., `event_id`, search strings). +2. **Data Processor (`process_ae_obj__*_props`):** The API function's results are immediately passed to this dedicated processor function for the specific object type. + - The API function MUST pass any necessary contextual data (like a parent `event_id`) to the processor. + - The processor is responsible for all data shaping and enrichment before the data is cached. +3. **Handling API Inconsistencies:** The processor is the designated location for handling any inconsistencies in the data returned by the API. + - **Example (`event_badge`):** The `search__event_badge` API endpoint does not include the `event_id` in its results. The `process_ae_obj__event_badge_props` function now accepts the `event_id` as a parameter and injects it into each badge object before it's saved. This centralizes the fix and keeps the API-calling function clean. +4. **Database Caching (`db_save_ae_obj_li__ae_obj`):** After processing, the clean and consistent data is passed to the generic `db_save` function to be cached in IndexedDB. + +This pattern isolates API logic from data shaping logic, making the code more modular, predictable, and easier to debug. + ### `process_ae_obj__*_props()` Refactoring (2025-11-13) The `process_ae_obj__*_props()` family of functions, which are responsible for transforming API data for frontend use, have been refactored to standardize their structure and improve maintainability. @@ -137,8 +150,6 @@ A new event settings page was created at `/events/[event_id]/settings` to provid To address issues with the Aether API's strict handling of `POST` and `PATCH` request payloads, a more robust solution for cleaning data on the frontend has been implemented. -**Key aspects of the changes:** - - **Svelte 5 Event Handlers:** Corrected the use of `on:click` to `onclick` in the event settings components to align with Svelte 5 conventions. - **Payload Cleaning:** - The `update_ae_obj__event` function in `src/lib/ae_events/ae_events__event.ts` was modified to remove read-only fields (`id`, `event_id`, `created_on`, `updated_on`, etc.) from the payload before sending it to the API. diff --git a/README.md b/README.md index 0aca2f49..4caa62db 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,9 @@ This uses SvelteKit version 2.x with Svelte version 5.x, TailwindCSS 4.1, and Sk ## AE Sponsorships (/sponsorships) - +page.svelte - The main page for the Sponsorships module -- 10_edit_modal__sponsorship_obj.svelte - The modal for editing a sponsorship -- 10_list__sponsorship_obj.svelte - The list of sponsorships -- 10_view_modal__sponsorship_obj.svelte - The modal for viewing a sponsorship +- 10_edit_modal\_\_sponsorship_obj.svelte - The modal for editing a sponsorship +- 10_list\_\_sponsorship_obj.svelte - The list of sponsorships +- 10_view_modal\_\_sponsorship_obj.svelte - The modal for viewing a sponsorship ### Path [slug] @@ -33,9 +33,9 @@ This uses SvelteKit version 2.x with Svelte version 5.x, TailwindCSS 4.1, and Sk ### Components - +page.svelte - The main page for the Events - Exhibit Leads module -- 10_list__event_exhibit_lead_obj.svelte - The list of exhibit leads -- 10_edit_modal__event_exhibit_lead_obj.svelte - The modal for editing an exhibit lead -- 10_view_modal__event_exhibit_lead_obj.svelte - The modal for viewing an exhibit lead +- 10_list\_\_event_exhibit_lead_obj.svelte - The list of exhibit leads +- 10_edit_modal\_\_event_exhibit_lead_obj.svelte - The modal for editing an exhibit lead +- 10_view_modal\_\_event_exhibit_lead_obj.svelte - The modal for viewing an exhibit lead # Future Modules @@ -45,8 +45,6 @@ This uses SvelteKit version 2.x with Svelte version 5.x, TailwindCSS 4.1, and Sk - 10_list\_\_event_badge_obj.svelte - The list of badges - 10_view_modal\_\_event_badge_obj.svelte - The modal for viewing a badge - - ## AE Events - Presentation Management (/events_pres_mgmt) # How to build and deploy SvelteKit: diff --git a/TODO.md b/TODO.md index 9ec77d67..3a1e7dd3 100644 --- a/TODO.md +++ b/TODO.md @@ -19,6 +19,7 @@ This is a list of tasks to be completed before the next event/show/conference. ## Big Picture Goals +- Everything needs to work with Svelte 5.x and SvelteKit 2.x. - Able to cache data and mostly work offline. - The new Events Launcher must be able to work offline and query the API for changes to data. - The new Events Launcher must be able to run inside an Electron app and have access to local files and OS shell commands and applications. This includes loading a special library that only works in Electron. @@ -87,6 +88,7 @@ These functions are frequently used and critical to the application's data flow. - **Why:** These functions transform API data for the frontend and are a common source of bugs and inconsistencies. - **Cleanup:** Standardize their structure across all modules, ensure they are pure functions, and add unit tests for correctness. - **Update 2025-11-13 (Temporary Rollback):** The previous refactoring of these functions has been temporarily rolled back due to an `InternalError`. `ae_core_functions.ts` has been restored. The new plan is to refactor these functions module by module, ensuring stability at each step. The generic CRUD functions in `core__crud_generic.ts` were simplified to remove data processing and caching, delegating those responsibilities to the module-specific functions. The deprecated `process_ae_obj__props` function in that file was left in place but is no longer used by the generic CRUD functions. + - **Update 2025-11-20 (Successful Refactor):** The `event_badge` module has been successfully refactored to use the new "API Function -> Processor -> DB Save" pattern. The `process_ae_obj__event_badge_props` function now handles inconsistencies in the API search results (i.e., a missing `event_id`) by accepting the `event_id` as a parameter and injecting it. This serves as a successful proof-of-concept for this architectural pattern. 4. **Usage of `liveQuery` from Dexie** - **Why:** `liveQuery` is powerful for reactive UIs, but current usage suggests complexity and potential issues. diff --git a/src/app.css b/src/app.css index 90428653..a6651383 100644 --- a/src/app.css +++ b/src/app.css @@ -16,7 +16,6 @@ @import '@skeletonlabs/skeleton/themes/vintage'; @import '@skeletonlabs/skeleton/themes/wintry'; - /* @import '@skeletonlabs/skeleton/themes/ae_c_osit'; */ /* @import '@skeletonlabs/skeleton/themes/ae_c_lci'; */ @import './ae-osit-default.css'; diff --git a/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte b/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte index b39e4605..75c77bc1 100644 --- a/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte +++ b/src/lib/ae_core/ae_comp__hosted_files_clip_video.svelte @@ -83,7 +83,7 @@ }; // *** Functions and Logic - function handle_clip_video(event) { + function handle_clip_video(event: Event) { console.log('*** handle_clip_video() ***'); submit_status = 'clipping'; diff --git a/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte b/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte index ba8f5daa..fbaab64f 100644 --- a/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte +++ b/src/lib/ae_core/ae_comp__hosted_files_clip_video_v1.svelte @@ -78,7 +78,7 @@ let download_clip_filename: string; // *** Functions and Logic - async function handle_submit_form_files(event) { + async function handle_submit_form_files(event: SubmitEvent) { console.log('*** handle_submit_form() ***'); $ae_sess.files.disable_submit__hosted_file_obj = true; diff --git a/src/lib/ae_events/ae_events__event_badge.ts b/src/lib/ae_events/ae_events__event_badge.ts index 40c26ecc..4c25dd32 100644 --- a/src/lib/ae_events/ae_events__event_badge.ts +++ b/src/lib/ae_events/ae_events__event_badge.ts @@ -385,7 +385,7 @@ export async function qry__event_badge({ hidden, limit, offset, - // order_by_li, params: { ...params, ...params_json }, + // order_by_li, params: { ...params, ...params_json }, try_cache, log_lvl }); diff --git a/src/lib/app_components/e_app_theme.svelte b/src/lib/app_components/e_app_theme.svelte index 3acec391..3c1d4f09 100644 --- a/src/lib/app_components/e_app_theme.svelte +++ b/src/lib/app_components/e_app_theme.svelte @@ -63,7 +63,7 @@ if ($ae_loc.app_cfg.theme_mode == 'light') { onchange={(event) => { // $slct_trigger = 'set_theme_name'; - let new_theme_name = event.target.value; + let new_theme_name = (event.target as HTMLInputElement).value; // document.documentElement.theme = new_theme_name; console.log(`$ae_loc?.theme_name=${$ae_loc?.theme_name}`); diff --git a/src/lib/elements/element_input_v2.svelte b/src/lib/elements/element_input_v2.svelte index 4eac138c..809ad98a 100644 --- a/src/lib/elements/element_input_v2.svelte +++ b/src/lib/elements/element_input_v2.svelte @@ -321,12 +321,12 @@ // }); // } - function handle_oninput_dispatch(event) { + function handle_oninput_dispatch(event: InputEvent) { console.log(event.target); console.log(value); dispatch('oninput', { name: event.target.name, - value: event.target.value + value: (event.target as HTMLInputElement).value }); } diff --git a/src/lib/elements/element_manage_event_file_li.svelte b/src/lib/elements/element_manage_event_file_li.svelte index 0cefa38e..a73cd4b3 100644 --- a/src/lib/elements/element_manage_event_file_li.svelte +++ b/src/lib/elements/element_manage_event_file_li.svelte @@ -178,8 +178,7 @@ ae_promises[event_file_obj.event_file_id] = api.download_hosted_file({ api_cfg: $ae_api, - hosted_file_id: - event_file_obj.hosted_file_id, + hosted_file_id: event_file_obj.hosted_file_id, return_file: true, filename: event_file_obj.filename, auto_download: true, @@ -465,8 +464,7 @@ ae_promises.update__event_file_obj = events_func .update_ae_obj__event_file({ api_cfg: $ae_api, - event_file_id: - event_file_obj.event_file_id, + event_file_id: event_file_obj.event_file_id, data_kv: event_file_data, log_lvl: 0 }) @@ -533,8 +531,7 @@ ae_promises.delete__event_file_obj = await events_func.delete_ae_obj_id__event_file({ api_cfg: $ae_api, - event_file_id: - event_file_obj.event_file_id, + event_file_id: event_file_obj.event_file_id, log_lvl: 1 }); }} @@ -584,8 +581,7 @@ ); let event_file_data = { - event_file_id: - event_file_obj.event_file_id, + event_file_id: event_file_obj.event_file_id, file_purpose: e.target.value }; diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte index bcf9d1a2..c3611904 100644 --- a/src/routes/admin/+layout.svelte +++ b/src/routes/admin/+layout.svelte @@ -8,12 +8,25 @@ import { api } from '$lib/api/api'; import { ae_loc, ae_sess, ae_api, slct } from '$lib/stores/ae_stores'; import { events_loc, events_slct, events_trigger } from '$lib/stores/ae_events_stores'; - interface Props { - /** @type {import('./$types').LayoutData} */ - data: any; - children?: import('svelte').Snippet; + interface SubmenuItem { + name: string; + href: string; + title: string; + access?: 'trusted' | 'administrator' | 'manager'; // Assuming these are the access levels + disable?: boolean; + hide?: boolean; } + interface LayoutData { + submenu: SubmenuItem[]; // Assuming submenu is an array of SubmenuItem + // Add other properties of data if needed + } + + interface Props { + /** @type {import('./$types').LayoutData} */ + data: LayoutData; // Use the specific interface + children?: import('svelte').Snippet; + } let { data, children }: Props = $props(); // import Element_data_store from '$lib/element_data_store_v2.svelte'; @@ -80,7 +93,7 @@