Merge branch 'live_care_patient' into 'development'

Live care patient

See merge request Cloud_Solution/doctor_app_flutter!682
merge-requests/683/merge
Mohammad Aljammal 5 years ago
commit ef175ea224

@ -328,4 +328,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 649616dc336b3659ac6b2b25159d8e488e042b69
COCOAPODS: 1.10.1
COCOAPODS: 1.10.0.rc.1

@ -297,6 +297,7 @@ const GET_PROCEDURE_TEMPLETE =
const GET_PROCEDURE_TEMPLETE_DETAILS =
"Services/Doctors.svc/REST/DAPP_ProcedureTemplateDetailsGet";
const GET_PENDING_PATIENT_ER_FOR_DOCTOR_APP ='Services/DoctorApplication.svc/REST/GetPendingPatientERForDoctorApp';
const DOCTOR_CHECK_HAS_LIVE_CARE = "Services/DoctorApplication.svc/REST/CheckDoctorHasLiveCare";

@ -0,0 +1,22 @@
class PendingPatientERForDoctorAppRequestModel {
bool outSA;
int doctorID;
String sErServiceID;
PendingPatientERForDoctorAppRequestModel(
{this.outSA, this.doctorID, this.sErServiceID});
PendingPatientERForDoctorAppRequestModel.fromJson(Map<String, dynamic> json) {
outSA = json['OutSA'];
doctorID = json['DoctorID'];
sErServiceID = json['SErServiceID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['OutSA'] = this.outSA;
data['DoctorID'] = this.doctorID;
data['SErServiceID'] = this.sErServiceID;
return data;
}
}

@ -1,5 +1,28 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/model/live_care/PendingPatientERForDoctorAppRequestModel.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
class LiveCarePatientServices extends BaseService{
List<PatiantInformtion> _patientList = [];
List<PatiantInformtion> get patientList => _patientList;
Future getPendingPatientERForDoctorApp(PendingPatientERForDoctorAppRequestModel pendingPatientERForDoctorAppRequestModel) async{
hasError = false;
await baseAppClient.post(
GET_PENDING_PATIENT_ER_FOR_DOCTOR_APP,
onSuccess: (dynamic response, int statusCode) {
_patientList.clear();
response['List_PendingPatientList'].forEach((v) {
_patientList.add(PatiantInformtion.fromJson(v));
});
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
body: pendingPatientERForDoctorAppRequestModel.toJson(),
);
}
}

@ -1,6 +1,59 @@
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/live_care/PendingPatientERForDoctorAppRequestModel.dart';
import 'package:doctor_app_flutter/core/service/home/dasboard_service.dart';
import 'package:doctor_app_flutter/core/service/patient/LiveCarePatientServices.dart';
import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import '../../locator.dart';
class LiveCarePatientViewModel extends BaseViewModel {
getPendingPatientERForDoctorApp() async {}
List<PatiantInformtion> filterData = [];
LiveCarePatientServices _liveCarePatientServices =
locator<LiveCarePatientServices>();
DashboardService _dashboardService =
locator<DashboardService>();
getPendingPatientERForDoctorApp() async {
setState(ViewState.BusyLocal);
PendingPatientERForDoctorAppRequestModel
pendingPatientERForDoctorAppRequestModel =
PendingPatientERForDoctorAppRequestModel(sErServiceID:_dashboardService.sServiceID, outSA: false);
await _liveCarePatientServices
.getPendingPatientERForDoctorApp(pendingPatientERForDoctorAppRequestModel);
if (_liveCarePatientServices.hasError) {
error = _liveCarePatientServices.error;
setState(ViewState.ErrorLocal);
} else {
filterData = _liveCarePatientServices.patientList;
setState(ViewState.Idle);
}
}
searchData(String str) {
var strExist= str.length > 0 ? true : false;
if (strExist) {
filterData = [];
for (var i = 0; i < _liveCarePatientServices.patientList.length; i++) {
String fullName =
_liveCarePatientServices.patientList[i].fullName.toUpperCase();
String patientID =
_liveCarePatientServices.patientList[i].patientId.toString();
String mobile =
_liveCarePatientServices.patientList[i].mobileNumber.toUpperCase();
if (fullName.contains(str.toUpperCase()) ||
patientID.contains(str)|| mobile.contains(str)) {
filterData.add(_liveCarePatientServices.patientList[i]);
}
}
notifyListeners();
} else {
filterData = _liveCarePatientServices.patientList;
notifyListeners();
}
}
}

@ -130,7 +130,7 @@ class PatiantInformtion {
projectId: json["ProjectID"] ?? json["projectID"],
clinicId: json["ClinicID"] ?? json["clinicID"],
doctorId: json["DoctorID"] ?? json["doctorID"],
patientId: json["PatientID"] ??
patientId: json["PatientID"]!= null ?json["PatientID"] is String ? int.parse(json["PatientID"]):json["PatientID"]:
json["patientID"] ??
json['patientMRN'] ??
json['PatientMRN'],
@ -142,10 +142,10 @@ class PatiantInformtion {
firstNameN: json["FirstNameN"] ?? json["firstNameN"],
middleNameN: json["MiddleNameN"] ?? json["middleNameN"],
lastNameN: json["LastNameN"] ?? json["lastNameN"],
gender: json["Gender"] ?? json["gender"],
fullName: json["fullName"] ?? json["fullName"],
fullNameN: json["fullNameN"] ?? json["fullNameN"],
dateofBirth: json["DateofBirth"] ?? json["dob"],
gender: json["Gender"]!= null? json["Gender"]is String ?int.parse(json["Gender"]):json["Gender"] :json["gender"],
fullName: json["fullName"] ?? json["fullName"]??json["PatientName"],
fullNameN: json["fullNameN"] ?? json["fullNameN"]??json["PatientName"],
dateofBirth: json["DateofBirth"] ?? json["dob"]??json['DateOfBirth'],
nationalityId: json["NationalityID"] ?? json["nationalityID"],
mobileNumber: json["MobileNumber"] ?? json["mobileNumber"],
emailAddress: json["EmailAddress"] ?? json["emailAddress"],

@ -13,6 +13,7 @@ import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/home/dashboard_slider-item-widget.dart';
import 'package:doctor_app_flutter/screens/home/dashboard_swipe_widget.dart';
import 'package:doctor_app_flutter/screens/home/home_patient_card.dart';
import 'package:doctor_app_flutter/screens/live_care/live_care_patient_screen.dart';
import 'package:doctor_app_flutter/screens/medicine/medicine_search_screen.dart';
import 'package:doctor_app_flutter/screens/patients/PatientsInPatientScreen.dart';
import 'package:doctor_app_flutter/screens/patients/out_patient/out_patient_screen.dart';
@ -339,7 +340,7 @@ class _HomeScreenState extends State<HomeScreen> {
Navigator.push(
context,
FadePage(
page: PatientInPatientScreen(),
page: LiveCarePatientScreen(),
),
);
},

@ -1,59 +0,0 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart';
import 'package:doctor_app_flutter/screens/base/base_view.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:flutter/material.dart';
class LiveCarePatientScreen extends StatefulWidget {
@override
_LiveCarePatientScreenState createState() => _LiveCarePatientScreenState();
}
class _LiveCarePatientScreenState extends State<LiveCarePatientScreen> {
@override
Widget build(BuildContext context) {
return BaseView<LiveCarePatientViewModel>(
onModelReady: (model) async {},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: false,
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.only(left: 0, right: 5, bottom: 5, top: 5),
decoration: BoxDecoration(
color: Colors.white,
),
child: Container(
padding: EdgeInsets.only(left: 10, right: 10, bottom: 10),
margin: EdgeInsets.only(top: 50),
child: Row(children: [
IconButton(
icon: Icon(Icons.arrow_back_ios),
color: Colors.black, //Colors.black,
onPressed: () => Navigator.pop(context),
),
Expanded(
child: AppText(
"Live Care Patients",
fontSize: SizeConfig.textMultiplier * 2.8,
fontWeight: FontWeight.bold,
color: Color(0xFF2B353E),
),
),
]),
),
),
Expanded(
child: Column(
children: [],
),
),
],
),
),
);
}
}

