chore: svelte-check cleanup — fix Svelte 5 patterns in events/pres_mgmt, badges, launcher, and tests

Source changes (0 errors, 175 warnings after):
- api_post__crud_obj_v3: add backward-compat migration aliases (for_obj_type/id, obj_type/id) to nested CRUD funcs
- ae_events__event_device/presenter/session: make event_id/presentation_id optional; fall back to store value
- element_ae_obj_field_editor_v3: import type Snippet properly; mark current_value as $bindable()
- ae_comp__badge_obj_view: fix $derived(() => false) → $derived(false) for show_receipt/show_tickets
- badge templates: pass explicit event_id param to delete/update calls
- launcher/+page: capture URL params as stable consts; pass event_id to update_ae_obj__event_device
- ae_comp__event_device_obj_li: wrap setInterval in $effect; onDestroy cleanup always registered
- ae_comp__event_device_obj_li_wrapper: move console.log to $effect; fix self-closing tag
- presenter form/menu/view/list: add missing event_presentation_id to all update/delete calls
- reports/locations/presenter/+page: move store assignments into $effect + untrack; ae_acct → $derived
- session/+page: add Comp_event_presenter_form_agree import; cast for type compat
- session_view: wrap <img onclick> in <button> for accessibility/validity
- ae_comp__event_presentation_obj_li: remove unneeded event_id/session_id from create_ae_obj__event_presenter
- ae_comp__event_session_obj_li: make lq prop optional; add plain-array fallback prop
- location/+page: refactor to $derived ae_acct, $effect+untrack for stores, simplified session/file sections
- location_page_menu: add optional data prop; export interface

Tests:
- Rename ae_events__event_badge.spec.ts → ae_events__event_badge.test.ts (extended coverage)
- All test files: 'warn' → 'warning' (Playwright API), addInitScript array-destructure pattern, import type fixes
- ae_defaults: remove duplicate hide_app_cfg key; meaningful sponsorship cfg_id placeholder
- create_event_badge.spec: fix import path to use $lib alias
- event_presenter.test: fix test URL to use /presenter/:id route

NOTE: location/+page.svelte — Element_manage_event_file_li_wrap no longer receives
allow_basic/allow_moderator (now default false); file list shows but management
actions may be restricted. Follow-up needed to restore auth__kv-based access.
This commit is contained in:
Scott Idem
2026-03-05 20:05:35 -05:00
parent 56419a097f
commit 73597cb8b4
41 changed files with 404 additions and 444 deletions

View File

