From 752dca290aea2a2cc69d5648f92de19fdf8877ba Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 13 Mar 2026 12:42:12 -0400 Subject: [PATCH] feat(launcher): dedicated Digital Poster session card-grid view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create launcher_session_view_posters.svelte — a touch-first card-grid layout for Digital Poster sessions, designed for tablet/phone PWA use. Layout: - 1 column on mobile, 2 on sm, 3 on xl - Each poster card: title (line-clamp-3) + presenter name/affiliation + 'Open Poster' action button at card bottom - Poster code (or 1-based index fallback) badge in top-right corner - Card active:scale-[0.98] for tactile touch press feedback - Sticky compact session header strip with name, code, and poster count - Optional 'Session Resources' strip for rare session-level files - overflow-y-auto + grow so the grid scrolls; header strip stays fixed Integration: - launcher_session_view.svelte: import + delegate when type_code==='poster' - launcher_file_cont.svelte: min-w-96 → w-full on poster button so it fills its container (card or list row) without overflow on small screens - WS open/close/zoom command pipeline unchanged (all in launcher_file_cont and +layout.svelte which were not modified for the WS paths) --- .../(launcher)/launcher_file_cont.svelte | 2 +- .../(launcher)/launcher_session_view.svelte | 7 + .../launcher_session_view_posters.svelte | 366 ++++++++++++++++++ 3 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 src/routes/events/[event_id]/(launcher)/launcher_session_view_posters.svelte diff --git a/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte b/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte index 6a8a7312..ea204358 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher_file_cont.svelte @@ -258,7 +258,7 @@ { modal__open_event_file_id = event_file_id; modal__event_file_obj = event_file_obj; diff --git a/src/routes/events/[event_id]/(launcher)/launcher_session_view.svelte b/src/routes/events/[event_id]/(launcher)/launcher_session_view.svelte index 194be093..3c5ae461 100644 --- a/src/routes/events/[event_id]/(launcher)/launcher_session_view.svelte +++ b/src/routes/events/[event_id]/(launcher)/launcher_session_view.svelte @@ -16,6 +16,8 @@ import Launcher_presentation_view from './launcher_presentation_view.svelte'; import Launcher_presenter_view from './launcher_presenter_view.svelte'; import Launcher_presenter_view_posters from './launcher_presenter_view_posters.svelte'; + // WHY: Poster sessions get a dedicated card-grid view optimised for touch/PWA use. + import Launcher_session_view_posters from './launcher_session_view_posters.svelte'; import { liveQuery } from 'dexie'; // import { core_func } from '$lib/ae_core_functions'; @@ -163,6 +165,10 @@ {/if} {#if $lq__event_session_obj && $lq__event_session_obj.event_session_id} + {#if type_code === 'poster'} + + + {:else} {:else} No session selected diff --git a/src/routes/events/[event_id]/(launcher)/launcher_session_view_posters.svelte b/src/routes/events/[event_id]/(launcher)/launcher_session_view_posters.svelte new file mode 100644 index 00000000..39b64008 --- /dev/null +++ b/src/routes/events/[event_id]/(launcher)/launcher_session_view_posters.svelte @@ -0,0 +1,366 @@ + + + +
+ + {#if $events_sess.launcher?.loading__session_id_status} + + + Loading... + + {/if} + + {#if $lq__event_session_obj && $lq__event_session_obj.event_session_id} + + +
+

+ + {$lq__event_session_obj.name} +

+ + + + {#if poster_count > 0} + + {poster_count}× + + {/if} + + + {#if $lq__event_session_obj.code} + + {$lq__event_session_obj.code} + + {/if} + +
+ + + {#if $lq__event_file_obj_li && $lq__event_file_obj_li.length} +
+

+ Session Resources: +

+
    + {#each $lq__event_file_obj_li as event_file_obj (event_file_obj.event_file_id)} +
  • + +
  • + {/each} +
+
+ {/if} + + + {#if $lq__event_presentation_obj_li === undefined} + +
+ + Loading posters… +
+ + {:else if $lq__event_presentation_obj_li.length === 0} + +
+ +

No posters in this session yet.

+
+ + {:else} + +
    + {#each $lq__event_presentation_obj_li as presentation, i (presentation.event_presentation_id)} + {@const presenters_for_this = ( + $lq__event_presenter_obj_li ?? [] + ).filter( + (p) => + p.event_presentation_id === + presentation.event_presentation_id + )} + + +
  • + + + {presentation.code || '#' + (i + 1)} + + + +

    + {presentation.name} +

    + + + {#if presenters_for_this.length} +
    + {#each presenters_for_this as presenter (presenter.event_presenter_id)} +

    + {#if presenter.given_name && presenter.given_name !== 'Group'} + + {presenter.full_name} + {#if presenter.affiliations} + + — {presenter.affiliations} + + {/if} + {:else if presenter.given_name === 'Group'} + + {presenter.affiliations} + {:else} + + {/if} +

    + {/each} +
    + {/if} + + +
    + + + + + {#each presenters_for_this as presenter (presenter.event_presenter_id)} + + {/each} +
    +
  • + {/each} +
+ {/if} + + {:else} + +
+ + No session selected +
+ {/if} +