From c9e9fbec79b1adcb4f18198dc3df32720e3bdf91 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 17 Sep 2025 15:15:50 -0400 Subject: [PATCH] Lots of work on the Launcher. Still mostly just cleaning things up. --- src/lib/ae_events/ae_events__event_session.ts | 10 +- src/lib/ae_events_stores.ts | 3 + .../(launcher)/launcher/+layout.svelte | 197 ++++++++++++++---- .../launcher/[event_location_id]/+page.ts | 3 +- .../(launcher)/launcher_menu.svelte | 7 + .../(launcher)/menu_location_list.svelte | 23 +- .../(launcher)/menu_session_list.svelte | 34 ++- 7 files changed, 219 insertions(+), 58 deletions(-) diff --git a/src/lib/ae_events/ae_events__event_session.ts b/src/lib/ae_events/ae_events__event_session.ts index 6ecc9e29..fedb3ec9 100644 --- a/src/lib/ae_events/ae_events__event_session.ts +++ b/src/lib/ae_events/ae_events__event_session.ts @@ -16,6 +16,7 @@ export async function load_ae_obj_id__event_session( api_cfg, event_session_id, inc_file_li = false, + inc_all_file_li = false, inc_presentation_li = false, inc_presenter_li = false, enabled = 'enabled', @@ -28,6 +29,7 @@ export async function load_ae_obj_id__event_session( api_cfg: any, event_session_id: string, inc_file_li?: boolean, + inc_all_file_li?: boolean, inc_presentation_li?: boolean, inc_presenter_li?: boolean, enabled?: string, @@ -137,11 +139,12 @@ export async function load_ae_obj_id__event_session( if (log_lvl) { console.log(`Need to load the presentation list for the session now`); } + // NOTE: The files will only be included if inc_all_file_li is true. 2025-09-17 let load_event_presentation_obj_li = load_ae_obj_li__event_presentation({ api_cfg: api_cfg, for_obj_type: 'event_session', for_obj_id: event_session_id, - inc_file_li: inc_file_li, + inc_file_li: inc_all_file_li, inc_presenter_li: inc_presenter_li, enabled: enabled, // all, disabled, enabled hidden: hidden, // all, hidden, not_hidden @@ -175,6 +178,7 @@ export async function load_ae_obj_li__event_session( for_obj_type, for_obj_id, inc_file_li = false, + inc_all_file_li = false, inc_presentation_li = false, inc_presenter_li = false, enabled = 'enabled', @@ -190,6 +194,7 @@ export async function load_ae_obj_li__event_session( for_obj_type: string, for_obj_id: string, inc_file_li?: boolean, + inc_all_file_li?: boolean, inc_presentation_li?: boolean, inc_presenter_li?: boolean, enabled?: string, // all, disabled, enabled @@ -316,11 +321,12 @@ export async function load_ae_obj_li__event_session( let event_session_obj = ae_promises.load__event_session_obj_li[i]; let event_session_id = event_session_obj.event_session_id_random; + // NOTE: The files will only be included if inc_all_file_li is true. 2025-09-17 let load_event_presentation_obj_li = load_ae_obj_li__event_presentation({ api_cfg: api_cfg, for_obj_type: 'event_session', for_obj_id: event_session_id, - inc_file_li: inc_file_li, + inc_file_li: inc_all_file_li, inc_presenter_li: inc_presenter_li, enabled: enabled, hidden: hidden, diff --git a/src/lib/ae_events_stores.ts b/src/lib/ae_events_stores.ts index a4ed4b5c..60731148 100644 --- a/src/lib/ae_events_stores.ts +++ b/src/lib/ae_events_stores.ts @@ -369,6 +369,9 @@ let events_session_data_struct: key_val = { native: { }, modal__open: false, + + loading__session_li_status: null, + loading__session_id_status: null, }, // Lead Retrievals (Exhibit) diff --git a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte index 455acbc4..6a8c4abd 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher/+layout.svelte @@ -2,7 +2,7 @@ let log_lvl: number = $state(1); // *** Import Svelte specific -import { onMount, tick } from 'svelte'; +// import { onMount, tick } from 'svelte'; import { goto } from '$app/navigation'; import { sineIn } from 'svelte/easing'; @@ -27,7 +27,7 @@ import { api } from '$lib/api'; import { db_events } from '$lib/ae_events/db_events'; import { ae_snip, ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger, time } from '$lib/ae_stores'; import { events_loc, events_sess, events_slct, events_trigger, events_trig } from '$lib/ae_events_stores'; -import { events_func } from '$lib/ae_events_functions'; +// import { events_func } from '$lib/ae_events_functions'; import Launcher_cfg from '../launcher_cfg.svelte'; import Launcher_menu from '../launcher_menu.svelte'; @@ -90,8 +90,30 @@ if (log_lvl > 1) { // Event let lq__event_obj = $derived(liveQuery(async () => { + if (log_lvl) { + console.log(`lq__event_obj: event_id = ${$events_slct?.event_id}`); + } + let results = await db_events.events - .get($events_slct.event_id); + .get($events_slct?.event_id ?? ''); // null or undefined does not reset things like '' does + if (log_lvl) { + console.log(`lq__event_obj: results = `, results); + } + // tmp_event_obj = { ...results }; + + // Check if results are different than the current session version stored under $events_slct + if ($events_slct.event_obj && results) { + if (JSON.stringify($events_slct.event_obj) !== JSON.stringify(results)) { + $events_slct.event_obj = { ...results}; + if (log_lvl) { + console.log(`Session slct stored version has changed for ID = ${$events_slct.event_id}`, $events_slct.event_obj); + } + } else { + if (log_lvl) { + console.log(`Session slct stored version has not changed for ID = ${$events_slct.event_id}`); + } + } + } return results; })); @@ -152,28 +174,121 @@ let lq__event_session_obj = $derived(liveQuery(async () => { // return results; // })); +// let lq__event_session_obj_li = $derived(liveQuery(async () => { +// let results = await db_events.sessions +// .where('event_location_id') +// .equals($events_slct.event_location_id) +// // .and((x) => (x.archive_on === null || x.archive_on > (new Date()).toISOString())) +// // .and((x) => (x.archive_on === null || x.archive_on > (new Date()).toISOString())) // null or future events only +// // .and((x) => (x.archive_on < (new Date()).toISOString())) // past events only +// // .and((x) => (x.archive_on > (new Date()).toISOString())) // future events only +// // .orderBy('updated_on') +// // .toArray() +// .reverse() +// // .limit($idaa_loc.bb.qry__limit) +// .sortBy('name'); +// // .sortBy('tmp_sort_1'); +// // .sortBy('updated_on'); +// // .sortBy('updated_on, created_on'); +// // .sortBy('[updated_on+created_on]'); +// // .sortBy('[created_on+updated_on]'); + +// return results; +// })); + + let lq__event_session_obj_li = $derived(liveQuery(async () => { - let results = await db_events.sessions - .where('event_location_id') - .equals($events_slct.event_location_id) - // .and((x) => (x.archive_on === null || x.archive_on > (new Date()).toISOString())) - // .and((x) => (x.archive_on === null || x.archive_on > (new Date()).toISOString())) // null or future events only - // .and((x) => (x.archive_on < (new Date()).toISOString())) // past events only - // .and((x) => (x.archive_on > (new Date()).toISOString())) // future events only - // .orderBy('updated_on') - // .toArray() - .reverse() - // .limit($idaa_loc.bb.qry__limit) - .sortBy('name'); - // .sortBy('tmp_sort_1'); - // .sortBy('updated_on'); - // .sortBy('updated_on, created_on'); - // .sortBy('[updated_on+created_on]'); - // .sortBy('[created_on+updated_on]'); + log_lvl = 1; + + if (log_lvl) { + console.log(`LQ - $lq__event_obj.cfg_json = `, $lq__event_obj?.cfg_json); + console.log(`LQ - $events_loc.filter__category_code = `, $events_loc.filter__category_code); + } + + if ($events_sess.session_li_trigger && !$events_sess?.session_li) { + $events_sess.session_li = null; + $events_sess.session_li_trigger = false; + } + + let results; + + if ($events_sess?.session_li && $events_sess?.session_li?.length) { + if (log_lvl) { + 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. + + 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_random_li = tmp_li; + + results = await db_events.sessions + .bulkGet(event_session_id_random_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}`); + // } + // results = await db_events.sessions + // // .orderBy('updated_on') + // .where('event_id') + // .equals($events_slct?.event_id ?? '') // null or undefined does not reset things like '' does + // .reverse() + // // .sortBy('tmp_sort_2'); + // .sortBy('updated_on'); + // // .sortBy('title'); + + // } else if ($events_loc.filter__category_code && $events_loc.filter__category_code.length > 0) { + // if (log_lvl) { + // console.log(`LQ - Using category filter: ${$events_loc.filter__category_code}`); + // } + // results = await db_events.sessions + // .where('event_id') + // .equals($events_slct?.event_id ?? '') // null or undefined does not reset things like '' does + // .and(session => session.category_code === $events_loc.filter__category_code) + // .reverse() + // .sortBy('tmp_sort_1'); + + } else { + if (log_lvl) { + // console.log(`$lq__event_obj.cfg_json = `, $lq__event_obj?.cfg_json); + console.log(`LQ - Using default sort for Event Session list event_id: ${$events_slct?.event_id}`); + } + results = await db_events.sessions + .where('event_location_id') + .equals($events_slct.event_location_id) + // .where('event_id') + // .equals($events_slct?.event_id ?? '') // null or undefined does not reset things like '' does + .reverse() + .sortBy('name'); + // .sortBy('tmp_sort_1'); + // .sortBy('updated_on'); + + } + + // Check if results are different than the current session version stored under $events_slct + if ($events_slct.event_session_obj_li && JSON.stringify($events_slct.event_session_obj_li) !== JSON.stringify(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}`, $events_slct.event_session_obj_li); + } + } else { + if (log_lvl > 1) { + console.log(`Session slct li stored version has not changed for ID = ${$events_slct.event_id}`); + } + } return results; + })); + + + // $: if (!$events_sess.launcher.modal__open) { // if ($events_loc.launcher.controller == 'local_push' && $events_sess.launcher.ws_connect_status == 'connected') { // console.log(`Local Push Controller Command: ae_close:event_file_modal`); @@ -187,14 +302,6 @@ let ae_promises: key_val = { slct_event_presentation_li: null }; -onMount(() => { - console.log('Events - Launcher: +layout.svelte'); - // Hide the AppShell shell header (id="shell-header") and footer - // document.getElementById('shell-header').classList.add('hidden'); - // document.getElementById('shell-footer').classList.add('hidden'); -}); -console.log(`BROWSER Events - [event_id] launcher +layout.svelte start`); - /* *** BEGIN *** Handle WebSocket events */ function handle_ws_conn(event) { @@ -603,12 +710,7 @@ $effect(() => { > -{#if !$lq__event_obj} -
- - Loading... -
-{:else} +
- -

{$lq__event_obj.cfg_json?.short_name}

-

- {$lq__event_location_obj?.name} - -

-
-{/if} + {#if $lq__event_obj} +

{$lq__event_obj.cfg_json?.short_name}

+

+ {$lq__event_location_obj?.name} + +

+ {:else} +
+ + Loading event... +
+ {/if} + + @@ -679,6 +791,7 @@ $effect(() => { lq__event_location_obj={lq__event_location_obj} slct__event_location_id={$events_slct.event_location_id} + bind:loading__session_li_status={$events_sess.launcher.loading__session_li_status} lq__event_session_obj_li={lq__event_session_obj_li} lq__event_session_obj={lq__event_session_obj} slct__event_session_id={$events_slct.event_session_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 0e68a843..f6f53a3a 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 @@ -36,7 +36,8 @@ export async function load({ params, parent, url }) { // route api_cfg: ae_acct.api, for_obj_type: 'event_location', for_obj_id: event_location_id, - inc_file_li: true, + inc_file_li: true, // Only include files directly under the session? + inc_all_file_li: false, // Also include files under presentations and presenters as well? inc_presentation_li: true, inc_presenter_li: true, enabled: 'enabled', diff --git a/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte b/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte index 2b42fdc5..f92e0f2e 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher_menu.svelte @@ -12,9 +12,12 @@ interface Props { lq__event_location_obj?: any; slct__event_location_id?: string|null; + loading__session_li_status?: null|boolean|string; lq__event_session_obj_li: any; + loading__session_id_status?: null|boolean|string; lq__event_session_obj?: any; slct__event_session_id?: string|null; + log_lvl?: number; } @@ -31,9 +34,12 @@ let { lq__event_location_obj, slct__event_location_id = $bindable(null), + loading__session_li_status = $bindable(null), lq__event_session_obj_li, + loading__session_id_status = $bindable(null), lq__event_session_obj, slct__event_session_id = $bindable(null), + log_lvl = $bindable(0), }: Props = $props(); @@ -146,6 +152,7 @@ let ae_promises: key_val = $state({ data_url={data_url} lq__event_location_obj_li={lq__event_location_obj_li} slct_event_location_id={$events_slct.event_location_id} + bind:loading__session_li_status={loading__session_li_status} /> {/if} diff --git a/src/routes/events/[event_id]/(launcher)/menu_location_list.svelte b/src/routes/events/[event_id]/(launcher)/menu_location_list.svelte index 348e440b..f42670d0 100644 --- a/src/routes/events/[event_id]/(launcher)/menu_location_list.svelte +++ b/src/routes/events/[event_id]/(launcher)/menu_location_list.svelte @@ -1,15 +1,19 @@ @@ -77,6 +79,8 @@ let hover_timer: any = $state(null); onmouseenter={() => { // Start a 750 ms timer to prevent changing the session too quickly. hover_timer = setTimeout(async () => { + loading__session_id_status = true; + $events_slct.event_session_id = null; await tick(); @@ -98,7 +102,9 @@ let hover_timer: any = $state(null); let new_url = data_url.toString(); console.log(new_url); - goto(new_url, {replaceState: false}); + loading__session_id_status = false; + // goto(new_url, {replaceState: true}); // Updates the URL without reloading the page + goto(new_url, {replaceState: false}); // Updates the URL history without reloading the page }); }, hover_timer_wait); }} @@ -106,13 +112,21 @@ let hover_timer: any = $state(null); clearTimeout(hover_timer); }} onclick={async () => { - $events_slct.event_session_id = null; - await tick(); + loading__session_id_status = true; + + // $events_slct.event_session_id = null; + // await tick(); $events_slct.event_session_id = event_session_obj?.id; data_url.searchParams.set('session_id', event_session_obj?.id); - $events_slct.event_session_id = event_session_obj?.id; + let new_url = data_url.toString(); + console.log(new_url); + loading__session_id_status = false; + // goto(new_url, {replaceState: true}); // Updates the URL without reloading the page + goto(new_url, {replaceState: false}); // Updates the URL history without reloading the page + + // $events_slct.event_session_id = event_session_obj?.id; $events_slct.event_session_obj = event_session_obj; ae_promises.slct_event_session_id = events_func.load_ae_obj_id__event_session({ @@ -126,9 +140,11 @@ let hover_timer: any = $state(null); .then(async (load_results) => { console.log(`load_results = `, load_results); - let new_url = data_url.toString(); - console.log(new_url); - goto(new_url, {replaceState: false}); + // let new_url = data_url.toString(); + // console.log(new_url); + loading__session_id_status = false; + // // goto(new_url, {replaceState: true}); // Updates the URL history without reloading the page + // goto(new_url, {replaceState: false}); }); @@ -155,7 +171,7 @@ let hover_timer: any = $state(null); class:hidden={!$events_loc.launcher.show_content__hidden_sessions && event_session_obj?.hide} class:dim={event_session_obj?.hide} - title={event_session_obj?.name} + title={`Session: ${event_session_obj?.name}\nID: ${event_session_obj?.id} | ${ae_util.iso_datetime_formatter(event_session_obj?.start_datetime, $events_loc.launcher.time_format)}`} >