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 = ``;
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