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

View File

@@ -186,40 +186,33 @@ let ae_tmp: key_val = $state({});
{/if}
</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
type="button"
onclick={() => {
console.log('Email the access link');
if (!event_presenter_obj.person_primary_email) {
alert(
'No email address found for this presenter.'
);
// Prefer Person-record email; fall back to presenter.email for
// presenters without a Person record (common for LCI/iMIS gaps).
const use_email = event_presenter_obj.person_primary_email ?? event_presenter_obj.email;
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;
}
if (
confirm(
`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;
if (!confirm(`This will send the sign in email to ${use_email}`)) {
return;
}
events_func.email_sign_in__event_presenter({
api_cfg: $ae_api,
to_email:
event_presenter_obj.person_primary_email,
to_email: use_email,
to_name:
event_presenter_obj?.full_name ??
'-- not set --',
base_url: $ae_loc.url_origin,
person_id: event_presenter_obj?.person_id,
person_passcode:
event_presenter_obj.person_passcode ??
'-- not set --',
person_id: use_person_id,
person_passcode: use_passcode ?? '-- not set --',
event_id: event_presenter_obj.event_id,
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-sm={display_mode != 'default'}
title="Email the access link to the presenter">
<Mail size="1em" class="mx-1" />
<Mail size="1em" class="mr-1" />
Email Access Link
</button>
{/if}