Skip to content

Commit

Permalink
#73 - feat(training plan): create dropdown for training plan selection
Browse files Browse the repository at this point in the history
  • Loading branch information
sdresselmann committed May 4, 2024
1 parent 6bee1b0 commit d5b39ca
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 62 deletions.
4 changes: 4 additions & 0 deletions lib/core/utils/service_locators.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ import 'package:get_it/get_it.dart';
import 'package:lifting_progress_tracker/core/services/user_service.dart';
import 'package:lifting_progress_tracker/firebase/services/firebase_service.dart';
import 'package:lifting_progress_tracker/firebase/services/firestore_service.dart';
import 'package:lifting_progress_tracker/training_plan/training_plan_service.ts.dart';

void registerLazySingletons() {
GetIt.I.registerLazySingleton<FirebaseService>(() => FirebaseService());
GetIt.I.registerLazySingleton<FirestoreService>(() => FirestoreService());

GetIt.I.registerLazySingleton(() => UserService());

GetIt.I
.registerLazySingleton<TrainingPlanService>(() => TrainingPlanService());
}
3 changes: 3 additions & 0 deletions lib/training_plan/default_training_plan_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,19 @@ const Map<String, dynamic> defaultTrainingPlan = {
'exerciseName': 'Deadlift',
'weight': '20kg',
'repeats': '5x6',
'comment': "More Weight next time",
},
'1': {
'exerciseName': 'Benchpress',
'weight': '12.5kg',
'repeats': '5x10',
'comment': "More Weight next time, slow down execution ....",
},
'2': {
'exerciseName': 'Squats',
'weight': '10kg',
'repeats': '3x15',
'comment': "",
},
},
'trainingplan2': {},
Expand Down
8 changes: 4 additions & 4 deletions lib/training_plan/models/training_plan_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ import 'package:lifting_progress_tracker/firebase/firestore_json.dart';
import 'package:lifting_progress_tracker/training_plan/models/training_plan.dart';

