Could not sleep. Working on the search for badges.

This commit is contained in:
Scott Idem
2025-10-07 03:25:02 -04:00
parent e1a04d5eda
commit b24262b4ab
6 changed files with 193 additions and 77 deletions

View File

@@ -411,13 +411,14 @@ export async function search__event_badge({
params_json['and_qry']['badge_type_code'] = type_code;
}
ae_promises.search__event_badge_obj_li = await api.get_ae_obj_li_for_obj_id_crud({
// ae_promises.search__event_badge_obj_li = await api.get_ae_obj_li_for_obj_id_crud({
ae_promises.search__event_badge_obj_li = await api.get_ae_obj_li_for_obj_id_crud_v2({
api_cfg,
obj_type: 'event_badge',
for_obj_type: 'event',
for_obj_id: event_id,
use_alt_table: false,
use_alt_base: false,
use_alt_tbl: false,
use_alt_mdl: true,
enabled,
hidden,
order_by_li,
@@ -534,6 +535,8 @@ export const properties_to_save = [
'external_id',
'external_person_id',
'default_qry_string',
'alert',
'enable',
@@ -631,6 +634,8 @@ export async function process_ae_obj__event_badge_props({
external_id: obj.external_id,
external_person_id: obj.external_person_id,
default_qry_string: obj.default_qry_string,
alert: obj.alert,
enable: obj.enable,
@@ -642,8 +647,8 @@ export async function process_ae_obj__event_badge_props({
created_on: obj.created_on,
updated_on: obj.updated_on,
tmp_sort_1: obj.tmp_sort_1,
tmp_sort_2: obj.tmp_sort_2,
tmp_sort_1: `${obj.group}_${obj.priority}_${obj.sort}_${obj.updated_on ?? obj.created_on}`,
tmp_sort_2: `${obj.print_count}_${obj.priority}_${obj.sort}_${obj.given_name}_${obj.family_name}_${obj.updated_on}_${obj.created_on}`,
person_external_id: obj.person_external_id,
person_external_sys_id: obj.person_external_sys_id,

View File

@@ -157,6 +157,8 @@ export interface Badge {
// data_json?: null|string;
default_qry_string?: null|string;
alert?: null|boolean;
enable: null|boolean;
@@ -739,7 +741,7 @@ export class MySubClassedDexie extends Dexie {
constructor() {
super('ae_events_db');
this.version(5).stores({
this.version(6).stores({
event: `
id, event_id, event_id_random,
code,
@@ -760,6 +762,7 @@ export class MySubClassedDexie extends Dexie {
affiliations, affiliations_override,
badge_type, badge_type_code, badge_type_code_override, badge_type_override,
external_event_id, external_id, external_person_id,
default_qry_string,
alert,
tmp_sort_1, tmp_sort_2,
enable, hide, priority, sort, group, notes, created_on, updated_on`,

View File

@@ -90,7 +90,11 @@ let events_local_data_struct: key_val = {
// 'theme_name': 'wintry',
'fulltext_search_qry_str': null,
'search_badge_type_code': null,
'status_qry__search': null,
'use_id_li': true,
'search_status': null,
'search_complete': false,
'classes__form': 'border border-surface-200 p-4 space-y-4 rounded-container',
},
@@ -346,7 +350,11 @@ let events_session_data_struct: key_val = {
// Badge Printing
'badges': {
'fulltext_search_qry_str': null,
'search_badge_type_code': null,
'status_qry__search': null,
'use_id_li': true,
'search_status': null,
'search_complete': true,
show_form__search: true,
show_form__search_results: true,

View File

@@ -104,7 +104,12 @@ let event_badge_id_li: Array<string> = $state([]);
<!-- event_badge_obj_li={$lq__event_badge_obj_li} -->
<Comp_badge_search
event_id={$events_slct?.event_id ?? ''}
bind:use_id_li={$events_sess.badges.use_id_li}
bind:event_badge_id_li={event_badge_id_li}
bind:search_status={$events_sess.badges.search_status}
bind:search_complete={$events_sess.badges.search_complete}
bind:qry_str={$events_loc.badges.fulltext_search_qry_str}
bind:qry_type_code={$events_loc.badges.search_badge_type_code}
log_lvl={1}
>
</Comp_badge_search>
@@ -117,14 +122,27 @@ let event_badge_id_li: Array<string> = $state([]);
{/await} -->
{#if $events_sess?.badges?.search_status != 'loading' && $events_sess?.badges?.search_status != 'processing'}
<Comp_badge_obj_li
bind:use_id_li={$events_sess.badges.use_id_li}
event_badge_id_li={event_badge_id_li}
qry_str={$events_loc.badges.fulltext_search_qry_str}
qry_type_code={$events_loc.badges.search_badge_type_code}
log_lvl={1}
>
</Comp_badge_obj_li>
{:else}
<p class="p-4 italic text-sm text-surface-400">Loading badges...</p>
{/if}
{#if event_badge_id_li && event_badge_id_li?.length > 0}
<!-- {#if event_badge_id_li && event_badge_id_li?.length > 0}
<Comp_badge_obj_li
event_badge_id_li={event_badge_id_li}
qry_str={$events_loc.badges.fulltext_search_qry_str}
qry_type_code={$events_loc.badges.search_badge_type_code}
log_lvl={1}
>
</Comp_badge_obj_li>
{:else}
<p class="p-4 italic text-sm text-surface-400">No badges found for this event.</p>
{/if}
{/if} -->

View File

@@ -3,7 +3,11 @@ interface Props {
// Exports
container_class_li?: string|Array<string>;
// export let display_mode: string = 'default'; // 'default', 'compact', 'minimal', 'launcher'
use_id_li?: boolean;
event_badge_id_li?: Array<string>;
qry_idb?: boolean;
qry_str?: string;
qry_type_code?: string;
// event_badge_obj_li?: Array<any>;
link_to_type?: string;
link_to_id?: string;
@@ -17,7 +21,11 @@ interface Props {
let {
container_class_li = [],
use_id_li = $bindable(true),
event_badge_id_li = $bindable([]),
qry_idb = false,
qry_str = '',
qry_type_code = '',
// event_badge_obj_li = $bindable(),
link_to_type,
link_to_id,
@@ -57,21 +65,54 @@ if (log_lvl) {
// let event_badge_id_li: Array<string> = $state([]);
let dq__where_type_id_val: string = `${link_to_type}_id_random`;
let dq__where_eq_id_val: string = link_to_id ?? '';
// *** Functions and Logic
let lq__event_badge_obj_li = $derived(liveQuery(async () => {
let results: any;
log_lvl = 2;
log_lvl = 1;
if (event_badge_id_li?.length) {
if (use_id_li && event_badge_id_li?.length) {
if (log_lvl) {
console.log(`LQ - Using event_badge_id_li to get event badges.`, event_badge_id_li);
}
results = await db_events.badge
.bulkGet(event_badge_id_li);
} else if (qry_str && qry_str?.length) {
if (log_lvl) {
console.log(`LQ - Using qry_str to get event badges. qry_str=${qry_str}`);
}
// let ft_query = ae_util.sanitize_fulltext_search(qry_str);
// let ft_query = qry_str;
if (log_lvl) {
console.log(`Fulltext search query: ${qry_str}`);
}
if (qry_type_code && qry_type_code !== 'all') {
if (log_lvl) {
console.log(`Also filtering by badge type code: ${qry_type_code}`);
}
results = await db_events.badge
.where('default_qry_string')
.equalsIgnoreCase(qry_str)
// .equals(ft_query)
// .and((badge) => badge.badge_type_code === qry_type_code && badge.event_id === $events_slct.event_id)
.sortBy('tmp_sort_2');
} else {
results = await db_events.badge
.where('full_name')
.startsWithIgnoreCase(qry_str)
// .where('default_qry_string')
// .equalsIgnoreCase(qry_str)
// .equals(ft_query)
// .and((badge) => badge.event_id === $events_slct.event_id)
.sortBy('tmp_sort_2');
}
// event_badge_id_li = results.map((badge) => badge.event_badge_id);
// } else if (event_badge_obj_li?.length) {
// if (log_lvl) {
@@ -90,6 +131,9 @@ let lq__event_badge_obj_li = $derived(liveQuery(async () => {
// .bulkGet(event_badge_id_li);
} else if (link_to_type && link_to_id) {
let dq__where_type_id_val: string = `${link_to_type}_id_random`;
let dq__where_eq_id_val: string = link_to_id ?? '';
if (log_lvl) {
console.log(`LQ - Trying where: ${dq__where_type_id_val}; equals: ${dq__where_eq_id_val}`);
}
@@ -97,7 +141,7 @@ let lq__event_badge_obj_li = $derived(liveQuery(async () => {
results = await db_events.badge
.where(dq__where_type_id_val)
.equals(dq__where_eq_id_val)
.sortBy('name');
.sortBy('tmp_sort_2');
// event_badge_id_li = results.map((badge) => badge.event_badge_id);
@@ -112,11 +156,17 @@ let lq__event_badge_obj_li = $derived(liveQuery(async () => {
if ($events_slct.event_badge_obj_li && JSON.stringify($events_slct.event_badge_obj_li) !== JSON.stringify(results)) {
$events_slct.event_badge_obj_li = [...results];
if (log_lvl) {
console.log(`Session slct li stored version has changed for ID = ${$events_slct.journal_id}`, $events_slct.event_badge_obj_li);
console.log(`Session slct li stored version has changed for ID = ${$events_slct.event_id}`, $events_slct.event_badge_obj_li);
}
} else if (!$events_slct?.event_badge_obj_li) {
$events_slct.event_badge_obj_li = [...results];
if (log_lvl) {
console.log(`Session slct li stored version was not set for ID = ${$events_slct.event_id}`, $events_slct.event_badge_obj_li);
}
} else {
if (log_lvl > 1) {
console.log(`Session slct li stored version has not changed for ID = ${$events_slct.journal_id}`);
console.log(`Session slct li stored version has not changed for ID = ${$events_slct.event_id}`, $events_slct.event_badge_obj_li);
}
}
@@ -145,7 +195,8 @@ let lq__event_badge_obj_li = $derived(liveQuery(async () => {
<section class="px-1 flex flex-col gap-1 items-center justify-center space-y-1">
{#if event_badge_id_li?.length && $lq__event_badge_obj_li?.length}
<!-- event_badge_id_li?.length && -->
{#if $lq__event_badge_obj_li?.length}
<header class="w-full flex flex-row gap-1 items-center justify-start">
<h2 class="text-base">Results:</h2>
<div class="text-3xl font-bold preset-filled-success-100-900 px-4 rounded-lg">

View File

@@ -1,19 +1,25 @@
<script lang="ts">
interface Props {
event_id: string;
use_id_li?: boolean;
event_badge_id_li?: Array<string>;
// event_badge_obj_li?: Array<any>;
search_status?: string;
search_complete?: boolean;
qry_str?: string;
qry_type_code?: string;
log_lvl?: number;
}
let {
event_id,
use_id_li = $bindable(true),
event_badge_id_li = $bindable([]),
// event_badge_obj_li = $bindable(),
search_status = $bindable('idle'),
search_complete = $bindable(true),
qry_str = $bindable(''),
qry_type_code = $bindable(''),
log_lvl = 0,
}: Props = $props();
@@ -73,6 +79,9 @@ if (ae_triggers.event_badge_qry) {
search_complete = false;
event_badge_id_li = [];
// qry_str = $events_loc.badges.fulltext_search_qry_str ?? '';
// qry_type_code = $events_sess.badges.search_badge_type_code ?? '';
if (log_lvl) {
console.log(`Triggered: event_badge_qry: ft search qry str:=${$events_loc.badges.fulltext_search_qry_str}`);
}
@@ -341,8 +350,8 @@ async function handle_search__event_badge(
<section
class="
m-2 p-2 md:px-12
flex flex-row gap-1 items-center justify-center
min-w-sm w-full
flex flex-col sm:flex-row gap-1 items-center justify-center
min-w-sm w-full max-w-7xl
preset-tonal-success
"
>
@@ -368,6 +377,67 @@ async function handle_search__event_badge(
>
<span class="flex flex-col md:flex-row items-center justify-center gap-1">
{#if $ae_loc.trusted_access && badge_type_code_li}
<select
bind:value={qry_type_code}
onchange={() => {
// ae_triggers.event_badge_qry = 'load__event_badge_obj_li';
ae_triggers.event_badge_qry = true;
}}
class="select text-xs px-1 max-w-fit"
>
<option value="">-- All Badge Types --</option>
{#each badge_type_code_li as badge_type_code}
<option value={badge_type_code.code}>{badge_type_code.name}</option>
{/each}
</select>
{/if}
<!--
class="input text-xl hover:text-3xl font-bold font-mono w-96"
hover:w-2/5
-->
<input
type="search"
placeholder="name, email, affiliations"
id="badge_fulltext_search_qry_str"
name="fulltext_search_qry_str"
bind:value={qry_str}
autofocus
suggest="off"
data-lpignore="true"
class="input text-1xl hover:font-bold font-mono w-fit sm:w-96 transition-all"
onkeyup={() => {
if ($events_loc.badges.fulltext_search_qry_str.length >= 7) {
ae_triggers.event_badge_qry = true;
}
}}
title="Enter at least 3 characters to search. Search by name, email, affiliations, etc."
/>
</span>
<span class="flex flex-row flex-wrap items-center justify-center gap-1">
<button
type="submit"
class="btn btn-lg preset-tonal-success border border-success-500 hover:preset-tonal-success text-2xl font-bold w-48 transition-all"
onclick={() => {
ae_triggers.event_badge_qry = true;
}}
>
{#if !search_complete}
<span class="fas fa-spinner fa-spin mx-1"></span>
{:else }
<!-- Nothing -->
<span class="fas fa-search mx-1"></span>
{/if}
Search
</button>
<!-- Clear search text button -->
<button
type="button"
@@ -379,9 +449,7 @@ async function handle_search__event_badge(
ae_triggers.event_badge_qry = true;
}}
class="
btn btn-sm
w-48
preset-tonal-tertiary
btn btn-sm text-xs
preset-outlined-tertiary-100-900
hover:preset-filled-tertiary-100-900
transition-all
@@ -421,63 +489,8 @@ async function handle_search__event_badge(
</span>
{/await}
</button>
<span class="">
{#if $ae_loc.trusted_access && badge_type_code_li}
<select
bind:value={$events_sess.badges.search_badge_type_code}
onchange={() => {
// ae_triggers.event_badge_qry = 'load__event_badge_obj_li';
ae_triggers.event_badge_qry = true;
}}
class="select text-xs px-1 max-w-fit"
>
<option value="">-- All Badge Types --</option>
{#each badge_type_code_li as badge_type_code}
<option value={badge_type_code.code}>{badge_type_code.name}</option>
{/each}
</select>
{/if}
<!--
class="input text-xl hover:text-3xl font-bold font-mono w-96"
hover:w-2/5
-->
<input
type="search"
placeholder="name, email, affiliations"
id="badge_fulltext_search_qry_str"
name="fulltext_search_qry_str"
bind:value={$events_loc.badges.fulltext_search_qry_str}
class="input text-1xl hover:text-3xl font-bold font-mono w-96 transition-all"
onkeyup={() => {
if ($events_loc.badges.fulltext_search_qry_str.length >= 7) {
ae_triggers.event_badge_qry = true;
}
}}
autofocus
suggest="off"
data-lpignore="true"
/>
</span>
<button
type="submit"
class="btn btn-lg preset-tonal-success border border-success-500 hover:preset-tonal-success text-2xl font-bold w-48 transition-all"
onclick={() => {
ae_triggers.event_badge_qry = true;
}}
>
{#if !search_complete}
<span class="fas fa-spinner fa-spin"></span>
{:else }
<!-- Nothing -->
{/if}
<span class="fas fa-search mx-1"></span>
Search
</button>
</form>
<!-- **BEGIN** Scan Form -->
@@ -516,6 +529,24 @@ async function handle_search__event_badge(
Search
</button>
{/if}
<!-- Show toggle for using the id list or not: use_id_li -->
<button
type="button"
onclick={() => {
use_id_li = !use_id_li;
console.log(`Toggled use_id_li=${use_id_li}`);
}}
class="btn btn-sm preset-tonal-secondary border border-secondary-500 transition-all"
title="Toggle using the ID list or not."
>
{#if use_id_li}
<span class="fas fa-toggle-on text-green-600"></span>
{:else}
<span class="fas fa-toggle-off text-red-600"></span>
{/if}
Use ID List
</button>
</div>
</section>