diff --git a/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart index 08a69907..a58d6b67 100644 --- a/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart @@ -14,6 +14,8 @@ import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dar import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart'; import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart'; +import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom2.dart'; +import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hexcolor/hexcolor.dart'; @@ -48,6 +50,8 @@ class _AdmissionRequestThirdScreenState String medicalHistoryError; String surgicalHistoryError; + final _formKey = GlobalKey(); + @override Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; @@ -102,100 +106,91 @@ class _AdmissionRequestThirdScreenState Container( margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText( - TranslationBase.of(context) - .specialityAndDoctorDetail, - color: Color(0xFF2E303A), - fontSize: SizeConfig.textMultiplier * 1.8, - fontWeight: FontWeight.w700, - ), - SizedBox( - height: 10, - ), - AppTextFieldCustom( - height: screenSize.height * 0.075, - hintText: TranslationBase.of(context).clinic, - isTextFieldHasSuffix: true, - validationError: clinicError, - dropDownText: _selectedClinic != null - ? projectViewModel.isArabic? _selectedClinic['clinicNameArabic'] : _selectedClinic['clinicNameEnglish'] - : null, - enabled: false, - onClick: model.clinicList != null && - model.clinicList.length > 0 - ? () { - openListDialogField( - projectViewModel.isArabic? 'clinicNameArabic' : 'clinicNameEnglish', - 'clinicID', - model.clinicList, (selectedValue) { - setState(() { - _selectedClinic = selectedValue; - }); - }); - } - : () async { - GifLoaderDialogUtils.showMyDialog( - context); - await model.getClinics().then((_) => - GifLoaderDialogUtils.hideDialog( - context)); - if (model.state == ViewState.Idle && - model.clinicList.length > 0) { + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + TranslationBase.of(context) + .specialityAndDoctorDetail, + color: Color(0xFF2E303A), + fontSize: SizeConfig.textMultiplier * 1.8, + fontWeight: FontWeight.w700, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).clinic, + isTextFieldHasSuffix: true, + validationError: clinicError, + dropDownText: _selectedClinic != null + ? projectViewModel.isArabic + ? _selectedClinic['clinicNameArabic'] + : _selectedClinic['clinicNameEnglish'] + : null, + enabled: false, + onClick: model.clinicList != null && + model.clinicList.length > 0 + ? () { openListDialogField( - projectViewModel.isArabic? 'clinicNameArabic' : 'clinicNameEnglish', + projectViewModel.isArabic + ? 'clinicNameArabic' + : 'clinicNameEnglish', 'clinicID', model.clinicList, (selectedValue) { setState(() { _selectedClinic = selectedValue; }); }); - } else if (model.state == - ViewState.ErrorLocal) { - DrAppToastMsg.showErrorToast( - model.error); - } else { - DrAppToastMsg.showErrorToast( - "Empty List"); } - }, - ), - SizedBox( - height: 20, - ), - AppTextFieldCustom( - height: screenSize.height * 0.075, - hintText: TranslationBase.of(context).doctor, - isTextFieldHasSuffix: true, - dropDownText: _selectedDoctor != null - ? _selectedDoctor['DoctorName'] - : null, - enabled: false, - validationError: doctorError, - onClick: _selectedClinic != null - ? model.doctorsList != null && - model.doctorsList.length > 0 - ? () { - openListDialogField('DoctorName', - 'DoctorID', model.doctorsList, + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model.getClinics().then((_) => + GifLoaderDialogUtils.hideDialog( + context)); + if (model.state == ViewState.Idle && + model.clinicList.length > 0) { + openListDialogField( + projectViewModel.isArabic + ? 'clinicNameArabic' + : 'clinicNameEnglish', + 'clinicID', + model.clinicList, (selectedValue) { setState(() { - _selectedDoctor = selectedValue; + _selectedClinic = selectedValue; }); }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); } - : () async { - GifLoaderDialogUtils.showMyDialog( - context); - await model - .getClinicDoctors( - _selectedClinic['clinicID']) - .then((_) => GifLoaderDialogUtils - .hideDialog(context)); - if (model.state == ViewState.Idle && - model.doctorsList.length > 0) { + }, + ), + SizedBox( + height: 20, + ), + AppTextFieldCustom2( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).doctor, + isTextFieldHasSuffix: true, + dropDownText: _selectedDoctor != null + ? _selectedDoctor['DoctorName'] + : null, + enabled: false, + validationError: doctorError, + onClick: _selectedClinic != null + ? model.doctorsList != null && + model.doctorsList.length > 0 + ? () { openListDialogField('DoctorName', 'DoctorID', model.doctorsList, (selectedValue) { @@ -203,104 +198,125 @@ class _AdmissionRequestThirdScreenState _selectedDoctor = selectedValue; }); }); - } else if (model.state == - ViewState.ErrorLocal) { - DrAppToastMsg.showErrorToast( - model.error); - } else { - DrAppToastMsg.showErrorToast( - "Empty List"); } - } - : null, - ), - SizedBox( - height: 16, - ), - AppText( - TranslationBase.of(context).patientDetails, - fontFamily: 'Poppins', - fontSize: SizeConfig.textMultiplier * 1.8, - fontWeight: FontWeight.w700, - ), - SizedBox( - height: 10, - ), - if(patient.gender != 1) + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getClinicDoctors( + _selectedClinic['clinicID']) + .then((_) => + GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == ViewState.Idle && + model.doctorsList.length > 0) { + openListDialogField('DoctorName', + 'DoctorID', model.doctorsList, + (selectedValue) { + setState(() { + _selectedDoctor = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + } + : null, + ), + Container( + decoration: TextFieldsUtils.containerBorderDecoration( + Color(0Xffffffff), + Color(0xFFEFEFEF) + ), + child: TextFormField( + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + ), + ), + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).patientDetails, + fontFamily: 'Poppins', + fontSize: SizeConfig.textMultiplier * 1.8, + fontWeight: FontWeight.w700, + ), + SizedBox( + height: 10, + ), + if (patient.gender != 1) + CheckboxListTile( + title: AppText( + TranslationBase.of(context).patientPregnant, + fontWeight: FontWeight.normal, + fontFamily: 'Poppins', + fontSize: SizeConfig.textMultiplier * 2.0, + ), + value: _patientPregnant, + activeColor: HexColor("#D02127"), + onChanged: (newValue) { + setState(() { + _patientPregnant = newValue; + }); + }, + controlAffinity: + ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), CheckboxListTile( title: AppText( - TranslationBase.of(context).patientPregnant, + TranslationBase.of(context) + .isSickLeaveRequired, fontWeight: FontWeight.normal, fontFamily: 'Poppins', fontSize: SizeConfig.textMultiplier * 2.0, ), - value: _patientPregnant, + value: _isSickLeaveRequired, activeColor: HexColor("#D02127"), onChanged: (newValue) { setState(() { - _patientPregnant = newValue; + _isSickLeaveRequired = newValue; }); }, - controlAffinity: ListTileControlAffinity.leading, + controlAffinity: + ListTileControlAffinity.leading, contentPadding: EdgeInsets.all(0), ), - CheckboxListTile( - title: AppText( - TranslationBase.of(context).isSickLeaveRequired, - fontWeight: FontWeight.normal, - fontFamily: 'Poppins', - fontSize: SizeConfig.textMultiplier * 2.0, + AppTextFieldCustom( + hintText: TranslationBase.of(context) + .sickLeaveComments, + controller: _sickLeaveCommentsController, + minLines: 2, + maxLines: 4, + validationError: sickLeaveCommentError, + inputType: TextInputType.multiline, ), - value: _isSickLeaveRequired, - activeColor: HexColor("#D02127"), - onChanged: (newValue) { - setState(() { - _isSickLeaveRequired = newValue; - }); - }, - controlAffinity: ListTileControlAffinity.leading, - contentPadding: EdgeInsets.all(0), - ), - AppTextFieldCustom( - hintText: - TranslationBase.of(context).sickLeaveComments, - controller: _sickLeaveCommentsController, - minLines: 2, - maxLines: 4, - validationError: sickLeaveCommentError, - inputType: TextInputType.multiline, - ), - SizedBox( - height: 10, - ), - AppTextFieldCustom( - height: screenSize.height * 0.075, - hintText: TranslationBase.of(context).dietType, - isTextFieldHasSuffix: true, - validationError: dietTypeError, - dropDownText: _selectedDietType != null - ? _selectedDietType['nameEn'] - : null, - enabled: false, - onClick: model.dietTypesList != null && - model.dietTypesList.length > 0 - ? () { - openListDialogField( - 'nameEn', 'id', model.dietTypesList, - (selectedValue) { - setState(() { - _selectedDietType = selectedValue; - }); - }); - } - : () async { - GifLoaderDialogUtils.showMyDialog( - context); - await model.getDietTypes(patient.patientId).then((_) => - GifLoaderDialogUtils.hideDialog( - context)); - if (model.state == ViewState.Idle && - model.dietTypesList.length > 0) { + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).dietType, + isTextFieldHasSuffix: true, + validationError: dietTypeError, + dropDownText: _selectedDietType != null + ? _selectedDietType['nameEn'] + : null, + enabled: false, + onClick: model.dietTypesList != null && + model.dietTypesList.length > 0 + ? () { openListDialogField( 'nameEn', 'id', model.dietTypesList, (selectedValue) { @@ -308,50 +324,71 @@ class _AdmissionRequestThirdScreenState _selectedDietType = selectedValue; }); }); - } else if (model.state == - ViewState.ErrorLocal) { - DrAppToastMsg.showErrorToast( - model.error); - } else { - DrAppToastMsg.showErrorToast( - "Empty List"); } - }, - ), - SizedBox( - height: 10, - ), - AppTextFieldCustom( - hintText: - TranslationBase.of(context).dietTypeRemarks, - controller: _dietTypeRemarksController, - minLines: 4, - maxLines: 6, - inputType: TextInputType.multiline, - ), - SizedBox( - height: 10, - ), - AppTextFieldCustom( - hintText: TranslationBase.of(context).pastMedicalHistory, - controller: _postMedicalHistoryController, - minLines: 4, - maxLines: 6, - validationError: medicalHistoryError, - inputType: TextInputType.multiline, - ), - SizedBox( - height: 10, - ), - AppTextFieldCustom( - hintText: TranslationBase.of(context).pastSurgicalHistory, - controller: _postSurgicalHistoryController, - minLines: 2, - maxLines: 4, - validationError: surgicalHistoryError, - inputType: TextInputType.multiline, - ), - ], + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getDietTypes(patient.patientId) + .then((_) => + GifLoaderDialogUtils.hideDialog( + context)); + if (model.state == ViewState.Idle && + model.dietTypesList.length > 0) { + openListDialogField('nameEn', 'id', + model.dietTypesList, + (selectedValue) { + setState(() { + _selectedDietType = selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + hintText: + TranslationBase.of(context).dietTypeRemarks, + controller: _dietTypeRemarksController, + minLines: 4, + maxLines: 6, + inputType: TextInputType.multiline, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + hintText: TranslationBase.of(context) + .pastMedicalHistory, + controller: _postMedicalHistoryController, + minLines: 4, + maxLines: 6, + validationError: medicalHistoryError, + inputType: TextInputType.multiline, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + hintText: TranslationBase.of(context) + .pastSurgicalHistory, + controller: _postSurgicalHistoryController, + minLines: 2, + maxLines: 4, + validationError: surgicalHistoryError, + inputType: TextInputType.multiline, + ), + ], + ), ), ), ], @@ -364,6 +401,13 @@ class _AdmissionRequestThirdScreenState title: TranslationBase.of(context).next, color: HexColor("#D02127"), onPressed: () { + // Validate returns true if the form is valid, or false otherwise. + if (_formKey.currentState.validate()) { + DrAppToastMsg.showErrorToast("all good"); + } else { + DrAppToastMsg.showErrorToast("not valid"); + } + model.admissionRequestData = AdmissionRequest(); if (_selectedClinic != null && _selectedDoctor != null && @@ -411,34 +455,40 @@ class _AdmissionRequestThirdScreenState TranslationBase.of(context).pleaseFill); setState(() { - if(_selectedClinic == null){ - clinicError = TranslationBase.of(context).fieldRequired; - }else { + if (_selectedClinic == null) { + clinicError = + TranslationBase.of(context).fieldRequired; + } else { clinicError = null; } - if(_selectedDoctor == null){ - doctorError = TranslationBase.of(context).fieldRequired; - }else { + if (_selectedDoctor == null) { + doctorError = + TranslationBase.of(context).fieldRequired; + } else { doctorError = null; } - if(_sickLeaveCommentsController.text == ""){ - sickLeaveCommentError = TranslationBase.of(context).fieldRequired; - }else { + if (_sickLeaveCommentsController.text == "") { + sickLeaveCommentError = + TranslationBase.of(context).fieldRequired; + } else { sickLeaveCommentError = null; } - if(_selectedDietType == null){ - dietTypeError = TranslationBase.of(context).fieldRequired; - }else { + if (_selectedDietType == null) { + dietTypeError = + TranslationBase.of(context).fieldRequired; + } else { dietTypeError = null; } - if(_postMedicalHistoryController.text == ""){ - medicalHistoryError = TranslationBase.of(context).fieldRequired; - }else { + if (_postMedicalHistoryController.text == "") { + medicalHistoryError = + TranslationBase.of(context).fieldRequired; + } else { medicalHistoryError = null; } - if(_postSurgicalHistoryController.text == ""){ - surgicalHistoryError = TranslationBase.of(context).fieldRequired; - }else { + if (_postSurgicalHistoryController.text == "") { + surgicalHistoryError = + TranslationBase.of(context).fieldRequired; + } else { surgicalHistoryError = null; } }); diff --git a/lib/widgets/shared/text_fields/app-textfield-custom2.dart b/lib/widgets/shared/text_fields/app-textfield-custom2.dart new file mode 100644 index 00000000..e63627ac --- /dev/null +++ b/lib/widgets/shared/text_fields/app-textfield-custom2.dart @@ -0,0 +1,177 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; +import 'package:doctor_app_flutter/widgets/shared/text_fields/text_field_error.dart'; +import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; + +import '../app_texts_widget.dart'; + +class AppTextFieldCustom2 extends StatefulWidget { + final double height; + final Function onClick; + final String hintText; + final TextEditingController controller; + final bool isTextFieldHasSuffix; + final bool hasBorder; + final String dropDownText; + final IconButton suffixIcon; + final Color dropDownColor; + final bool enabled; + final TextInputType inputType; + final int minLines; + final int maxLines; + final List inputFormatters; + final Function(String) onChanged; + final String validationError; + final bool isPrscription; + final bool isSecure; + + AppTextFieldCustom2({ + this.height = 0, + this.onClick, + this.hintText, + this.controller, + this.hasBorder = true, + this.isTextFieldHasSuffix = false, + this.dropDownText, + this.suffixIcon, + this.dropDownColor, + this.enabled = true, + this.inputType, + this.minLines = 1, + this.maxLines = 1, + this.inputFormatters, + this.onChanged, + this.validationError, + this.isPrscription = false, + this.isSecure = false, + }); + + @override + _AppTextFieldCustomState createState() => _AppTextFieldCustomState(); +} + +class _AppTextFieldCustomState extends State { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + + return Column( + children: [ + Container( + height: widget.height != 0 && widget.maxLines == 1 + ? widget.height + 8 + : null, + decoration: widget.hasBorder + ? TextFieldsUtils.containerBorderDecoration( + Color(0Xffffffff), + widget.validationError == null + ? Color(0xFFEFEFEF) + : Colors.red.shade700) + : null, + padding: + EdgeInsets.only(top: 4.0, bottom: 4.0, left: 8.0, right: 8.0), + child: InkWell( + onTap: widget.onClick ?? null, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Container( + padding: widget.dropDownText == null + ? EdgeInsets.symmetric(vertical: 0) + : EdgeInsets.symmetric(vertical: 0), // 8.0 + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if ((widget.controller != null && + widget.controller.text != "") || + widget.dropDownText != null) + AppText( + widget.hintText, + color: Color(0xFF2E303A), + fontSize: widget.isPrscription == false + ? SizeConfig.textMultiplier * 1.3 + : 0, + fontWeight: FontWeight.w700, + ), + widget.dropDownText == null + ? Container( + height: + widget.height != 0 && widget.maxLines == 1 + ? widget.height - 22 + : null, + child: TextFormField( + textAlign: projectViewModel.isArabic + ? TextAlign.right + : TextAlign.left, + decoration: TextFieldsUtils + .textFieldSelectorDecoration( + widget.hintText, null, true), + style: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.7, + fontFamily: 'Poppins', + color: Color(0xFF575757), + ), + controller: widget.controller, + keyboardType: widget.inputType ?? + (widget.maxLines == 1 + ? TextInputType.text + : TextInputType.multiline), + enabled: widget.enabled, + minLines: widget.minLines, + maxLines: widget.maxLines, + inputFormatters: + widget.inputFormatters != null + ? widget.inputFormatters + : [], + onChanged: (value) { + setState(() {}); + if (widget.onChanged != null) { + widget.onChanged(value); + } + }, + obscureText: widget.isSecure, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + ), + ) + : AppText( + widget.dropDownText, + fontFamily: 'Poppins', + color: Color(0xFF575757), + fontSize: SizeConfig.textMultiplier * 1.7, + ), + ], + ), + ), + ), + widget.isTextFieldHasSuffix + ? widget.suffixIcon != null + ? widget.suffixIcon + : InkWell( + child: Icon( + Icons.keyboard_arrow_down, + color: widget.dropDownColor != null + ? widget.dropDownColor + : Colors.black, + ), + ) + : Container(), + ], + ), + ), + ), + if (widget.validationError != null) + TextFieldsError(error: widget.validationError), + ], + ); + } +}