Svelte: fix 3 svelte-check warnings (non-IDAA) + Playwright test type error

- ae_comp__badge_print_controls: select_ref_badge_type declared as $state()
  so Svelte 5 tracks DOM ref assignment correctly (was plain let).
- launcher_cfg_section: <svelte:component this={icon}> replaced with
  let Icon = $derived(icon) + <Icon /> — svelte_component_deprecated fix.
- launcher_file_cont: same svelte_component_deprecated fix for FileIcon.
- badge_print_layout.test.ts: inject_idb signature changed from (badge, template)
  to ({ badge, template }) — page.evaluate() passes exactly one argument;
  all three call sites updated to pass { badge: mock_badge, template: mock_template }.
This commit is contained in:
Scott Idem
2026-03-16 13:51:01 -04:00
parent 6ca2314472
commit 1291b225c6
4 changed files with 12 additions and 9 deletions

View File

@@ -293,7 +293,7 @@
let input_ref_location: HTMLInputElement | undefined; let input_ref_location: HTMLInputElement | undefined;
let input_ref_pronouns: HTMLInputElement | undefined; let input_ref_pronouns: HTMLInputElement | undefined;
let input_ref_allow_tracking: HTMLInputElement | undefined; let input_ref_allow_tracking: HTMLInputElement | undefined;
let select_ref_badge_type: HTMLSelectElement | undefined; let select_ref_badge_type: HTMLSelectElement | undefined = $state();
$effect(() => { $effect(() => {
const field = active_field; const field = active_field;

View File

@@ -26,6 +26,9 @@
on_toggle on_toggle
}: Props = $props(); }: Props = $props();
// Uppercase alias required: Svelte 5 treats lowercase tags as HTML elements.
let Icon = $derived(icon);
function toggle_expand() { function toggle_expand() {
if (state === 'collapsed') { if (state === 'collapsed') {
state = 'auto'; state = 'auto';
@@ -72,8 +75,7 @@
onclick={toggle_expand} onclick={toggle_expand}
> >
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<svelte:component <Icon
this={icon}
size="1em" size="1em"
class="w-5 text-center opacity-70 {state === 'auto' class="w-5 text-center opacity-70 {state === 'auto'
? 'text-primary-500' ? 'text-primary-500'

View File

@@ -309,7 +309,7 @@
</span> </span>
{:then result} {:then result}
{@const FileIcon = ae_util.file_extension_icon_lucide(event_file_obj.extension)} {@const FileIcon = ae_util.file_extension_icon_lucide(event_file_obj.extension)}
<svelte:component this={FileIcon} size="1em" class="inline mx-0.5" /> <FileIcon size="1em" class="inline mx-0.5" />
{event_file_obj.extension} {event_file_obj.extension}
{#if result === null || result === false} {#if result === null || result === false}
<span class="text-error-500" <span class="text-error-500"

View File

@@ -58,8 +58,9 @@ const mock_template = {
/** Injects records into ae_events_db IndexedDB tables via raw IDB API. /** Injects records into ae_events_db IndexedDB tables via raw IDB API.
* Must be called from page.evaluate() after the page has navigated (Dexie * Must be called from page.evaluate() after the page has navigated (Dexie
* schema is already initialised from the app's first open). */ * schema is already initialised from the app's first open).
async function inject_idb(badge: object, template: object): Promise<void> { * Single-argument form required: page.evaluate() passes exactly one arg. */
async function inject_idb({ badge, template }: { badge: object; template: object }): Promise<void> {
const db = await new Promise<IDBDatabase>((resolve, reject) => { const db = await new Promise<IDBDatabase>((resolve, reject) => {
const req = indexedDB.open('ae_events_db'); const req = indexedDB.open('ae_events_db');
req.onsuccess = () => resolve(req.result as IDBDatabase); req.onsuccess = () => resolve(req.result as IDBDatabase);
@@ -120,7 +121,7 @@ test.describe('Badge Print Page — print layout centering', () => {
await page.waitForLoadState('domcontentloaded'); await page.waitForLoadState('domcontentloaded');
// Inject badge + template directly into IndexedDB so LiveQuery fires // Inject badge + template directly into IndexedDB so LiveQuery fires
await page.evaluate(inject_idb, [mock_badge, mock_template] as any); await page.evaluate(inject_idb, { badge: mock_badge, template: mock_template });
// Wait for LiveQuery to render the badge wrapper // Wait for LiveQuery to render the badge wrapper
await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 }); await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 });
@@ -154,7 +155,7 @@ test.describe('Badge Print Page — print layout centering', () => {
await page.goto(`/events/${event_id}/badges/${badge_id}/print`); await page.goto(`/events/${event_id}/badges/${badge_id}/print`);
await page.waitForLoadState('domcontentloaded'); await page.waitForLoadState('domcontentloaded');
await page.evaluate(inject_idb, [mock_badge, mock_template] as any); await page.evaluate(inject_idb, { badge: mock_badge, template: mock_template });
await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 }); await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 });
await page.emulateMedia({ media: 'print' }); await page.emulateMedia({ media: 'print' });
@@ -199,7 +200,7 @@ test.describe('Badge Print Page — print layout centering', () => {
await page.goto(`/events/${event_id}/badges/${badge_id}/print`); await page.goto(`/events/${event_id}/badges/${badge_id}/print`);
await page.waitForLoadState('domcontentloaded'); await page.waitForLoadState('domcontentloaded');
await page.evaluate(inject_idb, [mock_badge, mock_template] as any); await page.evaluate(inject_idb, { badge: mock_badge, template: mock_template });
await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 }); await page.waitForSelector('.event_badge_wrapper', { timeout: 8000 });
await page.emulateMedia({ media: 'print' }); await page.emulateMedia({ media: 'print' });