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%;
min-width: 50%;
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 = {};
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) {
params_json['ft_qry'] = {
'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;
}
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';
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_badge_template_id: null,
slct__sponsorship_cfg_id: null,
header_image_path: null,
},
'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';
export let expire_minutes: number = 10;
export let mount_reload_sec: number = 0;
export let ds_code: string;
export let ds_name: null|string = null;
@@ -133,12 +134,14 @@ onMount(() => {
console.log('Element: Data Store element_data_store.svelte');
// console.log('ae_ MOUNTED Browser detected.');
// Wait for random number of milliseconds to avoid all data stores being reloaded at the same time.
let random_ms = Math.floor(Math.random() * 15000);
console.log(`ae_e_data_store: Random number of milliseconds: ${random_ms}`);
setTimeout(() => {
trigger = 'load__ds__code';
}, random_ms);
if (mount_reload_sec) {
// Wait for random number of milliseconds to avoid all data stores being reloaded at the same time.
let random_ms = Math.floor(Math.random() * mount_reload_sec * 1000);
console.log(`ae_e_data_store: Random number of milliseconds: ${random_ms}`);
setTimeout(() => {
trigger = 'load__ds__code';
}, random_ms);
}
});
// 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_domain_id'] = site_domain_results.site_domain_id_random;
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_google_tracking_id'] = site_domain_results.google_tracking_id;
ae_loc_init['site_cfg_json'] = site_domain_results.cfg_json;

View File

@@ -117,6 +117,7 @@ onMount(() => {
<section
class="submenu flex flex-row justify-center"
class:hidden={$ae_loc.iframe}
>
<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 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.
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_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_obj_get_promise;
if ($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';
}
// Reset this to an empty array.
$events_slct.badge_obj_li = [];
// 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"}];
@@ -131,13 +140,14 @@ async function handle_load_ae_obj_id__event_badge({event_badge_id, try_cache=fal
// Updated 2024-03-06 late
$: 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;
if (!$events_sess.badges.fulltext_search_qry_str) {
$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_slct.badge_obj_li = [];
// $events_sess.badges.fulltext_search_qry_str = '';
} else {
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}"`);
let params = {
'qry__enabled': 'enabled',
'qry__hidden': 'not_hidden',
'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') {
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';
});
}
} // 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"
>
{#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.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}
<header>
<h1 class="h2">Badge Review - Search</h1>
<h1 class="h2 text-center">Badge Review and Print</h1>
</header>
{/if}
@@ -311,10 +343,11 @@ function handle_qr_camera(event) {
{#if $events_sess.badges.show_form__search}
<form
class="form flex-grow flex flex-row flex-wrap gap-1 justify-center items-center w-full"
on:submit|preventDefault={() => {
$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}
<div class="search_by_badge_type_code">
@@ -352,12 +385,15 @@ function handle_qr_camera(event) {
id="badge_fulltext_search_qry_str"
name="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={() => {
if ($events_sess.badges.fulltext_search_qry_str.length >= 3) {
$events_trigger = 'load__event_badge_obj_li';
}
}}
autofocus
suggest="off"
data-lpignore="true"
>
@@ -508,7 +544,10 @@ function handle_qr_camera(event) {
<tbody>
{#each $events_slct.badge_obj_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="">
<button
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>
<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}
<!-- Show a green checkmark -->
<span class="fas fa-check text-green-500"></span>
@@ -583,7 +626,95 @@ function handle_qr_camera(event) {
</div>
</td>
<td class="">
<div class="flex flex-row items-center justify-between">
<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>
</tr>
{/each}
@@ -591,9 +722,15 @@ function handle_qr_camera(event) {
</table>
</section>
{:else}
<div class="alert alert-info">
No badges found.
<div class="text-xl variant-filled-success font-bold p-2">
Type your name, email, or affiliations and results will start to appear automatically.
</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}

View File

@@ -174,7 +174,7 @@ let refresh_leads_list = setInterval(function () {
<!-- flex flex-row justify-center items-center m-auto -->
<tr
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">
<!-- <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">
.test_dim {
/* .test_dim {
opacity: 0.5;
}
.test_dim:hover {
opacity: 1;
}
} */
/* Use the div.ae_quick_modal_container to block background clicks when using the section.ae_quick_popover. */
div.ae_quick_modal_container {