Files
praktikum/src/routes/admin/anmeldungen/+page.svelte
2025-06-17 09:29:32 +02:00

103 lines
3.4 KiB
Svelte
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script lang="ts">
import { onMount } from 'svelte';
interface Anmeldung {
pdfs: any;
anrede: string;
vorname: string;
nachname: string;
email: string;
noteDeutsch?: string;
noteMthe?: string;
sozialverhalten?: string;
wunsch1?: { name: string };
wunsch2?: { name: string };
wunsch3?: { name: string };
timestamp: number;
id: number;
}
let anmeldungen: Anmeldung[] = [];
async function ladeAnmeldungen() {
const res = await fetch('/api/admin/anmeldungen');
anmeldungen = await res.json();
}
async function loeschen(id: number) {
if (!confirm('Diese Anmeldung wirklich löschen?')) return;
try {
const res = await fetch(`/api/admin/anmeldungen?id=${id}`, { method: 'DELETE' });
if (!res.ok) {
const errorText = await res.text();
throw new Error(`Fehler beim Löschen (${res.status}): ${errorText}`);
}
await ladeAnmeldungen();
} catch (error) {
console.error(error);
alert('Fehler beim Löschen der Anmeldung.\n' + (error as Error).message);
}
}
onMount(ladeAnmeldungen);
</script>
<div class="p-6 max-w-7xl mx-auto">
<h1 class="text-2xl font-bold mb-4 text-center">Alle Anmeldungen</h1>
<table class="w-full border text-sm">
<thead>
<tr class="bg-gray-200">
<th class="p-2 text-left">Name</th>
<th class="p-2 text-left">E-Mail</th>
<th class="p-2 text-left">Wunsch 13</th>
<th class="p-2 text-left">Note Deutsch</th>
<th class="p-2 text-left">Note Mathe</th>
<th class="p-2 text-left">Sozialverhalten</th>
<th class="p-2 text-left">Datum</th>
<th class="p-2 text-left">Dateien</th>
<th class="p-2 text-left">Aktionen</th>
</tr>
</thead>
<tbody>
{#each anmeldungen as a}
<tr class="border-t">
<td class="p-2">{a.anrede} {a.vorname} {a.nachname}</td>
<td class="p-2">{a.email}</td>
<td class="p-2">
{a.wunsch1?.name}<br>
{a.wunsch2?.name}<br>
{a.wunsch3?.name}
</td>
<td class="p-2">{a.noteDeutsch || '—'}</td>
<td class="p-2">{a.noteMthe || '—'}</td>
<td class="p-2">{a.sozialverhalten || '—'}</td>
<td class="p-2">{new Date(a.timestamp).toLocaleDateString()}</td>
<td class="p-2">
{#each a.pdfs as pdf}
<li>
<a href={pdf.pfad} target="_blank" class="text-blue-600 hover:underline">
PDF ansehen
</a>
</li>
{/each}
</td>
<td class="p-2 text-right">
<button
class="text-red-600 hover:underline"
on:click={() => loeschen(a.id)}>
Löschen
</button>
</td>
</tr>
{/each}
</tbody>
</table>
<button
on:click={async () => {
await fetch('/api/admin/logout', { method: 'POST' });
location.reload();
}}
class="bg-red-600 text-white px-4 py-3 rounded text-center hover:bg-red-700">
Logout
</button>
</div>