diff --git a/src/lib/ae_events/ae_events__event_presenter.ts b/src/lib/ae_events/ae_events__event_presenter.ts index 277a8d57..7b924f89 100644 --- a/src/lib/ae_events/ae_events__event_presenter.ts +++ b/src/lib/ae_events/ae_events__event_presenter.ts @@ -597,10 +597,13 @@ export async function email_sign_in__event_presenter({ return null; } const subject = `Pres Mgmt Hub Sign In Link for Presenter: ${to_name ?? 'Presenter'}`; + // Routes to the session page (which has the sign-in handler mounted) not /presenter/[id] + // which has no sign-in handler. Includes presenter_id + presentation_id so the handler + // can grant presenter-level auth (not just session read access). const sign_in_url = encodeURI( - `${base_url}/events/${event_id}/presenter/${event_presenter_id}?person_id=${person_id}&person_pass=${person_passcode}` + `${base_url}/events/${event_id}/session/${event_session_id}?person_id=${person_id}&person_pass=${person_passcode}&presenter_id=${event_presenter_id}&presentation_id=${event_presentation_id}` ); - const body_html = `
${to_name},

Your sign-in link for ${presentation_name ?? 'Presentation'} (Session: ${session_name ?? 'Session'}): ${sign_in_url}

`; + const body_html = `
${to_name},

Your sign-in link for ${presentation_name ?? 'Presentation'} (Session: ${session_name ?? 'Session'}): ${sign_in_url}

This link takes you to the session page — your presentation and file upload sections will be available after you sign in.

`; return await api.send_email({ api_cfg, from_email: 'noreply+presmgmt@oneskyit.com', diff --git a/src/lib/ae_events/ae_events__event_session.ts b/src/lib/ae_events/ae_events__event_session.ts index beedc722..c68902c2 100644 --- a/src/lib/ae_events/ae_events__event_session.ts +++ b/src/lib/ae_events/ae_events__event_session.ts @@ -829,7 +829,7 @@ export async function email_sign_in__event_session({ }) { const subject = `Pres Mgmt Hub Sign In Link for ${session_name}`; const sign_in_url = encodeURI( - `${base_url}/events/${event_id}/session/${event_session_id}?person_id=${person_id}&person_pass=${person_passcode}` + `${base_url}/events/${event_id}/session/${event_session_id}?person_id=${person_id}&person_pass=${person_passcode}&session_id=${event_session_id}` ); const body_html = `
${to_name},

Your sign-in link for ${session_name}: ${sign_in_url}

`; return await api.send_email({ diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte index aa1a5f55..dbe3999a 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte @@ -116,6 +116,19 @@ let lq__auth__event_presenter_obj = $derived( }) ); +// True if this person is authed as the presenter for this specific record. +// Also matches by person_id so a presenter signed in via one presentation link is +// automatically recognised on their other presentations at the same event. +let presenter_is_authed = $derived( + $ae_loc.trusted_access || + !!events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id ?? ''] || + !!events_auth_loc.current.auth__kv.session[$lq__event_presenter_obj?.event_session_id ?? ''] || + ( + !!events_auth_loc.current.auth__person.id && + events_auth_loc.current.auth__person.id === $lq__event_presenter_obj?.person_id + ) +); + // if (browser && $lq__event_presenter_obj) { // console.log('Pres Mgmt [page]: +presenter.svelte'); // $events_slct.event_presenter_obj = $lq__event_presenter_obj; @@ -202,7 +215,7 @@ let lq__auth__event_presenter_obj = $derived( - {#if !$ae_loc.trusted_access && !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id] && !events_auth_loc.current.auth__kv.session[$lq__event_presenter_obj.event_session_id]} + {#if !presenter_is_authed} @@ -349,7 +362,7 @@ let lq__auth__event_presenter_obj = $derived( - {#if $ae_loc.trusted_access || events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id]} + {#if presenter_is_authed} {:else if pres_mgmt_loc.current.show_content__presenter_view == 'manage_files' && $ae_loc.authenticated_access} @@ -405,7 +411,7 @@ let lq__auth__event_presenter_obj = $derived( - {#if $ae_loc.public_access || events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id]} + {#if presenter_is_authed || $ae_loc.public_access} 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 eedca98f..782210b2 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 @@ -145,10 +145,11 @@ let default_end_datetime = $derived(event_start_date ? `${event_start_date}T09:0 // Derived helpers for the POC sign-in URL (used by both copy link and email). // WHY: poc_person_passcode gates access for the session POC without requiring a full account. +// session_id is required as a query param so sign_in_out.svelte calls session_sign_in(). let poc_sign_in_url = $derived( $lq__event_session_obj?.poc_person_id && $lq__event_session_obj?.poc_person_passcode ? encodeURI( - `${$ae_loc.url_origin}/events/${$lq__event_session_obj.event_id}/session/${$lq__event_session_obj.event_session_id}?person_id=${$lq__event_session_obj.poc_person_id}&person_pass=${$lq__event_session_obj.poc_person_passcode}` + `${$ae_loc.url_origin}/events/${$lq__event_session_obj.event_id}/session/${$lq__event_session_obj.event_session_id}?person_id=${$lq__event_session_obj.poc_person_id}&person_pass=${$lq__event_session_obj.poc_person_passcode}&session_id=${$lq__event_session_obj.event_session_id}` ) : null ); @@ -158,8 +159,14 @@ let poc_sign_in_url = $derived( let person_options_loaded = $derived(Object.keys($slct.person_obj_kv ?? {}).length > 0); // Whether the current session POC is signed in (auth'd) on this device. +// Also grants access by person_id so a POC signed in via one session link is automatically +// auth'd on all other sessions where their person record is the assigned POC. let poc_is_authed = $derived( - events_auth_loc.current.auth__kv.session[$lq__event_session_obj?.event_session_id] === true + events_auth_loc.current.auth__kv.session[$lq__event_session_obj?.event_session_id] === true || + ( + !!events_auth_loc.current.auth__person.id && + events_auth_loc.current.auth__person.id === $lq__event_session_obj?.poc_person_id + ) ); // QR Code Generation Logic