From a00ac1afdf3c3b4fed3536179c2efcd6ae66824d Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Sat, 21 Nov 2020 21:01:30 +0100 Subject: [PATCH] Allow editing the workout name when creating one --- lib/l10n/intl_messages.arb | 20 ++++++++- lib/l10n/messages_messages.dart | 5 ++- lib/locale/locales.dart | 16 +++++++ lib/models/workouts/workout_plan.dart | 7 ++-- lib/providers/workout_plans.dart | 6 ++- lib/screens/workout_plans_screen.dart | 44 +++++++++++++++++++- lib/widgets/workouts/workout_plans_list.dart | 2 +- 7 files changed, 90 insertions(+), 10 deletions(-) diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 53b311a4..78160dbb 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,15 +1,33 @@ { - "@@last_modified": "2020-11-11T15:35:32.537025", + "@@last_modified": "2020-11-21T20:55:11.028883", "labelWorkoutPlans": "Workout plans", "@labelWorkoutPlans": { "description": "Title for screen workout plans", "type": "text", "placeholders": {} }, + "newWorkout": "new Workout", + "@newWorkout": { + "description": "Header when adding a new workout", + "type": "text", + "placeholders": {} + }, + "description": "description", + "@description": { + "description": "Description of a workout, nutritional plan, etc.", + "type": "text", + "placeholders": {} + }, "labelWorkoutPlan": "Workout plan", "@labelWorkoutPlan": { "description": "Title for screen workout plan", "type": "text", "placeholders": {} + }, + "labelDashboard": "Dashboard", + "@labelDashboard": { + "description": "Title for screen dashboard", + "type": "text", + "placeholders": {} } } \ No newline at end of file diff --git a/lib/l10n/messages_messages.dart b/lib/l10n/messages_messages.dart index 82a1ab72..bc41aaff 100644 --- a/lib/l10n/messages_messages.dart +++ b/lib/l10n/messages_messages.dart @@ -21,7 +21,10 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static _notInlinedMessages(_) => { + "description" : MessageLookupByLibrary.simpleMessage("description"), + "labelDashboard" : MessageLookupByLibrary.simpleMessage("Dashboard"), "labelWorkoutPlan" : MessageLookupByLibrary.simpleMessage("Workout plan"), - "labelWorkoutPlans" : MessageLookupByLibrary.simpleMessage("Workout plans") + "labelWorkoutPlans" : MessageLookupByLibrary.simpleMessage("Workout plans"), + "newWorkout" : MessageLookupByLibrary.simpleMessage("new Workout") }; } diff --git a/lib/locale/locales.dart b/lib/locale/locales.dart index 28fbc644..c22a34c1 100644 --- a/lib/locale/locales.dart +++ b/lib/locale/locales.dart @@ -25,6 +25,22 @@ class AppLocalizations { ); } + String get newWorkout { + return Intl.message( + 'new Workout', + name: 'newWorkout', + desc: 'Header when adding a new workout', + ); + } + + String get description { + return Intl.message( + 'description', + name: 'description', + desc: 'Description of a workout, nutritional plan, etc.', + ); + } + String get labelWorkoutPlan { return Intl.message( 'Workout plan', diff --git a/lib/models/workouts/workout_plan.dart b/lib/models/workouts/workout_plan.dart index 82d63fa8..2260f088 100644 --- a/lib/models/workouts/workout_plan.dart +++ b/lib/models/workouts/workout_plan.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:wger/models/workouts/day.dart'; @@ -18,9 +19,9 @@ class WorkoutPlan { List days = []; WorkoutPlan({ - this.id, - this.creationDate, - this.description, + @required this.id, + @required this.creationDate, + @required this.description, this.days, }); diff --git a/lib/providers/workout_plans.dart b/lib/providers/workout_plans.dart index 1572292a..22e91b6c 100644 --- a/lib/providers/workout_plans.dart +++ b/lib/providers/workout_plans.dart @@ -140,7 +140,7 @@ class WorkoutPlans with ChangeNotifier { } } - Future addWorkout(WorkoutPlan workout) async { + Future addWorkout(WorkoutPlan workout) async { try { final response = await http.post( _url, @@ -150,8 +150,10 @@ class WorkoutPlans with ChangeNotifier { }, body: json.encode(workout.toJson()), ); - _entries.insert(0, WorkoutPlan.fromJson(json.decode(response.body))); + workout = WorkoutPlan.fromJson(json.decode(response.body)); + _entries.insert(0, workout); notifyListeners(); + return workout; } catch (error) { throw error; } diff --git a/lib/screens/workout_plans_screen.dart b/lib/screens/workout_plans_screen.dart index 83f04386..f4bad3ad 100644 --- a/lib/screens/workout_plans_screen.dart +++ b/lib/screens/workout_plans_screen.dart @@ -1,8 +1,10 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:wger/locale/locales.dart'; import 'package:wger/models/workouts/workout_plan.dart'; import 'package:wger/providers/workout_plans.dart'; +import 'package:wger/screens/workout_plan_screen.dart'; import 'package:wger/widgets/app_drawer.dart'; import 'package:wger/widgets/workouts/workout_plans_list.dart'; @@ -14,6 +16,8 @@ class WorkoutPlansScreen extends StatefulWidget { } class _WorkoutPlansScreenState extends State { + final workoutController = TextEditingController(); + Future _refreshWorkoutPlans(BuildContext context) async { await Provider.of(context, listen: false).fetchAndSetWorkouts(); } @@ -37,8 +41,44 @@ class _WorkoutPlansScreenState extends State { drawer: AppDrawer(), floatingActionButton: FloatingActionButton( onPressed: () { - Provider.of(context, listen: false).addWorkout( - WorkoutPlan(description: 'button'), + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return Container( + margin: EdgeInsets.all(20), + child: Form( + child: Column( + children: [ + Text( + AppLocalizations.of(context).newWorkout, + style: Theme.of(context).textTheme.headline6, + ), + TextFormField( + decoration: + InputDecoration(labelText: AppLocalizations.of(context).description), + controller: workoutController, + onFieldSubmitted: (_) {}, + ), + ElevatedButton( + child: Text('Save'), + onPressed: () { + final workoutFuture = Provider.of(context, listen: false) + .addWorkout(WorkoutPlan(description: workoutController.text)); + workoutController.text = ''; + Navigator.of(context).pop(); + workoutFuture.then( + (workout) => Navigator.of(context).pushNamed( + WorkoutPlanScreen.routeName, + arguments: workout, + ), + ); + }, + ), + ], + ), + ), + ); + }, ); }, child: const Icon(Icons.add), diff --git a/lib/widgets/workouts/workout_plans_list.dart b/lib/widgets/workouts/workout_plans_list.dart index 3b423ebd..4094ea38 100644 --- a/lib/widgets/workouts/workout_plans_list.dart +++ b/lib/widgets/workouts/workout_plans_list.dart @@ -23,7 +23,7 @@ class WorkoutPlansList extends StatelessWidget { Scaffold.of(context).showSnackBar( SnackBar( content: Text( - "Workout ${currentWorkout.id} deleted", + 'Workout "${currentWorkout.description}" deleted', textAlign: TextAlign.center, ), ),