diff --git a/backend/controllers/memberActivityController.js b/backend/controllers/memberActivityController.js index 96359e2..13a5681 100644 --- a/backend/controllers/memberActivityController.js +++ b/backend/controllers/memberActivityController.js @@ -195,6 +195,7 @@ export const getMemberActivities = async (req, res) => { const allActivities = [...memberActivities, ...uniqueGroupActivities]; // Group activities by name and count occurrences + // Verwende einen Set pro Aktivität, um eindeutige Datum-Aktivität-Kombinationen zu tracken const activityMap = new Map(); for (const ma of allActivities) { @@ -207,6 +208,10 @@ export const getMemberActivities = async (req, res) => { const activityCode = activity.code || activity.name; // Verwende Code falls vorhanden, sonst Name const date = ma.activity.diaryDate?.date; + if (!date) { + continue; // Überspringe Einträge ohne Datum + } + // Verwende Code als Key, falls vorhanden, sonst Name const key = activityCode; @@ -214,18 +219,37 @@ export const getMemberActivities = async (req, res) => { activityMap.set(key, { name: activityName, // Vollständiger Name für Tooltip code: activityCode, // Code/Kürzel für Anzeige - count: 0, + uniqueDates: new Set(), // Set für eindeutige Daten dates: [] }); } const activityData = activityMap.get(key); - activityData.count++; - if (date) { + // Konvertiere Datum zu String für Set-Vergleich (nur Datum, keine Zeit) + const dateString = date instanceof Date + ? date.toISOString().split('T')[0] + : new Date(date).toISOString().split('T')[0]; + + // Füge Datum nur hinzu, wenn es noch nicht vorhanden ist + if (!activityData.uniqueDates.has(dateString)) { + activityData.uniqueDates.add(dateString); activityData.dates.push(date); } } + // Konvertiere Sets zu Arrays und setze count basierend auf eindeutigen Daten + activityMap.forEach((activityData, key) => { + activityData.count = activityData.uniqueDates.size; + // Sortiere Daten (neueste zuerst) + activityData.dates.sort((a, b) => { + const dateA = new Date(a); + const dateB = new Date(b); + return dateB - dateA; + }); + // Entferne uniqueDates, da es nicht an Frontend gesendet werden muss + delete activityData.uniqueDates; + }); + // Convert map to array and sort by count const activities = Array.from(activityMap.values()) .sort((a, b) => b.count - a.count);