From 68b104ed40759632902fb77444e4e8a4b9ab672e Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Thu, 19 Mar 2026 19:20:48 +0300 Subject: [PATCH] Move preview button to per-slot in edit form, remove card dropdown Each template slot now has its own Preview button next to the label. Clicking it renders the current editor content via preview-raw API and shows the result inline below the editor. Removed the old per-card preview dropdown since preview is now part of editing. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/routes/template-configs/+page.svelte | 63 ++++++++----------- 1 file changed, 26 insertions(+), 37 deletions(-) diff --git a/frontend/src/routes/template-configs/+page.svelte b/frontend/src/routes/template-configs/+page.svelte index 6f87530..97c25d1 100644 --- a/frontend/src/routes/template-configs/+page.svelte +++ b/frontend/src/routes/template-configs/+page.svelte @@ -21,9 +21,7 @@ let editing = $state(null); let error = $state(''); let confirmDelete = $state(null); - let previewSlot = $state('message_assets_added'); - let previewResult = $state(''); - let previewId = $state(null); + let slotPreview = $state>({}); const defaultForm = () => ({ name: '', icon: '', @@ -80,12 +78,13 @@ } catch (err: any) { error = err.message; } } - async function preview(id: number, slot: string) { - previewId = id; previewSlot = slot; + async function previewSlot(slotKey: string) { + const template = (form as any)[slotKey] || ''; + if (!template) { slotPreview[slotKey] = '(empty)'; return; } try { - const res = await api(`/template-configs/${id}/preview?slot=${slot}`, { method: 'POST' }); - previewResult = res.rendered; - } catch (err: any) { previewResult = `Error: ${err.message}`; } + const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template }) }); + slotPreview[slotKey] = res.error ? `Error: ${res.error}` : res.rendered; + } catch (err: any) { slotPreview[slotKey] = `Error: ${err.message}`; } } function remove(id: number) { @@ -131,13 +130,24 @@
- {#if varsRef[slot.key]} - - {/if} +
+ {#if (slot.rows || 2) > 2} + + {/if} + {#if varsRef[slot.key]} + + {/if} +
{#if (slot.rows || 2) > 2} (form as any)[slot.key] = v} rows={slot.rows || 6} /> + {#if slotPreview[slot.key]} +
+
{slotPreview[slot.key]}
+
+ {/if} {:else} @@ -168,32 +178,11 @@ {#if config.icon}{/if}

{config.name}

-
{config.message_assets_added?.slice(0, 120)}...
- {#if previewResult && previewId === config.id} -
-

{previewSlot}:

-
{previewResult}
-
- {/if} +
{config.message_assets_added?.slice(0, 150)}...
-
-
- - -
-
- -
+
+ +