diff --git a/src/lib/ae_stores.ts b/src/lib/ae_stores.ts index 220ea981..dec4ebd8 100644 --- a/src/lib/ae_stores.ts +++ b/src/lib/ae_stores.ts @@ -196,6 +196,9 @@ export let ae_app_session_data_struct: key_val = { }, 'testing': {}, }, + + 'download': {}, + 'download_li': {}, }; // console.log(`AE Stores - App Session Storage Data:`, ae_app_session_data_struct); export let ae_sess = writable(ae_app_session_data_struct); diff --git a/src/lib/api.js b/src/lib/api.js index 4da88dfe..68f13be2 100644 --- a/src/lib/api.js +++ b/src/lib/api.js @@ -309,6 +309,17 @@ export let get_object = async function get_object( console.log('GET Blob Timestamp:', progressEvent.timeStamp, 'Total:', progressEvent.total, 'Loaded:', progressEvent.loaded, 'Percent Completed', percent_completed); temp_get_blob_percent_completed = percent_completed; + + // WARNING: This needs to be tied to an object type and ID. This is a temporary solution. + try { + window.postMessage({ + type: 'api_download_blob', endpoint: endpoint, filename: filename, size_total: progressEvent.total, size_loaded: progressEvent.loaded, percent_completed: percent_completed + }, + '*' + ); + } catch (error) { + console.log('Error posting message to window:', error); + } } } ) @@ -330,6 +341,17 @@ export let get_object = async function get_object( filename = 'unknown_file.ext'; } + // WARNING: This needs to be tied to an object type and ID. This is a temporary solution. + try { + window.postMessage({ + type: 'api_download_blob', endpoint: endpoint, filename: filename, size_total: 0, size_loaded: 0, percent_completed: 100 + }, + '*' + ); + } catch (error) { + console.log('Error posting message to window:', error); + } + if (auto_download) { if (log_lvl) { console.log(`Auto Download: ${filename}`); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 52cf7848..4b4aaa4b 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -199,6 +199,48 @@ onMount(() => { $slct.sponsorship_cfg_id = data.url.searchParams.get('sponsorship_cfg_id'); $ae_loc.mod.sponsorships.cfg_id = data.url.searchParams.get('sponsorship_cfg_id'); } + + + // TESTING TESTING TESTING + // WARNING: This needs to be tied to an object type and ID. This is a temporary solution. + $ae_sess.download = { + 'endpoint': '/event/file/abc123/download', + 'filename': 'example.txt', + 'size_total': 0, + 'size_loaded': 0, + 'percent_completed': 0, + }; + window.addEventListener('message', function(event) { + console.log('Message received in root +layout.svelte:'); + console.log(event); + + if (event.data.type == 'api_download_blob') { + console.log('Download blob (file) message received:', event.data); + + // Get the event_file_id from the event.data.endpoint value. + // Example: /event/file/abc123/download + + let endpoint = event.data.endpoint; + // let event_file_id = endpoint.split('/')[3]; + + // ae_downloads[event_file_id] = { + $ae_sess.download = { + 'endpoint': endpoint, + 'filename': event.data.filename, + 'size_total': event.data.size_total, + 'size_loaded': event.data.size_loaded, + 'percent_completed': event.data.percent_completed, + }; + + // let event_file_id = event.data.event_file_id; + // let filename = event.data.filename; + // let auto_download = event.data.auto_download; + + // ae_promises[event_file_id] + // ae_promises[event_file_id] = download_event_file({ 'event_file_id': event_file_id, 'return_file': true, filename: filename, auto_download: auto_download, log_lvl: 1 }); + } + }); + }); diff --git a/src/routes/events_pres_mgmt/+layout.svelte b/src/routes/events_pres_mgmt/+layout.svelte new file mode 100644 index 00000000..2fbd7e8e --- /dev/null +++ b/src/routes/events_pres_mgmt/+layout.svelte @@ -0,0 +1,89 @@ + + + + + Events - Presentation Management - {$events_loc.title ?? 'Æ loading...'} + + + + + + + diff --git a/src/routes/events_pres_mgmt/+layout.ts b/src/routes/events_pres_mgmt/+layout.ts new file mode 100644 index 00000000..3e8ce01e --- /dev/null +++ b/src/routes/events_pres_mgmt/+layout.ts @@ -0,0 +1,46 @@ +/** @type {import('./$types').LayoutLoad} */ +console.log(`ae_events_pres_mgmt +layout.ts start`); + +import { events_func } from '$lib/ae_events_functions'; + + +export async function load({ parent }) { + + let data = await parent(); + // console.log(`ae_events_pres_mgmt +layout.ts data:`, data); + + + let account_id = data.account_id; + let ae_acct = data[account_id]; + console.log(`ae_acct = `, ae_acct); + + if (!account_id) { + console.log(`events_pres_mgmt +layout.ts: The account_id was not found in the data!!!`); + return false; + } + + let event_id = ae_acct.slct.event_id; + if (!event_id) { + console.log(`events_pres_mgmt +layout.ts: The event_id was not found in the data!!!`); + return false; + } + + let load_event_obj = events_func.handle_load_ae_obj_id__event({api_cfg: ae_acct.api, event_id: event_id, try_cache: false}); + + ae_acct.slct.event_obj = load_event_obj; + + let submenu = { + main: {name: 'Main', href: '/events_pres_mgmt', access: false}, + // manage: {name: 'Manage', href: '/events_pres_mgmt/manage', access: 'administrator', disable: true, hide: true}, + locations: {name: 'Locations', href: '/events_pres_mgmt/locations', access: false, disable: false, hide: false}, + }; + data.submenu = submenu + + // WARNING: Precaution against shared data between sites and sessions. + data[account_id] = ae_acct; + + return data; +} + +// export const prerender = false; +// export const prerender = true; diff --git a/src/routes/events_pres_mgmt/+page.svelte b/src/routes/events_pres_mgmt/+page.svelte new file mode 100644 index 00000000..6dcce91f --- /dev/null +++ b/src/routes/events_pres_mgmt/+page.svelte @@ -0,0 +1,64 @@ + + + +
+ +

