From 2364c0edfbc14004e516dbb0502842f6a1229c96 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Tue, 16 Jun 2026 11:39:47 -0400 Subject: [PATCH] pres_mgmt: config schema cleanup phase 2 - Add show__session_qr + show__presenter_qr to PressMgmtRemoteCfg and sync function; QR toggles now gated on remote admin enable (trusted_access can still override) - Remove hide__launcher_link_legacy everywhere (Flask launcher fully retired) - Remove limit__options (YAGNI) - Implement limit__navigation: hides Session Search nav link for non-trusted users - Wire hide__report_kv into reports page: all 8 report tabs now use synced store with canonical slug names and edit_mode bypass; config UI now uses structured toggles instead of raw JSON textarea - Gate hide__launcher_link local toggle on show__launcher_link || trusted_access - Config UI: add show__session_qr + show__presenter_qr to opt-in features section - Menu opts: add Query Limits / Display & Search / Staff Options section labels - Bump AE_PRES_MGMT_LOC_VERSION to 2 (schema change forces localStorage reset) - svelte-check: 0 errors --- src/lib/ae_events/ae_events__event.ts | 10 +- .../ae_events_stores__pres_mgmt_defaults.ts | 13 +- src/lib/stores/store_versions.ts | 2 +- .../(pres_mgmt)/event_page_menu.svelte | 62 +++--- .../location_page_menu.svelte | 48 ++--- .../[event_location_id]/location_view.svelte | 18 +- .../(pres_mgmt)/pres_mgmt/+page.svelte | 1 - .../(pres_mgmt)/pres_mgmt/config/+page.svelte | 83 ++++---- .../[presenter_id]/presenter_page_menu.svelte | 33 ++-- .../(pres_mgmt)/reports/+page.svelte | 16 +- .../[session_id]/session_page_menu.svelte | 3 +- .../ae_comp__event_session_obj_li.svelte | 2 - ..._comp__event_session_obj_li_wrapper.svelte | 3 - .../events/ae_comp__events_menu_opts.svelte | 183 ++++++++---------- 14 files changed, 204 insertions(+), 273 deletions(-) diff --git a/src/lib/ae_events/ae_events__event.ts b/src/lib/ae_events/ae_events__event.ts index d1a86f44..81c6e1ba 100644 --- a/src/lib/ae_events/ae_events__event.ts +++ b/src/lib/ae_events/ae_events__event.ts @@ -1054,14 +1054,16 @@ export function sync_config__event_pres_mgmt({ // Launcher links (show__ in remote → invert to hide__ in local display state) loc.hide__launcher_link = !(pres_mgmt_cfg_remote?.show__launcher_link ?? false); - // Legacy Flask launcher is retired — always hide regardless of remote config - loc.hide__launcher_link_legacy = true; + + // QR code sections (off by default; admin enables per-event) + loc.show__session_qr = + pres_mgmt_cfg_remote?.show__session_qr ?? false; + loc.show__presenter_qr = + pres_mgmt_cfg_remote?.show__presenter_qr ?? false; // Navigation / UI constraints loc.limit__navigation = pres_mgmt_cfg_remote?.limit__navigation ?? false; - loc.limit__options = - pres_mgmt_cfg_remote?.limit__options ?? false; } } diff --git a/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts b/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts index 5eb29716..13e233e3 100644 --- a/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts +++ b/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts @@ -58,6 +58,10 @@ export interface PressMgmtRemoteCfg { // (the overall "is POC used at all" master switch) — that one wins if set, // see sync_config__event_pres_mgmt() and the session list wrapper usages. show__session_li_poc_field: boolean; + // QR code sections (off by default; Trusted Access users can override locally + // if the admin has enabled the feature for the event) + show__session_qr: boolean; + show__presenter_qr: boolean; // Requirements require__presenter_agree: boolean; @@ -65,7 +69,6 @@ export interface PressMgmtRemoteCfg { // Navigation / UI constraints limit__navigation: boolean; - limit__options: boolean; // File upload options (null = use system default) file_purpose_option_kv: Record< @@ -157,7 +160,6 @@ export interface PresMgmtLocState { // (overwritten when lock_config=true), see sync_config__event_pres_mgmt(). show__session_li_poc_field: boolean; // Launcher/location links in session list - hide__launcher_link_legacy: boolean; // Flask/legacy launcher hide__launcher_link: boolean; // SvelteKit launcher hide__location_link: boolean; show__direct_download: boolean; @@ -201,10 +203,11 @@ export interface PresMgmtLocState { show__copy_access_link: boolean; show__email_access_link: boolean; show__launcher_link: boolean; + show__session_qr: boolean; + show__presenter_qr: boolean; require__presenter_agree: boolean; require__session_agree: boolean; limit__navigation: boolean; - limit__options: boolean; file_purpose_option_kv: Record< string, { name: string; disabled?: boolean; hidden?: boolean } @@ -336,7 +339,6 @@ export const pres_mgmt_loc_defaults: PresMgmtLocState = { hide__locations_msg: false, hide__session_li_location_field: false, show__session_li_poc_field: false, - hide__launcher_link_legacy: true, hide__launcher_link: true, hide__location_link: true, show__direct_download: false, @@ -378,10 +380,11 @@ export const pres_mgmt_loc_defaults: PresMgmtLocState = { show__copy_access_link: false, show__email_access_link: false, show__launcher_link: false, + show__session_qr: false, + show__presenter_qr: false, require__presenter_agree: false, require__session_agree: false, limit__navigation: false, - limit__options: false, file_purpose_option_kv: null, hide__report_kv: {} }; diff --git a/src/lib/stores/store_versions.ts b/src/lib/stores/store_versions.ts index d26d6c3e..d46d6b3a 100644 --- a/src/lib/stores/store_versions.ts +++ b/src/lib/stores/store_versions.ts @@ -33,7 +33,7 @@ export const AE_LOC_VERSION = 2; // Bumped 2026-03-30: force-clear stale site_cfg_json (novi_idaa_api_key missing bug) export const AE_EVENTS_LOC_VERSION = 1; export const AE_IDAA_LOC_VERSION = 2; // Bumped 2026-05-18: change default qry__limit from 150 to 100 -export const AE_PRES_MGMT_LOC_VERSION = 1; // Added 2026-04-02: new standalone PersistedState store +export const AE_PRES_MGMT_LOC_VERSION = 2; // Bumped 2026-06-16: added show__session_qr / show__presenter_qr; removed limit__options + hide__launcher_link_legacy (Flask launcher retired) export const AE_BADGES_LOC_VERSION = 1; // Added 2026-04-02: promoted from events_loc.badges export const AE_LEADS_LOC_VERSION = 1; // Added 2026-04-03: promoted from events_loc.leads diff --git a/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte b/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte index d0c0bde0..9f70065b 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/event_page_menu.svelte @@ -214,45 +214,29 @@ async function on_delete(method: 'delete' | 'disable') { - - - + + {#if pres_mgmt_loc.current.show__launcher_link || $ae_loc.trusted_access} + + {/if} - - + + {/if} {#if sections.navigation} -
+
+

Hides the Session Search link for non-staff users, keeping presenters within their assigned session.

-
{/if} @@ -564,20 +544,33 @@ function toggle(key: string) { {#if sections.reports}
-
- - JSON object: key = report slug, value = true to hide that report section. - e.g. { "session_no_bio": true } -
- - {#if report_kv_json_error} -

{report_kv_json_error}

- {/if} +

Hidden reports are not shown to staff unless in edit mode.

+ {#each [ + { slug: 'session_no_files', label: 'Sessions without Files' }, + { slug: 'sessions_poc_agree', label: 'Session POC Agreement' }, + { slug: 'session_no_bio', label: 'Session POC Bios' }, + { slug: 'presenters_agree', label: 'Presenter Agreement' }, + { slug: 'presenters_biography', label: 'Presenter Bios' }, + { slug: 'presenters_overview', label: 'Presenter Overview' }, + { slug: 'event_files', label: 'Event Files' }, + { slug: 'file_downloads', label: 'File Downloads' } + ] as rpt (rpt.slug)} + + {/each}
{/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_page_menu.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_page_menu.svelte index 59423493..4b054220 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_page_menu.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_page_menu.svelte @@ -75,7 +75,8 @@ async function on_delete(method: 'delete' | 'disable') { $ae_loc.trusted_access} events__session_id={$lq__event_presenter_obj?.event_session_id} events__launcher_session_id={$lq__event_presenter_obj?.event_session_id} - events__session_search={$events_slct.event_id} /> + events__session_search={$events_slct.event_id && + (!pres_mgmt_loc.current.limit__navigation || $ae_loc.trusted_access)} />
@@ -181,20 +182,22 @@ async function on_delete(method: 'delete' | 'disable') { Display
- + {#if pres_mgmt_loc.current.show__presenter_qr || $ae_loc.trusted_access} + + {/if}
{/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/reports/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/reports/+page.svelte index d72383f3..e64729e2 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/reports/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/reports/+page.svelte @@ -167,6 +167,7 @@ $effect(() => { pres_mgmt_loc.current.show_report = 'session_no_files'; }} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" + class:hidden={pres_mgmt_loc.current.hide__report_kv['session_no_files'] && !$ae_loc.edit_mode} title="Toggle to show sessions with and without files uploaded."> {#if pres_mgmt_loc.current.show_report == 'session_no_files' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} @@ -216,8 +217,7 @@ $effect(() => { ae_triggers.rpt__event_sessions = true; pres_mgmt_loc.current.show_report = 'session_no_bio'; }} - class:hidden={$lq__event_obj?.mod_pres_mgmt_json - ?.hide__report_kv.session_no_bio && !$ae_loc.edit_mode} + class:hidden={(pres_mgmt_loc.current.hide__report_kv['session_no_bio'] && !$ae_loc.edit_mode)} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" title="Show sessions without POC bios."> {#if pres_mgmt_loc.current.show_report == 'session_no_bio' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} @@ -263,8 +263,7 @@ $effect(() => { ae_triggers.rpt__event_presenters = true; pres_mgmt_loc.current.show_report = 'presenters_biography'; }} - class:hidden={$lq__event_obj?.mod_pres_mgmt_json - ?.hide__report_kv.presenter_no_bio && !$ae_loc.edit_mode} + class:hidden={(pres_mgmt_loc.current.hide__report_kv['presenters_biography'] && !$ae_loc.edit_mode)} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" title="Show presenters with bios."> {#if pres_mgmt_loc.current.show_report == 'presenters_biography' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} @@ -283,8 +282,7 @@ $effect(() => { ae_triggers.rpt__event_presenters = true; pres_mgmt_loc.current.show_report = 'presenters_overview'; }} - class:hidden={$lq__event_obj?.mod_pres_mgmt_json - ?.hide__report_kv.presenter_overview} + class:hidden={(pres_mgmt_loc.current.hide__report_kv['presenters_overview'] && !$ae_loc.edit_mode)} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" title="Show overview of presenters' statuses. (A work in progress for LCI)"> {#if pres_mgmt_loc.current.show_report == 'presenters_overview' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} @@ -304,8 +302,7 @@ $effect(() => { ae_triggers.rpt__event_files = true; pres_mgmt_loc.current.show_report = 'event_files'; }} - class:hidden={$lq__event_obj?.mod_pres_mgmt_json - ?.hide__report_kv.event_files} + class:hidden={(pres_mgmt_loc.current.hide__report_kv['event_files'] && !$ae_loc.edit_mode)} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" 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'} @@ -322,8 +319,7 @@ $effect(() => { ae_triggers.rpt__file_downloads = true; pres_mgmt_loc.current.show_report = 'file_downloads'; }} - class:hidden={$lq__event_obj?.mod_pres_mgmt_json - ?.hide__report_kv.file_downloads} + class:hidden={(pres_mgmt_loc.current.hide__report_kv['file_downloads'] && !$ae_loc.edit_mode)} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" title="File Downloads — download files grouped by session and presenter with clean filename options."> {#if pres_mgmt_loc.current.show_report == 'file_downloads' && $events_sess.pres_mgmt.status_rpt.file_downloads == 'loading'} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_page_menu.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_page_menu.svelte index 7d7b66c1..7e05e74c 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_page_menu.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/session_page_menu.svelte @@ -83,7 +83,8 @@ async function toggle_hide_launcher() { event_id={$lq__event_session_obj?.event_id} events__reports={$lq__event_session_obj?.event_id && $ae_loc.trusted_access} - events__session_search={$lq__event_session_obj?.event_id} + events__session_search={$lq__event_session_obj?.event_id && + (!pres_mgmt_loc.current.limit__navigation || $ae_loc.trusted_access)} events__launcher_id={$lq__event_session_obj?.event_location_id && $ae_loc.administrator_access ? $lq__event_session_obj?.event_location_id diff --git a/src/routes/events/ae_comp__event_session_obj_li.svelte b/src/routes/events/ae_comp__event_session_obj_li.svelte index 96698756..6beccc9e 100644 --- a/src/routes/events/ae_comp__event_session_obj_li.svelte +++ b/src/routes/events/ae_comp__event_session_obj_li.svelte @@ -7,7 +7,6 @@ interface Props { hide__session_location?: boolean; hide__session_poc?: boolean; hide__admin?: boolean; - hide__launcher_link_legacy?: boolean; hide__launcher_link?: boolean; hide__location_link?: boolean; show__session_files?: boolean; @@ -22,7 +21,6 @@ let { hide__session_location = $bindable(false), hide__session_poc = $bindable(false), hide__admin = $bindable(false), - hide__launcher_link_legacy = $bindable(false), hide__launcher_link = $bindable(false), hide__location_link = $bindable(false), show__session_files = $bindable(false), diff --git a/src/routes/events/ae_comp__event_session_obj_li_wrapper.svelte b/src/routes/events/ae_comp__event_session_obj_li_wrapper.svelte index c5f13463..a9042bd6 100644 --- a/src/routes/events/ae_comp__event_session_obj_li_wrapper.svelte +++ b/src/routes/events/ae_comp__event_session_obj_li_wrapper.svelte @@ -8,7 +8,6 @@ interface Props { hide__session_location?: boolean; hide__session_poc?: boolean; hide__admin?: boolean; - hide__launcher_link_legacy?: boolean; hide__launcher_link?: boolean; hide__location_link?: boolean; log_lvl?: number; @@ -23,7 +22,6 @@ let { hide__session_location = $bindable(false), hide__session_poc = $bindable(false), hide__admin = $bindable(false), - hide__launcher_link_legacy = $bindable(false), hide__launcher_link = $bindable(false), hide__location_link = $bindable(false), log_lvl = 0 @@ -62,7 +60,6 @@ let lq__event_session_obj_li = $derived.by(() => { {hide__session_location} {hide__session_poc} {hide__admin} - {hide__launcher_link_legacy} {hide__launcher_link} {hide__location_link} {log_lvl}> diff --git a/src/routes/events/ae_comp__events_menu_opts.svelte b/src/routes/events/ae_comp__events_menu_opts.svelte index fc11dd95..358d2d76 100644 --- a/src/routes/events/ae_comp__events_menu_opts.svelte +++ b/src/routes/events/ae_comp__events_menu_opts.svelte @@ -76,6 +76,7 @@ import { class:hidden={!pres_mgmt_loc.current.expand__menu_opts}> {#if $ae_loc.authenticated_access}
+

Query Limits

+

Display & Search

+

Staff Options

{#if $ae_loc.trusted_access}
{#if pres_mgmt_loc.current.show__copy_access_link} @@ -390,64 +393,68 @@ import { {#if $ae_loc.authenticated_access}
- {#if pres_mgmt_loc.current.show_content__session_qr} - - {:else} - + {#if pres_mgmt_loc.current.show__session_qr || $ae_loc.trusted_access} + {#if pres_mgmt_loc.current.show_content__session_qr} + + {:else} + + {/if} {/if} - {#if pres_mgmt_loc.current.show_content__presenter_qr} - - {:else} - + {#if pres_mgmt_loc.current.show__presenter_qr || $ae_loc.trusted_access} + {#if pres_mgmt_loc.current.show_content__presenter_qr} + + {:else} + + {/if} {/if}
{/if} @@ -455,47 +462,29 @@ import { {#if $ae_loc.authenticated_access}
- - - - - + + {#if pres_mgmt_loc.current.show__launcher_link || $ae_loc.trusted_access} + + {/if}