diff --git a/lib/models/workouts/set.dart b/lib/models/workouts/set.dart index 22742dc6..603316ae 100644 --- a/lib/models/workouts/set.dart +++ b/lib/models/workouts/set.dart @@ -38,6 +38,9 @@ class Set { @JsonKey(required: true) int? order; + @JsonKey(required: true, defaultValue: '') + late String comment; + @JsonKey(ignore: true) List exercisesObj = []; @@ -64,6 +67,7 @@ class Set { this.id, sets, day, + comment, order, exercises, settings, @@ -71,6 +75,7 @@ class Set { }) { this.sets = sets ?? DEFAULT_NR_SETS; this.order = order ?? 1; + this.comment = comment ?? ''; this.exercisesObj = exercises ?? []; this.exercisesIds = exercisesObj.map((e) => e.id).toList(); this.settings = settings ?? []; diff --git a/lib/models/workouts/set.g.dart b/lib/models/workouts/set.g.dart index 38b18cb7..68ae9e81 100644 --- a/lib/models/workouts/set.g.dart +++ b/lib/models/workouts/set.g.dart @@ -7,12 +7,14 @@ part of 'set.dart'; // ************************************************************************** Set _$SetFromJson(Map json) { - $checkKeys(json, requiredKeys: const ['id', 'sets', 'order']); + $checkKeys(json, requiredKeys: const ['id', 'sets', 'order', 'comment']); return Set( day: json['exerciseday'] as int, sets: json['sets'] as int, order: json['order'] as int?, - )..id = json['id'] as int?; + ) + ..id = json['id'] as int? + ..comment = json['comment'] as String? ?? ''; } Map _$SetToJson(Set instance) => { @@ -20,4 +22,5 @@ Map _$SetToJson(Set instance) => { 'sets': instance.sets, 'exerciseday': instance.day, 'order': instance.order, + 'comment': instance.comment, }; diff --git a/lib/widgets/workouts/day.dart b/lib/widgets/workouts/day.dart index 858b32e8..ed9c0fe2 100644 --- a/lib/widgets/workouts/day.dart +++ b/lib/widgets/workouts/day.dart @@ -27,6 +27,7 @@ import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/form_screen.dart'; import 'package:wger/screens/gym_mode.dart'; import 'package:wger/theme/theme.dart'; +import 'package:wger/widgets/core/core.dart'; import 'package:wger/widgets/exercises/exercises.dart'; import 'package:wger/widgets/exercises/images.dart'; import 'package:wger/widgets/workouts/forms.dart'; @@ -125,6 +126,7 @@ class _WorkoutDayWidgetState extends State { Expanded( child: Column( children: [ + if (set.comment != '') MutedText(set.comment), ...set.settingsFiltered .map( (setting) => SettingWidget( diff --git a/lib/widgets/workouts/forms.dart b/lib/widgets/workouts/forms.dart index 1a5db253..417eff61 100644 --- a/lib/widgets/workouts/forms.dart +++ b/lib/widgets/workouts/forms.dart @@ -440,6 +440,25 @@ class _SetFormWidgetState extends State { ), ), SizedBox(height: 10), + TextFormField( + decoration: InputDecoration( + labelText: AppLocalizations.of(context).comment, + errorMaxLines: 2, + ), + keyboardType: TextInputType.text, + validator: (value) { + const minLength = 0; + const maxLength = 200; + if (value!.length > maxLength) { + return AppLocalizations.of(context).enterCharacters(minLength, maxLength); + } + return null; + }, + onSaved: (newValue) { + widget._set.comment = newValue!; + }, + ), + SizedBox(height: 10), ...widget._set.exercisesObj.asMap().entries.map((entry) { final index = entry.key; final exercise = entry.value; diff --git a/lib/widgets/workouts/gym_mode.dart b/lib/widgets/workouts/gym_mode.dart index 935596dc..fd05ae99 100644 --- a/lib/widgets/workouts/gym_mode.dart +++ b/lib/widgets/workouts/gym_mode.dart @@ -26,13 +26,14 @@ import 'package:provider/provider.dart'; import 'package:wger/helpers/consts.dart'; import 'package:wger/helpers/gym_mode.dart'; import 'package:wger/helpers/json.dart'; -import 'package:wger/helpers/ui.dart'; import 'package:wger/helpers/misc.dart'; +import 'package:wger/helpers/ui.dart'; import 'package:wger/models/exercises/exercise.dart'; import 'package:wger/models/http_exception.dart'; import 'package:wger/models/workouts/day.dart'; import 'package:wger/models/workouts/log.dart'; import 'package:wger/models/workouts/session.dart'; +import 'package:wger/models/workouts/set.dart'; import 'package:wger/models/workouts/setting.dart'; import 'package:wger/models/workouts/workout_plan.dart'; import 'package:wger/providers/exercises.dart'; @@ -131,6 +132,7 @@ class _GymModeState extends State { out.add(LogPage( _controller, setting, + set, exercise, workoutProvider.findById(widget._workoutDay.workoutId), ratioCompleted, @@ -229,6 +231,7 @@ class StartPage extends StatelessWidget { class LogPage extends StatefulWidget { PageController _controller; Setting _setting; + Set _set; Exercise _exercise; WorkoutPlan _workoutPlan; final double _ratioCompleted; @@ -238,6 +241,7 @@ class LogPage extends StatefulWidget { LogPage( this._controller, this._setting, + this._set, this._exercise, this._workoutPlan, this._ratioCompleted, @@ -590,11 +594,16 @@ class _LogPageState extends State { ), Center( child: Text( - '${widget._setting.singleSettingRepText}', + widget._setting.singleSettingRepText, style: Theme.of(context).textTheme.headline3, textAlign: TextAlign.center, ), ), + if (widget._set.comment != '') + Text( + widget._set.comment, + textAlign: TextAlign.center, + ), SizedBox(height: 10), Expanded( child: (widget._workoutPlan.filterLogsByExercise(widget._exercise).length > 0) diff --git a/test/gym_mode_screen_test.dart b/test/gym_mode_screen_test.dart index a4bca19a..dc352217 100644 --- a/test/gym_mode_screen_test.dart +++ b/test/gym_mode_screen_test.dart @@ -108,6 +108,7 @@ void main() { expect(find.byType(ListTile), findsNWidgets(3), reason: 'Two logs and the switch tile'); expect(find.text('10 × 10 kg (1.5 RiR)'), findsOneWidget); expect(find.text('12 × 10 kg (2 RiR)'), findsOneWidget); + expect(find.text('Important to do exercises correctly'), findsOneWidget, reason: 'Set comment'); expect(find.byIcon(Icons.close), findsOneWidget); expect(find.byIcon(Icons.menu), findsOneWidget); expect(find.byIcon(Icons.chevron_left), findsOneWidget); diff --git a/test_data/workouts.dart b/test_data/workouts.dart index 1f25abf8..f8877f14 100644 --- a/test_data/workouts.dart +++ b/test_data/workouts.dart @@ -86,6 +86,7 @@ WorkoutPlan getWorkout() { day: 1, sets: 3, order: 1, + comment: 'Important to do exercises correctly', ); set1.addExercise(exercise1); set1.settings.add(setting1);