Übungen können zu Training hinzugefügt werden
parent
ae6e2bd0ed
commit
e5c3cd9206
|
|
@ -281,26 +281,63 @@ class _CalendarTabState extends State<CalendarTab> {
|
||||||
if (!userDoc.exists) return;
|
if (!userDoc.exists) return;
|
||||||
|
|
||||||
final data = userDoc.data() as Map<String, dynamic>;
|
final data = userDoc.data() as Map<String, dynamic>;
|
||||||
final trainingExercises = Map<String, dynamic>.from(data['trainingExercises'] ?? {});
|
final trainings = Map<String, dynamic>.from(data['trainings'] ?? {});
|
||||||
final exercises = List<Map<String, dynamic>>.from(trainingExercises[event['date']] ?? []);
|
final dateString = event['date'] as String;
|
||||||
|
final trainingId = event['id'] as String;
|
||||||
|
|
||||||
exercises.add({
|
print('Füge Übung hinzu:');
|
||||||
'id': result['id'],
|
print('dateString: $dateString');
|
||||||
'name': result['title'],
|
print('trainingId: $trainingId');
|
||||||
'description': result['description'],
|
print('Vorher - trainings: $trainings');
|
||||||
'duration': result['duration'],
|
|
||||||
});
|
|
||||||
|
|
||||||
trainingExercises[event['date']] = exercises;
|
// Finde das Training und füge die Übung hinzu
|
||||||
|
if (trainings.containsKey(dateString)) {
|
||||||
|
final trainingsList = List<Map<String, dynamic>>.from(trainings[dateString]);
|
||||||
|
final trainingIndex = trainingsList.indexWhere((t) => t['id'] == trainingId);
|
||||||
|
|
||||||
|
if (trainingIndex != -1) {
|
||||||
|
final exercises = List<Map<String, dynamic>>.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
|
await FirebaseFirestore.instance
|
||||||
.collection('User')
|
.collection('User')
|
||||||
.doc(_currentUserId)
|
.doc(_currentUserId)
|
||||||
.update({
|
.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<Map<String, dynamic>>.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<int>(0, (sum, exercise) => sum + (exercise['duration'] as int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
|
@ -447,22 +484,53 @@ class _CalendarTabState extends State<CalendarTab> {
|
||||||
if (!userDoc.exists) return;
|
if (!userDoc.exists) return;
|
||||||
|
|
||||||
final data = userDoc.data() as Map<String, dynamic>;
|
final data = userDoc.data() as Map<String, dynamic>;
|
||||||
final trainingExercises = Map<String, dynamic>.from(data['trainingExercises'] ?? {});
|
final trainings = Map<String, dynamic>.from(data['trainings'] ?? {});
|
||||||
final exercises = List<Map<String, dynamic>>.from(trainingExercises[event['date']] ?? []);
|
final dateString = event['date'] as String;
|
||||||
|
final trainingId = event['id'] as String;
|
||||||
|
|
||||||
// Entferne die Übung aus der Liste
|
print('Entferne Übung:');
|
||||||
exercises.removeWhere((e) => e['id'] == exercise['id']);
|
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<Map<String, dynamic>>.from(trainings[dateString]);
|
||||||
|
final trainingIndex = trainingsList.indexWhere((t) => t['id'] == trainingId);
|
||||||
|
|
||||||
|
if (trainingIndex != -1) {
|
||||||
|
final exercises = List<Map<String, dynamic>>.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
|
await FirebaseFirestore.instance
|
||||||
.collection('User')
|
.collection('User')
|
||||||
.doc(_currentUserId)
|
.doc(_currentUserId)
|
||||||
.update({
|
.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<Map<String, dynamic>>.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<int>(0, (sum, exercise) => sum + (exercise['duration'] as int));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
|
@ -711,8 +779,58 @@ class _CalendarTabState extends State<CalendarTab> {
|
||||||
if (exercise is Map<String, dynamic>) {
|
if (exercise is Map<String, dynamic>) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 4),
|
padding: const EdgeInsets.only(bottom: 4),
|
||||||
child: Text(
|
child: Row(
|
||||||
'${exercise['name']} - ${exercise['duration']} Minuten',
|
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<CalendarTab> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
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)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue