Lots of updates....

This commit is contained in:
Scott Idem
2024-03-18 21:36:03 -04:00
parent 9b02b2f86c
commit d3ae087cd6
13 changed files with 531 additions and 229 deletions

View File

@@ -44,6 +44,8 @@ let events_local_data_struct: key_val = {
// Lead Retrievals (Exhibit)
'leads': {
show_content__scan_requirements: true,
auto_view: true,
// The entered_passcode is the exhibit booths shared passcode for staff. This is used to initially access the lead retrieval service.

View File

@@ -68,6 +68,8 @@ export let ae_app_local_data_struct: key_val = {
'theme_name': 'wintry',
'classes__form': 'border border-surface-200 p-4 space-y-4 rounded-container-token',
'qr': {},
},
'mod': {
'archives': {},

View File

@@ -61,7 +61,7 @@ let ds_code_obj =
};
let ae_ds_loc: Writable<key_val> = localStorageStore(`ae_ds__${ds_code}`, ds_code_obj);
console.log(`ae_ Data Store ${ds_code} = `, $ae_ds_loc);
// console.log(`ae_ Data Store ${ds_code} = `, $ae_ds_loc);
if (!$ae_ds_loc.id) {
ds_loading_status = '-- loading --';
@@ -115,7 +115,7 @@ async function load_data_store({
log_lvl: 1
})
.then( function (ds_results) {
console.log(`ae_ Data Store ${code} = `, ds_results);
// console.log(`ae_ Data Store ${code} = `, ds_results);
if (ds_results) {
console.log(`Got a result for code ${code}`);
if (!ds_results.data_store_id_random) {

View File

@@ -63,7 +63,7 @@ export async function load({ params, url }) { // params, route, url
.then(function (site_domain_results) {
if (site_domain_results) {
console.log(`ae_ site_domain_results = `, site_domain_results);
// console.log(`ae_ site_domain_results = `, site_domain_results);
let ae_api_tmp = get(ae_api);
@@ -219,7 +219,7 @@ export async function load({ params, url }) { // params, route, url
.finally(function () {
let iframe = url.searchParams.get('iframe');
console.log(`iframe = `, iframe);
// console.log(`iframe = `, iframe);
if (iframe == 'true') {
data_struct['iframe'] = iframe;

View File

@@ -1,25 +1,23 @@
<script lang="ts">
/** @type {import('./$types').PageData} */
export let data;
console.log(`ae_ Svelte root +page data:`, data);
// console.log(`ae_ Svelte root +page data:`, data);
import { onMount } from 'svelte';
import { PUBLIC_TESTING } from '$env/static/public';
console.log(`AE Config - +page.svelte PUBLIC_TESTING:`, PUBLIC_TESTING);
// console.log(`AE Config - +page.svelte PUBLIC_TESTING:`, PUBLIC_TESTING);
import Element_data_store from '$lib/element_data_store.svelte';
import { api } from '$lib/api';
import { ae_loc, ae_sess, ae_api, slct, slct_trigger } from '$lib/ae_stores';
import type { key_val } from '$lib/ae_stores';
console.log($ae_loc, $ae_sess, $ae_api);
// console.log($ae_loc, $ae_sess, $ae_api);
onMount(() => {
console.log('Root: +page.svelte');
let url = window.location.href;
console.log(url);
console.log(`Root: +page.svelte; URL: ${window.location.href}`);
});
</script>

View File

@@ -30,8 +30,8 @@ export async function load({ params, parent, url }) { // route
let submenu = {
main: {name: 'Main', href: '/events_badges', access: false},
manage: {name: 'Manage', href: '/events_badges/manage', access: 'administrator', disable: true, hide: true},
review: {name: 'Review', href: '/events_badges/review', access: false, disable: false, hide: false},
print: {name: 'Print', href: '/events_badges/print', access: 'trusted', disable: false, hide: false},
review: {name: 'Review', href: '/events_badges/review', access: false, disable: true, hide: false},
print: {name: 'Print', href: '/events_badges/print', access: 'trusted', disable: true, hide: false},
view: {name: 'View', href: '/events_badges/view', access: 'trusted', hide: true}, // event_badge_id
// new: {name: 'New', href: '/events_badges/new'},
// sponsorships: {name: 'Sponsorships', href: '/sponsorships', disable: true, hide: true},

View File

@@ -50,7 +50,11 @@ onMount(() => {
<section class="ae_events_badges md:container h-full mx-auto">
<h1 class="h2">Events - Badges</h1>
<h2 class="h3">Badges for ISHLT 2024 ({$events_slct.event_id})</h2>
<h3 class="h4">Restricted Access</h3>
<p>Accessing the badge printing for ISHLT 2024 is currently restricted</p>
<Element_data_store
ds_code="events__badges__overview"
@@ -58,12 +62,10 @@ onMount(() => {
for_type="event"
for_id={$events_slct.event_id}
display="block"
class_li="variant-ghost-surface p-2"
class_li="p-2"
/>
<a href="/{$events_slct.event_id}">Event ID {$events_slct.event_id}</a>
<Element_data_store
<!-- <Element_data_store
ds_code="events__badges__example"
ds_type="html"
for_type="event"
@@ -74,7 +76,7 @@ onMount(() => {
class_li="variant-ghost-surface p-2"
try_cache={true}
show_edit={false}
/>
/> -->
</section>

View File

@@ -173,7 +173,7 @@ function handle_check_event_exhibit_staff_passcode() {
class="flex flex-col items-center border-2 border-primary p-2">
<!-- <h2>Exhibitor Lead Retrieval</h2> -->
<div>Select your exhibit booth from the list and enter passcode you were given.</div>
<div>Select your exhibit booth from the list and enter passcode you were given. If it is correct you will be taken to the page for your exhibit.</div>
<div class="m-2">
<label for="exhibit_list" class="label">

View File

@@ -8,7 +8,7 @@ export async function load({ params, parent, url }) { // route
// console.log(`ae_events_leads +page.ts data.url:`, url);
let data = await parent();
console.log(`ae_events_leads +page.ts data:`, data);
// console.log(`ae_events_leads +page.ts data:`, data);
// console.log(`ae_events_leads +page.ts data.ae_loc:`, data.ae_loc);
if (data.ae_loc.account_id) {

View File

@@ -3,6 +3,7 @@ export let data;
console.log(`ae_events_leads exhibit [slug] +page.svelte data:`, data);
import { onMount } from 'svelte';
import { goto, invalidate, pushState, replaceState } from '$app/navigation';
import type { key_val } from '$lib/ae_stores';
import { ae_util } from '$lib/ae_utils';
@@ -21,7 +22,15 @@ import { clipboard, FileDropzone, getModalStore, localStorageStore, ProgressRadi
import Element_data_store from '$lib/element_data_store.svelte';
import Element_qr_scanner from '$lib/element_qr_scanner.svelte';
import Leads_manage from './leads_manage.svelte';
import Leads_payment from './leads_payment.svelte';
let param_slug_event_exhibit_id = data.params.slug;
let url_passcode = data.url.searchParams.get('passcode');
console.log(`ae_events_leads exhibit [slug] +page.svelte: param_slug_event_exhibit_id=${param_slug_event_exhibit_id}; passcode=${url_passcode}`);
if (url_passcode) {
$events_sess.leads.entered_passcode = url_passcode;
}
let event_exhibit_obj = liveQuery(
() => db_events.exhibits.get(param_slug_event_exhibit_id)
@@ -78,6 +87,15 @@ onMount(() => {
console.log(`No ID. Nothing to show. Try setting the ID again.`);
$events_slct.exhibit_id = param_slug_event_exhibit_id;
}
// We need to remove the url_passcode from the URL GET params after we use it. It should be safe to assume that onMount is a safe place to do this.
if (url_passcode) {
// console.log('Remove the passcode from the URL.');
data.url.searchParams.delete('passcode');
let new_url = data.url.toString()
console.log(new_url);
goto(new_url, {replaceState: true});
}
});
// console.log(`$ae_loc = `, $ae_loc);
@@ -143,6 +161,13 @@ $: if ($events_trigger == 'load__event_exhibit_obj' && $events_slct.exhibit_id)
let load_event_exhibit_obj = events_func.handle_load_ae_obj_id__exhibit({api_cfg: data.ae_api, exhibit_id: $events_slct.exhibit_id, try_cache: false})
.then(function (result) {
console.log(`load_event_exhibit_obj = `, result);
// Check if the license_li_json is an array and if not, convert it to an array.
if (result.license_li_json && !Array.isArray(result.license_li_json)) {
console.log('Convert license_li_json to an array.');
result.license_li_json = [];
}
$events_slct.exhibit_obj = result;
// let license_key = 'example@oneskyit.com';
@@ -224,6 +249,9 @@ async function handle_submit_form_license_update(event) {
console.log('Removed license:', tmp_obj);
} else if ($events_sess.leads.tmp_license.email && $events_sess.leads.tmp_license.full_name) {
if (!Array.isArray(tmp_obj.license_li_json)) {
tmp_obj.license_li_json = [];
}
tmp_obj.license_li_json.push($events_sess.leads.tmp_license);
console.log('Add license:', tmp_obj);
} else if ($events_sess.leads.tmp_license.index === -1) {
@@ -368,7 +396,7 @@ async function handle_update__exhibit({
obj_id: obj_id,
fields: data,
key: $ae_api.api_crud_super_key,
log_lvl: 2
log_lvl: 1
})
.then(async function (update__obj_result) {
if (!update__obj_result) {
@@ -507,20 +535,6 @@ function handle_qr_camera(event) {
}
// Updated 2022-04-22
export let get_event_exhibit_tracking_export = async function get_event_exhibit_tracking_export({event_exhibit_id, file_type='CSV', return_file=true, filename=null, auto_download=false, params={}, log_lvl=0}) {
console.log('*** stores_event_api.js: get_event_exhibit_tracking_export() ***');
const endpoint = `/event/exhibit/${event_exhibit_id}/tracking/export`;
if (file_type == 'CSV' || file_type == 'Excel') {
params['file_type'] = file_type;
}
params['return_file'] = true;
let event_exhibit_tracking_export_file_get_promise = await api.get_object({api_cfg: ae_api, endpoint: endpoint, params: params, return_blob: true, filename: filename, auto_download: auto_download, log_lvl: log_lvl});
// console.log(event_exhibit_tracking_export_file_get_promise);
return event_exhibit_tracking_export_file_get_promise;
}
</script>
@@ -574,6 +588,21 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
border=""
class="bg-surface-100-800-token w-full"
>
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
name="tab_payment"
value={'payment'}>
<svelte:fragment slot="lead">
{#if !$event_exhibit_obj.paid}
<span class="fas fa-question text-red-500"></span>
{:else}
<span class="fas fa-check text-green-500"></span>
{/if}
<span class="fas fa-credit-card mx-1"></span>
</svelte:fragment>
Payment
</Tab>
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
name="tab_start"
@@ -585,6 +614,34 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
Main
</Tab>
<!-- Add/Scan - For adding attendee leads by manually adding their ID or scanning their QR code. -->
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
name="tab_add_scan"
value={'add_scan'}
disabled={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
regionTab={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] ? 'text-slate-400' : ''}
>
<svelte:fragment slot="lead">
<span class="fas fa-qrcode"></span>
</svelte:fragment>
Add/Scan
</Tab>
<!-- Leads - For viewing and managing the leads that have been collected. -->
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
name="tab_leads"
value={'leads'}
disabled={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
regionTab={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] ? 'text-slate-400' : ''}
>
<svelte:fragment slot="lead">
<span class="fas fa-users"></span>
</svelte:fragment>
Leads
</Tab>
<!-- Manage - For changing the settings, exporting, and other. -->
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
@@ -598,19 +655,6 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</svelte:fragment>
Manage
</Tab>
<Tab
bind:group={$events_loc.leads.tab[$events_slct.exhibit_id]}
name="tab_add_scan"
value={'add_scan'}
disabled={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
regionTab={!$events_slct.exhibit_obj || !$events_loc?.leads.auth_exhibit_kv || !$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] ? 'text-slate-400' : ''}
>
<svelte:fragment slot="lead">
<span class="fas fa-qrcode"></span>
</svelte:fragment>
Add/Scan
</Tab>
</TabGroup>
@@ -642,17 +686,17 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</button>
{:else}
<span class="fas fa-times text-red-500"></span>
No license key selected.
No license key selected
{/if}
</h3>
</div>
{#if $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] && $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<p>
<p class="border-2 border-primary p-2 variant-soft-secondary">
You are logged in using the shared exhibit staff passcode and are using the license key for {$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}. Any leads you collect will be associated with this license key (email address).
</p>
{:else if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
<p>To use the lead retrieval service, please select a license from the list below.</p>
<p class="border-2 border-primary p-2 variant-soft-secondary">To use the lead retrieval service, please select a license from the list below. You may need to add one first.</p>
{:else}
<p>To access this exhibit you must enter the shared staff passcode that you were given. You will then be able to select a license and use the lead retrieval service from your device.</p>
<label class="label variant-glass-warning p-2 px-4 m-2 rounded-full font-bold">Shared exhibit passcode:
@@ -676,16 +720,17 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
<h2 class="h3">License List (max {$event_exhibit_obj?.license_max})</h2>
{#if $event_exhibit_obj?.license_li_json && $event_exhibit_obj?.license_li_json.length < $event_exhibit_obj?.license_max}
{#if !Array.isArray($event_exhibit_obj.license_li_json) || (Array.isArray($event_exhibit_obj.license_li_json) && $event_exhibit_obj?.license_li_json.length < $event_exhibit_obj?.license_max)}
<button
class="btn btn-sm variant-soft-primary w-40"
on:click={() => {
// let tmp_obj = $event_exhibit_obj;
$events_sess.leads.tmp_license = {
// 'index': $event_exhibit_obj?.license_li_json.length, // This is the index of the new license in the list.
'email': 'test+z@oneskyit.com',
'full_name': 'Scott X',
'passcode': 'abcdefg',
'email': '', // test+z@oneskyit.com
'full_name': '', // Scott X
// The passcode should default to a random 5 digit number.
'passcode': Math.random().toString(36).substring(2, 8),
'max_reuse': 0,
'updated_on': new Date().toISOString()
};
@@ -733,6 +778,7 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
<!-- <div class="ae_h_scrollfix"> -->
{#if Array.isArray($event_exhibit_obj.license_li_json) && $event_exhibit_obj.license_li_json.length > 0}
<table class="table table-compact table-hover">
<thead>
<tr>
@@ -939,6 +985,9 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</tbody>
</table>
{:else}
<div class="variant-soft-warning">No licenses found. Add a license above.</div>
{/if} <!-- Array.isArray(result.license_li_json) -->
<!-- </div> --> <!-- .ae_h_scrollfix -->
</form>
@@ -950,176 +999,6 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</section> <!-- .tab__start -->
<!-- BEGIN Tab: Manage -->
{:else if $events_loc.leads.tab[$events_slct.exhibit_id] == 'manage'}
<section class="tab__manage flex flex-col wrap justify-center items-center space-y-4 ae_h_scrollfix">
<h2 class="h3">
<!-- <span class="fas fa-download"></span> -->
Login and License
</h2>
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<div>
<strong>Logged in and using license for:</strong>
{#if $event_exhibit_obj?.license_li_json}
<!-- <div class="flex flex-row wrap gap-1"> -->
{#each $event_exhibit_obj?.license_li_json as license, index}
{#if license.email === $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Name:</span>
<span class="ae_value">{license.full_name}</span>
</div>
{/if}
{/each}
<!-- </div> -->
{/if}
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Email:</span>
<span class="ae_value">{$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
</div>
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Started:</span>
<span class="ae_value">{ae_util.iso_datetime_formatter($events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].updated_on, 'datetime_long')}</span>
</div>
<!-- Show the full_name of the person associated with that license key email address. The license information is stored in an array. The license key is not the index number value in the array. Ideally I was planning to make the key the email address, not an array index number. -->
<button
type="button"
class="btn btn-sm variant-soft-warning w-48"
on:click={() => {
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key = null;
}}
>
<span class="fas fa-times mx-1"></span>
Clear License
</button>
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn btn-sm variant-soft-warning w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
</div>
{:else if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
<div class="variant-soft-warning">You are logged in using the shared passcode for the exhibit. You will want to select a license to fully use this lead retrieval service. Please go to the Main tab and select a license to use.</div>
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn btn-sm variant-soft-warning w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
{:else}
<div class="variant-soft-warning">Please go to the Main tab to login using the shared staff passcode for this exhibit. Then select a license to use.</div>
{/if}
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<hr class="border w-full">
<h2 class="h3">
<!-- <span class="fas fa-download"></span> -->
Export Data
</h2>
<p>Use this to export the leads data for this exhibit to an Excel file format. The data can be downloaded at anytime using the export button below.</p>
<button
type="button"
on:click={() => {
if (!confirm('Download exported data Excel file?')) {
return false;
}
get_event_exhibit_tracking_export({ 'event_exhibit_id': $events_slct.exhibit_id, file_type: 'Excel', 'return_file': true, filename: `lead_retrieval_export_${$events_slct.exhibit_obj.name.replaceAll(' ', '_')}.xlsx`, auto_download: true, log_lvl: 2 });
// .replace(' ', '_')
}}
disabled={true}
class="btn btn-sm variant-soft-primary w-48 mb-1 export_data_btn"
title={`TEMPORARILY DISABLED: Download leads data for ${$events_slct.exhibit_obj.name}`}
>
<span class="fas fa-download mx-1"></span> Export Data
</button>
{/if} <!-- $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key -->
<hr class="border w-full">
<h2 class="h3">
<!-- <span class="fas fa-cogs"></span> -->
Additional Settings
</h2>
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
Turn on iframe mode:
<button
type="button"
on:click={() => {
console.log('Turn on iframe mode');
$ae_loc.iframe = !$ae_loc.iframe;
}}
class="btn btn-sm variant-soft w-48"
>
<span class="fas fa-compress mx-1"></span>
Turn {$ae_loc.iframe ? 'off' : 'on'} iframe mode
</button>
Show or hide additional details:
<button
type="button"
on:click={() => {
console.log('Show/Hide Details');
$events_loc.show_details = !$events_loc.show_details;
}}
class="btn btn-sm variant-soft w-48"
>
<span class="fas fa-eye mx-1"></span>
Show/Hide Details
</button>
<!-- {#if $events_loc?.leads.auth_exhibit_kv && $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn variant-soft-primary w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
<p>To use the lead retrieval service, please select a license from the list on the Main tab.</p>
{/if} -->
{:else}
<div>You must be logged in to view this tab.</div>
{/if} <!-- $events_loc?.leads.auth_exhibit_kv && $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] -->
</section>
<!-- BEGIN Tab: Add/Scan -->
{:else if $events_loc.leads.tab[$events_slct.exhibit_id] == 'add_scan'}
@@ -1135,6 +1014,78 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
<div class="variant-soft-warning">Please go to the Main tab and select a license to use.</div>
{/if}
<div class="variant-soft-warning">This section is not enabled for ISHLT 2024 at this time. The ability to add a lead by scanning the attendee's QR code or by searching for their name, will be enabled before the ISHLT 2024 Annual Meeting in Prague.</div>
<p>
<!-- This page is used to test QR scanning with your device. -->
{#if $ae_loc.hub.qr.camera_status == 'unknown'}
<strong>You will need to allow access to your device's camera when asked.</strong>
{:else if $ae_loc.hub.qr.camera_status == 'denied'}
<strong>You need to allow access to your device's camera. Currently this seems to be blocked or denied for this site.</strong>
Please check your browser's permissions.
{/if}
</p>
<span>
<button
class="btn btn_md variant-soft-primary mx-1 add_person_qr_btn"
on:click={() => {
// $slct.event_exhibit_tracking_id = null;
// $slct.event_exhibit_tracking_obj = null;
// show_add_qr = true;
// qr_scan_obj = null;
// event_exhibit_tracking_obj_create_promise = null;
}}
disabled={true}
title="Scan a QR code to add a person to the leads list."
>
<span class="fas fa-qrcode mx-1"></span>
Scan to Add Person
</button>
<button
class="btn btn_md variant-soft-primary mx-1 add_person_search_btn"
on:click={() => {
// $slct.event_exhibit_tracking_id = null;
// $slct.event_exhibit_tracking_obj = null;
// show_add_search = true;
// qr_scan_obj = null;
// event_exhibit_tracking_obj_create_promise = null;
}}
disabled={true}
title="Search for a person to add to the leads list."
>
<span class="fas fa-search mx-1"></span>
Search to Add Person
</button>
</span>
<span class="float-right">
{#if ($events_loc.leads.show_content__scan_requirements)}
<button class="btn btn-sm variant-soft-secondary" on:click={() => $events_loc.leads.show_content__scan_requirements=false}><span class="fas fa-info mx-1"></span> Hide Requirements</button>
{:else if (!$events_loc.leads.show_content__scan_requirements)}
<button class="btn btn-sm variant-soft-secondary" on:click={() => $events_loc.leads.show_content__scan_requirements=true}><span class="fas fa-info mx-1"></span> Requirements</button>
{/if}
</span>
{#if $events_loc.leads.show_content__scan_requirements}
<div class="border-2 border-primary p-2 variant-soft-secondary">
<p>You will need a device with a camera to scan the QR codes. You will also of course need one or more valid QR codes to scan.
<!-- <button class="ae_btn btn_sm" on:click={() => show='qr_codes'}><span class="fas fa-qrcode"></span> Example QR Codes</button> -->
</p>
<ul class="list-disc list-inside">
<li>Most laptops, workstations, Android phones/tablets, iPhones, and iPads are compatible</li>
<li>The device must have a current (within the last 4 years) web browser such as Google Chrome, Mozilla Firefox, Apple's Safari, or Microsoft Edge. Opera is not yet fully supported.</li>
<li>There is no Android or Apple app that needs to be installed!</li>
<li>The device must have a camera for scanning or you will need to manually enter attendee badge IDs.</li>
<li>The only permission you need to allow is access to your device's camera when asked.</li>
</ul>
</div>
{:else}
<!-- <button class="ae_btn btn_sm btn_info" on:click={() => show_requirements=true}><span class="fas fa-eye"></span> Requirements</button> -->
{/if}
<!-- <div class=""> -->
<Element_qr_scanner show_qr_scan_result={true} show_qr_manual_badge_id_entry_option={true} on:qr_scan_result={handle_qr_scan_result} on:qr_camera={handle_qr_camera} />
<!-- </div> -->
@@ -1149,8 +1100,33 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</section>
{/if} <!-- $events_loc.leads.tab[$events_slct.exhibit_id] -->
<!-- BEGIN Tab: Leads -->
{:else if $events_loc.leads.tab[$events_slct.exhibit_id] == 'leads'}
<h2 class="h3">Leads for {$event_exhibit_obj.name}</h2>
<div class="variant-soft-warning">This section is not currently enabled.</div>
<!-- <Leads_list /> -->
<!-- BEGIN Tab: Manage -->
{:else if $events_loc.leads.tab[$events_slct.exhibit_id] == 'manage'}
<Leads_manage />
<!-- BEGIN Tab: Payment -->
{:else if $events_loc.leads.tab[$events_slct.exhibit_id] == 'payment'}
<Leads_payment />
{/if} <!-- $events_loc.leads.tab[$events_slct.exhibit_id] -->
<!-- End of tab content -->
{/if} <!-- $events_slct.exhibit_id && $event_exhibit_obj -->
@@ -1288,7 +1264,7 @@ export let get_event_exhibit_tracking_export = async function get_event_exhibit_
</div>
<div class="popover__status">
Something text
<!-- Something text -->
{#await license_submit_results}
<div class="modal-loading">
<span class="fas fa-spinner fa-spin"></span>

View File

@@ -0,0 +1,198 @@
<script lang="ts">
// export let data;
// console.log(`ae_events_leads exhibit [slug] leads_manage.svelte data:`, data);
import { ae_util } from '$lib/ae_utils';
import { liveQuery } from "dexie";
import { db_events } from "$lib/db_events";
import { ae_loc, ae_sess, ae_api, slct, slct_trigger } from '$lib/ae_stores';
import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_events_stores';
// let param_slug_event_exhibit_id = data.params.slug;
let event_exhibit_obj = liveQuery(
() => db_events.exhibits.get($events_slct.exhibit_id)
);
// Updated 2022-04-22
export let get_event_exhibit_tracking_export = async function get_event_exhibit_tracking_export({event_exhibit_id, file_type='CSV', return_file=true, filename=null, auto_download=false, params={}, log_lvl=0}) {
console.log('*** stores_event_api.js: get_event_exhibit_tracking_export() ***');
const endpoint = `/event/exhibit/${event_exhibit_id}/tracking/export`;
if (file_type == 'CSV' || file_type == 'Excel') {
params['file_type'] = file_type;
}
params['return_file'] = true;
let event_exhibit_tracking_export_file_get_promise = await api.get_object({api_cfg: ae_api, endpoint: endpoint, params: params, return_blob: true, filename: filename, auto_download: auto_download, log_lvl: log_lvl});
// console.log(event_exhibit_tracking_export_file_get_promise);
return event_exhibit_tracking_export_file_get_promise;
}
</script>
<section class="tab__manage flex flex-col wrap justify-center items-center space-y-4 ae_h_scrollfix">
<h2 class="h3">
<!-- <span class="fas fa-download"></span> -->
Login and License
</h2>
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<div>
<strong>Logged in and using license for:</strong>
{#if $event_exhibit_obj?.license_li_json}
<!-- <div class="flex flex-row wrap gap-1"> -->
{#each $event_exhibit_obj?.license_li_json as license, index}
{#if license.email === $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Name:</span>
<span class="ae_value">{license.full_name}</span>
</div>
{/if}
{/each}
<!-- </div> -->
{/if}
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Email:</span>
<span class="ae_value">{$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
</div>
<div class="flex flex-row items-center space-x-2">
<span class="ae_label">Started:</span>
<span class="ae_value">{ae_util.iso_datetime_formatter($events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].updated_on, 'datetime_long')}</span>
</div>
<!-- Show the full_name of the person associated with that license key email address. The license information is stored in an array. The license key is not the index number value in the array. Ideally I was planning to make the key the email address, not an array index number. -->
<button
type="button"
class="btn btn-sm variant-soft-warning w-48"
on:click={() => {
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id].key = null;
}}
>
<span class="fas fa-times mx-1"></span>
Clear License
</button>
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn btn-sm variant-soft-warning w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
</div>
{:else if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
<div class="variant-soft-warning">You are logged in using the shared passcode for the exhibit. You will want to select a license to fully use this lead retrieval service. Please go to the Main tab and select a license to use.</div>
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn btn-sm variant-soft-warning w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
{:else}
<div class="variant-soft-warning">Please go to the Main tab to login using the shared staff passcode for this exhibit. Then select a license to use.</div>
{/if}
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key}
<hr class="border w-full">
<h2 class="h3">
<!-- <span class="fas fa-download"></span> -->
Export Data
</h2>
<p>Use this to export the leads data for this exhibit to an Excel file format. The data can be downloaded at anytime using the export button below.</p>
<button
type="button"
on:click={() => {
if (!confirm('Download exported data Excel file?')) {
return false;
}
get_event_exhibit_tracking_export({ 'event_exhibit_id': $events_slct.exhibit_id, file_type: 'Excel', 'return_file': true, filename: `lead_retrieval_export_${$events_slct.exhibit_obj.name.replaceAll(' ', '_')}.xlsx`, auto_download: true, log_lvl: 2 });
// .replace(' ', '_')
}}
disabled={true}
class="btn btn-sm variant-soft-primary w-48 mb-1 export_data_btn"
title={`TEMPORARILY DISABLED: Download leads data for ${$events_slct.exhibit_obj.name}`}
>
<span class="fas fa-download mx-1"></span> Export Data
</button>
{/if} <!-- $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id].key -->
<hr class="border w-full">
<h2 class="h3">
<!-- <span class="fas fa-cogs"></span> -->
Additional Settings
</h2>
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
Turn on iframe mode:
<button
type="button"
on:click={() => {
console.log('Turn on iframe mode');
$ae_loc.iframe = !$ae_loc.iframe;
}}
class="btn btn-sm variant-soft w-48"
>
<span class="fas fa-compress mx-1"></span>
Turn {$ae_loc.iframe ? 'off' : 'on'} iframe mode
</button>
Show or hide additional details:
<button
type="button"
on:click={() => {
console.log('Show/Hide Details');
$events_loc.show_details = !$events_loc.show_details;
}}
class="btn btn-sm variant-soft w-48"
>
<span class="fas fa-eye mx-1"></span>
Show/Hide Details
</button>
<!-- {#if $events_loc?.leads.auth_exhibit_kv && $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
<button
type="button"
on:click={() => {
console.log('Log Out');
$events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] = null;
}}
title="Log out"
class="btn variant-soft-primary w-48"
>
<span class="fas fa-sign-out-alt mx-1"></span>
Log Out
</button>
<p>To use the lead retrieval service, please select a license from the list on the Main tab.</p>
{/if} -->
{:else}
<div>You must be logged in to view this tab.</div>
{/if} <!-- $events_loc?.leads.auth_exhibit_kv && $events_loc.leads.auth_exhibit_kv[$events_slct.exhibit_id] -->
</section>

View File

@@ -0,0 +1,124 @@
<script lang="ts">
// export let data;
// console.log(`ae_events_leads exhibit [slug] leads_payment.svelte data:`, data);
import { ae_util } from '$lib/ae_utils';
import { liveQuery } from "dexie";
import { db_events } from "$lib/db_events";
import { ae_loc, ae_sess, ae_api, slct, slct_trigger } from '$lib/ae_stores';
import { events_loc, events_sess, events_slct, events_trigger } from '$lib/ae_events_stores';
// let param_slug_event_exhibit_id = data.params.slug;
let event_exhibit_obj = liveQuery(
() => db_events.exhibits.get($events_slct.exhibit_id)
);
</script>
<section class="tab__payment flex flex-col wrap justify-center items-center space-y-4">
<h2 class="h3">
<span class="fas fa-credit-card mx-1"></span>
Payment
</h2>
{#if $events_loc?.leads.auth_exhibit_kv[$events_slct.exhibit_id]}
{#if $event_exhibit_obj?.paid}
<h3 class="h4">Paid</h3>
{:else}
<h3 class="h4">Not Paid</h3>
<script async
src="https://js.stripe.com/v3/buy-button.js">
</script>
<!-- <div class="fle"> -->
<div>
1 user license<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvqWJ2gJkNsDuiNqMCWz5nG"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
1 user license with tablet rental<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvqVA2gJkNsDuiNhk9r8Io2"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
Up to 3 user licenses<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrI22gJkNsDuiNXjBg3c4Y"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
Up to 3 user licenses with tablet rental<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrKa2gJkNsDuiNhSBCkNau"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<hr>
<div>
Up to 6 user licenses<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrWc2gJkNsDuiN7mnwvZNL"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
Up to 6 user licenses with tablet rental<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrXP2gJkNsDuiNZpWZs3Uy"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
Up to 10 user licenses<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrPM2gJkNsDuiNRCMHfSuz"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<div>
Up to 10 user licenses with tablet rental<br>
<stripe-buy-button
buy-button-id="buy_btn_1OvrPs2gJkNsDuiN1nPkjPOM"
publishable-key="pk_live_zqaWNDfak2eDHeqnRiyaJcFi"
>
</stripe-buy-button>
</div>
<!-- </div> -->
{/if}
{:else}
<div class="variant-soft-warning">Please go to the Main tab to login using the shared staff passcode for this exhibit. Then select a license to use.</div>
{/if}
</section>

View File

@@ -13,10 +13,10 @@ export async function load({ params, url }) { // route
// console.log(`Svelte Events Speakers layout.ts data = url:`, url);
let ae_loc_tmp = get(ae_loc);
console.log(`ae_loc = `, ae_loc_tmp);
// console.log(`ae_loc = `, ae_loc_tmp);
let ds_code_li: null|key_val = ae_loc_tmp.ds;
console.log(`ae_ ds_code_li = `, ds_code_li);
// console.log(`ae_ ds_code_li = `, ds_code_li);
let ds_code: null|string = null;
let ds_type: null|string = null;