From 5f5bd06a787c84b351f33ec7b5a26540e30ebf36 Mon Sep 17 00:00:00 2001 From: Peter Meier Date: Wed, 27 May 2026 16:32:25 +0200 Subject: [PATCH] =?UTF-8?q?feat(stellungnahme):=20E-Mail,=20Name=20in=20Gr?= =?UTF-8?q?u=C3=9Fformel,=20Datum-Fix,=20UX-Polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - E-Mail-Button: mailto-Link wenn recipientEmail im Block gesetzt - Name in Grußformel: "Mit freundlichen Grüßen\n\nMax Mustermann" - Datum-Fix: heute in buildText() berechnet, nicht beim Render - Disabled-Hint: roter Hinweis wenn Name fehlt - "Alle ab" klappt Gruppe ein (Symmetrie zu "Alle" öffnet) - Schritt X von Y unter Step-Indikator - recipientEmail-Feld in StellingnahmeGeneratorBlockData Co-Authored-By: Claude Sonnet 4.6 --- src/lib/block-types.ts | 2 + .../blocks/StellingnahmeGeneratorBlock.svelte | 69 +++++++++---------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/lib/block-types.ts b/src/lib/block-types.ts index 9e9e72f..92153ca 100644 --- a/src/lib/block-types.ts +++ b/src/lib/block-types.ts @@ -470,5 +470,7 @@ export interface StellingnahmeGeneratorBlockData { allgemeineArgumente?: TextFragment[]; /** ISO-Datum: Einwendungsfrist-Ende (z.B. "2026-07-04"). */ deadline?: string; + /** E-Mail der Planungsstelle — aktiviert Mail-Button. */ + recipientEmail?: string; layout?: BlockLayout; } diff --git a/src/lib/components/blocks/StellingnahmeGeneratorBlock.svelte b/src/lib/components/blocks/StellingnahmeGeneratorBlock.svelte index 49bd951..8077b8d 100644 --- a/src/lib/components/blocks/StellingnahmeGeneratorBlock.svelte +++ b/src/lib/components/blocks/StellingnahmeGeneratorBlock.svelte @@ -169,12 +169,11 @@ else next.add(s); } selectedSlugs = next; - // Expand group when selecting so user sees what they picked - if (!allSelected) { - const nextGroups = new Set(expandedGroups); - nextGroups.add(group.slug); - expandedGroups = nextGroups; - } + // Expand on select, collapse on deselect + const nextGroups = new Set(expandedGroups); + if (allSelected) nextGroups.delete(group.slug); + else nextGroups.add(group.slug); + expandedGroups = nextGroups; } // Combined selection for output — ortskonkrete first, then allgemeine @@ -196,46 +195,35 @@ Regionale Planungsstelle Karl-Liebknecht-Straße 4 98527 Suhl`; - const heute = $derived( - new Date().toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric" }), - ); const gebietsBez = $derived( windArea ? `${windArea.gebiets_nr}${windArea.bezeichnung ? " – " + windArea.bezeichnung : ""}` : "", ); + const mailtoLink = $derived.by(() => { + if (!block.recipientEmail || !outputText) return ""; + const subject = `Einwendung Regionalplan Südwestthüringen – Vorranggebiet ${gebietsBez}`; + return `mailto:${block.recipientEmail}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(outputText)}`; + }); + function buildText(): string { + const heute = new Date().toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric" }); const sender = [absenderName.trim(), absenderAnschrift.trim(), absenderOrt.trim()] .filter(Boolean) .join("\n"); const betreff = `Einwendung zum Entwurf des Regionalplans Südwestthüringen (2. Entwurf)\nWindenergie-Vorranggebiet ${gebietsBez}`; - let body = ""; - - if (mode === "fertig") { - body += `ich erhebe Einwendung gegen die Ausweisung des Windenergie-Vorranggebiets ${gebietsBez} im 2. Entwurf des Regionalplans Südwestthüringen.\n\n`; - for (const f of selectedFragments) { - if (f.title) body += `${f.title}\n\n`; - if (f.text) body += `${stripMd(f.text)}\n\n`; - } - if (persoenlicheEingabe.trim()) - body += `Persönliche Betroffenheit\n\n${persoenlicheEingabe.trim()}\n\n`; - body += - "Ich fordere die Regionalplanung auf, das Vorranggebiet aus dem Regionalplan zu streichen oder zumindest einer erneuten, umfassenden Überprüfung zu unterziehen.\n\nMit freundlichen Grüßen"; - } else { - body += `Gliederung meiner Einwendung (bitte in eigenen Worten ausformulieren):\n\n`; - let i = 1; - for (const f of selectedFragments) { - body += `${i}. ${f.title ?? f._slug.replace(/_/g, " ")}\n`; - if (f.bulletPoints?.length) - for (const bp of f.bulletPoints) body += ` - ${bp}\n`; - body += "\n"; - i++; - } - if (persoenlicheEingabe.trim()) - body += `${i}. Persönliche Betroffenheit\n ${persoenlicheEingabe.trim()}\n\n`; - body += "Ich fordere die Regionalplanung auf, das Vorranggebiet aus dem Regionalplan zu streichen oder zumindest einer erneuten, umfassenden Überprüfung zu unterziehen.\n\nMit freundlichen Grüßen"; + const closing = absenderName.trim() + ? `Mit freundlichen Grüßen\n\n${absenderName.trim()}` + : "Mit freundlichen Grüßen"; + let body = `ich erhebe Einwendung gegen die Ausweisung des Windenergie-Vorranggebiets ${gebietsBez} im 2. Entwurf des Regionalplans Südwestthüringen.\n\n`; + for (const f of selectedFragments) { + if (f.title) body += `${f.title}\n\n`; + if (f.text) body += `${stripMd(f.text)}\n\n`; } + if (persoenlicheEingabe.trim()) + body += `Persönliche Betroffenheit\n\n${persoenlicheEingabe.trim()}\n\n`; + body += `Ich fordere die Regionalplanung auf, das Vorranggebiet aus dem Regionalplan zu streichen oder zumindest einer erneuten, umfassenden Überprüfung zu unterziehen.\n\n${closing}`; return [sender, "", heute, "", "An:", RECIPIENT, "", "Betreff: " + betreff.split("\n")[0], betreff.split("\n")[1] ?? "", "", "Sehr geehrte Damen und Herren,", "", body.trimEnd()] .join("\n") @@ -473,7 +461,7 @@ Karl-Liebknecht-Straße 4 {/if} -
+
{#each Array.from({ length: TOTAL_STEPS }, (_, i) => i) as s}
-
+
+ {#if !absenderName.trim()} +

Bitte Namen eintragen, um den Text zu erstellen.

+ {:else} +
+ {/if} {#if showOutput}
@@ -828,6 +822,9 @@ Karl-Liebknecht-Straße 4 + {#if mailtoLink} + Per E-Mail senden + {/if}
{outputText}