feat: email fallback and consistent auth checks across presenter components

ae_comp__event_presenter_obj_li.svelte:
- Email Access Link now shows for presenter.email when person_primary_email is
  null (same fallback logic as +page.svelte). Passes email as person_id when no
  Person record exists. Uses person_passcode ?? passcode.
- Visibility gate changed from administrator_access to trusted_access so staff
  signed in via any method can still send links (was blocking non-admin staff).
- Icon changed to class="mr-1" for consistency.

presenter_view.svelte:
- Email field <li>, passcode <li>, and biography textarea disabled now all check
  auth__kv.presenter[email] as a secondary key alongside auth__kv.presenter[id],
  matching the pattern established in presenter_page_menu.svelte. Presenters who
  signed in via email identity (no Person record) can now see and edit their own
  fields without needing a Person record link.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-06-15 17:22:23 -04:00
parent a784395d7b
commit 4c210e3e36
2 changed files with 22 additions and 34 deletions

View File

@@ -507,12 +507,9 @@ $effect(() => {
<li <li
class:hidden={!$ae_loc.trusted_access && class:hidden={!$ae_loc.trusted_access &&
!events_auth_loc.current.auth__kv.presenter[ !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id] &&
$lq__event_presenter_obj?.event_presenter_id !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.email ?? ''] &&
] && !events_auth_loc.current.auth__kv.session[$lq__event_presenter_obj.event_session_id]}>
!events_auth_loc.current.auth__kv.session[
$lq__event_presenter_obj.event_session_id
]}>
<Element_ae_obj_field_editor <Element_ae_obj_field_editor
object_type={'event_presenter'} object_type={'event_presenter'}
object_id={$lq__event_presenter_obj?.event_presenter_id} object_id={$lq__event_presenter_obj?.event_presenter_id}
@@ -1055,9 +1052,8 @@ $effect(() => {
<li <li
class:hidden={!$lq__event_presenter_obj.person_id || class:hidden={!$lq__event_presenter_obj.person_id ||
(!$ae_loc.trusted_access && (!$ae_loc.trusted_access &&
!events_auth_loc.current.auth__kv.presenter[ !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id] &&
$lq__event_presenter_obj?.event_presenter_id !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.email ?? ''])}>
])}>
<Element_ae_obj_field_editor <Element_ae_obj_field_editor
object_type={'person'} object_type={'person'}
object_id={$lq__event_presenter_obj.person_id} object_id={$lq__event_presenter_obj.person_id}
@@ -1150,9 +1146,8 @@ $effect(() => {
name="biography" name="biography"
id="presenter__biography" id="presenter__biography"
disabled={!$ae_loc.trusted_access && disabled={!$ae_loc.trusted_access &&
!events_auth_loc.current.auth__kv.presenter[ !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.event_presenter_id] &&
$lq__event_presenter_obj?.event_presenter_id !events_auth_loc.current.auth__kv.presenter[$lq__event_presenter_obj?.email ?? '']}
]}
class="textarea ae_value event_presenter__biography font-mono" class="textarea ae_value event_presenter__biography font-mono"
class:preset-tonal-error={ae_tmp.biography && class:preset-tonal-error={ae_tmp.biography &&
ae_tmp.biography.length > 600 ae_tmp.biography.length > 600

View File

@@ -186,40 +186,33 @@ let ae_tmp: key_val = $state({});
{/if} {/if}
</a> </a>
{#if pres_mgmt_loc.current.show__email_access_link && event_presenter_obj?.person_primary_email && ($ae_loc.administrator_access || !events_auth_loc.current.auth__person?.id)} {#if pres_mgmt_loc.current.show__email_access_link && (event_presenter_obj?.person_primary_email || event_presenter_obj?.email) && ($ae_loc.trusted_access || !events_auth_loc.current.auth__person?.id)}
<button <button
type="button" type="button"
onclick={() => { onclick={() => {
console.log('Email the access link'); // Prefer Person-record email; fall back to presenter.email for
if (!event_presenter_obj.person_primary_email) { // presenters without a Person record (common for LCI/iMIS gaps).
alert( const use_email = event_presenter_obj.person_primary_email ?? event_presenter_obj.email;
'No email address found for this presenter.' const use_person_id = event_presenter_obj.person_id ?? event_presenter_obj.email;
); const use_passcode = event_presenter_obj.person_passcode ?? event_presenter_obj.passcode;
if (!use_email) {
alert('No email address found for this presenter.');
return; return;
} }
if ( if (!confirm(`This will send the sign in email to ${use_email}`)) {
confirm( return;
`This will send the sign in email to ${event_presenter_obj.person_primary_email}`
)
) {
console.log('Send the email to the presenter.');
} else {
console.log('Cancelled sending the email.');
return false;
} }
events_func.email_sign_in__event_presenter({ events_func.email_sign_in__event_presenter({
api_cfg: $ae_api, api_cfg: $ae_api,
to_email: to_email: use_email,
event_presenter_obj.person_primary_email,
to_name: to_name:
event_presenter_obj?.full_name ?? event_presenter_obj?.full_name ??
'-- not set --', '-- not set --',
base_url: $ae_loc.url_origin, base_url: $ae_loc.url_origin,
person_id: event_presenter_obj?.person_id, person_id: use_person_id,
person_passcode: person_passcode: use_passcode ?? '-- not set --',
event_presenter_obj.person_passcode ??
'-- not set --',
event_id: event_presenter_obj.event_id, event_id: event_presenter_obj.event_id,
event_session_id: event_session_id:
event_presenter_obj.event_session_id, event_presenter_obj.event_session_id,
@@ -238,7 +231,7 @@ let ae_tmp: key_val = $state({});
class="btn preset-tonal-secondary border-secondary-500 hover:preset-filled-secondary-500 my-0.5 border transition-all hover:transition-all" class="btn preset-tonal-secondary border-secondary-500 hover:preset-filled-secondary-500 my-0.5 border transition-all hover:transition-all"
class:btn-sm={display_mode != 'default'} class:btn-sm={display_mode != 'default'}
title="Email the access link to the presenter"> title="Email the access link to the presenter">
<Mail size="1em" class="mx-1" /> <Mail size="1em" class="mr-1" />
Email Access Link Email Access Link
</button> </button>
{/if} {/if}