Presentation Management for {$events_slct.name} ({$events_slct.event_id})

+ +

Restricted Access

+

Accessing the presentation management system is currently restricted

+ + + + + + +
+ + + diff --git a/src/routes/events_pres_mgmt/+page.ts b/src/routes/events_pres_mgmt/+page.ts new file mode 100644 index 00000000..5b6fadeb --- /dev/null +++ b/src/routes/events_pres_mgmt/+page.ts @@ -0,0 +1,6 @@ +/** @type {import('./$types').PageLoad} */ +export function load() { + return { + ae_events_pres_mgmt_page_ts: true, + }; +} diff --git a/src/routes/events_pres_mgmt/event/[slug]/+page.svelte b/src/routes/events_pres_mgmt/event/[slug]/+page.svelte new file mode 100644 index 00000000..b5470ee7 --- /dev/null +++ b/src/routes/events_pres_mgmt/event/[slug]/+page.svelte @@ -0,0 +1,142 @@ + + + +
+ + +{#if $events_slct.event_id && $event_obj} + +Nothing to see + +{/if} +
+ + + diff --git a/src/routes/events_pres_mgmt/event/[slug]/+page.ts b/src/routes/events_pres_mgmt/event/[slug]/+page.ts new file mode 100644 index 00000000..6c3333b3 --- /dev/null +++ b/src/routes/events_pres_mgmt/event/[slug]/+page.ts @@ -0,0 +1,53 @@ +/** @type {import('./$types').PageLoad} */ +console.log(`ae_events_pres_mgmt_event [slug] +page.ts start`); + +import { events_func } from '$lib/ae_events_functions'; + +export async function load({ parent }) { // route + // console.log(`ae_events_pres_mgmt_event +page.ts data.params:`, params); + // console.log(`ae_events_pres_mgmt_event +page.ts data.route:`, route); + // console.log(`ae_events_pres_mgmt_event +page.ts data.url:`, url); + + let data = await parent(); + // console.log(`ae_events_pres_mgmt_event +page.ts data:`, data); + + let account_id = data.account_id; + let ae_acct = data[account_id]; + console.log(`ae_acct = `, ae_acct); + + if (!account_id) { + console.log(`events_pres_mgmt_event [slug] +page.ts: The account_id was not found in the data!!!`); + return false; + } + + data.ae_events_pres_mgmt_event_slug_page_ts = true; + + // let param_slug_event_id = data.params.slug; + + let event_id = data.params.slug; + if (!event_id) { + console.log(`events_pres_mgmt_event [slug] +layout.ts: The event_id was not found in the data.params.slug!!!`); + return false; + } + + ae_acct.slct.event_id = event_id; + + let load_event_obj = events_func.handle_load_ae_obj_id__event({api_cfg: ae_acct.api, event_id: event_id, try_cache: false}); + + ae_acct.slct.event_obj = await load_event_obj; + + let load_event_session_obj_li = events_func.handle_load_ae_obj_li__event_session({ + api_cfg: ae_acct.api, + event_id: event_id, + params: {enabled: 'all', qry__limit: 550}, + try_cache: false + }); + console.log(`load_event_session_obj_li = `, load_event_session_obj_li); + + ae_acct.slct.event_session_obj_li = load_event_session_obj_li; + + // WARNING: Precaution against shared data between sites and sessions. + data[account_id] = ae_acct; + + return data; +} diff --git a/src/routes/events_speakers/+page.svelte b/src/routes/events_speakers/+page.svelte index b4fac89e..06c80d44 100644 --- a/src/routes/events_speakers/+page.svelte +++ b/src/routes/events_speakers/+page.svelte @@ -401,7 +401,7 @@ async function handle_load_ae_obj_id__event_presenter({event_presenter_id, try_c }); }} - class="btn btn-sm variant-ghost-primary w-48 mb-1 export_data_btn" + class="btn btn-sm variant-ghost-warning w-42 mb-1 export_data_btn text-xs" title={`Download sponsorship data for ${$ae_loc.account_name}`} > {#await ae_promises.download__sponsorship_export} @@ -412,7 +412,7 @@ async function handle_load_ae_obj_id__event_presenter({event_presenter_id, try_c {:then} {/await} - Export Data + Export All Data {/if} diff --git a/src/routes/sponsorships/+page.svelte b/src/routes/sponsorships/+page.svelte index da136b5f..4a12f349 100644 --- a/src/routes/sponsorships/+page.svelte +++ b/src/routes/sponsorships/+page.svelte @@ -181,15 +181,15 @@ async function handle_load_ae_obj_li__sponsorship({account_id, try_cache=true}) if ($ae_loc.administrator_access) { enabled = 'all'; - hidden = 'all'; + // hidden = 'all'; limit = 150; } else if ($ae_loc.trusted_access) { enabled = 'enabled'; - hidden = 'not_hidden'; + // hidden = 'not_hidden'; limit = 100; } else { enabled = 'enabled'; - hidden = 'not_hidden'; + // hidden = 'not_hidden'; limit = 25; } @@ -424,6 +424,58 @@ function send_guest_list_email() { body_html: body_html, }); } + + +function generate_guest_list_csv(ae_obj_li) { + console.log(`*** generate_guest_list_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 = ['Sponsor', 'Level', 'POC', 'Guest', 'Title', 'Affiliations', 'ADA', 'Dietary', 'Comments']; + csv_data.push(csv_columns); + + for (let i = 0; i < ae_obj_li.length; i++) { + if (ae_obj_li[i].guest_li_json && ae_obj_li[i].guest_li_json.length > 0) { + for (let j = 0; j < ae_obj_li[i].guest_li_json.length; j++) { + let csv_row = []; + csv_row.push(ae_obj_li[i].name); + csv_row.push(ae_obj_li[i].level_num); + csv_row.push(ae_obj_li[i].poc_json.full_name ?? ae_obj_li[i].poc_json.given_name); + csv_row.push(ae_obj_li[i].guest_li_json[j].full_name); + csv_row.push(ae_obj_li[i].guest_li_json[j].title ?? ''); + csv_row.push(ae_obj_li[i].guest_li_json[j].affiliations ?? ''); + csv_row.push(ae_obj_li[i].guest_li_json[j].ada ?? ''); + csv_row.push(ae_obj_li[i].guest_li_json[j].dietary ?? ''); + csv_row.push(ae_obj_li[i].guest_li_json[j].comments ?? ''); + 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', `CHOW_2024_Sponsor_Hub_guest_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; +} @@ -436,7 +488,9 @@ function send_guest_list_email() { -
+
+ {#if $ae_loc.trusted_access} + + - - --> + + + + + + + {/if}
diff --git a/src/routes/sponsorships/10_edit_modal__sponsorship_obj.svelte b/src/routes/sponsorships/10_edit_modal__sponsorship_obj.svelte index 4e0f70fb..f05963cc 100644 --- a/src/routes/sponsorships/10_edit_modal__sponsorship_obj.svelte +++ b/src/routes/sponsorships/10_edit_modal__sponsorship_obj.svelte @@ -2527,19 +2527,43 @@ async function handle_delete_sponsorship_obj({sponsorship_id, hosted_file_id=nul {#if $slct.sponsorship_id} + {#if $ae_loc.administrator_access} + {/if} + +