diff --git a/frontend/src/routes/template-configs/+page.svelte b/frontend/src/routes/template-configs/+page.svelte index 6866bf3..afb2bd4 100644 --- a/frontend/src/routes/template-configs/+page.svelte +++ b/frontend/src/routes/template-configs/+page.svelte @@ -28,7 +28,7 @@ let slotErrorTypes = $state>({}); let validateTimers: Record> = {}; - function validateSlot(slotKey: string, template: string) { + function validateSlot(slotKey: string, template: string, immediate = false) { // Clear previous timer if (validateTimers[slotKey]) clearTimeout(validateTimers[slotKey]); if (!template) { @@ -40,8 +40,7 @@ return; } - // Debounce 800ms - validateTimers[slotKey] = setTimeout(async () => { + const doValidate = async () => { try { const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template, target_type: previewTargetType }) }); slotErrors = { ...slotErrors, [slotKey]: res.error || '' }; @@ -60,7 +59,21 @@ slotErrorLines = { ...slotErrorLines, [slotKey]: null }; slotErrorTypes = { ...slotErrorTypes, [slotKey]: '' }; } - }, 800); + }; + if (immediate) { doValidate(); } + else { validateTimers[slotKey] = setTimeout(doValidate, 800); } + } + + function refreshAllPreviews() { + // Re-validate and re-preview all slots that have content (immediate, no debounce) + for (const group of templateSlots) { + for (const slot of group.slots) { + const template = (form as any)[slot.key]; + if (template && slot.key !== 'date_format') { + validateSlot(slot.key, template, true); + } + } + } } const defaultForm = () => ({ @@ -181,17 +194,12 @@
- -
- - -
+ +
{#each templateSlots as group}