@ -0,0 +1,160 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/screens/base/base_view.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/shared/app_loader_widget.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/errors/error_message.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart';
import 'package:flutter/material.dart';
import '../../routes.dart';
class LiveCarePatientScreen extends StatefulWidget {
@override
_LiveCarePatientScreenState createState() => _LiveCarePatientScreenState();
}
class _LiveCarePatientScreenState extends State<LiveCarePatientScreen> {
final _controller = TextEditingController();
@override
Widget build(BuildContext context) {
return BaseView<LiveCarePatientViewModel>(
onModelReady: (model) async {
await model.getPendingPatientERForDoctorApp();
},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: false,
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.only(left: 0, right: 5, bottom: 5, top: 5),
decoration: BoxDecoration(
color: Colors.white,
),
child: Container(
padding: EdgeInsets.only(left: 10, right: 10, bottom: 10),
margin: EdgeInsets.only(top: 50),
child: Row(children: [
IconButton(
icon: Icon(Icons.arrow_back_ios),
color: Colors.black, //Colors.black,
onPressed: () => Navigator.pop(context),
),
Expanded(
child: AppText(
"Live Care Patients",
fontSize: SizeConfig.textMultiplier * 2.8,
fontWeight: FontWeight.bold,
color: Color(0xFF2B353E),
),
),
]),
),
),
SizedBox(height: 20,),
Center(
child: FractionallySizedBox(
widthFactor: .9,
child: Container(
width: double.maxFinite,
height: 75,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(6.0)),
border: Border.all(
width: 1.0,
color: Color(0xffCCCCCC),
),
color: Colors.white),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
left: 10, top: 10),
child: AppText(
TranslationBase.of(
context)
.searchPatientName,
fontSize: 13,
)),
AppTextFormField(
// focusNode: focusProject,
controller: _controller,
borderColor: Colors.white,
prefix: IconButton(
icon: Icon(
DoctorApp.filter_1,
color: Colors.black,
),
iconSize: 20,
padding:
EdgeInsets.only(
bottom: 30),
),
onChanged: (String str) {
model.searchData(str);
}),
])),
),
),
model.state == ViewState.Idle
? Expanded(
child: Container(
child: model.filterData.isEmpty
? Center(
child: ErrorMessage(
error: TranslationBase.of(context)
.youDontHaveAnyPatient,
),
)
: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: model.filterData.length,
itemBuilder: (BuildContext ctxt, int index) {
return Padding(
padding: EdgeInsets.all(8.0),
child: PatientCard(
patientInfo: model.filterData[index],
patientType: "0",
arrivalType: "0",
isFromSearch: false,
isInpatient: false,
isFromLiveCare:true,
onTap: () {
// TODO change the parameter to daynamic
Navigator.of(context).pushNamed(
PATIENTS_PROFILE,
arguments: {
"patient": model.filterData[index],
"patientType": "0",
"isSearch": false,
"isInpatient": false,
"arrivalType": "0",
"isSearchAndOut": false,
"isFromLiveCare":true
});
},
// isFromSearch: widget.isSearch,
),
);
})),
) : Expanded(
child: AppLoaderWidget(containerColor: Colors.transparent,)),
],
),
),
);
}
}

