import 'package:diameter/components/detail.dart'; import 'package:diameter/components/dialogs.dart'; import 'package:diameter/components/forms.dart'; import 'package:diameter/config.dart'; // import 'package:diameter/main.dart'; import 'package:diameter/models/accuracy.dart'; import 'package:diameter/models/meal_category.dart'; import 'package:diameter/models/meal_portion_type.dart'; import 'package:diameter/models/meal_source.dart'; import 'package:diameter/navigation.dart'; // import 'package:diameter/objectbox.g.dart'; import 'package:flutter/material.dart'; class MealSourceDetailScreen extends StatefulWidget { static const String routeName = '/meal-source'; final MealSource? mealSource; const MealSourceDetailScreen({Key? key, this.mealSource}) : super(key: key); @override _MealSourceDetailScreenState createState() => _MealSourceDetailScreenState(); } class _MealSourceDetailScreenState extends State { List _portionSizeAccuracies = []; List _carbsRatioAccuracies = []; List _mealCategories = []; List _mealPortionTypes = []; final GlobalKey _mealSourceForm = GlobalKey(); final _valueController = TextEditingController(text: ''); final _notesController = TextEditingController(text: ''); Accuracy? _defaultCarbsRatioAccuracy; Accuracy? _defaultPortionSizeAccuracy; MealCategory? _defaultMealCategory; MealPortionType? _defaultMealPortionType; @override void initState() { super.initState(); _portionSizeAccuracies = Accuracy.getAllForPortionSize(); _carbsRatioAccuracies = Accuracy.getAllForCarbsRatio(); _mealCategories = MealCategory.getAll(); _mealPortionTypes = MealPortionType.getAll(); if (widget.mealSource != null) { _valueController.text = widget.mealSource!.value; _notesController.text = widget.mealSource!.notes ?? ''; _defaultPortionSizeAccuracy = widget.mealSource!.defaultPortionSizeAccuracy.target; _defaultCarbsRatioAccuracy = widget.mealSource!.defaultCarbsRatioAccuracy.target; _defaultMealCategory = widget.mealSource!.defaultMealCategory.target; _defaultMealPortionType = widget.mealSource!.defaultMealPortionType.target; } } void handleSaveAction() async { bool isNew = widget.mealSource == null; if (_mealSourceForm.currentState!.validate()) { // isNew // ? await MealSource.save( // value: _valueController.text, // defaultCarbsRatioAccuracy: _defaultCarbsRatioAccuracy?.id.toString(), // defaultPortionSizeAccuracy: _defaultPortionSizeAccuracy?.id.toString(), // // defaultCarbsRatioAccuracy: _defaultCarbsRatioAccuracy, // // defaultPortionSizeAccuracy: _defaultPortionSizeAccuracy, // defaultMealCategory: _defaultMealCategory, // defaultMealPortionType: _defaultMealPortionType, // notes: _notesController.text, // ) // : await MealSource.update( // widget.mealSource!.objectId!, // value: _valueController.text, // defaultCarbsRatioAccuracy: _defaultCarbsRatioAccuracy?.id.toString(), // defaultPortionSizeAccuracy: _defaultPortionSizeAccuracy?.id.toString(), // // defaultCarbsRatioAccuracy: _defaultCarbsRatioAccuracy, // // defaultPortionSizeAccuracy: _defaultPortionSizeAccuracy, // defaultMealCategory: _defaultMealCategory, // defaultMealPortionType: _defaultMealPortionType, // notes: _notesController.text, // ); MealSource mealSource = MealSource( id: widget.mealSource?.id ?? 0, value: _valueController.text, notes: _notesController.text, ); mealSource.defaultCarbsRatioAccuracy.target = _defaultCarbsRatioAccuracy; mealSource.defaultPortionSizeAccuracy.target = _defaultPortionSizeAccuracy; mealSource.defaultMealCategory.target = _defaultMealCategory; mealSource.defaultMealPortionType.target = _defaultMealPortionType; MealSource.put(mealSource); Navigator.pop(context, '${isNew ? 'New' : ''} Meal Source saved'); } } void handleCancelAction() { bool isNew = widget.mealSource == null; if (showConfirmationDialogOnCancel && ((isNew && (_valueController.text != '' || _defaultCarbsRatioAccuracy != null || _defaultPortionSizeAccuracy != null || _defaultMealCategory != null || _defaultMealPortionType != null || _notesController.text != '')) || (!isNew && (_valueController.text != widget.mealSource!.value || _defaultCarbsRatioAccuracy != widget.mealSource!.defaultCarbsRatioAccuracy.target || _defaultPortionSizeAccuracy != widget.mealSource!.defaultPortionSizeAccuracy.target || _defaultMealCategory != widget.mealSource!.defaultMealCategory.target || _defaultMealPortionType != widget.mealSource!.defaultMealPortionType.target || _notesController.text != (widget.mealSource!.notes ?? ''))))) { Dialogs.showCancelConfirmationDialog( context: context, isNew: isNew, onSave: handleSaveAction, ); } else { Navigator.pop(context); } } @override Widget build(BuildContext context) { bool isNew = widget.mealSource == null; return Scaffold( appBar: AppBar( title: Text(isNew ? 'New Meal Source' : widget.mealSource!.value), ), drawer: const Navigation(currentLocation: MealSourceDetailScreen.routeName), body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ StyledForm( formState: _mealSourceForm, fields: [ TextFormField( controller: _valueController, decoration: const InputDecoration( labelText: 'Name', ), validator: (value) { if (value!.trim().isEmpty) { return 'Empty name'; } return null; }, ), StyledDropdownButton( selectedItem: _defaultCarbsRatioAccuracy, label: 'Default Carbs Ratio Accuracy', items: _carbsRatioAccuracies, renderItem: (item) => Text(item.value), onChanged: (value) { setState(() { _defaultCarbsRatioAccuracy = value; }); }, ), StyledDropdownButton( selectedItem: _defaultPortionSizeAccuracy, label: 'Default Portion Size Accuracy', items: _portionSizeAccuracies, renderItem: (item) => Text(item.value), onChanged: (value) { setState(() { _defaultPortionSizeAccuracy = value; }); }, ), // StyledFutureDropdownButton( // selectedItem: _defaultCarbsRatioAccuracy, // label: 'Default Carbs Ratio Accuracy', // items: _carbsRatioAccuracies, // getItemValue: (item) => item.objectId, // renderItem: (item) => Text(item.value), // onChanged: (value) { // setState(() { // _defaultCarbsRatioAccuracy = value; // }); // }, // ), // StyledFutureDropdownButton( // selectedItem: _defaultPortionSizeAccuracy, // label: 'Default Portion Size Accuracy', // items: _portionSizeAccuracies, // getItemValue: (item) => item.objectId, // renderItem: (item) => Text(item.value), // onChanged: (value) { // setState(() { // _defaultPortionSizeAccuracy = value; // }); // }, // ), StyledDropdownButton( selectedItem: _defaultMealCategory, label: 'Default Meal Category', items: _mealCategories, // getItemValue: (item) => item.objectId, renderItem: (item) => Text(item.value), onChanged: (value) { setState(() { _defaultMealCategory = value; }); }, ), StyledDropdownButton( selectedItem: _defaultMealPortionType, label: 'Default Meal Portion Type', items: _mealPortionTypes, // getItemValue: (item) => item.objectId, renderItem: (item) => Text(item.value), onChanged: (value) { setState(() { _defaultMealPortionType = value; }); }, ), TextFormField( controller: _notesController, decoration: const InputDecoration( labelText: 'Notes', alignLabelWithHint: true, ), keyboardType: TextInputType.multiline, ) ], ), ], ), ), bottomNavigationBar: DetailBottomRow( onCancel: handleCancelAction, onSave: handleSaveAction, ), ); } }