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,
|
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 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user