You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
417 lines
18 KiB
Dart
417 lines
18 KiB
Dart
import 'package:doctor_app_flutter/config/size_config.dart';
|
|
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
|
|
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
|
|
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
|
|
import 'package:doctor_app_flutter/locator.dart';
|
|
import 'package:doctor_app_flutter/models/patient/patiant_info_model.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/dr_app_toast_msg.dart';
|
|
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
|
import 'package:doctor_app_flutter/widgets/patients/patient-referral-item-widget.dart';
|
|
import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.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/dialogs/dailog-list-select.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:hexcolor/hexcolor.dart';
|
|
|
|
class PatientMakeReferralScreen extends StatefulWidget {
|
|
// previous design page is: ReferPatientScreen
|
|
@override
|
|
_PatientMakeReferralScreenState createState() => _PatientMakeReferralScreenState();
|
|
}
|
|
|
|
class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
|
|
PatiantInformtion patient;
|
|
List<dynamic> referToList;
|
|
dynamic _referTo;
|
|
dynamic _selectedBranch;
|
|
dynamic _selectedClinic;
|
|
dynamic _selectedDoctor;
|
|
DateTime appointmentDate;
|
|
final _remarksController = TextEditingController();
|
|
|
|
String branchError = null;
|
|
String hospitalError = null;
|
|
String clinicError = null;
|
|
String doctorError = null;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
appointmentDate = DateTime.now();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
|
|
patient = routeArgs['patient'];
|
|
String patientType = routeArgs['patientType'];
|
|
String arrivalType = routeArgs['arrivalType'];
|
|
|
|
referToList = List();
|
|
dynamic sameBranch = {"id": 1, "name": TranslationBase.of(context).sameBranch};
|
|
dynamic otherBranch = {"id": 2, "name": TranslationBase.of(context).otherBranch};
|
|
referToList.add(sameBranch);
|
|
referToList.add(otherBranch);
|
|
|
|
final screenSize = MediaQuery.of(context).size;
|
|
|
|
return BaseView<PatientReferralViewModel>(
|
|
onModelReady: (model) => model.getPatientReferral(patient),
|
|
builder: (_, model, w) => AppScaffold(
|
|
baseViewModel: model,
|
|
appBarTitle: TranslationBase.of(context).referPatient,
|
|
isShowAppBar: true,
|
|
appBar: PatientProfileAppBar(patient),
|
|
body: SingleChildScrollView(
|
|
child: Container(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: [
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
/*PatientProfileHeaderNewDesign(
|
|
patient, patientType, arrivalType),*/
|
|
Container(
|
|
margin: EdgeInsets.all(16.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
AppText(
|
|
"${TranslationBase.of(context).refer}",
|
|
fontFamily: 'Poppins',
|
|
fontSize: SizeConfig.textMultiplier * 1.6,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
AppText(
|
|
"${TranslationBase.of(context).patient}",
|
|
fontFamily: 'Poppins',
|
|
fontSize: SizeConfig.textMultiplier * 3,
|
|
fontWeight: FontWeight.bold,
|
|
)
|
|
],
|
|
),
|
|
),
|
|
model.patientReferral.length == 0
|
|
? referralForm(model, screenSize)
|
|
: PatientReferralItemWidget(
|
|
referralStatus: model.patientReferral[model.patientReferral.length - 1].referralStatus,
|
|
patientName: model.patientReferral[model.patientReferral.length - 1].patientName,
|
|
patientGender:
|
|
model.patientReferral[model.patientReferral.length - 1].patientDetails.gender,
|
|
referredDate:
|
|
model.patientReferral[model.patientReferral.length - 1].referredOn.split(" ")[0],
|
|
referredTime:
|
|
model.patientReferral[model.patientReferral.length - 1].referredOn.split(" ")[1],
|
|
patientID: "${model.patientReferral[model.patientReferral.length - 1].patientID}",
|
|
isSameBranch:
|
|
model.patientReferral[model.patientReferral.length - 1].isReferralDoctorSameBranch,
|
|
isReferral: true,
|
|
remark: model.patientReferral[model.patientReferral.length - 1].remarksFromSource,
|
|
nationality:
|
|
model.patientReferral[model.patientReferral.length - 1].patientDetails.nationalityName,
|
|
nationalityFlag: model.patientReferral[model.patientReferral.length - 1].nationalityFlagUrl,
|
|
doctorAvatar: model.patientReferral[model.patientReferral.length - 1].doctorImageUrl,
|
|
referralDoctorName:
|
|
model.patientReferral[model.patientReferral.length - 1].referredByDoctorInfo,
|
|
clinicDescription: null,
|
|
),
|
|
],
|
|
),
|
|
if (model.patientReferral.length == 0)
|
|
Container(
|
|
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
child: AppButton(
|
|
title: TranslationBase.of(context).refer,
|
|
fontWeight: FontWeight.w700,
|
|
color: HexColor("#359846"),
|
|
onPressed: () async {
|
|
setState(() async {
|
|
await locator<AnalyticsService>().logEvent(
|
|
eventCategory: "Refer Patient",
|
|
eventAction: "Submit Refer",
|
|
);
|
|
if (_referTo == null) {
|
|
branchError = TranslationBase.of(context).fieldRequired;
|
|
} else {
|
|
branchError = null;
|
|
}
|
|
if (_selectedBranch == null) {
|
|
hospitalError = TranslationBase.of(context).fieldRequired;
|
|
} else {
|
|
hospitalError = null;
|
|
}
|
|
if (_selectedClinic == null) {
|
|
clinicError = TranslationBase.of(context).fieldRequired;
|
|
} else {
|
|
clinicError = null;
|
|
}
|
|
if (_selectedDoctor == null) {
|
|
doctorError = TranslationBase.of(context).fieldRequired;
|
|
} else {
|
|
doctorError = null;
|
|
}
|
|
});
|
|
if (appointmentDate == null ||
|
|
_selectedBranch == null ||
|
|
_selectedClinic == null ||
|
|
_selectedDoctor == null ||
|
|
_remarksController.text == null) return;
|
|
model
|
|
.makeReferral(patient, appointmentDate.toIso8601String(), _selectedBranch['facilityId'],
|
|
_selectedClinic['ClinicID'], _selectedDoctor['DoctorID'], _remarksController.text)
|
|
.then((_) {
|
|
DrAppToastMsg.showSuccesToast(TranslationBase.of(context).referralSuccessMsg);
|
|
Navigator.pop(context);
|
|
});
|
|
},
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget referralForm(PatientReferralViewModel model, Size screenSize) {
|
|
return Container(
|
|
margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
AppTextFieldCustom(
|
|
height: screenSize.height * 0.075,
|
|
hintText: TranslationBase.of(context).branch,
|
|
dropDownText: _referTo != null ? _referTo['name'] : null,
|
|
enabled: false,
|
|
isTextFieldHasSuffix: true,
|
|
validationError: branchError,
|
|
onClick: referToList != null
|
|
? () {
|
|
ListSelectDialog dialog = ListSelectDialog(
|
|
list: referToList,
|
|
attributeName: 'name',
|
|
attributeValueId: 'id',
|
|
okText: TranslationBase.of(context).ok,
|
|
okFunction: (selectedValue) {
|
|
setState(() {
|
|
_referTo = selectedValue;
|
|
_selectedBranch = null;
|
|
_selectedClinic = null;
|
|
_selectedDoctor = null;
|
|
model.getDoctorBranch().then((value) async {
|
|
_selectedBranch = value;
|
|
if (_referTo['id'] == 1) {
|
|
GifLoaderDialogUtils.showMyDialog(context);
|
|
await model
|
|
.getClinics(_selectedBranch['facilityId'])
|
|
.then((_) => GifLoaderDialogUtils.hideDialog(context));
|
|
if (model.state == ViewState.ErrorLocal) {
|
|
DrAppToastMsg.showErrorToast(model.error);
|
|
}
|
|
} else {
|
|
_selectedBranch = null;
|
|
}
|
|
});
|
|
});
|
|
},
|
|
);
|
|
showDialog(
|
|
barrierDismissible: false,
|
|
context: context,
|
|
builder: (BuildContext context) {
|
|
return dialog;
|
|
},
|
|
);
|
|
}
|
|
: null,
|
|
),
|
|
SizedBox(
|
|
height: 10,
|
|
),
|
|
AppTextFieldCustom(
|
|
height: screenSize.height * 0.075,
|
|
hintText: TranslationBase.of(context).hospital,
|
|
dropDownText: _selectedBranch != null ? _selectedBranch['facilityName'] : null,
|
|
enabled: false,
|
|
isTextFieldHasSuffix: true,
|
|
validationError: hospitalError,
|
|
onClick:
|
|
model.branchesList != null && model.branchesList.length > 0 && _referTo != null && _referTo['id'] == 2
|
|
? () {
|
|
ListSelectDialog dialog = ListSelectDialog(
|
|
list: model.branchesList,
|
|
attributeName: 'facilityName',
|
|
attributeValueId: 'facilityId',
|
|
okText: TranslationBase.of(context).ok,
|
|
okFunction: (selectedValue) {
|
|
setState(() async {
|
|
_selectedBranch = selectedValue;
|
|
_selectedClinic = null;
|
|
_selectedDoctor = null;
|
|
GifLoaderDialogUtils.showMyDialog(context);
|
|
await model
|
|
.getClinics(_selectedBranch['facilityId'])
|
|
.then((_) => GifLoaderDialogUtils.hideDialog(context));
|
|
if (model.state == ViewState.ErrorLocal) {
|
|
DrAppToastMsg.showErrorToast(model.error);
|
|
}
|
|
});
|
|
},
|
|
);
|
|
showDialog(
|
|
barrierDismissible: false,
|
|
context: context,
|
|
builder: (BuildContext context) {
|
|
return dialog;
|
|
},
|
|
);
|
|
}
|
|
: null,
|
|
),
|
|
SizedBox(
|
|
height: 10,
|
|
),
|
|
AppTextFieldCustom(
|
|
height: screenSize.height * 0.075,
|
|
hintText: TranslationBase.of(context).clinic,
|
|
dropDownText: _selectedClinic != null ? _selectedClinic['ClinicDescription'] : null,
|
|
enabled: false,
|
|
isTextFieldHasSuffix: true,
|
|
validationError: clinicError,
|
|
onClick: _selectedBranch != null && model.clinicsList != null && model.clinicsList.length > 0
|
|
? () {
|
|
ListSelectDialog dialog = ListSelectDialog(
|
|
list: model.clinicsList,
|
|
attributeName: 'ClinicDescription',
|
|
attributeValueId: 'ClinicID',
|
|
usingSearch: true,
|
|
hintSearchText: TranslationBase.of(context).clinicSearch,
|
|
okText: TranslationBase.of(context).ok,
|
|
okFunction: (selectedValue) {
|
|
setState(() async {
|
|
_selectedDoctor = null;
|
|
_selectedClinic = selectedValue;
|
|
GifLoaderDialogUtils.showMyDialog(context);
|
|
await model
|
|
.getClinicDoctors(patient, _selectedClinic['ClinicID'], _selectedBranch['facilityId'])
|
|
.then((_) => GifLoaderDialogUtils.hideDialog(context));
|
|
if (model.state == ViewState.ErrorLocal) {
|
|
DrAppToastMsg.showErrorToast(model.error);
|
|
}
|
|
});
|
|
},
|
|
);
|
|
showDialog(
|
|
barrierDismissible: false,
|
|
context: context,
|
|
builder: (BuildContext context) {
|
|
return dialog;
|
|
},
|
|
);
|
|
}
|
|
: null,
|
|
),
|
|
SizedBox(
|
|
height: 10,
|
|
),
|
|
AppTextFieldCustom(
|
|
height: screenSize.height * 0.075,
|
|
hintText: TranslationBase.of(context).doctor,
|
|
dropDownText: _selectedDoctor != null ? _selectedDoctor['Name'] : null,
|
|
enabled: false,
|
|
isTextFieldHasSuffix: true,
|
|
validationError: doctorError,
|
|
onClick: _selectedClinic != null && model.doctorsList != null && model.doctorsList.length > 0
|
|
? () {
|
|
ListSelectDialog dialog = ListSelectDialog(
|
|
list: model.doctorsList,
|
|
attributeName: 'Name',
|
|
attributeValueId: 'DoctorID',
|
|
usingSearch: true,
|
|
hintSearchText: TranslationBase.of(context).doctorSearch,
|
|
okText: TranslationBase.of(context).ok,
|
|
okFunction: (selectedValue) {
|
|
setState(() {
|
|
_selectedDoctor = selectedValue;
|
|
});
|
|
},
|
|
);
|
|
showDialog(
|
|
barrierDismissible: false,
|
|
context: context,
|
|
builder: (BuildContext context) {
|
|
return dialog;
|
|
},
|
|
);
|
|
}
|
|
: () {
|
|
if (_selectedClinic == null) {
|
|
DrAppToastMsg.showErrorToast("You need to select a clinic first");
|
|
} else if (model.doctorsList == null || model.doctorsList.length == 0) {
|
|
DrAppToastMsg.showErrorToast("There is no doctors for this clinic");
|
|
}
|
|
},
|
|
),
|
|
SizedBox(
|
|
height: 10,
|
|
),
|
|
AppTextFieldCustom(
|
|
height: screenSize.height * 0.075,
|
|
hintText: TranslationBase.of(context).date,
|
|
dropDownText:
|
|
appointmentDate != null ? "${AppDateUtils.convertDateToFormat(appointmentDate, "yyyy-MM-dd")}" : null,
|
|
enabled: false,
|
|
isTextFieldHasSuffix: true,
|
|
suffixIcon: IconButton(
|
|
icon: Icon(
|
|
Icons.calendar_today,
|
|
color: Colors.black,
|
|
)),
|
|
onClick: () {
|
|
_selectDate(context, model);
|
|
},
|
|
),
|
|
SizedBox(
|
|
height: 10,
|
|
),
|
|
AppTextFieldCustom(
|
|
hintText: TranslationBase.of(context).dietTypeRemarks,
|
|
controller: _remarksController,
|
|
inputType: TextInputType.multiline,
|
|
minLines: 4,
|
|
maxLines: 6,
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
_selectDate(BuildContext context, PatientReferralViewModel model) async {
|
|
// https://medium.com/flutter-community/a-deep-dive-into-datepicker-in-flutter-37e84f7d8d6c good reference
|
|
// https://stackoverflow.com/a/63147062/6246772 to customize a date picker
|
|
final DateTime picked = await showDatePicker(
|
|
context: context,
|
|
initialDate: appointmentDate,
|
|
firstDate: DateTime.now().add(Duration(hours: 2)),
|
|
lastDate: DateTime(2040),
|
|
initialEntryMode: DatePickerEntryMode.calendar,
|
|
);
|
|
if (picked != null && picked != appointmentDate) {
|
|
setState(() {
|
|
appointmentDate = picked;
|
|
});
|
|
}
|
|
}
|
|
}
|