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/models/sickleave/add_sickleave_request.dart'; import 'package:doctor_app_flutter/routes.dart'; import 'package:doctor_app_flutter/screens/base/base_view.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_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:intl/intl.dart'; import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; import 'package:provider/provider.dart'; import 'package:doctor_app_flutter/screens/reschedule-leaves/add-rescheduleleave.dart'; import 'package:dropdown_search/dropdown_search.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(); ProjectViewModel projectsProvider; SickLeaveViewModel sickLeaveViewModel; String _selectedClinic; Map profile = {}; var offTime = '1'; var date; var doctorID; var reason; var fromDate; var toDate; var clinicID; String fromTime; 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(); _toDateController.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: [ // Expanded( // // add Expanded to have your dropdown button fill remaining space // child: // DropdownButtonHideUnderline( // child: new IgnorePointer( // ignoring: true, // child: DropdownButton( // focusColor: // Colors.grey, // isExpanded: true, // dropdownColor: // Colors.grey, // value: getClinicName( // model) ?? // "", // iconSize: 0, // elevation: 16, // selectedItemBuilder: // (BuildContext // context) { // return model // .getClinicNameList() // .map((item) { // return Row( // mainAxisSize: // MainAxisSize // .max, // children: < // Widget>[ // AppText( // item, // fontSize: // SizeConfig.textMultiplier * // 2.1, // color: Colors // .grey[ // 500], // ), // ], // ); // }).toList(); // }, // onChanged: // (newValue) => // {}, // items: model // .getClinicNameList() // .map((item) { // return DropdownMenuItem( // value: item // .toString(), // child: Text( // item, // textAlign: // TextAlign // .end, // ), // ); // }).toList(), // ))), // ), // ], // ) // ], // ), // )), // 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: [ // new IgnorePointer( // ignoring: true, // child: AppTextFormField( // readOnly: true, // hintText: profile != null // ? profile['DoctorName'] // : "", // borderColor: Colors.white, // onSaved: (value) {}, // inputFormatter: ONLY_NUMBERS)) // ], // ), // ), 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; }), if (offTime == '1') { model2 .getReasons(18) } else if (offTime == '2') { model2 .getReasons(19) } else if (offTime == '3' || offTime == '5') { model2 .getReasons(102) } }, 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)), 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)), textInputType: TextInputType.number, controller: _toDateController, onTap: () { _presentDatePicker( 'fromDate'); }, 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"))), padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppTextFormField( hintText: TranslationBase .of(context) .toDate, borderColor: Colors.white, prefix: IconButton( icon: Icon(Icons .calendar_today)), 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: reason == null ? model2.allReasons[0] ['id'] .toString() : reason, 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: [ Row( mainAxisSize: MainAxisSize.max, children: [ 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 || newVal['doctorName'] == item) { doctorID = newVal['DoctorID'] } }); }, selectedItem: getSelectedDoctor( model2), showSearchBox: true, 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), ), ), ), // DropdownButtonHideUnderline( // child: DropdownButton( // focusColor: Colors.grey, // isExpanded: true, // value: doctorID == null // ? model2 // .coveringDoctors[0] // ['doctorID'] // .toString() // : doctorID, // iconSize: 40, // elevation: 16, // selectedItemBuilder: // (BuildContext context) { // return model2 // .coveringDoctors // .map((item) { // return Row( // mainAxisSize: // MainAxisSize.max, // children: [ // AppText( // projectsProvider // .isArabic // ? item[ // 'doctorNameN'] // : item[ // 'doctorName'], // fontSize: SizeConfig // .textMultiplier * // 2.1, // ), // ], // ); // }).toList(); // }, // onChanged: (newValue) => { // setState(() { // doctorID = newValue; // }) // }, // items: model2 // .coveringDoctors // .map((item) { // return DropdownMenuItem< // String>( // value: item['doctorID'] // .toString(), // child: Text( // projectsProvider // .isArabic // ? item[ // 'doctorNameN'] // : item[ // 'doctorName'], // textAlign: // TextAlign.start, // ), // ); // }).toList(), // )), ) : 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(), // MyReferredPatient(), ), ); } }); } updateRecheduleLeave(model) { // final df = new DateFormat('yyyy-MM-ddTHH:MM:ss'); final df = new DateFormat('yyyy-MM-dd'); var fromDates = fromDate; var toDates = toDate; if (offTime == '1') { fromDate = df.format(DateTime.parse(_toDateController.text)) + 'T' + fromTime + ':' + DateTime.now().second.toString(); toDate = df.format(DateTime.parse(_toDateController.text)) + 'T' + toTime + ':' + DateTime.now().second.toString(); } else { fromDate = df.format(fromDates); toDate = df.format(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(), // MyReferredPatient(), ), ); } }); } 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; } } }