import 'package:date_time_picker/date_time_picker.dart'; import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/routes.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/reschedule-leaves/add-rescheduleleave.dart'; import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart'; import 'package:dropdown_search/dropdown_search.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; Helpers helpers = Helpers(); class RescheduleLeaveScreen extends StatefulWidget { final isUpdate; final updateData; RescheduleLeaveScreen(this.isUpdate, this.updateData); @override _RescheduleLeaveScreen createState() => _RescheduleLeaveScreen(); } class _RescheduleLeaveScreen extends State { DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); TextEditingController _toDateController = new TextEditingController(); TextEditingController _toDateController2 = new TextEditingController(); late ProjectViewModel projectsProvider; late SickLeaveViewModel sickLeaveViewModel; late String _selectedClinic; Map profile = {}; var offTime = '1'; var date; var doctorID; var reason; dynamic fromDate; dynamic toDate; var clinicID; late String fromTime; late String toTime; TextEditingController _controller4 = new TextEditingController(); TextEditingController _controller5 = new TextEditingController(); void _presentDatePicker(id) { var date = new DateTime.now(); var initialDate = id == 'fromDate' ? new DateTime(date.year, date.month, date.day + 15) : new DateTime(fromDate.year, fromDate.month, fromDate.day); var firstDate = id == 'fromDate' ? new DateTime(date.year, date.month, date.day + 15) : new DateTime(fromDate.year, fromDate.month, fromDate.day); showDatePicker( context: context, initialDate: initialDate, firstDate: firstDate, lastDate: DateTime(2050), ).then((pickedDate) { if (pickedDate == null) { return; } setState(() { final df = new DateFormat('yyyy-MM-dd'); if (id == 'fromDate') { fromDate = pickedDate; //df.format(); _toDateController.text = df.format(pickedDate); } else { toDate = pickedDate; // _toDateController2.text = df.format(pickedDate); } }); // setState(() { // final df = new DateFormat('yyyy-MM-dd'); // fromDate = pickedDate; //df.format(); // //_toDateController2.text = df.format(pickedDate); // //toDate = pickedDate; // }); }); } @override void initState() { getProfile(); super.initState(); } @override Widget build(BuildContext context) { projectsProvider = Provider.of(context); offTime = widget.updateData != null ? widget.updateData.requisitionType.toString() : offTime; return BaseView( onModelReady: (model) => model.getClinicsList(), builder: (_, model, w) => BaseView( onModelReady: (model2) => { model2.getOffTime(), model2.getReasons(offTime == '1' ? 18 : offTime == '2' ? 19 : 102), model2.getCoveringDoctors() }, builder: (_, model2, w) => GestureDetector( onTap: () { FocusScope.of(context).requestFocus(new FocusNode()); }, child: AppScaffold( baseViewModel: model2, isShowAppBar: true, appBarTitle: TranslationBase.of(context).rescheduleLeaves!, body: Center( child: Container( margin: EdgeInsets.only(top: 10), child: FractionallySizedBox( widthFactor: 0.9, child: ListView( children: [ Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), width: double.infinity, child: Padding( padding: EdgeInsets.only( top: SizeConfig.widthMultiplier * 0.9, bottom: SizeConfig.widthMultiplier * 0.9, right: SizeConfig.widthMultiplier * 3, left: SizeConfig.widthMultiplier * 3), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.max, children: [ model2.allOffTime.length > 0 ? Expanded( // add Expanded to have your dropdown button fill remaining space child: DropdownButtonHideUnderline( child: DropdownButton( // focusColor: Colors.grey, isExpanded: true, value: offTime == null ? model2.allOffTime[0] ['code'] : offTime, iconSize: 40, elevation: 16, selectedItemBuilder: (BuildContext context) { return model2.allOffTime .map((item) { return Row( mainAxisSize: MainAxisSize .max, children: [ AppText( item[ 'description'], fontSize: SizeConfig .textMultiplier * 2.1, // color: // Colors.grey, ), ], ); }).toList(); }, onChanged: (newValue) { setState(() { offTime = newValue.toString(); }); if (offTime == '1') { model2.getReasons(18); } else if (offTime == '2') { model2.getReasons(19); } else if (offTime == '3' || offTime == '5') { model2 .getReasons(102); setState(() { offTime = newValue.toString(); }); } }, items: model2.allOffTime .map((item) { return DropdownMenuItem< String>( value: item['code'] .toString(), child: Text( item['description'], textAlign: TextAlign.end, ), ); }).toList(), )), ) : SizedBox(), ], ) ], ), )), offTime == '1' ? Column( children: [ Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppTextFormField( hintText: TranslationBase.of( context) .fromDate, borderColor: Colors.white, prefix: IconButton( icon: Icon( Icons.calendar_today), onPressed: () {}, ), textInputType: TextInputType.number, controller: _toDateController, onTap: () { _presentDatePicker( 'fromDate'); }, inputFormatter: ONLY_DATE, onChanged: (val) => fromDate = val, onSaved: (val) => fromDate = val, ) ], )), Row( children: [ Expanded( child: Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular( 6.0)), border: Border.all( width: 1.0, color: HexColor( "#CCCCCC"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ DateTimePicker( timeHintText: TranslationBase.of( context) .fromTime, type: DateTimePickerType .time, controller: _controller4, onChanged: (val) => fromTime = val, validator: (val) { print(val); // setState( // () => _valueToValidate4 = val); return null; }, onSaved: (val) => fromTime = val!, ) ], ), ), ), Expanded( child: Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular( 6.0)), border: Border.all( width: 1.0, color: HexColor( "#CCCCCC"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ DateTimePicker( timeHintText: TranslationBase.of( context) .toTime, type: DateTimePickerType .time, controller: _controller5, onChanged: (val) => toTime = val, validator: (val) { print(val); // setState( // () => _valueToValidate4 = val); return null; }, onSaved: (val) => toTime = val!, ) ], ), ), ) ], ) ], ) : Column( children: [ Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppTextFormField( hintText: TranslationBase.of( context) .fromDate, borderColor: Colors.white, prefix: IconButton( icon: Icon( Icons.calendar_today), onPressed: () {}, ), textInputType: TextInputType.number, readOnly: true, controller: _toDateController, onTap: () { _presentDatePicker( 'fromDate'); }, inputFormatter: ONLY_DATE, onChanged: (value) { setState(() { fromDate = value; }); }), ], )), Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppTextFormField( hintText: TranslationBase.of( context) .toDate, readOnly: true, borderColor: Colors.white, prefix: IconButton( icon: Icon( Icons.calendar_today), onPressed: () {}, ), textInputType: TextInputType.number, controller: _toDateController2, onTap: () { _presentDatePicker( 'toDate'); }, inputFormatter: ONLY_DATE, onChanged: (value) { setState(() { toDate = value; }); }), ], )) ], ), Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), width: double.infinity, child: Padding( padding: EdgeInsets.only( top: SizeConfig.widthMultiplier * 0.9, bottom: SizeConfig.widthMultiplier * 0.9, right: SizeConfig.widthMultiplier * 3, left: SizeConfig.widthMultiplier * 3), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.max, children: [ model2.allReasons.length > 0 ? Expanded( // add Expanded to have your dropdown button fill remaining space child: DropdownButtonHideUnderline( child: DropdownButton( focusColor: Colors.grey, isExpanded: true, value: model2 .allReasons[0] ['id'] .toString() ?? "", iconSize: 40, elevation: 16, selectedItemBuilder: (BuildContext context) { return model2.allReasons .map((item) { return Row( mainAxisSize: MainAxisSize .max, children: [ AppText( projectsProvider .isArabic ? item[ 'nameAr'] : item[ 'nameEn'], fontSize: SizeConfig .textMultiplier * 2.1, // color: // Colors.grey, ), ], ); }).toList(); }, onChanged: (newValue) => { setState(() { reason = newValue; }) }, items: model2.allReasons .map((item) { return DropdownMenuItem< String>( value: item['id'] .toString(), child: Text( projectsProvider .isArabic ? item['nameAr'] : item[ 'nameEn'], textAlign: TextAlign.end, ), ); }).toList(), )), ) : SizedBox(), ], ) ], ), )), Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), width: double.infinity, child: Padding( padding: EdgeInsets.only( top: SizeConfig.widthMultiplier * 0.9, bottom: SizeConfig.widthMultiplier * 0.9, right: SizeConfig.widthMultiplier * 3, left: SizeConfig.widthMultiplier * 3), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// TODO Elham*2 fix it // Row( // mainAxisSize: MainAxisSize.max, // children: [ // if (model2.coveringDoctors.length > // 0) // Expanded( // // add Expanded to have your dropdown button fill remaining space // child: DropdownSearch( // mode: Mode.BOTTOM_SHEET, // // dropdownSearchDecoration: // InputDecoration( // contentPadding: // EdgeInsets.all(0), // border: // InputBorder.none), // //maxHeight: 300, // items: model2.coveringDoctors // .map((item) { // return projectsProvider // .isArabic // ? item['doctorNameN'] // : item['doctorName']; // }).toList(), // // label: "Doctor List", // onChanged: (_item) { // model2.coveringDoctors // .forEach((newVal) => { // if (newVal[ // 'doctorName'] == // _item) // doctorID = newVal[ // 'DoctorID'] // }); // }, // selectedItem: // getSelectedDoctor(model2), // showSearchBox: true, // // TODO Elham*2 fix // // searchBoxDecoration: // // InputDecoration( // // border: // // OutlineInputBorder(), // // contentPadding: // // EdgeInsets.fromLTRB( // // 12, 12, 8, 0), // // labelText: "Search Doctor", // // ), // popupTitle: Container( // height: 50, // decoration: BoxDecoration( // color: Theme.of(context) // .primaryColorDark, // borderRadius: // BorderRadius.only( // topLeft: // Radius.circular(20), // topRight: // Radius.circular(20), // ), // ), // child: Center( // child: Text( // '', // style: TextStyle( // fontSize: 24, // fontWeight: // FontWeight.bold, // color: Colors.white, // ), // ), // ), // ), // popupShape: // RoundedRectangleBorder( // borderRadius: // BorderRadius.only( // topLeft: // Radius.circular(24), // topRight: // Radius.circular(24), // ), // ), // ), // ) // else // SizedBox(), // ], // ) ], ), )), SizedBox(height: SizeConfig.screenHeight * .3), Container( margin: EdgeInsets.all( SizeConfig.widthMultiplier * 5), child: Wrap( alignment: WrapAlignment.center, children: [ AppButton( title: widget.isUpdate == true ? TranslationBase.of(context) .updateReschedule : TranslationBase.of(context) .addReschedule, color: HexColor('#359846'), onPressed: () { if (offTime == '1' || offTime == '2') { if (widget.isUpdate == true) { updateRecheduleLeave(model2); } else { addRecheduleLeave(model2); } } else { DrAppToastMsg.showErrorToast( TranslationBase.of(context) .onlyOfftimeHoliday); } }, ), ], ), ), // Column( // children: [ // AppText(TranslationBase.of(context) // .previousSickLeaveIssue + // ' ') // ], // ) ], ), ), ), ), ), ))); } getProfile() async { Map p = await sharedPref.getObj(DOCTOR_PROFILE); setState(() { this.profile = p; if (widget.updateData != null) { this.clinicID = widget.updateData.clinicId; final df = new DateFormat('HH:mm:ss'); final dateFormat = new DateFormat('yyyy-MM-dd'); this.offTime = widget.updateData.requisitionType.toString(); _toDateController.text = dateFormat.format(DateTime.parse(widget.updateData.dateTimeFrom)); //df.format(DateTime.parse(widget.updateData.dateTimeFrom)); this.fromTime = df.format(DateTime.parse(widget.updateData.dateTimeFrom)); this.fromTime = this.fromTime.substring(0, this.fromTime.length - 3); this.toTime = df.format(DateTime.parse(widget.updateData.dateTimeTo)); this.toTime = this.toTime.substring(0, this.toTime.length - 3); _toDateController2.text = dateFormat.format(DateTime.parse(widget.updateData.dateTimeTo)); _controller5.text = toTime; _controller4.text = fromTime; toDate = _toDateController2.text; fromDate = _toDateController.text; this.reason = widget.updateData.reasonId.toString(); doctorID = widget.updateData.coveringDoctorId; } }); } getClinicName(model) { var clinicID = this.profile['ClinicID'] ?? 1; var clinicInfo = model.clinicsList.where((i) => i['ClinicID'] == clinicID).toList(); return clinicInfo.length > 0 ? clinicInfo[0]['ClinicDescription'] : ""; } addRecheduleLeave(model) async { final df = new DateFormat('yyyy-MM-ddTHH:MM:ss'); final dateFormat = new DateFormat('yyyy-MM-dd'); var fromDates = fromDate; var toDates = toDate; if (offTime == '1') { fromDate = df.format(DateTime.parse(dateFormat.format(fromDates) + 'T' + fromTime + ':' + DateTime.now().second.toString())); toDate = df.format(DateTime.parse(dateFormat.format(fromDates) + 'T' + toTime + ':' + DateTime.now().second.toString())); } else { fromDate = df.format(fromDates); toDate = df.format(toDates); } Map request = { "Requisition": { "requisitionNo": 0, "requisitionType": offTime, "clinicId": this.profile['ClinicID'], "doctorId": this.profile['DoctorID'], "dateTimeFrom": fromDate, "dateTimeTo": toDate, "date": offTime == '1' ? fromDate : df.format(DateTime.now()), "reasonId": reason == null ? model.allOffTime[0]['code'] : reason, "coveringDoctorId": doctorID == null ? model.coveringDoctors[0]['doctorID'] : doctorID, "status": 2, "schedule": [ { "weekDayId": 1, "shiftId": 1, "isOpen": true, "timeFrom": fromTime, "timeTo": toTime, "timeFromstr": "", "timeTostr": "" } ] } }; await model.addReschedule(request).then((value) { if (model.postSechedule != null) { DrAppToastMsg.showSuccesToast(TranslationBase.of(context).leaveCreated); Navigator.pushNamedAndRemoveUntil(context, HOME, (r) => false); Navigator.push( context, MaterialPageRoute( builder: (context) => AddRescheduleLeavScreen(), settings: RouteSettings(name: 'AddRescheduleLeaveScreen') // MyReferredPatient(), ), ); } }); } updateRecheduleLeave(model) { // final df = new DateFormat('yyyy-MM-ddTHH:MM:ss'); final df = new DateFormat('yyyy-MM-dd'); String dataS = DateTime.now().toIso8601String(); dynamic fromDates = fromDate; dynamic toDates = toDate; if (offTime == '1') { fromDate = df.format(DateTime.parse(_toDateController.text)) + 'T' + fromTime + ':' + DateTime.now().second.toString(); toDate = df.format(DateTime.parse(_toDateController2.text)) + 'T' + toTime + ':' + DateTime.now().second.toString(); } else { fromDate = df.format( fromDates is DateTime ? fromDates : DateTime.parse(fromDates)); toDate = df.format(toDates is DateTime ? toDates : DateTime.parse(toDates)); } Map request = { "Requisition": { "requisitionNo": widget.updateData.requisitionNo, "requisitionType": offTime, "clinicId": this.profile['ClinicID'], "doctorId": this.profile['DoctorID'], "dateTimeFrom": fromDate, "dateTimeTo": toDate, "date": offTime == '1' ? fromDate : df.format(DateTime.now()), "reasonId": reason == null ? model.allOffTime[0]['code'] : reason, "coveringDoctorId": doctorID == null ? model.coveringDoctors[0]['doctorID'] : doctorID, "status": 2, "schedule": [ { "weekDayId": 1, "shiftId": 1, "isOpen": true, "timeFrom": "", "timeTo": "", "timeFromstr": fromTime, "timeTostr": toTime } ] } }; model.updateReschedule(request).then((response) { if (model.postSechedule != null) { DrAppToastMsg.showSuccesToast(TranslationBase.of(context).leaveCreated); Navigator.pushNamedAndRemoveUntil(context, HOME, (r) => false); Navigator.push( context, MaterialPageRoute( builder: (context) => AddRescheduleLeavScreen(), settings: RouteSettings(name: 'AddRescheduleLeaveScreen')), ); } }); } getSelectedDoctor(model2) { var doctorName; if (doctorID == null) return projectsProvider.isArabic ? model2.coveringDoctors[0]['doctorNameN'] : model2.coveringDoctors[0]['doctorName']; else { model2.coveringDoctors.forEach((newVal) => { if (newVal['doctorID'].toString() == doctorID) {doctorName = newVal['doctorName']} }); return doctorName; } } }