From a6338ab6d64e137db302fb55f73e0153cada863c Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Thu, 31 Mar 2022 13:52:43 +0200 Subject: [PATCH] Some more polishing --- lib/l10n/app_en.arb | 1 + lib/providers/add_exercise_provider.dart | 10 +++--- lib/screens/add_exercise_screen.dart | 8 +++-- .../add_exercise_multiselect_button.dart | 4 +-- lib/widgets/add_exercise/steps/basics.dart | 14 ++++---- .../add_exercise/steps/translations.dart | 9 +++-- .../add_exercise/steps/variations.dart | 1 + lib/widgets/exercises/forms.dart | 35 +++++++++++-------- 8 files changed, 50 insertions(+), 32 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ef2677df..b9e7bfe0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -464,6 +464,7 @@ "@enterValue": { "description": "Error message when the user hasn't entered a value on a required field" }, + "selectEntry": "Please select an entry", "selectExercise": "Please select an exercise", "@selectExercise": { "description": "Error message when the user hasn't selected an exercise in the form" diff --git a/lib/providers/add_exercise_provider.dart b/lib/providers/add_exercise_provider.dart index 31dde368..6bc0f91b 100644 --- a/lib/providers/add_exercise_provider.dart +++ b/lib/providers/add_exercise_provider.dart @@ -27,10 +27,10 @@ class AddExerciseProvider with ChangeNotifier { String? _descriptionTranslation; int? _variationId; int? _newVariationForExercise; - late Language language; + Language? language; List _alternativeNamesEn = []; List _alternativeNamesTranslation = []; - late ExerciseCategory category; + ExerciseCategory? category; List _variations = []; List _equipment = []; List _primaryMuscles = []; @@ -44,6 +44,8 @@ class AddExerciseProvider with ChangeNotifier { void clear() { _exerciseImages = []; + language = null; + category = null; _nameEn = null; _nameTranslation = null; _descriptionEn = null; @@ -149,7 +151,7 @@ class AddExerciseProvider with ChangeNotifier { log(''); log('Language specific...'); - log('Language: ${language.shortName}'); + log('Language: ${language?.shortName}'); log('Name: en/$_nameEn translation/$_nameTranslation'); log('Description: en/$_descriptionEn translation/$_descriptionTranslation'); log('Alternate names: en/$_alternativeNamesEn translation/$_alternativeNamesTranslation'); @@ -177,7 +179,7 @@ class AddExerciseProvider with ChangeNotifier { } // Create the translations - if (_nameTranslation != null && _descriptionTranslation != null) { + if (language != null) { Exercise exerciseTranslationLang = exerciseTranslation; exerciseTranslationLang.base = base; exerciseTranslationLang = await addExerciseTranslation(exerciseTranslationLang); diff --git a/lib/screens/add_exercise_screen.dart b/lib/screens/add_exercise_screen.dart index 92edda29..56cafe32 100644 --- a/lib/screens/add_exercise_screen.dart +++ b/lib/screens/add_exercise_screen.dart @@ -121,11 +121,13 @@ class _AddExerciseScreenState extends State { _currentStep -= 1; } }), + /* onStepTapped: (int index) { - //setState(() { - // _currentStep = index; - //}); + setState(() { + _currentStep = index; + }); }, + */ ), ); } diff --git a/lib/widgets/add_exercise/add_exercise_multiselect_button.dart b/lib/widgets/add_exercise/add_exercise_multiselect_button.dart index 86078f49..9c86d925 100644 --- a/lib/widgets/add_exercise/add_exercise_multiselect_button.dart +++ b/lib/widgets/add_exercise/add_exercise_multiselect_button.dart @@ -3,12 +3,12 @@ import 'package:multi_select_flutter/multi_select_flutter.dart'; class AddExerciseMultiselectButton extends StatefulWidget { final List items; - List initialItems = []; + final List initialItems; final String title; final ValueChanged> onChange; final FormFieldSetter?>? onSaved; - AddExerciseMultiselectButton({ + const AddExerciseMultiselectButton({ Key? key, required this.items, required this.title, diff --git a/lib/widgets/add_exercise/steps/basics.dart b/lib/widgets/add_exercise/steps/basics.dart index 3c918c0f..122daf3d 100644 --- a/lib/widgets/add_exercise/steps/basics.dart +++ b/lib/widgets/add_exercise/steps/basics.dart @@ -23,11 +23,6 @@ class BasicStepContent extends StatelessWidget { final categories = exerciseProvider.categories; final muscles = exerciseProvider.muscles; final equipment = exerciseProvider.equipment; - final languages = exerciseProvider.languages; - - // Initialize some values - addExerciseProvider.category = categories.first; - addExerciseProvider.language = languages.first; return Form( key: formkey, @@ -50,11 +45,16 @@ class BasicStepContent extends StatelessWidget { addExerciseProvider.alternateNamesEn = alternateName!.split('\n'), ), ExerciseCategoryInputWidget( - categories: categories, - title: AppLocalizations.of(context).category, + entries: categories, + title: '${AppLocalizations.of(context).category}*', callback: (ExerciseCategory newValue) { addExerciseProvider.category = newValue; }, + validator: (ExerciseCategory? category) { + if (category == null) { + return AppLocalizations.of(context).selectEntry; + } + }, displayName: (ExerciseCategory c) => c.name, ), AddExerciseMultiselectButton( diff --git a/lib/widgets/add_exercise/steps/translations.dart b/lib/widgets/add_exercise/steps/translations.dart index 67751664..6a1eaf88 100644 --- a/lib/widgets/add_exercise/steps/translations.dart +++ b/lib/widgets/add_exercise/steps/translations.dart @@ -44,12 +44,17 @@ class _DescriptionTranslationStepContentState extends State( - categories: languages, - title: AppLocalizations.of(context).language, + entries: languages, + title: '${AppLocalizations.of(context).language}*', displayName: (Language l) => l.fullName, callback: (Language newValue) { addExerciseProvider.language = newValue; }, + validator: (Language? language) { + if (language == null) { + return AppLocalizations.of(context).selectEntry; + } + }, ), AddExerciseTextArea( onChange: (value) => {}, diff --git a/lib/widgets/add_exercise/steps/variations.dart b/lib/widgets/add_exercise/steps/variations.dart index b04f0143..05a56028 100644 --- a/lib/widgets/add_exercise/steps/variations.dart +++ b/lib/widgets/add_exercise/steps/variations.dart @@ -22,6 +22,7 @@ class DuplicatesAndVariationsStepContent extends StatelessWidget { AppLocalizations.of(context).whatVariationsExist, style: Theme.of(context).textTheme.caption, ), + const SizedBox(height: 10), SizedBox( height: 400, child: SingleChildScrollView( diff --git a/lib/widgets/exercises/forms.dart b/lib/widgets/exercises/forms.dart index a6ecea41..1a1d374d 100644 --- a/lib/widgets/exercises/forms.dart +++ b/lib/widgets/exercises/forms.dart @@ -24,19 +24,21 @@ import 'package:flutter/material.dart'; class ExerciseCategoryInputWidget extends StatefulWidget { late final String _title; late final Function _callback; - late final List _categories; + late final List _entries; late final Function _getDisplayName; + late final Function? _validator; - ExerciseCategoryInputWidget({ - required String title, - required List categories, - required Function callback, - required Function displayName, - }) { - _categories = categories; + ExerciseCategoryInputWidget( + {required String title, + required List entries, + required Function callback, + required Function displayName, + Function? validator}) { + _entries = entries; _title = title; _callback = callback; _getDisplayName = displayName; + _validator = validator; } @override @@ -46,27 +48,32 @@ class ExerciseCategoryInputWidget extends StatefulWidget { class _ExerciseCategoryInputWidgetState extends State { @override Widget build(BuildContext context) { - T selectedWeightUnit = widget._categories.first; + T? selectedEntry; return Padding( padding: const EdgeInsets.all(8.0), child: DropdownButtonFormField( - value: selectedWeightUnit, + value: selectedEntry, decoration: InputDecoration( labelText: widget._title, - contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + contentPadding: const EdgeInsets.all(8.0), border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10)), ), ), - isDense: true, onChanged: (T? newValue) { setState(() { - selectedWeightUnit = newValue!; + selectedEntry = newValue!; widget._callback(newValue); }); }, - items: widget._categories.map>((value) { + validator: (T? value) { + if (widget._validator != null) { + return widget._validator!(value); + } + return null; + }, + items: widget._entries.map>((value) { return DropdownMenuItem( key: Key(value.id.toString()), value: value,