refactor: migrate Element_ae_crud v1/v2 usages to element_ae_obj_field_editor_v3

Replace all active Element_ae_crud (v1) and Element_ae_crud_v2 usages across
22 files with Element_ae_obj_field_editor_v3. Also remove 9 commented-out v1
imports that were dead code.

Key changes:
- Remove trigger_patch pattern; replace with direct api.update_ae_obj_v3() calls
- Replace field_value prop with current_value, on:ae_crud_updated with on_success
- Remove legacy props: api_cfg, hide_edit_btn, outline_element, show_crud,
  display_inline, display_block_edit (→ display_block), class_li
- field_type 'boolean' → 'checkbox', 'email' → 'text' (v3 has no email type)
- Replace core_func.update_ae_obj_id_crud_v2() with api.update_ae_obj_v3()
- Keep core_func where still used (QR code generation, person create)

Files: presenter_view, person_view, location_view, device_obj_li,
presentation_obj_li, session_view, launcher_file_cont, session_alert,
event/session/location/presenter page menus, leads exhibit tracking page

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-03-05 17:38:02 -05:00
parent cdf56aadcd
commit d846a39677
22 changed files with 685 additions and 2367 deletions

View File

@@ -8,7 +8,6 @@
import type { key_val } from '$lib/stores/ae_stores';
import { ae_util } from '$lib/ae_utils/ae_utils';
// import { api } from '$lib/api';
// import Element_ae_crud from '$lib/element_ae_crud.svelte';
import Element_data_store from '$lib/elements/element_data_store_v3.svelte';
import { liveQuery } from 'dexie';

View File

