refactor(crud): migrate v2 component usages to field-editor-v3

Replaces all active Element_ae_crud_v2 usages with Element_ae_obj_field_editor_v3,
and direct core_func.update_ae_obj_id_crud_v2 calls with api.update_ae_obj_v3.
Adds 'number' field_type to v3 editor. All on_success callbacks trigger SWR
refresh via events_func load functions so liveQuery updates Dexie correctly.

- element_ae_obj_field_editor_v3: add 'number' input type
- ae_comp__event_session_obj_li: replace core_func v2 API calls + dead import
- ae_comp__event_location_obj_li: migrate 2x Element_ae_crud_v2 (name, description)
- ae_tab__manage: migrate 7x Element_ae_crud_v2 (priority/checkbox, numbers, text, tiptap)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-03-05 16:39:29 -05:00
parent c3ec0f88ee
commit cdf56aadcd
4 changed files with 76 additions and 89 deletions

View File

@@ -9,7 +9,7 @@
import { ae_api, ae_loc } from '$lib/stores/ae_stores';
import { events_loc, events_sess } from '$lib/stores/ae_events_stores';
import { events_func } from '$lib/ae_events_functions';
import Element_ae_crud_v2 from '$lib/elements/element_ae_crud_v2.svelte';
import Element_ae_obj_field_editor_v3 from '$lib/elements/element_ae_obj_field_editor_v3.svelte';
import Comp_exhibit_license_list from './ae_comp__exhibit_license_list.svelte';
import Comp_exhibit_custom_questions from './ae_comp__exhibit_custom_questions.svelte';
import Comp_exhibit_payment from './ae_comp__exhibit_payment.svelte';
@@ -66,69 +66,58 @@
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<!-- Priority / Payment Toggle -->
<div class="card p-3 variant-soft flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40">Payment Status</div>
<div class="font-bold">{$lq__exhibit_obj?.priority ? 'PAID' : 'PENDING'}</div>
</div>
<Element_ae_crud_v2
api_cfg={$ae_api}
<div class="text-[10px] uppercase font-black opacity-40">Payment Status</div>
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="priority"
field_type="boolean"
current_field_value={$lq__exhibit_obj?.priority}
object_reload={true}
/>
field_type="checkbox"
current_value={$lq__exhibit_obj?.priority}
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
>
<div class="font-bold">{$lq__exhibit_obj?.priority ? 'PAID' : 'PENDING'}</div>
</Element_ae_obj_field_editor_v3>
</div>
<!-- Max Licenses -->
<div class="card p-3 variant-soft flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40">Max Licenses</div>
</div>
<Element_ae_crud_v2
api_cfg={$ae_api}
<div class="text-[10px] uppercase font-black opacity-40">Max Licenses</div>
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="license_max"
field_type="number"
current_field_value={$lq__exhibit_obj?.license_max}
object_reload={true}
class_li="w-16 font-mono text-right"
current_value={$lq__exhibit_obj?.license_max}
class_li="font-mono"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
</div>
<!-- Small Devices -->
<div class="card p-3 variant-soft flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40">Small Devices</div>
</div>
<Element_ae_crud_v2
api_cfg={$ae_api}
<div class="text-[10px] uppercase font-black opacity-40">Small Devices</div>
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="leads_device_sm_qty"
field_type="number"
current_field_value={$lq__exhibit_obj?.leads_device_sm_qty}
object_reload={true}
class_li="w-16 font-mono text-right"
current_value={$lq__exhibit_obj?.leads_device_sm_qty}
class_li="font-mono"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
</div>
<!-- Large Devices -->
<div class="card p-3 variant-soft flex items-center justify-between">
<div>
<div class="text-[10px] uppercase font-black opacity-40">Large Devices</div>
</div>
<Element_ae_crud_v2
api_cfg={$ae_api}
<div class="text-[10px] uppercase font-black opacity-40">Large Devices</div>
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="leads_device_lg_qty"
field_type="number"
current_field_value={$lq__exhibit_obj?.leads_device_lg_qty}
object_reload={true}
class_li="w-16 font-mono text-right"
current_value={$lq__exhibit_obj?.leads_device_lg_qty}
class_li="font-mono"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
</div>
</div>
@@ -148,17 +137,15 @@
<label class="label mb-2">
<span class="text-xs uppercase font-black opacity-40 tracking-widest">Exhibitor Name</span>
</label>
<Element_ae_crud_v2
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="name"
field_type="text"
current_field_value={$lq__exhibit_obj?.name}
object_reload={true}
hide_element={false}
current_value={$lq__exhibit_obj?.name}
display_block={true}
class_li="font-bold text-xl"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
<p class="text-[10px] opacity-50 mt-2 italic">This name is visible to attendees when you scan their badges.</p>
</div>
@@ -168,17 +155,15 @@
<label class="label mb-2">
<span class="text-xs uppercase font-black opacity-40 tracking-widest">Booth Description / Promo</span>
</label>
<Element_ae_crud_v2
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="description"
field_type="tiptap"
current_field_value={$lq__exhibit_obj?.description}
object_reload={true}
hide_element={false}
current_value={$lq__exhibit_obj?.description}
display_block={true}
class_li="text-sm"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
</div>
</div>
@@ -205,17 +190,15 @@
</div>
{/if}
<Element_ae_crud_v2
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type="event_exhibit"
object_id={exhibit_id}
field_name="staff_passcode"
field_type="text"
current_field_value={$lq__exhibit_obj?.staff_passcode}
object_reload={true}
class_li="font-mono text-xl tracking-widest font-bold"
hide_element={false}
current_value={$lq__exhibit_obj?.staff_passcode}
display_block={true}
class_li="font-mono text-xl tracking-widest font-bold"
on_success={() => events_func.load_ae_obj_id__event_exhibit({ api_cfg: $ae_api, exhibit_id })}
/>
</div>
<Key size="1.5em" class="opacity-20" />

