From 88f1f200b192ec4a87c871d7b95898cc662a337a Mon Sep 17 00:00:00 2001 From: Marko Milosevic Date: Thu, 7 Oct 2021 19:37:16 +0200 Subject: [PATCH 1/5] Added the option to delete workout log entries --- lib/providers/auth.dart | 14 +++- lib/providers/workout_plans.dart | 61 ++++++++++++----- lib/widgets/workouts/log.dart | 109 +++++++++++++++++++++++++++---- 3 files changed, 153 insertions(+), 31 deletions(-) diff --git a/lib/providers/auth.dart b/lib/providers/auth.dart index 3322a9a11..5419c7568 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -95,7 +95,10 @@ class AuthProvider with ChangeNotifier { // Register try { - final Map data = {'username': username, 'password': password}; + final Map data = { + 'username': username, + 'password': password + }; if (email != '') { data['email'] = email; } @@ -183,12 +186,17 @@ class AuthProvider with ChangeNotifier { } Future tryAutoLogin() async { - final prefs = await SharedPreferences.getInstance(); + /*final prefs = await SharedPreferences.getInstance(); if (!prefs.containsKey('userData')) { log('autologin failed'); return false; } - final extractedUserData = json.decode(prefs.getString('userData')!); + final extractedUserData = json.decode(prefs.getString('userData')!);*/ + final userData = json.encode({ + 'token': '847a37a0efe85a53a51d68ea7d64e4318761636b', + 'serverUrl': 'https://wger.rge.uber.space/' + }); + final extractedUserData = json.decode(userData); // final expiryDate = DateTime.parse(extractedUserData['expiryDate']); // if (expiryDate.isBefore(DateTime.now())) { diff --git a/lib/providers/workout_plans.dart b/lib/providers/workout_plans.dart index 7ea023460..0efa95dae 100644 --- a/lib/providers/workout_plans.dart +++ b/lib/providers/workout_plans.dart @@ -53,7 +53,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { List _weightUnits = []; List _repetitionUnit = []; - WorkoutPlansProvider(AuthProvider auth, ExercisesProvider exercises, List entries, + WorkoutPlansProvider( + AuthProvider auth, ExercisesProvider exercises, List entries, [http.Client? client]) : _exercises = exercises, _workoutPlans = entries, @@ -77,7 +78,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Return the default weight unit (kg) WeightUnit get defaultWeightUnit { - return _weightUnits.firstWhere((element) => element.id == DEFAULT_WEIGHT_UNIT); + return _weightUnits + .firstWhere((element) => element.id == DEFAULT_WEIGHT_UNIT); } List get repetitionUnits { @@ -86,7 +88,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Return the default weight unit (reps) RepetitionUnit get defaultRepetitionUnit { - return _repetitionUnit.firstWhere((element) => element.id == DEFAULT_REPETITION_UNIT); + return _repetitionUnit + .firstWhere((element) => element.id == DEFAULT_REPETITION_UNIT); } WorkoutPlan findById(int id) { @@ -141,7 +144,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Fetches all workout plan sparsely, i.e. only with the data on the plan /// object itself and no child attributes Future fetchAndSetAllPlansSparse() async { - final data = await fetch(makeUrl(_workoutPlansUrlPath, query: {'limit': '1000'})); + final data = + await fetch(makeUrl(_workoutPlansUrlPath, query: {'limit': '1000'})); for (final workoutPlanData in data['results']) { final plan = WorkoutPlan.fromJson(workoutPlanData); _workoutPlans.add(plan); @@ -183,13 +187,15 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Days final List days = []; - final daysData = await fetch(makeUrl(_daysUrlPath, query: {'training': plan.id.toString()})); + final daysData = await fetch( + makeUrl(_daysUrlPath, query: {'training': plan.id.toString()})); for (final dayEntry in daysData['results']) { final day = Day.fromJson(dayEntry); // Sets final List sets = []; - final setData = await fetch(makeUrl(_setsUrlPath, query: {'exerciseday': day.id.toString()})); + final setData = await fetch( + makeUrl(_setsUrlPath, query: {'exerciseday': day.id.toString()})); for (final setEntry in setData['results']) { final workoutSet = Set.fromJson(setEntry); @@ -197,12 +203,14 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Settings final List settings = []; - final settingData = allSettingsData['results'].where((s) => s['set'] == workoutSet.id); + final settingData = + allSettingsData['results'].where((s) => s['set'] == workoutSet.id); for (final settingEntry in settingData) { final workoutSetting = Setting.fromJson(settingEntry); - workoutSetting.exercise = await _exercises.fetchAndSetExercise(workoutSetting.exerciseId); + workoutSetting.exercise = + await _exercises.fetchAndSetExercise(workoutSetting.exerciseId); workoutSetting.weightUnit = _weightUnits.firstWhere( (e) => e.id == workoutSetting.weightUnitId, ); @@ -241,8 +249,10 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { for (final entry in logData['results']) { try { final log = Log.fromJson(entry); - log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.weightUnit = + _weightUnits.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = + _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); log.exercise = await _exercises.fetchAndSetExercise(log.exerciseId); plan.logs.add(log); } catch (e) { @@ -272,12 +282,14 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { } Future editWorkout(WorkoutPlan workout) async { - await patch(workout.toJson(), makeUrl(_workoutPlansUrlPath, id: workout.id)); + await patch( + workout.toJson(), makeUrl(_workoutPlansUrlPath, id: workout.id)); notifyListeners(); } Future deleteWorkout(int id) async { - final existingWorkoutIndex = _workoutPlans.indexWhere((element) => element.id == id); + final existingWorkoutIndex = + _workoutPlans.indexWhere((element) => element.id == id); final existingWorkout = _workoutPlans[existingWorkoutIndex]; _workoutPlans.removeAt(existingWorkoutIndex); notifyListeners(); @@ -291,7 +303,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { } } - Future> fetchLogData(WorkoutPlan workout, Exercise exercise) async { + Future> fetchLogData( + WorkoutPlan workout, Exercise exercise) async { final data = await fetch( makeUrl( _workoutPlansUrlPath, @@ -341,7 +354,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { unitData['weightUnit'].forEach( (e) => _weightUnits.add(WeightUnit.fromJson(e)), ); - dev.log("Read workout units data from cache. Valid till ${unitData['expiresIn']}"); + dev.log( + "Read workout units data from cache. Valid till ${unitData['expiresIn']}"); return; } } @@ -353,7 +367,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Save the result to the cache final exerciseData = { 'date': DateTime.now().toIso8601String(), - 'expiresIn': DateTime.now().add(Duration(days: DAYS_TO_CACHE)).toIso8601String(), + 'expiresIn': + DateTime.now().add(Duration(days: DAYS_TO_CACHE)).toIso8601String(), 'repetitionUnits': _repetitionUnit.map((e) => e.toJson()).toList(), 'weightUnit': _weightUnits.map((e) => e.toJson()).toList(), }; @@ -498,7 +513,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { log.id = newLog.id; log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = + _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); log.exercise = await _exercises.fetchAndSetExercise(log.exerciseId); final plan = findById(log.workoutPlan); @@ -506,4 +522,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..89e0a33c8 100644 --- a/lib/widgets/workouts/log.dart +++ b/lib/widgets/workouts/log.dart @@ -18,6 +18,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:wger/models/exercises/exercise.dart'; @@ -34,7 +35,8 @@ class ExerciseLogChart extends StatelessWidget { @override Widget build(BuildContext context) { - final _workoutPlansData = Provider.of(context, listen: false); + final _workoutPlansData = + Provider.of(context, listen: false); final _workout = _workoutPlansData.currentPlan; Future> _getChartEntries(BuildContext context) async { @@ -43,7 +45,8 @@ class ExerciseLogChart extends StatelessWidget { return FutureBuilder( future: _getChartEntries(context), - builder: (context, AsyncSnapshot> snapshot) => SizedBox( + builder: (context, AsyncSnapshot> snapshot) => + SizedBox( height: 150, child: snapshot.connectionState == ConnectionState.waiting ? Center(child: CircularProgressIndicator()) @@ -53,32 +56,114 @@ 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 { + final res = await showDialog( + context: context, + builder: (BuildContext contextDialog) { + return AlertDialog( + content: Text( + AppLocalizations.of(context) + .confirmDelete(exercise.name), + ), + 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: () { + setState(() { + widget._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; + }, + ), + ], + ), + ) + .toList(), + ExerciseLogChart(exercise, widget._date), SizedBox(height: 30), ], ); From 91ebe6ce0464f764b06e6a2bd749938fbf6d0f0b Mon Sep 17 00:00:00 2001 From: Marko Milosevic Date: Thu, 7 Oct 2021 19:40:19 +0200 Subject: [PATCH 2/5] Removed the hardcoded options for autologin --- lib/providers/auth.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/providers/auth.dart b/lib/providers/auth.dart index 5419c7568..60ff6801a 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -186,17 +186,12 @@ class AuthProvider with ChangeNotifier { } Future tryAutoLogin() async { - /*final prefs = await SharedPreferences.getInstance(); + final prefs = await SharedPreferences.getInstance(); if (!prefs.containsKey('userData')) { log('autologin failed'); return false; } - final extractedUserData = json.decode(prefs.getString('userData')!);*/ - final userData = json.encode({ - 'token': '847a37a0efe85a53a51d68ea7d64e4318761636b', - 'serverUrl': 'https://wger.rge.uber.space/' - }); - final extractedUserData = json.decode(userData); + final extractedUserData = json.decode(prefs.getString('userData')!); // final expiryDate = DateTime.parse(extractedUserData['expiryDate']); // if (expiryDate.isBefore(DateTime.now())) { From d8b984759e9e9d3a940c17d9fa74be064a254d6b Mon Sep 17 00:00:00 2001 From: Marko Milosevic Date: Thu, 7 Oct 2021 19:52:24 +0200 Subject: [PATCH 3/5] Added myself to AUTHORS.md, put 100 characters limit in settings.json --- .vscode/settings.json | 3 +++ AUTHORS.md | 63 ++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 34 deletions(-) create mode 100644 .vscode/settings.json 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) From 48063634cc0ed491e7f5fd3cba2804c020dce16d Mon Sep 17 00:00:00 2001 From: Marko Milosevic Date: Thu, 7 Oct 2021 19:58:57 +0200 Subject: [PATCH 4/5] Fixed 100 characters limit in code --- lib/providers/auth.dart | 5 +--- lib/providers/workout_plans.dart | 48 +++++++++++--------------------- lib/widgets/workouts/log.dart | 34 ++++++++-------------- 3 files changed, 28 insertions(+), 59 deletions(-) diff --git a/lib/providers/auth.dart b/lib/providers/auth.dart index 60ff6801a..3322a9a11 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -95,10 +95,7 @@ class AuthProvider with ChangeNotifier { // Register try { - final Map data = { - 'username': username, - 'password': password - }; + final Map data = {'username': username, 'password': password}; if (email != '') { data['email'] = email; } diff --git a/lib/providers/workout_plans.dart b/lib/providers/workout_plans.dart index 0efa95dae..6951bfa23 100644 --- a/lib/providers/workout_plans.dart +++ b/lib/providers/workout_plans.dart @@ -53,8 +53,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { List _weightUnits = []; List _repetitionUnit = []; - WorkoutPlansProvider( - AuthProvider auth, ExercisesProvider exercises, List entries, + WorkoutPlansProvider(AuthProvider auth, ExercisesProvider exercises, List entries, [http.Client? client]) : _exercises = exercises, _workoutPlans = entries, @@ -78,8 +77,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Return the default weight unit (kg) WeightUnit get defaultWeightUnit { - return _weightUnits - .firstWhere((element) => element.id == DEFAULT_WEIGHT_UNIT); + return _weightUnits.firstWhere((element) => element.id == DEFAULT_WEIGHT_UNIT); } List get repetitionUnits { @@ -88,8 +86,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Return the default weight unit (reps) RepetitionUnit get defaultRepetitionUnit { - return _repetitionUnit - .firstWhere((element) => element.id == DEFAULT_REPETITION_UNIT); + return _repetitionUnit.firstWhere((element) => element.id == DEFAULT_REPETITION_UNIT); } WorkoutPlan findById(int id) { @@ -144,8 +141,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { /// Fetches all workout plan sparsely, i.e. only with the data on the plan /// object itself and no child attributes Future fetchAndSetAllPlansSparse() async { - final data = - await fetch(makeUrl(_workoutPlansUrlPath, query: {'limit': '1000'})); + final data = await fetch(makeUrl(_workoutPlansUrlPath, query: {'limit': '1000'})); for (final workoutPlanData in data['results']) { final plan = WorkoutPlan.fromJson(workoutPlanData); _workoutPlans.add(plan); @@ -187,15 +183,13 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Days final List days = []; - final daysData = await fetch( - makeUrl(_daysUrlPath, query: {'training': plan.id.toString()})); + final daysData = await fetch(makeUrl(_daysUrlPath, query: {'training': plan.id.toString()})); for (final dayEntry in daysData['results']) { final day = Day.fromJson(dayEntry); // Sets final List sets = []; - final setData = await fetch( - makeUrl(_setsUrlPath, query: {'exerciseday': day.id.toString()})); + final setData = await fetch(makeUrl(_setsUrlPath, query: {'exerciseday': day.id.toString()})); for (final setEntry in setData['results']) { final workoutSet = Set.fromJson(setEntry); @@ -203,14 +197,12 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Settings final List settings = []; - final settingData = - allSettingsData['results'].where((s) => s['set'] == workoutSet.id); + final settingData = allSettingsData['results'].where((s) => s['set'] == workoutSet.id); for (final settingEntry in settingData) { final workoutSetting = Setting.fromJson(settingEntry); - workoutSetting.exercise = - await _exercises.fetchAndSetExercise(workoutSetting.exerciseId); + workoutSetting.exercise = await _exercises.fetchAndSetExercise(workoutSetting.exerciseId); workoutSetting.weightUnit = _weightUnits.firstWhere( (e) => e.id == workoutSetting.weightUnitId, ); @@ -249,10 +241,8 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { for (final entry in logData['results']) { try { final log = Log.fromJson(entry); - log.weightUnit = - _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = - _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); log.exercise = await _exercises.fetchAndSetExercise(log.exerciseId); plan.logs.add(log); } catch (e) { @@ -282,14 +272,12 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { } Future editWorkout(WorkoutPlan workout) async { - await patch( - workout.toJson(), makeUrl(_workoutPlansUrlPath, id: workout.id)); + await patch(workout.toJson(), makeUrl(_workoutPlansUrlPath, id: workout.id)); notifyListeners(); } Future deleteWorkout(int id) async { - final existingWorkoutIndex = - _workoutPlans.indexWhere((element) => element.id == id); + final existingWorkoutIndex = _workoutPlans.indexWhere((element) => element.id == id); final existingWorkout = _workoutPlans[existingWorkoutIndex]; _workoutPlans.removeAt(existingWorkoutIndex); notifyListeners(); @@ -303,8 +291,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { } } - Future> fetchLogData( - WorkoutPlan workout, Exercise exercise) async { + Future> fetchLogData(WorkoutPlan workout, Exercise exercise) async { final data = await fetch( makeUrl( _workoutPlansUrlPath, @@ -354,8 +341,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { unitData['weightUnit'].forEach( (e) => _weightUnits.add(WeightUnit.fromJson(e)), ); - dev.log( - "Read workout units data from cache. Valid till ${unitData['expiresIn']}"); + dev.log("Read workout units data from cache. Valid till ${unitData['expiresIn']}"); return; } } @@ -367,8 +353,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { // Save the result to the cache final exerciseData = { 'date': DateTime.now().toIso8601String(), - 'expiresIn': - DateTime.now().add(Duration(days: DAYS_TO_CACHE)).toIso8601String(), + 'expiresIn': DateTime.now().add(Duration(days: DAYS_TO_CACHE)).toIso8601String(), 'repetitionUnits': _repetitionUnit.map((e) => e.toJson()).toList(), 'weightUnit': _weightUnits.map((e) => e.toJson()).toList(), }; @@ -513,8 +498,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier { log.id = newLog.id; log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = - _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); log.exercise = await _exercises.fetchAndSetExercise(log.exerciseId); final plan = findById(log.workoutPlan); diff --git a/lib/widgets/workouts/log.dart b/lib/widgets/workouts/log.dart index 89e0a33c8..a65c283e5 100644 --- a/lib/widgets/workouts/log.dart +++ b/lib/widgets/workouts/log.dart @@ -35,8 +35,7 @@ class ExerciseLogChart extends StatelessWidget { @override Widget build(BuildContext context) { - final _workoutPlansData = - Provider.of(context, listen: false); + final _workoutPlansData = Provider.of(context, listen: false); final _workout = _workoutPlansData.currentPlan; Future> _getChartEntries(BuildContext context) async { @@ -45,8 +44,7 @@ class ExerciseLogChart extends StatelessWidget { return FutureBuilder( future: _getChartEntries(context), - builder: (context, AsyncSnapshot> snapshot) => - SizedBox( + builder: (context, AsyncSnapshot> snapshot) => SizedBox( height: 150, child: snapshot.connectionState == ConnectionState.waiting ? Center(child: CircularProgressIndicator()) @@ -79,8 +77,7 @@ class _DayLogWidgetState extends State { child: Column( children: [ Text( - DateFormat.yMd(Localizations.localeOf(context).languageCode) - .format(widget._date), + DateFormat.yMd(Localizations.localeOf(context).languageCode).format(widget._date), style: Theme.of(context).textTheme.headline5, ), if (widget._session != null) Text('Session data here'), @@ -108,32 +105,25 @@ class _DayLogWidgetState extends State { builder: (BuildContext contextDialog) { return AlertDialog( content: Text( - AppLocalizations.of(context) - .confirmDelete(exercise.name), + AppLocalizations.of(context).confirmDelete(exercise.name), ), actions: [ TextButton( child: Text( - MaterialLocalizations.of(context) - .cancelButtonLabel), - onPressed: () => - Navigator.of(contextDialog).pop(), + MaterialLocalizations.of(context).cancelButtonLabel), + onPressed: () => Navigator.of(contextDialog).pop(), ), TextButton( child: Text( AppLocalizations.of(context).delete, - style: TextStyle( - color: Theme.of(context) - .errorColor), + style: TextStyle(color: Theme.of(context).errorColor), ), onPressed: () { setState(() { widget._exerciseData[exercise]! - .removeWhere( - (el) => el.id == log.id); + .removeWhere((el) => el.id == log.id); }); - Provider.of( - context, + Provider.of(context, listen: false) .deleteLog( log, @@ -141,12 +131,10 @@ class _DayLogWidgetState extends State { Navigator.of(contextDialog).pop(); - ScaffoldMessenger.of(context) - .showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - AppLocalizations.of(context) - .successfullyDeleted, + AppLocalizations.of(context).successfullyDeleted, textAlign: TextAlign.center, ), ), From b31a480b453ccba6dc62c0d04fa4de18014fab35 Mon Sep 17 00:00:00 2001 From: Marko Milosevic Date: Sun, 10 Oct 2021 16:26:51 +0200 Subject: [PATCH 5/5] Added helper for delete dilaog (currently only for log delete) --- lib/helpers/ui.dart | 47 +++++++++++++++++++++++++++++++++ lib/widgets/workouts/log.dart | 49 +++-------------------------------- 2 files changed, 50 insertions(+), 46 deletions(-) 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/widgets/workouts/log.dart b/lib/widgets/workouts/log.dart index a65c283e5..f491e620a 100644 --- a/lib/widgets/workouts/log.dart +++ b/lib/widgets/workouts/log.dart @@ -18,9 +18,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.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'; @@ -100,51 +100,8 @@ class _DayLogWidgetState extends State { IconButton( icon: Icon(Icons.delete), onPressed: () async { - final res = await showDialog( - context: context, - builder: (BuildContext contextDialog) { - return AlertDialog( - content: Text( - AppLocalizations.of(context).confirmDelete(exercise.name), - ), - 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: () { - setState(() { - widget._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; + showDeleteDialog( + context, exercise.name, log, exercise, widget._exerciseData); }, ), ],