import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/core/viewModel/auth_view_model.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/icons_app/doctor_app_icons.dart'; import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/models/patient/patient_arrival/get_patient_arrival_list_request_model.dart'; import 'package:doctor_app_flutter/models/patient/patient_model.dart'; import 'package:doctor_app_flutter/models/patient/topten_users_res_model.dart'; import 'package:doctor_app_flutter/routes.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/date-utils.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/patients/PatientCard.dart'; import 'package:doctor_app_flutter/widgets/patients/clinic_list_dropdwon.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart'; import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../config/size_config.dart'; import '../../widgets/shared/app_scaffold_widget.dart'; class PatientsScreen extends StatefulWidget { final patientSearchForm; final selectedType; final isAppbar; final arrivalType; final isView; PatientsScreen( {this.patientSearchForm, this.selectedType, this.isAppbar = true, this.arrivalType, this.isView}); @override _PatientsScreenState createState() => _PatientsScreenState(); } class _PatientsScreenState extends State { List lItems; List parsed; List date; List unFilterDate; int clinicId; AuthViewModel authProvider; Color sideColor = Colors.black; List responseModelList; List responseModelList2; final String url = "assets/images/"; final String avatarMale = "user_male.svg"; //'working_male.svg';//'user.svg'; final String avatarFemale = 'user_female.svg'; final String assetName = 'assets/image.svg'; List _locations = []; //['All', 'Today', 'Tomorrow', 'Next Week']; int _activeLocation = 0; bool _isInit = true; String patientType; bool isSearch = false; String patientTypeTitle; var _isLoading = true; var selectedFilter = 1; bool _isError = false; String error = ""; String arrivalType; ProjectViewModel projectsProvider; var isView; final _controller = TextEditingController(); PatientModel patient; var _patientSearchFormValues = PatientModel( FirstName: "0", MiddleName: "0", LastName: "0", PatientMobileNumber: "0", PatientIdentificationID: "0", PatientID: 0, From: DateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd') .toString(), To: DateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd') .toString(), LanguageID: 2, stamp: "2020-03-02T13:56:39.170Z", IPAdress: "11.11.11.11", VersionID: 1.2, Channel: 9, TokenID: "2Fi7HoIHB0eDyekVa6tCJg==", SessionID: "5G0yXn0Jnq", IsLoginForDoctorApp: true, PatientOutSA: false); searchData(String str) { this.responseModelList = this.responseModelList2; var strExist = str.length > 0 ? true : false; if (strExist) { List filterData = []; for (var i = 0; i < responseModelList2.length; i++) { String firstName = responseModelList[i].firstName.toUpperCase(); String lastName = responseModelList[i].lastName.toUpperCase(); String mobile = responseModelList[i].mobileNumber.toUpperCase(); String patientID = responseModelList[i].patientId.toString(); if (firstName.contains(str.toUpperCase()) || lastName.contains(str.toUpperCase()) || mobile.contains(str) || patientID.contains(str)) { filterData.add(responseModelList[i]); } } setState(() { this.responseModelList = filterData; }); } else { setState(() { this.responseModelList = this.responseModelList2; }); } } convertDate(String str) { String timeConvert; const start = "/Date("; const end = "+0300)"; final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); var date = new DateTime.fromMillisecondsSinceEpoch( int.parse(str.substring(startIndex + start.length, endIndex))); String newDateformat = date.year.toString() + "/" + date.month.toString().padLeft(2, '0') + "/" + date.day.toString().padLeft(2, '0') + " " + "-" + " " + date.hour.toString().padLeft(2, '0') + ":" + date.minute.toString().toString().padLeft(2, '0'); return newDateformat.toString(); } convertDateFormat(String str) { String timeConvert; const start = "/Date("; const end = "+0300)"; final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); var date = new DateTime.fromMillisecondsSinceEpoch( int.parse(str.substring(startIndex + start.length, endIndex))); String newDate = date.year.toString() + "-" + date.month.toString().padLeft(2, '0') + "-" + date.day.toString().padLeft(2, '0'); return newDate.toString(); } filterBooking(String str) { this.responseModelList = this.responseModelList2; var strExist = str.length > 0 ? true : false; if (true) { List filterDate = []; String patiantAppointment = ""; for (var i = 0; i < responseModelList2.length; i++) { try { if (responseModelList[i].appointmentDate == "") { patiantAppointment = responseModelList[i].arrivedOn; } else { patiantAppointment = convertDateFormat(responseModelList[i].appointmentDate); } if (patiantAppointment != null) { String dateAppointment = checkDate(patiantAppointment); if (dateAppointment.contains(str) || str == 'All') { filterDate.add(responseModelList[i]); } } } catch (e) { print(e); } } setState(() { this.responseModelList = filterDate; }); } else { setState(() { this.responseModelList = this.responseModelList2; }); } } String checkDate(String dateString) { DateTime checkedTime = DateTime.parse(dateString); DateTime currentTime = DateTime.now(); if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month) && (currentTime.day == checkedTime.day)) { return TranslationBase.of(context).today; } else if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month)) { if ((currentTime.day - checkedTime.day) == 1) { return TranslationBase.of(context).yesterday; } else if ((currentTime.day - checkedTime.day) == -1) { return TranslationBase.of(context).tomorrow; } if ((currentTime.day - checkedTime.day) <= -2) { return TranslationBase.of(context).nextWeek; } else { return TranslationBase.of(context).all; } } return TranslationBase.of(context).all; } @override Widget build(BuildContext context) { authProvider = Provider.of(context); _locations = [ TranslationBase.of(context).today, TranslationBase.of(context).tomorrow, TranslationBase.of(context).nextWeek, ]; //TranslationBase.of(context).all, projectsProvider = Provider.of(context); final routeArgs = ModalRoute.of(context).settings.arguments as Map; patient = widget.patientSearchForm != null ? widget.patientSearchForm : routeArgs['patientSearchForm']; patientType = widget.selectedType != null ? widget.selectedType : routeArgs['selectedType']; arrivalType = widget.arrivalType != null ? widget.arrivalType : routeArgs['arrivalType']; if (routeArgs != null && routeArgs.containsKey("isSearch")) { isSearch = routeArgs['isSearch']; } if (routeArgs != null && routeArgs.containsKey("isSearch")) { isView = routeArgs['isView']; //patient.Searchtype = 1; } if (routeArgs != null && routeArgs.containsKey('activeFilter')) { _activeLocation = routeArgs['activeFilter']; } if (!projectsProvider.isArabic) patientTypeTitle = SERVICES_PATIANT_HEADER[int.parse(patientType)]; else patientTypeTitle = SERVICES_PATIANT_HEADER_AR[int.parse(patientType)]; return BaseView( onModelReady: (model) { // TODO : change all the logic here to make it work with the model and remove future int val2 = int.parse(patientType); GetPatientArrivalListRequestModel getPatientArrivalListRequestModel; if (val2 == 7) { getPatientArrivalListRequestModel = GetPatientArrivalListRequestModel( from: patient.From, to: patient.To, pageIndex: 0, pageSize: 0, patientMRN: patient.getPatientID); } model .getPatientList( val2 == 7 ? getPatientArrivalListRequestModel.toJson() : patient, patientType, isView: isView) .then((res) { setState(() { if (res != null && res['MessageStatus'] == 1) { if (val2 == 7) { if (res[SERVICES_PATIANT2[val2]] == null) { _isError = true; _isLoading = false; this.error = error.toString(); } else { var localList = []; if (res["patientArrivalList"]["entityList"] == null) { res["patientArrivalList"]["entityList"] = []; } res["patientArrivalList"]["entityList"].forEach((v) { Map mergedPatient = { ...v, ...v["patientDetails"] }; localList.add(mergedPatient); }); lItems = localList; } } else { if (isView == false && val2 == 1) { lItems = res['GetPatientFileInformation_PRMList'] .where((i) => i['PatientTypeDescription'] == 'Permanent File') .toList(); } else { lItems = res[SERVICES_PATIANT2[val2]]; } } parsed = lItems; responseModelList = new ModelResponse.fromJson(parsed).list; if (val2 == 7) { responseModelList.sort((a, b) { if (b.startTime != null && b.startTime != null) { try { DateTime now = DateTime.now(); DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm"); String formattedDate = DateFormat('yyyy-MM-dd ' + a.startTime).format(now); DateTime dateTimeA = dateFormat.parse(formattedDate); String formattedDateB = DateFormat('yyyy-MM-dd ' + b.startTime).format(now); DateTime dateTimeB = dateFormat.parse(formattedDateB); var adate = dateTimeA; //a.startTime; var bdate = dateTimeB; return adate.compareTo(bdate); } on Exception catch (_) { print('never reached'); var adate = a.startTime; //a.startTime; var bdate = b.startTime; return adate.compareTo(bdate); } } else { var adate = convertDateFormat(a.appointmentDate); var bdate = convertDateFormat(b.appointmentDate); return bdate.compareTo(adate); } }); } responseModelList2 = responseModelList; _isError = false; } else { _isError = true; error = model.error ?? res['ErrorEndUserMessage'] ?? res['ErrorMessage']; } _isLoading = false; }); }).catchError((error) { setState(() { _isError = true; _isLoading = false; this.error = error.toString(); }); }); }, builder: (_, model, w) => AppScaffold( appBarTitle: patientTypeTitle, isShowAppBar: widget.isAppbar, isLoading: _isLoading, body: _isLoading ? Container() : _isError ? DrAppEmbeddedError(error: error) : lItems == null || lItems.length == 0 ? Column( children: [ Column(children: [ SizedBox(height: 18.5), Container( width: SizeConfig.screenWidth * 0.9, height: SizeConfig.screenHeight * 0.08, child: TextField( controller: _controller, onChanged: (String str) { this.searchData(str); }, decoration: buildInputDecoration( context, TranslationBase.of(context) .searchPatientName), ), ), SizedBox( height: 10.0, ), if (int.parse(patientType) == 7) Container( padding: EdgeInsets.all(5), decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(10)), child: ClinicList( clinicId: clinicId, onClinicChange: (newValue) { clinicId = newValue; changeClinic(newValue, context, model); }, )), Padding( padding: EdgeInsets.only( top: MediaQuery.of(context).size.height * 0.03), // child: _locationBar(context) child: SERVICES_PATIANT2[int.parse(patientType)] == "patientArrivalList" ? _locationBar(context, model) : Container(), ) ]), Container( margin: EdgeInsets.only( top: MediaQuery.of(context).size.height * 0.10), child: Center( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( height: 100, ), Image.asset('assets/images/no-data.png'), Padding( padding: const EdgeInsets.all(8.0), child: AppText(TranslationBase.of(context) .youDontHaveAnyPatient), ) ], ), ), ), ], ) : Container( color: Colors.grey[200], child: ListView( scrollDirection: Axis.vertical, children: [ Container( child: lItems == null ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( child: Center( child: Padding( padding: const EdgeInsets.fromLTRB( 0, 0, 0, 0), //250 child: DrAppCircularProgressIndeicator(), )), ), ], ) : Column( children: [ SizedBox(height: 18.5), Container( width: SizeConfig.screenWidth * 0.9, height: SizeConfig.screenHeight * 0.08, child: TextField( controller: _controller, onChanged: (String str) { this.searchData(str); }, decoration: buildInputDecoration( context, TranslationBase.of(context) .searchPatientName), ), ), SizedBox( height: 10.0, ), if (int.parse(patientType) == 7) Container( padding: EdgeInsets.all(5), decoration: BoxDecoration( color: Colors.white, border: Border.all( color: Colors.grey), borderRadius: BorderRadius.circular( 10)), child: ClinicList( clinicId: clinicId, onClinicChange: (newValue) { clinicId = newValue; changeClinic( newValue, context, model); }, )), Padding( padding: EdgeInsets.only( top: MediaQuery.of(context) .size .height * 0.03), // child: _locationBar(context) child: SERVICES_PATIANT2[ int.parse(patientType)] == "patientArrivalList" ? _locationBar(context, model) : Container(), ), SizedBox( height: 10.0, ), Container( child: (responseModelList.length > 0) ? Column( // mainAxisAlignment: MainAxisAlignment.center, children: responseModelList .map((PatiantInformtion item) { return PatientCard( patientInfo: item, patientType: patientType, arrivalType: arrivalType, onTap: () { Navigator.of(context) .pushNamed( PATIENTS_PROFILE, arguments: { "patient": item, "patientType": patientType, "from": patient .getFrom, "to": patient .getTo, "isSearch": isSearch, "arrivalType": arrivalType, }); }, ); }).toList(), ) : Center( child: Column( crossAxisAlignment: CrossAxisAlignment .center, children: [ SizedBox( height: 100, ), Image.asset( 'assets/images/no-data.png'), Padding( padding: const EdgeInsets .all(8.0), child: AppText( TranslationBase.of( context) .youDontHaveAnyPatient), ) ], ), )), ], ), ) ], ), ), ), ); } changeClinic(clinicId, BuildContext context, model) async { GifLoaderDialogUtils.showMyDialog(context); Map profile = await sharedPref.getObj(DOCTOR_PROFILE); DoctorProfileModel doctorProfile = new DoctorProfileModel.fromJson(profile); ProfileReqModel docInfo = new ProfileReqModel( doctorID: doctorProfile.doctorID, clinicID: clinicId, license: true, projectID: doctorProfile.projectID, tokenID: '', languageID: 2); authProvider .getDocProfiles(docInfo.toJson(), allowChangeProfile: false) .then((profileList) async { print(profileList['DoctorProfileList'][0]); int val2 = int.parse(patientType); GetPatientArrivalListRequestModel getPatientArrivalListRequestModel = GetPatientArrivalListRequestModel( from: patient.From, to: patient.To, clinicID: profileList['DoctorProfileList'][0]['ClinicID'], doctorID: profileList['DoctorProfileList'][0]['DoctorID'].toString(), patientMRN: patient.getPatientID, pageIndex: 0, pageSize: 0); model .getPatientList( getPatientArrivalListRequestModel.toJson(), patientType) .then((res) { setState(() { if (res != null && res['MessageStatus'] == 1) { if (val2 == 7) { if (res[SERVICES_PATIANT2[val2]] == null) { _isError = true; _isLoading = false; this.error = error.toString(); } else { var localList = []; if (res["patientArrivalList"]["entityList"] == null) { res["patientArrivalList"]["entityList"] = []; } res["patientArrivalList"]["entityList"].forEach((v) { Map mergedPatient = { ...v, ...v["patientDetails"] }; localList.add(mergedPatient); }); lItems = localList; } } parsed = lItems; responseModelList = new ModelResponse.fromJson(parsed).list; responseModelList.sort((a, b) { DateTime now = DateTime.now(); DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm"); String formattedDate = DateFormat('yyyy-MM-dd ' + a.startTime).format(now); DateTime dateTimeA = dateFormat.parse(formattedDate); String formattedDateB = DateFormat('yyyy-MM-dd ' + b.startTime).format(now); DateTime dateTimeB = dateFormat.parse(formattedDateB); var adate = dateTimeA; //a.startTime; var bdate = dateTimeB; return adate.compareTo(bdate); }); responseModelList2 = responseModelList; _isError = false; } else { _isError = true; error = model.error ?? res['ErrorEndUserMessage'] ?? res['ErrorMessage']; } _isLoading = false; }); GifLoaderDialogUtils.hideDialog(context); }).catchError((error) { Helpers.showErrorToast(error.toString()); GifLoaderDialogUtils.hideDialog(context); }); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); Helpers.showErrorToast(err); }); } InputDecoration buildInputDecoration(BuildContext context, hint) { return InputDecoration( suffixIcon: IconButton( icon: Icon(DoctorApp.search_patient), color: Colors.grey, onPressed: () {}, iconSize: 30, ), filled: true, fillColor: Colors.white, hintText: hint, hintStyle: TextStyle(fontSize: 1.66 * SizeConfig.textMultiplier), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: HexColor('#CCCCCC')), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: Colors.grey), //), )); } Widget _locationBar(BuildContext _context, model) { return Container( height: MediaQuery.of(context).size.height * 0.0619, width: SizeConfig.screenWidth * 0.94, decoration: BoxDecoration( color: Color(0Xffffffff), borderRadius: BorderRadius.circular(12.5), // border: Border.all( // width: 0.5, // ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: _locations.map((item) { bool _isActive = _locations[_activeLocation] == item ? true : false; return Column(mainAxisSize: MainAxisSize.min, children: [ InkWell( child: Center( child: Container( height: MediaQuery.of(context).size.height * 0.058, width: SizeConfig.screenWidth * 0.2334, decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomRight: Radius.circular(12.5), topRight: Radius.circular(12.5), topLeft: Radius.circular(9.5), bottomLeft: Radius.circular(9.5)), color: _isActive ? HexColor("#B8382B") : Colors.white, ), child: Center( child: Text( item, style: TextStyle( fontSize: 12, color: _isActive ? Colors.white : Colors.black, //Colors.black, fontWeight: FontWeight.normal, ), ), )), ), onTap: () { //filterBooking(item.toString()); setState(() { _activeLocation = _locations.indexOf(item); }); filterPatient(item.toString(), model); }), _isActive ? Container( decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomRight: Radius.circular(10), topRight: Radius.circular(10)), color: Colors.white), alignment: Alignment.center, height: 1, width: SizeConfig.screenWidth * 0.23, ) : Container() ]); }).toList(), ), ); } filterPatient(item, model) { if (item == 'Tomorrow') { _patientSearchFormValues.To = DateUtils.convertDateToFormat( DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1), 'yyyy-MM-dd'); _patientSearchFormValues.From = DateUtils.convertDateToFormat( DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1), 'yyyy-MM-dd'); } else if (item == 'Next Week') { _patientSearchFormValues.From = DateUtils.convertDateToFormat( DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1), 'yyyy-MM-dd'); _patientSearchFormValues.To = DateUtils.convertDateToFormat( DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 6), 'yyyy-MM-dd'); } else { _patientSearchFormValues.From = DateUtils.convertDateToFormat( DateTime( DateTime.now().year, DateTime.now().month, DateTime.now().day), 'yyyy-MM-dd'); _patientSearchFormValues.To = DateUtils.convertDateToFormat( DateTime( DateTime.now().year, DateTime.now().month, DateTime.now().day), 'yyyy-MM-dd'); } searchPatient(model); // Navigator.of(context).pop(); // Navigator.of(context).pushNamed(PATIENTS, arguments: { // "patientSearchForm": _patientSearchFormValues, // "selectedType": "7", // "arrivalType": "1", // "activeFilter": _activeLocation // }); } searchPatient(model) { GifLoaderDialogUtils.showMyDialog(context); int val2 = int.parse(patientType); GetPatientArrivalListRequestModel getPatientArrivalListRequestModel; if (val2 == 7) { getPatientArrivalListRequestModel = GetPatientArrivalListRequestModel( from: _patientSearchFormValues.From, to: _patientSearchFormValues.To, pageIndex: 0, pageSize: 0, patientMRN: patient.getPatientID); } model .getPatientList( val2 == 7 ? getPatientArrivalListRequestModel.toJson() : patient, patientType, isView: isView) .then((res) { setState(() { GifLoaderDialogUtils.hideDialog(context); if (res != null && res['MessageStatus'] == 1) { if (val2 == 7) { if (res[SERVICES_PATIANT2[val2]] == null) { _isError = true; _isLoading = false; this.error = error.toString(); } else { var localList = []; if (res["patientArrivalList"]["entityList"] == null) { res["patientArrivalList"]["entityList"] = []; } res["patientArrivalList"]["entityList"].forEach((v) { Map mergedPatient = { ...v, ...v["patientDetails"] }; localList.add(mergedPatient); }); lItems = localList; } } else { if (isView == false && val2 == 1) { lItems = res['GetPatientFileInformation_PRMList'] .where((i) => i['PatientTypeDescription'] == 'Permanent File') .toList(); } else { lItems = res[SERVICES_PATIANT2[val2]]; } } parsed = lItems; responseModelList = new ModelResponse.fromJson(parsed).list; if (val2 == 7) { responseModelList.sort((a, b) { if (b.startTime != null && b.startTime != null) { try { DateTime now = DateTime.now(); DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm"); String formattedDate = DateFormat('yyyy-MM-dd ' + a.startTime).format(now); DateTime dateTimeA = dateFormat.parse(formattedDate); String formattedDateB = DateFormat('yyyy-MM-dd ' + b.startTime).format(now); DateTime dateTimeB = dateFormat.parse(formattedDateB); var adate = dateTimeA; //a.startTime; var bdate = dateTimeB; return adate.compareTo(bdate); } on Exception catch (_) { print('never reached'); var adate = a.startTime; //a.startTime; var bdate = b.startTime; return adate.compareTo(bdate); } } else { var adate = convertDateFormat(a.appointmentDate); var bdate = convertDateFormat(b.appointmentDate); return bdate.compareTo(adate); } }); } responseModelList2 = responseModelList; _isError = false; } else { _isError = true; error = model.error ?? res['ErrorEndUserMessage'] ?? res['ErrorMessage']; } _isLoading = false; }); }).catchError((error) { GifLoaderDialogUtils.hideDialog(context); setState(() { _isError = true; _isLoading = false; this.error = error.toString(); }); }); } }