class TrainingPlanList implements JsonSerializable {
Map<String, TrainingPlan> trainingPlanList;
Map<String, TrainingPlan> trainingPlans;

TrainingPlanList(this.trainingPlanList);
TrainingPlanList(this.trainingPlans);

TrainingPlanList.fromJson(FirestoreJson json)
: trainingPlanList = json.map(
: trainingPlans = json.map(
(key, value) => MapEntry(
key,
TrainingPlan.fromJson(value as FirestoreJson),
Expand All @@ -18,7 +18,7 @@ class TrainingPlanList implements JsonSerializable {
@override
FirestoreJson toJson() {
return {
"trainingPlanList": trainingPlanList,
"trainingPlanList": trainingPlans,
};
}
}
69 changes: 69 additions & 0 deletions lib/training_plan/widgets/selected_training_plan.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:lifting_progress_tracker/core/constants/localization.dart';
import 'package:lifting_progress_tracker/training_plan/widgets/table_header.dart';

class SelectedTrainingPlan extends StatefulWidget {
@override
State<StatefulWidget> createState() => _SelectedTrainingPlanState();
}

class _SelectedTrainingPlanState extends State<SelectedTrainingPlan> {
@override
Widget build(BuildContext context) {
return Column(
children: [
Table(
border: TableBorder.all(),
children: [
TableRow(
children: [
for (final label in tableHeaderLabels)
TableHeader(headerText: label),
],
),
const TableRow(
children: [
Text("Bench press"),
Text("20 KG"),
Text("3x15"),
Text("More Weight next time."),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
const TableRow(
children: [
Text("Deadlift"),
Text("30/40 KG"),
Text("3x15/3x5"),
Text("More Weight next time, slow down execution, ..."),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
const TableRow(
children: [
Text("Overhead Press"),
Text("10 KG"),
Text("3x5"),
Text(""),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
],
),
const IconButton(
onPressed: null,
icon: Icon(Icons.create),
),
],
);
}
}
115 changes: 57 additions & 58 deletions lib/training_plan/widgets/training_plan_table.dart
Original file line number Diff line number Diff line change
@@ -1,65 +1,64 @@
import 'package:flutter/material.dart';
import 'package:lifting_progress_tracker/core/constants/localization.dart';
import 'package:lifting_progress_tracker/training_plan/widgets/table_header.dart';
import 'package:get_it/get_it.dart';
import 'package:lifting_progress_tracker/core/services/user_service.dart';
import 'package:lifting_progress_tracker/core/widgets/error_message.dart';
import 'package:lifting_progress_tracker/firebase/constants/collection_names.dart';
import 'package:lifting_progress_tracker/training_plan/models/training_plan_list.dart';
import 'package:lifting_progress_tracker/training_plan/training_plan_service.ts.dart';
import 'package:lifting_progress_tracker/training_plan/widgets/traning_plan_selector.dart';
import 'package:logging/logging.dart';

class TrainingPlanTable extends StatefulWidget {
@override
State<StatefulWidget> createState() => _TrainingPlanTableState();
}

class _TrainingPlanTableState extends State<TrainingPlanTable> {
final TrainingPlanService _trainingPlanService =
GetIt.I.get<TrainingPlanService>();

final UserService _userService = GetIt.I.get<UserService>();

late final Future<TrainingPlanList> _trainingPlanList$;

final Logger _logger = Logger("_TrainingPlanTableState");

late String dropdownValue;

@override
void initState() {
super.initState();
_trainingPlanList$ = _trainingPlanService.get(
CollectionNames.planEntries,
_userService.user.uid,
);
}

List<String> _extractTrainingPlanNames(TrainingPlanList list) {
return list.trainingPlans.keys.toList();
}

class TrainingPlanTable extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
const Text("Training Plan 1"),
Table(
border: TableBorder.all(),
children: [
TableRow(
children: [
for (final label in tableHeaderLabels)
TableHeader(headerText: label),
],
),
const TableRow(
children: [
Text("Bench press"),
Text("20 KG"),
Text("3x15"),
Text("More Weight next time."),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
const TableRow(
children: [
Text("Deadlift"),
Text("30/40 KG"),
Text("3x15/3x5"),
Text("More Weight next time, slow down execution, ..."),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
const TableRow(
children: [
Text("Overhead Press"),
Text("10 KG"),
Text("3x5"),
Text(""),
IconButton(
onPressed: null,
icon: Icon(Icons.delete),
),
],
),
],
),
const IconButton(
onPressed: null,
icon: Icon(Icons.create),
),
],
return Center(
child: FutureBuilder(
future: _trainingPlanList$,
builder: (_, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
} else if (snapshot.connectionState == ConnectionState.done) {
return TrainingPlanSelector(
trainingPlanNames: _extractTrainingPlanNames(snapshot.data!),
);
} else if (snapshot.hasError) {
_logger.warning(
"The training plan list was not loaded properly: ${snapshot.error}",
);
}

return ErrorMessage();
},
),
);
}
}
52 changes: 52 additions & 0 deletions lib/training_plan/widgets/traning_plan_selector.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:lifting_progress_tracker/training_plan/widgets/selected_training_plan.dart';

class TrainingPlanSelector extends StatefulWidget {
final List<String> trainingPlanNames;

const TrainingPlanSelector({required this.trainingPlanNames});

@override
State<StatefulWidget> createState() => _TrainingPlanSelectorState();
}

class _TrainingPlanSelectorState extends State<TrainingPlanSelector> {
late String dropdownValue;

@override
void initState() {
super.initState();
dropdownValue = widget.trainingPlanNames.first;
}

@override
Widget build(BuildContext context) {
return Column(
children: [
DropdownButton<String>(
value: dropdownValue,
items: _mapNamesToDropdownMenuItems(widget.trainingPlanNames),
onChanged: (String? value) {
setState(() {
dropdownValue = value!;
});
},
),
SelectedTrainingPlan(),
],
);
}
}

List<DropdownMenuItem<String>> _mapNamesToDropdownMenuItems(
List<String> list,
) {
return list
.map<DropdownMenuItem<String>>(
(entry) => DropdownMenuItem(
value: entry,
child: Text(entry),
),
)
.toList();
}

0 comments on commit d5b39ca

Please sign in to comment.