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])