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,14 +863,20 @@ $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}
{#if !$lq__event_presenter_obj.person_id || $ae_loc.administrator_access}
<!-- No person linked yet (any trusted staff can assign) or re-linking (admin only).
WHY admin-only for re-link: staff were creating duplicate person records when
correcting initial link mistakes. "Add Person" below handles the first-time
case without that risk. -->
<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}
field_name={'person_id'} field_name="person_id"
field_type={'select'} field_type="select"
current_value={$lq__event_presenter_obj.person_id} current_value={$lq__event_presenter_obj.person_id}
select_options={$slct.person_obj_kv} select_options={$slct.person_obj_kv}
allow_null={$ae_loc.administrator_access} allow_null={$ae_loc.administrator_access}
on_open={load_person_options_for_presenter_link}
on_success={() => on_success={() =>
events_func.load_ae_obj_id__event_presenter({ events_func.load_ae_obj_id__event_presenter({
api_cfg: $ae_api, api_cfg: $ae_api,
@@ -863,70 +893,22 @@ $effect(() => {
{$lq__event_presenter_obj.person_id} {$lq__event_presenter_obj.person_id}
</a> </a>
{:else} {:else}
<span class="inline-flex items-center gap-1 text-xs opacity-60">
<Unlink size="1em" /> <Unlink size="1em" />
person person — not linked
{@html ae_snip.html__not_set} </span>
{/if}
{#if $ae_loc.trusted_access && $ae_loc.edit_mode && (!$lq__event_presenter_obj.person_id || $ae_loc.administrator_access)}
<!-- Load person list before using the editor's built-in select.
WHY: Re-linking is intentionally admin-only when a person is already
assigned. Staff were creating duplicate person records when they made
mistakes on the initial link. The "Add Person" button below serves as
the safety net for the first-time case (no person linked yet). -->
<button
type="button"
onclick={async () => {
console.log(
'Edit the person for the presenter.'
);
$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, // 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} {/if}
</Element_ae_obj_field_editor> </Element_ae_obj_field_editor>
{:else}
<!-- Person already linked; non-admin staff see read-only. -->
<a
href="/core/person/{$lq__event_presenter_obj.person_id}"
class="text-blue-500 hover:text-blue-800 hover:underline"
title="View Person: {$lq__event_presenter_obj.person_full_name} {$lq__event_presenter_obj.person_id}">
<Link size="1em" />
{$lq__event_presenter_obj.person_id}
</a>
{/if}
{/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 -->