View File

@@ -36,7 +36,7 @@
import { events_func } from '$lib/ae_events_functions';
import Comp_event_session_obj_li from '../../../ae_comp__event_session_obj_li_wrapper.svelte';
import Element_ae_crud_v2 from '$lib/elements/element_ae_crud_v2.svelte';
import Element_ae_obj_field_editor_v3 from '$lib/elements/element_ae_obj_field_editor_v3.svelte';
import Comp_event_device_obj_li from '../device/device/ae_comp__event_device_obj_li_wrapper.svelte';
// if (log_lvl) {
@@ -138,28 +138,23 @@
class="h5 rounded-md p-2 bg-gray-200 flex flex-row gap-1 items-center justify-between"
>
<span>
<Element_ae_crud_v2
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'event_location'}
object_id={event_location_obj?.event_location_id}
object_reload={true}
field_name={'name'}
field_type={'text'}
current_field_value={event_location_obj?.name}
current_value={event_location_obj?.name}
allow_null={false}
hide_element={!$ae_loc.edit_mode}
hide_edit_btn={false}
outline_element={false}
display_block={false}
display_absolute_edit={false}
class_li={'m-1'}
on_success={() => events_func.load_ae_obj_id__event_location({ api_cfg: $ae_api, event_location_id: event_location_obj.event_location_id })}
>
<!-- <strong class="text-sm">Name/Title:</strong> -->
<span
class="fas fa-map-marker-alt m-1 text-neutral-800/80"
></span>
"{event_location_obj?.name ?? '-- not set --'}"
</Element_ae_crud_v2>
</Element_ae_obj_field_editor_v3>
<!-- "{event_location_obj.name}" -->
{#if event_location_obj?.code && !$events_loc.pres_mgmt?.hide__location_code}
@@ -320,23 +315,18 @@
{/if}
</Element_ae_crud> -->
<Element_ae_crud_v2
api_cfg={$ae_api}
<Element_ae_obj_field_editor_v3
object_type={'event_location'}
object_id={event_location_obj?.event_location_id}
object_reload={true}
field_name={'description'}
field_type={'textarea'}
current_field_value={event_location_obj?.description}
current_value={event_location_obj?.description}
allow_null={true}
hide_element={!$ae_loc.edit_mode}
hide_edit_btn={!$ae_loc.trusted_access ||
!$ae_loc.edit_mode}
outline_element={false}
display_block={false}
display_absolute_edit={false}
textarea_rows={15}
class_li={'m-1'}
on_success={() => events_func.load_ae_obj_id__event_location({ api_cfg: $ae_api, event_location_id: event_location_obj.event_location_id })}
>
<strong class="text-sm"> Description: </strong>
@@ -388,7 +378,7 @@
{:else}
{@html ae_snip.html__not_set}
{/if}
</Element_ae_crud_v2>
</Element_ae_obj_field_editor_v3>
</div>
{#if !$events_loc.pres_mgmt.show_content__location_devices_sessions || $events_loc.pres_mgmt.show_content__location_devices_sessions == 'default' || $events_loc.pres_mgmt.show_content__location_devices_sessions == 'sessions'}

View File

@@ -50,12 +50,12 @@
Clock
} from 'lucide-svelte';
import Element_ae_crud_v2 from '$lib/elements/element_ae_crud_v2.svelte';
import { api } from '$lib/api/api';
import Comp_event_presenter_obj_li from './[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li_wrapper.svelte';
import Element_manage_event_file_li from '$lib/elements/element_manage_event_file_li_direct.svelte';
import Comp_event_session_alert from './[event_id]/(pres_mgmt)/session/ae_comp__event_session_alert.svelte';
import { core_func } from '$lib/ae_core/ae_core_functions';
import { events_func } from '$lib/ae_events_functions';
import { ae_loc, ae_api, ae_snip } from '$lib/stores/ae_stores';
import {
events_loc,
@@ -330,16 +330,19 @@
class="btn btn-icon btn-xs {session_obj?.hide
? 'preset-tonal-error'
: 'preset-tonal-secondary'}"
onclick={() =>
core_func.update_ae_obj_id_crud_v2({
onclick={async () => {
await api.update_ae_obj_v3({
api_cfg: $ae_api,
object_type: 'event_session',
object_id:
session_obj.event_session_id,
field_name: 'hide',
new_field_value: !session_obj.hide,
obj_type: 'event_session',
obj_id: session_obj.event_session_id,
fields: { hide: !session_obj.hide },
log_lvl: 1
})}
});
events_func.load_ae_obj_id__event_session({
api_cfg: $ae_api,
event_session_id: session_obj.event_session_id
});
}}
>
{#if session_obj?.hide}<EyeOff
size="1.2em"
@@ -351,16 +354,19 @@
class="btn btn-icon btn-xs {session_obj?.alert
? 'preset-tonal-warning'
: 'preset-tonal-surface'}"
onclick={() =>
core_func.update_ae_obj_id_crud_v2({
onclick={async () => {
await api.update_ae_obj_v3({
api_cfg: $ae_api,
object_type: 'event_session',
object_id:
session_obj.event_session_id,
field_name: 'alert',
new_field_value: !session_obj.alert,
obj_type: 'event_session',
obj_id: session_obj.event_session_id,
fields: { alert: !session_obj.alert },
log_lvl: 1
})}
});
events_func.load_ae_obj_id__event_session({
api_cfg: $ae_api,
event_session_id: session_obj.event_session_id
});
}}
>
{#if session_obj?.alert}<Bell
size="1.2em"