fix(presenter): guard name-sync warning on person_id + on_open person link

Two fixes in presenter_view:
1. Name-sync warning (given/family mismatch) was showing even when no
   Person was linked. Guard now checks person_id first.
2. Person link replaced the two-step Re-link button flow with on_open
   pattern (matches Session POC). Pencil+Re-link button removed; pencil
   icon opens the editor and loads the person list in one action.
   Admin-only re-link restriction preserved: non-admin staff with a
   linked person see a read-only link instead of the editor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-06-17 11:09:09 -04:00
parent abb9e94ce1
commit 1269e2ed53

View File

@@ -54,7 +54,6 @@ import {
LoaderCircle, LoaderCircle,
Mail, Mail,
MessageSquareText, MessageSquareText,
Pencil,
Plus, Plus,
Presentation, Presentation,
RefreshCw, RefreshCw,
@@ -153,6 +152,31 @@ $effect(() => {
} }
} }
}); });
async function load_person_options_for_presenter_link() {
if (!$slct.account_id) return;
if (Object.keys($slct.person_obj_kv ?? {}).length > 1) return;
$slct.person_obj_li = core_func
.load_ae_obj_li__person({
api_cfg: $ae_api,
for_obj_type: 'account',
for_obj_id: $slct.account_id,
limit: 1000,
order_by_li: { family_name: 'ASC', given_name: 'ASC', updated_on: 'DESC', created_on: 'DESC' }
})
.then(function (load_results) {
if (load_results) {
let person_obj_kv: Record<string, string> = {};
person_obj_kv[''] = '-- Select a person --';
load_results.forEach((person_obj) => {
let option_text = `${person_obj?.last_first_name ?? person_obj?.given_name} (${person_obj?.primary_email?.length ? person_obj?.primary_email : '-- not set --'})`;
person_obj_kv[person_obj.person_id] = option_text;
});
$slct.person_obj_kv = person_obj_kv;
}
return load_results;
});
}
</script> </script>
{#if $lq__event_presenter_obj} {#if $lq__event_presenter_obj}
@@ -342,7 +366,7 @@ $effect(() => {
</li> </li>
<li <li
class="space-y-2" class=""
class:hidden={!$ae_loc.trusted_access || class:hidden={!$ae_loc.trusted_access ||
(!$ae_loc.edit_mode && !$ae_loc.manager_access)}> (!$ae_loc.edit_mode && !$ae_loc.manager_access)}>
<User size="1em" /> <User size="1em" />
@@ -384,7 +408,7 @@ $effect(() => {
</span> </span>
</Element_ae_obj_field_editor> </Element_ae_obj_field_editor>
{#if $lq__event_presenter_obj.person_given_name != $lq__event_presenter_obj.given_name || $lq__event_presenter_obj.person_family_name != $lq__event_presenter_obj.family_name} {#if $lq__event_presenter_obj.person_id && ($lq__event_presenter_obj.person_given_name != $lq__event_presenter_obj.given_name || $lq__event_presenter_obj.person_family_name != $lq__event_presenter_obj.family_name)}
{#if $lq__event_presenter_obj.person_given_name != $lq__event_presenter_obj.given_name} {#if $lq__event_presenter_obj.person_given_name != $lq__event_presenter_obj.given_name}
<div> <div>
<Asterisk size="1em" /> <Asterisk size="1em" />
@@ -839,94 +863,52 @@ $effect(() => {
Person link: Person link:
<!-- Allow for linking the presenter to a person record. --> <!-- Allow for linking the presenter to a person record. -->
{#if $ae_loc.trusted_access} {#if $ae_loc.trusted_access}
<Element_ae_obj_field_editor {#if !$lq__event_presenter_obj.person_id || $ae_loc.administrator_access}
object_type={'event_presenter'} <!-- No person linked yet (any trusted staff can assign) or re-linking (admin only).
object_id={$lq__event_presenter_obj?.event_presenter_id} WHY admin-only for re-link: staff were creating duplicate person records when
field_name={'person_id'} correcting initial link mistakes. "Add Person" below handles the first-time
field_type={'select'} case without that risk. -->
current_value={$lq__event_presenter_obj.person_id} <Element_ae_obj_field_editor
select_options={$slct.person_obj_kv} object_type="event_presenter"
allow_null={$ae_loc.administrator_access} object_id={$lq__event_presenter_obj?.event_presenter_id}
on_success={() => field_name="person_id"
events_func.load_ae_obj_id__event_presenter({ field_type="select"
api_cfg: $ae_api, current_value={$lq__event_presenter_obj.person_id}
event_presenter_id: select_options={$slct.person_obj_kv}
$lq__event_presenter_obj?.event_presenter_id, allow_null={$ae_loc.administrator_access}
log_lvl: 0 on_open={load_person_options_for_presenter_link}
})}> on_success={() =>
{#if $lq__event_presenter_obj.person_id} events_func.load_ae_obj_id__event_presenter({
<a api_cfg: $ae_api,
href="/core/person/{$lq__event_presenter_obj.person_id}" event_presenter_id:
class="text-blue-500 hover:text-blue-800 hover:underline" $lq__event_presenter_obj?.event_presenter_id,
title="View Person: {$lq__event_presenter_obj.person_full_name} {$lq__event_presenter_obj.person_id}"> log_lvl: 0
<Link size="1em" /> })}>
{$lq__event_presenter_obj.person_id} {#if $lq__event_presenter_obj.person_id}
</a> <a
{:else} href="/core/person/{$lq__event_presenter_obj.person_id}"
<Unlink size="1em" /> class="text-blue-500 hover:text-blue-800 hover:underline"
person title="View Person: {$lq__event_presenter_obj.person_full_name} {$lq__event_presenter_obj.person_id}">
{@html ae_snip.html__not_set} <Link size="1em" />
{/if} {$lq__event_presenter_obj.person_id}
</a>
{#if $ae_loc.trusted_access && $ae_loc.edit_mode && (!$lq__event_presenter_obj.person_id || $ae_loc.administrator_access)} {:else}
<!-- Load person list before using the editor's built-in select. <span class="inline-flex items-center gap-1 text-xs opacity-60">
WHY: Re-linking is intentionally admin-only when a person is already <Unlink size="1em" />
assigned. Staff were creating duplicate person records when they made person — not linked
mistakes on the initial link. The "Add Person" button below serves as </span>
the safety net for the first-time case (no person linked yet). --> {/if}
<button </Element_ae_obj_field_editor>
type="button" {:else}
onclick={async () => { <!-- Person already linked; non-admin staff see read-only. -->
console.log( <a
'Edit the person for the presenter.' href="/core/person/{$lq__event_presenter_obj.person_id}"
); class="text-blue-500 hover:text-blue-800 hover:underline"
$slct.person_obj_li = core_func title="View Person: {$lq__event_presenter_obj.person_full_name} {$lq__event_presenter_obj.person_id}">
.load_ae_obj_li__person({ <Link size="1em" />
api_cfg: $ae_api, {$lq__event_presenter_obj.person_id}
for_obj_type: 'account', </a>
for_obj_id: $slct.account_id, {/if}
limit: 1000, // We need to keep this limit high to show all people for selection: $ae_loc.person.qry_limit__people
order_by_li: {
family_name: 'ASC',
given_name: 'ASC',
updated_on: 'DESC',
created_on: 'DESC'
}
})
.then(function (load_results) {
console.log(
`Loaded person_obj_li:`,
load_results
);
if (load_results) {
let person_obj_kv: Record<
string,
string
> = {};
person_obj_kv[''] =
'-- Select a person --';
load_results.forEach(
(person_obj) => {
let option_text = `${person_obj?.last_first_name ?? person_obj?.given_name} (${person_obj?.primary_email?.length ? person_obj?.primary_email : '-- not set --'})`;
person_obj_kv[
person_obj.person_id
] = option_text;
}
);
$slct.person_obj_kv =
person_obj_kv;
}
return load_results;
});
}}
class="btn btn-sm preset-tonal-warning group"
title="Edit the person record linked to this presenter. Presenter ID: {$lq__event_presenter_obj.event_presenter_id}">
<Pencil size="1em" class="mx-0.75" />
<span class="hidden group-hover:inline"
>Re-link</span>
</button>
{/if}
</Element_ae_obj_field_editor>
{/if} {/if}
<!-- A sync button to use the person record fields to update the event_presenter fields --> <!-- A sync button to use the person record fields to update the event_presenter fields -->