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:
@@ -54,7 +54,6 @@ import {
|
||||
LoaderCircle,
|
||||
Mail,
|
||||
MessageSquareText,
|
||||
Pencil,
|
||||
Plus,
|
||||
Presentation,
|
||||
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>
|
||||
|
||||
{#if $lq__event_presenter_obj}
|
||||
@@ -342,7 +366,7 @@ $effect(() => {
|
||||
</li>
|
||||
|
||||
<li
|
||||
class="space-y-2"
|
||||
class=""
|
||||
class:hidden={!$ae_loc.trusted_access ||
|
||||
(!$ae_loc.edit_mode && !$ae_loc.manager_access)}>
|
||||
<User size="1em" />
|
||||
@@ -384,7 +408,7 @@ $effect(() => {
|
||||
</span>
|
||||
</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}
|
||||
<div>
|
||||
<Asterisk size="1em" />
|
||||
@@ -839,94 +863,52 @@ $effect(() => {
|
||||
Person link:
|
||||
<!-- Allow for linking the presenter to a person record. -->
|
||||
{#if $ae_loc.trusted_access}
|
||||
<Element_ae_obj_field_editor
|
||||
object_type={'event_presenter'}
|
||||
object_id={$lq__event_presenter_obj?.event_presenter_id}
|
||||
field_name={'person_id'}
|
||||
field_type={'select'}
|
||||
current_value={$lq__event_presenter_obj.person_id}
|
||||
select_options={$slct.person_obj_kv}
|
||||
allow_null={$ae_loc.administrator_access}
|
||||
on_success={() =>
|
||||
events_func.load_ae_obj_id__event_presenter({
|
||||
api_cfg: $ae_api,
|
||||
event_presenter_id:
|
||||
$lq__event_presenter_obj?.event_presenter_id,
|
||||
log_lvl: 0
|
||||
})}>
|
||||
{#if $lq__event_presenter_obj.person_id}
|
||||
<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>
|
||||
{:else}
|
||||
<Unlink size="1em" />
|
||||
person
|
||||
{@html ae_snip.html__not_set}
|
||||
{/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}
|
||||
</Element_ae_obj_field_editor>
|
||||
{#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
|
||||
object_type="event_presenter"
|
||||
object_id={$lq__event_presenter_obj?.event_presenter_id}
|
||||
field_name="person_id"
|
||||
field_type="select"
|
||||
current_value={$lq__event_presenter_obj.person_id}
|
||||
select_options={$slct.person_obj_kv}
|
||||
allow_null={$ae_loc.administrator_access}
|
||||
on_open={load_person_options_for_presenter_link}
|
||||
on_success={() =>
|
||||
events_func.load_ae_obj_id__event_presenter({
|
||||
api_cfg: $ae_api,
|
||||
event_presenter_id:
|
||||
$lq__event_presenter_obj?.event_presenter_id,
|
||||
log_lvl: 0
|
||||
})}>
|
||||
{#if $lq__event_presenter_obj.person_id}
|
||||
<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>
|
||||
{:else}
|
||||
<span class="inline-flex items-center gap-1 text-xs opacity-60">
|
||||
<Unlink size="1em" />
|
||||
person — not linked
|
||||
</span>
|
||||
{/if}
|
||||
</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}
|
||||
|
||||
<!-- A sync button to use the person record fields to update the event_presenter fields -->
|
||||
|
||||
Reference in New Issue
Block a user