diff --git a/Web/templates/terminplan.html b/Web/templates/terminplan.html index e99012f..5d98700 100755 --- a/Web/templates/terminplan.html +++ b/Web/templates/terminplan.html @@ -51,6 +51,8 @@ @@ -624,6 +626,7 @@ document.addEventListener('DOMContentLoaded', function() { } const userId = document.getElementById('user-id').value || 'Admin'; // Get user ID or use fallback + const bookingType = document.getElementById('booking-type').value; // Convert JSON data to FormData const formData = new FormData(); @@ -631,16 +634,43 @@ document.addEventListener('DOMContentLoaded', function() { // Add all required fields with correct names the server expects formData.append('item_id', itemId); formData.append('booking_date', startDate); - formData.append('booking_end_date', startDate); // For single bookings, end = start formData.append('period_start', periodStart); formData.append('period_end', periodEnd); formData.append('notes', document.getElementById('booking-notes').value || ''); - formData.append('booking_type', document.getElementById('booking-type').value); formData.append('user_id', userId); + if (bookingType === 'range') { + const endDate = document.getElementById('booking-end-date').value; + if (!endDate) { + alert('Bitte wählen Sie ein Enddatum für den Zeitraum.'); + return; + } + formData.append('booking_end_date', endDate); + formData.append('booking_type', 'range'); + } else if (bookingType === 'recurring') { + formData.append('booking_type', 'single'); // Server expects 'single' structure for these individually sent requests + const dates = calculateDates(); + if (dates.length === 0) { + alert('Es konnten keine Termine berechnet werden. Bitte überprüfen Sie Ihre Eingaben.'); + return; + } + if (confirm(`Möchten Sie wirklich ${dates.length} Termine planen?`)) { + processMultipleDates(formData, dates, periodStart, periodEnd); + } + return; // Use processMultipleDates instead + } else { + formData.append('booking_end_date', startDate); // For single bookings, end = start + formData.append('booking_type', 'single'); + } + + const csrfToken = document.querySelector('meta[name="csrf-token"]') ? document.querySelector('meta[name="csrf-token"]').content : ''; + // Submit with FormData instead of JSON fetch('/plan_booking', { method: 'POST', + headers: { + 'X-CSRFToken': csrfToken + }, body: formData // Remove the Content-Type header and JSON.stringify }) .then(response => { @@ -681,8 +711,12 @@ document.addEventListener('DOMContentLoaded', function() { // Cancel booking document.getElementById('cancel-booking').addEventListener('click', function() { if (confirm('Möchten Sie diese Ausleihe wirklich stornieren?')) { + const csrfToken = document.querySelector('meta[name="csrf-token"]') ? document.querySelector('meta[name="csrf-token"]').content : ''; fetch('/cancel_booking/' + currentEventId, { - method: 'POST' + method: 'POST', + headers: { + 'X-CSRFToken': csrfToken + } }) .then(response => response.json()) .then(data => { @@ -1131,8 +1165,12 @@ document.addEventListener('DOMContentLoaded', function() { newFormData.get('end_date')); // Submit this booking + const csrfToken = document.querySelector('meta[name="csrf-token"]') ? document.querySelector('meta[name="csrf-token"]').content : ''; fetch('/plan_booking', { method: 'POST', + headers: { + 'X-CSRFToken': csrfToken + }, body: newFormData }) .then(response => response.json()) diff --git a/Web/test_terminplan.py b/Web/test_terminplan.py new file mode 100644 index 0000000..12c761d --- /dev/null +++ b/Web/test_terminplan.py @@ -0,0 +1,7 @@ +from app import app +with app.test_client() as client: + with client.session_transaction() as sess: + sess['username'] = 'admin' + sess['admin'] = True + resp = client.get('/terminplan') + print("Status:", resp.status_code) diff --git a/test_terminplan.py b/test_terminplan.py new file mode 100644 index 0000000..7201f9a --- /dev/null +++ b/test_terminplan.py @@ -0,0 +1,5 @@ +from Web.app import app +with app.test_client() as client: + resp = client.get('/terminplan') + print(resp.status_code) + # print(resp.data.decode('utf-8')[:200])