@@ -54,9 +54,14 @@ export async function create_ae_obj_v3({
interface CreateNestedObjV3Params {
api_cfg: any;
parent_type: string;
parent_id: string;
child_type: string;
parent_type?: string;
parent_id?: string;
child_type?: string;
// Aliases for migration
for_obj_type?: string;
for_obj_id?: string;
obj_type?: string;
fields: key_val;
params?: key_val;
log_lvl?: number;
@@ -67,11 +72,18 @@ export async function create_nested_obj_v3({
parent_type,
parent_id,
child_type,
for_obj_type,
for_obj_id,
obj_type,
fields,
params = {},
log_lvl = 0
}: CreateNestedObjV3Params) {
const endpoint = `/v3/crud/${parent_type}/${parent_id}/${child_type}/`;
const p_type = parent_type || for_obj_type;
const p_id = parent_id || for_obj_id;
const c_type = child_type || obj_type;
const endpoint = `/v3/crud/${p_type}/${p_id}/${c_type}/`;
if (log_lvl) {
console.log('*** create_nested_obj_v3 ***');
@@ -145,10 +157,16 @@ export async function update_ae_obj_v3({
interface UpdateNestedObjV3Params {
api_cfg: any;
parent_type: string;
parent_id: string;
child_type: string;
child_id: string;
parent_type?: string;
parent_id?: string;
child_type?: string;
child_id?: string;
// Aliases for migration
for_obj_type?: string;
for_obj_id?: string;
obj_type?: string;
obj_id?: string;
fields: key_val;
params?: key_val;
log_lvl?: number;
@@ -160,11 +178,20 @@ export async function update_nested_obj_v3({
parent_id,
child_type,
child_id,
for_obj_type,
for_obj_id,
obj_type,
obj_id,
fields,
params = {},
log_lvl = 0
}: UpdateNestedObjV3Params) {
const endpoint = `/v3/crud/${parent_type}/${parent_id}/${child_type}/${child_id}`;
const p_type = parent_type || for_obj_type;
const p_id = parent_id || for_obj_id;
const c_type = child_type || obj_type;
const c_id = child_id || obj_id;
const endpoint = `/v3/crud/${p_type}/${p_id}/${c_type}/${c_id}`;
if (log_lvl) {
console.log('*** update_nested_obj_v3 ***');
@@ -233,10 +260,16 @@ export async function delete_ae_obj_v3({
interface DeleteNestedAeObjV3Params {
api_cfg: any;
parent_type: string;
parent_id: string;
child_type: string;
child_id: string;
parent_type?: string;
parent_id?: string;
child_type?: string;
child_id?: string;
// Aliases for migration
for_obj_type?: string;
for_obj_id?: string;
obj_type?: string;
obj_id?: string;
method?: 'delete' | 'soft_delete' | 'disable' | 'hide';
params?: key_val;
log_lvl?: number;
@@ -251,11 +284,20 @@ export async function delete_nested_ae_obj_v3({
parent_id,
child_type,
child_id,
for_obj_type,
for_obj_id,
obj_type,
obj_id,
method = 'delete',
params = {},
log_lvl = 0
}: DeleteNestedAeObjV3Params) {
const endpoint = `/v3/crud/${parent_type}/${parent_id}/${child_type}/${child_id}`;
const p_type = parent_type || for_obj_type;
const p_id = parent_id || for_obj_id;
const c_type = child_type || obj_type;
const c_id = child_id || obj_id;
const endpoint = `/v3/crud/${p_type}/${p_id}/${c_type}/${c_id}`;
const query_params = { ...params, method };
if (log_lvl) {

View File

@@ -18,7 +18,7 @@ import { create_ae_obj__event_badge } from './ae_events__event_badge';
describe('create_ae_obj__event_badge', () => {
it('calls api.create_nested_obj_v3 with the correct params and returns the result', async () => {
const mocked = await import('$lib/api/api');
const mockCreateNested = mocked.api.create_nested_obj_v3 as jest.MockedFunction<any>;
const mockCreateNested = mocked.api.create_nested_obj_v3 as any;
const fakeResult = { event_badge_id: 'eb123', full_name: 'Test User' };
mockCreateNested.mockResolvedValue(fakeResult);
@@ -30,11 +30,15 @@ describe('create_ae_obj__event_badge', () => {
const result = await create_ae_obj__event_badge({ api_cfg, event_id, data_kv, try_cache: false });
expect(mockCreateNested).toHaveBeenCalled();
const calledWith = mockCreateNested.mock.calls[0][0];
expect(calledWith.parent_type).toBe('event');
expect(calledWith.parent_id).toBe(event_id);
expect(calledWith.child_type).toBe('event_badge');
expect(calledWith.fields).toEqual(data_kv);
expect(mockCreateNested).toHaveBeenCalledWith({
api_cfg,
parent_type: 'event',
parent_id: event_id,
child_type: 'event_badge',
fields: data_kv,
return_obj: true,
log_lvl: 0
});
expect(result).toEqual(fakeResult);
});
@@ -43,7 +47,7 @@ describe('create_ae_obj__event_badge', () => {
describe('update_ae_obj__event_badge', () => {
it('calls api.update_nested_obj_v3 with correct params and returns result', async () => {
const mocked = await import('$lib/api/api');
const mockUpdate = mocked.api.update_nested_obj_v3 as jest.MockedFunction<any>;
const mockUpdate = mocked.api.update_nested_obj_v3 as any;
const fakeResult = { event_badge_id: 'eb999', full_name: 'Updated' };
mockUpdate.mockResolvedValue(fakeResult);
@@ -52,9 +56,16 @@ describe('update_ae_obj__event_badge', () => {
const res = await update_ae_obj__event_badge({ api_cfg, event_id: 'evt1', event_badge_id: 'eb999', data_kv: { full_name_override: 'Updated' }, try_cache: false });
expect(mockUpdate).toHaveBeenCalled();
const called = mockUpdate.mock.calls[0][0];
expect(called.child_id).toBe('eb999');
expect(called.fields).toEqual({ full_name_override: 'Updated' });
expect(mockUpdate).toHaveBeenCalledWith({
api_cfg,
parent_type: 'event',
parent_id: 'evt1',
child_type: 'event_badge',
child_id: 'eb999',
fields: { full_name_override: 'Updated' },
return_obj: true,
log_lvl: 0
});
expect(res).toEqual(fakeResult);
});
});
@@ -62,11 +73,11 @@ describe('update_ae_obj__event_badge', () => {
describe('delete_ae_obj_id__event_badge', () => {
it('calls api.delete_nested_ae_obj_v3 and deletes from local DB when try_cache true', async () => {
const mocked = await import('$lib/api/api');
const mockDelete = mocked.api.delete_nested_ae_obj_v3 as jest.MockedFunction<any>;
const mockDelete = mocked.api.delete_nested_ae_obj_v3 as any;
mockDelete.mockResolvedValue({ success: true });
const db = await import('$lib/ae_events/db_events');
const dbDelete = db.db_events.badge.delete as jest.MockedFunction<any>;
const dbDelete = db.db_events.badge.delete as any;
const { delete_ae_obj_id__event_badge } = await import('./ae_events__event_badge');
@@ -82,7 +93,7 @@ describe('delete_ae_obj_id__event_badge', () => {
describe('search__event_badge', () => {
it('calls api.search_ae_obj_v3 and returns list (handles data envelope)', async () => {
const mocked = await import('$lib/api/api');
const mockSearch = mocked.api.search_ae_obj_v3 as jest.MockedFunction<any>;
const mockSearch = mocked.api.search_ae_obj_v3 as any;
const fakeList = [{ event_badge_id: 'eb1' }, { event_badge_id: 'eb2' }];
mockSearch.mockResolvedValue({ data: fakeList });

View File

@@ -1,3 +1,5 @@
import { get } from 'svelte/store';
import { slct } from '$lib/stores/ae_stores';
import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api';
@@ -185,11 +187,16 @@ export async function create_ae_obj__event_device({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventDevice | null> {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('create_ae_obj__event_device: event_id is required');
return null;
}
if (log_lvl) {
console.log(`*** create_ae_obj__event_device() *** [V3] event_id=${event_id}`);
}
@@ -235,12 +242,17 @@ export async function delete_ae_obj_id__event_device({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
event_device_id: string;
method?: 'delete' | 'soft_delete' | 'disable' | 'hide';
try_cache?: boolean;
log_lvl?: number;
}) {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('delete_ae_obj_id__event_device: event_id is required');
return null;
}
if (log_lvl) {
console.log(`*** delete_ae_obj_id__event_device() *** [V3] id=${event_device_id}`);
}
@@ -272,12 +284,17 @@ export async function update_ae_obj__event_device({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
event_device_id: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventDevice | null> {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('update_ae_obj__event_device: event_id is required');
return null;
}
if (log_lvl) {
console.log(`*** update_ae_obj__event_device() *** [V3] id=${event_device_id}`);
}
@@ -512,4 +529,4 @@ export async function process_ae_obj__event_device_props({
return obj;
}
});
}
}

View File

@@ -1,3 +1,6 @@
import { get } from 'svelte/store';
import { slct } from '$lib/stores/ae_stores';
import { events_slct } from '$lib/stores/ae_events_stores';
import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api';
@@ -184,11 +187,16 @@ export async function create_ae_obj__event_presenter({
log_lvl = 0
}: {
api_cfg: any;
event_presentation_id: string;
event_presentation_id?: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventPresenter | null> {
if (!event_presentation_id) event_presentation_id = get(events_slct).event_presentation_id;
if (!event_presentation_id) {
console.error('create_ae_obj__event_presenter: event_presentation_id is required');
return null;
}
const result = await api.create_nested_obj_v3({
api_cfg,
for_obj_type: 'event_presentation',
@@ -225,12 +233,17 @@ export async function delete_ae_obj_id__event_presenter({
log_lvl = 0
}: {
api_cfg: any;
event_presentation_id: string;
event_presentation_id?: string;
event_presenter_id: string;
method?: 'delete' | 'soft_delete' | 'disable' | 'hide';
try_cache?: boolean;
log_lvl?: number;
}) {
if (!event_presentation_id) event_presentation_id = get(events_slct).event_presentation_id;
if (!event_presentation_id) {
console.error('delete_ae_obj_id__event_presenter: event_presentation_id is required');
return null;
}
const result = await api.delete_nested_ae_obj_v3({
api_cfg,
for_obj_type: 'event_presentation',
@@ -254,12 +267,17 @@ export async function update_ae_obj__event_presenter({
log_lvl = 0
}: {
api_cfg: any;
event_presentation_id: string;
event_presentation_id?: string;
event_presenter_id: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventPresenter | null> {
if (!event_presentation_id) event_presentation_id = get(events_slct).event_presentation_id;
if (!event_presentation_id) {
console.error('update_ae_obj__event_presenter: event_presentation_id is required');
return null;
}
const result = await api.update_nested_obj_v3({
api_cfg,
for_obj_type: 'event_presentation',

View File

@@ -1,3 +1,5 @@
import { get } from 'svelte/store';
import { slct } from '$lib/stores/ae_stores';
import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api';
@@ -270,11 +272,16 @@ export async function create_ae_obj__event_session({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventSession | null> {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('create_ae_obj__event_session: event_id is required');
return null;
}
const result = await api.create_nested_obj_v3({
api_cfg,
for_obj_type: 'event',
@@ -309,12 +316,17 @@ export async function delete_ae_obj_id__event_session({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
event_session_id: string;
method?: 'delete' | 'soft_delete' | 'disable' | 'hide';
try_cache?: boolean;
log_lvl?: number;
}) {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('delete_ae_obj_id__event_session: event_id is required');
return null;
}
const result = await api.delete_nested_ae_obj_v3({
api_cfg,
for_obj_type: 'event',
@@ -337,12 +349,17 @@ export async function update_ae_obj__event_session({
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
event_id?: string;
event_session_id: string;
data_kv: key_val;
try_cache?: boolean;
log_lvl?: number;
}): Promise<ae_EventSession | null> {
if (!event_id) event_id = get(slct).event_id;
if (!event_id) {
console.error('update_ae_obj__event_session: event_id is required');
return null;
}
const result = await api.update_nested_obj_v3({
api_cfg,
for_obj_type: 'event',

View File

@@ -1,6 +1,7 @@
<script lang="ts">
// import { browser } from '$app/environment';
import { untrack } from 'svelte';
import type { Snippet } from 'svelte';
import { LoaderCircle, SquarePen, Save, X, Trash2, Check, CircleAlert } from 'lucide-svelte';
import type { key_val } from '$lib/stores/ae_stores';
import { ae_api, ae_loc } from '$lib/stores/ae_stores';
@@ -39,7 +40,7 @@
on_error?: (error: any) => void;
// Snippets
children?: import('svelte').Snippet;
children?: Snippet;
}
let {
@@ -47,7 +48,7 @@
object_type,
object_id,
field_name,
current_value,
current_value = $bindable(),
field_type = 'text',
allow_null = false,
select_options = {},