From b240c7ab121aee46cf98343915802ee35e5fbcbe Mon Sep 17 00:00:00 2001 From: titver968 Date: Mon, 8 Dec 2025 11:11:28 +0100 Subject: [PATCH] E-Mail generierung --- prisma/prisma/praktika.db | Bin 94208 -> 94208 bytes src/routes/admin/anmeldungen/+page.svelte | 187 ++++++++++++++++++++-- 2 files changed, 172 insertions(+), 15 deletions(-) diff --git a/prisma/prisma/praktika.db b/prisma/prisma/praktika.db index 9ba07693ed97df3b7dd31b8eae12245ea46ae164..ecf435fe4ca638ba07f7594e549a146bdfa6c9b4 100644 GIT binary patch delta 185 zcmZp8z}oPDb%Hcw-9#B@#=4COulg7{CVThq=HO=F+sU8B$Gw?v!e3sgMr{RY22o)} zMQMInaaC(kenv(|UPeV$M#jm8^D2cL{oGys{C$00{TOHcE%+M6%CvdIys$=&%MARF z_&@Sr-p;4Mc$A-qk6DosrgZv!eMWVTJIwr__@DFN+0JLcc#fZoiy3Gl*o5iN>=_j} fJ}~fqWl0Yvj1W z!2gKLxRpvEn diff --git a/src/routes/admin/anmeldungen/+page.svelte b/src/routes/admin/anmeldungen/+page.svelte index 4880952..f278d3c 100644 --- a/src/routes/admin/anmeldungen/+page.svelte +++ b/src/routes/admin/anmeldungen/+page.svelte @@ -20,7 +20,7 @@ wunsch3?: { id: number; name: string }; timestamp: number; id: number; - status?: 'pending' | 'accepted' | 'rejected'; // processing entfernt + status?: 'pending' | 'accepted' | 'rejected'; assignedDienststelle?: { id: number; name: string }; processedBy?: string; processedAt?: number; @@ -35,7 +35,7 @@ let isLoading = true; let error = ''; - // Filter für Status (processing entfernt) + // Filter für Status let statusFilter: 'all' | 'pending' | 'accepted' | 'rejected' = 'all'; let filteredAnmeldungen: Anmeldung[] = []; @@ -63,7 +63,16 @@ Ihr Praktikumsteam`; let isLoadingEmailConfig = false; let isSavingEmailConfig = false; - // Status-Badge Funktionen (processing entfernt) + // E-Mail Preview Modal State + let showEmailPreview = false; + let emailPreviewData: { + to: string; + subject: string; + body: string; + } | null = null; + let emailCopied = false; + + // Status-Badge Funktionen function getStatusColor(status: string): string { switch (status) { case 'pending': return 'bg-yellow-100 text-yellow-800'; @@ -110,7 +119,6 @@ Ihr Praktikumsteam`; const data = await res.json(); - // Prüfen ob es ein Array ist if (!Array.isArray(data)) { console.error('❌ Antwort ist kein Array:', data); throw new Error('Antwort vom Server ist kein Array'); @@ -143,7 +151,6 @@ Ihr Praktikumsteam`; emailTemplate = config.template; } catch (err) { console.error('Fehler beim Laden der E-Mail-Konfiguration:', err); - // Fallback auf Standard-Werte bei Fehler } finally { isLoadingEmailConfig = false; } @@ -208,8 +215,8 @@ Ihr Praktikumsteam`; showDialog = false; - // E-Mail senden nach erfolgreichem Annehmen - await sendAcceptanceEmail(selectedAnmeldungId, event.detail.dienststelleId); + // E-Mail Vorschau öffnen nach erfolgreichem Annehmen + openEmailPreview(selectedAnmeldungId, event.detail.dienststelleId); selectedAnmeldungId = null; await loadAnmeldungen(); @@ -219,13 +226,15 @@ Ihr Praktikumsteam`; } } - async function sendAcceptanceEmail(anmeldungId: number, dienststelleId: number) { + function openEmailPreview(anmeldungId: number, dienststelleId: number) { const anmeldung = anmeldungen.find(a => a.id === anmeldungId); if (!anmeldung) return; // Dienststelle finden const dienststelle = availableWishes.find(w => w.id === dienststelleId); - const dienststelleName = dienststelle ? dienststelle.name.replace(/^\d+\.\s*Wunsch:\s*/, '') : 'Unbekannte Dienststelle'; + const dienststelleName = dienststelle + ? dienststelle.name.replace(/^\d+\.\s*Wunsch:\s*/, '') + : 'Unbekannte Dienststelle'; // E-Mail Text personalisieren const personalizedEmail = emailTemplate @@ -234,11 +243,43 @@ Ihr Praktikumsteam`; .replace(/\{nachname\}/g, anmeldung.nachname) .replace(/\{dienststelle\}/g, dienststelleName); - // mailto: Link erstellen - const mailtoLink = `mailto:${anmeldung.email}?subject=${encodeURIComponent(emailSubject)}&body=${encodeURIComponent(personalizedEmail)}`; + // Modal mit Vorschau öffnen + emailPreviewData = { + to: anmeldung.email, + subject: emailSubject, + body: personalizedEmail + }; + emailCopied = false; + showEmailPreview = true; + } + + async function copyAndOpenMail() { + if (!emailPreviewData) return; - // Standard E-Mail Client öffnen - window.location.href = mailtoLink; + try { + await navigator.clipboard.writeText(emailPreviewData.body); + emailCopied = true; + + // Kurz warten, dann Mail öffnen + setTimeout(() => { + const mailtoLink = `mailto:${emailPreviewData!.to}?subject=${encodeURIComponent(emailPreviewData!.subject)}`; + window.location.href = mailtoLink; + }, 500); + + // Modal nach 2 Sekunden schließen + setTimeout(() => { + closeEmailPreview(); + }, 2000); + } catch (err) { + console.error('Clipboard-Fehler:', err); + error = 'Konnte Text nicht kopieren. Bitte manuell markieren und kopieren.'; + } + } + + function closeEmailPreview() { + showEmailPreview = false; + emailPreviewData = null; + emailCopied = false; } async function handleReject(event: CustomEvent<{id: number}>) { @@ -305,7 +346,7 @@ Ihr Praktikumsteam`;
- +
+
+
+ + + +
+ {#if emailCopied} +
+
+
+ + + +
+ Text kopiert – Outlook öffnet sich... +
+
+ {:else} +
+
+ + + + + Der Text wird kopiert und Outlook geöffnet. + Dann mit Strg + V einfügen. + +
+
+ + +
+
+ {/if} +
+ + + {/if} \ No newline at end of file