Standardize on Licensed Exhibit Leads User (licensee) terminology
- Renamed all staff-related fields and variables to 'licensee'. - Implemented correct filtering logic for Aether Admins (default All, hide My). - Implemented correct filtering for booth users (default My, show colleagues). - Populated dropdown labels with Full Names from license_li_json. - Removed 'Shared Passcode' from the Lead List filter.
This commit is contained in:
@@ -307,6 +307,7 @@ export async function create_ae_obj__exhibit_tracking({
|
|||||||
exhibit_id,
|
exhibit_id,
|
||||||
event_badge_id,
|
event_badge_id,
|
||||||
external_person_id,
|
external_person_id,
|
||||||
|
group,
|
||||||
try_cache = true,
|
try_cache = true,
|
||||||
log_lvl = 0
|
log_lvl = 0
|
||||||
}: {
|
}: {
|
||||||
@@ -314,6 +315,7 @@ export async function create_ae_obj__exhibit_tracking({
|
|||||||
exhibit_id: string;
|
exhibit_id: string;
|
||||||
event_badge_id: string;
|
event_badge_id: string;
|
||||||
external_person_id: string;
|
external_person_id: string;
|
||||||
|
group?: string;
|
||||||
try_cache?: boolean;
|
try_cache?: boolean;
|
||||||
log_lvl?: number;
|
log_lvl?: number;
|
||||||
}): Promise<ae_EventExhibitTracking | null> {
|
}): Promise<ae_EventExhibitTracking | null> {
|
||||||
@@ -323,7 +325,8 @@ export async function create_ae_obj__exhibit_tracking({
|
|||||||
fields: {
|
fields: {
|
||||||
event_exhibit_id: exhibit_id,
|
event_exhibit_id: exhibit_id,
|
||||||
event_badge_id: event_badge_id,
|
event_badge_id: event_badge_id,
|
||||||
external_person_id
|
external_person_id,
|
||||||
|
group
|
||||||
},
|
},
|
||||||
log_lvl
|
log_lvl
|
||||||
});
|
});
|
||||||
@@ -427,6 +430,8 @@ export async function search__exhibit_tracking({
|
|||||||
event_id,
|
event_id,
|
||||||
event_exhibit_id,
|
event_exhibit_id,
|
||||||
fulltext_search_qry_str = null,
|
fulltext_search_qry_str = null,
|
||||||
|
qry_group = null,
|
||||||
|
qry_external_person_id = null,
|
||||||
enabled = 'enabled',
|
enabled = 'enabled',
|
||||||
hidden = 'all',
|
hidden = 'all',
|
||||||
view = 'default',
|
view = 'default',
|
||||||
@@ -440,6 +445,8 @@ export async function search__exhibit_tracking({
|
|||||||
event_id: string;
|
event_id: string;
|
||||||
event_exhibit_id: string;
|
event_exhibit_id: string;
|
||||||
fulltext_search_qry_str?: string | null;
|
fulltext_search_qry_str?: string | null;
|
||||||
|
qry_group?: string | null;
|
||||||
|
qry_external_person_id?: string | null;
|
||||||
enabled?: 'enabled' | 'all' | 'not_enabled';
|
enabled?: 'enabled' | 'all' | 'not_enabled';
|
||||||
hidden?: 'hidden' | 'all' | 'not_hidden';
|
hidden?: 'hidden' | 'all' | 'not_hidden';
|
||||||
view?: string;
|
view?: string;
|
||||||
@@ -461,6 +468,9 @@ export async function search__exhibit_tracking({
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (qry_group) search_query.and.push({ field: 'group', op: 'eq', value: qry_group });
|
||||||
|
if (qry_external_person_id) search_query.and.push({ field: 'external_person_id', op: 'eq', value: qry_external_person_id });
|
||||||
|
|
||||||
if (enabled === 'enabled') search_query.and.push({ field: 'enable', op: 'eq', value: 1 });
|
if (enabled === 'enabled') search_query.and.push({ field: 'enable', op: 'eq', value: 1 });
|
||||||
else if (enabled === 'not_enabled') search_query.and.push({ field: 'enable', op: 'eq', value: 0 });
|
else if (enabled === 'not_enabled') search_query.and.push({ field: 'enable', op: 'eq', value: 0 });
|
||||||
|
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ const events_local_data_struct: key_val = {
|
|||||||
tracking__qry__remote_first: false,
|
tracking__qry__remote_first: false,
|
||||||
tracking__qry__search_text: '',
|
tracking__qry__search_text: '',
|
||||||
tracking__qry__sort_order: 'created_desc',
|
tracking__qry__sort_order: 'created_desc',
|
||||||
|
tracking__qry__licensee_email: 'all',
|
||||||
|
|
||||||
// The entered_passcode is the exhibit booths shared passcode for staff. This is used to initially access the lead retrieval service.
|
// The entered_passcode is the exhibit booths shared passcode for staff. This is used to initially access the lead retrieval service.
|
||||||
entered_passcode: null,
|
entered_passcode: null,
|
||||||
|
|||||||
@@ -107,14 +107,24 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Standardized Reactive Search Pattern
|
// Standardized Reactive Search Pattern
|
||||||
let search_params = $derived({
|
let search_params = $derived.by(() => {
|
||||||
v: $events_loc.leads.tracking__search_version,
|
let licensee_email = $events_loc.leads.tracking__qry__licensee_email;
|
||||||
str: ($events_loc.leads.tracking__qry__search_text ?? '')
|
|
||||||
.toLowerCase()
|
// Resolve "My Leads" to actual email
|
||||||
.trim(),
|
if (licensee_email === 'my') {
|
||||||
sort: $events_loc.leads.tracking__qry__sort_order,
|
licensee_email = $events_loc.leads.auth_exhibit_kv?.[page.params.exhibit_id ?? '']?.key || 'all';
|
||||||
exhibit_id: page.params.exhibit_id,
|
}
|
||||||
remote_first: $events_loc.leads.tracking__qry__remote_first
|
|
||||||
|
return {
|
||||||
|
v: $events_loc.leads.tracking__search_version,
|
||||||
|
str: ($events_loc.leads.tracking__qry__search_text ?? '')
|
||||||
|
.toLowerCase()
|
||||||
|
.trim(),
|
||||||
|
sort: $events_loc.leads.tracking__qry__sort_order,
|
||||||
|
licensee_email: licensee_email,
|
||||||
|
exhibit_id: page.params.exhibit_id,
|
||||||
|
remote_first: $events_loc.leads.tracking__qry__remote_first
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
@@ -177,6 +187,12 @@
|
|||||||
.where('event_exhibit_id')
|
.where('event_exhibit_id')
|
||||||
.equals(exhibit_id)
|
.equals(exhibit_id)
|
||||||
.filter((tracking) => {
|
.filter((tracking) => {
|
||||||
|
// 1. Licensee Email Filter
|
||||||
|
if (params.licensee_email !== 'all') {
|
||||||
|
if (tracking.external_person_id !== params.licensee_email) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Text Search Filter
|
||||||
if (qry_str) {
|
if (qry_str) {
|
||||||
const name = (
|
const name = (
|
||||||
tracking.event_badge_full_name ?? ''
|
tracking.event_badge_full_name ?? ''
|
||||||
@@ -273,6 +289,7 @@
|
|||||||
event_id: page.params.event_id || '',
|
event_id: page.params.event_id || '',
|
||||||
event_exhibit_id: exhibit_id,
|
event_exhibit_id: exhibit_id,
|
||||||
fulltext_search_qry_str: qry_str || null,
|
fulltext_search_qry_str: qry_str || null,
|
||||||
|
qry_external_person_id: params.licensee_email !== 'all' ? params.licensee_email : null,
|
||||||
order_by_li,
|
order_by_li,
|
||||||
limit: 150
|
limit: 150
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,8 +14,44 @@
|
|||||||
LoaderCircle
|
LoaderCircle
|
||||||
} from 'lucide-svelte';
|
} from 'lucide-svelte';
|
||||||
|
|
||||||
|
import { untrack } from 'svelte';
|
||||||
import { ae_loc } from '$lib/stores/ae_stores';
|
import { ae_loc } from '$lib/stores/ae_stores';
|
||||||
import { events_loc, events_sess } from '$lib/stores/ae_events_stores';
|
import { events_loc, events_sess } from '$lib/stores/ae_events_stores';
|
||||||
|
import { liveQuery } from 'dexie';
|
||||||
|
import { db_events } from '$lib/ae_events/db_events';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
let exhibit_obj: any = $state(null);
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const observable = liveQuery(() => db_events.exhibit.get(exhibit_id));
|
||||||
|
const subscription = observable.subscribe((value) => {
|
||||||
|
exhibit_obj = value;
|
||||||
|
});
|
||||||
|
return () => subscription.unsubscribe();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Reactive list derived from the exhibit state (Licensed Exhibit Leads Users)
|
||||||
|
let licensee_li = $derived.by(() => {
|
||||||
|
try {
|
||||||
|
const licenses = JSON.parse(exhibit_obj?.license_li_json || '[]');
|
||||||
|
return Array.isArray(licenses) ? licenses : [];
|
||||||
|
} catch (e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Default selection logic: Aether Admins go to "all", Licensees go to "my"
|
||||||
|
$effect(() => {
|
||||||
|
// Wait for object to load
|
||||||
|
if (!exhibit_obj) return;
|
||||||
|
|
||||||
|
if ($events_loc.leads.tracking__qry__licensee_email === 'all' && !$ae_loc.administrator_access) {
|
||||||
|
untrack(() => {
|
||||||
|
$events_loc.leads.tracking__qry__licensee_email = 'my';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function handle_search_trigger() {
|
function handle_search_trigger() {
|
||||||
if ($events_loc.leads.tracking__search_version === undefined) {
|
if ($events_loc.leads.tracking__search_version === undefined) {
|
||||||
@@ -71,6 +107,20 @@
|
|||||||
<option value="name_asc">Name ASC</option>
|
<option value="name_asc">Name ASC</option>
|
||||||
<option value="name_desc">Name DESC</option>
|
<option value="name_desc">Name DESC</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select
|
||||||
|
bind:value={$events_loc.leads.tracking__qry__licensee_email}
|
||||||
|
onchange={handle_search_trigger}
|
||||||
|
class="select select-sm text-xs px-1 max-w-fit"
|
||||||
|
>
|
||||||
|
<option value="all">All Leads</option>
|
||||||
|
{#if !$ae_loc.administrator_access}
|
||||||
|
<option value="my">My Leads</option>
|
||||||
|
{/if}
|
||||||
|
{#each licensee_li as l}
|
||||||
|
<option value={l.email}>{l.full_name || l.email}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-row items-center justify-center gap-1">
|
<div class="flex flex-row items-center justify-center gap-1">
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
import { page } from '$app/state';
|
import { page } from '$app/state';
|
||||||
import { ae_api } from '$lib/stores/ae_stores';
|
import { ae_api } from '$lib/stores/ae_stores';
|
||||||
|
import { events_loc } from '$lib/stores/ae_events_stores';
|
||||||
import { events_func } from '$lib/ae_events_functions';
|
import { events_func } from '$lib/ae_events_functions';
|
||||||
import { Search, UserPlus, CheckCircle, LoaderCircle } from 'lucide-svelte';
|
import { Search, UserPlus, CheckCircle, LoaderCircle } from 'lucide-svelte';
|
||||||
import type { ae_EventBadge } from '$lib/types/ae_types';
|
import type { ae_EventBadge } from '$lib/types/ae_types';
|
||||||
@@ -44,19 +45,19 @@
|
|||||||
if (!badge.event_badge_id_random) return;
|
if (!badge.event_badge_id_random) return;
|
||||||
adding_id = badge.event_badge_id_random;
|
adding_id = badge.event_badge_id_random;
|
||||||
|
|
||||||
// TODO: Get the actual signed-in licensed user's email
|
// Use the actual signed-in licensed user's email (stored in auth_exhibit_kv)
|
||||||
const user_email = 'placeholder@exhibitor.com';
|
const user_email = $events_loc.leads.auth_exhibit_kv?.[exhibit_id]?.key || 'shared_passcode';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await events_func.create_ae_obj__exhibit_tracking({
|
const result = await events_func.create_ae_obj__exhibit_tracking({
|
||||||
api_cfg: $ae_api,
|
api_cfg: $ae_api,
|
||||||
exhibit_id: exhibit_id,
|
exhibit_id: exhibit_id,
|
||||||
event_badge_id: badge.event_badge_id_random,
|
event_badge_id: badge.event_badge_id_random,
|
||||||
external_person_id: user_email
|
external_person_id: user_email,
|
||||||
});
|
group: user_email
|
||||||
|
});
|
||||||
if (result && on_lead_added) {
|
|
||||||
on_lead_added(badge);
|
if (result && on_lead_added) { on_lead_added(badge);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Failed to add lead', e);
|
console.error('Failed to add lead', e);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
import { page } from '$app/state';
|
import { page } from '$app/state';
|
||||||
import { ae_api } from '$lib/stores/ae_stores';
|
import { ae_api } from '$lib/stores/ae_stores';
|
||||||
|
import { events_loc } from '$lib/stores/ae_events_stores';
|
||||||
import { events_func } from '$lib/ae_events_functions';
|
import { events_func } from '$lib/ae_events_functions';
|
||||||
import Element_qr_scanner_v2 from '$lib/element_qr_scanner_v2.svelte';
|
import Element_qr_scanner_v2 from '$lib/element_qr_scanner_v2.svelte';
|
||||||
import { ae_util } from '$lib/ae_utils/ae_utils';
|
import { ae_util } from '$lib/ae_utils/ae_utils';
|
||||||
@@ -51,14 +52,17 @@
|
|||||||
if (!found_badge || !found_badge.event_badge_id_random) return;
|
if (!found_badge || !found_badge.event_badge_id_random) return;
|
||||||
|
|
||||||
scanning_status = 'adding';
|
scanning_status = 'adding';
|
||||||
const user_email = 'placeholder@exhibitor.com';
|
|
||||||
|
// Use the actual signed-in licensed user's email
|
||||||
|
const user_email = $events_loc.leads.auth_exhibit_kv?.[exhibit_id]?.key || 'shared_passcode';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const result = await events_func.create_ae_obj__exhibit_tracking({
|
const result = await events_func.create_ae_obj__exhibit_tracking({
|
||||||
api_cfg: $ae_api,
|
api_cfg: $ae_api,
|
||||||
exhibit_id: exhibit_id,
|
exhibit_id: exhibit_id,
|
||||||
event_badge_id: found_badge.event_badge_id_random,
|
event_badge_id: found_badge.event_badge_id_random,
|
||||||
external_person_id: user_email
|
external_person_id: user_email,
|
||||||
|
group: user_email
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
|
|||||||
Reference in New Issue
Block a user