@@ -13,7 +13,8 @@
import type { key_val } from '$lib/stores/ae_stores';
import { ae_util } from '$lib/ae_utils/ae_utils';
import Element_ae_crud from '$lib/elements/element_ae_crud.svelte';
import Element_ae_obj_field_editor_v3 from '$lib/elements/element_ae_obj_field_editor_v3.svelte';
import { api } from '$lib/api/api';
import { core_func } from '$lib/ae_core/ae_core_functions';
import {
@@ -33,9 +34,7 @@
let ae_placeholder_li: key_val = {};
let ae_promises: key_val = $state({}); // Promise<any>;
let ae_tmp: key_val = $state({});
ae_tmp.value__hide = null;
let ae_triggers: key_val = $state({});
$effect(() => {
if (log_lvl) {
@@ -93,175 +92,77 @@
<ul class="space-y-2 px-4">
<li class:hidden={!$ae_loc.trusted_access || !$ae_loc.edit_mode}>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'external_id'}
field_type={'text'}
field_value={$lq__person_obj.external_id}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={false}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.external_id}
allow_null={true}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-id-card"></span>
External ID:
<span class="font-bold">
{@html $lq__person_obj.external_id ?? ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li class:hidden={!$ae_loc.trusted_access || !$ae_loc.edit_mode}>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'external_sys_id'}
field_type={'text'}
field_value={$lq__person_obj.external_sys_id}
allow_null={false}
hide_edit_btn={!$ae_loc.administrator_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.external_sys_id}
allow_null={true}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-fingerprint"></span>
External System ID:
<span class="font-bold">
{@html $lq__person_obj.external_sys_id ?? ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li>
<span class="fas fa-user"></span>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'given_name'}
field_type={'text'}
field_value={$lq__person_obj.given_name}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={true}
display_block_edit={false}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.given_name}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="font-bold">
{@html $lq__person_obj.given_name ?? ae_snip.html__not_set}
</span>
</Element_ae_crud>
<Element_ae_crud
api_cfg={$ae_api}
</Element_ae_obj_field_editor_v3>
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'family_name'}
field_type={'text'}
field_value={$lq__person_obj.family_name}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.family_name}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="font-bold">
{@html $lq__person_obj.family_name ?? ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'primary_email'}
field_type={'email'}
field_value={$lq__person_obj.primary_email}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
field_type={'text'}
current_value={$lq__person_obj.primary_email}
allow_null={true}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-envelope"></span>
<span class="font-bold">
@@ -277,71 +178,33 @@
email {@html ae_snip.html__not_set}
{/if}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'affiliations'}
field_type={'text'}
field_value={$lq__person_obj.affiliations}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={false}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.affiliations}
allow_null={true}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-building"></span>
<span class="font-bold">
{@html $lq__person_obj.affiliations ?? 'affiliations' + ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'professional_title'}
field_type={'text'}
field_value={$lq__person_obj.professional_title}
allow_null={false}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={false}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
current_value={$lq__person_obj.professional_title}
allow_null={true}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-user-tag"></span>
<span class="font-bold">
@@ -350,265 +213,118 @@
? $lq__person_obj.professional_title
: 'professional title' + ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li>
<Element_ae_crud
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'person'}
object_id={$lq__person_obj.person_id_random}
field_name={'passcode'}
field_type={'text'}
field_value={$lq__person_obj.passcode}
current_value={$lq__person_obj.passcode}
allow_null={true}
hide_edit_btn={!$ae_loc.trusted_access || !$ae_loc.edit_mode}
outline_element={false}
show_crud={false}
display_inline={false}
class_li={''}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
}}
on_success={() => core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 })}
>
<span class="fas fa-user-secret"></span>
Passcode:
<span class="font-bold">
{@html $lq__person_obj.passcode ?? 'passcode' + ae_snip.html__not_set}
</span>
</Element_ae_crud>
</Element_ae_obj_field_editor_v3>
</li>
<li hidden={!$ae_loc.trusted_access}>
<!-- Show/Hide -->
<Element_ae_crud
trigger_patch={ae_triggers.hide}
api_cfg={$ae_api}
object_type={'person'}
object_id={$lq__person_obj?.person_id_random}
field_name={'hide'}
field_type={'button'}
field_value={ae_tmp.value__hide}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
{#if $ae_loc.trusted_access}
<span class="text-sm">{$lq__person_obj?.hide ? 'Hidden' : 'Not Hidden'}</span>
{/if}
<button
type="button"
onclick={async () => {
await api.update_ae_obj_v3({ api_cfg: $ae_api, obj_type: 'person', obj_id: $lq__person_obj?.person_id_random, fields: { hide: !$lq__person_obj?.hide } });
core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 });
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{$lq__person_obj?.hide ? 'Hidden' : 'Not Hidden'}
{@html $lq__person_obj?.hide
? '<span class="fas fa-eye m-1"></span> Unhide?'
: '<span class="fas fa-eye-slash m-1"></span> Hide?'}
{:else}
{@html $lq__person_obj?.hide
? '<span class="fas fa-archive m-1"></span> Unarchive'
: '<span class="fas fa-archive m-1"></span> Archive'}
{/if}
<button
onclick={() => {
ae_tmp.value__hide = !$lq__person_obj?.hide;
// $events_slct.exhibit_tracking_obj.hide = !$lq__person_obj?.hide;
ae_triggers.hide = true;
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{@html $lq__person_obj?.hide
? '<span class="fas fa-eye m-1"></span> Unhide?'
: '<span class="fas fa-eye-slash m-1"></span> Hide?'}
{:else}
<!-- Users see this as the "Archive" option button -->
{@html $lq__person_obj?.hide
? '<span class="fas fa-archive m-1"></span> Unarchive'
: '<span class="fas fa-archive m-1"></span> Archive'}
{/if}
</button>
</Element_ae_crud>
</button>
<!-- Enable/Disable -->
<Element_ae_crud
trigger_patch={ae_triggers.enable}
api_cfg={$ae_api}
object_type={'person'}
object_id={$lq__person_obj?.person_id_random}
field_name={'enable'}
field_type={'button'}
field_value={ae_tmp.value__enable}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
{#if $ae_loc.trusted_access}
<span class="text-sm">{$lq__person_obj?.enable ? 'Enabled' : 'Disabled'}</span>
{/if}
<button
type="button"
onclick={async () => {
await api.update_ae_obj_v3({ api_cfg: $ae_api, obj_type: 'person', obj_id: $lq__person_obj?.person_id_random, fields: { enable: !$lq__person_obj?.enable } });
core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 });
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{$lq__person_obj?.enable ? 'Enabled' : 'Disabled'}
{@html $lq__person_obj?.enable
? '<span class="fas fa-toggle-on m-1"></span> Disable?'
: '<span class="fas fa-toggle-off m-1"></span> Enable?'}
{:else}
{@html $lq__person_obj?.enable
? '<span class="fas fa-toggle-on m-1"></span> Disable'
: '<span class="fas fa-toggle-off m-1"></span> Enable'}
{/if}
<button
onclick={() => {
ae_tmp.value__enable = !$lq__person_obj?.enable;
// $events_slct.exhibit_tracking_obj.hide = !$lq__person_obj?.hide;
ae_triggers.enable = true;
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{@html $lq__person_obj?.enable
? '<span class="fas fa-toggle-on m-1"></span> Disable?'
: '<span class="fas fa-toggle-off m-1"></span> Enable?'}
{:else}
<!-- Users see this as the "Archive" option button -->
{@html $lq__person_obj?.enable
? '<span class="fas fa-toggle-on m-1"></span> Disable'
: '<span class="fas fa-toggle-off m-1"></span> Enable'}
{/if}
</button>
</Element_ae_crud>
</button>
<!-- Priority/Not -->
<Element_ae_crud
trigger_patch={ae_triggers.priority}
api_cfg={$ae_api}
object_type={'person'}
object_id={$lq__person_obj?.person_id_random}
field_name={'priority'}
field_type={'button'}
field_value={ae_tmp.value__priority}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
{#if $ae_loc.trusted_access}
<span class="text-sm">{$lq__person_obj?.priority ? 'Priority' : 'Not Priority'}</span>
{/if}
<button
type="button"
onclick={async () => {
await api.update_ae_obj_v3({ api_cfg: $ae_api, obj_type: 'person', obj_id: $lq__person_obj?.person_id_random, fields: { priority: !$lq__person_obj?.priority } });
core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 });
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{$lq__person_obj?.priority ? 'Priority' : 'Not Priority'}
{@html $lq__person_obj?.priority
? '<span class="fas fa-star m-1"></span> Not Priority?'
: '<span class="fas fa-star m-1"></span> Priority?'}
{:else}
{@html $lq__person_obj?.priority
? '<span class="fas fa-star m-1"></span> Not Priority'
: '<span class="fas fa-star m-1"></span> Priority'}
{/if}
<button
onclick={() => {
ae_tmp.value__priority = !$lq__person_obj?.priority;
// $events_slct.exhibit_tracking_obj.hide = !$lq__person_obj?.hide;
ae_triggers.priority = true;
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{@html $lq__person_obj?.priority
? '<span class="fas fa-star m-1"></span> Not Priority?'
: '<span class="fas fa-star m-1"></span> Priority?'}
{:else}
<!-- Users see this as the "Archive" option button -->
{@html $lq__person_obj?.priority
? '<span class="fas fa-star m-1"></span> Not Priority'
: '<span class="fas fa-star m-1"></span> Priority'}
{/if}
</button>
</Element_ae_crud>
</button>
<!-- Allow Auth Key/Not -->
<Element_ae_crud
trigger_patch={ae_triggers.allow_auth_key}
api_cfg={$ae_api}
object_type={'person'}
object_id={$lq__person_obj?.person_id_random}
field_name={'allow_auth_key'}
field_type={'button'}
field_value={ae_tmp.value__allow_auth_key}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={(e) => {
console.log(`ae_crud_updated:`, e.detail);
core_func
.load_ae_obj_id__person({
api_cfg: $ae_api,
person_id: $lq__person_obj?.person_id_random,
log_lvl: 1
})
.then(function (load_results) {
// Maybe reload page?
// window.location.reload();
});
{#if $ae_loc.trusted_access}
<span class="text-sm">{$lq__person_obj?.allow_auth_key ? 'Allow Auth Key' : 'Not Allow Auth Key'}</span>
{/if}
<button
type="button"
onclick={async () => {
await api.update_ae_obj_v3({ api_cfg: $ae_api, obj_type: 'person', obj_id: $lq__person_obj?.person_id_random, fields: { allow_auth_key: !$lq__person_obj?.allow_auth_key } });
core_func.load_ae_obj_id__person({ api_cfg: $ae_api, person_id: $lq__person_obj?.person_id_random, log_lvl: 1 });
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{$lq__person_obj?.allow_auth_key ? 'Allow Auth Key' : 'Not Allow Auth Key'}
{@html $lq__person_obj?.allow_auth_key
? '<span class="fas fa-key m-1"></span> Not Allow Auth Key?'
: '<span class="fas fa-key m-1"></span> Allow Auth Key?'}
{:else}
{@html $lq__person_obj?.allow_auth_key
? '<span class="fas fa-key m-1"></span> Not Allow Auth Key'
: '<span class="fas fa-key m-1"></span> Allow Auth Key'}
{/if}
<button
onclick={() => {
ae_tmp.value__allow_auth_key = !$lq__person_obj?.allow_auth_key;
// $events_slct.exhibit_tracking_obj.hide = !$lq__person_obj?.hide;
ae_triggers.allow_auth_key = true;
}}
class="btn btn-sm preset-tonal-warning"
>
{#if $ae_loc.trusted_access}
{@html $lq__person_obj?.allow_auth_key
? '<span class="fas fa-key m-1"></span> Not Allow Auth Key?'
: '<span class="fas fa-key m-1"></span> Allow Auth Key?'}
{:else}
<!-- Users see this as the "Archive" option button -->
{@html $lq__person_obj?.allow_auth_key
? '<span class="fas fa-key m-1"></span> Not Allow Auth Key'
: '<span class="fas fa-key m-1"></span> Allow Auth Key'}
{/if}
</button>
</Element_ae_crud>
</button>
</li>
<li>