import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:provider/provider.dart'; class AddWeightPage extends StatefulWidget { final WeightPressureViewModel model; final bool isUpdate; final DateTime dayWeightDate; final int lineItemNo; final String weightValue; final String measureTimeSelectedType; final int weightUnit; AddWeightPage( {Key key, this.model, this.isUpdate = false, this.dayWeightDate, this.lineItemNo, this.weightValue, this.measureTimeSelectedType, this.weightUnit}) : super(key: key); @override _AddWeightPageState createState() => _AddWeightPageState(); } class _AddWeightPageState extends State { TextEditingController _weightValueController = TextEditingController(); DateTime dayWeightDate = DateTime.now(); DateTime timeWeightDate = DateTime.now(); int weightUnit = 1; final List measureUnitEnList = [ 'Kg', 'Pound', ]; final List measureUnitArList = ["كيلو جرام", "باوند"]; String measureTimeSelectedType; bool isButtonDisabled = false; @override void initState() { super.initState(); if (widget.isUpdate) { dayWeightDate = widget.dayWeightDate; timeWeightDate = widget.dayWeightDate; measureTimeSelectedType = widget.measureTimeSelectedType; if (measureUnitEnList.contains(widget.measureTimeSelectedType)) weightUnit = measureUnitEnList.indexOf(widget.measureTimeSelectedType); else if (measureUnitArList.contains(widget.measureTimeSelectedType)) weightUnit = measureUnitArList.indexOf(widget.measureTimeSelectedType); _weightValueController.text = widget.weightValue; validateForm(); } } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( isShowAppBar: true, appBarTitle: widget.isUpdate ? TranslationBase.of(context).update : TranslationBase.of(context).add, appBarIcons: widget.isUpdate ? [ IconButton( icon: Icon(Icons.delete), color: Colors.white, onPressed: () { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: 'Remove this measure', okText: TranslationBase.of(context).ok, cancelText: TranslationBase.of(context).cancel, okFunction: () async { ConfirmDialog.closeAlertDialog(context); GifLoaderDialogUtils.showMyDialog(context); widget.model .deleteWeightResult(lineItemNo: widget.lineItemNo) .then((value) { GifLoaderDialogUtils.hideDialog(context); if (widget.model.state == ViewState.ErrorLocal) AppToast.showErrorToast( message: widget.model.error); else Navigator.pop(context); }).catchError((e) { GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: widget.model.error); }); }, cancelFunction: () => {}); dialog.showAlertDialog(context); }, ) ] : null, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( margin: EdgeInsets.all(15), child: Column( children: [ SizedBox( height: 15, ), NewTextFields( hintText: TranslationBase.of(context).weightAdd, controller: _weightValueController, keyboardType: TextInputType.number, onChanged: (value) => validateForm(), ), SizedBox( height: 8, ), InkWell( onTap: () { confirmSelectMeasureTimeDialog(projectViewModel.isArabic ? measureUnitArList : measureUnitEnList); }, child: Container( padding: EdgeInsets.all(12), width: double.infinity, height: 65, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: Colors.white), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(measureTimeSelectedType ?? TranslationBase.of(context).other), Icon( Icons.arrow_drop_down, color: Colors.grey, ) ], ), ), ), SizedBox( height: 8, ), InkWell( onTap: () { DatePicker.showDatePicker( context, showTitleActions: true, minTime: DateTime(DateTime.now().year - 1, 1, 1), maxTime: DateTime.now(), onConfirm: (date) { setState(() { dayWeightDate = date; }); }, currentTime: dayWeightDate, locale: projectViewModel.localeType, ); }, child: Container( padding: EdgeInsets.all(12), width: double.infinity, height: 65, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: Colors.white), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(TranslationBase.of(context).date), Texts(getDate()), ], ), ), ), SizedBox( height: 8, ), InkWell( onTap: () { DatePicker.showTimePicker( context, showTitleActions: true, onConfirm: (date) { setState(() { timeWeightDate = date; }); }, currentTime: timeWeightDate, locale: projectViewModel.localeType, ); }, child: Container( padding: EdgeInsets.all(12), width: double.infinity, height: 65, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: Colors.white), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(TranslationBase.of(context).time), Texts(getTime()) ], ), ), ), ], ), ), ), bottomSheet: Container( color: Colors.transparent, width: double.infinity, height: MediaQuery.of(context).size.width * 0.2, child: Padding( padding: const EdgeInsets.all(15.0), child: SecondaryButton( loading: widget.model.state == ViewState.BusyLocal, label: TranslationBase.of(context).save.toUpperCase(), textColor: Colors.white, color: isButtonDisabled ? Colors.grey[900] : Colors.grey, onTap: () { if (_weightValueController.text.isNotEmpty) { if (widget.isUpdate) { GifLoaderDialogUtils.showMyDialog(context); widget.model .updateWeightResult( weightDate: '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00', weightMeasured: _weightValueController.text.toString(), weightUnit: weightUnit, lineItemNo: widget.lineItemNo) .then((value) { GifLoaderDialogUtils.hideDialog(context); if (widget.model.state == ViewState.Error) AppToast.showErrorToast(message: widget.model.error); else Navigator.pop(context); }); } else widget.model .addWeightResult( weightDate: '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00', weightMeasured: _weightValueController.text.toString(), weightUnit: weightUnit, ) .then((value) { GifLoaderDialogUtils.hideDialog(context); if (widget.model.state == ViewState.Error) AppToast.showErrorToast(message: widget.model.error); else Navigator.pop(context); }); } }), ), ), ); } String getDate() { return "${DateUtil.getMonth(dayWeightDate.month)} ${dayWeightDate.day}, ${dayWeightDate.year}"; } String getTime() { return " ${timeWeightDate.hour}:${timeWeightDate.minute}"; } void confirmSelectMeasureTimeDialog(List list) { showDialog( context: context, child: RadioStringDialog( radioList: list, title: TranslationBase.of(context).measureUnit, selectedValue: measureTimeSelectedType, onValueSelected: (value) { setState(() { measureTimeSelectedType = value; weightUnit = list.indexOf(value); validateForm(); }); }, ), ); } void validateForm() { if (_weightValueController.text.length > 0 && measureTimeSelectedType != null) { setState(() { isButtonDisabled = true; }); } else { setState(() { isButtonDisabled = false; }); } } }