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/text_validator.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/Text.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/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'; 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; var fromTime; var toTime; TextEditingController _controller4; TextEditingController _controller5; 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); return BaseView( onModelReady: (model) => model.getClinicsList(), builder: (_, model, w) => BaseView( onModelReady: (model2) => { model2.getOffTime(), model2.getReasons(18), model2.getCoveringDoctors() }, builder: (_, model2, w) => AppScaffold( baseViewModel: model2, isShowAppBar: false, 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: [ 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: 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(), ], ) ], ), )), Container( margin: EdgeInsets.all( SizeConfig.widthMultiplier * 5), child: Wrap( alignment: WrapAlignment.center, children: [ AppButton( title: widget.isUpdate == true ? TranslationBase.of(context).update : TranslationBase.of(context).add, onPressed: () { if (widget.isUpdate == true) { updateRecheduleLeave(model2); } else { addRecheduleLeave(model2); } }, ), ], ), ), // Column( // children: [ // Texts(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; _toDateController.text = widget.updateData.dateTimeFrom; _toDateController2.text = widget.updateData.dateTimeTo; } }); } 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": "", "timeTo": "", "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 dateFormat = new DateFormat('yyyy-MM-dd'); if (offTime == '1') { fromDate = dateFormat.format(fromDate) + 'T' + fromTime + '00'; toDate = dateFormat.format(fromDate) + 'T' + toTime + '00'; } else { fromDate = df.format(fromDate); toDate = df.format(toDate); } 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": "" } ] } }; 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(), ), ); } }); } }