From 06df9a623033bfe7106106241380dcb4a72af2c2 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 14 Jun 2024 14:42:49 -0400 Subject: [PATCH] Everything is working except for the file uploads --- src/lib/ae_events_functions.ts | 174 +++++++++- src/lib/db_events.ts | 75 ++++- src/routes/+layout.svelte | 4 +- .../session/[slug]/+page.svelte | 183 +++++------ .../events_pres_mgmt/session/[slug]/+page.ts | 13 + .../session/[slug]/form_agree.svelte | 12 +- .../session/[slug]/presenter_view.svelte | 311 ++++++++++++++++++ 7 files changed, 652 insertions(+), 120 deletions(-) create mode 100644 src/routes/events_pres_mgmt/session/[slug]/presenter_view.svelte diff --git a/src/lib/ae_events_functions.ts b/src/lib/ae_events_functions.ts index a5b3c1ea..5abbe315 100644 --- a/src/lib/ae_events_functions.ts +++ b/src/lib/ae_events_functions.ts @@ -103,6 +103,111 @@ async function handle_load_ae_obj_li__event( } +// Updated 2024-06-14 +async function handle_load_ae_obj_id__event_file( + { + api_cfg, + event_file_id, + try_cache=false, + log_lvl=0 + } : { + api_cfg: any, + event_file_id: string, + try_cache?: boolean, + log_lvl?: number + } + ) { + console.log(`*** handle_load_ae_obj_id__event_file() *** event_file_id=${event_file_id}`); + + let params = {}; + + ae_promises.load__event_file_obj = await api.get_ae_obj_id_crud({ + api_cfg: api_cfg, + obj_type: 'event_file', + obj_id: event_file_id, // NOTE: This is the FQDN, not normally the ID. + use_alt_table: false, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. + use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value + params: params, + log_lvl: log_lvl + }) + .then(function (event_file_obj_get_result) { + if (event_file_obj_get_result) { + // This is expecting a list + handle_db_save_ae_obj_li__event_file({obj_type: 'event_file', obj_li: [event_file_obj_get_result]}); + return event_file_obj_get_result; + } else { + console.log('No results returned.'); + return null; + } + }) + .catch(function (error) { + console.log('No results returned or failed.', error); + }); + + return ae_promises.load__event_file_obj; +} + + +// Updated 2024-06-14 +async function handle_load_ae_obj_li__event_file( + { + api_cfg, + event_session_id, + params={}, + try_cache=true, + log_lvl=0 + } : { + api_cfg: any, + event_session_id: string, + params?: key_val, + try_cache?: boolean, + log_lvl?: number + } + ) { + console.log(`*** handle_load_ae_obj_li__event_file() *** event_id=${event_session_id}`); + + let enabled: string = (params.qry__enabled ?? 'enabled'); // all, disabled, enabled + let hidden: string = (params.qry__hidden ?? 'not_hidden'); // all, hidden, not_hidden + let limit: number = (params.qry__limit ?? 99); // 99 + let offset: number = (params.qry__offset ?? 0); // 0 + + let params_json: key_val = {}; + + // console.log('params_json:', params_json); + + ae_promises.load__event_file_obj_li = await api.get_ae_obj_li_for_obj_id_crud({ + api_cfg: api_cfg, + obj_type: 'event_file', + for_obj_type: 'event_session', + for_obj_id: event_session_id, + use_alt_table: true, // NOTE: This will use the table_name_alt value instead of the table_name value in the API config. + use_alt_base: false, // NOTE: This will use the base_name_alt value instead of the base_name value + enabled: enabled, + hidden: hidden, + order_by_li: {'priority': 'DESC', 'sort': 'DESC', 'updated_on': 'DESC', 'created_on': 'DESC'}, + limit: limit, + offset: offset, + params_json: params_json, + params: params, + log_lvl: log_lvl + }) + .then(function (event_file_obj_li_get_result) { + if (event_file_obj_li_get_result) { + handle_db_save_ae_obj_li__event_file({obj_type: 'event_file', obj_li: event_file_obj_li_get_result}); + return event_file_obj_li_get_result; + } else { + return []; + } + }) + .catch(function (error) { + console.log('No results returned or failed.', error); + }); + + console.log('ae_promises.load__event_file_obj_li:', ae_promises.load__event_file_obj_li); + return ae_promises.load__event_file_obj_li; +} + + // Updated 2024-06-10 async function handle_load_ae_obj_id__event_session( { @@ -205,7 +310,7 @@ async function handle_load_ae_obj_li__event_session( }); console.log('ae_promises.load__event_session_obj_li:', ae_promises.load__event_session_obj_li); - return ae_promises.load__event_session + return ae_promises.load__event_session; } @@ -1338,6 +1443,67 @@ function handle_db_save_ae_obj_li__exhibitor_tracking({obj_type, obj_li}) { } +// This function will loop through the event_file_obj_li and save each one to the DB. +function handle_db_save_ae_obj_li__event_file({obj_type, obj_li}) { + console.log(`*** handle_db_save_ae_obj_li__event_file() ***`); + + if (obj_li && obj_li.length) { + obj_li.forEach(async function (obj) { + console.log(`ae_obj ${obj_type}:`, obj); + + try { + const id_random = await db_events.files.put({ + id_random: obj.event_file_id_random, + event_file_id_random: obj.event_file_id_random, + hosted_file_id_random: obj.hosted_file_id_random, + hash_sha256: obj.hash_sha256, // Renamed with alias in FastAPI model + + for_type: obj.for_type, + for_id_random: obj.for_id_random, + + event_id_random: obj.event_id_random, + event_session_id_random: obj.event_session_id_random, + event_presentation_id_random: obj.event_presentation_id_random, + event_presenter_id_random: obj.event_presenter_id_random, + event_location_id_random: obj.event_location_id_random, + + filename: obj.filename, + extension: obj.extension, + + open_in_os: obj.open_in_os, + + lu_file_purpose_id: obj.lu_file_purpose_id, // Not id_random in this case? + lu_event_file_purpose_name: obj.lu_event_file_purpose_name, + file_purpose: obj.file_purpose, + + enable: obj.enable, + hide: obj.hide, + priority: obj.priority, + sort: obj.sort, + group: obj.group, + notes: obj.notes, + created_on: obj.created_on, + updated_on: obj.updated_on, + + filename_no_ext: obj.filename_no_ext, + filename_w_ext: obj.filename_w_ext, + hosted_file_content_type: obj.hosted_file_content_type, + hosted_file_size: obj.hosted_file_size, + }); + // console.log(`Put obj with ID: ${obj.event_file_id_random} or ${id_random}`); + } catch (error) { + let status = `Failed to put ${obj.event_file_id_random}: ${error}`; + console.log(status); + } + + // const id_random = await db_events.files.put(obj); + // console.log(`Put obj with ID: ${obj.event_file_id_random}`); + }); + + return true; + } +} + // This function will loop through the event_session_obj_li and save each one to the DB. function handle_db_save_ae_obj_li__event_session({obj_type, obj_li}) { console.log(`*** handle_db_save_ae_obj_li__event_session() ***`); @@ -1387,6 +1553,7 @@ function handle_db_save_ae_obj_li__event_session({obj_type, obj_li}) { // From SQL view // event_name: obj.event_name, + file_count: obj.file_count, event_location_code: obj.event_location_code, event_location_name: obj.event_location_name, }); @@ -1528,6 +1695,8 @@ function handle_db_save_ae_obj_li__event_presenter({obj_type, obj_li}) { notes: obj.notes, created_on: obj.created_on, updated_on: obj.updated_on, + + file_count: obj.file_count, }); // console.log(`Put obj with ID: ${obj.event_presenter_id_random} or ${id_random}`); } catch (error) { @@ -1583,6 +1752,9 @@ let export_obj = { handle_load_ae_obj_id__event: handle_load_ae_obj_id__event, handle_load_ae_obj_li__event: handle_load_ae_obj_li__event, + handle_load_ae_obj_id__event_file: handle_load_ae_obj_id__event_file, + handle_load_ae_obj_li__event_file: handle_load_ae_obj_li__event_file, + handle_load_ae_obj_id__event_session: handle_load_ae_obj_id__event_session, handle_load_ae_obj_li__event_session: handle_load_ae_obj_li__event_session, handle_search__event_session: handle_search__event_session, diff --git a/src/lib/db_events.ts b/src/lib/db_events.ts index 4de6ef85..ff8b39c6 100644 --- a/src/lib/db_events.ts +++ b/src/lib/db_events.ts @@ -30,6 +30,9 @@ export interface Event { notes: null|string; created_on: Date; updated_on: null|Date; + + // Additional fields for convenience (database views) + file_count: number; } export interface Badge { @@ -172,6 +175,46 @@ export interface Exhibit_tracking { updated_on: null|Date; } +export interface File { + id_random: string; + event_file_id_random: string; + hosted_file_id_random: string; + hash_sha256: string; + + for_type: string; + for_id_random: string; + + event_id_random: string; + event_session_id_random: string; + event_presentation_id_random: string; + event_presenter_id_random: string; + event_location_id_random: string; + + filename: string; + extension: string; + + open_in_os: null|string; // null, empty, 'mac', or 'win' + + lu_file_purpose_id: string; + lu_event_file_purpose_name: string; + file_purpose: string; + + enable: null|boolean; + hide: null|boolean; + priority: null|boolean + sort: null|number; + group: null|string; + notes: null|string; + created_on: Date; + updated_on: null|Date; + + // Additional fields for convenience (database views) + filename_no_ext: string; + filename_w_ext: string; + hosted_file_content_type: string; + hosted_file_size: number; // In bytes +} + export interface Session { id_random: string; event_session_id_random: string; @@ -196,6 +239,11 @@ export interface Session { hide_event_launcher: null|boolean; + alert: null|boolean; + alert_msg: null|string; + + data_json: null|string; + enable: null|boolean; hide: null|boolean; priority: null|boolean @@ -204,6 +252,11 @@ export interface Session { notes: null|string; created_on: Date; updated_on: null|Date; + + // Additional fields for convenience (database views) + file_count: number; + event_location_code: string; + event_location_name: string; } // Updated 2024-06-10 @@ -291,6 +344,9 @@ export interface Presenter { notes: null|string; created_on: Date; updated_on: null|Date; + + // Additional fields for convenience (database views) + file_count: number; } @@ -302,6 +358,7 @@ export class MySubClassedDexie extends Dexie { badges!: Table; exhibits!: Table; exhibit_tracking!: Table; + files!: Table; sessions!: Table; presentations!: Table; presenters!: Table; @@ -348,8 +405,16 @@ export class MySubClassedDexie extends Dexie { name, description, start_datetime, end_datetime, passcode, hide_event_launcher, - enable, hide, priority, sort, group, notes, created_on, updated_on - `, + enable, hide, priority, sort, group, notes, created_on, updated_on`, + + files: ` + id_random, event_file_id_random, hosted_file_id_random, hash_sha256, + for_type, for_id_random, + event_id_random, event_session_id_random, event_presentation_id_random, event_presenter_id_random, event_location_id_random, + filename, extension, + open_in_os, + lu_file_purpose_id, lu_event_file_purpose_name, file_purpose, + enable, hide, priority, sort, group, notes, created_on, updated_on`, presentations: ` id_random, event_presentation_id_random, external_id, code, @@ -357,7 +422,8 @@ export class MySubClassedDexie extends Dexie { event_id_random, event_session_id_random, event_abstract_id_random, abstract_code, name, description, start_datetime, end_datetime, hide_event_launcher, - enable, hide, priority, sort, group, notes, created_on, updated_on`, + enable, hide, priority, sort, group, notes, created_on, updated_on + `, presenters: ` id_random, event_presenter_id_random, external_id, code, @@ -368,7 +434,8 @@ export class MySubClassedDexie extends Dexie { biography, agree, comments, passcode, hide_event_launcher, data_json, - enable, hide, priority, sort, group, notes, created_on, updated_on`, + enable, hide, priority, sort, group, notes, created_on, updated_on + `, }); } } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 4b4aaa4b..f12eae11 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -224,7 +224,9 @@ onMount(() => { // let event_file_id = endpoint.split('/')[3]; // ae_downloads[event_file_id] = { - $ae_sess.download = { + + // $ae_sess.download = { + $ae_sess.download[endpoint] = { 'endpoint': endpoint, 'filename': event.data.filename, 'size_total': event.data.size_total, diff --git a/src/routes/events_pres_mgmt/session/[slug]/+page.svelte b/src/routes/events_pres_mgmt/session/[slug]/+page.svelte index f3d23031..8a693b0f 100644 --- a/src/routes/events_pres_mgmt/session/[slug]/+page.svelte +++ b/src/routes/events_pres_mgmt/session/[slug]/+page.svelte @@ -26,6 +26,7 @@ import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_ev import { events_func } from '$lib/ae_events_functions'; import Form_agree from './form_agree.svelte'; +import Presenter_view from './presenter_view.svelte'; // Quickly save the data passed from the parent(s) to the Svelte stores, localStorage, and other. $slct.account_id = data.account_id; @@ -106,6 +107,10 @@ let lq__event_presenter_obj = liveQuery( $events_slct.event_presenter_obj = $lq__event_presenter_obj; +let lq__event_file_obj_li = liveQuery( + () => db_events.files.where('event_session_id_random').equals($events_slct.event_session_id).toArray() +); + // Load the Event Obj with ID based on the slug param. // $events_slct.event_id = param_slug_event_id; // console.log('Selected Event ID:', $events_slct.event_id); @@ -331,14 +336,14 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode, console.log('Show/Hide Description'); $events_loc.pres_mgmt.show_content__session_description = !$events_loc.pres_mgmt.show_content__session_description; }} - class="btn btn-sm variant-soft-surface hover:variant-filled-surface" + class="btn btn-sm variant-soft-surface hover:variant-filled-surface text-xs" > {#if $events_loc.pres_mgmt.show_content__session_description} - Hide Description + Hide Description {:else} - Show + Show {/if} @@ -580,14 +585,14 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode, $events_loc.pres_mgmt.show_content__presentation_description = event_presentation_obj.event_presentation_id_random; } }} - class="btn btn-sm variant-soft-surface hover:variant-filled-surface" + class="btn btn-sm variant-soft-surface hover:variant-filled-surface text-xs" > {#if $events_loc.pres_mgmt.show_content__presentation_description == event_presentation_obj.event_presentation_id_random} - Hide Description + Hide Description {:else} - Show + Show {/if} @@ -610,7 +615,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
  • +
  • + {/if} + {/each} + + {/if} + - {#await event_presentation_obj.event_file_li} + {/each} @@ -844,7 +900,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
    - - - +
    @@ -884,6 +939,8 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
    +
    +
    - - - - -

    Files:

    - - -
      - {#if $events_slct.presenter_obj.file_li} - {#each $events_slct.presenter_obj.file_li as file_obj} -
    • - - {file_obj.name} -
    • - {/each} - {:else} -
    • - - No files uploaded -
    • - {/if} -
    - +
    -
    + +
    + {/if} diff --git a/src/routes/events_pres_mgmt/session/[slug]/+page.ts b/src/routes/events_pres_mgmt/session/[slug]/+page.ts index b00701f5..92a4a7e9 100644 --- a/src/routes/events_pres_mgmt/session/[slug]/+page.ts +++ b/src/routes/events_pres_mgmt/session/[slug]/+page.ts @@ -66,6 +66,19 @@ export async function load({ parent }) { // route console.log(`load_event_presentation_obj_li = `, load_event_presentation_obj_li); ae_acct.slct.event_presentation_obj_li = load_event_presentation_obj_li; + let load_event_file_obj_li = await events_func.handle_load_ae_obj_li__event_file({ + api_cfg: ae_acct.api, + event_session_id: event_session_id, + params: {enabled: 'all', qry__limit: 50}, + try_cache: false + }) + .then((event_file_obj_li) => { + console.log(`event_file_obj_li = `, event_file_obj_li); + return event_file_obj_li; + }); + console.log(`load_event_file_obj_li = `, load_event_file_obj_li); + ae_acct.slct.event_file_obj_li = load_event_file_obj_li; + // WARNING: Precaution against shared data between sites and presentations. data[account_id] = ae_acct; diff --git a/src/routes/events_pres_mgmt/session/[slug]/form_agree.svelte b/src/routes/events_pres_mgmt/session/[slug]/form_agree.svelte index ab5fa836..bcf31075 100644 --- a/src/routes/events_pres_mgmt/session/[slug]/form_agree.svelte +++ b/src/routes/events_pres_mgmt/session/[slug]/form_agree.svelte @@ -92,7 +92,6 @@ async function handle_submit_form(event) { } - async function handle_update__event_presenter({ obj_type, obj_id, @@ -129,14 +128,10 @@ async function handle_update__event_presenter({ } - - - - // function send_init_confirm_email() { // console.log(`*** send_init_confirm_email() *** to ${$lq__event_presenter_obj.email}.`); -// let subject = `LCI 2024 Pres Mgmt Hub Link for ${$lq__event_session_obj.name} (ID: ${$lq__event_session_obj.eventt_session_id_random})`; +// let subject = `LCI 2024 Pres Mgmt Hub Link for ${$lq__event_session_obj.name} (ID: ${$lq__event_session_obj.event_session_id_random})`; // let body_html = ` //
    ${$lq__event_session_obj.full_name}, @@ -161,8 +156,6 @@ async function handle_update__event_presenter({ // }); // } - - {#await $lq__event_presenter_obj} @@ -183,6 +176,7 @@ async function handle_update__event_presenter({ />
    +

    {$lq__event_presenter_obj.full_name} ({$lq__event_presenter_obj.email}) agrees to the following terms and conditions for the presentation: @@ -287,10 +281,8 @@ async function handle_update__event_presenter({ - -

    Agree?

    +console.log(`ae_events_pres_mgmt session [slug] form_agree.svelte`); + +import { onMount } from 'svelte'; +import { clipboard, FileDropzone } from '@skeletonlabs/skeleton'; +import { liveQuery } from "dexie"; + +import type { key_val } from '$lib/ae_stores'; +import { ae_util } from '$lib/ae_utils'; +import { api } from '$lib/api'; +import Element_data_store from '$lib/element_data_store.svelte'; +import Element_ae_crud from '$lib/element_ae_crud.svelte'; + +import { ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_stores'; +import { db_events } from "$lib/db_events"; +import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_events_stores'; +import { events_func } from '$lib/ae_events_functions'; + + +let ae_triggers: key_val = {}; +let ae_promises: key_val = {}; // Promise; +let ae_placeholder_li: key_val = {}; + +let lq__event_session_obj = liveQuery( + () => db_events.sessions.get($events_slct.event_session_id) +); + +// let lq__event_presentation_obj = liveQuery( +// async () => await db_events.presentations.get($events_slct.event_presentation_id) +// ); + +console.log(`$events_slct.event_presenter_id:`, $events_slct.event_presenter_id); +let lq__event_presenter_obj = liveQuery( + () => db_events.presenters.get($events_slct.event_presenter_id) +); + +let lq__event_file_obj_li = liveQuery( + () => db_events.files.where('event_presenter_id_random').equals($events_slct.event_presenter_id).toArray() +); + +// $events_slct.event_presenter_obj = $lq__event_presenter_obj; + +// $events_sess.pres_mgmt.disable_submit__opt_out = false; + +// let tmp_agree = false; +// let tmp_opt_out: key_val = { +// audio: false, +// video: false, +// transcription_and_publication: false, +// publication_in_app: false +// }; + +onMount(() => { + console.log('Events Session [slug]: presenter_view.svelte'); + console.log(`$events_slct.event_presenter_id:`, $events_slct.event_presenter_id); + console.log(`$lq__event_presenter_obj:`, $lq__event_presenter_obj); +}); + + +// async function handle_submit_form(event) { +// console.log('*** handle_submit_form() ***'); + +// $events_sess.pres_mgmt.disable_submit__opt_out = true; +// $events_sess.pres_mgmt.submit_status = 'saving'; + +// // Data in +// let form_data = new FormData(event.target); +// console.log(form_data); + +// let opt_out_di: key_val = ae_util.extract_prefixed_form_data({prefix: null, form_data: form_data, trim_values: true, bool_tf_str: true, log_lvl: 0}); +// console.log(`opt_out_di:`, opt_out_di); + +// // Data out +// let opt_out_do: key_val = {}; +// opt_out_do.optout_audio = opt_out_di.optout_audio??false; +// opt_out_do.optout_video = opt_out_di.optout_video??false; +// opt_out_do.optout_transcription_and_publication = opt_out_di.optout_transcription_and_publication??false; +// opt_out_do.optout_publication_in_app = opt_out_di.optout_publication_in_app??false; + +// console.log(`opt_out_do:`, opt_out_do); + +// let data_out = { +// data_json: opt_out_do, +// } + +// ae_promises.update__event_presenter_obj = await handle_update__event_presenter({ +// obj_type: 'event_presenter', +// obj_id: $lq__event_presenter_obj?.event_presenter_id_random, +// data: data_out +// }); +// console.log(ae_promises.update__event_presenter_obj); + +// $events_sess.pres_mgmt.disable_submit__opt_out = false; +// $events_sess.pres_mgmt.submit_status = 'saved'; +// } + + +// async function handle_update__event_presenter({ +// obj_type, +// obj_id, +// data +// }) { +// console.log('*** handle_update__event_presenter() ***'); + +// ae_promises.update__event_presenter_obj = api.update_ae_obj_id_crud({ +// api_cfg: $ae_api, +// obj_type: obj_type, +// obj_id: obj_id, +// fields: data, +// key: $ae_api.api_crud_super_key, +// return_obj: true, +// log_lvl: 2 +// }) +// .then(async function (update__obj_result) { +// if (!update__obj_result) { +// console.log('The result was null or false.'); +// return false; +// } else { +// console.log(`update__obj_result = `, update__obj_result); +// } +// $slct_trigger = 'load__event_presenter_obj_li'; +// return update__obj_result; +// }) +// .catch(function (error) { +// console.log('Something went wrong.'); +// console.log(error); +// return false; +// }); + +// return ae_promises.update__event_presenter_obj; +// } + + + +{#await $lq__event_presenter_obj} + Loading... +{:then result} + +{#if $lq__event_presenter_obj} +

    + Presenter Details for:
    + {$events_slct.presenter_obj.full_name} ({$events_slct.presenter_obj.email}) +

    + +
    +

    Title: "{$events_slct.presentation_obj.name}"

    +

    Presenter:

    +
      +
    • + + {$events_slct.presenter_obj.full_name} +
    • +
    • + + {$events_slct.presenter_obj.email} +
    • + +
    • + + {$events_slct.presenter_obj.affiliations} +
    • +
    • + + {$events_slct.presenter_obj.professional_title ?? '-- not set --'} +
    • +
    • + + {$events_slct.presenter_obj.person_passcode} (your passcode) + + +
    • +
    • + {#if $ae_loc.trusted_access} + + + + {/if} +
    • +
    + +

    Files:

    + + +File count: {$events_slct.presenter_obj.file_count ?? '-- none --'} +{#if $lq__event_file_obj_li} +
      + {#each $lq__event_file_obj_li as event_file_obj} +
    • + + + + +
    • + {/each} +
    +{:else} +

    No files uploaded

    +{/if} + + + + + +
    + +{/if} + +{/await}