diff --git a/templates/calendar_section.html b/templates/calendar_section.html
index d55bb5e..7682e50 100644
--- a/templates/calendar_section.html
+++ b/templates/calendar_section.html
@@ -61,6 +61,15 @@
+ {% if admin_enabled %}
+
+
+
+
+
Legt einzelne wöchentliche Termine an (für Nachbearbeitung).
+
+
+ {% endif %}
@@ -435,6 +444,22 @@
return response.json();
}
+ async function createRecurringEntries(entry, repeatCount) {
+ const count = Math.max(1, Math.min(52, repeatCount || 1));
+ const baseDate = entry.date;
+ if (!baseDate) return [];
+ const base = new Date(baseDate);
+ const savedEntries = [];
+ for (let i = 0; i < count; i++) {
+ const next = new Date(base);
+ next.setDate(base.getDate() + i * 7);
+ const entryForWeek = { ...entry, date: toLocalISO(next) };
+ const saved = await saveCalendarEntry(entryForWeek);
+ savedEntries.push(saved);
+ }
+ return savedEntries;
+ }
+
async function deleteCalendarEntry(id) {
const response = await fetch(`/api/calendar/${id}`, { method: 'DELETE' });
if (!response.ok) {
@@ -490,12 +515,22 @@
const form = document.getElementById('calendarForm');
const daysContainer = document.getElementById('calendar-days');
const locationFilter = document.getElementById('calendar-location-filter');
+ const repeatCountInput = document.getElementById('calendarRepeatCount');
+ const recurrenceRow = document.getElementById('calendarRecurrenceRow');
const calendarModal = modalEl && window.bootstrap ? new bootstrap.Modal(modalEl) : null;
if (calendarModal) {
window.calendarModal = calendarModal;
}
let calendarHasLoaded = false;
+ const setRecurrenceMode = (isEditing) => {
+ if (!recurrenceRow) return;
+ recurrenceRow.style.display = isEditing ? 'none' : '';
+ if (!isEditing && repeatCountInput) {
+ repeatCountInput.value = '1';
+ }
+ };
+
if (addBtn && calendarModal) {
addBtn.addEventListener('click', () => {
if (form) form.reset();
@@ -507,6 +542,7 @@
const idInput = document.getElementById('calendarEntryId');
if (idInput) idInput.value = '';
+ setRecurrenceMode(false);
calendarModal.show();
});
}
@@ -523,14 +559,24 @@
location: document.getElementById('calendarLocation')?.value,
details: document.getElementById('calendarDetails')?.value
};
+ const isEditing = Boolean(entry.id);
+ const repeatCount = (!isEditing && window._calendarIsAdmin && repeatCountInput)
+ ? Math.max(1, Math.min(52, parseInt(repeatCountInput.value, 10) || 1))
+ : 1;
try {
- if (entry.id) {
+ if (isEditing) {
removeCalendarEntryFromUI(entry.id);
+ const saved = await saveCalendarEntry(entry);
+ addLocationOption(saved.location);
+ addCalendarEntry(saved);
+ } else {
+ const savedEntries = await createRecurringEntries(entry, repeatCount);
+ savedEntries.forEach(saved => {
+ addLocationOption(saved.location);
+ addCalendarEntry(saved);
+ });
}
- const saved = await saveCalendarEntry(entry);
- addLocationOption(saved.location);
- addCalendarEntry(saved);
calendarModal.hide();
} catch (err) {
console.error(err);
@@ -603,6 +649,7 @@
document.getElementById('calendarTitle').value = entry.title || '';
document.getElementById('calendarLocation').value = entry.location || '';
document.getElementById('calendarDetails').value = entry.details || '';
+ setRecurrenceMode(true);
if (calendarModal) calendarModal.show();
return;
}