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; }