diff --git a/lib/providers/add_excercise_provider.dart b/lib/providers/add_excercise_provider.dart index 0a2dc3ca4..60afb9824 100644 --- a/lib/providers/add_excercise_provider.dart +++ b/lib/providers/add_excercise_provider.dart @@ -2,9 +2,31 @@ import 'package:flutter/foundation.dart'; import 'dart:io'; +import 'package:wger/models/exercises/muscle.dart'; + class AddExcerciseProvider with ChangeNotifier { List get excerciseImages => [..._excerciseImages]; final List _excerciseImages = []; + String? _name; + String? _alternativeName; + String? _targetArea; + List? _primaryMuscles = []; + List? _secondaryMuscles = []; + + set exerciseName(String name) => _name = name; + set alternateName(String? name) => _alternativeName = name; + set targetArea(String target) => _targetArea = target; + set primaryMuclses(List? muscles) { + if (muscles?.isNotEmpty ?? false) { + _primaryMuscles = muscles; + } + } + + set secondayMuclses(List? muscles) { + if (muscles?.isNotEmpty ?? false) { + _secondaryMuscles = muscles; + } + } void addExcerciseImages(List excercizes) { _excerciseImages.addAll(excercizes); @@ -16,4 +38,23 @@ class AddExcerciseProvider with ChangeNotifier { _excerciseImages.remove(file); notifyListeners(); } + + //Just to Debug Provider + printValues() { + print('Name ${_name}'); + print('alternate name : ${_alternativeName}'); + print('target area : ${_targetArea}'); + print('primary mucsles'); + if (_primaryMuscles != null) { + for (final a in _primaryMuscles!) { + print(a); + } + } + print('seconday mucsles'); + if (_secondaryMuscles != null) { + for (final a in _secondaryMuscles!) { + print(a); + } + } + } } diff --git a/lib/providers/exercises.dart b/lib/providers/exercises.dart index e88e364e0..cca18593a 100644 --- a/lib/providers/exercises.dart +++ b/lib/providers/exercises.dart @@ -91,6 +91,7 @@ class ExercisesProvider with ChangeNotifier { List get items => [..._exercises]; List get categories => [..._categories]; + List get muscles => [..._muscles]; // Initialize filters for exercises search in exercises list void _initFilters() { diff --git a/lib/screens/add_exercise_screen.dart b/lib/screens/add_exercise_screen.dart index aad49e275..b91f28ee4 100644 --- a/lib/screens/add_exercise_screen.dart +++ b/lib/screens/add_exercise_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:wger/providers/add_excercise_provider.dart'; +import 'package:wger/providers/exercises.dart'; import 'package:wger/widgets/add_exercise/add_exercise_dropdown_button.dart'; import 'package:wger/widgets/add_exercise/add_exercise_multiselect_button.dart'; import 'package:wger/widgets/add_exercise/add_exercise_text_area.dart'; @@ -19,10 +20,19 @@ class AddExerciseScreen extends StatefulWidget { _AddExerciseScreenState createState() => _AddExerciseScreenState(); } +abstract class ValidateStep { + abstract VoidCallback _submit; +} + class _AddExerciseScreenState extends State { int _currentStep = 0; int lastStepIndex = AddExerciseScreen.STEPS_IN_FORM - 1; - + final List> _keys = [ + GlobalKey(), + GlobalKey(), + GlobalKey(), + GlobalKey() + ]; Widget _controlsBuilder( BuildContext context, { VoidCallback? onStepCancel, @@ -55,7 +65,9 @@ class _AddExerciseScreenState extends State { steps: [ Step( title: const Text('Basics'), - content: _BasicStepContent(), + content: _BasicStepContent( + formkey: _keys[0], + ), ), Step( title: const Text('Duplicates and variations'), @@ -75,9 +87,13 @@ class _AddExerciseScreenState extends State { if (_currentStep == lastStepIndex) { _addExercise(); } else { - setState(() { - _currentStep += 1; - }); + if (_keys[_currentStep].currentState?.validate() ?? false) { + _keys[_currentStep].currentState?.save(); + context.read().printValues(); + setState(() { + _currentStep += 1; + }); + } } }, onStepCancel: () => setState(() { @@ -89,38 +105,51 @@ class _AddExerciseScreenState extends State { } class _BasicStepContent extends StatelessWidget { - final GlobalKey _basicStepFormKey = GlobalKey(); + // final GlobalKey _basicStepFormKey = GlobalKey(); + final GlobalKey formkey; + _BasicStepContent({required this.formkey}); @override Widget build(BuildContext context) { + final addExercideProvider = context.read(); + final exerciseProvider = context.read(); + final categories = exerciseProvider.categories; + final muscles = exerciseProvider.muscles; return Form( - key: _basicStepFormKey, + key: formkey, child: Column( children: [ AddExerciseTextArea( onChange: (value) => print(value), - title: AppLocalizations.of(context).name, + title: '${AppLocalizations.of(context).name}*', isRequired: true, + validator: (name) => name?.isEmpty ?? true ? 'Name is required' : null, + onSaved: (String? name) => addExercideProvider.exerciseName = name!, ), AddExerciseTextArea( onChange: (value) => print(value), title: 'Alternative names', isMultiline: true, helperText: 'One name per line', + onSaved: (String? alternateName) => addExercideProvider.alternateName = alternateName, ), AddExerciseDropdownButton( - title: 'Target area', - items: ['Arms'], + title: 'Target area*', + items: categories.map((e) => e.name).toList(), onChange: (value) => print(value), + validator: (value) => value?.isEmpty ?? true ? 'Target Area is Required ' : null, + onSaved: (String? targetArea) => addExercideProvider.targetArea = targetArea!, ), AddExerciseMultiselectButton( title: AppLocalizations.of(context).muscles, - items: ['Arms', 'Chest', 'Shoulders'], + items: muscles.map((e) => e.name).toList(), onChange: (value) => print(value), + onSaved: (List? muscles) => addExercideProvider.primaryMuclses = muscles, ), AddExerciseMultiselectButton( title: AppLocalizations.of(context).musclesSecondary, - items: ['Arms', 'Chest', 'Shoulders'], + items: muscles.map((e) => e.name).toList(), onChange: (value) => print(value), + onSaved: (List? muscles) => addExercideProvider.secondayMuclses = muscles, ), ], ), diff --git a/lib/widgets/add_exercise/add_exercise_dropdown_button.dart b/lib/widgets/add_exercise/add_exercise_dropdown_button.dart index 8465f729a..2a7586a7e 100644 --- a/lib/widgets/add_exercise/add_exercise_dropdown_button.dart +++ b/lib/widgets/add_exercise/add_exercise_dropdown_button.dart @@ -7,11 +7,15 @@ class AddExerciseDropdownButton extends StatefulWidget { required this.items, required this.title, required this.onChange, + this.validator, + this.onSaved, }) : super(key: key); final List items; final String title; final ValueChanged onChange; + final FormFieldValidator? validator; + final FormFieldSetter? onSaved; @override _AddExerciseDropdownButtonState createState() => _AddExerciseDropdownButtonState(); @@ -25,7 +29,9 @@ class _AddExerciseDropdownButtonState extends State { return Padding( padding: const EdgeInsets.all(8.0), child: DropdownButtonFormField( + validator: widget.validator, isExpanded: true, + onSaved: widget.onSaved, onChanged: (value) { setState(() { _selectedItem = value; diff --git a/lib/widgets/add_exercise/add_exercise_multiselect_button.dart b/lib/widgets/add_exercise/add_exercise_multiselect_button.dart index 726035011..09b338ad9 100644 --- a/lib/widgets/add_exercise/add_exercise_multiselect_button.dart +++ b/lib/widgets/add_exercise/add_exercise_multiselect_button.dart @@ -8,11 +8,13 @@ class AddExerciseMultiselectButton extends StatefulWidget { required this.items, required this.title, required this.onChange, + this.onSaved, }) : super(key: key); final List items; final String title; final ValueChanged> onChange; + final FormFieldSetter?>? onSaved; @override _AddExerciseMultiselectButtonState createState() => _AddExerciseMultiselectButtonState(); @@ -25,6 +27,7 @@ class _AddExerciseMultiselectButtonState extends State( + onSaved: widget.onSaved, items: widget.items.map((item) => MultiSelectItem(item, item)).toList(), onConfirm: (value) { setState(() { diff --git a/lib/widgets/add_exercise/add_exercise_text_area.dart b/lib/widgets/add_exercise/add_exercise_text_area.dart index 3a960f9af..f351bc322 100644 --- a/lib/widgets/add_exercise/add_exercise_text_area.dart +++ b/lib/widgets/add_exercise/add_exercise_text_area.dart @@ -8,6 +8,8 @@ class AddExerciseTextArea extends StatelessWidget { this.helperText = '', this.isRequired = true, this.isMultiline = false, + this.validator, + this.onSaved, }) : super(key: key); final ValueChanged onChange; @@ -15,6 +17,8 @@ class AddExerciseTextArea extends StatelessWidget { final bool isMultiline; final String title; final String helperText; + final FormFieldValidator? validator; + final FormFieldSetter? onSaved; static const MULTILINE_MIN_LINES = 4; static const DEFAULT_LINES = 1; @@ -27,6 +31,8 @@ class AddExerciseTextArea extends StatelessWidget { keyboardType: isMultiline ? TextInputType.multiline : TextInputType.text, maxLines: isMultiline ? null : DEFAULT_LINES, minLines: isMultiline ? MULTILINE_MIN_LINES : DEFAULT_LINES, + validator: validator, + onSaved: onSaved, decoration: InputDecoration( contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), border: OutlineInputBorder(