E-Mail Versand hinzugefuegt.
This commit is contained in:
@@ -32,6 +32,22 @@
|
|||||||
let selectedDienststelleId: number | null = null;
|
let selectedDienststelleId: number | null = null;
|
||||||
let availableWishes: { id: number, name: string }[] = [];
|
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() {
|
async function loadAnmeldungen() {
|
||||||
try {
|
try {
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
@@ -83,6 +99,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
showDialog = false;
|
showDialog = false;
|
||||||
|
|
||||||
|
// E-Mail senden nach erfolgreichem Annehmen
|
||||||
|
await sendAcceptanceEmail(selectedAnmeldungId, event.detail.dienststelleId);
|
||||||
|
|
||||||
selectedAnmeldungId = null;
|
selectedAnmeldungId = null;
|
||||||
await loadAnmeldungen();
|
await loadAnmeldungen();
|
||||||
} catch (err) {
|
} 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}>) {
|
async function handleReject(event: CustomEvent<{id: number}>) {
|
||||||
if (!confirm('Diese Anmeldung wirklich ablehnen?')) return;
|
if (!confirm('Diese Anmeldung wirklich ablehnen?')) return;
|
||||||
|
|
||||||
@@ -136,7 +178,27 @@
|
|||||||
selectedAnmeldungId = null;
|
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>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
@@ -150,6 +212,70 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<main class="max-w-7xl mx-auto px-4 py-6">
|
<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: {anrede}, {vorname}, {nachname}, {dienststelle}
|
||||||
|
</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}
|
{#if error}
|
||||||
<div class="bg-red-50 border border-red-200 rounded-md p-4 mb-6">
|
<div class="bg-red-50 border border-red-200 rounded-md p-4 mb-6">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
|
|||||||
Reference in New Issue
Block a user