From e5c3cd92069ebe06f76da1c39613aa08ad14c54a Mon Sep 17 00:00:00 2001 From: joschy2002 Date: Fri, 30 May 2025 22:21:32 +0200 Subject: [PATCH] =?UTF-8?q?=C3=9Cbungen=20k=C3=B6nnen=20zu=20Training=20hi?= =?UTF-8?q?nzugef=C3=BCgt=20werden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trainerbox/lib/screens/calendar_tab.dart | 184 ++++++++++++++++++++--- 1 file changed, 164 insertions(+), 20 deletions(-) diff --git a/trainerbox/lib/screens/calendar_tab.dart b/trainerbox/lib/screens/calendar_tab.dart index 606b7a8..1db6f9b 100644 --- a/trainerbox/lib/screens/calendar_tab.dart +++ b/trainerbox/lib/screens/calendar_tab.dart @@ -281,26 +281,63 @@ class _CalendarTabState extends State { if (!userDoc.exists) return; final data = userDoc.data() as Map; - final trainingExercises = Map.from(data['trainingExercises'] ?? {}); - final exercises = List>.from(trainingExercises[event['date']] ?? []); + final trainings = Map.from(data['trainings'] ?? {}); + final dateString = event['date'] as String; + final trainingId = event['id'] as String; - exercises.add({ - 'id': result['id'], - 'name': result['title'], - 'description': result['description'], - 'duration': result['duration'], - }); + print('Füge Übung hinzu:'); + print('dateString: $dateString'); + print('trainingId: $trainingId'); + print('Vorher - trainings: $trainings'); - trainingExercises[event['date']] = exercises; + // Finde das Training und füge die Übung hinzu + if (trainings.containsKey(dateString)) { + final trainingsList = List>.from(trainings[dateString]); + final trainingIndex = trainingsList.indexWhere((t) => t['id'] == trainingId); + + if (trainingIndex != -1) { + final exercises = List>.from(trainingsList[trainingIndex]['exercises'] ?? []); + exercises.add({ + 'id': result['id'], + 'name': result['title'], + 'description': result['description'], + 'duration': result['duration'], + }); + trainingsList[trainingIndex]['exercises'] = exercises; + trainings[dateString] = trainingsList; + } + } + print('Nachher - trainings: $trainings'); + + // Aktualisiere die Datenbank await FirebaseFirestore.instance .collection('User') .doc(_currentUserId) .update({ - 'trainingExercises': trainingExercises, + 'trainings': trainings, }); - await _loadEvents(); + // Aktualisiere die UI sofort + setState(() { + final normalizedDate = DateTime.parse(dateString); + if (_events.containsKey(normalizedDate)) { + final eventIndex = _events[normalizedDate]!.indexWhere((e) => e['id'] == trainingId); + if (eventIndex != -1) { + final exercises = List>.from(_events[normalizedDate]![eventIndex]['exercises'] ?? []); + exercises.add({ + 'id': result['id'], + 'name': result['title'], + 'description': result['description'], + 'duration': result['duration'], + }); + _events[normalizedDate]![eventIndex]['exercises'] = exercises; + _events[normalizedDate]![eventIndex]['remainingTime'] = + (_events[normalizedDate]![eventIndex]['duration'] as int) - + exercises.fold(0, (sum, exercise) => sum + (exercise['duration'] as int)); + } + } + }); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( @@ -447,22 +484,53 @@ class _CalendarTabState extends State { if (!userDoc.exists) return; final data = userDoc.data() as Map; - final trainingExercises = Map.from(data['trainingExercises'] ?? {}); - final exercises = List>.from(trainingExercises[event['date']] ?? []); + final trainings = Map.from(data['trainings'] ?? {}); + final dateString = event['date'] as String; + final trainingId = event['id'] as String; - // Entferne die Übung aus der Liste - exercises.removeWhere((e) => e['id'] == exercise['id']); + print('Entferne Übung:'); + print('dateString: $dateString'); + print('trainingId: $trainingId'); + print('Vorher - trainings: $trainings'); - trainingExercises[event['date']] = exercises; + // Finde das Training und entferne die Übung + if (trainings.containsKey(dateString)) { + final trainingsList = List>.from(trainings[dateString]); + final trainingIndex = trainingsList.indexWhere((t) => t['id'] == trainingId); + + if (trainingIndex != -1) { + final exercises = List>.from(trainingsList[trainingIndex]['exercises'] ?? []); + exercises.removeWhere((e) => e['id'] == exercise['id']); + trainingsList[trainingIndex]['exercises'] = exercises; + trainings[dateString] = trainingsList; + } + } + print('Nachher - trainings: $trainings'); + + // Aktualisiere die Datenbank await FirebaseFirestore.instance .collection('User') .doc(_currentUserId) .update({ - 'trainingExercises': trainingExercises, + 'trainings': trainings, }); - await _loadEvents(); + // Aktualisiere die UI sofort + setState(() { + final normalizedDate = DateTime.parse(dateString); + if (_events.containsKey(normalizedDate)) { + final eventIndex = _events[normalizedDate]!.indexWhere((e) => e['id'] == trainingId); + if (eventIndex != -1) { + final exercises = List>.from(_events[normalizedDate]![eventIndex]['exercises'] ?? []); + exercises.removeWhere((e) => e['id'] == exercise['id']); + _events[normalizedDate]![eventIndex]['exercises'] = exercises; + _events[normalizedDate]![eventIndex]['remainingTime'] = + (_events[normalizedDate]![eventIndex]['duration'] as int) - + exercises.fold(0, (sum, exercise) => sum + (exercise['duration'] as int)); + } + } + }); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( @@ -711,8 +779,58 @@ class _CalendarTabState extends State { if (exercise is Map) { return Padding( padding: const EdgeInsets.only(bottom: 4), - child: Text( - '${exercise['name']} - ${exercise['duration']} Minuten', + child: Row( + children: [ + const Icon(Icons.fitness_center, size: 16), + const SizedBox(width: 8), + Expanded( + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TrainingDetailScreen( + trainingId: exercise['id'], + ), + ), + ); + }, + child: Text( + '${exercise['name']} - ${exercise['duration']} Minuten', + style: const TextStyle( + decoration: TextDecoration.underline, + color: Colors.blue, + ), + ), + ), + ), + if (isCurrentUser) + IconButton( + icon: const Icon(Icons.delete, color: Colors.red, size: 20), + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Übung entfernen'), + content: Text('Möchten Sie die Übung "${exercise['name']}" wirklich entfernen?'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('Abbrechen'), + ), + TextButton( + onPressed: () { + Navigator.pop(context); + _removeExercise(event, exercise); + }, + child: const Text('Entfernen', style: TextStyle(color: Colors.red)), + ), + ], + ), + ); + }, + ), + ], ), ); } @@ -798,6 +916,32 @@ class _CalendarTabState extends State { ), ), ), + if (isCurrentUser) + IconButton( + icon: const Icon(Icons.delete, color: Colors.red, size: 20), + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Übung entfernen'), + content: Text('Möchten Sie die Übung "${exercise['name']}" wirklich entfernen?'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('Abbrechen'), + ), + TextButton( + onPressed: () { + Navigator.pop(context); + _removeExercise(event, exercise); + }, + child: const Text('Entfernen', style: TextStyle(color: Colors.red)), + ), + ], + ), + ); + }, + ), ], ), );