E-Mail Versand hinzugefuegt.

This commit is contained in:
titver968
2025-07-24 09:45:55 +02:00
parent aeabd91d2d
commit 38602fa4e6

View File

@@ -32,6 +32,22 @@
let selectedDienststelleId: number | null = null;
let availableWishes: { id: number, name: string }[] = [];
// E-Mail Konfiguration
let emailSubject = 'Praktikumsplatz-Zusage';
let emailTemplate = `Sehr geehrte/r \{anrede\} \{nachname\},
wir freuen uns, Ihnen mitteilen zu können, dass Ihre Bewerbung für ein Praktikum erfolgreich war.
Sie wurden für das Praktikum bei folgender Dienststelle angenommen:
\{dienststelle\}
Weitere Informationen erhalten Sie in den kommenden Tagen.
Mit freundlichen Grüßen
Ihr Praktikumsteam`;
let showEmailConfig = false;
async function loadAnmeldungen() {
try {
isLoading = true;
@@ -83,6 +99,10 @@
}
showDialog = false;
// E-Mail senden nach erfolgreichem Annehmen
await sendAcceptanceEmail(selectedAnmeldungId, event.detail.dienststelleId);
selectedAnmeldungId = null;
await loadAnmeldungen();
} catch (err) {
@@ -91,6 +111,28 @@
}
}
async function sendAcceptanceEmail(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';
// E-Mail Text personalisieren
const personalizedEmail = emailTemplate
.replace(/\{anrede\}/g, anmeldung.anrede)
.replace(/\{vorname\}/g, anmeldung.vorname)
.replace(/\{nachname\}/g, anmeldung.nachname)
.replace(/\{dienststelle\}/g, dienststelleName);
// mailto: Link erstellen
const mailtoLink = `mailto:${anmeldung.email}?subject=${encodeURIComponent(emailSubject)}&body=${encodeURIComponent(personalizedEmail)}`;
// Standard E-Mail Client öffnen
window.location.href = mailtoLink;
}
async function handleReject(event: CustomEvent<{id: number}>) {
if (!confirm('Diese Anmeldung wirklich ablehnen?')) return;
@@ -136,7 +178,27 @@
selectedAnmeldungId = null;
}
onMount(loadAnmeldungen);
function saveEmailTemplate() {
// Hier könnten Sie die E-Mail-Vorlage in localStorage oder auf dem Server speichern
localStorage.setItem('emailSubject', emailSubject);
localStorage.setItem('emailTemplate', emailTemplate);
showEmailConfig = false;
alert('E-Mail-Vorlage gespeichert!');
}
function loadEmailTemplate() {
// E-Mail-Vorlage aus localStorage laden
const savedSubject = localStorage.getItem('emailSubject');
const savedTemplate = localStorage.getItem('emailTemplate');
if (savedSubject) emailSubject = savedSubject;
if (savedTemplate) emailTemplate = savedTemplate;
}
onMount(() => {
loadAnmeldungen();
loadEmailTemplate();
});
</script>
<svelte:head>
@@ -150,6 +212,70 @@
/>
<main class="max-w-7xl mx-auto px-4 py-6">
<!-- E-Mail Konfiguration Button -->
<div class="mb-6 flex justify-end">
<button
on:click={() => showEmailConfig = !showEmailConfig}
class="bg-gray-600 hover:bg-gray-700 text-white px-4 py-2 rounded-md text-sm font-medium inline-flex items-center"
>
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
E-Mail-Vorlage konfigurieren
</button>
</div>
<!-- E-Mail Konfiguration Panel -->
{#if showEmailConfig}
<div class="bg-white shadow-sm rounded-lg p-6 mb-6">
<h3 class="text-lg font-medium text-gray-900 mb-4">E-Mail-Vorlage konfigurieren</h3>
<div class="space-y-4">
<div>
<label for="email-subject" class="block text-sm font-medium text-gray-700 mb-2">
E-Mail Betreff
</label>
<input
id="email-subject"
type="text"
bind:value={emailSubject}
class="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500"
/>
</div>
<div>
<label for="email-template" class="block text-sm font-medium text-gray-700 mb-2">
E-Mail Text
</label>
<textarea
id="email-template"
bind:value={emailTemplate}
rows="10"
class="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500"
></textarea>
<p class="mt-2 text-sm text-gray-500">
Verfügbare Platzhalter: &#123;anrede&#125;, &#123;vorname&#125;, &#123;nachname&#125;, &#123;dienststelle&#125;
</p>
</div>
<div class="flex justify-end space-x-3">
<button
on:click={() => showEmailConfig = false}
class="px-4 py-2 text-sm text-gray-600 hover:text-gray-800"
>
Abbrechen
</button>
<button
on:click={saveEmailTemplate}
class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium"
>
Speichern
</button>
</div>
</div>
</div>
{/if}
{#if error}
<div class="bg-red-50 border border-red-200 rounded-md p-4 mb-6">
<div class="flex">