diff --git a/controllers/eventController.js b/controllers/eventController.js index 5a9fc44..7c696b2 100644 --- a/controllers/eventController.js +++ b/controllers/eventController.js @@ -4,14 +4,39 @@ const { startOfDay } = require('date-fns'); const getAllEvents = async (req, res) => { try { + const includePast = String(req.query?.includePast || '').toLowerCase(); + const wantsPast = includePast === '1' || includePast === 'true' || includePast === 'yes'; + + const where = wantsPast + ? undefined + : { + [Op.or]: [ + { + date: { + [Op.or]: [ + { [Op.gte]: startOfDay(new Date()) }, + { [Op.eq]: null }, + ], + }, + }, + // Recurring events without a fixed date + { dayOfWeek: { [Op.gte]: 0 } }, + ], + }; + const events = await Event.findAll({ + where, include: [ { model: Institution, as: 'institution' }, { model: EventPlace, as: 'eventPlace' }, { model: EventType, as: 'eventType' }, { model: ContactPerson, as: 'contactPersons', through: { attributes: [] } } ], - order: ['name', 'date', 'time'] + order: [ + ['date', 'ASC'], + ['time', 'ASC'], + ['name', 'ASC'], + ], }); res.json(events); } catch (error) { diff --git a/src/content/admin/EventManagement.vue b/src/content/admin/EventManagement.vue index 8f21834..0830bea 100644 --- a/src/content/admin/EventManagement.vue +++ b/src/content/admin/EventManagement.vue @@ -83,26 +83,7 @@ export default { filteredEvents() { let filtered = this.events; - // Filter vergangene Events aus - if (!this.showPastEvents) { - const today = new Date(); - today.setHours(0, 0, 0, 0); - - filtered = filtered.filter(event => { - // Events mit Wochentag (ohne festes Datum) immer anzeigen - if (event.dayOfWeek !== null && event.dayOfWeek !== undefined && !event.date) { - return true; - } - // Events mit Datum: nur zukünftige oder heutige anzeigen - if (event.date) { - const eventDate = new Date(event.date); - eventDate.setHours(0, 0, 0, 0); - return eventDate >= today; - } - // Events ohne Datum und ohne Wochentag anzeigen - return true; - }); - } + // Vergangenheitsfilter erfolgt serverseitig (GET /events?includePast=1) // Suchfilter anwenden if (this.searchQuery.trim()) { @@ -121,6 +102,11 @@ export default { return filtered; } }, + watch: { + showPastEvents() { + this.fetchData(); + } + }, async created() { await this.fetchData(); this.hasNewsletterPreview = !!localStorage.getItem('newsletter_import_last_result'); @@ -176,7 +162,7 @@ export default { async fetchData() { try { const [eventResponse, institutionResponse, eventPlaceResponse, contactPersonResponse, eventTypeResponse] = await Promise.all([ - axios.get('/events'), + axios.get('/events', { params: { includePast: this.showPastEvents ? 1 : 0 } }), axios.get('/institutions'), axios.get('/event-places'), axios.get('/contact-persons'),