Rename some functions, a bit of cleanup

This commit is contained in:
Roland Geider
2025-01-10 15:52:26 +01:00
parent b42112075c
commit 5a39c6c229
23 changed files with 434 additions and 172 deletions

View File

@@ -12,9 +12,8 @@ import 'package:wger/theme/theme.dart';
import '../test/exercises/contribute_exercise_test.mocks.dart';
import '../test/measurements/measurement_categories_screen_test.mocks.dart';
import '../test/nutrition/nutritional_plan_form_test.mocks.dart';
import '../test/weight/weight_screen_test.mocks.dart' as weight;
import '../test/workout/weight_unit_form_widget_test.mocks.dart';
import '../test/workout/workout_form_test.mocks.dart';
import '../test_data/body_weight.dart';
import '../test_data/exercises.dart';
import '../test_data/measurements.dart';
@@ -25,7 +24,7 @@ import '../test_data/routines.dart';
Widget createDashboardScreen({locale = 'en'}) {
final mockWorkoutProvider = MockRoutinesProvider();
when(mockWorkoutProvider.activeRoutine)
.thenReturn(getRoutine(exercises: getScreenshotExercises()));
.thenReturn(getTestRoutine(exercises: getScreenshotExercises()));
final Map<String, dynamic> logs = {
'results': [
@@ -41,13 +40,13 @@ Widget createDashboardScreen({locale = 'en'}) {
};
when(mockWorkoutProvider.fetchSessionData()).thenAnswer((a) => Future.value(logs));
final mockNutritionProvider = MockNutritionPlansProvider();
final mockNutritionProvider = weight.MockNutritionPlansProvider();
when(mockNutritionProvider.currentPlan)
.thenAnswer((realInvocation) => getNutritionalPlanScreenshot());
when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]);
final mockWeightProvider = MockBodyWeightProvider();
final mockWeightProvider = weight.MockBodyWeightProvider();
when(mockWeightProvider.items).thenReturn(getScreenshotWeightEntries());
final mockMeasurementProvider = MockMeasurementProvider();

View File

@@ -14,7 +14,7 @@ Widget createWorkoutDetailScreen({locale = 'en'}) {
final key = GlobalKey<NavigatorState>();
final mockWorkoutProvider = MockRoutinesProvider();
final workout = getRoutine(exercises: getScreenshotExercises());
final workout = getTestRoutine(exercises: getScreenshotExercises());
when(mockWorkoutProvider.activeRoutine).thenReturn(workout);
when(mockWorkoutProvider.fetchAndSetRoutineFull(1)).thenAnswer((_) => Future.value(workout));

View File

@@ -16,7 +16,7 @@ import '../test_data/routines.dart';
Widget createGymModeScreen({locale = 'en'}) {
final key = GlobalKey<NavigatorState>();
final bases = getTestExercises();
final workout = getRoutine(exercises: getScreenshotExercises());
final workout = getTestRoutine(exercises: getScreenshotExercises());
final mockExerciseProvider = MockExercisesProvider();

View File

@@ -173,7 +173,7 @@ class Exercise extends Equatable {
variationId = baseData.variationId;
}
/// Returns exercises for the given language
/// Returns translation for the given language
///
/// If no translation is found, English will be returned
///
@@ -181,7 +181,7 @@ class Exercise extends Equatable {
/// translation in English. This is something that should never happen,
/// but we can't make sure that no local installation hasn't deleted
/// the entry in English.
Translation getExercise(String language) {
Translation getTranslation(String language) {
// If the language is in the form en-US, take the language code only
final languageCode = language.split('-')[0];

View File

@@ -63,18 +63,24 @@ class RoutinesProvider with ChangeNotifier {
static const _routineConfigMaxRestTime = 'max-rest-config';
Routine? _currentPlan;
final ExercisesProvider _exercises;
late ExercisesProvider _exercises;
final WgerBaseProvider baseProvider;
List<Routine> _routines = [];
List<WeightUnit> _weightUnits = [];
List<RepetitionUnit> _repetitionUnit = [];
List<RepetitionUnit> _repetitionUnits = [];
RoutinesProvider(
this.baseProvider,
ExercisesProvider exercises,
List<Routine> entries,
) : _exercises = exercises,
_routines = entries;
List<Routine> entries, {
List<WeightUnit>? weightUnits,
List<RepetitionUnit>? repetitionUnits,
}) {
_exercises = exercises;
_routines = entries;
_weightUnits = weightUnits ?? [];
_repetitionUnits = repetitionUnits ?? [];
}
List<Routine> get items {
return [..._routines];
@@ -89,7 +95,7 @@ class RoutinesProvider with ChangeNotifier {
_currentPlan = null;
_routines = [];
_weightUnits = [];
_repetitionUnit = [];
_repetitionUnits = [];
}
/// Return the default weight unit (kg)
@@ -100,15 +106,15 @@ class RoutinesProvider with ChangeNotifier {
WeightUnit findWeightUnitById(int id) => _weightUnits.firstWhere((element) => element.id == id);
List<RepetitionUnit> get repetitionUnits {
return [..._repetitionUnit];
return [..._repetitionUnits];
}
RepetitionUnit findRepetitionUnitById(int id) =>
_repetitionUnit.firstWhere((element) => element.id == id);
_repetitionUnits.firstWhere((element) => element.id == id);
/// Return the default weight unit (reps)
RepetitionUnit get defaultRepetitionUnit {
return _repetitionUnit.firstWhere((element) => element.id == REP_UNIT_REPETITIONS_ID);
return _repetitionUnits.firstWhere((element) => element.id == REP_UNIT_REPETITIONS_ID);
}
List<Routine> getPlans() {
@@ -189,7 +195,7 @@ class RoutinesProvider with ChangeNotifier {
for (final setConfig in slot.setConfigs) {
setConfig.exercise = (await _exercises.fetchAndSetExercise(setConfig.exerciseId))!;
setConfig.repsUnit = _repetitionUnit.firstWhere(
setConfig.repsUnit = _repetitionUnits.firstWhere(
(e) => e.id == setConfig.repsUnitId,
);
@@ -293,7 +299,7 @@ class RoutinesProvider with ChangeNotifier {
for (final slot in day.slots) {
for (final slotEntry in slot.entries) {
slotEntry.exerciseObj = (await _exercises.fetchAndSetExercise(slotEntry.exerciseId))!;
slotEntry.repetitionUnitObj = _repetitionUnit.firstWhere(
slotEntry.repetitionUnitObj = _repetitionUnits.firstWhere(
(e) => e.id == slotEntry.repetitionUnitId,
);
slotEntry.weightUnitObj = _weightUnits.firstWhere(
@@ -315,7 +321,7 @@ class RoutinesProvider with ChangeNotifier {
try {
final log = Log.fromJson(logEntry);
log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId);
log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId);
log.repetitionUnit = _repetitionUnits.firstWhere((e) => e.id == log.weightUnitId);
log.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!;
routine.logs.add(log);
} catch (e) {
@@ -392,7 +398,7 @@ class RoutinesProvider with ChangeNotifier {
final response =
await baseProvider.fetchPaginated(baseProvider.makeUrl(_repetitionUnitUrlPath));
for (final unit in response) {
_repetitionUnit.add(RepetitionUnit.fromJson(unit));
_repetitionUnits.add(RepetitionUnit.fromJson(unit));
}
}
@@ -411,7 +417,7 @@ class RoutinesProvider with ChangeNotifier {
final unitData = json.decode(prefs.getString(PREFS_WORKOUT_UNITS)!);
if (DateTime.parse(unitData['expiresIn']).isAfter(DateTime.now())) {
unitData['repetitionUnits'].forEach(
(e) => _repetitionUnit.add(RepetitionUnit.fromJson(e)),
(e) => _repetitionUnits.add(RepetitionUnit.fromJson(e)),
);
unitData['weightUnit'].forEach(
(e) => _weightUnits.add(WeightUnit.fromJson(e)),
@@ -431,7 +437,7 @@ class RoutinesProvider with ChangeNotifier {
final cacheData = {
'date': DateTime.now().toIso8601String(),
'expiresIn': DateTime.now().add(const Duration(days: DAYS_TO_CACHE)).toIso8601String(),
'repetitionUnits': _repetitionUnit.map((e) => e.toJson()).toList(),
'repetitionUnits': _repetitionUnits.map((e) => e.toJson()).toList(),
'weightUnit': _weightUnits.map((e) => e.toJson()).toList(),
};
prefs.setString(PREFS_WORKOUT_UNITS, json.encode(cacheData));
@@ -691,7 +697,7 @@ class RoutinesProvider 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 = _repetitionUnits.firstWhere((e) => e.id == log.weightUnitId);
log.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!;
final plan = findById(log.routineId);

View File

@@ -76,7 +76,7 @@ class _AddExerciseStepperState extends State<AddExerciseStepper> {
final exerciseId = await addExerciseProvider.addExercise();
final exercise = await exerciseProvider.fetchAndSetExercise(exerciseId);
final name = exercise!
.getExercise(Localizations.localeOf(context).languageCode)
.getTranslation(Localizations.localeOf(context).languageCode)
.name;
setState(() {

View File

@@ -31,7 +31,7 @@ class ExerciseDetailScreen extends StatelessWidget {
return Scaffold(
appBar: AppBar(
title: Text(exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name),
title: Text(exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),

View File

@@ -40,14 +40,16 @@ class GymModeScreen extends StatelessWidget {
final routinesProvider = context.read<RoutinesProvider>();
final routine = routinesProvider.findById(args.routineId);
final dayData = routine.dayDataGym
final dayDataDisplay =
routine.dayData.firstWhere((e) => e.iteration == args.iteration && e.day?.id == args.dayId);
final dayDataGym = routine.dayDataGym
.where((e) => e.iteration == args.iteration && e.day?.id == args.dayId)
.first;
return Scaffold(
body: SafeArea(
child: Consumer<RoutinesProvider>(
builder: (context, value, child) => GymMode(dayData),
builder: (context, value, child) => GymMode(dayDataGym, dayDataDisplay),
),
),
);

View File

@@ -40,7 +40,7 @@ class Step2Variations extends StatelessWidget {
...exerciseProvider.exerciseBasesByVariation[key]!.map(
(base) => Text(
base
.getExercise(
.getTranslation(
Localizations.localeOf(context).languageCode,
)
.name,
@@ -72,7 +72,7 @@ class Step2Variations extends StatelessWidget {
children: [
Text(
base
.getExercise(
.getTranslation(
Localizations.localeOf(context).languageCode,
)
.name,

View File

@@ -439,7 +439,7 @@ class _DashboardWorkoutWidgetState extends State<DashboardWorkoutWidget> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(s.exercise
.getExercise(Localizations.localeOf(context).languageCode)
.getTranslation(Localizations.localeOf(context).languageCode)
.name),
const SizedBox(width: 10),
MutedText(s.textRepr),

View File

@@ -102,7 +102,7 @@ class _ExerciseAutocompleterState extends State<ExerciseAutocompleter> {
),
),
title: Text(
exerciseSuggestion.getExercise(Localizations.localeOf(context).languageCode).name,
exerciseSuggestion.getTranslation(Localizations.localeOf(context).languageCode).name,
),
subtitle: Text(
'${exerciseSuggestion.category!.name} / ${exerciseSuggestion.equipment.map((e) => e.name).join(', ')}',

View File

@@ -42,7 +42,7 @@ class ExerciseDetail extends StatelessWidget {
@override
Widget build(BuildContext context) {
_exercise = _exerciseBase.getExercise(Localizations.localeOf(context).languageCode);
_exercise = _exerciseBase.getTranslation(Localizations.localeOf(context).languageCode);
return SingleChildScrollView(
child: Column(

View File

@@ -49,7 +49,7 @@ class ExerciseListTile extends StatelessWidget {
),
),
title: Text(
exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name,
exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name,
//style: theme.textTheme.titleLarge,
overflow: TextOverflow.ellipsis,
maxLines: 2,

View File

@@ -46,7 +46,7 @@ class SetConfigDataWidget extends StatelessWidget {
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(setConfigData.exercise.getExercise(languageCode).name),
title: Text(setConfigData.exercise.getTranslation(languageCode).name),
content: ExerciseDetail(setConfigData.exercise),
actions: [
TextButton(
@@ -63,7 +63,7 @@ class SetConfigDataWidget extends StatelessWidget {
);
},
),
title: Text(setConfigData.exercise.getExercise(languageCode).name),
title: Text(setConfigData.exercise.getTranslation(languageCode).name),
subtitle: Text(setConfigData.textRepr),
);
}

View File

@@ -44,7 +44,7 @@ class ProgressionRulesInfoBox extends StatelessWidget {
children: [
ListTile(
title: Text(
exercise.getExercise(languageCode).name,
exercise.getTranslation(languageCode).name,
style: Theme.of(context).textTheme.titleMedium,
),
),
@@ -148,7 +148,7 @@ class _SlotEntryFormState extends State<SlotEntryForm> {
children: [
ListTile(
title: Text(
widget.entry.exerciseObj.getExercise(languageCode).name,
widget.entry.exerciseObj.getTranslation(languageCode).name,
style: Theme.of(context).textTheme.titleMedium,
// textAlign: TextAlign.center,
),
@@ -500,8 +500,8 @@ class _SlotFormWidgetStateNg extends State<ReorderableSlotList> {
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
...slot.entries
.map((e) => Text(e.exerciseObj.getExercise(languageCode).name)),
...slot.entries.map(
(e) => Text(e.exerciseObj.getTranslation(languageCode).name)),
],
),
trailing: Row(

View File

@@ -29,7 +29,6 @@ import 'package:wger/helpers/i18n.dart';
import 'package:wger/helpers/json.dart';
import 'package:wger/helpers/ui.dart';
import 'package:wger/models/exercises/exercise.dart';
import 'package:wger/models/workouts/day.dart';
import 'package:wger/models/workouts/day_data.dart';
import 'package:wger/models/workouts/log.dart';
import 'package:wger/models/workouts/routine.dart';
@@ -48,10 +47,11 @@ import 'package:wger/widgets/routines/forms/rir.dart';
import 'package:wger/widgets/routines/forms/weight_unit.dart';
class GymMode extends StatefulWidget {
final DayData _dayData;
final DayData _dayDataGym;
final DayData _dayDataDisplay;
late final TimeOfDay _start;
GymMode(this._dayData) {
GymMode(this._dayDataGym, this._dayDataDisplay) {
_start = TimeOfDay.now();
}
@@ -77,7 +77,7 @@ class _GymModeState extends State<GymMode> {
super.initState();
// Calculate amount of elements for progress indicator
for (final slot in widget._dayData.slots) {
for (final slot in widget._dayDataGym.slots) {
_totalElements += slot.setConfigs.length;
}
// Calculate the pages for the navigation
@@ -85,7 +85,7 @@ class _GymModeState extends State<GymMode> {
// This duplicates the code below in the getContent method, but it seems to
// be the easiest way
var currentPage = 1;
for (final slot in widget._dayData.slots) {
for (final slot in widget._dayDataGym.slots) {
var firstPage = true;
for (final config in slot.setConfigs) {
final exercise = Provider.of<ExercisesProvider>(context, listen: false)
@@ -113,7 +113,7 @@ class _GymModeState extends State<GymMode> {
var currentElement = 1;
final List<Widget> out = [];
for (final slotData in widget._dayData.slots) {
for (final slotData in widget._dayDataGym.slots) {
var firstPage = true;
for (final config in slotData.setConfigs) {
final ratioCompleted = currentElement / _totalElements;
@@ -134,10 +134,11 @@ class _GymModeState extends State<GymMode> {
config,
slotData,
exercise,
workoutProvider.findById(widget._dayData.day!.routineId),
workoutProvider.findById(widget._dayDataGym.day!.routineId),
ratioCompleted,
_exercisePages,
));
out.add(TimerWidget(_controller, ratioCompleted, _exercisePages));
firstPage = false;
}
@@ -151,11 +152,11 @@ class _GymModeState extends State<GymMode> {
return PageView(
controller: _controller,
children: [
StartPage(_controller, widget._dayData.day!, _exercisePages),
StartPage(_controller, widget._dayDataDisplay, _exercisePages),
...getContent(),
SessionPage(
Provider.of<RoutinesProvider>(context, listen: false)
.findById(widget._dayData.day!.routineId),
.findById(widget._dayDataGym.day!.routineId),
_controller,
widget._start,
_exercisePages,
@@ -167,10 +168,10 @@ class _GymModeState extends State<GymMode> {
class StartPage extends StatelessWidget {
final PageController _controller;
final Day _day;
final DayData _dayData;
final Map<Exercise, int> _exercisePages;
const StartPage(this._controller, this._day, this._exercisePages);
const StartPage(this._controller, this._dayData, this._exercisePages);
@override
Widget build(BuildContext context) {
@@ -185,19 +186,19 @@ class StartPage extends StatelessWidget {
Expanded(
child: ListView(
children: [
..._day.slots.map((slot) {
..._dayData.slots.map((slotData) {
return Column(
children: [
...slot.entries.map((entry) {
...slotData.setConfigs.map((entry) {
return Column(
children: [
Text(
entry.exerciseObj
.getExercise(Localizations.localeOf(context).languageCode)
entry.exercise
.getTranslation(Localizations.localeOf(context).languageCode)
.name,
style: Theme.of(context).textTheme.titleLarge,
),
const Text('TODO'),
Text(entry.textRepr),
const SizedBox(height: 15),
],
);
@@ -617,7 +618,7 @@ class _LogPageState extends State<LogPage> {
return Column(
children: [
NavigationHeader(
widget._exercise.getExercise(Localizations.localeOf(context).languageCode).name,
widget._exercise.getTranslation(Localizations.localeOf(context).languageCode).name,
widget._controller,
exercisePages: widget._exercisePages,
),
@@ -667,7 +668,7 @@ class ExerciseOverview extends StatelessWidget {
return Column(
children: [
NavigationHeader(
_exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name,
_exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name,
_controller,
exercisePages: _exercisePages,
),
@@ -700,7 +701,7 @@ class ExerciseOverview extends StatelessWidget {
),
Html(
data: _exerciseBase
.getExercise(Localizations.localeOf(context).languageCode)
.getTranslation(Localizations.localeOf(context).languageCode)
.description,
),
],
@@ -1078,7 +1079,7 @@ class NavigationHeader extends StatelessWidget {
children: [
...exercisePages.keys.map((e) {
return ListTile(
title: Text(e.getExercise(Localizations.localeOf(context).languageCode).name),
title: Text(e.getTranslation(Localizations.localeOf(context).languageCode).name),
trailing: const Icon(Icons.chevron_right),
onTap: () {
_controller.animateToPage(

View File

@@ -113,7 +113,7 @@ class _DayLogWidgetState extends State<DayLogWidget> {
),
if (widget._session != null) const Text('Session data here'),
...widget._exerciseData.keys.map((base) {
final exercise = base.getExercise(Localizations.localeOf(context).languageCode);
final exercise = base.getTranslation(Localizations.localeOf(context).languageCode);
return Column(
children: [
if (widget._exerciseData[base]!.isNotEmpty)

View File

@@ -17,13 +17,13 @@ void main() {
final base = getTestExercises()[1];
// assert
expect(base.getExercise('en').id, 5);
expect(base.getExercise('en-UK').id, 5);
expect(base.getExercise('de').id, 4);
expect(base.getExercise('de-AT').id, 4);
expect(base.getExercise('fr').id, 3);
expect(base.getExercise('fr-FR').id, 3);
expect(base.getExercise('pt').id, 5); // English again
expect(base.getTranslation('en').id, 5);
expect(base.getTranslation('en-UK').id, 5);
expect(base.getTranslation('de').id, 4);
expect(base.getTranslation('de-AT').id, 4);
expect(base.getTranslation('fr').id, 3);
expect(base.getTranslation('fr-FR').id, 3);
expect(base.getTranslation('pt').id, 5); // English again
});
test('Load the readExerciseBaseFromBaseInfo parse method', () {

View File

@@ -42,15 +42,17 @@ void main() {
final key = GlobalKey<NavigatorState>();
final mockExerciseProvider = MockExercisesProvider();
final workoutPlan = getRoutine();
final bases = getTestExercises();
final testRoutine = getTestRoutine();
final testExercises = getTestExercises();
Widget createHomeScreen({locale = 'en'}) {
Widget renderGymMode({locale = 'en'}) {
return ChangeNotifierProvider<RoutinesProvider>(
create: (context) => RoutinesProvider(
mockBaseProvider,
mockExerciseProvider,
[workoutPlan],
[testRoutine],
repetitionUnits: testRepetitionUnits,
weightUnits: testWeightUnits,
),
child: ChangeNotifierProvider<ExercisesProvider>(
create: (context) => mockExerciseProvider,
@@ -62,7 +64,7 @@ void main() {
home: TextButton(
onPressed: () => key.currentState!.push(
MaterialPageRoute<void>(
settings: RouteSettings(arguments: workoutPlan.days.first),
settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)),
builder: (_) => const GymModeScreen(),
),
),
@@ -75,10 +77,10 @@ void main() {
}
testWidgets('Test the widgets on the gym mode screen', (WidgetTester tester) async {
when(mockExerciseProvider.findExerciseById(1)).thenReturn(bases[0]);
when(mockExerciseProvider.findExerciseById(6)).thenReturn(bases[5]);
when(mockExerciseProvider.findExerciseById(1)).thenReturn(testExercises[0]);
when(mockExerciseProvider.findExerciseById(6)).thenReturn(testExercises[5]);
await tester.pumpWidget(createHomeScreen());
await tester.pumpWidget(renderGymMode());
await tester.tap(find.byType(TextButton));
await tester.pumpAndSettle();
@@ -174,6 +176,7 @@ void main() {
//
// Side raises - exercise overview page
//
debugDumpApp();
expect(find.text('Side raises'), findsOneWidget);
expect(find.byType(ExerciseOverview), findsOneWidget);
await tester.tap(find.byIcon(Icons.chevron_right));

View File

@@ -24,7 +24,7 @@ import '../../test_data/routines.dart';
void main() {
group('model tests', () {
test('Test the filterLogsByExercise method', () {
final workout = getRoutine();
final workout = getTestRoutine();
expect(workout.logs.length, 3);
final logExercise1 = workout.filterLogsByExercise(getTestExercises()[0]);

View File

@@ -52,7 +52,7 @@ void main() {
home: TextButton(
onPressed: () => key.currentState!.push(
MaterialPageRoute<void>(
settings: RouteSettings(arguments: getRoutine()),
settings: RouteSettings(arguments: getTestRoutine()),
builder: (_) => const RoutineScreen(),
),
),

View File

@@ -59,6 +59,7 @@ final benchPress = Exercise(
equipment: const [tEquipment1, tEquipment2],
muscles: const [tMuscle1, tMuscle2],
musclesSecondary: const [tMuscle3],
translations: [benchPressEn, benchPressDe],
);
final crunches = Exercise(
@@ -70,6 +71,7 @@ final crunches = Exercise(
equipment: const [tEquipment2],
muscles: const [tMuscle1],
musclesSecondary: const [tMuscle2],
translations: [crunchesEn, crunchesDe, crunchesFr],
);
final deadLift = Exercise(
@@ -81,6 +83,7 @@ final deadLift = Exercise(
equipment: const [tEquipment2],
muscles: const [tMuscle1],
musclesSecondary: const [tMuscle2],
translations: [deadLiftEn],
);
final curls = Exercise(
@@ -92,7 +95,9 @@ final curls = Exercise(
equipment: const [tEquipment2],
muscles: const [tMuscle1],
musclesSecondary: const [tMuscle2],
translations: [curlsEn],
);
final squats = Exercise(
id: 5,
uuid: '361f024c-fdf8-4146-b7d7-0c1b67c58141',
@@ -102,7 +107,9 @@ final squats = Exercise(
equipment: const [tEquipment2],
muscles: const [tMuscle1],
musclesSecondary: const [tMuscle2],
translations: [squatsEn],
);
final sideRaises = Exercise(
id: 6,
uuid: '721ff972-c568-41e3-8cf5-cf1e5c5c801c',
@@ -112,6 +119,7 @@ final sideRaises = Exercise(
equipment: const [tEquipment2],
muscles: const [tMuscle1],
musclesSecondary: const [tMuscle2],
translations: [sideRaisesEn],
);
final benchPressDe = Translation(
@@ -120,16 +128,17 @@ final benchPressDe = Translation(
created: DateTime(2021, 1, 15),
name: 'Bankdrücken',
description: 'add clever text',
exerciseId: benchPress.id,
exerciseId: 1,
language: tLanguage1,
);
final benchPressEn = Translation(
id: 7,
uuid: 'f4cc326b-e497-4bd7-a71d-0eb1db522743',
created: DateTime(2021, 1, 15),
name: 'Bench press',
description: 'add clever text',
exerciseId: benchPress.id,
exerciseId: 1,
language: tLanguage1,
);
@@ -139,7 +148,7 @@ final deadLiftEn = Translation(
created: DateTime(2021, 1, 15),
name: 'Dead Lift',
description: 'Lorem ipsum etc',
exerciseId: crunches.id,
exerciseId: 3,
language: tLanguage2,
);
@@ -149,7 +158,7 @@ final crunchesFr = Translation(
created: DateTime(2021, 4, 1),
name: 'Crunches',
description: 'The man in black fled across the desert, and the gunslinger followed',
exerciseId: deadLift.id,
exerciseId: 2,
language: tLanguage3,
);
@@ -159,7 +168,7 @@ final crunchesDe = Translation(
created: DateTime(2021, 4, 1),
name: 'Crunches',
description: 'The story so far: in the beginning, the universe was created',
exerciseId: deadLift.id,
exerciseId: 2,
language: tLanguage1,
);
@@ -169,7 +178,7 @@ final crunchesEn = Translation(
created: DateTime(2021, 4, 1),
name: 'test exercise 5',
description: 'I am an invisible man',
exerciseId: deadLift.id,
exerciseId: 2,
language: tLanguage2,
);
@@ -179,7 +188,7 @@ final curlsEn = Translation(
created: DateTime(2021, 4, 1),
name: 'Curls',
description: 'It was a bright cold day in April, and the clocks were striking thirteen',
exerciseId: curls.id,
exerciseId: 4,
language: tLanguage2,
);
@@ -189,7 +198,7 @@ final squatsEn = Translation(
created: DateTime(2021, 4, 1),
name: 'Squats',
description: 'It was a bright cold day in April, and the clocks were striking thirteen',
exerciseId: curls.id,
exerciseId: 5,
language: tLanguage2,
);
@@ -199,18 +208,11 @@ final sideRaisesEn = Translation(
created: DateTime(2022, 11, 1),
name: 'Side raises',
description: 'It was a bright cold day in April, and the clocks were striking thirteen',
exerciseId: curls.id,
exerciseId: 6,
language: tLanguage2,
);
List<Exercise> getTestExercises() {
benchPress.translations = [benchPressEn, benchPressDe];
crunches.translations = [crunchesEn, crunchesDe, crunchesFr];
deadLift.translations = [deadLiftEn];
curls.translations = [curlsEn];
squats.translations = [squatsEn];
sideRaises.translations = [sideRaisesEn];
return [benchPress, crunches, deadLift, curls, squats, sideRaises];
}

View File

@@ -23,6 +23,7 @@ import 'package:wger/models/workouts/day_data.dart';
import 'package:wger/models/workouts/log.dart';
import 'package:wger/models/workouts/repetition_unit.dart';
import 'package:wger/models/workouts/routine.dart';
import 'package:wger/models/workouts/set_config_data.dart';
import 'package:wger/models/workouts/slot.dart';
import 'package:wger/models/workouts/slot_data.dart';
import 'package:wger/models/workouts/slot_entry.dart';
@@ -32,12 +33,14 @@ import './exercises.dart';
const testWeightUnit1 = WeightUnit(id: 1, name: 'kg');
const testWeightUnit2 = WeightUnit(id: 2, name: 'metric tonnes');
const testWeightUnits = [testWeightUnit1, testWeightUnit2];
const RepetitionUnit testRepetitionUnit1 = RepetitionUnit(id: 1, name: 'Repetitions');
const RepetitionUnit testRepetitionUnit2 = RepetitionUnit(id: 2, name: 'Hours');
const testRepetitionUnits = [testRepetitionUnit1, testRepetitionUnit2];
Routine getRoutine({List<Exercise>? exercises}) {
final testExercise = exercises ?? getTestExercises();
Routine getTestRoutine({List<Exercise>? exercises}) {
final testExercises = exercises ?? getTestExercises();
final log1 = Log.empty()
..id = 1
@@ -46,7 +49,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
..date = DateTime(2021, 5, 1)
..reps = 10
..routineId = 1;
log1.exerciseBase = testExercise[0];
log1.exerciseBase = testExercises[0];
log1.weightUnit = testWeightUnit1;
log1.repetitionUnit = testRepetitionUnit1;
@@ -57,7 +60,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
..date = DateTime(2021, 5, 1)
..reps = 12
..routineId = 1;
log2.exerciseBase = testExercise[0];
log2.exerciseBase = testExercises[0];
log2.weightUnit = testWeightUnit1;
log2.repetitionUnit = testRepetitionUnit1;
@@ -68,7 +71,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
..date = DateTime(2021, 5, 2)
..reps = 8
..routineId = 1;
log3.exerciseBase = testExercise[1];
log3.exerciseBase = testExercises[1];
log3.weightUnit = testWeightUnit1;
log3.repetitionUnit = testRepetitionUnit1;
@@ -84,7 +87,13 @@ Routine getRoutine({List<Exercise>? exercises}) {
comment: 'ddd',
repetitionUnit: testRepetitionUnit1,
weightUnit: testWeightUnit1,
exercise: testExercise[0],
exercise: testExercises[0],
nrOfSetsConfigs: [
BaseConfig.firstIteration(4, 1),
],
repsConfigs: [
BaseConfig.firstIteration(3, 1),
],
weightConfigs: [
BaseConfig.firstIteration(100, 1),
BaseConfig(
@@ -99,12 +108,6 @@ Routine getRoutine({List<Exercise>? exercises}) {
repeat: true,
),
],
repsConfigs: [
BaseConfig.firstIteration(3, 1),
],
nrOfSetsConfigs: [
BaseConfig.firstIteration(4, 1),
],
);
final slotBenchPress = Slot.withData(
@@ -113,7 +116,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
order: 1,
comment: 'Make sure to warm up',
);
slotBenchPress.addExerciseBase(testExercise[0]);
slotBenchPress.addExerciseBase(testExercises[0]);
slotBenchPress.entries.add(slotEntryBenchPress);
final slotEntrySquat = SlotEntry(
@@ -128,7 +131,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
comment: 'ddd',
repetitionUnit: testRepetitionUnit1,
weightUnit: testWeightUnit1,
exercise: testExercise[4],
exercise: testExercises[4],
weightConfigs: [
BaseConfig.firstIteration(80, 1),
],
@@ -141,7 +144,7 @@ Routine getRoutine({List<Exercise>? exercises}) {
);
final slotSquat = Slot.withData(id: 2, day: 1, order: 1);
slotSquat.addExerciseBase(testExercise[4]);
slotSquat.addExerciseBase(testExercises[4]);
slotSquat.entries.add(slotEntrySquat);
final slotEntrySideRaises = SlotEntry(
@@ -156,21 +159,21 @@ Routine getRoutine({List<Exercise>? exercises}) {
comment: 'ddd',
repetitionUnit: testRepetitionUnit1,
weightUnit: testWeightUnit1,
exercise: testExercise[5],
weightConfigs: [
BaseConfig.firstIteration(10, 1),
exercise: testExercises[5],
nrOfSetsConfigs: [
BaseConfig.firstIteration(4, 1),
],
repsConfigs: [
BaseConfig.firstIteration(12, 1),
],
nrOfSetsConfigs: [
BaseConfig.firstIteration(4, 1),
weightConfigs: [
BaseConfig.firstIteration(10, 1),
],
);
// settingSideRaises.weight = 6;
final slotSideRaises = Slot.withData(id: 3, day: 1, order: 1);
slotSideRaises.addExerciseBase(testExercise[5]);
slotSideRaises.addExerciseBase(testExercises[5]);
slotSideRaises.entries.add(slotEntrySideRaises);
final dayChestShoulders = Day(
@@ -189,63 +192,309 @@ Routine getRoutine({List<Exercise>? exercises}) {
slots: [slotSquat],
);
final List<DayData> dayDataDisplay = [
DayData(
iteration: 1,
date: DateTime(2024, 11, 01),
label: '',
day: dayChestShoulders,
slots: [
SlotData(
comment: 'Bench press',
isSuperset: false,
exerciseIds: [1],
setConfigs: [
SetConfigData(
exerciseId: 1,
exercise: testExercises[0],
slotEntryId: 1,
nrOfSets: 4,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '4 sets 3x100kg',
),
],
),
SlotData(
comment: 'Side rises',
isSuperset: false,
exerciseIds: [6],
setConfigs: [
SetConfigData(
exerciseId: 6,
exercise: testExercises[5],
slotEntryId: 1,
nrOfSets: 4,
reps: 12,
repsUnit: testRepetitionUnit1,
weight: 10,
weightUnit: testWeightUnit1,
restTime: 60,
rir: '',
rpe: '',
textRepr: '4 sets 12x10kg',
),
],
)
],
),
DayData(
iteration: 1,
date: DateTime(2024, 11, 02),
label: '',
day: dayLegs,
slots: [
SlotData(
comment: 'Squats',
isSuperset: false,
exerciseIds: [8],
setConfigs: [
SetConfigData(
exerciseId: 8,
exercise: testExercises[4],
slotEntryId: 1,
nrOfSets: 4,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '4 sets 3x100kg',
),
],
)
],
),
DayData(
iteration: 1,
date: DateTime(2024, 11, 02),
label: 'null day (filled because of fitInWeek flag)',
day: null,
slots: [],
),
DayData(
iteration: 1,
date: DateTime(2024, 11, 02),
label: 'null day (filled because of fitInWeek flag)',
day: null,
slots: [],
),
];
final routine = Routine(
id: 1,
created: DateTime(2021, 01, 01),
name: '3 day workout',
start: DateTime(2024, 11, 01),
end: DateTime(2024, 12, 01),
days: [
dayChestShoulders,
dayLegs
],
logs: [
log1,
log2,
log3
],
dayDataCurrentIteration: [
DayData(
iteration: 1,
date: DateTime(2024, 11, 01),
label: '',
day: dayChestShoulders,
slots: [
SlotData(
comment: 'foo',
isSuperset: false,
exerciseIds: [1],
setConfigs: [
// SetConfigData(
// reps: 10,
// weight: 10,
// rir: '1.5',
// ),
],
)
],
),
DayData(
iteration: 1,
date: DateTime(2024, 11, 02),
label: '',
day: dayLegs,
slots: [
SlotData(
comment: 'foo',
isSuperset: false,
exerciseIds: [8],
setConfigs: [
// SetConfigData(
// reps: 8,
// weight: 50,
// rir: '',
// ),
],
)
],
),
]);
id: 1,
created: DateTime(2021, 01, 01),
name: '3 day workout',
start: DateTime(2024, 11, 01),
end: DateTime(2024, 12, 01),
days: [dayChestShoulders, dayLegs],
logs: [log1, log2, log3],
dayData: dayDataDisplay,
dayDataCurrentIteration: [
...dayDataDisplay,
DayData(
iteration: 2,
date: DateTime(2024, 11, 02),
label: '',
day: dayLegs,
slots: [
SlotData(
comment: 'Squats',
isSuperset: false,
exerciseIds: [8],
setConfigs: [
SetConfigData(
exerciseId: 8,
exercise: testExercises[4],
slotEntryId: 1,
nrOfSets: 5,
reps: 8,
repsUnit: testRepetitionUnit1,
weight: 105,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1',
rpe: '9',
textRepr: '5 sets 8x105kg',
),
],
)
],
),
],
dayDataGym: [
DayData(
iteration: 1,
date: DateTime(2024, 11, 01),
label: '',
day: dayChestShoulders,
slots: [
SlotData(
comment: 'Make sure to warm up',
isSuperset: false,
exerciseIds: [testExercises[0].id!],
setConfigs: [
SetConfigData(
exerciseId: 1,
exercise: testExercises[0],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
SetConfigData(
exerciseId: testExercises[0].id!,
exercise: testExercises[0],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
SetConfigData(
exerciseId: testExercises[0].id!,
exercise: testExercises[0],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
],
),
SlotData(
comment: 'Side rises',
isSuperset: false,
exerciseIds: [testExercises[5].id!],
setConfigs: [
SetConfigData(
exerciseId: testExercises[5].id!,
exercise: testExercises[5],
slotEntryId: 1,
nrOfSets: 1,
reps: 12,
repsUnit: testRepetitionUnit1,
weight: 10,
weightUnit: testWeightUnit1,
restTime: 60,
rir: '',
rpe: '',
textRepr: '12x10kg',
),
SetConfigData(
exerciseId: testExercises[5].id!,
exercise: testExercises[5],
slotEntryId: 1,
nrOfSets: 1,
reps: 12,
repsUnit: testRepetitionUnit1,
weight: 10,
weightUnit: testWeightUnit1,
restTime: 60,
rir: '',
rpe: '',
textRepr: '12x10kg',
),
SetConfigData(
exerciseId: testExercises[5].id!,
exercise: testExercises[5],
slotEntryId: 1,
nrOfSets: 1,
reps: 12,
repsUnit: testRepetitionUnit1,
weight: 10,
weightUnit: testWeightUnit1,
restTime: 60,
rir: '',
rpe: '',
textRepr: '12x10kg',
),
],
)
],
),
DayData(
iteration: 1,
date: DateTime(2024, 11, 02),
label: '',
day: dayLegs,
slots: [
SlotData(
comment: 'Squats',
isSuperset: false,
exerciseIds: [testExercises[4].id!],
setConfigs: [
SetConfigData(
exerciseId: 8,
exercise: testExercises[4],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
SetConfigData(
exerciseId: testExercises[4].id!,
exercise: testExercises[4],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
SetConfigData(
exerciseId: testExercises[4].id!,
exercise: testExercises[4],
slotEntryId: 1,
nrOfSets: 1,
reps: 3,
repsUnit: testRepetitionUnit1,
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
textRepr: '3x100kg',
),
],
)
],
),
],
);
return routine;
}