diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..074f5899e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dart.lineLength": 100 +} \ No newline at end of file diff --git a/AUTHORS.md b/AUTHORS.md index c33249f47..9f66cb2aa 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,52 +1,47 @@ # Authors - ## Developers -* Roland Geider – -* Dylan Aird - -* Jannik Norden - -* Arun Muralidharan - -* Khushbu Bora - -* Patrick Witter - -* Tomer Ben-Rachel - -* Thilina Herath - +- Roland Geider – +- Dylan Aird - +- Jannik Norden - +- Arun Muralidharan - +- Khushbu Bora - +- Patrick Witter - +- Tomer Ben-Rachel - +- Thilina Herath - +- Marko Milosevic - ## Translators -* German - - * mondstern (2) - * J. Lavoie (19) - * Roland Geider (142) - - -* English - - * Roland Geider (3) - * Allan Nordhøy (8) - +- German -* Italian + - mondstern (2) + - J. Lavoie (19) + - Roland Geider (142) - * mondstern (2) - * DT (4) - * J. Lavoie (24) - * Stefano Rossi (120) +- English + - Roland Geider (3) + - Allan Nordhøy (8) -* Spanish +- Italian - * Roland Geider (1) - * martingetzel (119) + - mondstern (2) + - DT (4) + - J. Lavoie (24) + - Stefano Rossi (120) +- Spanish -* French + - Roland Geider (1) + - martingetzel (119) - * J. Lavoie (92) - * Stefano Rossi (94) +- French + - J. Lavoie (92) + - Stefano Rossi (94) -* Norwegian Bokmål +- Norwegian Bokmål - * Allan Nordhøy (98) \ No newline at end of file + - Allan Nordhøy (98) diff --git a/lib/helpers/ui.dart b/lib/helpers/ui.dart index cf305dd31..bfd3494ae 100644 --- a/lib/helpers/ui.dart +++ b/lib/helpers/ui.dart @@ -20,7 +20,11 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:provider/provider.dart'; import 'package:wger/exceptions/http_exception.dart'; +import 'package:wger/models/exercises/exercise.dart'; +import 'package:wger/models/workouts/log.dart'; +import 'package:wger/providers/workout_plans.dart'; void showErrorDialog(dynamic exception, BuildContext context) { log('showErrorDialog: '); @@ -88,3 +92,46 @@ void showHttpExceptionErrorDialog(WgerHttpException exception, BuildContext cont // unless this dummy call is present showDialog(context: context, builder: (context) => Container()); } + +dynamic showDeleteDialog(BuildContext context, String confirmDeleteName, Log log, Exercise exercise, + Map> _exerciseData) async { + final res = await showDialog( + context: context, + builder: (BuildContext contextDialog) { + return AlertDialog( + content: Text( + AppLocalizations.of(context).confirmDelete(confirmDeleteName), + ), + actions: [ + TextButton( + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + onPressed: () => Navigator.of(contextDialog).pop(), + ), + TextButton( + child: Text( + AppLocalizations.of(context).delete, + style: TextStyle(color: Theme.of(context).errorColor), + ), + onPressed: () { + _exerciseData[exercise]!.removeWhere((el) => el.id == log.id); + Provider.of(context, listen: false).deleteLog( + log, + ); + + Navigator.of(contextDialog).pop(); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context).successfullyDeleted, + textAlign: TextAlign.center, + ), + ), + ); + }, + ), + ], + ); + }); + return res; +} diff --git a/lib/providers/workout_plans.dart b/lib/providers/workout_plans.dart index 7ea023460..6951bfa23 100644 --- a/lib/providers/workout_plans.dart +++ b/lib/providers/workout_plans.dart @@ -506,4 +506,17 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { notifyListeners(); return newLog; } + + /*Future editLog(Log log) async { + await patch(log.toJson(), makeUrl(_logsUrlPath, id: log.id)); + notifyListeners(); + }*/ + + Future deleteLog(Log log) async { + await deleteRequest(_logsUrlPath, log.id!); + for (final workout in _workoutPlans) { + workout.logs.removeWhere((element) => element.id == log.id); + } + notifyListeners(); + } } diff --git a/lib/widgets/workouts/log.dart b/lib/widgets/workouts/log.dart index 9a660d30b..f491e620a 100644 --- a/lib/widgets/workouts/log.dart +++ b/lib/widgets/workouts/log.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:wger/helpers/ui.dart'; import 'package:wger/models/exercises/exercise.dart'; import 'package:wger/models/workouts/log.dart'; import 'package:wger/models/workouts/session.dart'; @@ -53,32 +54,61 @@ class ExerciseLogChart extends StatelessWidget { } } -class DayLogWidget extends StatelessWidget { +class DayLogWidget extends StatefulWidget { final DateTime _date; final WorkoutSession? _session; final Map> _exerciseData; const DayLogWidget(this._date, this._exerciseData, this._session); + @override + _DayLogWidgetState createState() => _DayLogWidgetState(); +} + +class _DayLogWidgetState extends State { + @override + void initState() { + super.initState(); + } + @override Widget build(BuildContext context) { return Card( child: Column( children: [ Text( - DateFormat.yMd(Localizations.localeOf(context).languageCode).format(_date), + DateFormat.yMd(Localizations.localeOf(context).languageCode).format(widget._date), style: Theme.of(context).textTheme.headline5, ), - if (_session != null) Text('Session data here'), - ..._exerciseData.keys.map((exercise) { + if (widget._session != null) Text('Session data here'), + ...widget._exerciseData.keys.map((exercise) { return Column( children: [ - Text( - exercise.name, - style: Theme.of(context).textTheme.headline6, - ), - ..._exerciseData[exercise]!.map((log) => Text(log.singleLogRepTextNoNl)).toList(), - ExerciseLogChart(exercise, _date), + if (widget._exerciseData[exercise]!.isNotEmpty) + Text( + exercise.name, + style: Theme.of(context).textTheme.headline6, + ) + else + Container(), + ...widget._exerciseData[exercise]! + .map( + (log) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(log.singleLogRepTextNoNl), + IconButton( + icon: Icon(Icons.delete), + onPressed: () async { + showDeleteDialog( + context, exercise.name, log, exercise, widget._exerciseData); + }, + ), + ], + ), + ) + .toList(), + ExerciseLogChart(exercise, widget._date), SizedBox(height: 30), ], );