feat(badges): add manual one-off badge create modal

Two-step creation: POST event_person first, then event_badge linked to it.
Badge create route (event_person parent) pending backend fix — frontend is
ready and passing event_person_id + event_badge_template_id in payload.

- ae_events__event_person.ts: new create function (nested under event)
- ae_events_functions.ts: export create_ae_obj__event_person
- ae_comp__badge_create_form.svelte: modal form with live name preview,
  conditional display-name override, template selector (auto-selects when
  only one template), badge_type_code_li derived from selected template's
  badge_type_list JSON, two-step submit status labels
- +page.svelte: load template list via liveQuery, wire Create Badge button
  (edit_mode only), native <dialog> modal with backdrop, remote-first
  refresh on success

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-03-27 09:59:46 -04:00
parent 35c4341c34
commit f87ab10251
4 changed files with 344 additions and 83 deletions

View File

@@ -0,0 +1,42 @@
import type { key_val } from '$lib/stores/ae_stores';
import { api } from '$lib/api/api';
const ae_promises: key_val = {};
/**
* create_ae_obj__event_person
* Creates a new event_person record linked to an event.
* Used as the first step of manual one-off badge creation.
* The returned event_person_id is then passed to create_ae_obj__event_badge.
*/
export async function create_ae_obj__event_person({
api_cfg,
event_id,
data_kv,
params = {},
log_lvl = 0
}: {
api_cfg: any;
event_id: string;
data_kv: key_val;
params?: key_val;
log_lvl?: number;
}): Promise<any | null> {
if (log_lvl) {
console.log(
`*** create_ae_obj__event_person() *** event_id=${event_id}`
);
}
ae_promises.create__event_person = await api.create_nested_obj({
api_cfg,
parent_type: 'event',
parent_id: event_id,
child_type: 'event_person',
fields: data_kv,
params,
log_lvl
});
return ae_promises.create__event_person;
}

View File

@@ -33,6 +33,8 @@ import * as event_presenter from '$lib/ae_events/ae_events__event_presenter';
import * as event_badge from '$lib/ae_events/ae_events__event_badge';
import { create_ae_obj__event_person } from '$lib/ae_events/ae_events__event_person';
import * as event_badge_template from '$lib/ae_events/ae_events__event_badge_template';
const export_obj = {
@@ -46,6 +48,9 @@ const export_obj = {
update_ae_obj__event: event.update_ae_obj__event,
sync_config__event_pres_mgmt: event.sync_config__event_pres_mgmt,
// Event Person
create_ae_obj__event_person: create_ae_obj__event_person,
// Event Badges
load_ae_obj_id__event_badge: event_badge.load_ae_obj_id__event_badge,
load_ae_obj_li__event_badge: event_badge.load_ae_obj_li__event_badge,