Work on report config options and export of presenters

This commit is contained in:
Scott Idem
2025-09-16 10:14:58 -04:00
parent c530ff8683
commit 32b6f59245
3 changed files with 192 additions and 42 deletions

View File

@@ -22,6 +22,7 @@ let {
// Imports
import { ae_util } from '$lib/ae_utils/ae_utils';
import { ae_snip, ae_loc, ae_sess, ae_api, ae_trig, slct, slct_trigger } from '$lib/ae_stores';
// export let display_mode: string = 'default'; // 'default', 'compact', 'minimal', 'launcher'
// export let link_to_type: string;
@@ -49,6 +50,61 @@ if (log_lvl) {
// () => db_events.presenters
// .bulkGet(event_presenter_id_random_li)
// );
function generate_presenter_export_csv(ae_obj_li) {
console.log(`*** generate_presenter_export_csv() ***`, ae_obj_li);
// We need to create a list with the column names and then a list of lists with the data.
let csv_data = [];
let csv_columns = ['Presenter ID', 'Name', 'Email', 'Agree', 'Files', 'Code', 'Session', 'Start datetime', 'Presentation', 'Presentation time', 'Updated On'];
csv_data.push(csv_columns);
for (let i = 0; i < ae_obj_li.length; i++) {
let csv_row = [];
csv_row.push(ae_obj_li[i].event_presenter_id);
csv_row.push(ae_obj_li[i].full_name ?? ae_obj_li[i].given_name);
csv_row.push(ae_obj_li[i].email ?? '');
csv_row.push(ae_obj_li[i].agree ? 'Yes' : 'No');
csv_row.push(ae_obj_li[i].file_count ?? '0');
csv_row.push(ae_obj_li[i].event_session_code ?? '');
csv_row.push(ae_obj_li[i].event_session_name ?? '');
csv_row.push(ae_obj_li[i].event_session_start_datetime ? ae_util.iso_datetime_formatter(ae_obj_li[i].event_session_start_datetime, 'datetime_iso_12_no_seconds') : '');
csv_row.push(ae_obj_li[i].event_presentation_name ?? '');
csv_row.push(ae_obj_li[i].event_presentation_start_datetime ? ae_util.iso_datetime_formatter(ae_obj_li[i].event_presentation_start_datetime, 'time_12_short') : '');
csv_row.push(ae_obj_li[i].updated_on ? ae_util.iso_datetime_formatter(ae_obj_li[i].updated_on, 'datetime_iso_12_no_seconds') : '');
csv_data.push(csv_row);
}
console.log('CSV Data:', csv_data);
let csv_content_str = '';
csv_data.forEach(function(row) {
csv_content_str += row.join(';');
csv_content_str += '\n';
});
const blob = new Blob([csv_content_str], { type: 'text/csv;charset=utf-8;' });
const obj_url = URL.createObjectURL(blob);
const download_link = document.createElement('a');
download_link.setAttribute('href', obj_url);
download_link.setAttribute('download', `presenter_list_${ae_util.iso_datetime_formatter()}.csv`);
download_link.setAttribute('style', 'display: none;')
download_link.textContent = 'Download CSV';
// document.querySelector('body').appendChild(download_link);
document.getElementById('download_csv_container').appendChild(download_link);
// Automatically download the file
download_link.click();
return csv_data;
}
</script>
@@ -57,23 +113,129 @@ if (log_lvl) {
{#if $lq__event_presenter_obj_li && $lq__event_presenter_obj_li?.length}
<div class="overflow-auto space-y-2">
<h2 class="h3">
<span class="text-base">
Results:
</span>
<header
class="flex flex-row gap-1 items-center justify-between"
>
<h2 class="h3">
<span class="text-base">
Results:
</span>
{#if $lq__event_presenter_obj_li.length}
<span class="text-3xl font-bold bg-success-100 px-4 border rounded-lg border-success-200"
title="Count {$lq__event_presenter_obj_li.length ?? 'None'}"
{#if $lq__event_presenter_obj_li.length}
<span class="text-3xl font-bold bg-success-100 px-4 border rounded-lg border-success-200"
title="Count {$lq__event_presenter_obj_li.length ?? 'None'}"
>
<span class="fas fa-list-ol mx-4"></span>
{$lq__event_presenter_obj_li.length ?? 'None'}&times;
</span>
{/if}
</h2>
<div
class="flex flex-row gap-1 items-center justify-end"
class:hidden={!$ae_loc.edit_mode}
>
<button
class="btn btn-sm preset-tonal-warning border border-warning-500 mb-1 generate_csv_btn"
onclick={() => {
if (!confirm('Generate and download a CSV file with the presenter list?')) {
return false;
}
let csv_data = generate_presenter_export_csv($lq__event_presenter_obj_li);
console.log('CSV Data:', csv_data);
}}
>
<span class="fas fa-file-csv mx-1"></span>
Export Presenters CSV
</button>
<span id="download_csv_container"></span>
{#if show_session_fields}
<button
type="button"
onclick={() => {
show_session_fields = !show_session_fields;
}}
class="btn btn-sm {show_session_fields ? 'ae_btn_surface' : 'ae_btn_surface_outlined'}"
title="Show or hide the session-related column fields."
>
<span class="fas fa-list-ol mx-4"></span>
{$lq__event_presenter_obj_li.length ?? 'None'}&times;
</span>
<span class="fas fa-toggle-on m-1"></span>
Showing Session Fields
</button>
{:else}
<button
type="button"
onclick={() => {
show_session_fields = !show_session_fields;
}}
class="btn btn-sm {show_session_fields ? 'ae_btn_surface' : 'ae_btn_surface_outlined'}"
title="Show or hide the session-related column fields."
>
<span class="fas fa-toggle-off m-1"></span>
Show Session Fields
</button>
{/if}
</h2>
<!-- Show or hide the session code -->
{#if !hide_session_code}
<button
type="button"
onclick={() => {
hide_session_code = true;
}}
class="btn btn-sm ae_btn_surface"
title="Hide the session code column from view. Currently showing the Session Code column."
>
<span class="fas fa-toggle-on m-1"></span>
Showing Session Code
</button>
{:else}
<button
type="button"
onclick={() => {
hide_session_code = false;
}}
class="btn btn-sm ae_btn_surface_outlined"
title="Show the session code column. Currently hiding the Session Code column from view."
>
<span class="fas fa-toggle-off m-1"></span>
Show Session Code
</button>
{/if}
{#if show_presentation_fields}
<button
type="button"
onclick={() => {
show_presentation_fields = !show_presentation_fields;
}}
class="btn btn-sm {show_presentation_fields ? 'ae_btn_surface' : 'ae_btn_surface_outlined'}"
title="Show or hide the extra presentation-related column fields."
>
<span class="fas fa-toggle-on m-1"></span>
Showing Presentation Fields
</button>
{:else}
<button
type="button"
onclick={() => {
show_presentation_fields = !show_presentation_fields;
}}
class="btn btn-sm {show_presentation_fields ? 'ae_btn_surface' : 'ae_btn_surface_outlined'}"
title="Show or hide the extra presentation-related column fields."
>
<span class="fas fa-toggle-off m-1"></span>
Show Presentation Fields
</button>
{/if}
</div>
</header>
<table
class="table table-auto table-striped w-full text-xs lg:text-sm"
class="table table-auto table-striped w-full text-xs lg:text-sm"
>
<thead>
<tr>

View File

@@ -16,7 +16,7 @@ import { ae_util } from '$lib/ae_utils/ae_utils';
// import Element_data_store from '$lib/element_data_store_v2.svelte';
import Comp_event_file_obj_tbl from '../../ae_comp__event_file_obj_tbl.svelte';
import Comp_event_session_obj_tbl from './../../ae_comp__event_session_obj_tbl_wrapper.svelte';
import Comp_event_presenter_obj_tbl from './../presenter/ae_comp__event_presenter_obj_tbl_wrapper.svelte';
// import Comp_event_presenter_obj_tbl from './../presenter/ae_comp__event_presenter_obj_tbl_wrapper.svelte';
import { liveQuery } from "dexie";
// import { core_func } from '$lib/ae_core_functions';
@@ -867,6 +867,8 @@ async function handle_qry__event_session(
</Comp_event_session_obj_tbl>
{/if}
<!-- All Event Presenter related reports -->
<Reports_presenters
lq__event_obj={lq__event_obj}
event_presenter_obj_li={$events_sess.event_presenter_obj_li}
@@ -885,9 +887,9 @@ async function handle_qry__event_session(
log_lvl={log_lvl}
/>
<!-- Show presenters that have agreed -->
{#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_agree' && $events_sess.event_presenter_obj_li}
<!-- <div class="overflow-x-auto"> -->
<!-- {#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_agree' && $events_sess.event_presenter_obj_li}
<h3 class="h4 text-center">
Presenters {#if $events_loc.pres_mgmt.rpt__presenter_agree}Agreed{:else}Not Agreed{/if}
{$events_slct.event_presenter_obj_li.length ?? 0} found
@@ -908,36 +910,26 @@ async function handle_qry__event_session(
class="ae_btn_info btn btn-sm m-1"
>
{#if $events_loc.pres_mgmt.rpt__presenter_agree}
<!-- <span class="fas fa-check m-1"></span> -->
<span class="fas fa-toggle-on m-1"></span>
Agreed
{:else}
<!-- <span class="fas fa-times m-1"></span> -->
<span class="fas fa-toggle-off m-1"></span>
Not Agreed
{/if}
</button>
</h3>
<!-- {#if !$events_loc.pres_mgmt.rpt__presenter_agree}
<p class="text-center text-red-500 font-bold">This report is not complete! Some records will be missing from these results. This report is being worked on.</p>
{/if} -->
<!-- bind:event_presenter_id_random_li={event_presenter_id_random_li} -->
<!-- {#if event_presenter_id_random_li && event_presenter_id_random_li?.length } -->
<Comp_event_presenter_obj_tbl
bind:event_presenter_obj_li={$events_sess.event_presenter_obj_li}
show_presentation_fields={true}
show_session_fields={true}
log_lvl={2}
>
</Comp_event_presenter_obj_tbl>
<!-- {:else}
<p class="text-center text-red-500 font-bold">No presenters found for this report.</p>
{/if} -->
{/if}
<Comp_event_presenter_obj_tbl
bind:event_presenter_obj_li={$events_sess.event_presenter_obj_li}
show_presentation_fields={true}
show_session_fields={true}
log_lvl={2}
>
</Comp_event_presenter_obj_tbl>
{/if} -->
<!-- Show presenters with bios -->
{#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_biography' && $events_sess.event_presenter_obj_li}
<!-- {#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_biography' && $events_sess.event_presenter_obj_li}
<h3 class="h4 text-center">Presenters with Bios</h3>
<Comp_event_presenter_obj_tbl
@@ -947,10 +939,10 @@ async function handle_qry__event_session(
log_lvl={log_lvl}
>
</Comp_event_presenter_obj_tbl>
{/if}
{/if} -->
<!-- Show overview of presenters (status checklist) -->
{#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_overview' && $events_sess.event_presenter_obj_li}
<!-- {#if 1==3 && $events_loc.pres_mgmt.show_report == 'presenters_overview' && $events_sess.event_presenter_obj_li}
<header class="w-full flex flex-row flex-wrap items-center justify-center gap-1">
<h3 class="h4 text-center">
Presenters Overview
@@ -961,7 +953,6 @@ async function handle_qry__event_session(
{/if}
<div class="flex flex-row items-center justify-center">
<!-- Sorting options (presenter name, start_datetime, updated_on) -->
<label class="label text-sm">
<span class="fas fa-sort m-1"></span>
Sort by:
@@ -1053,9 +1044,6 @@ async function handle_qry__event_session(
<option value="family_name">Family Name</option>
<option value="email">Email</option>
<option value="start_datetime">Start Date Time</option>
<!-- <option value="created_on">Created On</option> -->
<!-- <option value="sort">Sort</option> -->
<!-- <option value="priority">Priority</option> -->
</select>
</label>
</div>
@@ -1069,7 +1057,7 @@ async function handle_qry__event_session(
log_lvl={log_lvl}
>
</Comp_event_presenter_obj_tbl>
{/if}
{/if} -->
<!-- Show recently uploaded files -->
{#if $events_loc.pres_mgmt.show_report == 'recent_files' && event_file_id_random_li}

View File

@@ -691,7 +691,7 @@ function preventDefault(fn) {
preset-tonal-warning preset-outlined-warning-200-800 hover:preset-filled-warning-200-800
transition
"
title={`Download sponsorship data for ${$ae_loc.account_name}`}
title={`Download meeting data for ${$ae_loc.account_name}`}
>
{#await ae_promises.download__events_export}
<span class="fas fa-spinner fa-spin m-1"></span>