Getting the badge search really ready

This commit is contained in:
2024-04-08 19:12:44 -04:00
parent 9eee2a928b
commit ef583e1328
8 changed files with 181 additions and 25 deletions

View File

@@ -297,4 +297,12 @@ section.ae_quick_popover_small {
max-height: 95%; max-height: 95%;
min-width: 50%; min-width: 50%;
max-width: 95%; max-width: 95%;
}
.fade_50 {
opacity: 0.5;
}
.fade_50:hover {
opacity: 1;
} }

View File

@@ -191,6 +191,11 @@ async function handle_search__event_badge(
let params_json: key_val = {}; let params_json: key_val = {};
if (!fulltext_search_qry_str && !like_search_qry_str) {
console.log('No search string provided!!!');
return false; // Returning false instead of [] because no search was performed.
}
if (fulltext_search_qry_str && fulltext_search_qry_str.length > 2) { if (fulltext_search_qry_str && fulltext_search_qry_str.length > 2) {
params_json['ft_qry'] = { params_json['ft_qry'] = {
'default_qry_str': fulltext_search_qry_str, 'default_qry_str': fulltext_search_qry_str,
@@ -227,7 +232,7 @@ async function handle_search__event_badge(
params_json['and_qry']['badge_type_code'] = type_code; params_json['and_qry']['badge_type_code'] = type_code;
} }
let order_by_li = {'priority': 'DESC', 'sort': 'DESC', 'family_name': 'ASC', 'given_name': 'ASC', 'updated_on': 'DESC', 'created_on': 'DESC'}; let order_by_li = {'print_count': 'ASC', 'priority': 'DESC', 'sort': 'DESC', 'given_name': 'ASC', 'family_name': 'ASC', 'updated_on': 'DESC', 'created_on': 'DESC'};
// $events_sess.badges.status_qry__search = 'loading'; // $events_sess.badges.status_qry__search = 'loading';
ae_promises.search__event_badge = await api.get_ae_obj_li_for_obj_id_crud({ ae_promises.search__event_badge = await api.get_ae_obj_li_for_obj_id_crud({

View File

@@ -50,6 +50,7 @@ export let ae_app_local_data_struct: key_val = {
slct__event_id: null, slct__event_id: null,
slct__event_badge_template_id: null, slct__event_badge_template_id: null,
slct__sponsorship_cfg_id: null, slct__sponsorship_cfg_id: null,
header_image_path: null,
}, },
'page_access_code_li': {'administrator': '11500', 'trusted': '19111', 'authenticated': '00000'}, 'page_access_code_li': {'administrator': '11500', 'trusted': '19111', 'authenticated': '00000'},

View File

@@ -9,6 +9,7 @@ import { ae_util } from '$lib/ae_utils';
import type { key_val } from '$lib/ae_stores'; import type { key_val } from '$lib/ae_stores';
export let expire_minutes: number = 10; export let expire_minutes: number = 10;
export let mount_reload_sec: number = 0;
export let ds_code: string; export let ds_code: string;
export let ds_name: null|string = null; export let ds_name: null|string = null;
@@ -133,12 +134,14 @@ onMount(() => {
console.log('Element: Data Store element_data_store.svelte'); console.log('Element: Data Store element_data_store.svelte');
// console.log('ae_ MOUNTED Browser detected.'); // console.log('ae_ MOUNTED Browser detected.');
// Wait for random number of milliseconds to avoid all data stores being reloaded at the same time. if (mount_reload_sec) {
let random_ms = Math.floor(Math.random() * 15000); // Wait for random number of milliseconds to avoid all data stores being reloaded at the same time.
console.log(`ae_e_data_store: Random number of milliseconds: ${random_ms}`); let random_ms = Math.floor(Math.random() * mount_reload_sec * 1000);
setTimeout(() => { console.log(`ae_e_data_store: Random number of milliseconds: ${random_ms}`);
trigger = 'load__ds__code'; setTimeout(() => {
}, random_ms); trigger = 'load__ds__code';
}, random_ms);
}
}); });
// let ds_code_li = {}; //: key_val; // = ae_loc_tmp.ds; // let ds_code_li = {}; //: key_val; // = ae_loc_tmp.ds;

View File

@@ -150,6 +150,7 @@ export async function load({ fetch, params, parent, route, url }) { // params, r
ae_loc_init['site_id'] = site_domain_results.site_id_random; ae_loc_init['site_id'] = site_domain_results.site_id_random;
ae_loc_init['site_domain_id'] = site_domain_results.site_domain_id_random; ae_loc_init['site_domain_id'] = site_domain_results.site_domain_id_random;
ae_loc_init['site_enable'] = site_domain_results.enable; ae_loc_init['site_enable'] = site_domain_results.enable;
ae_loc_init['site_header_image_path'] = site_domain_results.header_image_path;
ae_loc_init['site_style_href'] = site_domain_results.style_href; ae_loc_init['site_style_href'] = site_domain_results.style_href;
ae_loc_init['site_google_tracking_id'] = site_domain_results.google_tracking_id; ae_loc_init['site_google_tracking_id'] = site_domain_results.google_tracking_id;
ae_loc_init['site_cfg_json'] = site_domain_results.cfg_json; ae_loc_init['site_cfg_json'] = site_domain_results.cfg_json;

View File

@@ -117,6 +117,7 @@ onMount(() => {
<section <section
class="submenu flex flex-row justify-center" class="submenu flex flex-row justify-center"
class:hidden={$ae_loc.iframe}
> >
<span class="btn-group variant-soft-secondary px-4 py-2"> <span class="btn-group variant-soft-secondary px-4 py-2">

View File

@@ -15,7 +15,9 @@ import { ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_st
import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_events_stores'; import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_events_stores';
import Element_qr_scanner from '$lib/element_qr_scanner.svelte'; import Element_qr_scanner from '$lib/element_qr_scanner.svelte';
import { goto } from '$app/navigation'; import Element_ae_crud from '$lib/element_ae_crud.svelte';
import { goto } from '$app/navigation';
// The lq__ prefix is used to indicate that this is a liveQuery object and it should use the $ prefix when referencing the object. // The lq__ prefix is used to indicate that this is a liveQuery object and it should use the $ prefix when referencing the object.
let lq__event_badge_li = liveQuery( let lq__event_badge_li = liveQuery(
@@ -37,15 +39,22 @@ $ae_loc.site_domain = data.url.origin;
$events_loc.show_edit__event_badge_obj = false; $events_loc.show_edit__event_badge_obj = false;
$events_loc.show_view__event_badge_obj = false; $events_loc.show_view__event_badge_obj = false;
// These will likely be used for patch/update triggers. Maybe delete?
let ae_triggers: key_val = {};
let ae_event_badge_get_promise: Promise<any>; let ae_event_badge_get_promise: Promise<any>;
let ae_event_obj_get_promise; let ae_event_obj_get_promise;
if ($events_slct.event_id) { if ($events_slct.event_id) {
console.log('Selected Event ID:', $events_slct.event_id); console.log('Selected Event ID:', $events_slct.event_id);
$events_trigger = 'load__event_badge_obj_li'; // $events_trigger = 'load__event_badge_obj_li';
// $events_trigger = 'load__event_obj'; // $events_trigger = 'load__event_obj';
} }
// Reset this to an empty array.
$events_slct.badge_obj_li = [];
// ISHLT 2024 badge type codes // ISHLT 2024 badge type codes
let badge_type_code_li = [{"code":"current_member","name":"Member"},{"code":"inactive_member","name":"Non-Member"},{"code":"current_member_trainee","name":"Trainee Member"},{"code":"inactive_member_trainee","name":"Trainee Non-Member"},{"code":"ex_all","name":"Exhibitor All Access"},{"code":"ex_booth","name":"Exhibitor Booth Staff"},{"code":"hftx","name":"HFTX Master Academy"},{"code":"mcs","name":"MCS Master Academy"},{"code":"pediatric","name":"Pediatric"},{"code":"guest","name":"Guest"},{"code":"staff","name":"Staff"},{"code":"volunteer","name":"Volunteer"},{"code":"test","name":"Test"}]; let badge_type_code_li = [{"code":"current_member","name":"Member"},{"code":"inactive_member","name":"Non-Member"},{"code":"current_member_trainee","name":"Trainee Member"},{"code":"inactive_member_trainee","name":"Trainee Non-Member"},{"code":"ex_all","name":"Exhibitor All Access"},{"code":"ex_booth","name":"Exhibitor Booth Staff"},{"code":"hftx","name":"HFTX Master Academy"},{"code":"mcs","name":"MCS Master Academy"},{"code":"pediatric","name":"Pediatric"},{"code":"guest","name":"Guest"},{"code":"staff","name":"Staff"},{"code":"volunteer","name":"Volunteer"},{"code":"test","name":"Test"}];
@@ -131,13 +140,14 @@ async function handle_load_ae_obj_id__event_badge({event_badge_id, try_cache=fal
// Updated 2024-03-06 late // Updated 2024-03-06 late
$: if ($events_trigger == 'load__event_badge_obj_li' && $events_slct.event_id) { $: if ($events_trigger == 'load__event_badge_obj_li' && $events_slct.event_id) {
console.log(`handle_load_ae_obj_id__event() $events_slct.event_id=${$events_slct.event_id} api_cfg=`, $ae_api); console.log(`load__event_badge_obj_li() $events_slct.event_id=${$events_slct.event_id}`);
$events_trigger = null; $events_trigger = null;
if (!$events_sess.badges.fulltext_search_qry_str) { if (!$events_sess.badges.fulltext_search_qry_str || $events_sess?.badges.fulltext_search_qry_str.length <= 1 ) {
$events_sess.badges.fulltext_search_qry_str = ''; $events_slct.badge_obj_li = [];
} // $events_sess.badges.fulltext_search_qry_str = '';
} else {
let type_code = $events_sess.badges.search_badge_type_code; let type_code = $events_sess.badges.search_badge_type_code;
@@ -157,9 +167,25 @@ $: if ($events_trigger == 'load__event_badge_obj_li' && $events_slct.event_id) {
console.log(`"${search_str}"`); console.log(`"${search_str}"`);
let params = { let params = {
'qry__enabled': 'enabled',
'qry__hidden': 'not_hidden',
'qry__limit': 35, 'qry__limit': 35,
} }
if ($ae_loc.administrator_access) {
params['qry__enabled'] = 'all';
params['qry__hidden'] = 'all';
params['qry__limit'] = 150;
} else if ($ae_loc.trusted_access) {
params['qry__enabled'] = 'enabled';
params['qry__hidden'] = 'all';
params['qry__limit'] = 75;
} else {
params['qry__enabled'] = 'enabled';
params['qry__hidden'] = 'not_hidden';
params['qry__limit'] = 35;
}
if ($events_sess.status_qry__search == 'loading') { if ($events_sess.status_qry__search == 'loading') {
console.log('*** $events_sess.status_qry__search == loading ***'); console.log('*** $events_sess.status_qry__search == loading ***');
@@ -205,6 +231,8 @@ $: if ($events_trigger == 'load__event_badge_obj_li' && $events_slct.event_id) {
$events_sess.status_qry__search = 'done'; $events_sess.status_qry__search = 'done';
}); });
} }
} // end if search string is valid
} }
@@ -299,11 +327,15 @@ function handle_qr_camera(event) {
class="ae_events_badges_review md:container h-full mx-auto" class="ae_events_badges_review md:container h-full mx-auto"
> >
{#if $ae_loc.ds.hub__page__events_badges__create_info_header} <!-- {#if $ae_loc.ds.hub__page__events_badges__create_info_header} -->
{@html $ae_loc.ds.hub__page__events_badges__create_info_header} {#if $ae_loc.iframe}
<span class="flex flex-row items-center justify-center">
<img src={$ae_loc.site_cfg_json.header_image_path} alt="header" class="w-auto max-h-20 m-2" />
<h1 class="h3 text-center m-2">Review &amp; Print<br>Your Badge</h1>
</span>
{:else} {:else}
<header> <header>
<h1 class="h2">Badge Review - Search</h1> <h1 class="h2 text-center">Badge Review and Print</h1>
</header> </header>
{/if} {/if}
@@ -311,10 +343,11 @@ function handle_qr_camera(event) {
{#if $events_sess.badges.show_form__search} {#if $events_sess.badges.show_form__search}
<form <form
class="form flex-grow flex flex-row flex-wrap gap-1 justify-center items-center w-full"
on:submit|preventDefault={() => { on:submit|preventDefault={() => {
$events_trigger = 'load__event_badge_obj_li'; $events_trigger = 'load__event_badge_obj_li';
}} }}
autocomplete="off"
class="form flex-grow flex flex-row flex-wrap gap-1 justify-center items-center w-full"
> >
{#if $ae_loc.trusted_access && badge_type_code_li} {#if $ae_loc.trusted_access && badge_type_code_li}
<div class="search_by_badge_type_code"> <div class="search_by_badge_type_code">
@@ -352,12 +385,15 @@ function handle_qr_camera(event) {
id="badge_fulltext_search_qry_str" id="badge_fulltext_search_qry_str"
name="fulltext_search_qry_str" name="fulltext_search_qry_str"
bind:value={$events_sess.badges.fulltext_search_qry_str} bind:value={$events_sess.badges.fulltext_search_qry_str}
class="input text-1xl hover:text-3xl font-bold font-mono w-96 transition-all" class="input text-1xl hover:text-3xl font-bold font-mono w-96 hover:w-2/5 transition-all"
on:keyup={() => { on:keyup={() => {
if ($events_sess.badges.fulltext_search_qry_str.length >= 3) { if ($events_sess.badges.fulltext_search_qry_str.length >= 3) {
$events_trigger = 'load__event_badge_obj_li'; $events_trigger = 'load__event_badge_obj_li';
} }
}} }}
autofocus
suggest="off"
data-lpignore="true"
> >
@@ -508,7 +544,10 @@ function handle_qr_camera(event) {
<tbody> <tbody>
{#each $events_slct.badge_obj_li as badge_obj} {#each $events_slct.badge_obj_li as badge_obj}
<!-- {#each $lq__event_badge_li as badge_obj} --> <!-- {#each $lq__event_badge_li as badge_obj} -->
<tr class=""> <tr
class:hidden={(badge_obj.print_count >= 1 || badge_obj.hide) && !$ae_loc.trusted_access}
class:fade_50={(badge_obj.print_count >= 1 || badge_obj.hide) && $ae_loc.trusted_access}
>
<td class=""> <td class="">
<button <button
class="btn btn-xl text-xl variant-ghost-secondary hover:variant-glass-secondary w-96 overflow-hidden transition-all" class="btn btn-xl text-xl variant-ghost-secondary hover:variant-glass-secondary w-96 overflow-hidden transition-all"
@@ -526,7 +565,11 @@ function handle_qr_camera(event) {
> >
<span class="flex flex-row justify-between items-center w-full"> <span class="flex flex-row justify-between items-center w-full">
<span> <span>
<span class="fas fa-id-badge mx-1"></span> {#if badge_obj.hide}
<span class="fas fa-eye-slash mx-1"></span>
{:else}
<span class="fas fa-id-badge mx-1"></span>
{/if}
{#if badge_obj.print_count >= 1} {#if badge_obj.print_count >= 1}
<!-- Show a green checkmark --> <!-- Show a green checkmark -->
<span class="fas fa-check text-green-500"></span> <span class="fas fa-check text-green-500"></span>
@@ -583,7 +626,95 @@ function handle_qr_camera(event) {
</div> </div>
</td> </td>
<td class=""> <td class="">
<div class="flex flex-row items-center justify-between">
<span title={badge_obj.registration_type}>{badge_obj.badge_type}</span> <span title={badge_obj.registration_type}>{badge_obj.badge_type}</span>
<div>
<Element_ae_crud
trigger_patch={ae_triggers.print_count}
api_cfg={$ae_api}
object_type={'event_badge'}
object_id={badge_obj.event_badge_id_random}
field_name={'print_count'}
field_type={'text'}
field_value={badge_obj.print_count}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={e => {
console.log(`ae_crud_updated event:`, e.detail);
// events_func.handle_load_ae_obj_id__badge({api_cfg: $ae_api, badge_id: $events_slct.badge_id});
}}
>
<!-- {@html (badge_obj.print_count ? `<span class="fas fa-users m-1"></span> ${badge_obj.print_count}` : '<span class="fas fa-users m-1"></span> 0')} -->
{#if $ae_loc.administrator_access}
<span class="fas fa-print m-1"></span>
<input
type="number" min="0" max="10" step="1"
bind:value={badge_obj.print_count}
class="input text-sm w-16 m-1"
/>
<button
type="button"
on:click={() => {
// badge_obj.print_count = 0;
ae_triggers.print_count = true;
}}
class="btn btn-sm variant-soft-warning"
>
<span class="fas fa-save m-1"></span>
Save
</button>
{/if}
</Element_ae_crud>
<Element_ae_crud
trigger_patch={ae_triggers.hide}
api_cfg={$ae_api}
object_type={'event_badge'}
object_id={badge_obj?.event_badge_id_random}
field_name={'hide'}
field_type={'button'}
field_value={badge_obj.hide}
allow_null={false}
hide_edit_btn={true}
outline_element={false}
show_crud={false}
display_inline={true}
class_li={'m-1'}
on:ae_crud_updated={e => {
console.log(`ae_crud_updated event:`, e.detail);
// events_func.handle_load_ae_obj_id__badge({api_cfg: $ae_api, badge_id: badge_obj.badge_id_random});
}}
>
<!-- {#if $ae_loc.trusted_access}
{(badge_obj?.hide ? 'Hidden' : 'Not Hidden')}
{/if} -->
<button
on:click={() => {
// $events_slct.badge_obj = badge_obj;
badge_obj.hide = !badge_obj?.hide;
ae_triggers.hide = true;
}}
class="btn btn-sm variant-soft-warning"
class:hidden={!$ae_loc.trusted_access}
>
{#if $ae_loc.trusted_access}
{@html (badge_obj?.hide ? '<span class="fas fa-eye m-1"></span> Unhide?' : '<span class="fas fa-eye-slash m-1"></span> Hide?')}
{:else}
<!-- Users see this as the "Archive" option button -->
{@html (badge_obj?.hide ? '<span class="fas fa-archive m-1"></span> Unarchive' : '<span class="fas fa-archive m-1"></span> Archive')}
{/if}
</button>
</Element_ae_crud>
</div>
</div>
</td> </td>
</tr> </tr>
{/each} {/each}
@@ -591,9 +722,15 @@ function handle_qr_camera(event) {
</table> </table>
</section> </section>
{:else} {:else}
<div class="alert alert-info"> <div class="text-xl variant-filled-success font-bold p-2">
No badges found. Type your name, email, or affiliations and results will start to appear automatically.
</div> </div>
{#if $events_sess.badges.fulltext_search_qry_str && $events_sess.badges.fulltext_search_qry_str.length > 5}
<div class="text-xl variant-filled-warning font-bold p-2">
No badges found. Please change your search.
</div>
{/if}
{/if} {/if}

View File

@@ -174,7 +174,7 @@ let refresh_leads_list = setInterval(function () {
<!-- flex flex-row justify-center items-center m-auto --> <!-- flex flex-row justify-center items-center m-auto -->
<tr <tr
class:hidden={event_exhibit_tracking_obj.hide && !$events_loc.leads.show_hidden} class:hidden={event_exhibit_tracking_obj.hide && !$events_loc.leads.show_hidden}
class:test_dim={event_exhibit_tracking_obj.hide} class:fade_50={event_exhibit_tracking_obj.hide}
> >
<td class="star text-center"> <td class="star text-center">
<!-- <span class="star_container flex flex-col justify-center items-center m-auto"> --> <!-- <span class="star_container flex flex-col justify-center items-center m-auto"> -->
@@ -388,12 +388,12 @@ let refresh_leads_list = setInterval(function () {
<style lang="postcss"> <style lang="postcss">
.test_dim { /* .test_dim {
opacity: 0.5; opacity: 0.5;
} }
.test_dim:hover { .test_dim:hover {
opacity: 1; opacity: 1;
} } */
/* Use the div.ae_quick_modal_container to block background clicks when using the section.ae_quick_popover. */ /* Use the div.ae_quick_modal_container to block background clicks when using the section.ae_quick_popover. */
div.ae_quick_modal_container { div.ae_quick_modal_container {