From ad3b27b7477bdf859162a0816e436064ded0d97e Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Sat, 11 Apr 2026 19:37:31 -0400 Subject: [PATCH] fix(badges): auto-save font sizes on adjustment Font size changes now persist automatically (600ms debounce) without requiring the user to find and click Lock Sizes in the collapsed Staff section. reset_font_sizes_to_auto continues to handle its own save. Co-Authored-By: Claude Sonnet 4.6 --- .../ae_comp__badge_print_controls.svelte | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_print_controls.svelte b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_print_controls.svelte index 92e289d4..8235c5f9 100644 --- a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_print_controls.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/ae_comp__badge_print_controls.svelte @@ -731,6 +731,34 @@ async function reset_font_sizes_to_auto() { } } +// --- Auto-save font sizes on change --- +// When a trusted user adjusts font sizes the change is saved automatically after a +// short debounce so they don't have to find and click "Lock Sizes" every time. +// WHY: the Lock Sizes button is in the Staff section (starts collapsed) and users +// routinely adjusted font sizes and then reloaded, losing their changes. +// reset_font_sizes_to_auto handles its own save, so we only auto-save when at +// least one size is non-null (i.e. the "reset to auto" path is excluded here). +let _font_auto_save_timer: ReturnType | null = null; +$effect(() => { + // Re-read the dirty+override signals inside the effect so Svelte tracks them. + const dirty = sizes_are_dirty; + const has_override = has_any_size_override; + if (!dirty || !has_override || !is_trusted || !$lq__event_badge_obj?.event_badge_id) { + return; + } + if (_font_auto_save_timer !== null) clearTimeout(_font_auto_save_timer); + _font_auto_save_timer = setTimeout(() => { + _font_auto_save_timer = null; + lock_font_sizes(); + }, 600); + return () => { + if (_font_auto_save_timer !== null) { + clearTimeout(_font_auto_save_timer); + _font_auto_save_timer = null; + } + }; +}); + // TC modal ref for the lead scanning terms & conditions dialog let tc_dialog_ref: HTMLDialogElement | undefined;