From b9d70b616fdba4242285d18694f95428709eea87 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 10 Jun 2026 15:18:39 -0400 Subject: [PATCH] feat(reports): add two new filename format options to file downloads report Adds 'Session Code + Date + Time + Name' and 'Session Code + Date + Session Time + Presentation Time + Presenter Full Name' format presets. The second format uses presentation start datetime for the pres_time part and event_presenter_full_name for the full presenter name part. Co-Authored-By: Claude Sonnet 4.6 --- .../reports/reports_file_downloads.svelte | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_file_downloads.svelte b/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_file_downloads.svelte index bee44ee1..6c176f97 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_file_downloads.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_file_downloads.svelte @@ -75,28 +75,32 @@ type FormatKey = | 'session_code_date' | 'session_code_date_time' | 'session_code_date_name' + | 'session_code_date_time_name' | 'session_presenter' | 'session_date_presenter' | 'session_presentation_presenter' - | 'session_date_presentation_presenter'; + | 'session_date_presentation_presenter' + | 'session_date_stime_ptime_presenter_full'; const FORMAT_PRESETS: Record = { - original: { label: 'Original filename', group: 'Universal' }, - session_code: { label: 'Session Code', group: 'Session' }, - session_code_name: { label: 'Session Code + Name', group: 'Session' }, - session_code_date: { label: 'Session Code + Date', group: 'Session' }, - session_code_date_time: { label: 'Session Code + Date + Time', group: 'Session' }, - session_code_date_name: { label: 'Session Code + Date + Name', group: 'Session' }, - session_presenter: { label: 'Session Code + Presenter (Family, Given)', group: 'Presenter' }, - session_date_presenter: { label: 'Session Code + Date + Presenter', group: 'Presenter' }, - session_presentation_presenter: { label: 'Session Code + Presentation + Presenter', group: 'Presenter' }, - session_date_presentation_presenter: { label: 'Session Code + Date + Presentation + Presenter (Full)', group: 'Presenter' } + original: { label: 'Original filename', group: 'Universal' }, + session_code: { label: 'Session Code', group: 'Session' }, + session_code_name: { label: 'Session Code + Name', group: 'Session' }, + session_code_date: { label: 'Session Code + Date', group: 'Session' }, + session_code_date_time: { label: 'Session Code + Date + Time', group: 'Session' }, + session_code_date_name: { label: 'Session Code + Date + Name', group: 'Session' }, + session_code_date_time_name: { label: 'Session Code + Date + Time + Name', group: 'Session' }, + session_presenter: { label: 'Session Code + Presenter (Family, Given)', group: 'Presenter' }, + session_date_presenter: { label: 'Session Code + Date + Presenter', group: 'Presenter' }, + session_presentation_presenter: { label: 'Session Code + Presentation + Presenter', group: 'Presenter' }, + session_date_presentation_presenter: { label: 'Session Code + Date + Presentation + Presenter (Full)', group: 'Presenter' }, + session_date_stime_ptime_presenter_full: { label: 'Session Code + Date + Session Time + Presentation Time + Presenter Full', group: 'Presenter' } }; const FORMAT_GROUPS: Record = { Universal: ['original'], - Session: ['session_code', 'session_code_name', 'session_code_date', 'session_code_date_time', 'session_code_date_name'], - Presenter: ['session_presenter', 'session_date_presenter', 'session_presentation_presenter', 'session_date_presentation_presenter'] + Session: ['session_code', 'session_code_name', 'session_code_date', 'session_code_date_time', 'session_code_date_name', 'session_code_date_time_name'], + Presenter: ['session_presenter', 'session_date_presenter', 'session_presentation_presenter', 'session_date_presentation_presenter', 'session_date_stime_ptime_presenter_full'] }; let selected_format = $state('session_code_name'); @@ -113,25 +117,29 @@ function build_filename(file: any, fmt: FormatKey): string { // Preserve the original stem as-is; only the prefix/suffix are user-controlled. stem = file.filename_no_ext ?? (file.filename ?? 'file').replace(/\.[^.]+$/, ''); } else { - const session_code = clean_part(file.event_session_code); - const session_name = clean_part(file.event_session_name, 30); - const session_date = date_part(file.event_session_start_datetime); - const session_time = time_part(file.event_session_start_datetime); - const pres_name = clean_part(file.event_presentation_name ?? file.event_session_name, 25); - const fam = clean_part(file.event_presenter_family_name); - const given = clean_part(file.event_presenter_given_name); + const session_code = clean_part(file.event_session_code); + const session_name = clean_part(file.event_session_name, 30); + const session_date = date_part(file.event_session_start_datetime); + const session_time = time_part(file.event_session_start_datetime); + const pres_name = clean_part(file.event_presentation_name ?? file.event_session_name, 25); + const pres_time = time_part(file.event_presentation_start_datetime); + const fam = clean_part(file.event_presenter_family_name); + const given = clean_part(file.event_presenter_given_name); + const presenter_full = clean_part(file.event_presenter_full_name); let parts: string[]; switch (fmt) { - case 'session_code': parts = [session_code]; break; - case 'session_code_name': parts = [session_code, session_name]; break; - case 'session_code_date': parts = [session_code, session_date]; break; - case 'session_code_date_time': parts = [session_code, session_date, session_time]; break; - case 'session_code_date_name': parts = [session_code, session_date, session_name]; break; - case 'session_presenter': parts = [session_code, fam, given]; break; - case 'session_date_presenter': parts = [session_code, session_date, fam, given]; break; - case 'session_presentation_presenter': parts = [session_code, pres_name, fam, given]; break; - case 'session_date_presentation_presenter': parts = [session_code, session_date, pres_name, fam, given]; break; + case 'session_code': parts = [session_code]; break; + case 'session_code_name': parts = [session_code, session_name]; break; + case 'session_code_date': parts = [session_code, session_date]; break; + case 'session_code_date_time': parts = [session_code, session_date, session_time]; break; + case 'session_code_date_name': parts = [session_code, session_date, session_name]; break; + case 'session_code_date_time_name': parts = [session_code, session_date, session_time, session_name]; break; + case 'session_presenter': parts = [session_code, fam, given]; break; + case 'session_date_presenter': parts = [session_code, session_date, fam, given]; break; + case 'session_presentation_presenter': parts = [session_code, pres_name, fam, given]; break; + case 'session_date_presentation_presenter': parts = [session_code, session_date, pres_name, fam, given]; break; + case 'session_date_stime_ptime_presenter_full': parts = [session_code, session_date, session_time, pres_time, presenter_full]; break; default: stem = file.filename_no_ext ?? 'file'; return `${pre}${stem}${suf}.${ext}`; } stem = parts.filter(Boolean).join('_').replace(/_+/g, '_').replace(/^_|_$/, '');