diff --git a/src/app.postcss b/src/app.postcss
index 80ce9510..5cd27709 100644
--- a/src/app.postcss
+++ b/src/app.postcss
@@ -2,6 +2,7 @@
@tailwind components;
@tailwind utilities;
@tailwind variants;
+/* There are no more Tailwind layers. */
html,
body {
diff --git a/src/lib/ae_events__event_file.ts b/src/lib/ae_events__event_file.ts
index 2e8e740a..98d6186e 100644
--- a/src/lib/ae_events__event_file.ts
+++ b/src/lib/ae_events__event_file.ts
@@ -399,6 +399,7 @@ export async function search__event_file(
// This function will loop through the event_file_obj_li and save each one to the DB.
+// Updated 2024-10-04
export function db_save_ae_obj_li__event_file(
{
obj_type,
@@ -468,11 +469,15 @@ export function db_save_ae_obj_li__event_file(
event_location_code: obj.event_location_code,
event_location_name: obj.event_location_name,
event_session_code: obj.event_session_code,
+ event_session_type_code: obj.event_session_type_code,
event_session_name: obj.event_session_name,
event_session_start_datetime: obj.event_session_start_datetime,
+ event_session_end_datetime: obj.event_session_end_datetime,
event_presentation_code: obj.event_presentation_code,
+ event_presentation_type_code: obj.event_presentation_type_code,
event_presentation_name: obj.event_presentation_name,
event_presentation_start_datetime: obj.event_presentation_start_datetime,
+ event_presentation_end_datetime: obj.event_presentation_end_datetime,
event_presenter_given_name: obj.event_presenter_given_name,
event_presenter_family_name: obj.event_presenter_family_name,
event_presenter_full_name: obj.event_presenter_full_name,
diff --git a/src/lib/ae_events_stores.ts b/src/lib/ae_events_stores.ts
index 48a353dc..01ae105c 100644
--- a/src/lib/ae_events_stores.ts
+++ b/src/lib/ae_events_stores.ts
@@ -99,7 +99,9 @@ let events_local_data_struct: key_val = {
// Event Presentation Launcher (and native Electron app)
'launcher': {
- controller_group_code: 'ae_launcher',
+ // default - browser, onsite - browser onsite, native - Electron app onsite
+ app_mode: 'default', // 'default', 'native', 'onsite'
+ ws_connect: false,
qry_limit__sessions: 50,
qry_limit__presentations: 25,
@@ -137,6 +139,17 @@ let events_local_data_struct: key_val = {
// 'host_file_temp_path': aether_cfg_data.app.host_file_temp_path,
'host_file_config_path': 'device_configs/ae_native_app_config.default.json',
},
+
+ screen_saver_img_list: [],
+ modal__title: '-- Not Set --',
+ modal__open: null,
+ modal__open_filename: null,
+ modal_img_src: null,
+
+ controller: 'local',
+ controller_group_code: 'launcher-00',
+ // controller_cmd: null,
+ // controller_trigger_send: null,
},
// Lead Retrievals (Exhibit)
@@ -324,6 +337,11 @@ let events_session_data_struct: key_val = {
// Event Presentation Launcher (and native Electron app)
'launcher': {
+ ws_connect_status: null,
+ av_recording_status: null,
+ controller_cmd: null,
+ controller_trigger_send: null,
+ event_file_open: {}, // This is from the older Launcher.
native: {
},
},
diff --git a/src/lib/db_events.ts b/src/lib/db_events.ts
index 5031d576..70b444c1 100644
--- a/src/lib/db_events.ts
+++ b/src/lib/db_events.ts
@@ -262,11 +262,15 @@ export interface File {
event_location_code?: null|string;
event_location_name?: null|string;
event_session_code?: null|string;
+ event_session_type_code?: null|string;
event_session_name?: string;
event_session_start_datetime?: null|Date;
+ event_session_end_datetime?: null|Date;
event_presentation_code?: null|string;
+ event_presentation_type_code?: null|string;
event_presentation_name?: string;
event_presentation_start_datetime?: null|Date;
+ event_presentation_end_datetime?: null|Date;
event_presenter_given_name?: null|string;
event_presenter_family_name?: null|string;
event_presenter_full_name?: null|string;
diff --git a/src/lib/element_websocket_v2.svelte b/src/lib/element_websocket_v2.svelte
index c1ca796b..f23d8f5b 100644
--- a/src/lib/element_websocket_v2.svelte
+++ b/src/lib/element_websocket_v2.svelte
@@ -1,18 +1,18 @@
-
+
- Websockets
+ Websocket Messages & Commands
-{#if 1==2}
+{#if 1==1}
{/if}
@@ -258,38 +281,62 @@ ae_open:event_file=Kljq0uiTlXt (video)
-Messages
+Messages [grp, client, target, type]
-
- {#each ws_received_list_other as msg_entry}
-
- [{(msg_entry.group_id||'No Group ID')}]
- {(msg_entry.client_id||'No Client ID')}
- —
- {(msg_entry.target||'No Target')}
- —
- {(msg_entry.type||'No Type')}: {msg_entry.msg}
-
+
+ {#each ws_received_list_other as msg_entry, index}
+
+
+
+ [{(msg_entry.group_id||'No Group ID')}]
+ {(msg_entry.client_id.toString().slice(-5)||'No Client ID')}
+ –
+ {(msg_entry.target||'No Target')}
+ |
+
+ {(msg_entry.type||'No Type')}:
+
+
+ "{msg_entry.msg}"
+
+
+
{/each}
-
+
-Commands
+Commands
-
+
{#each ws_received_list_cmd as cmd_entry}
-
- [{(cmd_entry.group_id||'No Group ID')}]
- {(cmd_entry.client_id||'No Client ID')}
- —
- {(cmd_entry.target||'No Target')}
- —
- {(cmd_entry.type||'No Type')}: {cmd_entry.cmd}
+
+
+
+ [{(cmd_entry.group_id||'No Group ID')}]
+ {(cmd_entry.client_id.toString().slice(-5)||'No Client ID')}
+ —
+ {(cmd_entry.target||'No Target')}
+ |
+
+ {(cmd_entry.type||'No Type')}:
+
+
+ "{cmd_entry.cmd}"
+
+
{/each}
-
+
diff --git a/src/routes/events/[event_id]/(launcher)/+layout.svelte b/src/routes/events/[event_id]/(launcher)/+layout.svelte
index 86ec0d2f..734e98af 100644
--- a/src/routes/events/[event_id]/(launcher)/+layout.svelte
+++ b/src/routes/events/[event_id]/(launcher)/+layout.svelte
@@ -3,25 +3,19 @@
export let data: any;
let log_lvl = 0;
-import { onMount } from 'svelte';
+import { onMount, tick } from 'svelte';
import { sineIn } from 'svelte/easing';
import { liveQuery } from "dexie";
-import { Drawer, Footer } from 'flowbite-svelte';
+import { Drawer, Footer, Modal } from 'flowbite-svelte';
import { ae_util } from '$lib/ae_utils/ae_utils';
import { db_events } from '$lib/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 Launcher_cfg from './launcher_cfg.svelte';
+import Launcher_menu from './launcher_menu.svelte';
+import Launcher_session_view from './launcher_session_view.svelte';
import Element_websocket_v2 from '$lib/element_websocket_v2.svelte';
-import Event_launcher_menu from './launcher_menu.svelte';
-import Event_launcher_session_view from './launcher_session_view.svelte';
-
-// import { AppShell, AppBar, initializeStores } from '@skeletonlabs/skeleton';
-
-// import { ae_loc, ae_sess, ae_api, slct, slct_trigger } from '$lib/ae_stores';
-// import { events_loc, events_slct } from '$lib/ae_events_stores';
-
-
// Variables
// Quickly save the data passed from the parent(s) to the Svelte stores, localStorage, and other.
@@ -30,6 +24,21 @@ $slct.account_id = data.account_id;
let ae_acct = data[$slct.account_id];
// console.log(`ae_acct = `, ae_acct);
+// This is a just in case check...
+if (!$events_loc?.launcher) {
+ $events_loc.launcher = {
+ app_mode: 'default',
+
+ controller: 'local',
+ controller_group_code: 'launcher-00',
+ ws_connect: false,
+
+ hide_drawer__cfg: true,
+ hide_drawer__debug: true,
+ }
+}
+
+
console.log(`event_id: ${data.params.event_id}`);
$events_slct.event_id = data.params.event_id;
@@ -99,6 +108,14 @@ $: lq__event_session_obj_li = liveQuery(async () => {
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`);
+// $events_sess.launcher.controller_cmd = `ae_close:event_file_modal`;
+// $events_sess.launcher.controller_trigger_send = true;
+// }
+// }
+
onMount(() => {
console.log('Events - Launcher: +layout.svelte');
// Hide the AppShell shell header (id="shell-header") and footer
@@ -106,6 +123,199 @@ onMount(() => {
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) {
+ console.log('*** handle_ws_conn() ***');
+ console.log(event);
+ if (event.detail.status == 'connected') {
+ $events_sess.launcher.ws = {}; // Reset WS related values on a new connection.
+ $events_sess.launcher.ws.status = 'connected';
+ } else {
+ $events_sess.launcher.ws = {}; // Reset WS related values when disconnected connection.
+ $events_sess.launcher.ws.status = 'disconnected';
+ }
+ $events_sess.launcher = $events_sess.launcher;
+}
+
+
+// When this is called something seems to go wrong. It creates a loop when connected.
+function handle_ws_recv(event) {
+ console.log('*** handle_ws_recv() ***');
+ console.log(event);
+
+ if (event.detail.type == 'cmd' && event.detail.cmd) {
+ let cmd = event.detail.cmd;
+ console.log(cmd);
+
+ if (cmd.startsWith('ae_load:')) {
+ console.log();
+ let cmd_parts = cmd.split(':');
+ let obj_parts = cmd_parts[1].split('=');
+ let obj_type = obj_parts[0];
+ let obj_id = obj_parts[1];
+
+ if (obj_type == 'event_session') {
+ $slct.event_session_id = obj_id;
+ $slct_trigger = 'event_session';
+ $events_sess.launcher.show_launcher_message = false;
+ }
+ } else if (cmd.startsWith('ae_open:')) {
+ console.log();
+ let cmd_parts = cmd.split(':');
+ let obj_parts = cmd_parts[1].split('=');
+ let obj_type = obj_parts[0];
+ let obj_id = obj_parts[1];
+
+ // NOTE: This is not finished yet.
+ if (obj_type == 'event_file') {
+ $slct.event_file_id = obj_id;
+ $slct_trigger = 'event_file';
+ $events_sess.launcher.event_file_open.open_status = 'open';
+ // $events_sess.launcher.show_launcher_message = false;
+ // 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});
+ // if (as_modal_result) {
+ // console.log($events_sess.launcher);
+ // console.log(event_file_obj);
+ // events_sess.launcher.set({...$events_sess.launcher, ...as_modal_result});
+ // }
+
+ }
+ // NOTE: This is not finished yet.
+ } else if (cmd.startsWith('ae_close:')) {
+ console.log();
+ let cmd_parts = cmd.split(':');
+ let what = cmd_parts[1];
+ // let obj_type = obj_parts[0];
+ // let obj_id = obj_parts[1];
+
+ if (what == 'event_file_modal') {
+ $slct.event_file_id = null;
+ $slct_trigger = 'event_file';
+ $events_sess.launcher.event_file_open.open_status = 'close';
+ }
+ } else if (cmd.startsWith('ae_refresh:')) {
+ console.log();
+ let cmd_parts = cmd.split(':');
+ let what = cmd_parts[1];
+ // let obj_type = obj_parts[0];
+ // let obj_id = obj_parts[1];
+
+ if (what == 'now') {
+ // window.localStorage.clear();
+ location.reload();
+ } else {
+ console.log('OOPS? What went wrong?');
+ }
+ }
+ } else {
+ console.log('Unrecognized command');
+ }
+}
+
+
+function handle_ws_sent(event) {
+ console.log('*** handle_ws_sent() ***');
+ console.log(event);
+ let command = event.detail.cmd;
+ console.log(command);
+
+ $events_sess.launcher.controller_cmd = null;
+ $events_sess.launcher.controller_trigger_send = null;
+}
+/* *** END *** Handle WebSocket events */
+
+
+$: if ($slct_trigger == 'event_file' && $slct.event_file_id && $events_sess.launcher?.event_file_open.open_status == 'open') {
+ $slct_trigger = null;
+ // handle_event_file_open();
+}
+
+$: if ($slct_trigger == 'event_file' && $events_sess.launcher?.event_file_open.open_status == 'close') {
+ $slct_trigger = null;
+ // Assuming just event file modal for now
+ // handle_event_file_close();
+}
+
+async function handle_event_file_open () {
+ let event_file_obj;
+ if ($slct.event_file_obj && $slct.event_file_obj.event_file_id_random) {
+ console.log($slct.event_file_obj);
+ event_file_obj = $slct.event_file_obj;
+ } else {
+ console.log('Need to look up the event file details first.');
+ // let get_event_file_obj_result = await get_event_file_obj({event_file_id: $slct.event_file_id});
+
+ // event_file_obj = get_event_file_obj_result;
+ // console.log(event_file_obj);
+ }
+
+ // let as_modal_result = open_event_file_as_modal({
+ // event_file_id: event_file_obj.event_file_id_random,
+ // filename: event_file_obj.filename,
+ // extension: event_file_obj.extension,
+ // modal_title: ae_util.shorten_filename(event_file_obj.filename, 75)
+ // });
+
+ // if (as_modal_result) {
+ // console.log($events_sess.launcher);
+
+ // events_sess.launcher.set({...$events_sess.launcher, ...as_modal_result});
+ // // $events_sess.launcher.event_file_open = as_modal_result;
+ // }
+}
+
+async function handle_event_file_close () {
+ let as_modal_result = close_event_file_as_modal({
+ });
+
+ if (as_modal_result) {
+ events_sess.launcher.set({...$events_sess.launcher, ...as_modal_result});
+ }
+}
+
+
+
+// Updated 2023-3-31
+// export let open_event_file_as_modal = function open_event_file_as_modal({event_file_id, filename=null, extension=null, modal_title='Poster'}) {
+// console.log('*** open_event_file_as_modal() ***');
+
+// // NOTE: I can not set the ae_event_launcher values directly. Passing them back to the component and setting them there. Not ideal. This might be improved/fixed in the future?
+// let launcher_modal_values = {'show_modal_file': true, 'event_file_open': {}};
+
+// // launcher_modal_values.show_modal_file = true;
+// if (extension == 'png' || extension == 'jpg') {
+// launcher_modal_values.event_file_open.file_type = 'image';
+// } else if (extension == 'mp4' || extension == 'mov') {
+// launcher_modal_values.event_file_open.file_type = 'video';
+// } else {
+// return false;
+// }
+
+// launcher_modal_values.event_file_open.file_src = `/event/file/${event_file_id}/download`;
+// launcher_modal_values.event_file_open.modal_title = modal_title;
+
+// // NOTE: Be sure to set these values in the actual ae_event_launcher object!
+// return launcher_modal_values;
+// }
+
+// Updated 2023-3-31
+export let close_event_file_as_modal = function close_event_file_as_modal({}) {
+ console.log('*** close_event_file_as_modal() ***');
+
+ // NOTE: I can not set the ae_event_launcher values directly. Passing them back to the component and setting them there. Not ideal. This might be improved/fixed in the future?
+ let launcher_modal_values = {'show_modal_file': false, 'event_file_open': {}};
+
+ // NOTE: Be sure to set these values in the actual ae_event_launcher object!
+ return launcher_modal_values;
+}
+
+
+
@@ -167,6 +377,7 @@ console.log(`BROWSER Events - [event_id] launcher +layout.svelte start`);
max-w-xs
border-r border-gray-200
"
+ class:hidden={$events_loc.launcher.hide__launcher_menu}
>
-
-
+
-
- ($events_loc.launcher.hide_drawer__cfg = false)}
- class="btn btn-sm p-0.5 variant-soft-error hover:variant-filled-error"
- >
-
-
-
-
@@ -241,14 +442,14 @@ console.log(`BROWSER Events - [event_id] launcher +layout.svelte start`);
{/if}
{#if $events_slct.event_session_id && $lq__event_session_obj}
-
-
+
{/if}
@@ -287,7 +488,7 @@ console.log(`BROWSER Events - [event_id] launcher +layout.svelte start`);
- {#if $events_loc.launcher?.av_recording}
+ {#if $events_sess.launcher?.av_recording_status}
AV Recording Active
{:else}
AV Recording Inactive
@@ -305,6 +506,18 @@ console.log(`BROWSER Events - [event_id] launcher +layout.svelte start`);
+
+
+ ($events_loc.launcher.hide_drawer__cfg = false)}
+ class="btn btn-sm p-0.5 variant-soft-error hover:variant-filled-error"
+ >
+
+
+
+
+