From fd9e5f6dc0f086c7200d872d67ebec736b59194f Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 2 Apr 2026 15:27:12 -0400 Subject: [PATCH] pres_mgmt: migrate to typed PersistedState store, canonical config schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces untyped $events_loc.pres_mgmt (svelte-persisted-store) with a dedicated pres_mgmt_loc (runed PersistedState) backed by a fully typed PresMgmtLocState interface and PressMgmtRemoteCfg for the server-side JSON. Key changes: - ae_events_stores__pres_mgmt_defaults.ts: canonical interfaces + defaults covering all hide__/show__ fields, labels, report prefs, query filters, and lock_config sync fields; qry_enabled uses 'not_enabled' (matches API) - ae_events_stores__pres_mgmt.svelte.ts: new PersistedState store - ae_events__event.ts: sync_config__event_pres_mgmt() rewired to write directly to pres_mgmt_loc.current; launcher link inversion preserved - All 26+ pres_mgmt templates migrated from $events_loc.pres_mgmt.* to pres_mgmt_loc.current.* - New config UI at (pres_mgmt)/pres_mgmt/config/ — manager + edit mode only - Event settings page: removed embedded pres_mgmt form, links to config page - event_page_menu: Config button visible only when manager_access + edit_mode Co-Authored-By: Claude Sonnet 4.6 --- src/lib/ae_events/ae_events__event.ts | 138 +++-- .../ae_events_stores__pres_mgmt.svelte.ts | 18 + .../ae_events_stores__pres_mgmt_defaults.ts | 318 +++++++--- src/lib/stores/store_versions.ts | 5 + .../ae_comp__event_device_obj_li.svelte | 28 +- .../(pres_mgmt)/event_page_menu.svelte | 80 +-- .../location/[event_location_id]/+page.svelte | 5 +- .../location_page_menu.svelte | 53 +- .../[event_location_id]/location_view.svelte | 15 +- .../(pres_mgmt)/locations/+page.svelte | 3 +- .../ae_comp__event_location_obj_li.svelte | 38 +- .../locations/locations_page_menu.svelte | 59 +- .../(pres_mgmt)/pres_mgmt/+page.svelte | 110 ++-- .../(pres_mgmt)/pres_mgmt/config/+page.svelte | 584 ++++++++++++++++++ .../presenter/[presenter_id]/+page.svelte | 22 +- .../[presenter_id]/presenter_page_menu.svelte | 19 +- .../[presenter_id]/presenter_view.svelte | 10 +- .../ae_comp__event_presenter_obj_li.svelte | 3 +- .../(pres_mgmt)/reports/+page.svelte | 87 +-- .../reports/event_reports_page_menu.svelte | 44 +- .../(pres_mgmt)/reports/reports_files.svelte | 72 +-- .../reports/reports_presenters.svelte | 27 +- .../reports/reports_sessions.svelte | 43 +- .../session/[session_id]/+page.svelte | 24 +- ..._comp__event_session_poc_form_agree.svelte | 8 +- .../ae_comp__event_session_poc_profile.svelte | 13 +- .../session/[session_id]/session_view.svelte | 15 +- .../events/[event_id]/settings/+page.svelte | 72 +-- .../ae_comp__event_presentation_obj_li.svelte | 30 +- .../ae_comp__event_session_obj_li.svelte | 5 +- .../events/ae_comp__events_menu_opts.svelte | 139 +++-- 31 files changed, 1426 insertions(+), 661 deletions(-) create mode 100644 src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts create mode 100644 src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/config/+page.svelte diff --git a/src/lib/ae_events/ae_events__event.ts b/src/lib/ae_events/ae_events__event.ts index f88bc03f..468828d7 100644 --- a/src/lib/ae_events/ae_events__event.ts +++ b/src/lib/ae_events/ae_events__event.ts @@ -1,5 +1,7 @@ import type { key_val } from '$lib/stores/ae_stores'; import { api } from '$lib/api/api'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; +import type { PressMgmtRemoteCfg } from '$lib/stores/ae_events_stores__pres_mgmt_defaults'; import { db_save_ae_obj_li__ae_obj } from '$lib/ae_core/core__idb_dexie'; import { db_events } from '$lib/ae_events/db_events'; @@ -944,83 +946,117 @@ export async function process_ae_obj__event_props({ }); } +/** + * sync_config__event_pres_mgmt + * + * Syncs the server-side event pres_mgmt config (mod_pres_mgmt_json) into the + * local PersistedState store (pres_mgmt_loc.current). + * + * Called reactively in pres_mgmt/+page.svelte whenever the event object changes. + * + * Always-synced fields: labels, requirements, access links, file config. + * Lock-synced fields (only when lock_config=true): all visibility/hide__ toggles, + * launcher links, navigation limits. This prevents presenter laptops from + * drifting into different display configs across a conference. + * + * Canonical key convention (enforced here): + * hide__* → feature ON by default; true = turn off (default: false = visible) + * show__* → feature OFF by default; true = turn on (default: false = hidden) + */ export function sync_config__event_pres_mgmt({ pres_mgmt_cfg_remote, - pres_mgmt_cfg_local, log_lvl = 0 }: { - pres_mgmt_cfg_remote: key_val; - pres_mgmt_cfg_local: key_val; + pres_mgmt_cfg_remote: Partial; log_lvl?: number; }) { if (log_lvl) { console.log( - `*** sync_config__event_pres_mgmt() *** pres_mgmt_cfg_remote:`, + `*** sync_config__event_pres_mgmt() *** remote:`, pres_mgmt_cfg_remote ); } - pres_mgmt_cfg_local.label__person_external_id = + const loc = pres_mgmt_loc.current; + + // --- Always sync: labels, requirements, opt-in features, file config --- + // These are safe to always apply — they don't override local display preferences. + loc.label__person_external_id = pres_mgmt_cfg_remote?.label__person_external_id ?? 'External ID'; - pres_mgmt_cfg_local.label__presenter_external_id = + loc.label__presenter_external_id = pres_mgmt_cfg_remote?.label__presenter_external_id ?? 'External ID'; - pres_mgmt_cfg_local.label__session_poc_type = + loc.label__session_poc_type = pres_mgmt_cfg_remote?.label__session_poc_type ?? 'poc'; - pres_mgmt_cfg_local.label__session_poc_name = - pres_mgmt_cfg_remote?.label__session_poc_name_short ?? 'POC'; - pres_mgmt_cfg_local.label__session_poc_name = + loc.label__session_poc_name = pres_mgmt_cfg_remote?.label__session_poc_name ?? 'Point of Contact'; - pres_mgmt_cfg_local.hide__session_poc = - pres_mgmt_cfg_remote?.hide__session_poc ?? false; - pres_mgmt_cfg_local.require__presenter_agree = + + loc.require__presenter_agree = pres_mgmt_cfg_remote?.require__presenter_agree ?? false; - pres_mgmt_cfg_local.require__session_agree = + loc.require__session_agree = pres_mgmt_cfg_remote?.require__session_agree ?? false; - pres_mgmt_cfg_local.show__copy_access_link = + + loc.show__copy_access_link = pres_mgmt_cfg_remote?.show__copy_access_link ?? false; - pres_mgmt_cfg_local.show__email_access_link = + loc.show__email_access_link = pres_mgmt_cfg_remote?.show__email_access_link ?? false; - pres_mgmt_cfg_local.file_purpose_option_kv = + + loc.file_purpose_option_kv = pres_mgmt_cfg_remote?.file_purpose_option_kv ?? null; - if (pres_mgmt_cfg_local.lock_config) { - console.log(`The config should be locked! Forcing the sync!`); - pres_mgmt_cfg_local.sync_local_config = true; - } + loc.hide__report_kv = pres_mgmt_cfg_remote?.hide__report_kv ?? {}; - if (pres_mgmt_cfg_local?.sync_local_config) { - pres_mgmt_cfg_local.hide__location_code = + // --- Lock-synced: visibility, launcher, navigation, session/presenter fields --- + // When lock_config=true the remote config wins for ALL display flags, preventing + // local browser state from overriding the admin's event-level configuration. + if (pres_mgmt_cfg_remote?.lock_config) { + if (log_lvl) console.log(`sync_config__event_pres_mgmt: lock_config=true, forcing full sync`); + + // Codes + loc.hide__location_code = pres_mgmt_cfg_remote?.hide__location_code ?? false; - pres_mgmt_cfg_local.hide__presentation_code = + loc.hide__presentation_code = pres_mgmt_cfg_remote?.hide__presentation_code ?? false; - pres_mgmt_cfg_local.hide__presentation_datetime = - pres_mgmt_cfg_remote?.hide__presentation_datetime ?? false; - pres_mgmt_cfg_local.show_content__presentation_description = - pres_mgmt_cfg_remote?.show_content__presentation_description ?? - false; - pres_mgmt_cfg_local.hide__presenter_code = + loc.hide__presenter_code = pres_mgmt_cfg_remote?.hide__presenter_code ?? false; - pres_mgmt_cfg_local.hide__presenter_biography = - pres_mgmt_cfg_remote?.hide__presenter_biography ?? false; - pres_mgmt_cfg_local.hide__session_code = + loc.hide__session_code = pres_mgmt_cfg_remote?.hide__session_code ?? false; - pres_mgmt_cfg_local.hide__session_description = - pres_mgmt_cfg_remote?.hide__session_description ?? false; - pres_mgmt_cfg_local.hide__session_location = - pres_mgmt_cfg_remote?.hide__session_location ?? false; - pres_mgmt_cfg_local.hide__session_msg = - pres_mgmt_cfg_remote?.hide__session_msg ?? false; - pres_mgmt_cfg_local.hide__session_poc_profile = - pres_mgmt_cfg_remote?.hide__session_poc_profile ?? false; - pres_mgmt_cfg_local.hide__session_poc_biography = - pres_mgmt_cfg_remote?.hide__session_poc_biography ?? false; - pres_mgmt_cfg_local.hide__session_poc_profile_pic = - pres_mgmt_cfg_remote?.hide__session_poc_profile_pic ?? false; - pres_mgmt_cfg_local.hide_launcher_link = - pres_mgmt_cfg_remote?.hide_launcher_link ?? false; - pres_mgmt_cfg_local.hide_launcher_link_legacy = - pres_mgmt_cfg_remote?.hide_launcher_link_legacy ?? false; - } - return pres_mgmt_cfg_local; + // Session fields + loc.hide__session_description = + pres_mgmt_cfg_remote?.hide__session_description ?? false; + loc.hide__session_location = + pres_mgmt_cfg_remote?.hide__session_location ?? false; + loc.hide__session_msg = + pres_mgmt_cfg_remote?.hide__session_msg ?? false; + loc.hide__session_poc = + pres_mgmt_cfg_remote?.hide__session_poc ?? false; + loc.hide__session_poc_biography = + pres_mgmt_cfg_remote?.hide__session_poc_biography ?? false; + loc.hide__session_poc_profile = + pres_mgmt_cfg_remote?.hide__session_poc_profile ?? false; + loc.hide__session_poc_profile_pic = + pres_mgmt_cfg_remote?.hide__session_poc_profile_pic ?? false; + + // Presenter fields + loc.hide__presenter_biography = + pres_mgmt_cfg_remote?.hide__presenter_biography ?? false; + + // Presentation fields + loc.hide__presentation_datetime = + pres_mgmt_cfg_remote?.hide__presentation_datetime ?? false; + loc.hide__presentation_description = + pres_mgmt_cfg_remote?.hide__presentation_description ?? false; + + // Launcher links (show__ in remote → invert to hide__ in local display state) + loc.hide__launcher_link = + !(pres_mgmt_cfg_remote?.show__launcher_link ?? false); + loc.hide__launcher_link_legacy = + !(pres_mgmt_cfg_remote?.show__launcher_link_legacy ?? 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.svelte.ts b/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts new file mode 100644 index 00000000..67815c12 --- /dev/null +++ b/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts @@ -0,0 +1,18 @@ +/** + * ae_events_stores__pres_mgmt.svelte.ts + * + * Svelte 5 PersistedState store for Presentation Management local config. + * Replaces the `events_loc.pres_mgmt` sub-object from the Svelte 4 persisted store. + * + * localStorage key: 'ae_pres_mgmt_loc' + * Version gate: AE_PRES_MGMT_LOC_VERSION in store_versions.ts + * + * Usage: + * import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; + * pres_mgmt_loc.current.hide__session_code // read + * pres_mgmt_loc.current.hide__session_code = true // write + */ +import { PersistedState } from 'runed'; +import { pres_mgmt_loc_defaults } from './ae_events_stores__pres_mgmt_defaults'; + +export const pres_mgmt_loc = new PersistedState('ae_pres_mgmt_loc', pres_mgmt_loc_defaults); 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 d5a1a8c5..74f80348 100644 --- a/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts +++ b/src/lib/stores/ae_events_stores__pres_mgmt_defaults.ts @@ -1,19 +1,95 @@ /** * ae_events_stores__pres_mgmt_defaults.ts * - * Default state for the pres_mgmt (Presentation Management) section of ae_events_stores.ts. - * pres_mgmt_loc_defaults → events_loc.pres_mgmt (persisted to localStorage) - * pres_mgmt_sess_defaults → events_sess.pres_mgmt (in-memory, resets on page load) + * Type definitions and defaults for the Pres Mgmt stores. + * + * PressMgmtRemoteCfg → shape of event.mod_pres_mgmt_json (server-side admin config) + * PresMgmtLocState → pres_mgmt_loc (PersistedState, localStorage) + * PresMgmtSessState → events_sess.pres_mgmt (in-memory, resets on page load) + * + * NAMING CONVENTION (enforced here, must not mix): + * hide__* → feature is ON by default; true = turn it off (default: false = visible) + * show__* → feature is OFF by default; true = turn it on (default: false = hidden) + * Never use both hide__foo and show__foo for the same concept. */ +// --------------------------------------------------------------------------- +// Remote config — shape of event.mod_pres_mgmt_json +// This is the admin-controlled, server-side config for an event. +// lock_config: true forces every field below to sync into local state on load. +// --------------------------------------------------------------------------- +export interface PressMgmtRemoteCfg { + // System + lock_config: boolean; // true = force all fields below into local state + + // Labels — event-specific terminology overrides + label__person_external_id: string | null; // default: 'External ID' + label__presenter_external_id: string | null; // default: 'External ID' + label__session_poc_type: string | null; // e.g. 'champion', 'poc' + label__session_poc_name: string | null; // e.g. 'Champion', 'Point of Contact' + + // Code visibility (visible by default) + hide__location_code: boolean; + hide__presentation_code: boolean; + hide__presenter_code: boolean; + hide__session_code: boolean; + + // Session field visibility (visible by default) + hide__session_description: boolean; + hide__session_location: boolean; + hide__session_msg: boolean; + hide__session_poc: boolean; + hide__session_poc_biography: boolean; + hide__session_poc_profile: boolean; + hide__session_poc_profile_pic: boolean; + + // Presenter field visibility + hide__presenter_biography: boolean; + + // Presentation field visibility + hide__presentation_datetime: boolean; + hide__presentation_description: boolean; // replaces show_content__presentation_description + + // Opt-in features (hidden by default — set true to enable) + show__copy_access_link: boolean; + show__email_access_link: boolean; + show__launcher_link: boolean; + show__launcher_link_legacy: boolean; + + // Requirements + require__presenter_agree: boolean; + require__session_agree: boolean; + + // Navigation / UI constraints + limit__navigation: boolean; + limit__options: boolean; + + // File upload options (null = use system default) + file_purpose_option_kv: Record< + string, + { name: string; disabled?: boolean; hidden?: boolean } + > | null; + + // Report section visibility (key = report slug, true = hide that report) + hide__report_kv: Record; +} + +// --------------------------------------------------------------------------- +// Local state — persisted to localStorage via PersistedState ('ae_pres_mgmt_loc') +// Contains both user preferences AND fields synced from PressMgmtRemoteCfg. +// Fields synced from remote are overwritten on every event load when lock_config=true. +// --------------------------------------------------------------------------- export interface PresMgmtLocState { + // --- System / lock state (mirrored from remote for display) --- sync_local_config: boolean; lock_config: boolean; + + // --- Query / search preferences --- datetime_format: string; time_format: string; time_hours: 12 | 24; - qry_enabled: string; // 'all' | 'disabled' | 'enabled' - qry_hidden: string; // 'all' | 'hidden' | 'not_hidden' + qry_enabled: 'all' | 'not_enabled' | 'enabled'; + qry_hidden: 'all' | 'hidden' | 'not_hidden'; qry_limit__files: number; qry_limit__presentations: number; qry_limit__presenters: number; @@ -26,11 +102,29 @@ export interface PresMgmtLocState { qry_and__file_count: boolean; save_search_text: boolean; saved_search__session: string | null; - require__presenter_agree: boolean; - require__session_agree: boolean; + saved_search__session_location_name: string | null; + fulltext_search_qry_str: string | null; // persisted search text (when save_search_text=true) + location_name_qry_str: string | null; // persisted location filter text + refresh_interval: number; // auto-refresh interval in seconds (0 = disabled) + + // --- Report display preferences (user-controlled, persisted) --- + rpt__session_no_files: boolean; // show "sessions with no files" report section + rpt__session_poc_agree: boolean; // show "session POC agreement" report section + rpt__session_no_bio: boolean; // show "sessions with no bio" report section + rpt__presenter_agree: boolean; // show "presenter agreement" report section + qry__file_purpose: string | null; // filter report files by purpose slug + qry__files_min_size: number | null; // filter report files by minimum size (bytes) + qry__session_sort: string; // sort order for session report + qry__presenter_sort: string; // sort order for presenter report + + // --- Content / panel visibility (user preferences) --- + expand__menu_opts: boolean; + show_content__device_description: boolean; show_content__event_view: string | null; + show_content__location_description: boolean; + show_content__location_devices_sessions: 'sessions' | 'devices' | null; show_content__location_qr: boolean; - show_content__presentation_description: boolean; + show_content__presentation_description: boolean; // per-presentation expand toggle show_content__presenter_page_help: boolean; show_content__presenter_view: string | null; show_content__presenter_qr: boolean; @@ -43,34 +137,77 @@ export interface PresMgmtLocState { show_content__session_search_room_name: boolean; show_content__session_view: string | null; show_content__session_qr: boolean; - hide__session_code: boolean; - hide__session_msg: boolean; - hide__session_poc: boolean; - hide__session_poc_biography: boolean; - hide__presenter_biography: boolean; - hide__session_li_location_field: boolean; - show__session_li_poc_field: boolean; - hide__launcher_link_legacy: boolean; - hide__launcher_link: boolean; - hide__location_link: boolean; show_content__disabled_files: boolean; show_content__hidden_files: boolean; show_content__hidden_presentations: boolean; show_content__hidden_presenters: boolean; show_content__hidden_sessions: boolean; + + // --- List/table column visibility (user preferences) --- + hide__device_code: boolean; + hide__locations_msg: boolean; + hide__session_li_location_field: boolean; + 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; - // null = use server-side default. + + // --- Menu visibility (null = use server-side default) --- show_menu__presenter: boolean | null; show_menu__session: boolean | null; show_menu__session_search: boolean | null; show_menu__event_reports: boolean | null; show_report: string | null; + + // --- Opt-out toggles --- disable_submit__opt_out: boolean; submit_status__opt_out: string | null; + + // --- Device/location scratch space --- device_kv: Record; location_kv: Record; + + // --- Synced from PressMgmtRemoteCfg (overwritten by sync_config__event_pres_mgmt) --- + // These mirror PressMgmtRemoteCfg fields and are written during event load. + // Do not set these manually — they will be overridden when lock_config=true. + label__person_external_id: string; + label__presenter_external_id: string; + label__session_poc_type: string; + label__session_poc_name: string; + hide__location_code: boolean; + hide__presentation_code: boolean; + hide__presentation_datetime: boolean; + hide__presentation_description: boolean; + hide__presenter_code: boolean; + hide__presenter_biography: boolean; + hide__session_code: boolean; + hide__session_description: boolean; + hide__session_location: boolean; + hide__session_msg: boolean; + hide__session_poc: boolean; + hide__session_poc_biography: boolean; + hide__session_poc_profile: boolean; + hide__session_poc_profile_pic: boolean; + show__copy_access_link: boolean; + show__email_access_link: boolean; + show__launcher_link: boolean; + show__launcher_link_legacy: 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 } + > | null; + hide__report_kv: Record; } +// --------------------------------------------------------------------------- +// In-memory session state — resets on page load (not persisted) +// --------------------------------------------------------------------------- export interface PresMgmtSessState { presenter__updated_on: string | null; session_updated_on: string | null; @@ -114,40 +251,57 @@ export interface PresMgmtSessState { tmp_val__filename_no_ext: string | null; } -// Persisted pres_mgmt config — survives browser sessions. -export const pres_mgmt_loc_defaults: PresMgmtLocState = { - sync_local_config: false, - lock_config: true, +// --------------------------------------------------------------------------- +// Defaults +// --------------------------------------------------------------------------- +// Persisted pres_mgmt local config — survives browser sessions. +export const pres_mgmt_loc_defaults: PresMgmtLocState = { + // System / lock state + sync_local_config: false, + lock_config: false, + + // Query / search datetime_format: 'datetime_12_long', time_format: 'time_12_short', - time_hours: 12, // 12 or 24 - - qry_enabled: 'enabled', // 'all' | 'disabled' | 'enabled' - qry_hidden: 'not_hidden', // 'all' | 'hidden' | 'not_hidden' + time_hours: 12, + qry_enabled: 'enabled', + qry_hidden: 'not_hidden', qry_limit__files: 75, qry_limit__presentations: 25, qry_limit__presenters: 500, qry_limit__sessions: 100, - qry_max: 500, // Maximum value the limit is allowed to be set to. + qry_max: 500, qry__files_offset_seconds: null, qry__files_sort: 'created_on', - - // Search stabilization — version bump clears cache and re-runs (Standardized Pattern 2026-01-27). search_version: 0, qry__remote_first: false, - - qry_and__file_count: true, // When true, only sessions with at least 1 file are returned. - + qry_and__file_count: true, save_search_text: true, saved_search__session: null, + saved_search__session_location_name: null, + fulltext_search_qry_str: null, + location_name_qry_str: null, + refresh_interval: 0, - require__presenter_agree: false, - require__session_agree: false, + // Report display preferences + rpt__session_no_files: true, + rpt__session_poc_agree: false, + rpt__session_no_bio: true, + rpt__presenter_agree: true, + qry__file_purpose: null, + qry__files_min_size: null, + qry__session_sort: 'name', + qry__presenter_sort: 'name', + // Content / panel visibility + expand__menu_opts: false, + show_content__device_description: false, + show_content__location_description: false, + show_content__location_devices_sessions: null, show_content__event_view: null, show_content__location_qr: false, - show_content__presentation_description: false, // Global toggle — applies to all presentations. + show_content__presentation_description: false, show_content__presenter_page_help: true, show_content__presenter_view: null, show_content__presenter_qr: false, @@ -160,100 +314,108 @@ export const pres_mgmt_loc_defaults: PresMgmtLocState = { show_content__session_search_room_name: false, show_content__session_view: null, show_content__session_qr: false, - hide__session_code: false, // Default visible; toggle in ae_comp__events_menu_opts to hide - hide__session_msg: true, - hide__session_poc: true, - hide__session_poc_biography: true, - hide__presenter_biography: true, - - // List/table-specific visibility. - hide__session_li_location_field: false, - show__session_li_poc_field: false, - hide__launcher_link_legacy: true, // Flask version. - hide__launcher_link: true, // SvelteKit version. - hide__location_link: true, - show_content__disabled_files: false, show_content__hidden_files: false, show_content__hidden_presentations: false, show_content__hidden_presenters: false, show_content__hidden_sessions: false, + // List/table column visibility + hide__device_code: false, + 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, - // Menu visibility — null means "use server-side default". - // Use "hide" prefix for any new additions here. + // Menu visibility show_menu__presenter: null, show_menu__session: null, show_menu__session_search: null, show_menu__event_reports: null, - show_report: null, + // Opt-out disable_submit__opt_out: true, submit_status__opt_out: null, + // Scratch space device_kv: {}, - location_kv: {} + location_kv: {}, + + // Synced from remote (defaults apply until first event load) + label__person_external_id: 'External ID', + label__presenter_external_id: 'External ID', + label__session_poc_type: 'poc', + label__session_poc_name: 'Point of Contact', + hide__location_code: false, + hide__presentation_code: false, + hide__presentation_datetime: false, + hide__presentation_description: false, + hide__presenter_code: false, + hide__presenter_biography: true, + hide__session_code: false, + hide__session_description: false, + hide__session_location: false, + hide__session_msg: true, + hide__session_poc: true, + hide__session_poc_biography: true, + hide__session_poc_profile: false, + hide__session_poc_profile_pic: false, + show__copy_access_link: false, + show__email_access_link: false, + show__launcher_link: false, + show__launcher_link_legacy: false, + require__presenter_agree: false, + require__session_agree: false, + limit__navigation: false, + limit__options: false, + file_purpose_option_kv: null, + hide__report_kv: {} }; // In-memory pres_mgmt state — resets on page load. export const pres_mgmt_sess_defaults: PresMgmtSessState = { presenter__updated_on: null, session_updated_on: null, - location_name_qry_str: null, fulltext_search_qry_str: null, status_qry__search: null, - disable_submit__event_file_obj: true, - show_form__search: true, show_form__search_results: true, - show_content__agree_text: false, show_content__presenter_start: false, - show_content__presentation_description: false, // Per-presentation (keyed by event_presentation_id_random). - + show_content__presentation_description: false, show_report: null, - - show_field_edit__filename: false, // For file rename. - + show_field_edit__filename: false, new_upload_list: null, files_uploading_count: null, - qry_limit__files: 75, qry_limit__presentations: 25, qry_limit__presenters: 500, qry_limit__sessions: 100, - show_fields__presentation: true, show_fields__session: true, - show_modal__presenter_agree: false, show__session_poc_profile: false, show_modal__session_poc_agree: false, - show__edit_location: {}, show__edit_poc_person: {}, - - show__view_alert: {}, // Key-value: show alert by ID. - show__edit_alert_msg: {}, // Key-value: show edit alert msg by ID. - tmp__alert_msg: {}, // Key-value: temp alert msg content by ID. - - session_qr_url: {}, // Key-value: session_id → URL string. - + show__view_alert: {}, + show__edit_alert_msg: {}, + tmp__alert_msg: {}, + session_qr_url: {}, status_rpt: { recent_files: null, presenters_agree: null, presenters_biography: null }, - rpt__session_no_files: true, - rpt__session_poc_agree: false, // Default to false for new events. + rpt__session_poc_agree: false, rpt__session_no_bio: true, - rpt__presenter_agree: true, - - tmp_val__filename_no_ext: null // For file rename. + tmp_val__filename_no_ext: null }; diff --git a/src/lib/stores/store_versions.ts b/src/lib/stores/store_versions.ts index 2330ea8a..ef77ae28 100644 --- a/src/lib/stores/store_versions.ts +++ b/src/lib/stores/store_versions.ts @@ -33,6 +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 = 1; // Added 2026-03-30: was missing, no wipe mechanism existed +export const AE_PRES_MGMT_LOC_VERSION = 1; // Added 2026-04-02: new standalone PersistedState store // Version check side-effect: runs on import, before any persisted() call. // Guard presence of `localStorage` and its functions for safety (SSR, Node flags). @@ -44,6 +45,10 @@ if ( _check_and_wipe('ae_loc', AE_LOC_VERSION); _check_and_wipe('ae_events_loc', AE_EVENTS_LOC_VERSION); _check_and_wipe('ae_idaa_loc', AE_IDAA_LOC_VERSION); + // ae_pres_mgmt_loc uses PersistedState (runed) which stores raw JSON without a __version + // field. The _check_and_wipe mechanism requires __version in the stored data — do NOT + // add it here until pres_mgmt_loc_defaults includes __version. For now the key is new + // (no stale data exists) so no wipe is needed. } function _check_and_wipe(key: string, expected_version: number): void { diff --git a/src/routes/events/[event_id]/(pres_mgmt)/device/device/ae_comp__event_device_obj_li.svelte b/src/routes/events/[event_id]/(pres_mgmt)/device/device/ae_comp__event_device_obj_li.svelte index d3543af9..9297d8f6 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/device/device/ae_comp__event_device_obj_li.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/device/device/ae_comp__event_device_obj_li.svelte @@ -38,6 +38,7 @@ import { events_trigger, events_trig_kv } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import Element_ae_obj_field_editor from '$lib/elements/element_ae_obj_field_editor.svelte'; @@ -70,8 +71,8 @@ let ae_promises: key_val = $state({ // let ae_tmp: key_val = {}; // let ae_triggers: key_val = {}; -if (!$events_loc.pres_mgmt?.device_kv) { - $events_loc.pres_mgmt.device_kv = {}; +if (!pres_mgmt_loc.current.device_kv) { + pres_mgmt_loc.current.device_kv = {}; } // *** Functions and Logic @@ -158,7 +159,7 @@ onDestroy(() => { "{event_device_obj?.name}" - {#if event_device_obj?.code && !$events_loc.pres_mgmt?.hide__device_code} + {#if event_device_obj?.code && !pres_mgmt_loc.current.hide__device_code} @@ -235,26 +236,26 @@ onDestroy(() => { type="button" onclick={() => { console.log('Show/Hide Device'); - if (!$events_loc.pres_mgmt.device_kv) { - $events_loc.pres_mgmt.device_kv = { + if (!pres_mgmt_loc.current.device_kv) { + pres_mgmt_loc.current.device_kv = { [event_device_obj.event_device_id]: { collapse: true } }; } else if ( - !$events_loc.pres_mgmt.device_kv[ + !pres_mgmt_loc.current.device_kv[ event_device_obj.event_device_id ] ) { - $events_loc.pres_mgmt.device_kv[ + pres_mgmt_loc.current.device_kv[ event_device_obj.event_device_id ] = { collapse: true }; } else { - $events_loc.pres_mgmt.device_kv[ + pres_mgmt_loc.current.device_kv[ event_device_obj.event_device_id ].collapse = - !$events_loc.pres_mgmt.device_kv[ + !pres_mgmt_loc.current.device_kv[ event_device_obj.event_device_id ].collapse; } @@ -264,7 +265,7 @@ onDestroy(() => { .pres_mgmt?.device_kv[ event_device_obj.event_device_id ]?.collapse}> - {#if $events_loc.pres_mgmt.device_kv && $events_loc.pres_mgmt.device_kv[event_device_obj.event_device_id]?.collapse} + {#if pres_mgmt_loc.current.device_kv && pres_mgmt_loc.current.device_kv[event_device_obj.event_device_id]?.collapse} @@ -278,8 +279,8 @@ onDestroy(() => {
@@ -470,8 +471,7 @@ onDestroy(() => {
+ class:hidden={!pres_mgmt_loc.current.show_content__device_description}> { - $events_loc.pres_mgmt.show_content__event_view = - $events_loc.pres_mgmt.show_content__event_view === 'manage_files' + pres_mgmt_loc.current.show_content__event_view = + pres_mgmt_loc.current.show_content__event_view === 'manage_files' ? null : 'manage_files'; }} class="btn btn-sm relative" - class:preset-filled-primary-500={$events_loc.pres_mgmt.show_content__event_view === 'manage_files'} - class:preset-tonal-primary={$events_loc.pres_mgmt.show_content__event_view !== 'manage_files'} + class:preset-filled-primary-500={pres_mgmt_loc.current.show_content__event_view === 'manage_files'} + class:preset-tonal-primary={pres_mgmt_loc.current.show_content__event_view !== 'manage_files'} class:hidden={!$ae_loc.administrator_access} disabled={!$ae_loc.manager_access} title="Session search or manage files for the event" > - {#if $events_loc.pres_mgmt.show_content__event_view === 'manage_files'} + {#if pres_mgmt_loc.current.show_content__event_view === 'manage_files'} Session Search? {:else} @@ -104,6 +105,17 @@ async function on_delete(method: 'delete' | 'disable') { {/if} --> + + {#if $ae_loc.manager_access && $ae_loc.edit_mode} + + + Config + + {/if} + {#if $ae_loc.trusted_access} @@ -148,20 +143,18 @@ let show_help = $state(false); @@ -169,20 +162,18 @@ let show_help = $state(false); diff --git a/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte index 39292636..94064122 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/+page.svelte @@ -32,6 +32,7 @@ import { events_slct, events_trigger } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import Comp_event_files_upload from '../../../ae_comp__event_files_upload.svelte'; @@ -65,17 +66,8 @@ $effect(() => { } }); -// *** Initialization & Store Guard *** -if ($events_loc.pres_mgmt) { - if (typeof $events_loc.pres_mgmt.search_version === 'undefined') - $events_loc.pres_mgmt.search_version = 0; - if (typeof $events_loc.pres_mgmt.qry__remote_first === 'undefined') - $events_loc.pres_mgmt.qry__remote_first = false; - if (typeof $events_loc.pres_mgmt.fulltext_search_qry_str === 'undefined') - $events_loc.pres_mgmt.fulltext_search_qry_str = ''; - if (typeof $events_loc.pres_mgmt.location_name_qry_str === 'undefined') - $events_loc.pres_mgmt.location_name_qry_str = ''; -} +// pres_mgmt_loc (PersistedState) is always initialized from pres_mgmt_loc_defaults — +// no guard needed. Fields present in the defaults will never be undefined. let lq__event_obj = $derived( liveQuery(async () => { @@ -87,15 +79,15 @@ let lq__event_obj = $derived( }) ); -// JSON formatted configuration options for an event, and specifically for the presentation management module. +// Sync server-side event pres_mgmt config into the local PersistedState store. +// Runs whenever the event object changes (e.g. after a fresh API load). +// The sync function writes directly to pres_mgmt_loc.current — no local_cfg arg needed. $effect(() => { const remote_cfg = $lq__event_obj?.mod_pres_mgmt_json; - const local_cfg = $events_loc.pres_mgmt; - if (remote_cfg && local_cfg) { + if (remote_cfg) { untrack(() => { events_func.sync_config__event_pres_mgmt({ pres_mgmt_cfg_remote: remote_cfg, - pres_mgmt_cfg_local: local_cfg, log_lvl: log_lvl }); }); @@ -128,8 +120,8 @@ let lq__event_session_obj_li = $derived.by(() => { // SCENARIO 2: Fallback broad search (Only if no active filters) if ( event_id && - !$events_loc.pres_mgmt.fulltext_search_qry_str && - !$events_loc.pres_mgmt.location_name_qry_str + !pres_mgmt_loc.current.fulltext_search_qry_str && + !pres_mgmt_loc.current.location_name_qry_str ) { if (log_lvl) console.log( @@ -158,13 +150,13 @@ let lq__event_location_obj_li = $derived( // Standardized Reactive Search Pattern (Aether UI V3) let search_params = $derived({ - v: $events_loc.pres_mgmt.search_version, - str: ($events_loc.pres_mgmt.fulltext_search_qry_str ?? '') + v: pres_mgmt_loc.current.search_version, + str: (pres_mgmt_loc.current.fulltext_search_qry_str ?? '') .toLowerCase() .trim(), - location: $events_loc.pres_mgmt.location_name_qry_str, + location: pres_mgmt_loc.current.location_name_qry_str, event_id: $events_slct?.event_id, - remote_first: $events_loc.pres_mgmt.qry__remote_first + remote_first: pres_mgmt_loc.current.qry__remote_first }); $effect(() => { @@ -272,9 +264,9 @@ async function handle_search_refresh(params: any) { fulltext_search_qry_str: qry_str || null, like_search_qry_str: qry_str || null, location_name: location_name || null, - enabled: $events_loc.pres_mgmt.qry_enabled ?? 'enabled', - hidden: $events_loc.pres_mgmt.qry_hidden ?? 'not_hidden', - limit: $events_loc.pres_mgmt.qry_limit__sessions ?? 100, + enabled: pres_mgmt_loc.current.qry_enabled ?? 'enabled', + hidden: pres_mgmt_loc.current.qry_hidden ?? 'not_hidden', + limit: pres_mgmt_loc.current.qry_limit__sessions ?? 100, try_cache: true, log_lvl: 0 }); @@ -333,22 +325,22 @@ async function handle_search_refresh(params: any) { } if ( - $events_loc.pres_mgmt?.save_search_text && - $events_loc.pres_mgmt?.saved_search__session + pres_mgmt_loc.current.save_search_text && + pres_mgmt_loc.current.saved_search__session ) { - $events_loc.pres_mgmt.fulltext_search_qry_str = - $events_loc.pres_mgmt.saved_search__session; + pres_mgmt_loc.current.fulltext_search_qry_str = + pres_mgmt_loc.current.saved_search__session; } if ( - $events_loc.pres_mgmt?.save_search_text && - $events_loc.pres_mgmt?.saved_search__session_location_name + pres_mgmt_loc.current.save_search_text && + pres_mgmt_loc.current.saved_search__session_location_name ) { - $events_loc.pres_mgmt.location_name_qry_str = - $events_loc.pres_mgmt.saved_search__session_location_name; + pres_mgmt_loc.current.location_name_qry_str = + pres_mgmt_loc.current.saved_search__session_location_name; } function handle_search_trigger() { - $events_loc.pres_mgmt.search_version++; + pres_mgmt_loc.current.search_version++; } function prevent_default(fn: (event: T) => void) { @@ -385,23 +377,21 @@ function prevent_default(fn: (event: T) => void) { type="button" onclick={() => { if ( - $events_loc.pres_mgmt.show_content__event_view == + pres_mgmt_loc.current.show_content__event_view == 'manage_files' ) { - $events_loc.pres_mgmt.show_content__event_view = null; + pres_mgmt_loc.current.show_content__event_view = null; } else { - $events_loc.pres_mgmt.show_content__event_view = + pres_mgmt_loc.current.show_content__event_view = 'manage_files'; } }} class="btn ae_btn_secondary" - class:preset-filled-secondary-500={$events_loc.pres_mgmt - .show_content__event_view == 'manage_files'} - class:preset-filled-tertiary-500={$events_loc.pres_mgmt - .show_content__event_view != 'manage_files'} + class:preset-filled-secondary-500={pres_mgmt_loc.current.show_content__event_view == 'manage_files'} + class:preset-filled-tertiary-500={pres_mgmt_loc.current.show_content__event_view != 'manage_files'} class:hidden={!$ae_loc.administrator_access} title="View event search or manage files for the event"> - {#if $events_loc.pres_mgmt.show_content__event_view == 'manage_files'} + {#if pres_mgmt_loc.current.show_content__event_view == 'manage_files'} Event Search? {:else} @@ -431,7 +421,7 @@ function prevent_default(fn: (event: T) => void) { - {#if !$events_loc.pres_mgmt.show_content__event_view || $events_loc.pres_mgmt.show_content__event_view == 'default'} + {#if !pres_mgmt_loc.current.show_content__event_view || pres_mgmt_loc.current.show_content__event_view == 'default'}
handle_search_trigger())} @@ -442,10 +432,9 @@ function prevent_default(fn: (event: T) => void) { class="btn btn-sm ae_btn_warning mx-1" class:hidden={!$ae_loc.authenticated_access} onclick={() => { - $events_loc.pres_mgmt.location_name_qry_str = ''; - $events_loc.pres_mgmt.show_content__session_search_room_name = - !$events_loc.pres_mgmt - .show_content__session_search_room_name; + pres_mgmt_loc.current.location_name_qry_str = ''; + pres_mgmt_loc.current.show_content__session_search_room_name = + !pres_mgmt_loc.current.show_content__session_search_room_name; handle_search_trigger(); }} title="Search by location name"> @@ -455,11 +444,10 @@ function prevent_default(fn: (event: T) => void) { handle_search_trigger()} class="checkbox checkbox-sm" /> @@ -530,14 +517,11 @@ function prevent_default(fn: (event: T) => void) { {#if event_session_id_li.length} {:else if $events_sess.pres_mgmt.status_qry__search === 'loading'}
(fn: (event: T) => void) {
{/if} - {:else if $events_loc.pres_mgmt.show_content__event_view == 'manage_files' && $ae_loc.trusted_access} + {:else if pres_mgmt_loc.current.show_content__event_view == 'manage_files' && $ae_loc.trusted_access} {#if $lq__event_obj}

{$lq__event_obj?.name}

diff --git a/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/config/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/config/+page.svelte new file mode 100644 index 00000000..e8145fea --- /dev/null +++ b/src/routes/events/[event_id]/(pres_mgmt)/pres_mgmt/config/+page.svelte @@ -0,0 +1,584 @@ + + + + Pres Mgmt Config + + +{#if !$ae_loc.manager_access} +
+ +

Manager access required.

+
+{:else} +
+ + +
+
+ +

Pres Mgmt Config

+
+
+ {#if save_status === 'success'} + + Saved + + {:else if save_status === 'error'} + + Error saving + + {/if} + +
+
+ +

+ Changes here update event.mod_pres_mgmt_json and take effect on + the next event load. When Lock Config is on, all display flags + are pushed to every browser — overriding local user preferences. +

+ + {#if !draft_initialized} +

Loading event config...

+ {:else} + + + + +
+ + {#if sections.system} +
+ +
+ {/if} +
+ + + + +
+ + {#if sections.labels} +
+ + + + +
+ {/if} +
+ + + + +
+ + {#if sections.codes} +
+ {#each [ + { field: 'hide__session_code' as const, label: 'Hide Session Code' }, + { field: 'hide__location_code' as const, label: 'Hide Location Code' }, + { field: 'hide__presenter_code' as const, label: 'Hide Presenter Code' }, + { field: 'hide__presentation_code' as const, label: 'Hide Presentation Code' } + ] as item} + + {/each} +
+ {/if} +
+ + + + +
+ + {#if sections.session} +
+ {#each [ + { field: 'hide__session_description' as const, label: 'Hide Description' }, + { field: 'hide__session_location' as const, label: 'Hide Location' }, + { field: 'hide__session_msg' as const, label: 'Hide Message' }, + { field: 'hide__session_poc' as const, label: 'Hide POC' }, + { field: 'hide__session_poc_biography' as const, label: 'Hide POC Biography' }, + { field: 'hide__session_poc_profile' as const, label: 'Hide POC Profile' }, + { field: 'hide__session_poc_profile_pic' as const, label: 'Hide POC Profile Pic' } + ] as item} + + {/each} +
+ {/if} +
+ + + + +
+ + {#if sections.presenter} +
+ +
+ {/if} +
+ + + + +
+ + {#if sections.presentation} +
+ + +
+ {/if} +
+ + + + +
+ + {#if sections.opt_in} +
+ {#each [ + { field: 'show__copy_access_link' as const, label: 'Copy Access Link' }, + { field: 'show__email_access_link' as const, label: 'Email Access Link' }, + { field: 'show__launcher_link' as const, label: 'Launcher Link (SvelteKit)' }, + { field: 'show__launcher_link_legacy' as const, label: 'Launcher Link (Legacy Flask)' } + ] as item} + + {/each} +
+ {/if} +
+ + + + +
+ + {#if sections.requirements} +
+ + +
+ {/if} +
+ + + + +
+ + {#if sections.navigation} +
+ + +
+ {/if} +
+ + + + +
+ + {#if sections.file_purpose} +
+
+ + JSON object: keys are purpose slugs, values are { name, disabled?, hidden? }. + Leave empty to use system defaults. +
+ + {#if file_purpose_json_error} +

{file_purpose_json_error}

+ {/if} +
+ {/if} +
+ + + + +
+ + {#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} +
+ {/if} +
+ + +
+ +
+ + {/if} +
+{/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte index 3d03334e..55448205 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte @@ -32,6 +32,7 @@ import { events_slct, events_trigger } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import Comp_event_files_upload from '../../../../ae_comp__event_files_upload.svelte'; @@ -154,24 +155,21 @@ let lq__auth__event_presenter_obj = $derived( type="button" onclick={() => { if ( - $events_loc.pres_mgmt - .show_content__presenter_view == 'manage_files' + pres_mgmt_loc.current.show_content__presenter_view == 'manage_files' ) { - $events_loc.pres_mgmt.show_content__presenter_view = + pres_mgmt_loc.current.show_content__presenter_view = null; } else { - $events_loc.pres_mgmt.show_content__presenter_view = + pres_mgmt_loc.current.show_content__presenter_view = 'manage_files'; } }} class="btn btn-md hover:preset-filled-secondary-500" - class:preset-filled-secondary-500={$events_loc.pres_mgmt - .show_content__presenter_view == 'manage_files'} - class:preset-filled-tertiary-500={$events_loc.pres_mgmt - .show_content__presenter_view != 'manage_files'} + class:preset-filled-secondary-500={pres_mgmt_loc.current.show_content__presenter_view == 'manage_files'} + class:preset-filled-tertiary-500={pres_mgmt_loc.current.show_content__presenter_view != 'manage_files'} class:hidden={!$ae_loc.authenticated_access} title="View presenter information or manage files for the presenter"> - {#if $events_loc.pres_mgmt.show_content__presenter_view == 'manage_files'} + {#if pres_mgmt_loc.current.show_content__presenter_view == 'manage_files'} Presenter Info? @@ -250,7 +248,7 @@ let lq__auth__event_presenter_obj = $derived( > {/if} - {#if $events_loc.pres_mgmt?.require__presenter_agree && $events_loc?.pres_mgmt?.show__email_access_link && $lq__event_presenter_obj?.person_primary_email && ($ae_loc.public_access || !$events_loc.auth__person?.id)} + {#if pres_mgmt_loc.current.require__presenter_agree && $events_loc?.pres_mgmt?.show__email_access_link && $lq__event_presenter_obj?.person_primary_email && ($ae_loc.public_access || !$events_loc.auth__person?.id)}
- {#if !$events_loc.pres_mgmt.show_content__presenter_view || ($events_loc.pres_mgmt.show_content__presenter_view == 'default' && $lq__event_presenter_obj)} + {#if !pres_mgmt_loc.current.show_content__presenter_view || (pres_mgmt_loc.current.show_content__presenter_view == 'default' && $lq__event_presenter_obj)} @@ -392,7 +390,7 @@ let lq__auth__event_presenter_obj = $derived( ]} container_class_li={''} />
- {:else if $events_loc.pres_mgmt.show_content__presenter_view == 'manage_files' && $ae_loc.authenticated_access} + {:else if pres_mgmt_loc.current.show_content__presenter_view == 'manage_files' && $ae_loc.authenticated_access}

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 9b9febdd..651e2d7f 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 @@ -11,7 +11,8 @@ import { goto } from '$app/navigation'; import { Modal } from 'flowbite-svelte'; import { Check, Info, Pencil, QrCode, Settings, X } from '@lucide/svelte'; import { ae_loc, ae_api } from '$lib/stores/ae_stores'; -import { events_loc, events_slct } from '$lib/stores/ae_events_stores'; +import { events_loc, events_sess, events_slct } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import { api } from '$lib/api/api'; @@ -92,7 +93,7 @@ async function on_delete(method: 'delete' | 'disable') { - {#if $events_loc.pres_mgmt?.require__presenter_agree} + {#if pres_mgmt_loc.current.require__presenter_agree} {#if $lq__event_presenter_obj?.agree} @@ -107,7 +108,7 @@ async function on_delete(method: 'delete' | 'disable') { $lq__event_presenter_obj?.event_presentation_id_random; $events_slct.event_presenter_id = $lq__event_presenter_obj?.event_presenter_id; - $events_loc.pres_mgmt.show_modal__presenter_agree = + $events_sess.pres_mgmt.show_modal__presenter_agree = $lq__event_presenter_obj?.event_presenter_id; }} class="btn btn-sm ae_btn_success_filled mx-1 font-bold" @@ -127,7 +128,7 @@ async function on_delete(method: 'delete' | 'disable') { $lq__event_presenter_obj?.event_presentation_id_random; $events_slct.event_presenter_id = $lq__event_presenter_obj?.event_presenter_id; - $events_loc.pres_mgmt.show_modal__presenter_agree = + $events_sess.pres_mgmt.show_modal__presenter_agree = $lq__event_presenter_obj?.event_presenter_id; }} class="btn btn-sm ae_btn_warning_filled mx-1 font-bold" @@ -177,17 +178,15 @@ async function on_delete(method: 'delete' | 'disable') { diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_view.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_view.svelte index 555821fc..d6653432 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_view.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/presenter_view.svelte @@ -40,6 +40,7 @@ import { events_slct, events_trigger } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import { Asterisk, @@ -106,7 +107,7 @@ $effect(() => { console.log(`$lq__event_presenter_obj:`, $lq__event_presenter_obj); } - if ($events_loc.pres_mgmt.show_content__presenter_qr) { + if (pres_mgmt_loc.current.show_content__presenter_qr) { if ( $lq__event_presenter_obj.updated_on == $events_sess.pres_mgmt.presenter__updated_on @@ -246,7 +247,7 @@ $effect(() => { log_lvl: 0 })}> - {$events_loc.pres_mgmt?.label__presenter_external_id ?? + {pres_mgmt_loc.current.label__presenter_external_id ?? 'External ID'}: {@html $lq__event_presenter_obj?.external_id ?? @@ -272,7 +273,7 @@ $effect(() => { })}> - {$events_loc.pres_mgmt?.label__person_external_id ?? + {pres_mgmt_loc.current.label__person_external_id ?? 'Person External ID'}: {@html $lq__event_presenter_obj.person_external_id ?? @@ -1118,8 +1119,7 @@ $effect(() => {
  • {/if} - {#if $events_loc.pres_mgmt?.require__presenter_agree} + {#if pres_mgmt_loc.current.require__presenter_agree} {#if event_presenter_obj?.agree} @@ -208,19 +209,19 @@ $effect(() => { disabled={!$ae_loc.trusted_access} onclick={() => { ae_triggers.rpt__event_sessions = true; - $events_loc.pres_mgmt.show_report = 'session_no_bio'; + 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="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 $events_loc.pres_mgmt?.show_report == 'session_no_bio' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} + {#if pres_mgmt_loc.current.show_report == 'session_no_bio' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} {:else} {/if} - Session {$events_loc.pres_mgmt?.label__session_poc_name} Bios + Session {pres_mgmt_loc.current.label__session_poc_name} Bios @@ -230,20 +231,20 @@ $effect(() => { disabled={!$ae_loc.trusted_access} onclick={() => { ae_triggers.rpt__event_presenters = true; - $events_loc.pres_mgmt.show_report = 'presenters_agree'; + pres_mgmt_loc.current.show_report = 'presenters_agree'; }} - class:hidden={!$events_loc.pres_mgmt?.require__presenter_agree} + class:hidden={!pres_mgmt_loc.current.require__presenter_agree} class="btn btn-sm preset-tonal-success border-success-500 hover:preset-filled-success-500 m-1 border transition-all" title="Show presenters who have agreed to present."> - {#if $events_loc.pres_mgmt?.show_report == 'presenters_agree' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} + {#if pres_mgmt_loc.current.show_report == 'presenters_agree' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} - {:else if $events_loc.pres_mgmt.rpt__presenter_agree} + {:else if pres_mgmt_loc.current.rpt__presenter_agree} {:else} {/if} Presenters - {#if $events_loc.pres_mgmt.rpt__presenter_agree} + {#if pres_mgmt_loc.current.rpt__presenter_agree} Agreed {:else} Not Agreed @@ -255,13 +256,13 @@ $effect(() => { disabled={!$ae_loc.trusted_access} onclick={() => { ae_triggers.rpt__event_presenters = true; - $events_loc.pres_mgmt.show_report = 'presenters_biography'; + 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="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 $events_loc.pres_mgmt?.show_report == 'presenters_biography' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} + {#if pres_mgmt_loc.current.show_report == 'presenters_biography' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} {:else} @@ -275,13 +276,13 @@ $effect(() => { disabled={!$ae_loc.trusted_access} onclick={() => { ae_triggers.rpt__event_presenters = true; - $events_loc.pres_mgmt.show_report = 'presenters_overview'; + pres_mgmt_loc.current.show_report = 'presenters_overview'; }} class:hidden={$lq__event_obj?.mod_pres_mgmt_json ?.hide__report_kv.presenter_overview} 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 $events_loc.pres_mgmt?.show_report == 'presenters_overview' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} + {#if pres_mgmt_loc.current.show_report == 'presenters_overview' && $events_sess.pres_mgmt?.status_qry__search == 'loading'} {:else} @@ -296,7 +297,7 @@ $effect(() => { disabled={!$ae_loc.trusted_access} onclick={() => { ae_triggers.rpt__event_files = true; - $events_loc.pres_mgmt.show_report = 'event_files'; + pres_mgmt_loc.current.show_report = 'event_files'; }} class:hidden={$lq__event_obj?.mod_pres_mgmt_json ?.hide__report_kv.event_files} @@ -312,51 +313,51 @@ $effect(() => {
    - {#if $events_loc.pres_mgmt.show_report == 'session_no_files' || $events_loc.pres_mgmt.show_report == 'session_no_bio' || $events_loc.pres_mgmt.show_report == 'sessions_poc_agree'} + {#if pres_mgmt_loc.current.show_report == 'session_no_files' || pres_mgmt_loc.current.show_report == 'session_no_bio' || pres_mgmt_loc.current.show_report == 'sessions_poc_agree'} {/if} - {#if $events_loc.pres_mgmt.show_report == 'presenters_agree' || $events_loc.pres_mgmt.show_report == 'presenters_biography' || $events_loc.pres_mgmt.show_report == 'presenters_overview'} + {#if pres_mgmt_loc.current.show_report == 'presenters_agree' || pres_mgmt_loc.current.show_report == 'presenters_biography' || pres_mgmt_loc.current.show_report == 'presenters_overview'} {/if} - {#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'} + {#if pres_mgmt_loc.current.show_report == 'event_files' || pres_mgmt_loc.current.show_report == 'recent_files' || pres_mgmt_loc.current.show_report == 'large_files'} {/if} {/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/reports/event_reports_page_menu.svelte b/src/routes/events/[event_id]/(pres_mgmt)/reports/event_reports_page_menu.svelte index b822a8fa..cdafc9d6 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/reports/event_reports_page_menu.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/reports/event_reports_page_menu.svelte @@ -10,6 +10,7 @@ import { Eye, EyeOff, Info, Settings, X } from '@lucide/svelte'; import { ae_loc } from '$lib/stores/ae_stores'; import { events_loc, events_slct } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import Element_data_store from '$lib/elements/element_data_store.svelte'; import Comp__events_menu_nav from '../../../ae_comp__events_menu_nav.svelte'; @@ -95,7 +96,7 @@ let show_help = $state(false); @@ -138,7 +139,7 @@ let show_help = $state(false); { - if ($events_loc.pres_mgmt?.qry__files_offset_seconds) { + if (pres_mgmt_loc.current.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 offset = pres_mgmt_loc.current.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, + // created_on_offset: pres_mgmt_loc.current.qry__files_offset_seconds ?? 0, + // file_purpose: pres_mgmt_loc.current.qry__file_purpose ?? null, // log_lvl: log_lvl, // }); qry__trigger = true; @@ -426,7 +427,7 @@ async function handle_qry__event_file({ qry__trigger = true; } - $events_loc.pres_mgmt.show_report = 'event_files'; + pres_mgmt_loc.current.show_report = 'event_files'; }}> @@ -448,15 +449,15 @@ async function handle_qry__event_file({ { if ((event.target as HTMLInputElement).value) { // rpt__sort = (event.target as HTMLInputElement).value; - $events_loc.pres_mgmt.qry__files_sort = ( + pres_mgmt_loc.current.qry__files_sort = ( event.target as HTMLInputElement ).value; } else { // rpt__sort = 'created_on'; - $events_loc.pres_mgmt.qry__files_sort = + pres_mgmt_loc.current.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 + pres_mgmt_loc.current.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, + // order_by_li: pres_mgmt_loc.current.qry__presenter_order_by_li, // log_lvl: log_lvl, // }); qry__trigger = true; - $events_loc.pres_mgmt.show_report = 'event_files'; + pres_mgmt_loc.current.show_report = 'event_files'; }}> @@ -561,12 +561,12 @@ async function handle_qry__event_file({ {/if} {#if event_file_obj_li} - + {/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_presenters.svelte b/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_presenters.svelte index c759a044..f89f4fc7 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_presenters.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/reports/reports_presenters.svelte @@ -76,6 +76,7 @@ import { events_slct, events_trigger } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; import Comp_event_presenter_obj_tbl from './../presenter/ae_comp__event_presenter_obj_tbl_wrapper.svelte'; import { @@ -160,7 +161,7 @@ $effect(() => { qry__trigger = false; if (rpt__name == 'presenters_agree') { handle_search__event_presenter({ - agree: $events_loc.pres_mgmt.rpt__presenter_agree ?? false, + agree: pres_mgmt_loc.current.rpt__presenter_agree ?? false, ft_search_str: '', lk_search_str: '', order_by_li: rpt__order_by_li, @@ -196,9 +197,9 @@ async function handle_search__event_presenter({ limit = rpt__limit, order_by_li = rpt__order_by_li, // params = { - // 'qry__enabled': $events_loc.pres_mgmt.qry_enabled ?? 'enabled', - // 'qry__hidden': $events_loc.pres_mgmt.qry_hidden ?? 'not_hidden', - // 'qry__limit': $events_loc.pres_mgmt.qry_limit__presenters ?? 199, + // 'qry__enabled': pres_mgmt_loc.current.qry_enabled ?? 'enabled', + // 'qry__hidden': pres_mgmt_loc.current.qry_hidden ?? 'not_hidden', + // 'qry__limit': pres_mgmt_loc.current.qry_limit__presenters ?? 199, // }, // try_cache = true, log_lvl = 0 @@ -243,7 +244,7 @@ async function handle_search__event_presenter({ like_search_qry_str: lk_search_str, like_presentation_search_qry_str: lk_search_str, like_presenter_search_qry_str: lk_search_str, - // external_event_id: $events_loc.pres_mgmt.default__external_registration_id, + // external_event_id: pres_mgmt_loc.current.default__external_registration_id, enabled: enabled as any, hidden: hidden as any, limit: limit, @@ -310,13 +311,13 @@ async function handle_search__event_presenter({ {#if qry__status == 'loading'} - {:else if $events_loc.pres_mgmt.rpt__presenter_agree} + {:else if pres_mgmt_loc.current.rpt__presenter_agree} {:else} {/if} Presenters - {#if $events_loc.pres_mgmt.rpt__presenter_agree}Agreed{:else}Not + {#if pres_mgmt_loc.current.rpt__presenter_agree}Agreed{:else}Not Agreed{/if}
  • @@ -325,14 +326,14 @@ async function handle_search__event_presenter({
    - Waiting for agreement to the {$events_loc.pres_mgmt - ?.label__session_poc_name} Consent and Release and Terms and Conditions + Waiting for agreement to the {pres_mgmt_loc.current.label__session_poc_name} Consent and Release and Terms and Conditions before you can move on. Please review and mark as agreed below.
    diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte index f952d561..e5895f92 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte @@ -28,6 +28,7 @@ import { events_slct, events_trigger } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { events_func } from '$lib/ae_events/ae_events_functions'; // import { db_events } from "$lib/db_events"; import MyClipboard from '$lib/app_components/e_app_clipboard.svelte'; @@ -56,8 +57,8 @@ let ae_tmp: key_val = $state({}); ae_tmp.biography = null; -let poc_type = $events_loc.pres_mgmt.label__session_poc_type; -let poc_name = $events_loc.pres_mgmt.label__session_poc_name; +let poc_type = pres_mgmt_loc.current.label__session_poc_type; +let poc_name = pres_mgmt_loc.current.label__session_poc_name; run(() => { if ( @@ -99,17 +100,17 @@ let clipboard_success = $state(false); {/if}

    - + {$lq__event_session_obj.poc_person_full_name} ({$lq__event_session_obj.poc_person_primary_email})

    - - + + -
    +
    { if ( $lq__event_session_obj?.id && - $events_loc.pres_mgmt.show_content__session_qr && + pres_mgmt_loc.current.show_content__session_qr && !$events_sess.pres_mgmt.session_qr_url[$lq__event_session_obj.id] ) { $events_sess.pres_mgmt.session_qr_url[$lq__event_session_obj.id] = true; @@ -235,12 +236,12 @@ $effect(() => { )}, {ae_util.iso_datetime_formatter( $lq__event_session_obj.start_datetime, - $events_loc.pres_mgmt.datetime_format + pres_mgmt_loc.current.datetime_format )} – {ae_util.iso_datetime_formatter( $lq__event_session_obj.end_datetime, - $events_loc.pres_mgmt.time_format + pres_mgmt_loc.current.time_format )}
    @@ -269,7 +270,7 @@ $effect(() => { })}> Start: - {ae_util.iso_datetime_formatter($lq__event_session_obj.start_datetime, $events_loc.pres_mgmt.datetime_format)} + {ae_util.iso_datetime_formatter($lq__event_session_obj.start_datetime, pres_mgmt_loc.current.datetime_format)}
    @@ -289,7 +290,7 @@ $effect(() => { })}> End: - {ae_util.iso_datetime_formatter($lq__event_session_obj.end_datetime, $events_loc.pres_mgmt.time_format)} + {ae_util.iso_datetime_formatter($lq__event_session_obj.end_datetime, pres_mgmt_loc.current.time_format)}
    @@ -339,7 +340,7 @@ $effect(() => {
    -
    +
    {#if $lq__event_session_obj?.poc_person_id}
    Host: @@ -368,7 +369,7 @@ $effect(() => { {/snippet}
    - {:else if $lq__event_session_obj && !$events_loc.pres_mgmt?.hide__session_poc} + {:else if $lq__event_session_obj && !pres_mgmt_loc.current.hide__session_poc} No host assigned {/if}
    diff --git a/src/routes/events/[event_id]/settings/+page.svelte b/src/routes/events/[event_id]/settings/+page.svelte index 43208726..8645817b 100644 --- a/src/routes/events/[event_id]/settings/+page.svelte +++ b/src/routes/events/[event_id]/settings/+page.svelte @@ -16,7 +16,6 @@ import { events_func } from '$lib/ae_events/ae_events_functions'; import { ae_loc, ae_api } from '$lib/stores/ae_stores'; import AE_Comp_Editor_CodeMirror from '$lib/elements/element_editor_codemirror.svelte'; import Ae_comp_event_settings_form from './ae_comp__event_settings_form.svelte'; -import Ae_comp_event_settings_pres_mgmt_form from './ae_comp__event_settings_pres_mgmt_form.svelte'; import Ae_comp_event_settings_basic_form from './ae_comp__event_settings_basic_form.svelte'; import Ae_comp_event_settings_badges_form from './ae_comp__event_settings_badges_form.svelte'; import Ae_comp_event_settings_abstracts_form from './ae_comp__event_settings_abstracts_form.svelte'; @@ -27,7 +26,6 @@ import Comp_badge_upload_form from '../(badges)/badges/ae_comp__badge_upload_for let event_id = page.params.event_id as string; let event_obj: Event | undefined | null = $state(null); let cfg_json_view = $state('form'); -let pres_mgmt_json_view = $state('form'); let badges_json_view = $state('form'); let abstracts_json_view = $state('form'); @@ -238,44 +236,38 @@ async function handle_save(field_name: string, data: any) {
    Presentation Management (mod_pres_mgmt_json) -
    -
    - - -
    - {#if pres_mgmt_json_view === 'form'} - - handle_save('mod_pres_mgmt_json', data)} /> - {:else} - - - {/if} +
    +

    + Pres Mgmt configuration is now managed through the dedicated config page + inside Presentation Management. Use the link below (requires edit mode + manager access). +

    + + Go to Pres Mgmt Config → + + +
    + Raw JSON (advanced) +
    + + +
    +
    diff --git a/src/routes/events/ae_comp__event_presentation_obj_li.svelte b/src/routes/events/ae_comp__event_presentation_obj_li.svelte index e7a81e66..1b3893d3 100644 --- a/src/routes/events/ae_comp__event_presentation_obj_li.svelte +++ b/src/routes/events/ae_comp__event_presentation_obj_li.svelte @@ -34,6 +34,7 @@ import { events_trigger, events_trig_kv } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import Element_ae_obj_field_editor from '$lib/elements/element_ae_obj_field_editor.svelte'; import Comp_event_presenter_obj_li from '../events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li_wrapper.svelte'; import Element_manage_event_file_li_wrap from '$lib/elements/element_manage_event_file_li_all.svelte'; @@ -163,7 +164,7 @@ import { class="bg-surface-100-900 flex flex-wrap items-center gap-2 rounded-lg px-3 py-2 text-lg font-bold"> {ae_util.iso_datetime_formatter( event_presentation_obj.start_datetime, @@ -171,10 +172,10 @@ import { )} @ - + {ae_util.iso_datetime_formatter( event_presentation_obj.start_datetime, - $events_loc.pres_mgmt.time_format + pres_mgmt_loc.current.time_format )} @@ -212,7 +213,7 @@ import { event_presentation_obj.event_presentation_id, log_lvl: 1 })}> - {#if (event_presentation_obj?.code || event_presentation_obj?.abstract_code) && !$events_loc.pres_mgmt.hide__presentation_code} + {#if (event_presentation_obj?.code || event_presentation_obj?.abstract_code) && !pres_mgmt_loc.current.hide__presentation_code} @@ -246,17 +247,17 @@ import {
    = $state({}); @@ -163,9 +164,9 @@ function toggle_details(id: string) { {session_obj?.name} - {#if (!$events_loc.pres_mgmt.hide__session_code && session_obj?.code) || session_obj?.file_count_all} + {#if (!pres_mgmt_loc.current.hide__session_code && session_obj?.code) || session_obj?.file_count_all}
    - {#if !$events_loc.pres_mgmt.hide__session_code && session_obj?.code} + {#if !pres_mgmt_loc.current.hide__session_code && session_obj?.code} {session_obj.code} diff --git a/src/routes/events/ae_comp__events_menu_opts.svelte b/src/routes/events/ae_comp__events_menu_opts.svelte index 11b497d1..e27eeeb2 100644 --- a/src/routes/events/ae_comp__events_menu_opts.svelte +++ b/src/routes/events/ae_comp__events_menu_opts.svelte @@ -21,6 +21,7 @@ import { events_trigger, events_trig_kv } from '$lib/stores/ae_events_stores'; +import { pres_mgmt_loc } from '$lib/stores/ae_events_stores__pres_mgmt.svelte'; import { Ban, Barcode, @@ -53,17 +54,17 @@ import {