From 7d773739d501a09ab06a6b5b386e9cf9df03d528 Mon Sep 17 00:00:00 2001 From: olaf Date: Tue, 1 Jul 2025 18:49:25 +0000 Subject: [PATCH] Implement Delete Event Feature --- dashboard/src/apiEvents.ts | 9 ++++++ dashboard/src/appointments.tsx | 55 ++++++++++++++++++++++++++++++++-- server/routes/events.py | 13 ++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/dashboard/src/apiEvents.ts b/dashboard/src/apiEvents.ts index 16ce32f..a0764d1 100644 --- a/dashboard/src/apiEvents.ts +++ b/dashboard/src/apiEvents.ts @@ -14,3 +14,12 @@ export async function fetchEvents(groupId: string) { if (!res.ok || data.error) throw new Error(data.error || 'Fehler beim Laden der Termine'); return data; } + +export async function deleteEvent(eventId: string) { + const res = await fetch(`/api/events/${encodeURIComponent(eventId)}`, { + method: 'DELETE', + }); + const data = await res.json(); + if (!res.ok || data.error) throw new Error(data.error || 'Fehler beim Löschen des Termins'); + return data; +} diff --git a/dashboard/src/appointments.tsx b/dashboard/src/appointments.tsx index a9f3354..4f7d2a7 100644 --- a/dashboard/src/appointments.tsx +++ b/dashboard/src/appointments.tsx @@ -12,10 +12,11 @@ import { } from '@syncfusion/ej2-react-schedule'; import { DropDownListComponent } from '@syncfusion/ej2-react-dropdowns'; import { L10n, loadCldr, setCulture } from '@syncfusion/ej2-base'; -import type { EventRenderedArgs } from '@syncfusion/ej2-react-schedule'; +import type { EventRenderedArgs, ActionEventArgs } from '@syncfusion/ej2-react-schedule'; import { fetchEvents } from './apiEvents'; import { fetchGroups } from './apiGroups'; import { getGroupColor } from './groupColors'; +import { deleteEvent } from './apiEvents'; // Typ für Gruppe ergänzen type Group = { @@ -64,6 +65,24 @@ L10n.load({ agenda: 'Agenda', today: 'Heute', noEvents: 'Keine Termine', + allDay: 'Ganztägig', + start: 'Start', + end: 'Ende', + event: 'Termin', + save: 'Speichern', + cancel: 'Abbrechen', + delete: 'Löschen', + edit: 'Bearbeiten', + newEvent: 'Neuer Termin', + title: 'Titel', + description: 'Beschreibung', + location: 'Ort', + recurrence: 'Wiederholung', + repeat: 'Wiederholen', + deleteEvent: 'Termin löschen', + deleteContent: 'Möchten Sie diesen Termin wirklich löschen?', + moreDetails: 'Mehr Details', + addTitle: 'Termintitel', }, }, }); @@ -135,7 +154,7 @@ const Appointments: React.FC = () => { /> { dataSource: events, }} eventRendered={(args: EventRenderedArgs) => { - // Farbe basierend auf der Gruppe setzen if (selectedGroupId && args.data && args.data.Id) { const groupColor = getGroupColor(selectedGroupId, groups); if (groupColor) { @@ -151,6 +169,37 @@ const Appointments: React.FC = () => { } } }} + actionBegin={async (args: ActionEventArgs) => { + if (args.requestType === 'eventRemove') { + // args.data ist ein Array von zu löschenden Events + const toDelete = Array.isArray(args.data) ? args.data : [args.data]; + for (const ev of toDelete) { + try { + await deleteEvent(ev.Id); // Deine API-Funktion + } catch (err) { + // Optional: Fehlerbehandlung + console.error('Fehler beim Löschen:', err); + } + } + // Events nach Löschen neu laden + if (selectedGroupId) { + fetchEvents(selectedGroupId) + .then((data: RawEvent[]) => { + const mapped: Event[] = data.map(e => ({ + Id: e.Id, + Subject: e.Subject, + StartTime: new Date(e.StartTime), + EndTime: new Date(e.EndTime), + IsAllDay: e.IsAllDay, + })); + setEvents(mapped); + }) + .catch(console.error); + } + // Syncfusion soll das Event nicht selbst löschen + args.cancel = true; + } + }} firstDayOfWeek={1} > diff --git a/server/routes/events.py b/server/routes/events.py index c34335c..93b57c5 100644 --- a/server/routes/events.py +++ b/server/routes/events.py @@ -34,3 +34,16 @@ def get_events(): }) session.close() return jsonify(result) + + +@events_bp.route("/", methods=["DELETE"]) +def delete_event(event_id): + session = Session() + event = session.query(Event).filter_by(id=event_id).first() + if not event: + session.close() + return jsonify({"error": "Termin nicht gefunden"}), 404 + session.delete(event) + session.commit() + session.close() + return jsonify({"success": True})