Lots of work on the Launcher. Still mostly just cleaning things up.

This commit is contained in:
Scott Idem
2025-09-17 15:15:50 -04:00
parent 186923671d
commit c9e9fbec79
7 changed files with 219 additions and 58 deletions

View File

@@ -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,

View File

@@ -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)

View File

@@ -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}
<div class="flex flex-row gap-1 items-center justify-center">
<span class="fas fa-spinner fa-spin mx-1"></span>
<span>Loading...</span>
</div>
{:else}
<header
id="Main-Header"
class="
@@ -620,17 +722,27 @@ $effect(() => {
transition-all duration-1000
"
>
<h3 class="hidden sm:inline-block h4 text-center italic">
<h3 class="hidden sm:inline-block h4 text-center italic text-surface-600-400">
Æ Presentation Launcher
</h3>
<h2 class="h3 text-center">{$lq__event_obj.cfg_json?.short_name}</h2>
<h3 class="h4 text-center italic">
{$lq__event_location_obj?.name}
<!-- {$events_slct.event_location_id} -->
</h3>
</header>
{/if}
{#if $lq__event_obj}
<h2 class="h3 text-center text-surface-600-400">{$lq__event_obj.cfg_json?.short_name}</h2>
<h3
class="h4 text-center italic text-surface-600-400"
title="Location ID: {$lq__event_location_obj?.event_location_id} Name: {$lq__event_location_obj?.name}"
>
{$lq__event_location_obj?.name}
<!-- {$events_slct.event_location_id} -->
</h3>
{:else}
<div class="flex flex-row gap-1 items-center justify-center">
<span class="fas fa-spinner fa-spin mx-1"></span>
<span>Loading event...</span>
</div>
{/if}
</header>
@@ -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}

View File

@@ -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',

View File

@@ -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}

View File

@@ -1,15 +1,19 @@
<script lang="ts">
interface Props {
data_url: any;
loading__session_li_status?: null|boolean|string;
lq__event_location_obj_li: any;
slct_event_location_id: string|null;
log_lvl?: number;
}
let {
data_url,
loading__session_li_status = $bindable(null),
lq__event_location_obj_li,
slct_event_location_id = null,
log_lvl = $bindable(0),
}: Props = $props();
@@ -71,6 +75,8 @@ let ae_promises: key_val = $state({
onchange={async () => {
// console.log(`slct_event_location_id:`, slct_event_location_id);
loading__session_li_status = true;
console.log('Remove fields from the URL.');
// data_url.searchParams.delete('location_id');
data_url.searchParams.delete('presentation_id');
@@ -83,6 +89,8 @@ let ae_promises: key_val = $state({
let new_url = `/events/${$events_slct.event_id}/launcher`;
if (slct_event_location_id) {
loading__session_li_status = 'loading';
$events_loc.launcher.slct.event_location_id = slct_event_location_id;
$events_slct.event_location_id = slct_event_location_id;
@@ -92,7 +100,8 @@ let ae_promises: key_val = $state({
api_cfg: $ae_api,
for_obj_type: 'event_location',
for_obj_id: $events_slct.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: $events_loc.launcher.show_content__enabled_sessions ? 'all' : 'enabled',
@@ -119,7 +128,9 @@ let ae_promises: key_val = $state({
return load_results;
});
new_url = `/events/${$events_slct.event_id}/launcher/${$events_slct.event_location_id}`;
new_url = `/events/${$events_slct.event_id}/launcher/${slct_event_location_id}`;
loading__session_li_status = 'finished';
} else {
// This will hide the selected session if the location is changed to false.
@@ -129,10 +140,14 @@ let ae_promises: key_val = $state({
$events_slct.event_location_id = null;
$events_loc.launcher.slct.event_session_id = null;
$events_slct.event_session_id = null;
loading__session_li_status = 'finished';
// WARNING: This may need to be commented out later.
}
goto(new_url, {replaceState: true});
// goto(new_url, {replaceState: false});
loading__session_li_status = null;
// 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
}}
>
<option value="" class="italic text-surface-800-200">

View File

@@ -1,6 +1,7 @@
<script lang="ts">
interface Props {
data_url: any;
loading__session_id_status?: null|boolean|string;
// export let lq__event_session_obj: any;
lq__event_session_obj_li: any;
slct_event_session_id: string|null;
@@ -9,6 +10,7 @@ interface Props {
let {
data_url,
loading__session_id_status = $bindable(null),
lq__event_session_obj_li,
slct_event_session_id = null,
log_lvl = $bindable(0),
@@ -38,7 +40,7 @@ let ae_promises: key_val = $state({
slct_event_presentation_li: null
});
let hover_timer_wait = 1000;
let hover_timer_wait = 2500;
let hover_timer: any = $state(null);
</script>
@@ -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)}`}
>
<span