The new event files reports has been cleaned up and more configurable.

This commit is contained in:
Scott Idem
2025-10-02 12:57:37 -04:00
parent 03f831de8a
commit b85d2ee98c
6 changed files with 254 additions and 61 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "osit-aether-app-svelte", "name": "osit-aether-app-svelte",
"version": "3.5.0", "version": "3.5.1",
"description": "One Sky IT's Aether App created with Svelte, SvelteKit, Tailwind CSS, Lucide, Font Awesome, and Skeleton UI. -Scott Idem", "description": "One Sky IT's Aether App created with Svelte, SvelteKit, Tailwind CSS, Lucide, Font Awesome, and Skeleton UI. -Scott Idem",
"homepage": "https://oneskyit.com/", "homepage": "https://oneskyit.com/",
"private": true, "private": true,

View File

@@ -221,6 +221,7 @@ let events_local_data_struct: key_val = {
qry_limit__sessions: 100, qry_limit__sessions: 100,
qry_max: 500, // This is the max number the limit is allowed to be set to. qry_max: 500, // This is the max number the limit is allowed to be set to.
qry__files_offset_seconds: null, qry__files_offset_seconds: null,
qry__files_sort: 'created_on',
qry_and__file_count: true, // Essentially it should be greater than 0 qry_and__file_count: true, // Essentially it should be greater than 0

View File

@@ -6,7 +6,7 @@ import { browser } from '$app/environment';
import { events_func } from '$lib/ae_events_functions'; import { events_func } from '$lib/ae_events_functions';
export async function load({ params, parent }) { // route export async function load({ params, parent, url }) { // route
let log_lvl: number = 0; let log_lvl: number = 0;
let data = await parent(); let data = await parent();
@@ -27,6 +27,9 @@ export async function load({ params, parent }) { // route
ae_acct.slct.event_id = event_id; ae_acct.slct.event_id = event_id;
if (browser) { if (browser) {
// console.log(`TEST URL Params`, params);
// console.log(`TEST URL`, url);
let load_event_obj = await events_func.load_ae_obj_id__event({ let load_event_obj = await events_func.load_ae_obj_id__event({
api_cfg: ae_acct.api, api_cfg: ae_acct.api,
event_id: event_id, event_id: event_id,

View File

@@ -3,12 +3,13 @@ interface Props {
/** @type {import('./$types').PageData} */ /** @type {import('./$types').PageData} */
data: any; data: any;
} }
let { data }: Props = $props(); let { data }: Props = $props();
let log_lvl: number = $state(0); let log_lvl: number = $state(0);
// console.log(`ae_events_pres_mgmt event [slug] +page.svelte data:`, data); // console.log(`ae_events_pres_mgmt event [slug] +page.svelte data:`, data);
import { page } from '$app/stores';
import type { key_val } from '$lib/ae_stores'; import type { key_val } from '$lib/ae_stores';
import { ae_util } from '$lib/ae_utils/ae_utils'; import { ae_util } from '$lib/ae_utils/ae_utils';
@@ -32,6 +33,12 @@ console.log(`$slct.account_id = `, $slct.account_id);
let ae_acct = data[$slct.account_id]; let ae_acct = data[$slct.account_id];
console.log(`ae_acct = `, ae_acct); console.log(`ae_acct = `, ae_acct);
// console.log(`TEST data`, data);
// console.log(`TEST data.url`, data?.url);
// console.log(`TEST data.url.hash`, data?.url?.hash);
// console.log(`TEST $page.url`, $page?.url);
console.log(`TEST $page.url.hash`, $page?.url?.hash);
$events_slct.event_id = ae_acct.slct.event_id; $events_slct.event_id = ae_acct.slct.event_id;
$events_slct.event_obj = ae_acct.slct.event_obj; $events_slct.event_obj = ae_acct.slct.event_obj;
$events_slct.event_session_obj_li = ae_acct.slct.event_session_obj_li; $events_slct.event_session_obj_li = ae_acct.slct.event_session_obj_li;
@@ -59,6 +66,18 @@ let ae_triggers: key_val = $state({
rpt__event_presenters: true, rpt__event_presenters: true,
}); });
let url_hash: string = $state($page?.url?.hash);
$effect(() => {
if (url_hash) {
url_hash = url_hash.replace('#', '');
if (log_lvl) {
console.log(`URL hash changed: ${url_hash}`);
}
$events_loc.pres_mgmt.show_report = url_hash;
}
});
// if ($events_loc.pres_mgmt.show_report == 'sessions_poc_agree') { // if ($events_loc.pres_mgmt.show_report == 'sessions_poc_agree') {
// handle_qry__event_session({ // handle_qry__event_session({
// qry_poc_agree: $events_loc.pres_mgmt.rpt__session_poc_agree ?? false, // qry_poc_agree: $events_loc.pres_mgmt.rpt__session_poc_agree ?? false,
@@ -734,7 +753,7 @@ async function handle_qry__event_session(
<span class="border border-gray-200 rounded-md p-1"> <span class="border border-gray-200 rounded-md p-1">
<button <!-- <button
type="button" type="button"
disabled={!$ae_loc.trusted_access} disabled={!$ae_loc.trusted_access}
onclick={() => { onclick={() => {
@@ -751,9 +770,9 @@ async function handle_qry__event_session(
<span class="fas fa-file m-1"></span> <span class="fas fa-file m-1"></span>
{/if} {/if}
Recent File Uploads Recent File Uploads
</button> </button> -->
<button <!-- <button
type="button" type="button"
disabled={!$ae_loc.trusted_access} disabled={!$ae_loc.trusted_access}
onclick={() => { onclick={() => {
@@ -769,6 +788,24 @@ async function handle_qry__event_session(
{/if} {/if}
<span class="fas fa-file m-1"></span> <span class="fas fa-file m-1"></span>
Large File Uploads Large File Uploads
</button> -->
<button
type="button"
disabled={!$ae_loc.trusted_access}
onclick={() => {
ae_triggers.rpt__event_files = true;
$events_loc.pres_mgmt.show_report = 'event_files';
}}
class:hidden={$lq__event_obj?.mod_pres_mgmt_json?.hide__report_kv.event_files}
class="btn btn-sm preset-tonal-success border border-success-500 hover:preset-filled-success-500 transition-all m-1"
title="Show large file uploads."
>
{#if $events_sess.pres_mgmt?.show_report == 'event_files' && $events_sess.pres_mgmt.status_rpt[$events_sess.pres_mgmt?.show_report] == 'loading'}
<span class="fas fa-spinner fa-spin"></span>
{/if}
<span class="fas fa-file m-1"></span>
Event Files
</button> </button>
</span> </span>
@@ -826,13 +863,13 @@ async function handle_qry__event_session(
<!-- All Event File related reports --> <!-- All Event File related reports -->
{#if $events_loc.pres_mgmt.show_report == 'recent_files' || $events_loc.pres_mgmt.show_report == 'large_files'} {#if $events_loc.pres_mgmt.show_report == 'event_files' ||$events_loc.pres_mgmt.show_report == 'recent_files' || $events_loc.pres_mgmt.show_report == 'large_files'}
<Reports_files <Reports_files
lq__event_obj={lq__event_obj} lq__event_obj={lq__event_obj}
event_file_obj_li={$events_sess.event_file_obj_li} event_file_obj_li={$events_sess.event_file_obj_li}
rpt__name={$events_loc.pres_mgmt.show_report} rpt__name={$events_loc.pres_mgmt.show_report}
rpt__sort={$events_loc.pres_mgmt.qry__file_sort} rpt__sort={$events_loc.pres_mgmt.qry__files_sort}
rpt__enabled={$events_loc.pres_mgmt.qry_enabled} rpt__enabled={$events_loc.pres_mgmt.qry_enabled}
rpt__hidden={$events_loc.pres_mgmt.qry_hidden} rpt__hidden={$events_loc.pres_mgmt.qry_hidden}
rpt__limit={$events_loc.pres_mgmt.qry_limit__files} rpt__limit={$events_loc.pres_mgmt.qry_limit__files}

View File

@@ -7,7 +7,7 @@ interface Props {
rpt__name?: string; rpt__name?: string;
rpt__sort?: string; rpt__sort?: string;
rpt__order_by_li?: any; // rpt__order_by_li?: any;
rpt__enabled?: string; rpt__enabled?: string;
rpt__hidden?: string; rpt__hidden?: string;
rpt__limit?: number; rpt__limit?: number;
@@ -28,9 +28,9 @@ let {
event_file_obj_li = $bindable([]), event_file_obj_li = $bindable([]),
rpt__name = $bindable('recent_files'), // recent_files, large_files rpt__name = $bindable('event_files'), // event_files, recent_files, large_files
rpt__sort = $bindable('updated_on'), // updated_on, given_name, family_name, email, start_datetime rpt__sort = $bindable('created_on'), // updated_on, start_datetime
rpt__order_by_li = $bindable({'priority': 'DESC', 'sort': 'DESC', 'created_on': 'DESC', 'updated_on': 'DESC', 'filename': 'ASC', 'extension': 'ASC', 'hosted_file_size': 'ASC'}), // rpt__order_by_li = $bindable({'priority': 'DESC', 'sort': 'DESC', 'created_on': 'DESC', 'updated_on': 'DESC', 'filename': 'ASC', 'extension': 'ASC', 'hosted_file_size': 'ASC'}),
rpt__enabled = $bindable('enabled'), // enabled, disabled, all rpt__enabled = $bindable('enabled'), // enabled, disabled, all
rpt__hidden = $bindable('not_hidden'), // hidden, not_hidden, all rpt__hidden = $bindable('not_hidden'), // hidden, not_hidden, all
rpt__limit = $bindable(150), rpt__limit = $bindable(150),
@@ -61,57 +61,105 @@ import Comp_event_file_obj_tbl from './../../ae_comp__event_file_obj_tbl_wrapper
let ae_promises: key_val = $state({}); let ae_promises: key_val = $state({});
let rpt__order_by_li: key_val = $state({});
let sort_option_kv: key_val = { let sort_option_kv: key_val = {
'created_on': { 'created_on': {
name: 'Created On', name: 'Created On',
field_kv: { field_kv: {
'email': 'ASC',
'given_name': 'ASC',
'family_name': 'ASC',
'updated_on': 'DESC',
'priority': 'DESC', 'priority': 'DESC',
'sort': 'DESC', 'sort': 'DESC',
'created_on': 'DESC', 'created_on': 'DESC',
'updated_on': 'DESC',
'filename': 'ASC',
'extension': 'ASC',
'hosted_file_size': 'ASC',
} }
}, },
'updated_on': { 'updated_on': {
name: 'Updated On', name: 'Updated On',
field_kv: { field_kv: {
'event_presentation_start_datetime': 'ASC',
'priority': 'DESC', 'priority': 'DESC',
'sort': 'DESC', 'sort': 'DESC',
'given_name': 'ASC',
'family_name': 'ASC',
'email': 'ASC',
'updated_on': 'DESC', 'updated_on': 'DESC',
'created_on': 'DESC', 'created_on': 'DESC',
'filename': 'ASC',
'extension': 'ASC',
'hosted_file_size': 'ASC',
} }
}, },
'filename': { 'filename_asc': {
name: 'Filename', name: 'Filename',
field_kv: { field_kv: {
'given_name': 'ASC', 'filename': 'ASC',
'family_name': 'ASC', 'extension': 'ASC',
'updated_on': 'DESC',
'priority': 'DESC', 'priority': 'DESC',
'sort': 'DESC', 'sort': 'DESC',
'email': 'ASC',
'created_on': 'DESC', 'created_on': 'DESC',
'updated_on': 'DESC',
} }
}, },
'extension': { 'filename_desc': {
name: 'Filename',
field_kv: {
'filename': 'DESC',
'extension': 'ASC',
'priority': 'DESC',
'sort': 'DESC',
'created_on': 'DESC',
'updated_on': 'DESC',
}
},
'file_type': {
name: 'Extension/Type', name: 'Extension/Type',
field_kv: { field_kv: {
'family_name': 'ASC', 'extension': 'ASC',
'given_name': 'ASC', 'filename': 'ASC',
'updated_on': 'DESC',
'priority': 'DESC', 'priority': 'DESC',
'sort': 'DESC', 'sort': 'DESC',
'email': 'ASC',
'created_on': 'DESC', 'created_on': 'DESC',
'updated_on': 'DESC',
} }
}, },
'file_size': {
name: 'File Size',
field_kv: {
'hosted_file_size': 'DESC',
'filename': 'ASC',
'extension': 'ASC',
'priority': 'DESC',
'sort': 'DESC',
'created_on': 'DESC',
'updated_on': 'DESC',
}
},
'start_datetime_asc': {
name: 'Start Date Time',
field_kv: {
'event_session_start_datetime': 'ASC',
'event_session_name': 'ASC',
'filename': 'ASC',
'extension': 'ASC',
'priority': 'DESC',
'sort': 'DESC',
'created_on': 'DESC',
'updated_on': 'DESC',
}
},
'start_datetime_desc': {
name: 'Start Date Time',
field_kv: {
'event_session_start_datetime': 'DESC',
'event_session_name': 'ASC',
'filename': 'ASC',
'extension': 'ASC',
'priority': 'DESC',
'sort': 'DESC',
'created_on': 'DESC',
'updated_on': 'DESC',
}
}
}; };
$effect(() => { $effect(() => {
@@ -120,6 +168,9 @@ $effect(() => {
console.log(`Report: ${rpt__name}; Triggered query for event files.`); console.log(`Report: ${rpt__name}; Triggered query for event files.`);
} }
qry__trigger = false; qry__trigger = false;
rpt__order_by_li = sort_option_kv[$events_loc.pres_mgmt.qry__files_sort]?.field_kv ?? sort_option_kv['created_on'].field_kv;
if (rpt__name == 'recent_files') { if (rpt__name == 'recent_files') {
handle_qry__event_file({ handle_qry__event_file({
created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds, created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds,
@@ -141,6 +192,17 @@ $effect(() => {
order_by_li: rpt__order_by_li, order_by_li: rpt__order_by_li,
log_lvl: log_lvl, log_lvl: log_lvl,
}); });
} else if (rpt__name == 'event_files') {
handle_qry__event_file({
created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds,
min_file_size: $events_loc.pres_mgmt.qry__files_min_size,
file_purpose: $events_loc.pres_mgmt.qry__file_purpose ?? null,
limit: rpt__limit,
order_by_li: rpt__order_by_li,
log_lvl: log_lvl,
});
} else {
console.log(`Unknown report name: ${rpt__name}`);
} }
} }
}); });
@@ -155,7 +217,7 @@ async function handle_qry__event_file(
enabled = rpt__hidden, enabled = rpt__hidden,
hidden = rpt__enabled, hidden = rpt__enabled,
limit = rpt__limit, limit = rpt__limit,
order_by_li = {'priority': 'DESC', 'sort': 'DESC', 'created_on': 'DESC', 'updated_on': 'DESC', 'filename': 'ASC', 'extension': 'ASC', 'hosted_file_size': 'ASC'}, order_by_li = rpt__order_by_li,
log_lvl = 0, log_lvl = 0,
}: { }: {
created_on_offset?: string | null, created_on_offset?: string | null,
@@ -306,7 +368,7 @@ async function handle_qry__event_file(
</h3> </h3>
<div class="flex flex-row items-center justify-center"> <div class="flex flex-row items-center justify-center">
<select <select
class="inline-block select text-sm px-1 w-40 m-1 ae_btn_info" class="inline-block select text-sm px-1 w-40 m-1 ae_btn_info"
bind:value={$events_loc.pres_mgmt.qry__files_offset_seconds} bind:value={$events_loc.pres_mgmt.qry__files_offset_seconds}
onchange={() => { onchange={() => {
@@ -388,29 +450,29 @@ async function handle_qry__event_file(
<!-- Max files select options --> <!-- Max files select options -->
<select <select
id="qry_limit__files" id="qry_limit__files"
bind:value={$events_loc.pres_mgmt.qry_limit__files} bind:value={$events_loc.pres_mgmt.qry_limit__files}
class="inline-block select text-sm px-1 w-40 m-1 ae_btn_info" class="inline-block select text-sm px-1 w-40 m-1 ae_btn_info"
onchange={() => { onchange={() => {
// handle_qry__event_file({ // handle_qry__event_file({
// created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds ?? 0, // created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds ?? 0,
// file_purpose: $events_loc.pres_mgmt.qry__file_purpose ?? null, // file_purpose: $events_loc.pres_mgmt.qry__file_purpose ?? null,
// limit: $events_loc.pres_mgmt.qry_limit__files ?? 100, // limit: $events_loc.pres_mgmt.qry_limit__files ?? 100,
// log_lvl: log_lvl, // log_lvl: log_lvl,
// }); // });
qry__trigger = true; qry__trigger = true;
$events_loc.pres_mgmt.show_report = 'recent_files'; $events_loc.pres_mgmt.show_report = 'recent_files';
}} }}
> >
<option value={0}>-- max not set --</option> <option value={0}>-- max not set --</option>
<option value={25}>25 files</option> <option value={25}>25 files</option>
<option value={50}>50 files</option> <option value={50}>50 files</option>
<option value={75}>75 files</option> <option value={75}>75 files</option>
<option value={100}>100 files</option> <option value={100}>100 files</option>
<option value={200}>200 files</option> <option value={200}>200 files</option>
<option value={500}>500 files</option> <option value={500}>500 files</option>
</select> </select>
</div> </div>
@@ -419,7 +481,7 @@ async function handle_qry__event_file(
<!-- Show large files --> <!-- Show large files -->
{#if rpt__name == 'large_files'} {#if rpt__name == 'event_files' || rpt__name == 'large_files'}
<header class="w-full flex flex-row flex-wrap items-center justify-center gap-1"> <header class="w-full flex flex-row flex-wrap items-center justify-center gap-1">
<h3 class="h4 text-center"> <h3 class="h4 text-center">
{#if qry__status == 'loading'} {#if qry__status == 'loading'}
@@ -428,11 +490,57 @@ async function handle_qry__event_file(
{:else} {:else}
<span class="fas fa-list m-1"></span> <span class="fas fa-list m-1"></span>
{/if} {/if}
Large File Uploads File Uploads
</h3> </h3>
<div class="flex flex-row items-center justify-center"> <div class="flex flex-row items-center justify-center">
<select
class="inline-block select text-sm px-1 w-40 m-1 ae_btn_info"
bind:value={$events_loc.pres_mgmt.qry__files_offset_seconds}
onchange={() => {
if ($events_loc.pres_mgmt?.qry__files_offset_seconds) {
// Calculate the datetime to pass based on the selected offset.
// let offset = $events_loc.pres_mgmt.qry__files_offset_seconds ?? 0;
// let created_on = new Date()
// console.log(`Created on:`, created_on);
// created_on.setSeconds(created_on.getSeconds() - offset);
// handle_qry__event_file({
// created_on_offset: $events_loc.pres_mgmt.qry__files_offset_seconds ?? 0,
// file_purpose: $events_loc.pres_mgmt.qry__file_purpose ?? null,
// log_lvl: log_lvl,
// });
qry__trigger = true;
} else {
console.log('No offset is will be used.');
// handle_qry__event_file({
// log_lvl: log_lvl,
// });
qry__trigger = true;
}
$events_loc.pres_mgmt.show_report = 'event_files';
}}
>
<option value="">-- offset not set --</option>
<option value="600">10 minutes</option>
<option value="1800">30 minutes</option>
<option value="3600">1 hour</option>
<option value="10800">2 hours</option>
<option value="21600">6 hours</option>
<option value="43200">12 hours</option>
<option value="86400">24 hours</option>
<option value="129600">36 hours</option>
<option value="172800">48 hours</option>
<option value="259200">72 hours</option>
<option value="604800">1 week</option>
<option value="1209600">2 weeks</option>
<option value="2419200">4 weeks</option>
<option value="7776000">12 weeks</option>
<option value="15552000">24 weeks</option>
</select>
<select <select
class="inline-block select text-sm w-40 px-1 m-1 ae_btn_info" class="inline-block select text-sm w-40 px-1 m-1 ae_btn_info"
bind:value={$events_loc.pres_mgmt.qry__files_min_size} bind:value={$events_loc.pres_mgmt.qry__files_min_size}
@@ -443,7 +551,7 @@ async function handle_qry__event_file(
// log_lvl: log_lvl, // log_lvl: log_lvl,
// }); // });
qry__trigger = true; qry__trigger = true;
$events_loc.pres_mgmt.show_report = 'large_files'; $events_loc.pres_mgmt.show_report = 'event_files';
}} }}
> >
<option value="">-- size not set --</option> <option value="">-- size not set --</option>
@@ -471,7 +579,7 @@ async function handle_qry__event_file(
// log_lvl: 1, // log_lvl: 1,
// }); // });
qry__trigger = true; qry__trigger = true;
$events_loc.pres_mgmt.show_report = 'large_files'; $events_loc.pres_mgmt.show_report = 'event_files';
}} }}
> >
<option <option
@@ -493,6 +601,50 @@ async function handle_qry__event_file(
{/each} {/each}
{/if} {/if}
</select> </select>
<label class="label text-sm">
<span class="fas fa-sort m-1"></span>
Sort by:
<select
class="inline-block select text-sm w-44 px-1 m-1 ae_btn_info"
bind:value={$events_loc.pres_mgmt.qry__files_sort}
onchange={(event) => {
if (event.target.value) {
// rpt__sort = event.target.value;
$events_loc.pres_mgmt.qry__files_sort = event.target.value;
} else {
// rpt__sort = 'created_on';
$events_loc.pres_mgmt.qry__files_sort = 'created_on';
}
// rpt__order_by_li = sort_option_kv[rpt__sort]?.field_kv ?? sort_option_kv['created_on'].field_kv;
rpt__order_by_li = sort_option_kv[$events_loc.pres_mgmt.qry__files_sort]?.field_kv ?? sort_option_kv['created_on'].field_kv;
// ae_promises.handle_search__event_presenter = handle_search__event_presenter({
// // ft_search_str: '',
// // lk_search_str: '',
// order_by_li: $events_loc.pres_mgmt.qry__presenter_order_by_li,
// log_lvl: log_lvl,
// });
qry__trigger = true;
$events_loc.pres_mgmt.show_report = 'event_files';
}}
>
<option value="created_on">Add/Uploaded On</option>
<option value="filename_asc">Filename ASC</option>
<option value="filename_desc">Filename DESC</option>
<option value="file_type">File Type/Ext</option>
<option value="file_size">File Size</option>
<option value="updated_on" class:hidden={!$ae_loc.administrator_access}>Updated On</option>
<option value="start_datetime_asc">Start Date Time ASC</option>
<option value="start_datetime_desc">Start Date Time DESC</option>
<!-- <option value="created_on">Created On</option> -->
<!-- <option value="sort">Sort</option> -->
<!-- <option value="priority">Priority</option> -->
</select>
</label>
</div> </div>
</header> </header>
{/if} {/if}

View File

@@ -166,7 +166,7 @@ async function handle_search__event_presenter(
enabled = rpt__hidden, enabled = rpt__hidden,
hidden = rpt__enabled, hidden = rpt__enabled,
limit = rpt__limit, limit = rpt__limit,
order_by_li = {'updated_on': 'DESC', 'priority': 'DESC', 'sort': 'DESC', 'given_name': 'ASC', 'family_name': 'ASC', 'email': 'ASC', 'created_on': 'DESC'}, order_by_li = rpt__order_by_li,
// params = { // params = {
// 'qry__enabled': $events_loc.pres_mgmt.qry_enabled ?? 'enabled', // 'qry__enabled': $events_loc.pres_mgmt.qry_enabled ?? 'enabled',
// 'qry__hidden': $events_loc.pres_mgmt.qry_hidden ?? 'not_hidden', // 'qry__hidden': $events_loc.pres_mgmt.qry_hidden ?? 'not_hidden',