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
This commit is contained in:
Scott Idem
2026-06-16 11:39:47 -04:00
parent a47a2103eb
commit 2364c0edfb
14 changed files with 204 additions and 273 deletions

View File

@@ -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;
}
}

View File

@@ -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: {}
};

View File

@@ -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

View File

@@ -214,45 +214,29 @@ async function on_delete(method: 'delete' | 'disable') {
</span>
</button>
<!-- <button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="mr-1" />{:else}<ToggleRight
size="1em"
class="mr-1" />{/if}
<span class="grow">
<Plane size="1em" class="mr-1" />
{pres_mgmt_loc.current.hide__launcher_link
? 'Show Launcher Links'
: 'Hide Launcher Links?'}
</span>
</button> -->
<!-- <button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link_legacy =
!pres_mgmt_loc.current.hide__launcher_link_legacy;
}}
class="btn btn-sm ae_btn_surface w-full justify-between">
{#if pres_mgmt_loc.current.hide__launcher_link_legacy}<ToggleLeft
size="1em"
class="mr-1" />{:else}<ToggleRight
size="1em"
class="mr-1" />{/if}
<span class="grow">
<Send size="1em" class="mr-1" />
{pres_mgmt_loc.current.hide__launcher_link_legacy
? 'Show Legacy Launcher Links'
: 'Hide Legacy Launcher Links?'}
</span>
</button> -->
<!-- Launcher link toggle — only visible when admin has enabled launcher
(show__launcher_link) OR user has trusted_access (staff override) -->
{#if pres_mgmt_loc.current.show__launcher_link || $ae_loc.trusted_access}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="mr-1" />{:else}<ToggleRight
size="1em"
class="mr-1" />{/if}
<span class="grow">
<Plane size="1em" class="mr-1" />
{pres_mgmt_loc.current.hide__launcher_link
? 'Show Launcher Links'
: 'Hide Launcher Links?'}
</span>
</button>
{/if}
<button
type="button"

View File

@@ -15,7 +15,6 @@ import {
MapPin,
Pencil,
Plane,
Send,
Settings,
ToggleLeft,
ToggleRight,
@@ -68,7 +67,8 @@ async function on_delete(method: 'delete' | 'disable') {
event_id={$lq__event_obj?.event_id}
ae_core={$ae_loc.edit_mode && $ae_loc.manager_access}
events__locations={$ae_loc.trusted_access}
events__session_search={$events_slct.event_id} />
events__session_search={$events_slct.event_id &&
(!pres_mgmt_loc.current.limit__navigation || $ae_loc.trusted_access)} />
<span
class="ae_menu__object_options flex flex-row flex-wrap items-center justify-around gap-0.5">
@@ -129,16 +129,17 @@ async function on_delete(method: 'delete' | 'disable') {
Display Links
</h4>
<div class="flex flex-col gap-1">
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
{#if pres_mgmt_loc.current.show__launcher_link || $ae_loc.trusted_access}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
size="1em"
class="m-1" />{/if}
<span class="grow">
@@ -147,27 +148,8 @@ async function on_delete(method: 'delete' | 'disable') {
? 'Show Launcher Links'
: 'Hide Launcher Links?'}
</span>
</button>
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link_legacy =
!pres_mgmt_loc.current.hide__launcher_link_legacy;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link_legacy}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
size="1em"
class="m-1" />{/if}
<span class="grow">
<Send size="1em" class="m-1" />
{pres_mgmt_loc.current.hide__launcher_link_legacy
? 'Show Legacy Launcher Links'
: 'Hide Legacy Launcher Links?'}
</span>
</button>
</button>
{/if}
<button
type="button"

View File

@@ -2,14 +2,12 @@
interface Props {
log_lvl?: number;
hide__launcher_link?: boolean;
hide__launcher_link_legacy?: boolean;
lq__event_location_obj: any;
}
let {
log_lvl = 0,
hide__launcher_link = false,
hide__launcher_link_legacy = true,
lq__event_location_obj
}: Props = $props();
@@ -45,7 +43,7 @@ import {
} 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 { Barcode, Eye, EyeOff, Key, Plane, Send } from '@lucide/svelte';
import { Barcode, Eye, EyeOff, Key, Plane } from '@lucide/svelte';
// Exports
// export let event_location_id: string;
// export let event_location_obj: key_val;
@@ -221,20 +219,6 @@ $effect(() => {
</Element_ae_obj_field_editor>
{/if}
<!-- BEGIN: Legacy link -->
<a
data-sveltekit-preload-data="false"
href="/event/{$lq__event_location_obj?.event_id}/launcher/{$lq__event_location_obj?.event_location_id}"
class:hidden={hide__launcher_link_legacy}
class="btn btn-sm preset-tonal-secondary hover:preset-filled-secondary-500"
title="Launcher: {$lq__event_location_obj?.name} {$lq__event_location_obj?.event_location_id}">
<Send size="1em" class="m-1" />
{@html $lq__event_location_obj?.name
? $lq__event_location_obj?.name
: ae_snip.html__not_set}
</a>
<!-- END: Legacy link -->
<a
data-sveltekit-preload-data="false"
href="/events/{$lq__event_location_obj?.event_id}/launcher/{$lq__event_location_obj?.event_location_id}"

View File

@@ -487,7 +487,6 @@ if (
hide__session_location={pres_mgmt_loc.current.hide__session_li_location_field}
hide__session_poc={pres_mgmt_loc.current.hide__session_poc ||
!pres_mgmt_loc.current.show__session_li_poc_field}
hide__launcher_link_legacy={pres_mgmt_loc.current.hide__launcher_link_legacy}
hide__launcher_link={pres_mgmt_loc.current.hide__launcher_link}
hide__location_link={pres_mgmt_loc.current.hide__location_link}
log_lvl={1} />

View File

@@ -71,10 +71,11 @@ const cfg_defaults: PressMgmtRemoteCfg = {
show__email_access_link: false,
show__launcher_link: false,
show__session_li_poc_field: 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: {}
};
@@ -99,12 +100,10 @@ $effect(() => {
let is_dirty = $derived(draft_initialized && JSON.stringify(draft) !== initial_json);
// ---------------------------------------------------------------------------
// JSON fields (file_purpose_option_kv, hide__report_kv) as textarea strings
// ---------------------------------------------------------------------------
// JSON fields (file_purpose_option_kv) as textarea string
// hide__report_kv is edited via structured per-slug toggles (no JSON textarea needed)
let file_purpose_json_str = $state('');
let file_purpose_json_error = $state('');
let report_kv_json_str = $state('');
let report_kv_json_error = $state('');
$effect(() => {
if (draft_initialized) {
@@ -112,10 +111,6 @@ $effect(() => {
file_purpose_json_str = draft.file_purpose_option_kv
? JSON.stringify(draft.file_purpose_option_kv, null, 2)
: '';
report_kv_json_str =
draft.hide__report_kv && Object.keys(draft.hide__report_kv).length
? JSON.stringify(draft.hide__report_kv, null, 2)
: '';
});
}
});
@@ -133,19 +128,6 @@ function parse_file_purpose_json() {
}
}
function parse_report_kv_json() {
report_kv_json_error = '';
if (!report_kv_json_str.trim()) {
draft.hide__report_kv = {};
return;
}
try {
draft.hide__report_kv = JSON.parse(report_kv_json_str);
} catch (e) {
report_kv_json_error = 'Invalid JSON';
}
}
// ---------------------------------------------------------------------------
// Save
// ---------------------------------------------------------------------------
@@ -154,8 +136,7 @@ let save_status: 'idle' | 'saving' | 'success' | 'error' = $state('idle');
async function save() {
if (!event_id) return;
parse_file_purpose_json();
parse_report_kv_json();
if (file_purpose_json_error || report_kv_json_error) return;
if (file_purpose_json_error) return;
save_status = 'saving';
try {
@@ -459,7 +440,9 @@ function toggle(key: string) {
{#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' }
{ field: 'show__launcher_link' as const, label: 'Launcher Link' },
{ field: 'show__session_qr' as const, label: 'Session QR Code' },
{ field: 'show__presenter_qr' as const, label: 'Presenter QR Code' }
] as item (item.field)}
<label class="flex items-center gap-2">
<input type="checkbox" class="checkbox" bind:checked={draft[item.field]} />
@@ -507,14 +490,11 @@ function toggle(key: string) {
{#if sections.navigation}<ChevronUp size="1em" />{:else}<ChevronDown size="1em" />{/if}
</button>
{#if sections.navigation}
<div class="border-surface-200-800 grid grid-cols-2 gap-3 border-t px-4 py-3">
<div class="border-surface-200-800 grid grid-cols-1 gap-3 border-t px-4 py-3">
<p class="text-surface-500 text-xs">Hides the Session Search link for non-staff users, keeping presenters within their assigned session.</p>
<label class="flex items-center gap-2">
<input type="checkbox" class="checkbox" bind:checked={draft.limit__navigation} />
<span class="text-sm">Limit Navigation</span>
</label>
<label class="flex items-center gap-2">
<input type="checkbox" class="checkbox" bind:checked={draft.limit__options} />
<span class="text-sm">Limit Options</span>
<span class="text-sm">Limit Navigation (hide Session Search for non-staff)</span>
</label>
</div>
{/if}
@@ -564,20 +544,33 @@ function toggle(key: string) {
</button>
{#if sections.reports}
<div class="border-surface-200-800 space-y-2 border-t px-4 py-3">
<div class="flex items-start gap-1 text-xs opacity-60">
<Info size="1em" class="mt-0.5 flex-none" />
JSON object: key = report slug, value = <code>true</code> to hide that report section.
e.g. <code>&#123; "session_no_bio": true &#125;</code>
</div>
<textarea
class="input font-mono text-xs"
rows={5}
placeholder='&#123; "session_no_bio": true &#125;'
bind:value={report_kv_json_str}
onblur={parse_report_kv_json}></textarea>
{#if report_kv_json_error}
<p class="text-error-500 text-xs">{report_kv_json_error}</p>
{/if}
<p class="text-surface-500 text-xs">Hidden reports are not shown to staff unless in edit mode.</p>
{#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)}
<label class="flex items-center gap-2">
<input
type="checkbox"
class="checkbox"
checked={draft.hide__report_kv[rpt.slug] ?? false}
onchange={(e) => {
if (e.currentTarget.checked) {
draft.hide__report_kv[rpt.slug] = true;
} else {
delete draft.hide__report_kv[rpt.slug];
draft.hide__report_kv = { ...draft.hide__report_kv };
}
}} />
<span class="text-sm">Hide: {rpt.label}</span>
</label>
{/each}
</div>
{/if}
</section>

View File

@@ -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)} />
<div
class="flex w-full flex-row flex-wrap items-center justify-between gap-1">
@@ -181,20 +182,22 @@ async function on_delete(method: 'delete' | 'disable') {
Display
</h4>
<div class="flex flex-row flex-wrap gap-2">
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr =
!pres_mgmt_loc.current.show_content__presenter_qr;
}}
class="btn btn-sm"
class:ae_btn_surface={pres_mgmt_loc.current.show_content__presenter_qr}
class:ae_btn_surface_outlined={!pres_mgmt_loc.current.show_content__presenter_qr}>
<QrCode size="1em" class="mr-1" />
{pres_mgmt_loc.current.show_content__presenter_qr
? 'Hide QR Code'
: 'Show QR Code'}
</button>
{#if pres_mgmt_loc.current.show__presenter_qr || $ae_loc.trusted_access}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr =
!pres_mgmt_loc.current.show_content__presenter_qr;
}}
class="btn btn-sm"
class:ae_btn_surface={pres_mgmt_loc.current.show_content__presenter_qr}
class:ae_btn_surface_outlined={!pres_mgmt_loc.current.show_content__presenter_qr}>
<QrCode size="1em" class="mr-1" />
{pres_mgmt_loc.current.show_content__presenter_qr
? 'Hide QR Code'
: 'Show QR Code'}
</button>
{/if}
</div>
</section>
{/if}

View File

@@ -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'}
<LoaderCircle size="1em" class="animate-spin" />
@@ -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'}

View File

@@ -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

View File

@@ -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),

View File

@@ -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}></Comp_event_session_obj_li>

View File

@@ -76,6 +76,7 @@ import {
class:hidden={!pres_mgmt_loc.current.expand__menu_opts}>
{#if $ae_loc.authenticated_access}
<div class="flex flex-col items-end justify-center gap-1">
<p class="text-surface-500 w-full text-right text-xs font-semibold uppercase tracking-wide">Query Limits</p>
<span class="flex flex-col items-end justify-center gap-1">
<!-- Max person select options -->
<span
@@ -252,6 +253,7 @@ import {
{/if}
<div class="flex flex-col flex-wrap items-center justify-evenly gap-1">
<p class="text-surface-500 w-full text-center text-xs font-semibold uppercase tracking-wide">Display &amp; Search</p>
<button
type="button"
onclick={() => {
@@ -340,6 +342,7 @@ import {
</div>
<div class="flex flex-col items-center justify-center gap-1">
<p class="text-surface-500 w-full text-center text-xs font-semibold uppercase tracking-wide">Staff Options</p>
{#if $ae_loc.trusted_access}
<div class="flex flex-col items-center justify-center gap-1">
{#if pres_mgmt_loc.current.show__copy_access_link}
@@ -390,64 +393,68 @@ import {
{#if $ae_loc.authenticated_access}
<div class="flex flex-col items-end justify-center gap-1">
{#if pres_mgmt_loc.current.show_content__session_qr}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__session_qr = false;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center"
title="Showing Session QR Code">
<ToggleRight size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Hide Session QR
</span>
</button>
{:else}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__session_qr = true;
}}
class="btn btn-sm ae_btn_surface_outlined w-full justify-between text-center"
title="Show Session QR Code">
<ToggleLeft size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Show Session QR Code?
</span>
</button>
{#if pres_mgmt_loc.current.show__session_qr || $ae_loc.trusted_access}
{#if pres_mgmt_loc.current.show_content__session_qr}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__session_qr = false;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center"
title="Showing Session QR Code">
<ToggleRight size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Hide Session QR
</span>
</button>
{:else}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__session_qr = true;
}}
class="btn btn-sm ae_btn_surface_outlined w-full justify-between text-center"
title="Show Session QR Code">
<ToggleLeft size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Show Session QR Code?
</span>
</button>
{/if}
{/if}
{#if pres_mgmt_loc.current.show_content__presenter_qr}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr = false;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center"
title="Showing Presenter QR Code">
<ToggleRight size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Hide Presenter QR
</span>
</button>
{:else}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr = true;
}}
class="btn btn-sm ae_btn_surface_outlined w-full justify-between text-center"
title="Show Presenter QR Code">
<ToggleLeft size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Show Presenter QR Code?
</span>
</button>
{#if pres_mgmt_loc.current.show__presenter_qr || $ae_loc.trusted_access}
{#if pres_mgmt_loc.current.show_content__presenter_qr}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr = false;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center"
title="Showing Presenter QR Code">
<ToggleRight size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Hide Presenter QR
</span>
</button>
{:else}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.show_content__presenter_qr = true;
}}
class="btn btn-sm ae_btn_surface_outlined w-full justify-between text-center"
title="Show Presenter QR Code">
<ToggleLeft size="1em" class="m-1" />
<span class="grow">
<QrCode size="1em" class="m-1" />
Show Presenter QR Code?
</span>
</button>
{/if}
{/if}
</div>
{/if}
@@ -455,47 +462,29 @@ import {
{#if $ae_loc.authenticated_access}
<div class="flex flex-col items-center justify-center gap-1">
<!-- Show/Hide launcher links (new version) -->
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
size="1em"
class="m-1" />{/if}
<span class="grow">
<Plane size="1em" class="m-1" />
{pres_mgmt_loc.current.hide__launcher_link
? 'Show Launcher Links'
: 'Hide Launcher Links?'}
</span>
</button>
<!-- Show/Hide launcher links (legacy version) -->
<!-- <button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link_legacy =
!pres_mgmt_loc.current.hide__launcher_link_legacy;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link_legacy}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
size="1em"
class="m-1" />{/if}
<span class="grow">
<Send size="1em" class="m-1" />
{pres_mgmt_loc.current.hide__launcher_link_legacy
? 'Show Legacy Launcher Links'
: 'Hide Legacy Launcher Links?'}
</span>
</button> -->
<!-- Show/Hide launcher links — only visible when admin has enabled launcher (show__launcher_link)
OR user has trusted_access (staff onsite override) -->
{#if pres_mgmt_loc.current.show__launcher_link || $ae_loc.trusted_access}
<button
type="button"
onclick={() => {
pres_mgmt_loc.current.hide__launcher_link =
!pres_mgmt_loc.current.hide__launcher_link;
}}
class="btn btn-sm ae_btn_surface w-full justify-between text-center">
{#if pres_mgmt_loc.current.hide__launcher_link}<ToggleLeft
size="1em"
class="m-1" />{:else}<ToggleRight
size="1em"
class="m-1" />{/if}
<span class="grow">
<Plane size="1em" class="m-1" />
{pres_mgmt_loc.current.hide__launcher_link
? 'Show Launcher Links'
: 'Hide Launcher Links?'}
</span>
</button>
{/if}
<!-- Show/Hide links to the location (room) -->
<button