From 6896484e9e3d87b3e250954095967fb222ded324 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sun, 16 Nov 2025 22:12:11 +0100 Subject: [PATCH] Enhance addGroupActivity method to support predefined activities in diary date activities This commit updates the addGroupActivity method in the DiaryDateActivityService to accept a predefinedActivityId, allowing for the retrieval or creation of predefined activities based on the provided ID or activity name. Additionally, the frontend DiaryView is modified to include predefinedActivityId in the new plan item, improving the handling of group activities. --- .../diaryDateActivityController.js | 4 +-- backend/services/diaryDateActivityService.js | 36 ++++++++++++++++--- frontend/src/views/DiaryView.vue | 5 ++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/backend/controllers/diaryDateActivityController.js b/backend/controllers/diaryDateActivityController.js index 9e34b19..38629ec 100644 --- a/backend/controllers/diaryDateActivityController.js +++ b/backend/controllers/diaryDateActivityController.js @@ -121,8 +121,8 @@ export const getDiaryDateActivities = async (req, res) => { export const addGroupActivity = async(req, res) => { try { const { authcode: userToken } = req.headers; - const { clubId, diaryDateId, groupId, activity, timeblockId } = req.body; - const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId); + const { clubId, diaryDateId, groupId, activity, predefinedActivityId, timeblockId } = req.body; + const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, predefinedActivityId, timeblockId); // Emit Socket-Event const diaryDate = await DiaryDate.findByPk(diaryDateId); diff --git a/backend/services/diaryDateActivityService.js b/backend/services/diaryDateActivityService.js index d9f9b73..2c381c0 100644 --- a/backend/services/diaryDateActivityService.js +++ b/backend/services/diaryDateActivityService.js @@ -310,7 +310,7 @@ class DiaryDateActivityService { return activitiesWithImages; } - async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId = null) { + async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, predefinedActivityId = null, timeblockId = null) { await checkAccess(userToken, clubId); let diaryDateActivity; @@ -350,11 +350,37 @@ class DiaryDateActivityService { console.error('Group diaryDateId:', group.diaryDateId, 'Activity diaryDateId:', diaryDateActivity.diaryDateId); throw new Error('Group isn\'t related to date'); } - const [predefinedActivity, created] = await PredefinedActivity.findOrCreate({ - where: { - name: activity + + let predefinedActivity = null; + + // 1. Versuche zuerst, die PredefinedActivity per ID zu finden + if (predefinedActivityId) { + predefinedActivity = await PredefinedActivity.findByPk(predefinedActivityId); + } + + // 2. Falls nicht gefunden, suche nach Name oder Code + if (!predefinedActivity) { + const normalized = (activity || '').trim(); + if (normalized) { + predefinedActivity = await PredefinedActivity.findOne({ + where: { + [Op.or]: [ + { name: normalized }, + { code: normalized } + ] + } + }); } - }); + } + + // 3. Falls immer noch nicht gefunden, erstelle eine neue + if (!predefinedActivity) { + predefinedActivity = await PredefinedActivity.create({ + name: activity || '', + code: activity || '', + }); + } + devLog(predefinedActivity); const activityData = { diaryDateActivity: diaryDateActivity.id, diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index 1b1a88d..1d4bc55 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -817,6 +817,7 @@ export default { duration: '', durationText: '', groupId: '', + predefinedActivityId: null, isTimeBlock: false, }, predefinedActivities: [], @@ -1730,6 +1731,7 @@ export default { clubId: this.currentClub, diaryDateId: this.date.id, activity: this.newPlanItem.activity, + predefinedActivityId: this.newPlanItem.predefinedActivityId, groupId: Number(this.newPlanItem.groupId), timeblockId: this.selectedTimeblockId, }); @@ -1738,7 +1740,7 @@ export default { this.addNewItem = false; this.addNewGroupActivity = false; this.selectedTimeblockId = null; - this.newPlanItem = { activity: '', duration: '', durationText: '', groupId: '' }; + this.newPlanItem = { activity: '', duration: '', durationText: '', groupId: '', predefinedActivityId: null }; this.trainingPlan = await apiClient.get(`/diary-date-activities/${this.currentClub}/${this.date.id}`).then(response => response.data); this.calculateIntermediateTimes(); } catch (error) { @@ -2450,6 +2452,7 @@ export default { this.newPlanItem.activity = (s.code && s.code.trim() !== '') ? s.code : s.name; this.newPlanItem.durationText = s.durationText || ''; this.newPlanItem.duration = s.duration || ''; + this.newPlanItem.predefinedActivityId = s.id || null; this.newItemShowDropdown = false; this.newItemSearchResults = []; },