diff --git a/documentation/SVELTE_DEXIE_GUIDE.md b/documentation/SVELTE_DEXIE_GUIDE.md index ac994ef3..956e3923 100644 --- a/documentation/SVELTE_DEXIE_GUIDE.md +++ b/documentation/SVELTE_DEXIE_GUIDE.md @@ -92,6 +92,53 @@ export function createLiveQueryStore(query: () => T | Promise) { The `createLiveQueryStore` function creates a readable store that automatically updates whenever the data in the `friends` table changes. The `$friends` variable in the component will always contain the latest data from the database. +## Page Load Strategies (Avoiding the "Waterfall") + +When loading data for a primary page view (e.g., viewing a specific Journal, Session, or Person), you must choose a synchronization strategy to ensure the UI renders correctly on the first load. + +### ❌ The "Fire & Forget" Anti-Pattern (AVOID) +Triggering a background load in `+page.ts` without `await` leads to race conditions. +1. `+page.svelte` mounts immediately. +2. `liveQuery` runs against an empty IndexedDB. +3. API data arrives later and writes to IndexedDB. +4. **Failure:** Svelte 5 + Dexie `liveQuery` may not automatically detect this first "cold start" update without a manual refresh. + +### ✅ The "Blocking Loader" Pattern (RECOMMENDED) +Ensure the data is in IndexedDB **before** the component mounts. +1. In `+page.ts`, `await` the API load function. +2. In `+page.svelte`, the `liveQuery` will see the data immediately upon mount. + +**Example (+page.ts):** +```typescript +export async function load({ params }) { + // Blocking await ensures IDB is populated + await journals_func.load_ae_obj_id__journal({ + journal_id: params.journal_id, + try_cache: true + }); + return {}; +} +``` + +### ✅ The "Hydrate & Subscribe" Pattern (ADVANCED) +If you must use non-blocking loads, you must pass the initial data to the component to "hydrate" the state before the subscription takes over. + +1. In `+page.ts`, `await` the load and **return the object**. +2. In `+page.svelte`, use the returned object as a fallback or initial state. + +**Example (+page.svelte):** +```svelte + + + +{#if $lq__obj || data.initial_obj} + +{/if} +``` + ## Svelte 5 Binding Pitfalls ### 1. `props_invalid_value` (The "Expression Binding" Error) @@ -156,18 +203,3 @@ let results = await db.table.where('id').equals(id).reverse().sortBy('sort_key') let results = await db.table.where('id').equals(id).sortBy('sort_key'); return results.reverse(); ``` - -## Current Data Flow in `ae_journals` Module - -The `ae_journals` module currently uses a manual, API-first caching strategy. It does not use Dexie.js's `liveQuery` function for reactivity. - -### Data Flow - -1. **Fetch from API:** The `load_ae_obj_id__journal` and `load_ae_obj_li__journal` functions are used to fetch data from the API. -2. **Process Data:** The `process_ae_obj__journal_props` and `process_ae_obj__journal_entry_props` functions are used to process the data before it's saved to the database. This includes parsing Markdown, creating temporary sorting fields, and combining passcodes. -3. **Save to IndexedDB:** The `db_save_ae_obj_li__ae_obj` function is used to save the processed data to the `journal` and `journal_entry` tables in the `ae_journals_db` IndexedDB database. -4. **Manual Store Updates:** The Svelte stores in `src/lib/ae_journals/ae_journals_stores.ts` are manually updated with the fetched data. - -### Future Improvements - -The current implementation could be improved by refactoring it to use Dexie.js's `liveQuery` function. This would simplify the code, reduce boilerplate, and improve the reactivity of the application. By using `liveQuery`, the UI would automatically update whenever the data in the IndexedDB database changes, without the need for manual store updates. \ No newline at end of file diff --git a/src/lib/ae_events/ae_events__event_session.ts b/src/lib/ae_events/ae_events__event_session.ts index 53e29165..bc493270 100644 --- a/src/lib/ae_events/ae_events__event_session.ts +++ b/src/lib/ae_events/ae_events__event_session.ts @@ -45,6 +45,9 @@ export async function load_ae_obj_id__event_session({ console.log(`🔎 [Trace] load_ae_obj_id__event_session: START (id=${event_session_id}, try_cache=${try_cache})`); } + // Hierarchy Enforcement: Pulling presenters requires pulling presentations first + if (inc_presenter_li) inc_presentation_li = true; + // 1. FAST PATH: Return cached data immediately if (try_cache) { try { @@ -181,6 +184,9 @@ export async function load_ae_obj_li__event_session({ console.log(`🔎 [Trace] load_ae_obj_li__event_session: START (for=${for_obj_type}:${for_obj_id}, try_cache=${try_cache})`); } + // Hierarchy Enforcement: Pulling presenters requires pulling presentations first + if (inc_presenter_li) inc_presentation_li = true; + if (try_cache) { try { // Robust lookup logic @@ -422,7 +428,10 @@ async function _process_generic_props>({ obj_li, o } const randomIdKey = `${obj_type}_id_random`; const baseIdKey = `${obj_type}_id`; - if (processed_obj[randomIdKey]) (processed_obj as any).id = processed_obj[randomIdKey]; + if (processed_obj[randomIdKey]) { + (processed_obj as any).id = processed_obj[randomIdKey]; + (processed_obj as any)[baseIdKey] = processed_obj[randomIdKey]; + } else if (processed_obj[baseIdKey]) (processed_obj as any).id = processed_obj[baseIdKey]; const group = processed_obj.group ?? '0'; diff --git a/src/lib/elements/element_manage_event_file_li_all.svelte b/src/lib/elements/element_manage_event_file_li_all.svelte index 59634dec..fc527142 100644 --- a/src/lib/elements/element_manage_event_file_li_all.svelte +++ b/src/lib/elements/element_manage_event_file_li_all.svelte @@ -38,13 +38,14 @@ ae_tmp.show__direct_download = false; // let ae_triggers: key_val = {}; - let dq__where_val: string = `${link_to_type}_id`; - let dq__where_eq_val: string = link_to_id; + let dq__where_val = $derived(`${link_to_type}_id`); + let dq__where_eq_val = $derived(link_to_id); // This should include all files that are associated with an object (event, location, session, presenter, etc.) // I am not sure why, but doing reverse() and then sortBy() seems to sort in descending order. let lq__event_file_obj_li = $derived( liveQuery(async () => { + if (!dq__where_eq_val) return []; let results = await db_events.file .where(dq__where_val) .equals(dq__where_eq_val) diff --git a/src/routes/events/+layout.ts b/src/routes/events/+layout.ts index 15487e52..a0220a37 100644 --- a/src/routes/events/+layout.ts +++ b/src/routes/events/+layout.ts @@ -1,5 +1,5 @@ /** @type {import('./$types').LayoutLoad} */ -console.log(`ae_events_pres_mgmt +layout.ts start`); +console.log(`ae_events +layout.ts`); // Imports // import { browser } from '$app/environment'; @@ -9,7 +9,6 @@ export async function load({ parent }) { const log_lvl: number = 0; const parent_data = await parent(); - // console.log(`ae_events_pres_mgmt +layout.ts parent_data:`, parent_data); const account_id = parent_data.account_id; if (!account_id) { diff --git a/src/routes/events/+page.ts b/src/routes/events/+page.ts index c9d8ce7b..3e343be9 100644 --- a/src/routes/events/+page.ts +++ b/src/routes/events/+page.ts @@ -1,6 +1,5 @@ /** @type {import('./$types').PageLoad} */ -import { error } from '@sveltejs/kit'; import { browser } from '$app/environment'; import { events_func } from '$lib/ae_events_functions'; @@ -13,32 +12,31 @@ export async function load({ parent }) { const ae_acct = parent_data[account_id]; - const event_id = ae_acct.slct.event_id; // From root +layout.ts - if (!event_id) { - if (log_lvl) { - console.log(`INFO: events +layout.ts: The event_id was not found in the parent_data.`); - } - // return false; - } + // const event_id = ae_acct.slct.event_id; // From root +layout.ts + // if (!event_id) { + // if (log_lvl) { + // console.log(`INFO: events +layout.ts: The event_id was not found in the parent_data.`); + // } + // } if (browser) { if (log_lvl) console.log(`ae_events +page.ts (Non-Blocking Refresh)`); - if (event_id) { - // Refresh the specific selected event - events_func.load_ae_obj_id__event({ - api_cfg: ae_acct.api, - event_id: event_id, - log_lvl: log_lvl - }); - } + // if (event_id) { + // // Refresh the specific selected event + // events_func.load_ae_obj_id__event({ + // api_cfg: ae_acct.api, + // event_id: event_id, + // log_lvl: log_lvl + // }); + // } // Refresh the list of events for the account events_func.load_ae_obj_li__event({ api_cfg: ae_acct.api, for_obj_type: 'account', for_obj_id: account_id, - inc_session_li: true, + // inc_session_li: false, hidden: 'all', // 'not_hidden' enabled: 'enabled', limit: 25, diff --git a/src/routes/events/[event_id]/(pres_mgmt)/+layout.ts b/src/routes/events/[event_id]/(pres_mgmt)/+layout.ts new file mode 100644 index 00000000..50ac3a29 --- /dev/null +++ b/src/routes/events/[event_id]/(pres_mgmt)/+layout.ts @@ -0,0 +1,36 @@ +/** @type {import('./$types').LayoutLoad} */ + +import { browser } from '$app/environment'; +import { events_func } from '$lib/ae_events_functions'; + +export async function load({ parent }) { + const log_lvl: number = 0; + + const parent_data = await parent(); + + const account_id = parent_data.account_id; + + const ae_acct = parent_data[account_id]; + + const event_id = ae_acct.slct.event_id; // From root +layout.ts + + if (browser) { + if (log_lvl) console.log(`ae_events (pres_mgmt) +layout.ts (Non-Blocking Refresh)`); + + if (event_id) { + // Refresh the specific selected event + events_func.load_ae_obj_id__event({ + api_cfg: ae_acct.api, + event_id: event_id, + // inc_file_li: false, // Changing from true 2026-02-04 + // inc_location_li: false, // Changing from true 2026-02-04 + inc_session_li: true, + log_lvl: log_lvl + }); + } + } + + parent_data[account_id] = ae_acct; + + return parent_data; +} diff --git a/src/routes/events/[event_id]/event_page_menu.svelte b/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte similarity index 99% rename from src/routes/events/[event_id]/event_page_menu.svelte rename to src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte index ca91f952..10a05325 100644 --- a/src/routes/events/[event_id]/event_page_menu.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte @@ -31,8 +31,8 @@ import Element_ae_crud from '$lib/elements/element_ae_crud.svelte'; import Element_data_store from '$lib/elements/element_data_store_v3.svelte'; - import Comp__events_menu_nav from '../ae_comp__events_menu_nav.svelte'; - import Comp__pres_mgmt_menu_opts from '../ae_comp__events_menu_opts.svelte'; + import Comp__events_menu_nav from '../../ae_comp__events_menu_nav.svelte'; + import Comp__pres_mgmt_menu_opts from '../../ae_comp__events_menu_opts.svelte'; // Variables let ae_promises: key_val = {}; @@ -53,6 +53,7 @@ events__locations={$ae_loc.administrator_access} events__reports={$ae_loc.trusted_access} events__settings={$ae_loc.edit_mode && $ae_loc.administrator_access} + events__session_search={!!$lq__event_obj?.event_id} /> diff --git a/src/routes/events/[event_id]/(pres_mgmt)/location/[event_location_id]/+page.ts b/src/routes/events/[event_id]/(pres_mgmt)/location/[event_location_id]/+page.ts index 02643813..8a9780be 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/location/[event_location_id]/+page.ts +++ b/src/routes/events/[event_id]/(pres_mgmt)/location/[event_location_id]/+page.ts @@ -1,6 +1,5 @@ /** @type {import('./$types').PageLoad} */ -import { error } from '@sveltejs/kit'; console.log(`ae_events_pres_mgmt_event [event_location_id] +page.ts start`); import { browser } from '$app/environment'; @@ -11,20 +10,15 @@ export async function load({ params, parent }) { const log_lvl: number = 0; const data = await parent(); - // console.log(`ae events_pres_mgmt location [event_location_id] +page.ts data:`, data); const account_id = data.account_id; const ae_acct = data[account_id]; - // console.log(`ae_acct = `, ae_acct); const event_location_id = params.event_location_id; if (!event_location_id) { console.warn( `ae events_pres_mgmt location [event_location_id] +page.ts: The event_location_id was not found in the params!!!` ); - // error(404, { - // message: 'Location not found' - // }); } ae_acct.slct.event_location_id = event_location_id; @@ -42,38 +36,37 @@ export async function load({ params, parent }) { events_func.load_ae_obj_id__event_location({ api_cfg: ae_acct.api, event_location_id: event_location_id, - try_cache: true + inc_file_li: true, + inc_session_li: true, + inc_device_li: true, + inc_presentation_li: true, + inc_presenter_li: true, + log_lvl: log_lvl }); - // 2. Refresh sessions and their nested presentations + // 2. Refresh sessions and their nested presentations (REDUNDANT: Now handled by inc_session_li above) + /* events_func.load_ae_obj_li__event_session({ api_cfg: ae_acct.api, for_obj_type: 'event_location', for_obj_id: event_location_id, inc_presentation_li: true, + inc_presenter_li: true, enabled: 'all', limit: 50, log_lvl: log_lvl }); + */ - // 3. Refresh files for the location - events_func.load_ae_obj_li__event_file({ - api_cfg: ae_acct.api, - for_obj_type: 'event_location', - for_obj_id: event_location_id, - enabled: 'all', - hidden: 'all', - limit: 50, - log_lvl: log_lvl - }); - - // 4. Refresh devices for the location + // 4. Refresh devices for the location (REDUNDANT: Now handled by inc_device_li above) + /* events_func.load_ae_obj_li__event_device({ api_cfg: ae_acct.api, for_obj_type: 'event_location', for_obj_id: event_location_id, log_lvl: log_lvl }); + */ } // WARNING: Precaution against shared data between sites and sessions. diff --git a/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte new file mode 100644 index 00000000..bca483ea --- /dev/null +++ b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte @@ -0,0 +1,648 @@ + + + + + Æ: + {ae_util.shorten_string({ + string: $lq__event_obj?.name, + max_length: 12 + })} + - Pres Mgmt - {$events_loc?.title} + + + + + +{#if !$lq__event_obj} +
+ + Loading event information... +
+{:else if $lq__event_obj?.enable || $ae_loc.trusted_access} +
+ + + + + +

+ + {$lq__event_obj.cfg_json?.short_name ?? $lq__event_obj?.name} + + + +

+
+ + {#if !$events_loc.pres_mgmt.show_content__event_view || $events_loc.pres_mgmt.show_content__event_view == 'default'} +
+
handle_search_trigger())} + autocomplete="off" + class="form grow flex flex-row flex-wrap gap-1 justify-center items-center w-full" + > + + + + + + + { + if (e.key === 'Enter') handle_search_trigger(); + }} + autofocus + data-ignore="true" + /> + + + + {#if $ae_loc.edit_mode} + + {/if} +
+
+ + {#if event_session_id_li.length} + + {:else if $events_sess.pres_mgmt.status_qry__search === 'loading'} +
+ +

Searching sessions...

+
+ {:else} +
+
+ + No results to show + +
+
+ Please use the search above to find your session. +
+
+
+ Search by: +
    +
  • Session name
  • +
  • Session description
  • +
  • Presentation name
  • +
  • Presenter names
  • +
  • Presenter ID (member ID)
  • +
+
+
+ {/if} + {:else if $events_loc.pres_mgmt.show_content__event_view == 'manage_files' && $ae_loc.trusted_access} + {#if $lq__event_obj} +
+

{$lq__event_obj?.name}

+

Event - Manage Files

+
+ {/if} + +
+

+ + + Manage and Upload Event Files: +

+ + + {#snippet label()} + +
+ + Upload global event files only! +
+
+ Global event files only
+ Recommended: PowerPoint (pptx) or Keynote (key)
+ Media: Audio and videos files should be directly embedded + in PowerPoint (PPTX) files
+ Supplemental files: mp4, PDF, Word Doc, Excel, txt, etc +
+
+ {/snippet} +
+ +
+ +
+
+ {/if} +{:else} +
+

+ + Event Disabled +

+

+ This event is currently disabled. Please contact the event organizer + for more information. +

+
+{/if} + + diff --git a/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.ts b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.ts new file mode 100644 index 00000000..db26b3b2 --- /dev/null +++ b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.ts @@ -0,0 +1,5 @@ +/** @type {import('./$types').PageLoad} */ +console.log(`Events - [event_id] (p) +page.ts start`); + +// export async function load({ params, parent }) { +// } diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte index 94af7524..bd2eb493 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte @@ -124,280 +124,269 @@ - {#if $lq__event_presenter_obj_li?.length} - -
    - {#each $lq__event_presenter_obj_li as event_presenter_obj} - - -
  • + {#each $lq__event_presenter_obj_li ?? [] as event_presenter_obj} + + +
  • + - + {#if event_presenter_obj?.given_name && event_presenter_obj?.given_name != 'Group'} + + {:else if event_presenter_obj?.given_name == 'Group'} + + {:else} + + {/if} + {#if event_presenter_obj.priority} + + {/if} + {#if event_presenter_obj?.given_name && event_presenter_obj?.given_name != 'Group'} - + {event_presenter_obj?.full_name} {:else if event_presenter_obj?.given_name == 'Group'} - + {ae_util.shorten_string({ + string: event_presenter_obj?.affiliations, + max_length: 25 + })} {:else} - + --not set-- {/if} - {#if event_presenter_obj.priority} - - {/if} - - {#if event_presenter_obj?.given_name && event_presenter_obj?.given_name != 'Group'} - {event_presenter_obj?.full_name} - {:else if event_presenter_obj?.given_name == 'Group'} - {ae_util.shorten_string({ - string: event_presenter_obj?.affiliations, - max_length: 25 - })} - {:else} - --not set-- - {/if} + + + {#if event_presenter_obj?.file_count} + + + {event_presenter_obj?.file_count}× + + {/if} + - {#if event_presenter_obj?.file_count} - - - {event_presenter_obj?.file_count}× - - - {/if} - + {#if $events_loc?.pres_mgmt?.show__email_access_link && event_presenter_obj?.person_primary_email && ($ae_loc.administrator_access || !$events_loc.auth__person?.id)} + + {/if} + + {#if $events_loc.pres_mgmt?.require__presenter_agree} + {#if event_presenter_obj?.agree} + + {:else} + {/if} + {/if} - {#if $events_loc.pres_mgmt?.require__presenter_agree} - {#if event_presenter_obj?.agree} - - - {:else} - - {/if} - {/if} - -
    - {#if $ae_loc.administrator_access && !event_presenter_obj.person_id} - - {/if} -
    -
  • - - {/each} -
- {:else} - - {/if} + } + }} + class:hidden={!$ae_loc.edit_mode} + class="btn btn-sm preset-tonal-warning hover:preset-filled-warning-500" + > + + Add Person + + {/if} + + + + {/each} + diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte index cfda5a96..2088f0d4 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte @@ -6,176 +6,77 @@ } let { data }: Props = $props(); - - let log_lvl: number = $state(0); + let log_lvl: number = $state(1); // Imports import { Modal } from 'flowbite-svelte'; - - import type { key_val } from '$lib/stores/ae_stores'; import { ae_util } from '$lib/ae_utils/ae_utils'; - import Element_data_store from '$lib/elements/element_data_store_v3.svelte'; - - // let ae_promises: key_val = {}; - // let ae_tmp: key_val = {}; - // let ae_triggers: key_val = {}; - import { liveQuery } from 'dexie'; - // import { core_func } from '$lib/ae_core/ae_core_functions'; import { db_events } from '$lib/ae_events/db_events'; - import { - ae_snip, - ae_loc, - ae_sess, - ae_api, - ae_trig, - slct, - slct_trigger - } from '$lib/stores/ae_stores'; - import { - events_loc, - events_sess, - events_slct, - events_trigger, - events_trig_kv - } from '$lib/stores/ae_events_stores'; + import { ae_snip, ae_loc, ae_api, slct } from '$lib/stores/ae_stores'; + import { events_loc, events_sess, events_slct } from '$lib/stores/ae_events_stores'; import { events_func } from '$lib/ae_events_functions'; - import Comp_event_files_upload from '../../../../ae_comp__event_files_upload.svelte'; - import Comp_event_presenter_form_agree from '../../presenter/[presenter_id]/ae_comp__event_presenter_form_agree.svelte'; - import Element_manage_event_file_li_wrap from '$lib/elements/element_manage_event_file_li_direct.svelte'; import Session_view from './session_view.svelte'; import Session_page_menu from './session_page_menu.svelte'; - import Comp_event_session_alert from '../ae_comp__event_session_alert.svelte'; - // import Sign_in_out from './../../sign_in_out.svelte'; + import Comp_event_presentation_obj_li from '../../../../ae_comp__event_presentation_obj_li.svelte'; - import { browser } from '$app/environment'; + // STABILITY FIX: Use URL params directly for queries. + const url_session_id = data.params.session_id; + const url_event_id = data.params.event_id; - // Variables - if (browser) { - console.log('Browser environment detected.'); - } - - // Quickly save the data passed from the parent(s) to the Svelte stores, localStorage, and other. - // $slct.account_id = data.account_id; - // console.log(`$slct.account_id = `, $slct.account_id); - let ae_acct = data[data.account_id]; - // console.log(`ae_acct = `, ae_acct); - - $ae_loc.url_origin = data.url.origin; - - $events_slct.event_id = ae_acct.slct.event_id; - // $events_slct.event_obj = ae_acct.slct.event_obj; - $events_slct.event_session_id = ae_acct.slct.event_session_id; - // $events_slct.event_session_obj = ae_acct.slct.event_session_obj; - $events_slct.event_presentation_id = null; - // $events_slct.event_presentation_obj = null; - $events_slct.event_presentation_obj_li = - ae_acct.slct.event_presentation_obj_li; - // $events_slct.event_file_obj_li = ae_acct.slct.event_file_obj_li; - - if (!$events_loc.auth__person) { - $events_loc.auth__person = { - id: null, - email: null, - full_name: null, - entered_key: null, - entered_passcode: null - }; - } - - if (!$events_loc.auth__kv) { - $events_loc.auth__kv = { - session: {}, - presentation: {}, - presenter: {}, - person: {} - }; - } - - if (!$events_loc.pres_mgmt) { - $events_loc.pres_mgmt = {}; - } - - if (!$events_sess.pres_mgmt) { - $events_sess.pres_mgmt = {}; - $events_sess.pres_mgmt.show_content__agree_text = null; - $events_sess.pres_mgmt.show_content__presenter_start = null; - } - - $events_sess.pres_mgmt.show_content__agree_text = false; - $events_sess.pres_mgmt.show_content__presenter_start = false; - - let lq__event_obj = $derived( - liveQuery(async () => { - let results = await db_events.event.get($events_slct.event_id); - return results; - }) - ); + // Sync stores in the background + let ae_acct = $derived(data[data.account_id]); + $effect(() => { + if (!ae_acct) return; + untrack(() => { + $ae_loc.url_origin = data.url.origin; + $events_slct.event_id = url_event_id; + $events_slct.event_session_id = url_session_id; + }); + }); + // 1. Session Observable let lq__event_session_obj = $derived( liveQuery(async () => { - let results = await db_events.session.get( - ae_acct.slct.event_session_id - ); - return results; + if (log_lvl) console.log(`[LQ] Querying Session: ${url_session_id}`); + return await db_events.session.get(url_session_id); }) ); + // 2. Presentation List Observable let lq__event_presentation_obj_li = $derived( liveQuery(async () => { - if (!$lq__event_session_obj?.event_session_id) return []; - let results = await db_events.presentation - .where('event_session_id') // This field contains the random ID - .equals($lq__event_session_obj.event_session_id) // Compare against the random ID + if (log_lvl) console.log(`[LQ] Querying Presentations for Session: ${url_session_id}`); + return await db_events.presentation + .where('event_session_id') + .equals(url_session_id) .sortBy('name'); - return results; }) ); + // 3. Other Observables + let lq__event_obj = $derived( + liveQuery(async () => await db_events.event.get(url_event_id)) + ); + let lq__event_presenter_obj = $derived( liveQuery(async () => { - let results = await db_events.presenter.get( - $events_slct.event_presenter_id - ); - return results; + if (!$events_slct.event_presenter_id) return null; + return await db_events.presenter.get($events_slct.event_presenter_id); }) ); let lq__auth__event_presenter_obj = $derived( liveQuery(async () => { - let results = await db_events.presenter.get( - $events_loc.auth__person?.presenter_id ?? null - ); - return results; + const pid = $events_loc.auth__person?.presenter_id; + if (!pid) return null; + return await db_events.presenter.get(pid); }) ); - $slct.person_obj_kv = {}; // This is intended for the POC lookup list when generated. - - // JSON formatted configuration options for an event, and specifically for the presentation management module. - $effect(() => { - const remote_cfg = $lq__event_obj?.mod_pres_mgmt_json; - const local_cfg = $events_loc?.pres_mgmt; - if (remote_cfg && local_cfg) { - untrack(() => { - events_func.sync_config__event_pres_mgmt({ - pres_mgmt_cfg_remote: remote_cfg, - pres_mgmt_cfg_local: local_cfg, - log_lvl: log_lvl - }); - }); - } - }); - - if ( - !$ae_loc.authenticated_access && - $events_loc.pres_mgmt.show_content__session_view - ) { - $events_loc.pres_mgmt.show_content__session_view = null; - } - - // *** Functions and Logic + if (!$events_loc.pres_mgmt) $events_loc.pres_mgmt = {}; + if (!$events_sess.pres_mgmt) $events_sess.pres_mgmt = {}; @@ -183,296 +84,55 @@ Session: {ae_util.shorten_string({ string: $lq__event_session_obj?.name ?? 'Loading...', max_length: 12 - })} ({$lq__event_session_obj?.event_session_id ?? ''}) - Pres Mgmt - {$events_loc?.title} + })} - Pres Mgmt -
- +
+ + + - {#if !$lq__event_session_obj} -
- - Loading session information... -
- {:else if $lq__event_session_obj?.enable || $ae_loc.trusted_access} -
- {#if $lq__event_session_obj?.alert && $ae_loc.trusted_access} - - {/if} - - - - - - - - - -

- - {@html $lq__event_session_obj?.name ?? - ae_snip.html__not_set} - -

- - {#if (!$events_loc.pres_mgmt?.hide__session_code && $lq__event_session_obj.code) || $ae_loc.edit_mode} - - - - code - - {$lq__event_session_obj.code} - - {/if} -
-
- - +
+ +
-
- {#if $ae_loc.trusted_access || ($events_loc.auth__person?.id && $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id])} - {#if $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] === true} -

- Welcome {$lq__event_session_obj?.poc_person_full_name ?? - 'Session POC'} -

- {:else if $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] == 'read'} -

- Welcome {$lq__auth__event_presenter_obj?.full_name ?? - 'Presenter'} -

- {/if} + +
+ + +
- {#if $ae_loc.trusted_access || $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] === true || ($events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] == 'read' && $lq__auth__event_presenter_obj?.agree)} - - - {:else if $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] == 'read' && !$lq__event_presenter_obj?.agree} - - - {/if} - {/if} - - {#if (!$events_loc.auth__person?.id && !$ae_loc.trusted_access) || ($ae_loc.trusted_access && $ae_loc.edit_mode)} - - {/if} -
- - {#if !$events_loc.pres_mgmt.show_content__session_view || $events_loc.pres_mgmt.show_content__session_view == 'default'} - - {:else if $events_loc.pres_mgmt.show_content__session_view == 'manage_files' && $ae_loc.public_access} -
-

- - - Manage and Upload Session Files: - - - {$lq__event_session_obj?.file_count}× - -

- - - {#snippet label()} - -
- - Upload session (breakout) specific files - only! -
-
- Session (breakout) files only
- Recommended: PowerPoint (pptx) or Keynote (key)
- Media: Audio and videos files should be directly embedded - in PowerPoint (PPTX) files
- Supplemental files: mp4, PDF, Word Doc, Excel, txt, - etc -
-
- {/snippet} -
- -
- -
-
- {/if} - {:else} -
-

- - Session Disabled -

-

- This session is currently disabled. Please contact the event - organizer for more information. -

+ + {#if !$lq__event_session_obj} +
+ + Synchronizing with session data...
{/if}
- + - {#snippet footer()} -
- -
+ {/snippet}
diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.ts b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.ts index cf361292..3f2810d1 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.ts +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.ts @@ -6,15 +6,12 @@ import { browser } from '$app/environment'; import { events_func } from '$lib/ae_events_functions'; export async function load({ params, parent }) { - // route const log_lvl: number = 0; const data = await parent(); - // console.log(`ae events_pres_mgmt session [session_id] +page.ts data:`, data); const account_id = data.account_id; const ae_acct = data[account_id]; - // console.log(`ae_acct = `, ae_acct); data.ae_events_pres_mgmt_event_session_id_page_ts = true; @@ -29,51 +26,34 @@ export async function load({ params, parent }) { } ae_acct.slct.event_session_id = event_session_id; + // Initialize container for the pre-loaded object + let initial_session_obj = null; + if (browser) { if (log_lvl) console.log( - `ae_events [session_id] +page.ts (Non-Blocking Refresh)` + `ae_events [session_id] +page.ts (Blocking Refresh)` ); - // OPTIMIZATION: Fire these in the background without 'await'. - // The Session View components use LiveQuery/Dexie and will update - // automatically once these background tasks complete. - - // 1. Refresh the core session object - events_func.load_ae_obj_id__event_session({ + // STABILITY FIX: Await the load AND capture the result. + // We pass this direct object to the page to ensure immediate rendering + // without waiting for IDB/LiveQuery round-trip. + initial_session_obj = await events_func.load_ae_obj_id__event_session({ api_cfg: ae_acct.api, event_session_id: event_session_id, - try_cache: true - }); - - // 2. Refresh presentations and their nested presenters - events_func.load_ae_obj_li__event_presentation({ - api_cfg: ae_acct.api, - for_obj_type: 'event_session', - for_obj_id: event_session_id, inc_file_li: true, + inc_presentation_li: true, inc_presenter_li: true, - enabled: 'all', - hidden: 'all', - limit: 150, try_cache: true, - log_lvl: 0 - }); - - // 3. Refresh files for the session - events_func.load_ae_obj_li__event_file({ - api_cfg: ae_acct.api, - for_obj_type: 'event_session', - for_obj_id: event_session_id, - enabled: 'all', - hidden: 'all', - limit: 150, - try_cache: true + log_lvl: log_lvl }); } // WARNING: Precaution against shared data between sites and presentations. data[account_id] = ae_acct; + + // Pass the pre-loaded data to the page component + data.initial_session_obj = initial_session_obj; return data; } diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_view.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_view.svelte index 68747da5..c4731549 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_view.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_view.svelte @@ -1,10 +1,8 @@ -{#if $lq__event_session_obj} -
- - - {#if $events_sess.pres_mgmt.session_qr_url[$lq__event_session_obj?.event_session_id]} -
+
+ {#if $lq__event_session_obj && $events_sess.pres_mgmt.session_qr_url[$lq__event_session_obj.id]} +
+ $events_sess.pres_mgmt.qr_bigger = !$events_sess.pres_mgmt.qr_bigger} + class="qr_code h-32 w-32 transition-all duration-500" + class:h-48={$events_sess.pres_mgmt.qr_bigger} + alt="URL QR code" + /> + - {#if $events_sess.pres_mgmt.session_qr_url[$lq__event_session_obj?.event_session_id]} - - - { - $events_sess.pres_mgmt.qr_bigger = - !$events_sess.pres_mgmt.qr_bigger; - }} - class:h-48={$events_sess.pres_mgmt.qr_bigger} - class:w-48={$events_sess.pres_mgmt.qr_bigger} - class:hover:h-96={$events_sess.pres_mgmt.qr_bigger} - class:hover:w-96={$events_sess.pres_mgmt.qr_bigger} - class="qr_code qr_type_url - h-32 w-32 - hover:h-54 hover:w-54 - transition-all ease-in-out duration-500 - " - alt="URL QR code" - /> - {:else} - No QR URL yet - {/if} - - - Session URL - - - -
- {/if} + + +
+ {/if} -
    -
  • +
      + +
    • + {#if $lq__event_session_obj} {#if $ae_loc.trusted_access && $ae_loc.edit_mode} { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 1 - }) - .then(function (load_results) {}); - }} + field_value={$lq__event_session_obj.name} + on:ae_crud_updated={() => events_func.load_ae_obj_id__event_session({api_cfg: $ae_api, event_session_id: $lq__event_session_obj.id})} > - Name/title: - - {$lq__event_session_obj.name} - + {$lq__event_session_obj.name} {/if} - {#if $ae_loc.edit_mode} - { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 1 - }) - .then(function (load_results) {}); - }} - > - - code: - - {$lq__event_session_obj.code} - - + code: {$lq__event_session_obj.code} {/if} -
    • -
    • - - Date & + {/if} +
    • + + +
    • + {#if $lq__event_session_obj} + Date & Time: + + + {ae_util.iso_datetime_formatter($lq__event_session_obj.start_datetime, 'dddd')}, + {ae_util.iso_datetime_formatter($lq__event_session_obj.start_datetime, $events_loc.pres_mgmt.datetime_format)} + - + {ae_util.iso_datetime_formatter($lq__event_session_obj.end_datetime, $events_loc.pres_mgmt.time_format)} + + {/if} +
    • + + +
    • + {#if $lq__event_session_obj} + Host: + {#if $lq__event_session_obj.poc_person_id} - : - - { - console.log(`ae_crud_updated:`, e.detail); - events_func.load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id - }); - // $events_trigger = 'load__event_session_obj_id'; - // $events_trig_kv['event_session_id'] = $lq__event_session_obj?.event_session_id; - }} - > - {ae_util.iso_datetime_formatter( - $lq__event_session_obj.start_datetime, - 'dddd' - )}, - {ae_util.iso_datetime_formatter( - $lq__event_session_obj.start_datetime, - $events_loc.pres_mgmt.datetime_format - )} - - - - { - console.log(`ae_crud_updated:`, e.detail); - - events_func.load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id - }); - // $events_trigger = 'load__event_session_obj_id'; - // $events_trig_kv['event_session_id'] = $lq__event_session_obj?.event_session_id; - }} - > - {ae_util.iso_datetime_formatter( - $lq__event_session_obj.end_datetime, - $events_loc.pres_mgmt.time_format - )} - -
    • -
    • - - Location/room: - - - - {#if $events_loc.pres_mgmt?.hide__launcher_link_legacy && $events_loc.pres_mgmt?.hide__launcher_link && !$ae_loc.edit_mode} - - {$lq__event_session_obj?.event_location_name ?? - '-- not set --'} - - {/if} - - - - - {@html $lq__event_session_obj?.event_location_name - ? $lq__event_session_obj?.event_location_name - : ae_snip.html__not_set} - - - - - - - - - - - - - - - {#if $ae_loc.trusted_access && $ae_loc.edit_mode} - { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 1 - }) - .then(function (load_results) { - ae_tmp.event_location_id = null; - ae_tmp.show__edit_event_location = false; - }); - }} - > - {#if ae_tmp?.show__edit_location} - {#await $slct.event_location_obj_li} - - {:then event_location_obj_li} - - {/await} - - - {:else} - - {/if} - - {/if} -
    • -
    • - - {$events_loc.pres_mgmt?.label__session_poc_name}: - - {#if $lq__event_session_obj?.poc_person_id} - {#if $ae_loc.manager_access} - - {@html $lq__event_session_obj?.poc_person_full_name - ? $lq__event_session_obj.poc_person_full_name - : ae_snip.html__not_set} - - {/if} - - {#if $ae_loc.trusted_access || $events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id] === true} - - - - - - - - {#snippet footer()} -
      - -
      - {/snippet} -
      - - {#if $events_loc.pres_mgmt?.require__session_agree} - - - - - - - - {#snippet footer()} -
      - -
      - {/snippet} -
      - {/if} - - - {:else} - - {@html $lq__event_session_obj.poc_person_full_name - ? $lq__event_session_obj.poc_person_full_name - : ae_snip.html__not_set} - - {/if} + + + {#snippet footer()} + + {/snippet} + {:else} - {@html ae_snip.html__not_set} + Not assigned {/if} - - - - - - {#if $ae_loc.trusted_access && $ae_loc.edit_mode} - { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 0 - }) - .then(function (load_results) { - ae_tmp.poc_person_id = null; - ae_tmp.show__edit_poc_person = false; - - // Maybe reload page? - // window.location.reload(); - }); - }} - > - {#if ae_tmp?.show__edit_poc_person} - {#await $slct.person_obj_li} - - {:then person_obj_li} - - {/await} - {/if} - - {#if ae_tmp.show__edit_poc_person} - - {:else} - - {/if} - - {/if} - - - {#if $events_loc.auth__kv.session[$events_slct.event_session_id] === true} - Signed In - {/if} - {#if $events_loc.pres_mgmt?.require__session_agree && $events_loc?.pres_mgmt?.show__email_access_link && $lq__event_session_obj?.poc_person_primary_email && ($ae_loc.trusted_access || !$events_loc.auth__kv.session[$lq__event_session_obj?.event_session_id])} - - {/if} - - {#if $events_loc.pres_mgmt?.show__copy_access_link && $ae_loc.trusted_access && $lq__event_session_obj.poc_person_id} - - - - - {/if} - -
    • - - {#if $ae_loc.administrator_access} -
    • - - Session passcode: - - - {@html $lq__event_session_obj.passcode - ? $lq__event_session_obj.passcode - : ae_snip.html__not_set} - { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 1 - }) - .then(function (load_results) {}); - }} - > -
    • {/if} + -
    • -
      - { - console.log(`ae_crud_updated:`, e.detail); - - events_func.load_ae_obj_id__event_session({ - api_cfg: $ae_api, - event_session_id: - $lq__event_session_obj?.event_session_id, - log_lvl: 1 - }); - }} - > - - Session description: - - - {#if $lq__event_session_obj.description} - - -
      {$lq__event_session_obj.description}
      - {:else} - {@html ae_snip.html__not_set} - {/if} -
      + +
    • + {#if $lq__event_session_obj} +
      + Description: + {#if $lq__event_session_obj.description} +
      {$lq__event_session_obj.description}
      + {:else} + No description provided + {/if}
      -
    • -
    - - -
- - -
- {#if $lq__event_presentation_obj_li && $lq__event_presentation_obj_li?.length > 0} - - {/if} -
-{/if} - - + {/if} + + +
diff --git a/src/routes/events/[event_id]/+layout.ts b/src/routes/events/[event_id]/+layout.ts index 232be589..686a2e5e 100644 --- a/src/routes/events/[event_id]/+layout.ts +++ b/src/routes/events/[event_id]/+layout.ts @@ -1,5 +1,5 @@ /** @type {import('./$types').LayoutLoad} */ -console.log(`Events - [event_id] +layout.ts start`); +console.log(`Events - [event_id] +layout.ts`); import { error } from '@sveltejs/kit'; import { browser } from '$app/environment'; @@ -49,11 +49,11 @@ export async function load({ params, parent }) { events_func.load_ae_obj_id__event({ api_cfg: ae_acct.api, event_id: event_id, - inc_file_li: false, // Changing from true 2026-02-04 - inc_location_li: false, // Changing from true 2026-02-04 - inc_session_li: true, - inc_template_li: true, - log_lvl: 1 // Keep background quiet unless debugging + // inc_file_li: false, // Changing from true 2026-02-04 + // inc_location_li: false, // Changing from true 2026-02-04 + // inc_session_li: false, + // inc_template_li: false, + log_lvl: log_lvl // Keep background quiet unless debugging }); } diff --git a/src/routes/events/[event_id]/+page.svelte b/src/routes/events/[event_id]/+page.svelte index 70b29651..656bac8a 100644 --- a/src/routes/events/[event_id]/+page.svelte +++ b/src/routes/events/[event_id]/+page.svelte @@ -1,648 +1,112 @@ - Æ: - {ae_util.shorten_string({ - string: $lq__event_obj?.name, - max_length: 12 - })} - - Pres Mgmt - {$events_loc?.title} + Æ: {$lq__event_obj?.name ?? 'Event'} Hub - - -{#if !$lq__event_obj} -
- - Loading event information... -
-{:else if $lq__event_obj?.enable || $ae_loc.trusted_access} -
- - - - - -

- - {$lq__event_obj.cfg_json?.short_name ?? $lq__event_obj?.name} - - - -

+
+
+

+ {$lq__event_obj?.name ?? 'Event Hub'} +

+

+ Welcome to the event management dashboard. Please select a module to begin. +

- {#if !$events_loc.pres_mgmt.show_content__event_view || $events_loc.pres_mgmt.show_content__event_view == 'default'} -
-
handle_search_trigger())} - autocomplete="off" - class="form grow flex flex-row flex-wrap gap-1 justify-center items-center w-full" +
- - {#if event_session_id_li.length} - - {:else if $events_sess.pres_mgmt.status_qry__search === 'loading'} -
- -

Searching sessions...

-
- {:else} -
-
- - No results to show - -
-
- Please use the search above to find your session. -
+
+
-
- Search by: -
    -
  • Session name
  • -
  • Session description
  • -
  • Presentation name
  • -
  • Presenter names
  • -
  • Presenter ID (member ID)
  • -
-
-
- {/if} - {:else if $events_loc.pres_mgmt.show_content__event_view == 'manage_files' && $ae_loc.trusted_access} - {#if $lq__event_obj} -
-

{$lq__event_obj?.name}

-

Event - Manage Files

-
- {/if} - -
-

- - - Manage and Upload Event Files: -

- - - {#snippet label()} - -
- - Upload global event files only! -
-
- Global event files only
- Recommended: PowerPoint (pptx) or Keynote (key)
- Media: Audio and videos files should be directly embedded - in PowerPoint (PPTX) files
- Supplemental files: mp4, PDF, Word Doc, Excel, txt, etc -
-
- {/snippet} -
- -
- -
-
- {/if} -{:else} -
-{/if} - diff --git a/src/routes/events/[event_id]/+page.ts b/src/routes/events/[event_id]/+page.ts index 1851634f..e69de29b 100644 --- a/src/routes/events/[event_id]/+page.ts +++ b/src/routes/events/[event_id]/+page.ts @@ -1,5 +0,0 @@ -/** @type {import('./$types').PageLoad} */ -console.log(`Events - [event_id] +page.ts start`); - -// export async function load({ params, parent }) { -// } diff --git a/src/routes/events/ae_comp__event_presentation_obj_li.svelte b/src/routes/events/ae_comp__event_presentation_obj_li.svelte index 79b52563..45ba3cb0 100644 --- a/src/routes/events/ae_comp__event_presentation_obj_li.svelte +++ b/src/routes/events/ae_comp__event_presentation_obj_li.svelte @@ -106,14 +106,14 @@ Presentations: - {#if $lq__event_presentation_obj_li?.length} + {#if lq__event_presentation_obj_li?.length} - {$lq__event_presentation_obj_li.length ?? 'None'}× + {lq__event_presentation_obj_li.length ?? 'None'}× {/if} @@ -127,404 +127,396 @@ - {#if $lq__event_presentation_obj_li?.length} -
    - {#each $lq__event_presentation_obj_li as event_presentation_obj} -
  • -
    - {#if $ae_loc.trusted_access && $ae_loc.edit_mode} - - {/if} -
    - -

    - - {ae_util.iso_datetime_formatter( - event_presentation_obj.start_datetime, - 'dddd' - )} - @ - - - {ae_util.iso_datetime_formatter( - event_presentation_obj.start_datetime, - $events_loc.pres_mgmt.time_format - )} - - - { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_presentation({ - api_cfg: $ae_api, - event_presentation_id: - event_presentation_obj.event_presentation_id, - log_lvl: 1 - }) - .then(function (load_results) {}) - .then(function (load_results) { - // $events_trigger = 'load__event_presentation_obj_id'; - // $events_trig_kv['event_presentation_id'] = event_presentation_obj.event_presentation_id; - }); + events_func.create_ae_obj__event_presenter({ + api_cfg: $ae_api, + event_id: $events_slct.event_id, + event_session_id: + $events_slct.event_session_id, + event_presentation_id: + event_presentation_obj.event_presentation_id, + data_kv: presenter_data, + log_lvl: 1 + }); }} + class="btn btn-sm preset-tonal-warning hover:preset-filled-warning-500" > - - - {event_presentation_obj?.name} - - - + + Add Presenter + + {/if} +

- { - console.log(`ae_crud_updated:`, e.detail); - - events_func - .load_ae_obj_id__event_presentation({ - api_cfg: $ae_api, - event_presentation_id: - event_presentation_obj.event_presentation_id, - log_lvl: 1 - }) - .then(function (load_results) {}) - .then(function (load_results) { - // $events_trigger = 'load__event_presentation_obj_id'; - // $events_trig_kv['event_presentation_id'] = event_presentation_obj.event_presentation_id; - }); - }} - > - {#if (event_presentation_obj?.code || event_presentation_obj?.abstract_code) && !$events_loc.pres_mgmt.hide__presentation_code} - - - {event_presentation_obj?.code ?? ''} - {event_presentation_obj?.abstract_code ?? - ''} - - {:else if $ae_loc.trusted_access && $ae_loc.edit_mode} - - - Code: - - {@html event_presentation_obj?.code ?? - ae_snip.html__not_set} - - - {/if} - - - - -
+ + {ae_util.iso_datetime_formatter( + event_presentation_obj.start_datetime, + 'dddd' )} - > - - Date & - - : - - { - console.log(`ae_crud_updated:`, e.detail); + @ + + + {ae_util.iso_datetime_formatter( + event_presentation_obj.start_datetime, + $events_loc.pres_mgmt.time_format + )} + - events_func.load_ae_obj_id__event_presentation({ - api_cfg: $ae_api, - event_presentation_id: - event_presentation_obj?.event_presentation_id - }); - // $events_trigger = 'load__event_presentation_obj_id'; - // $events_trig_kv['event_presentation_id'] = event_presentation_obj?.event_presentation_id; - }} - > - {ae_util.iso_datetime_formatter( - event_presentation_obj.start_datetime, - 'dddd' - )} - - - {ae_util.iso_datetime_formatter( - event_presentation_obj.start_datetime, - $events_loc.pres_mgmt.time_format - )} - - - - { - console.log(`ae_crud_updated:`, e.detail); + { + console.log(`ae_crud_updated:`, e.detail); - events_func.load_ae_obj_id__event_presentation({ - api_cfg: $ae_api, - event_presentation_id: - event_presentation_obj?.event_presentation_id - }); - // $events_trigger = 'load__event_presentation_obj_id'; - // $events_trig_kv['event_presentation_id'] = event_presentation_obj?.event_presentation_id; - }} - > - {ae_util.iso_datetime_formatter( - event_presentation_obj.end_datetime, - $events_loc.pres_mgmt.time_format - )} - -
- -
- { - console.log(`ae_crud_updated:`, e.detail); - - events_func.load_ae_obj_id__event_presentation({ + events_func + .load_ae_obj_id__event_presentation({ api_cfg: $ae_api, event_presentation_id: event_presentation_obj.event_presentation_id, log_lvl: 1 + }) + .then(function (load_results) {}) + .then(function (load_results) { + // $events_trigger = 'load__event_presentation_obj_id'; + // $events_trig_kv['event_presentation_id'] = event_presentation_obj.event_presentation_id; }); - }} - > + }} + > + + + {event_presentation_obj?.name} + + + + + { + console.log(`ae_crud_updated:`, e.detail); + + events_func + .load_ae_obj_id__event_presentation({ + api_cfg: $ae_api, + event_presentation_id: + event_presentation_obj.event_presentation_id, + log_lvl: 1 + }) + .then(function (load_results) {}) + .then(function (load_results) { + // $events_trigger = 'load__event_presentation_obj_id'; + // $events_trig_kv['event_presentation_id'] = event_presentation_obj.event_presentation_id; + }); + }} + > + {#if (event_presentation_obj?.code || event_presentation_obj?.abstract_code) && !$events_loc.pres_mgmt.hide__presentation_code} + + + {event_presentation_obj?.code ?? ''} + {event_presentation_obj?.abstract_code ?? + ''} + + {:else if $ae_loc.trusted_access && $ae_loc.edit_mode} - Description: - - - {#if event_presentation_obj?.description} - + {@html event_presentation_obj?.code ?? + ae_snip.html__not_set} + + + {/if} + + + -
{event_presentation_obj.description}
- {:else} - {@html ae_snip.html__not_set} - {/if} - - -
+ + Date & + + : + + { + console.log(`ae_crud_updated:`, e.detail); - - {#if event_presentation_obj?.event_presentation_id} - - {/if} + events_func.load_ae_obj_id__event_presentation({ + api_cfg: $ae_api, + event_presentation_id: + event_presentation_obj?.event_presentation_id + }); + // $events_trigger = 'load__event_presentation_obj_id'; + // $events_trig_kv['event_presentation_id'] = event_presentation_obj?.event_presentation_id; + }} + > + {ae_util.iso_datetime_formatter( + event_presentation_obj.start_datetime, + 'dddd' + )} + + + {ae_util.iso_datetime_formatter( + event_presentation_obj.start_datetime, + $events_loc.pres_mgmt.time_format + )} + + - + { + console.log(`ae_crud_updated:`, e.detail); - - + {ae_util.iso_datetime_formatter( + event_presentation_obj.end_datetime, + $events_loc.pres_mgmt.time_format + )} + +
+ +
+ { + console.log(`ae_crud_updated:`, e.detail); + + events_func.load_ae_obj_id__event_presentation({ + api_cfg: $ae_api, + event_presentation_id: + event_presentation_obj.event_presentation_id, + log_lvl: 1 + }); + }} + > + + Description: + + + {#if event_presentation_obj?.description} + + +
{event_presentation_obj.description}
+ {:else} + {@html ae_snip.html__not_set} + {/if} + +
+
+ + + + + + - - {/each} - - {:else} - - {/if} + allow_moderator={$events_loc.auth__kv.session[ + $events_slct.event_session_id + ]} + container_class_li={''} + /> + + {/each} + diff --git a/src/routes/events/ae_comp__events_menu_nav.svelte b/src/routes/events/ae_comp__events_menu_nav.svelte index fe5ba49e..6585fc5c 100644 --- a/src/routes/events/ae_comp__events_menu_nav.svelte +++ b/src/routes/events/ae_comp__events_menu_nav.svelte @@ -86,7 +86,7 @@ class="ae_menu__navigation_options flex flex-row flex-wrap gap-0.5 items-center justify-around" > @@ -103,9 +103,9 @@ Back to Session Launcher diff --git a/src/routes/testing/+page.svelte b/src/routes/testing/+page.svelte index cd312478..4c71d3c8 100644 --- a/src/routes/testing/+page.svelte +++ b/src/routes/testing/+page.svelte @@ -570,7 +570,7 @@