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.
523 lines
23 KiB
Dart
523 lines
23 KiB
Dart
import 'package:doctor_app_flutter/config/config.dart';
|
|
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
|
|
import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:hexcolor/hexcolor.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
import '../../../config/size_config.dart';
|
|
import '../../../providers/patients_provider.dart';
|
|
import '../../../util/dr_app_shared_pref.dart';
|
|
import '../../../widgets/shared/app_scaffold_widget.dart';
|
|
import '../../../widgets/shared/app_texts_widget.dart';
|
|
import '../../../widgets/shared/dr_app_circular_progress_Indeicator.dart';
|
|
import '../../../util/extenstions.dart';
|
|
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
|
|
|
DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
|
|
|
|
/*
|
|
*@author: ibrahim albitar
|
|
*@Date:4/6/2020
|
|
*@param:
|
|
*@return:
|
|
*@desc:
|
|
*/
|
|
|
|
class ReferPatientScreen extends StatefulWidget {
|
|
@override
|
|
_ReferPatientState createState() => _ReferPatientState();
|
|
}
|
|
|
|
class _ReferPatientState extends State<ReferPatientScreen> {
|
|
PatientsProvider patientsProv;
|
|
var doctorsList;
|
|
final _remarksController = TextEditingController();
|
|
final _extController = TextEditingController();
|
|
var _isInit = true;
|
|
bool isValid;
|
|
|
|
var clinicId;
|
|
var doctorId;
|
|
var freqId;
|
|
|
|
String _selectedClinic;
|
|
String _selectedDoctor;
|
|
String _selectedReferralFrequancy;
|
|
|
|
int _activePriority = 1;
|
|
|
|
FocusNode myFocusNode;
|
|
|
|
@override
|
|
void didChangeDependencies() {
|
|
super.didChangeDependencies();
|
|
if (_isInit) {
|
|
myFocusNode = FocusNode();
|
|
doctorsList = null;
|
|
patientsProv = Provider.of<PatientsProvider>(context);
|
|
patientsProv.getClinicsList();
|
|
patientsProv.getReferralFrequancyList();
|
|
}
|
|
_isInit = false;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return AppScaffold(
|
|
appBarTitle: TranslationBase.of(context).myReferralPatient,
|
|
body: patientsProv.isLoading
|
|
? DrAppCircularProgressIndeicator()
|
|
: patientsProv.isError
|
|
? DrAppEmbeddedError(error: patientsProv.error)
|
|
: patientsProv.clinicsList == null
|
|
? DrAppEmbeddedError(error: 'Something Wrong!')
|
|
: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
AppText(
|
|
TranslationBase.of(context).clinic,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
RoundedContainer(
|
|
margin: 10,
|
|
showBorder: true,
|
|
raduis: 30,
|
|
borderColor: Color(0xff707070),
|
|
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: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
Expanded(
|
|
// add Expanded to have your dropdown button fill remaining space
|
|
child: DropdownButton(
|
|
isExpanded: true,
|
|
value: _selectedClinic,
|
|
iconSize: 40,
|
|
elevation: 16,
|
|
selectedItemBuilder:
|
|
(BuildContext context) {
|
|
return patientsProv
|
|
.getClinicNameList()
|
|
.map((item) {
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
AppText(
|
|
item,
|
|
fontSize:
|
|
SizeConfig.textMultiplier *
|
|
2.1,
|
|
),
|
|
],
|
|
);
|
|
}).toList();
|
|
},
|
|
onChanged: (newValue) => {
|
|
setState(() {
|
|
_selectedDoctor = null;
|
|
_selectedClinic = newValue;
|
|
var clinicInfo = patientsProv
|
|
.clinicsList
|
|
.where((i) =>
|
|
i['ClinicDescription']
|
|
.toString()
|
|
.contains(
|
|
_selectedClinic))
|
|
.toList();
|
|
|
|
clinicId = clinicInfo[0]['ClinicID']
|
|
.toString();
|
|
|
|
patientsProv.getDoctorsList(clinicId);
|
|
})
|
|
},
|
|
items: patientsProv
|
|
.getClinicNameList()
|
|
.map((item) {
|
|
return DropdownMenuItem(
|
|
value: item.toString(),
|
|
child: Text(
|
|
item,
|
|
textAlign: TextAlign.end,
|
|
),
|
|
);
|
|
}).toList(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
//--------------------------------------------------------------------//
|
|
AppText(
|
|
TranslationBase.of(context).doctor,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
|
|
RoundedContainer(
|
|
margin: 10,
|
|
showBorder: true,
|
|
raduis: 30,
|
|
borderColor: Color(0xff707070),
|
|
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: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
Expanded(
|
|
// add Expanded to have your dropdown button fill remaining space
|
|
child: DropdownButton(
|
|
isExpanded: true,
|
|
value: _selectedDoctor,
|
|
iconSize: 40,
|
|
elevation: 16,
|
|
selectedItemBuilder:
|
|
(BuildContext context) {
|
|
return patientsProv
|
|
.getDoctorNameList()
|
|
.map((item) {
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
AppText(
|
|
item,
|
|
fontSize:
|
|
SizeConfig.textMultiplier *
|
|
2.1,
|
|
),
|
|
],
|
|
);
|
|
}).toList();
|
|
},
|
|
onChanged: (newValue) => {
|
|
setState(() {
|
|
_selectedDoctor = newValue;
|
|
doctorsList =
|
|
patientsProv.doctorsList;
|
|
|
|
var doctorInfo = doctorsList
|
|
.where((i) => i['DoctorName']
|
|
.toString()
|
|
.contains(_selectedDoctor))
|
|
.toList();
|
|
doctorId = doctorInfo[0]['DoctorID']
|
|
.toString();
|
|
})
|
|
},
|
|
items: patientsProv
|
|
.getDoctorNameList()
|
|
.map((item) {
|
|
return DropdownMenuItem(
|
|
value: item.toString(),
|
|
child: Text(
|
|
item,
|
|
textAlign: TextAlign.end,
|
|
),
|
|
);
|
|
}).toList(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
), //-----------------------------///
|
|
AppText(
|
|
TranslationBase.of(context).ext,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(10.0),
|
|
child: AppTextFormField(
|
|
hintText: TranslationBase.of(context).ext,
|
|
controller: _extController,
|
|
inputFormatter: ONLY_NUMBERS,
|
|
textInputType: TextInputType.number,
|
|
onChanged: (value) => {},
|
|
),
|
|
),
|
|
AppText(
|
|
TranslationBase.of(context).priority,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
|
|
priorityBar(context),
|
|
|
|
AppText(
|
|
TranslationBase.of(context).referralFrequency +
|
|
getPriority(),
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
|
|
AppText(
|
|
TranslationBase.of(context).referralFrequency,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
RoundedContainer(
|
|
margin: 10,
|
|
showBorder: true,
|
|
raduis: 30,
|
|
borderColor: Color(0xff707070),
|
|
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: Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
Expanded(
|
|
// add Expanded to have your dropdown button fill remaining space
|
|
child: DropdownButton(
|
|
isExpanded: true,
|
|
value: _selectedReferralFrequancy,
|
|
iconSize: 40,
|
|
elevation: 16,
|
|
selectedItemBuilder:
|
|
(BuildContext context) {
|
|
return patientsProv
|
|
.getReferralNamesList()
|
|
.map((item) {
|
|
return Row(
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: <Widget>[
|
|
AppText(
|
|
item,
|
|
fontSize:
|
|
SizeConfig.textMultiplier *
|
|
2.1,
|
|
),
|
|
],
|
|
);
|
|
}).toList();
|
|
},
|
|
onChanged: (newValue) => {
|
|
setState(() {
|
|
_selectedReferralFrequancy = newValue;
|
|
var freqInfo = patientsProv
|
|
.referalFrequancyList
|
|
.singleWhere((i) => i[
|
|
'Description']
|
|
.toString()
|
|
.contains(
|
|
_selectedReferralFrequancy));
|
|
freqId = freqInfo['ParameterCode']
|
|
.toString();
|
|
myFocusNode.requestFocus();
|
|
})
|
|
},
|
|
items: patientsProv
|
|
.getReferralNamesList()
|
|
.map((item) {
|
|
return DropdownMenuItem(
|
|
value: item.toString(),
|
|
child: Text(
|
|
item,
|
|
textAlign: TextAlign.end,
|
|
),
|
|
);
|
|
}).toList(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
AppText(
|
|
TranslationBase.of(context).clinicDetailsandRemarks,
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
marginLeft: 15,
|
|
marginTop: 15,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(10.0),
|
|
child: AppTextFormField(
|
|
hintText: TranslationBase.of(context).remarks,
|
|
focusNode: myFocusNode,
|
|
controller: _remarksController,
|
|
inputFormatter: ONLY_LETTERS,
|
|
textInputType: TextInputType.text,
|
|
onChanged: (value) => {},
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.all(20.0),
|
|
child: Column(
|
|
children: <Widget>[
|
|
AppText(
|
|
TranslationBase.of(context).pleaseFill,
|
|
color: Colors.red,
|
|
fontWeight: FontWeight.bold,
|
|
margin: 10,
|
|
visibility:
|
|
isValid == null ? false : !isValid,
|
|
),
|
|
AppButton(
|
|
title: TranslationBase.of(context).send,
|
|
color: Color(PRIMARY_COLOR),
|
|
onPressed: () => {referToDoctor(context)},
|
|
)
|
|
],
|
|
))
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget priorityBar(BuildContext _context) {
|
|
List<String> _priorities = [
|
|
TranslationBase.of(context).veryUrgent,
|
|
TranslationBase.of(context).urgent,
|
|
TranslationBase.of(context).routine,
|
|
];
|
|
return Container(
|
|
height: MediaQuery.of(context).size.height * 0.065,
|
|
width: SizeConfig.screenWidth * 0.9,
|
|
margin: EdgeInsets.only(top: 10),
|
|
decoration: BoxDecoration(
|
|
color: Color(0Xffffffff), borderRadius: BorderRadius.circular(20)),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
mainAxisSize: MainAxisSize.max,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: _priorities.map((item) {
|
|
bool _isActive = _priorities[_activePriority] == item ? true : false;
|
|
return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
|
|
InkWell(
|
|
child: Center(
|
|
child: Container(
|
|
height: 40,
|
|
width: 90,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(50),
|
|
color: _isActive ? Hexcolor("#B8382B") : Colors.white,
|
|
),
|
|
child: Center(
|
|
child: Text(
|
|
item,
|
|
style: TextStyle(
|
|
fontSize: 12,
|
|
color: _isActive
|
|
? Colors.white
|
|
: Colors.black, //Colors.black,
|
|
// backgroundColor:_isActive
|
|
// ? Hexcolor("#B8382B")
|
|
// : Colors.white,//sideColor,
|
|
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
)),
|
|
),
|
|
onTap: () {
|
|
print(_priorities.indexOf(item));
|
|
setState(() {
|
|
_activePriority = _priorities.indexOf(item);
|
|
});
|
|
}),
|
|
_isActive
|
|
? Container(
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(10),
|
|
color: Colors.white),
|
|
alignment: Alignment.center,
|
|
height: 3,
|
|
width: 90,
|
|
)
|
|
: Container()
|
|
]);
|
|
}).toList(),
|
|
),
|
|
);
|
|
}
|
|
|
|
String getPriority() {
|
|
DateTime date = DateTime.now();
|
|
switch (_activePriority) {
|
|
case 0:
|
|
date = date.add(new Duration(hours: 3));
|
|
break;
|
|
case 1:
|
|
date = date.add(new Duration(hours: 6));
|
|
break;
|
|
case 2:
|
|
date = date.add(new Duration(days: 1));
|
|
break;
|
|
}
|
|
var format = DateFormat('yyyy/mm/dd HH:mm a');
|
|
var time = format.format(date);
|
|
print(time);
|
|
return time;
|
|
}
|
|
|
|
void referToDoctor(context) {
|
|
if (!validation()) {
|
|
return;
|
|
}
|
|
|
|
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
|
|
PatiantInformtion patient = routeArgs['patient'];
|
|
patientsProv.referToDoctor(context,
|
|
extension: _extController.value.text,
|
|
admissionNo: int.parse(patient.admissionNo),
|
|
referringDoctorRemarks: _remarksController.value.text,
|
|
frequency: freqId,
|
|
patientID: patient.patientId,
|
|
patientTypeID: patient.patientType,
|
|
priority: (_activePriority + 1).toString(),
|
|
roomID: patient.roomId,
|
|
selectedClinicID: clinicId.toString(),
|
|
selectedDoctorID: doctorId.toString(),
|
|
projectID: patient.projectId);
|
|
}
|
|
|
|
bool validation() {
|
|
setState(() {
|
|
isValid = !_extController.value.text.isNullOrEmpty() &&
|
|
!_remarksController.value.text.isNullOrEmpty() &&
|
|
freqId != null &&
|
|
clinicId != null &&
|
|
doctorId != null;
|
|
});
|
|
return isValid;
|
|
}
|
|
}
|