chore(badges): remove legacy badge_id_only_search; sync remote badges config into badges_loc; docs update

This commit is contained in:
Scott Idem
2026-04-02 18:03:23 -04:00
parent 0ab8b936ce
commit c198ca2454
12 changed files with 254 additions and 86 deletions

View File

@@ -80,6 +80,20 @@ let lq__event_obj = $derived(
})
);
// Mirror server-side badges config into the persisted local store when the
// event object is available so UI can read a fast local copy.
$effect(() => {
const remote_cfg = $lq__event_obj?.mod_badges_json;
if (remote_cfg) {
untrack(() => {
events_func.sync_config__event_badges({
badges_cfg_remote: remote_cfg,
log_lvl: log_lvl
});
});
}
});
// Stable LiveQuery Pattern (Aether UI V3)
let lq__event_badge_obj_li = $derived.by(() => {
const ids = event_badge_id_li;
@@ -129,9 +143,7 @@ let search_params = $derived({
aff: (badges_loc.current.qry_affiliations ?? '').toLowerCase().trim(),
sort: badges_loc.current.qry_sort_order,
event_id: $events_slct?.event_id,
remote_first: badges_loc.current.qry__remote_first,
// Event-level override: when true, restrict searches to badge IDs only
badge_id_only: $lq__event_obj?.mod_badges_json?.badge_id_only_search ?? false
remote_first: badges_loc.current.qry__remote_first
});
// 2. Controlled effect for triggering searches
@@ -194,10 +206,7 @@ async function handle_search_refresh(params: any) {
return false;
}
if (params.badge_id_only && qry_str) {
const id = (badge.event_badge_id ?? '').toLowerCase();
if (!id.includes(qry_str)) return false;
} else if (qry_str) {
if (qry_str) {
const given_name = (
badge.given_name ?? ''
).toLowerCase();
@@ -376,7 +385,7 @@ async function handle_search_refresh(params: any) {
<Comp_badge_search event_id={$events_slct?.event_id ?? ''} log_lvl={1}
></Comp_badge_search>
{#if $ae_loc.edit_mode && ($lq__event_obj?.mod_badges_json?.enable_add_badge_btn ?? true)}
{#if $ae_loc.edit_mode && (badges_loc.current.enable_add_badge_btn ?? true)}
<div class="flex justify-end px-4">
<button
type="button"

View File

@@ -26,6 +26,11 @@ import { liveQuery } from 'dexie';
import { ae_loc } from '$lib/stores/ae_stores';
import { db_events } from '$lib/ae_events/db_events';
import { events_loc } from '$lib/stores/ae_events_stores';
import { events_func } from '$lib/ae_events/ae_events_functions';
import {
default_authenticated_can_edit,
default_trusted_can_edit
} from '$lib/stores/ae_events_stores__badges_defaults';
import { page } from '$app/state';
import {
ArrowLeft,
@@ -57,50 +62,28 @@ $effect(() => {
}
});
// TODO: Load event.mod_badges_json.edit_permissions for per-event field config.
// Hardcoded defaults for now — revisit after basic flow is working.
const default_authenticated_fields = [
'pronouns_override',
'full_name_override',
'professional_title_override',
'affiliations_override',
'phone_override',
'location_override',
'allow_tracking', // Exhibitor Leads opt-in
'agree_to_tc' // Terms & Conditions
];
const default_trusted_fields = [
'pronouns_override',
'full_name_override',
'professional_title_override',
'affiliations_override',
'email_override',
'phone_override',
'location_override',
'badge_type_code_override',
'registration_type_code_override',
'other_1_code',
'other_2_code',
'other_3_code',
'other_4_code',
'other_5_code',
'other_6_code',
'other_7_code',
'other_8_code',
'ticket_1_code',
'ticket_2_code',
'ticket_3_code',
'ticket_4_code',
'ticket_5_code',
'ticket_6_code',
'ticket_7_code',
'ticket_8_code',
'allow_tracking',
'agree_to_tc',
'hide',
'priority',
'notes'
];
// LiveQuery for the event object — needed to read mod_badges_json.edit_permissions.
let lq__event_obj = $derived(
liveQuery(async () => {
if (!event_id) return null;
return await db_events.event.get(event_id);
})
);
// Mirror server-side badges config into the local persisted store when the
// event object is available. This ensures pages that read badges_loc get the
// authoritative event flags even when the review page is loaded directly.
$effect(() => {
const remote_cfg = $lq__event_obj?.mod_badges_json;
if (remote_cfg) {
untrack(() => {
events_func.sync_config__event_badges({
badges_cfg_remote: remote_cfg,
log_lvl: log_lvl
});
});
}
});
// *** Passcode logic
let url_passcode = $derived(page.url?.searchParams?.get('passcode') ?? '');
@@ -192,13 +175,24 @@ function send_review_email() {
);
}
// *** Resolve editable field list based on access level
// Uses $derived.by() to return the array directly (not a function).
// TODO: Read from event.mod_badges_json.edit_permissions for per-event config.
// *** Resolve editable field list based on access level.
// Reads from event.mod_badges_json.edit_permissions when available;
// falls back to module-level defaults from ae_events_stores__badges_defaults.
let can_edit_fields: string[] = $derived.by(() => {
if (is_administrator) return ['*'];
if (is_trusted) return default_trusted_fields;
if (has_attendee_access) return default_authenticated_fields;
const edit_permissions = $lq__event_obj?.mod_badges_json?.edit_permissions;
if (is_trusted) {
const cfg = edit_permissions?.trusted?.can_edit;
if (cfg === '*') return ['*'];
if (Array.isArray(cfg) && cfg.length > 0) return cfg;
return default_trusted_can_edit;
}
if (has_attendee_access) {
const cfg = edit_permissions?.authenticated?.can_edit;
if (cfg === '*') return ['*'];
if (Array.isArray(cfg) && cfg.length > 0) return cfg;
return default_authenticated_can_edit;
}
return [];
});
</script>

View File

@@ -144,7 +144,7 @@ function handle_qr_scan_result(event: {
<input
type="search"
placeholder={$lq__event_obj?.mod_badges_json?.badge_id_only_search ? 'Badge ID' : 'name, email'}
placeholder="name, email"
id="badge_fulltext_search_qry_str"
bind:value={badges_loc.current.fulltext_search_qry_str}
autocomplete="off"
@@ -201,7 +201,7 @@ function handle_qr_scan_result(event: {
<div
class="flex flex-row flex-wrap items-center justify-center gap-2 opacity-70 transition-all hover:opacity-100">
{#if $events_sess.badges.show_form__search}
{#if $lq__event_obj?.mod_badges_json?.enable_search_qr ?? true}
{#if badges_loc.current.enable_search_qr ?? true}
<button
type="button"
onclick={() => {

View File

@@ -98,7 +98,6 @@ const all_staff_field_options = [
// Draft state — initialized from the live event config
// ---------------------------------------------------------------------------
const cfg_defaults: BadgesRemoteCfg = {
badge_id_only_search: false,
enable_mass_print: false,
enable_add_badge_btn: false,
enable_upload_badge_li_btn: false,
@@ -309,7 +308,6 @@ function toggle(key: string) {
{#if sections.ui}
<div class="border-surface-200-800 grid grid-cols-2 gap-3 border-t px-4 py-3">
{#each [
{ field: 'badge_id_only_search' as const, label: 'Badge ID Only Search' },
{ field: 'enable_mass_print' as const, label: 'Enable Mass Print' },
{ field: 'enable_add_badge_btn' as const, label: 'Enable Add Badge Button' },
{ field: 'enable_upload_badge_li_btn' as const, label: 'Enable Upload Badge List Button' },

View File

@@ -14,6 +14,7 @@ import { db_events, type Event } from '$lib/ae_events/db_events';
import { onMount } from 'svelte';
import { events_func } from '$lib/ae_events/ae_events_functions';
import { ae_loc, ae_api } from '$lib/stores/ae_stores';
import { badges_loc } from '$lib/stores/ae_events_stores__badges.svelte';
import AE_Comp_Editor_CodeMirror from '$lib/elements/element_editor_codemirror.svelte';
import Ae_comp_event_settings_form from './ae_comp__event_settings_form.svelte';
import Ae_comp_event_settings_basic_form from './ae_comp__event_settings_basic_form.svelte';
@@ -79,6 +80,13 @@ onMount(() => {
null,
4
);
// Mirror server-side badges config into local persisted store
if (event_obj?.mod_badges_json) {
events_func.sync_config__event_badges({
badges_cfg_remote: event_obj.mod_badges_json,
log_lvl: 0
});
}
}
});
@@ -122,11 +130,11 @@ async function handle_save(field_name: string, data: any) {
<summary class="summary text-error-500 font-bold"
>Admin Tools</summary>
<div class="space-y-4 p-4">
{#if (event_obj?.mod_badges_json?.enable_add_badge_btn ?? true) || (event_obj?.mod_badges_json?.enable_upload_badge_li_btn ?? true)}
{#if (badges_loc.current.enable_add_badge_btn ?? true) || (badges_loc.current.enable_upload_badge_li_btn ?? true)}
<div class="card rounded-md border p-4 text-center">
<h4 class="h4">Badge Operations</h4>
<div class="mt-2 flex flex-wrap justify-center gap-2">
{#if event_obj?.mod_badges_json?.enable_add_badge_btn ?? true}
{#if badges_loc.current.enable_add_badge_btn ?? true}
<button
type="button"
class="btn btn-primary"
@@ -135,7 +143,7 @@ async function handle_save(field_name: string, data: any) {
<Plus size="1em" aria-hidden="true" /> Add New Badge
</button>
{/if}
{#if event_obj?.mod_badges_json?.enable_upload_badge_li_btn ?? true}
{#if badges_loc.current.enable_upload_badge_li_btn ?? true}
<button
type="button"
class="btn btn-primary ml-2"
@@ -149,7 +157,7 @@ async function handle_save(field_name: string, data: any) {
</div>
{/if}
{#if event_obj?.mod_badges_json?.enable_mass_print ?? true}
{#if badges_loc.current.enable_mass_print ?? true}
<div class="card rounded-md border p-4 text-center">
<h4 class="h4">Mass Print Options</h4>
<div class="mt-2 flex flex-wrap justify-center gap-2">

View File

@@ -106,15 +106,6 @@ function save() {
<div class="space-y-4">
{#if mod_badges_json}
<div class="grid grid-cols-2 gap-4">
<div>
<label class="label">
<input
type="checkbox"
class="checkbox"
bind:checked={mod_badges_json.badge_id_only_search} />
<span>Badge ID Only Search</span>
</label>
</div>
<div>
<label class="label">
<input