POC sign is mostly working now

This commit is contained in:
Scott Idem
2024-06-18 15:52:14 -04:00
parent 519525540c
commit 8044cd0723
7 changed files with 254 additions and 55 deletions

View File

@@ -208,6 +208,41 @@ async function handle_load_ae_obj_li__event_file(
}
// Updated 2024-06-17
async function handle_delete_ae_obj_id__event_file(
{
api_cfg,
event_file_id,
params={},
log_lvl=0
} : {
api_cfg: any,
event_file_id: string,
params?: key_val,
log_lvl?: number
}
) {
console.log(`*** handle_delete_ae_obj_id__event_file() *** event_file_id=${event_file_id}`);
const endpoint = `/event/file/${event_file_id}/v2`;
params['delete_hosted_file'] = true; // This does not actually delete the hosted file from the server.
params['rm_orphan'] = true; // This is what actually allows the hosted file to be deleted from the server.
ae_promises.delete__event_file_obj = await api.delete_object({
api_cfg: api_cfg,
endpoint: endpoint,
params: params,
// return_meta: return_meta,
log_lvl: log_lvl
});
db_events.files.delete(event_file_id);
return ae_promises.delete__event_file_obj;
}
// Updated 2024-06-10
async function handle_load_ae_obj_id__event_session(
{
@@ -1527,6 +1562,14 @@ function handle_db_save_ae_obj_li__event_session({obj_type, obj_li}) {
event_id_random: obj.event_id_random,
event_location_id_random: obj.event_location_id_random,
poc_person_id_random: obj.poc_person_id_random,
poc_person_given_name: obj.poc_person_given_name,
poc_person_family_name: obj.poc_person_family_name,
poc_person_full_name: obj.poc_person_full_name,
poc_person_primary_email: obj.poc_person_primary_email,
poc_kv_json: obj.poc_kv_json,
name: obj.name,
description: obj.description,
@@ -1806,6 +1849,7 @@ let export_obj = {
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_delete_ae_obj_id__event_file: handle_delete_ae_obj_id__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,

View File

@@ -266,7 +266,7 @@ let events_session_data_struct: key_val = {
fulltext_search_qry_str: null,
status_qry__search: null,
disable_submit__event_file_obj: false,
disable_submit__event_file_obj: true,
show_form__search: true,
show_form__search_results: true,

View File

@@ -1,5 +1,8 @@
import Dexie, { type Table } from 'dexie';
// li = list
// kv = key value list
export interface Event {
id_random: string;
code: string;
@@ -229,6 +232,13 @@ export interface Session {
event_id_random: string;
event_location_id_random: string;
poc_person_id_random: string;
poc_person_given_name: string;
poc_person_family_name: string;
poc_person_full_name: string;
poc_person_primary_email: string;
poc_kv_json: null|string;
name: string;
description: null|string;
@@ -402,6 +412,7 @@ export class MySubClassedDexie extends Dexie {
id_random, event_session_id_random, external_id, code,
for_type, for_id_random, type_code,
event_id_random, event_location_id_random,
poc_person_id_random, poc_person_given_name, poc_person_family_name, poc_person_full_name, poc_person_primary_email, poc_kv_json,
name, description, start_datetime, end_datetime,
passcode,
hide_event_launcher,

View File

@@ -201,8 +201,8 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
{#if $events_slct.event_id && $event_obj}
<h2 class="h3">{$event_obj.name}</h2>
<h3 class="h4">Presentation Management Hub</h3>
<h2 class="h3 text-center">{$event_obj.name}</h2>
<h3 class="h4 text-center">Presentation Management Hub</h3>
{/if}
<div class="variant-ghost-success my-2 p-2 rounded-md flex flex-row items-center">
@@ -220,7 +220,7 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
placeholder="Search for a session"
id="session_fulltext_search_qry_str"
bind:value={$events_sess.pres_mgmt.fulltext_search_qry_str}
class="input text-1xl hover:text-2xl font-bold font-mono w-96 transition-all"
class="input text-1xl hover:text-2xl font-bold font-mono w-80 transition-all"
on:keyup={() => {
if ($events_sess.pres_mgmt.fulltext_search_qry_str.length >= 3) {
$events_trigger = 'load__event_session_obj_li';
@@ -233,7 +233,7 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
<button
type="submit"
class="btn btn-lg variant-ghost-success hover:variant-glass-success text-2xl font-bold w-48 transition-all"
class="btn btn-lg variant-ghost-success hover:variant-filled-success text-2xl font-bold w-48 transition-all"
on:click={() => {
}}
@@ -281,14 +281,20 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
<th>Date</th>
<th>Start/End</th>
<th>Location</th>
<th>Actions</th>
<!-- <th>Actions</th> -->
</tr>
</thead>
<tbody>
{#each $events_slct.session_obj_li as session_obj}
<tr>
<td>
<strong>{session_obj.name}</strong>
<a
href="/events_pres_mgmt/session/{session_obj.event_session_id_random}"
class="btn btn-md variant-ghost-secondary hover:variant-filled-secondary"
>
<span class="fas fa-eye mx-1"></span>
<strong>{session_obj.name}</strong>
</a>
</td>
<td>
<span style="break-inside: avoid;">
@@ -309,7 +315,7 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
{/if}
</td>
<td>{session_obj.event_location_name ?? '-- not set --'}</td>
<td>
<!-- <td>
<a
href="/events_pres_mgmt/session/{session_obj.event_session_id_random}"
class="btn btn-md variant-ghost-secondary hover:variant-glass-secondary"
@@ -317,7 +323,7 @@ $: if ($events_trigger == 'load__event_session_obj_li' && $events_slct.event_id)
<span class="fas fa-eye mx-1"></span>
View
</a>
</td>
</td> -->
</tr>
{/each}
</tbody>

View File

@@ -168,6 +168,7 @@ onMount(() => {
let url_person_pass = data.url.searchParams.get('person_pass');
let url_presentation_id = data.url.searchParams.get('presentation_id');
let url_presenter_id = data.url.searchParams.get('presenter_id');
let url_session_id = data.url.searchParams.get('session_id');
// This should be turned into a function to correctly authenticate the person and allow them access to their presentations and presenter details.
if (url_person_pass) {
@@ -180,9 +181,10 @@ onMount(() => {
$events_sess.auth__person.id = url_person_id;
$events_sess.auth__person.presentation_id = url_presentation_id;
$events_sess.auth__person.presenter_id = url_presenter_id;
$events_sess.auth__person.session_id = url_session_id; // For POC or LCI Champions for sessions. Do not set for a presenter!
$events_sess.auth__kv.person[url_person_id] = true;
// $events_sess.auth__kv.session[$events_slct.event_session_id] = true;
$events_sess.auth__kv.session[$events_slct.event_session_id] = true; // For POC or LCI Champions for sessions. Do not set for a presenter!
$events_sess.auth__kv.presentation[url_presentation_id] = true;
$events_sess.auth__kv.presenter[url_presenter_id] = true;
@@ -214,17 +216,38 @@ onMount(() => {
// let new_url = data.url.toString()
// console.log(new_url);
// goto(new_url, {replaceState: true});
if (url_presenter_id) {
presenter_sign_in();
}
presenter_sign_in();
if (url_session_id) {
session_sign_in();
}
}
});
// console.log(`$ae_loc = `, $ae_loc);
function presenter_sign_in() {
console.log('Sign in with URL values');
console.log('Presenter sign in with URL values');
// This needs to be moved to a function!
$events_loc.auth__person.id = $events_sess.auth__entered_key; // person_id
$events_loc.auth__person.entered_key = $events_sess.auth__entered_key; // also person_id in this case
$events_loc.auth__person.email = 'test@example.com';
$events_loc.auth__person.full_name = 'Test Person';
$events_loc.auth__kv.person[$events_sess.entered_key] = true;
$events_loc.auth__kv.session[$events_slct.event_session_id] = false; // Set to false for presenters.
$events_loc.auth__kv.presentation[$events_sess.auth__person.presentation_id] = true;
$events_loc.auth__kv.presenter[$events_sess.auth__person.presenter_id] = true;
// Setting again here... just because for now.
$events_slct.event_presentation_id = $events_sess.auth__person.presentation_id;
$events_slct.event_presenter_id = $events_sess.auth__person.presenter_id;
}
function session_sign_in() {
console.log('Session sign in with URL values');
$events_loc.auth__person.id = $events_sess.auth__entered_key; // person_id
$events_loc.auth__person.entered_key = $events_sess.auth__entered_key; // also person_id in this case
@@ -233,12 +256,28 @@ function presenter_sign_in() {
$events_loc.auth__kv.person[$events_sess.entered_key] = true;
$events_loc.auth__kv.session[$events_slct.event_session_id] = true;
$events_loc.auth__kv.presentation[$events_sess.auth__person.presentation_id] = true;
$events_loc.auth__kv.presenter[$events_sess.auth__person.presenter_id] = true;
$events_loc.auth__kv.presentation[$events_sess.auth__person.presentation_id] = false; // Set to false for session POC (LCI Champions).
$events_loc.auth__kv.presenter[$events_sess.auth__person.presenter_id] = false; // Set to false for session POC (LCI Champions).
// Setting again here... just because for now.
$events_slct.event_presentation_id = $events_sess.auth__person.presentation_id;
$events_slct.event_presenter_id = $events_sess.auth__person.presenter_id;
// $events_slct.event_presentation_id = $events_sess.auth__person.presentation_id;
// $events_slct.event_presenter_id = $events_sess.auth__person.presenter_id;
}
function sign_out() {
$events_loc.auth__person = {
id: null,
email: null,
full_name: null,
entered_key: null,
entered_passcode: null,
};
$events_loc.auth__kv = {
session: {},
presentation: {},
presenter: {},
person: {},
};
}
$: if ($slct_trigger == 'load__event_file_obj_li') {
@@ -337,6 +376,57 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
<li>
<strong class="text-sm">Location/Room:</strong> {$lq__event_session_obj.event_location_name ? $lq__event_session_obj.event_location_name : '-- not set --'}
</li>
<li>
<strong class="text-sm">Moderator/Champion:</strong> {$lq__event_session_obj.poc_person_full_name ? $lq__event_session_obj.poc_person_full_name : '-- not set --'}
<span class="float-right">
{#if $events_loc.auth__kv.session[$events_slct.event_session_id]}
<span class="text-green-500">Signed In</span>
{/if}
{#if $ae_loc.trusted_access || !$events_loc.auth__person.id }
<button
type="button"
disabled
on:click={() => {
console.log('Email the access link');
if (!$lq__event_session_obj.poc_person_primary_email) {
alert('No email address found for this presenter.');
return;
}
if (confirm(`This will send the sign in email to ${$lq__event_session_obj.poc_person_primary_email}`)) {
console.log('Send the email to the presenter.');
} else {
console.log('Cancelled sending the email.');
return false;
}
}}
class="btn btn-sm variant-ghost-primary hover:variant-filled-primary"
title="Email the access link to the POC (moderator/champion)"
>
<span class="fas fa-envelope mx-1"></span>
Email Access Link
</button>
{/if}
{#if $ae_loc.trusted_access}
<!-- A button to copy the access link to the clipboard. -->
<!-- Example: /events_pres_mgmt/session/Wh8UnJlbIA0?person_id=fV1dl_IJ0yY&person_pass=abc123 -->
<button
type="button"
use:clipboard={encodeURI(`${$ae_loc.url_origin}/events_pres_mgmt/session/${$events_slct.event_session_id}?person_id=${$events_slct.presenter_obj.person_id_random}&person_pass=${$events_slct.presenter_obj.person_passcode}&session_id=${$events_slct.event_session_id}`)}
class="btn btn-sm variant-ghost-warning m-1"
title="Copy the POC (moderator/champion) access link to the clipboard."
>
<span class="fas fa-copy mx-1"></span>
Copy Access Link
</button>
{/if}
</span>
</li>
{#if $ae_loc.trusted_access}
<li>
<strong class="text-sm">Session passcode:</strong> {$lq__event_session_obj.passcode ? $lq__event_session_obj.passcode : '-- not set --'}
@@ -386,11 +476,15 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
</label> -->
<div class="m-1 flex flex-col flex-wrap gap-1 items-center">
{#if $ae_loc.trusted_access || $events_loc.auth__kv.session[$events_slct.event_session_id]}
{#if $ae_loc.trusted_access || $events_loc.auth__person.id }
{#if $events_loc.auth__kv.session[$events_slct.event_session_id]}
<h3 class="h3">Welcome {$lq__event_session_obj?.poc_person_full_name ?? 'Session POC'}</h3>
{:else}
<h3 class="h3">Welcome {$lq__event_presenter_obj?.full_name ?? 'Presenter'}</h3>
{/if}
{#if $ae_loc.trusted_access || ($events_loc.auth__kv.presenter[$events_slct.event_presenter_id] && $lq__event_presenter_obj?.agree)}
{#if $ae_loc.trusted_access || $events_loc.auth__kv.session[$events_slct.event_session_id] || ($events_loc.auth__kv.presenter[$events_slct.event_presenter_id] && $lq__event_presenter_obj?.agree)}
<a
class="btn btn-md variant-ghost-primary hover:variant-filled-primary"
href="https://static.oneskyit.com/c/LCI/files/LCI_Congress_Template_2024.pptx"
@@ -422,19 +516,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
type="button"
class="btn btn-sm variant-soft-warning hover:variant-ghost-warning"
on:click={() => {
$events_loc.auth__person = {
id: null,
email: null,
full_name: null,
entered_key: null,
entered_passcode: null,
};
$events_loc.auth__kv = {
session: {},
presentation: {},
presenter: {},
person: {},
};
sign_out();
alert('You have been signed out.');
}}
>
@@ -456,6 +538,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
</p>
</div>
{#if ($events_sess.auth__person.presenter_id) || ($events_sess.auth__person.session_id)}
<div
class="border border-gray-200 p-2 rounded-md m-2 text-center space-y-2"
>
@@ -484,7 +567,11 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
on:click={() => {
console.log('Sign in with URL values');
presenter_sign_in();
if ($events_sess.auth__person.presenter_id) {
presenter_sign_in();
} else if ($events_sess.auth__person.session_id) {
session_sign_in();
}
// This needs to be moved to a function!
@@ -511,7 +598,10 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
<div
class="text-sm text-gray-500"
>
For: presentation: {$events_sess.auth__person.presentation_id} presenter: {$events_sess.auth__person.presenter_id}
For:
session: {$events_sess.auth__person.session_id}
presentation: {$events_sess.auth__person.presentation_id}
presenter: {$events_sess.auth__person.presenter_id}
<br>
{$lq__event_presentation_obj?.name ? `Name: "${$lq__event_presentation_obj.name}"` : '-- not set --'}
@@ -523,19 +613,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
type="button"
class="btn btn-sm variant-soft-warning"
on:click={() => {
$events_loc.auth__person = {
id: null,
email: null,
full_name: null,
entered_key: null,
entered_passcode: null,
};
$events_loc.auth__kv = {
session: {},
presentation: {},
presenter: {},
person: {},
};
sign_out();
alert('You have been signed out.');
}}
>
@@ -544,6 +622,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
</button>
{/if}
</div>
{/if}
{/if}
</div>
@@ -633,7 +712,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
<li>
<button
type="button"
disabled={!$ae_loc.trusted_access && (!$events_loc.auth__kv.presenter[event_presenter_obj.event_presenter_id_random] || !event_presenter_obj.agree)}
disabled={!($ae_loc.trusted_access || $events_loc.auth__kv.session[$events_slct.event_session_id]) && (!$events_loc.auth__kv.presenter[event_presenter_obj.event_presenter_id_random] || !event_presenter_obj.agree)}
on:click={
() => {
console.log('View presenter details');
@@ -658,7 +737,8 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
{#if $ae_loc.trusted_access || !$events_loc.auth__person.id }
<button
class="btn btn-md variant-ghost-primary hover:variant-filled-primary"
type="button"
disabled
on:click={() => {
console.log('Email the access link');
if (!event_presenter_obj.email) {
@@ -692,6 +772,7 @@ function send_init_confirm_email({to_email, to_name, person_id, person_passcode,
// body: `Hello ${event_presenter_obj.full_name},\n\nHere is the access link for the session: ${data.url.origin}/events_pres_mgmt/session/{$events_slct.event_session_id}?person_id=${event_presenter_obj.person_id_random}&person_pass=${event_presenter_obj.person_passcode}\n\nThank you,\n\nThe LCI Team`,
// });
}}
class="btn btn-md variant-ghost-primary hover:variant-filled-primary"
title="Email the access link to the presenter"
>
<span class="fas fa-envelope mx-1"></span>

View File

@@ -330,7 +330,7 @@ async function handle_update__event_presenter({
{/if}
<div class="text-center">
{#if $ae_loc.trusted_access || $events_loc.auth__kv.session[$events_slct.event_session_id]}
{#if $ae_loc.trusted_access || $events_loc.auth__kv.presentation[$events_slct.event_presentation_id]}
<button
type="button"
on:click={() => {

View File

@@ -3,10 +3,12 @@ console.log(`ae_events_pres_mgmt session [slug] form_agree.svelte`);
export let data: any;
import { onMount } from 'svelte';
import { createEventDispatcher, onMount } from 'svelte';
import { clipboard, FileDropzone } from '@skeletonlabs/skeleton';
import { liveQuery } from "dexie";
const dispatch = createEventDispatcher();
import type { key_val } from '$lib/ae_stores';
import { ae_util } from '$lib/ae_utils';
import { api } from '$lib/api';
@@ -17,7 +19,6 @@ import { ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_st
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';
import { hide } from '@floating-ui/dom';
let ae_triggers: key_val = {};
@@ -253,6 +254,46 @@ async function handle_input_upload_files(input_upload_files) {
return hosted_file_result;
}
async function handle_delete__event_file({event_file_id}) {
console.log(`*** handle_delete__event_file() *** event_file_id:`, event_file_id);
let link_to_type = 'event_presenter';
let link_to_id = $events_slct.event_presenter_id;
ae_promises.delete__event_file_obj = await events_func.handle_delete_ae_obj_id__event_file({
api_cfg: $ae_api,
event_file_id: event_file_id,
log_lvl: 2
})
.then(function (event_file_obj_result) {
console.log(event_file_obj_result);
if (!event_file_obj_result) {
console.log('The result was null or false.');
return false;
} else {
console.log(`event_file_obj_result = `, event_file_obj_result);
}
dispatch(
'event_file_obj_deleted',
{
event_file_id: event_file_id,
link_to_type: link_to_type,
link_to_id: link_to_id,
}
);
return event_file_obj_result;
}).catch(function (error) {
console.log('Something went wrong deleting the event file.');
console.log(error);
return false;
});
return ae_promises.delete__event_file_obj;
}
</script>
{#await $lq__event_presenter_obj}
@@ -269,9 +310,11 @@ async function handle_input_upload_files(input_upload_files) {
<!-- Example: /events_pres_mgmt/session/Wh8UnJlbIA0?person_id=fV1dl_IJ0yY&person_pass=abc123 -->
<button
type="button"
class="btn btn-sm variant-ghost-warning float-right m-1"
use:clipboard={encodeURI(`${$ae_loc.url_origin}/events_pres_mgmt/session/${$events_slct.event_session_id}?person_id=${$events_slct.presenter_obj.person_id_random}&person_pass=${$events_slct.presenter_obj.person_passcode}&presentation_id=${$events_slct.presentation_obj.event_presentation_id_random}&presenter_id=${$events_slct.presenter_obj.event_presenter_id_random}`)}
class="btn btn-sm variant-ghost-warning float-right m-1"
title="Copy the presenter access link to the clipboard."
>
<span class="fas fa-copy mx-1"></span>
Copy Access Link
@@ -327,7 +370,7 @@ async function handle_input_upload_files(input_upload_files) {
<h3 class="h4">Files: {$events_slct.presenter_obj.file_count ? `${$events_slct.presenter_obj.file_count}x` : '-- none --'}</h3>
<div class="text-sm text-center bg-orange-100 rounded-md p-2">
WARNING: The file upload and management is a work in progress. You can upload files, but not yet delete or rename them.
WARNING: The file upload and management is a work in progress. You can upload and delete files, but not yet rename them.
</div>
<form
class="modal-form {$ae_loc.hub.classes__form}"
@@ -347,6 +390,7 @@ WARNING: The file upload and management is a work in progress. You can upload fi
if (e.target.files.length) {
ae_placeholder_li.new_file = `Ready to upload: ${e.target.files[0].name}`;
$events_sess.pres_mgmt.disable_submit__event_file_obj = false;
} else {
ae_placeholder_li.new_file = null;
}
@@ -391,7 +435,7 @@ WARNING: The file upload and management is a work in progress. You can upload fi
>{file_obj.filename}</a> -->
<button
class="btn btn-md variant-soft-primary"
class="btn btn-md variant-soft-primary min-w-96"
on:click={() => {
// ae_promises[event_file_obj.event_file_id_random]
ae_promises[event_file_obj.event_file_id_random] = api.download_hosted_file({
@@ -426,6 +470,19 @@ WARNING: The file upload and management is a work in progress. You can upload fi
{event_file_obj.filename.slice(0, 20)}...{event_file_obj.extension}
</button>
<button type="button"
title="Delete this file"
on:click={async () => {
if (!confirm('Are you sure you want to delete this file?')) {return false;}
ae_promises[event_file_obj.event_file_id_random] = handle_delete__event_file({event_file_id: event_file_obj.event_file_id_random});
}}
class="btn btn-sm variant-soft-warning event_file_delete_btn width_100"
>
<span class="fas fa-minus mx-1"></span>
Delete
</button>
</li>
{/each}
</ul>