@ -97,18 +97,16 @@ class _PatientProfileScreenState extends State<PatientProfileScreen>
Column(
children: [
PatientProfileHeaderNewDesignAppBar(
patient,
arrivalType ?? '0',
patientType,
isInpatient: isInpatient,
height: (patient.patientStatusType != null &&
patient.patientStatusType == 43)
? 210
: isDischargedPatient
? 240
: 0,
isDischargedPatient:isDischargedPatient
),
patient, arrivalType ?? '0', patientType,
isInpatient: isInpatient,
isFromLiveCare: isFromLiveCare,
height: (patient.patientStatusType != null &&
patient.patientStatusType == 43)
? 210
: isDischargedPatient
? 240
: 0,
isDischargedPatient: isDischargedPatient),
Container(
height: !isSearchAndOut
? isDischargedPatient

@ -305,9 +305,14 @@ class AppDateUtils {
return DateFormat('hh:mm a').format(dateTime);
}
static String getAgeByBirthday(dynamic birthday, BuildContext context) {
static String getAgeByBirthday(String birthOfDate, BuildContext context, { bool isServerFormat = true}) {
// https://leechy.dev/calculate-dates-diff-in-dart
DateTime birthDate = AppDateUtils.getDateTimeFromServerFormat(birthday);
DateTime birthDate;
if(birthOfDate.contains("/Date")) {
birthDate = AppDateUtils.getDateTimeFromServerFormat(birthOfDate);
}else{
birthDate = DateTime.parse(birthOfDate);
}
final now = DateTime.now();
int years = now.year - birthDate.year;
int months = now.month - birthDate.month;

@ -1,4 +1,3 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
@ -9,7 +8,6 @@ import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/card_with_bg_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class PatientCard extends StatelessWidget {
final PatiantInformtion patientInfo;
@ -19,6 +17,7 @@ class PatientCard extends StatelessWidget {
final bool isInpatient;
final bool isMyPatient;
final bool isFromSearch;
final bool isFromLiveCare;
const PatientCard(
{Key key,
@ -26,8 +25,12 @@ class PatientCard extends StatelessWidget {
this.onTap,
this.patientType,
this.arrivalType,
this.isInpatient, this.isMyPatient = false, this.isFromSearch = false})
this.isInpatient,
this.isMyPatient = false,
this.isFromSearch = false,
this.isFromLiveCare = false})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
@ -43,7 +46,7 @@ class PatientCard extends StatelessWidget {
marginLeft: (!isMyPatient && isInpatient)?0:10,
marginSymmetric:isFromSearch ? 10 : 0.0,
hasBorder: false,
bgColor:(isMyPatient && !isFromSearch)?Colors.green[500]: patientInfo.patientStatusType == 43
bgColor:isFromLiveCare?Colors.white:(isMyPatient && !isFromSearch)?Colors.green[500]: patientInfo.patientStatusType == 43
? Colors.green[500]
:isMyPatient? Colors.green[500]:isInpatient?Colors.white:!isFromSearch?Colors.red[800]:Colors.white,
widget: Container(
@ -103,7 +106,7 @@ class PatientCard extends StatelessWidget {
fontSize: 10,
),
],
): !isFromSearch && patientInfo.patientStatusType==null ? Row(
): !isFromSearch&&!isFromLiveCare && patientInfo.patientStatusType==null ? Row(
children: [
AppText(
TranslationBase.of(context).notArrived,
@ -174,7 +177,7 @@ class PatientCard extends StatelessWidget {
Expanded(
// width: MediaQuery.of(context).size.width*0.51,
child: AppText(
(Helpers.capitalize(patientInfo.firstName) +
isFromLiveCare? Helpers.capitalize(patientInfo.fullName): (Helpers.capitalize(patientInfo.firstName) +
" " +
Helpers.capitalize(patientInfo.lastName)),
fontSize: 16,
@ -299,7 +302,7 @@ class PatientCard extends StatelessWidget {
style: TextStyle(fontSize: 12)),
new TextSpan(
text:
"${AppDateUtils.getAgeByBirthday(patientInfo.dateofBirth, context)}",
"${AppDateUtils.getAgeByBirthday(patientInfo.dateofBirth, context, isServerFormat: !isFromLiveCare)}",
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 13)),

@ -19,9 +19,10 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
final double height;
final bool isInpatient;
final bool isDischargedPatient;
final bool isFromLiveCare;
PatientProfileHeaderNewDesignAppBar(
this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient=false, this.isDischargedPatient=false});
this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient=false, this.isDischargedPatient=false, this.isFromLiveCare = false});
@override
Widget build(BuildContext context) {
@ -60,7 +61,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
? (Helpers.capitalize(patient.firstName) +
" " +
Helpers.capitalize(patient.lastName))
: Helpers.capitalize(patient.patientDetails.fullName),
: Helpers.capitalize(patient.fullName??patient.patientDetails.fullName),
fontSize: SizeConfig.textMultiplier * 1.8,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
@ -152,13 +153,13 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
))
: SizedBox(),
if (SERVICES_PATIANT2[int.parse(patientType)] ==
"List_MyOutPatient")
"List_MyOutPatient" && !isFromLiveCare)
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
AppText(
TranslationBase.of(context).appointmentDate +
TranslationBase.of(context).appointmentDate +
" : ",
fontSize: 14,
),
@ -182,14 +183,14 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
SizedBox(
width: 3.5,
),
Container(
child: AppText(
convertDateFormat2(
patient.appointmentDate ?? ''),
fontSize: 1.5 * SizeConfig.textMultiplier,
fontWeight: FontWeight.bold,
Container(
child: AppText(
convertDateFormat2(
patient.appointmentDate ?? ''),
fontSize: 1.5 * SizeConfig.textMultiplier,
fontWeight: FontWeight.bold,
),
),
),
SizedBox(
height: 0.5,
)
@ -260,7 +261,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
style: TextStyle(fontSize: 14)),
new TextSpan(
text:
"${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth??"" : patient.dateofBirth??"", context)}",
"${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth??"" : patient.dateofBirth??"", context,isServerFormat: !isFromLiveCare)}",
style: TextStyle(
fontWeight: FontWeight.w700, fontSize: 14)),
],

@ -24,7 +24,7 @@ class _AppLoaderWidgetState extends State<AppLoaderWidget> {
child: Stack(
children: [
Container(
color: Colors.grey.withOpacity(0.6),
color: widget.containerColor??Colors.grey.withOpacity(0.6),
),
Container(child: GifLoaderContainer(), margin: EdgeInsets.only(
bottom: MediaQuery.of(context).size.height * 0.09))

Loading…
Cancel
Save