From 2db2aba6f9fb2580d1b12619cf85e1669359163a Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 16 Jan 2026 13:59:51 -0500 Subject: [PATCH] feat(launcher): improve Events Presentation Launcher stability and data flow - Standardized ID usage: Migrated multiple components from '_random' variants to standard 'id' properties to align with V3 backend and Dexie patterns. - Electron Integration: Added global 'native_app' declaration and Window interface augmentation in app.d.ts to resolve TypeScript errors. - Type Safety: Enhanced ae_EventSession interface with missing 'event_file_li' and added runtime null checks in session loading logic. - UI/UX: Restored missing launcher components in location-specific pages and fixed LiveQuery filter logic for session lists. - Bug Fixes: Resolved indexing errors in location list and corrected store update patterns in layout. --- src/app.d.ts | 7 +++ src/lib/stores/ae_events_stores.ts | 2 +- src/lib/types/ae_types.ts | 1 + .../(launcher)/launcher/+layout.svelte | 45 ++++++++++--------- .../launcher/[event_location_id]/+page.svelte | 21 +++++---- .../launcher/[event_location_id]/+page.ts | 4 +- .../(launcher)/launcher_file_cont.svelte | 30 ++++++------- .../(launcher)/launcher_menu.svelte | 4 +- .../(launcher)/launcher_presenter_view.svelte | 6 +-- .../launcher_presenter_view_posters.svelte | 6 +-- .../(launcher)/launcher_session_view.svelte | 26 +++++------ .../(launcher)/menu_location_list.svelte | 6 +-- .../(launcher)/menu_session_list.svelte | 10 +++-- 13 files changed, 93 insertions(+), 75 deletions(-) diff --git a/src/app.d.ts b/src/app.d.ts index 982c6b29..a66acedd 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -14,4 +14,11 @@ declare global { namespace App { interface Platform {} } + + interface Window { + native_app: any; + } + + // eslint-disable-next-line no-var + var native_app: any; } diff --git a/src/lib/stores/ae_events_stores.ts b/src/lib/stores/ae_events_stores.ts index 256a0c9e..54249a15 100644 --- a/src/lib/stores/ae_events_stores.ts +++ b/src/lib/stores/ae_events_stores.ts @@ -121,7 +121,7 @@ const events_local_data_struct: key_val = { qry_limit__sessions: 50, hide__launcher_header: false, - hide__launcher_menu: true, + hide__launcher_menu: false, hide__launcher_footer: false, hide__modal_header_title: false, diff --git a/src/lib/types/ae_types.ts b/src/lib/types/ae_types.ts index 23a0c1ef..331dead5 100644 --- a/src/lib/types/ae_types.ts +++ b/src/lib/types/ae_types.ts @@ -554,6 +554,7 @@ export interface ae_EventSession extends ae_BaseObj { // Joined fields event_presentation_li?: ae_EventPresentation[]; + event_file_li?: ae_EventFile[]; } /** diff --git a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte index ac8b4b48..2028e1f8 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte @@ -197,7 +197,7 @@ let lq__event_event_file_obj_li = $derived( liveQuery(async () => { let results = await db_events.file - .where('for_id_random') + .where('for_id') .equals($events_slct.event_id ?? '') .sortBy('filename'); @@ -209,8 +209,8 @@ let lq__location_event_file_obj_li = $derived( liveQuery(async () => { let results = await db_events.file - // .where('event_location_id_random') - .where('for_id_random') + // .where('event_location_id') + .where('for_id') .equals($events_slct.event_location_id ?? '') .sortBy('filename'); @@ -249,7 +249,7 @@ // let lq__event_session_obj_li = $derived(liveQuery(async () => { // let results = await db_events.session - // // .bulkGet(event_session_id_random_li); + // // .bulkGet(event_session_id_li); // .where('event_location_id') // .equals($events_slct.event_location_id) // .sortBy('name'); @@ -303,15 +303,15 @@ // console.log(`LQ - Using $events_sess.session_li to get event sessions.`); // } // // $events_sess.session_li_trigger = false; - // let event_session_id_random_li = []; // This is to prevent the array from constantly updating and triggering the liveQuery. + // let event_session_id_li = []; // This is to prevent the array from constantly updating and triggering the liveQuery. // for (let i = 0; i < $events_sess?.session_li.length; i++) { // let event_session_obj = $events_sess?.session_li[i]; - // let event_session_id_random = event_session_obj.event_session_id_random; - // event_session_id_random_li.push(event_session_id_random); + // let event_session_id = event_session_obj.event_session_id; + // event_session_id_li.push(event_session_id); // } - // // let event_session_id_random_li = tmp_li; + // // let event_session_id_li = tmp_li; // results = await db_events.session - // .bulkGet(event_session_id_random_li); + // .bulkGet(event_session_id_li); // } else if ($lq__event_obj?.cfg_json?.session_group_sort === 'DESC') { // if (log_lvl) { // console.log(`LQ - Using DESC sort for Event Session list event_id: ${$events_slct?.event_id}`); @@ -357,7 +357,7 @@ $events_slct.event_session_obj_li && JSON.stringify($events_slct.event_session_obj_li) !== JSON.stringify(results) ) { - $events_slct.event_session_obj_li = [...results]; + $events_slct.event_session_obj_li = [...(results || [])]; if (log_lvl) { console.log( `Session slct li stored version has changed for ID = ${$events_slct.event_id}`, @@ -537,7 +537,7 @@ $events_sess.launcher.modal__open_event_file_id = $events_slct.event_file_id; // $events_sess.launcher.modal__event_file_obj = event_file_obj; - // $events_sess.launcher.modal__img_src = `/event/file/${event_file_obj.event_file_id_random}/download`; + // $events_sess.launcher.modal__img_src = `/event/file/${event_file_obj.event_file_id}/download`; // $events_slct.event_file_obj = event_file_obj; @@ -548,7 +548,7 @@ // NOTE: This is not finished yet. // This should now trigger the Svelte component for the event launcher file container. Currently this does nothing. Need to bind to something or use the "events_sess.launcher" object? - // let as_modal_result = open_event_file_as_modal({event_file_id: event_file_obj.event_file_id_random, method: 'modal', filename: event_file_obj.filename, extension: event_file_obj.extension, modal_title: poster_title}); + // let as_modal_result = open_event_file_as_modal({event_file_id: event_file_obj.event_file_id, method: 'modal', filename: event_file_obj.filename, extension: event_file_obj.extension, modal_title: poster_title}); // if (as_modal_result) { // console.log($events_sess.launcher); // console.log(event_file_obj); @@ -666,7 +666,7 @@ async function handle_event_file_open() { let event_file_obj; - if ($events_slct.event_file_obj && $events_slct.event_file_obj.event_file_id_random) { + if ($events_slct.event_file_obj && $events_slct.event_file_obj.event_file_id) { console.log($events_slct.event_file_obj); event_file_obj = $events_slct.event_file_obj; } else { @@ -678,7 +678,7 @@ } // let as_modal_result = open_event_file_as_modal({ - // event_file_id: event_file_obj.event_file_id_random, + // event_file_id: event_file_obj.event_file_id, // filename: event_file_obj.filename, // extension: event_file_obj.extension, // modal_title: ae_util.shorten_filename(event_file_obj.filename, 75) @@ -693,11 +693,14 @@ } async function handle_event_file_close() { - let as_modal_result = close_event_file_as_modal({}); + // let as_modal_result = close_event_file_as_modal({}); - if (as_modal_result) { - events_sess.launcher.set({ ...$events_sess.launcher, ...as_modal_result }); - } + // if (as_modal_result) { + // events_sess.update(n => { + // n.launcher = { ...n.launcher, ...as_modal_result }; + // return n; + // }); + // } } if (!$events_loc.launcher.idle_timer) { @@ -765,7 +768,7 @@ Object.keys($events_loc.launcher.screen_saver_img_kv)[rand_index] ]; - $events_slct.event_file_id = event_file_obj.event_file_id_random; + $events_slct.event_file_id = event_file_obj.event_file_id; $events_slct.event_file_obj = event_file_obj; // $slct_trigger = 'event_file'; // $events_loc.launcher.event_file_open.open_status = 'open'; @@ -779,7 +782,7 @@ $events_sess.launcher.modal__open_event_file_id = $events_slct.event_file_id; $events_sess.launcher.modal__event_file_obj = event_file_obj; - // $events_sess.launcher.modal__img_src = `/event/file/${event_file_obj.event_file_id_random}/download`; + // $events_sess.launcher.modal__img_src = `/event/file/${event_file_obj.event_file_id}/download`; return true; } @@ -1411,7 +1414,7 @@ Close Remote Poster Display Only - + {#if $events_sess.launcher.modal__open_event_file_id} + + diff --git a/src/routes/events/[event_id]/(launcher)/launcher/[event_location_id]/+page.ts b/src/routes/events/[event_id]/(launcher)/launcher/[event_location_id]/+page.ts index c751039f..fd214c97 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher/[event_location_id]/+page.ts +++ b/src/routes/events/[event_id]/(launcher)/launcher/[event_location_id]/+page.ts @@ -62,8 +62,8 @@ export async function load({ params, parent, url }) { // for (let i = 0; i < load_event_session_obj_li.length; i++) { // let event_session_obj = load_event_session_obj_li[i]; - // let event_session_id_random = event_session_obj.event_session_id_random; - // tmp_li.push(event_session_id_random); + // let event_session_id = event_session_obj.event_session_id; + // tmp_li.push(event_session_id); // } // id_li__event_session = tmp_li; // console.log(`id_li__event_session:`, id_li__event_session); diff --git a/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte b/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte index 973f914c..ddddd72b 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte @@ -106,7 +106,7 @@ // let temp_obj = Object.create(event_file_obj) - // $events_loc.launcher.screen_saver_img_kv[temp_obj.event_file_id_random] = Object.create(temp_obj); + // $events_loc.launcher.screen_saver_img_kv[temp_obj.event_file_id] = Object.create(temp_obj); // $ae_event_launcher = $ae_event_launcher; } @@ -120,7 +120,7 @@ let temp_obj = Object.create(event_file_obj); - $events_loc.launcher.screen_saver_img_kv[temp_obj.event_file_id_random] = + $events_loc.launcher.screen_saver_img_kv[temp_obj.event_file_id] = Object.create(temp_obj); // $ae_event_launcher = $ae_event_launcher; @@ -166,7 +166,7 @@ // "app" mode is for Electron and node.js. // "onsite" mode is for Chrome or Firefox and downloading files with modified extensions and other slight changes. - if ($events_loc.launcher.app_mode == 'native' && native_app) { + if ($events_loc.launcher.app_mode == 'native' && window.native_app) { console.log('* ** *** **** BEGIN TESTING **** *** ** *'); console.log( 'Process: Check local hash file cache, Download hash file to cache, and Open cached hash file after copying to temp directory' @@ -178,7 +178,7 @@ open_file_status = 'checking_cache'; open_file_status_message = 'Checking local cache...'; - let check_hash_file_cache_result = await native_app.check_hash_file_cache_v2({ + let check_hash_file_cache_result = await window.native_app.check_hash_file_cache_v2({ local_file_cache_path: $events_loc.launcher.local_file_cache_path, hash: event_file_obj.hash_sha256, check_hash: true @@ -192,7 +192,7 @@ open_file_status = 'downloading_file'; open_file_status_message = 'Downloading file...'; let download_hash_file_to_cache_result = - await native_app.download_hash_file_to_cache_v2({ + await window.native_app.download_hash_file_to_cache_v2({ api_base_url: $events_loc.launcher.api.base_url, api_base_url_backup: $events_loc.launcher.api.base_url_backup, local_file_cache_path: $events_loc.launcher.local_file_cache_path, @@ -260,7 +260,7 @@ } console.log(`Opening ${filename}`); - let electron_open_hash_file_to_temp_result = await native_app.open_hash_file_to_temp_v2( + let electron_open_hash_file_to_temp_result = await window.native_app.open_hash_file_to_temp_v2( { local_file_cache_path: $events_loc.launcher.local_file_cache_path, hash: event_file_obj.hash_sha256, @@ -466,7 +466,7 @@ preset-tonal-primary border border-primary-500 min-w-96 " - title={`Open this file in a modal window:\n${event_file_obj.filename}\n[API] SHA256: ${event_file_obj.hash_sha256.slice(0, 10)}...\nHosted ID: ${event_file_obj.hosted_file_id_random} Event File ID: ${event_file_id}`} + title={`Open this file in a modal window:\n${event_file_obj.filename}\n[API] SHA256: ${event_file_obj.hash_sha256.slice(0, 10)}...\nHosted ID: ${event_file_obj.hosted_file_id} Event File ID: ${event_file_id}`} > {#if screen_saver_exts.includes(event_file_obj.extension)} @@ -535,7 +535,7 @@ // ae_promises[event_file_id] ae_promises[event_file_id] = api.download_hosted_file({ api_cfg: $ae_api, - hosted_file_id: event_file_obj.hosted_file_id_random, // +'x' + hosted_file_id: event_file_obj.hosted_file_id, // +'x' return_file: true, filename: new_filename, auto_download: true, @@ -549,9 +549,9 @@ if ($events_loc.launcher.controller == 'local_push') { console.log( - `Local Push Controller Command: ae_download:hosted_file=${event_file_obj.hosted_file_id_random}` + `Local Push Controller Command: ae_download:hosted_file=${event_file_obj.hosted_file_id}` ); - $events_sess.launcher.controller_cmd = `ae_download:hosted_file=${event_file_obj.hosted_file_id_random}:${new_filename}:${event_file_obj.extension}`; + $events_sess.launcher.controller_cmd = `ae_download:hosted_file=${event_file_obj.hosted_file_id}:${new_filename}:${event_file_obj.extension}`; $events_sess.launcher.controller_trigger_send = true; // tick(); } @@ -563,7 +563,7 @@ min-w-full w-full max-w-96 preset-tonal-primary border border-primary-500 " - title={`Download this file:\n${event_file_obj.filename}\n[API] SHA256: ${event_file_obj.hash_sha256.slice(0, 10)}...\nHosted ID: ${event_file_obj.hosted_file_id_random} Event File ID: ${event_file_id}`} + title={`Download this file:\n${event_file_obj.filename}\n[API] SHA256: ${event_file_obj.hash_sha256.slice(0, 10)}...\nHosted ID: ${event_file_obj.hosted_file_id} Event File ID: ${event_file_id}`} > {#await ae_promises[event_file_id]} @@ -571,8 +571,8 @@ Downloading - {#if $ae_sess.api_download_kv[event_file_obj.hosted_file_id_random]} - {$ae_sess.api_download_kv[event_file_obj.hosted_file_id_random] + {#if $ae_sess.api_download_kv[event_file_obj.hosted_file_id]} + {$ae_sess.api_download_kv[event_file_obj.hosted_file_id] .percent_completed}% {/if} @@ -641,7 +641,7 @@ // ae_promises[event_file_id] ae_promises[event_file_id] = api.download_hosted_file({ api_cfg: $ae_api, - hosted_file_id: event_file_obj.hosted_file_id_random, // +'x' + hosted_file_id: event_file_obj.hosted_file_id, // +'x' return_file: true, filename: event_file_obj.filename, auto_download: true, @@ -681,7 +681,7 @@ events_func.load_ae_obj_id__event_file({ api_cfg: $ae_api, - event_file_id: event_file_obj?.event_file_id_random, + event_file_id: event_file_obj?.event_file_id, log_lvl: log_lvl }); }} diff --git a/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte b/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte index 030cdb6f..98c25453 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte @@ -138,7 +138,7 @@ --> {#each $lq__event_event_file_obj_li as event_file_obj, index} {#each $lq__location_event_file_obj_li as event_file_obj, index} { let results = await db_events.file - // .where('event_session_id_random') - .where('for_id_random') + // .where('event_session_id') + .where('for_id') .equals(lq__event_presenter_obj?.event_presenter_id) .reverse() .sortBy('created_on'); @@ -93,7 +93,7 @@ event_file_obj.hide} > { let results = await db_events.file - // .where('event_session_id_random') - .where('for_id_random') + // .where('event_session_id') + .where('for_id') .equals(lq__event_presenter_obj?.event_presenter_id) .reverse() .sortBy('created_on'); @@ -92,7 +92,7 @@ event_file_obj.hide} > --> {/if} - {#if $lq__event_session_obj && $lq__event_session_obj.event_session_id_random} + {#if $lq__event_session_obj && $lq__event_session_obj.event_session_id}
@@ -323,7 +323,7 @@ >

{$lq__event_session_obj?.name}

@@ -370,7 +370,7 @@