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.
446 lines
16 KiB
Dart
446 lines
16 KiB
Dart
/*
|
|
*@author: Amjad Amireh Merge to Elham rababah
|
|
*@Date:27/4/2020
|
|
*@param:
|
|
*@return:PatientsScreen
|
|
|
|
*@desc:
|
|
*/
|
|
|
|
import 'package:doctor_app_flutter/models/patient/patiant_info_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/providers/patients_provider.dart';
|
|
import 'package:doctor_app_flutter/routes.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:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
//*************
|
|
import '../../config/size_config.dart';
|
|
import 'package:hexcolor/hexcolor.dart';
|
|
|
|
//********
|
|
import '../../widgets/shared/app_scaffold_widget.dart';
|
|
import '../../widgets/shared/card_with_bg_widget.dart';
|
|
|
|
import 'package:doctor_app_flutter/config/config.dart';
|
|
|
|
class PatientsScreen extends StatefulWidget {
|
|
@override
|
|
_PatientsScreenState createState() => _PatientsScreenState();
|
|
}
|
|
|
|
class _PatientsScreenState extends State<PatientsScreen> {
|
|
List<dynamic> litems;
|
|
// final List parsed;
|
|
List parsed;
|
|
//**********
|
|
List date;
|
|
List unfilterDate;
|
|
//***********
|
|
|
|
List<PatiantInformtion> responseModelList;
|
|
List<PatiantInformtion> responseModelList2;
|
|
// List<String> _locations = ['Today', 'Old Date', 'YESTERDAY'];
|
|
List<String> _locations = ['Today', 'Tomorrow', 'Next Week'];
|
|
int _activeLocation = 0;
|
|
|
|
bool _isInit = true;
|
|
String patientType;
|
|
String patientTypetitle;
|
|
var _isLoading = true;
|
|
|
|
var _hasError;
|
|
//*******Amjad add to search box******
|
|
final _controller = TextEditingController();
|
|
//**************
|
|
PatientModel patient;
|
|
PatientsProvider patientsProv;
|
|
|
|
@override
|
|
void didChangeDependencies() {
|
|
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
|
|
|
|
patient = routeArgs['patientSearchForm'];
|
|
|
|
print(patient.TokenID + "EEEEEE");
|
|
|
|
patientType = routeArgs['selectedType'];
|
|
patientTypetitle = SERVICES_PATIANT_HEADER[int.parse(patientType)];
|
|
|
|
print(patientType);
|
|
|
|
if (_isInit) {
|
|
PatientsProvider patientsProv = Provider.of<PatientsProvider>(context);
|
|
patientsProv.getPatientList(patient, patientType).then((res) {
|
|
setState(() {
|
|
int val2 = int.parse(patientType);
|
|
litems = res[SERVICES_PATIANT2[val2]];
|
|
|
|
parsed = litems;
|
|
|
|
responseModelList = new ModelResponse.fromJson(parsed).list;
|
|
responseModelList2 = responseModelList;
|
|
//********************
|
|
_isLoading = false;
|
|
|
|
_hasError = res['ErrorEndUserMessage'];
|
|
});
|
|
print(res);
|
|
}).catchError((error) {
|
|
// patientsProv.isLoading=false;
|
|
// patientsProv.isError=true;
|
|
print("====================error================");
|
|
print(error);
|
|
});
|
|
}
|
|
|
|
_isInit = false;
|
|
|
|
super.didChangeDependencies();
|
|
}
|
|
|
|
/*
|
|
*@author: Amjad Amireh
|
|
*@Date:2/5/2020
|
|
*@param:
|
|
*@return:PatientsScreen Search textbox filter
|
|
|
|
*@desc:
|
|
*/
|
|
|
|
searchData(String str) {
|
|
this.responseModelList = this.responseModelList2;
|
|
var strExist = str.length > 0 ? true : false;
|
|
if (strExist) {
|
|
List<PatiantInformtion> filterData = [];
|
|
|
|
for (var i = 0; i < responseModelList2.length; i++) {
|
|
String firstName = responseModelList[i].firstName.toUpperCase();
|
|
String lastName = responseModelList[i].lastName.toUpperCase();
|
|
if (firstName.contains(str.toUpperCase()) ||
|
|
lastName.contains(str.toUpperCase())) {
|
|
filterData.add(responseModelList[i]);
|
|
}
|
|
}
|
|
|
|
setState(() {
|
|
this.responseModelList = filterData;
|
|
});
|
|
} else {
|
|
setState(() {
|
|
this.responseModelList = this.responseModelList2;
|
|
});
|
|
}
|
|
}
|
|
|
|
//***********DateFormat**************
|
|
/*
|
|
*@author: Amjad Amireh
|
|
*@Date:5/5/2020
|
|
*@param:
|
|
*@return:Convert time from Milesecond to date with time
|
|
|
|
*@desc:
|
|
*/
|
|
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();
|
|
}
|
|
|
|
/*
|
|
*@author: Amjad Amireh
|
|
*@Date:5/5/2020
|
|
*@param:
|
|
*@return:Convert time from Milesecond to date
|
|
|
|
*@desc:
|
|
*/
|
|
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<PatiantInformtion> filterDate = [];
|
|
|
|
for (var i = 0; i < responseModelList2.length; i++) {
|
|
String patiantAppointment =
|
|
convertDateFormat(responseModelList[i].appointmentDate);
|
|
|
|
String dateAppointment = checkDate(patiantAppointment);
|
|
|
|
if (dateAppointment.contains(str)) {
|
|
filterDate.add(responseModelList[i]);
|
|
}
|
|
}
|
|
|
|
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 "Today";
|
|
} else if ((currentTime.year == checkedTime.year) &&
|
|
(currentTime.month == checkedTime.month)) {
|
|
if ((currentTime.day - checkedTime.day) == 1) {
|
|
return "YESTERDAY";
|
|
} else if ((currentTime.day - checkedTime.day) == -1) {
|
|
return "Tomorrow";
|
|
}
|
|
|
|
if ((currentTime.day - checkedTime.day) <= -2) {
|
|
return "Next Week";
|
|
} else {
|
|
return "Old Date";
|
|
}
|
|
}
|
|
return "Old Date";
|
|
}
|
|
|
|
//*************************
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
PatientsProvider patientsProv = Provider.of<PatientsProvider>(context);
|
|
|
|
return AppScaffold(
|
|
appBarTitle: patientTypetitle,
|
|
//***********Modify by amjad (create List view to insert all new data webservise in scroll )*************
|
|
body: patientsProv.isLoading
|
|
? DrAppCircularProgressIndeicator()
|
|
: patientsProv.isError
|
|
? DrAppEmbeddedError(error: patientsProv.error)
|
|
: litems == null
|
|
? DrAppEmbeddedError(
|
|
error: 'You don\'t have any ' +
|
|
patientTypetitle +
|
|
" patiant")
|
|
: Container(
|
|
child:
|
|
ListView(scrollDirection: Axis.vertical, children: <
|
|
Widget>[
|
|
Container(
|
|
child: litems == null
|
|
? Column(
|
|
children: <Widget>[
|
|
Container(
|
|
child: Center(
|
|
child: Padding(
|
|
padding: const EdgeInsets.fromLTRB(
|
|
0, 250, 0, 0),
|
|
child:
|
|
DrAppCircularProgressIndeicator(),
|
|
)),
|
|
),
|
|
],
|
|
)
|
|
: Column(
|
|
children: <Widget>[
|
|
Padding(
|
|
padding: EdgeInsets.only(
|
|
top: MediaQuery.of(context)
|
|
.size
|
|
.height *
|
|
0.03),
|
|
child: SERVICES_PATIANT2[
|
|
int.parse(patientType)] ==
|
|
"List_MyOutPatient"
|
|
? _locationBar(context)
|
|
: Container(),
|
|
),
|
|
SizedBox(height: 10.0),
|
|
Container(
|
|
width: SizeConfig.screenWidth * 0.80,
|
|
child: TextField(
|
|
controller: _controller,
|
|
onChanged: (String str) {
|
|
this.searchData(str);
|
|
},
|
|
decoration: buildInputDecoration(
|
|
context, 'Search patiant'),
|
|
),
|
|
),
|
|
Container(
|
|
margin:
|
|
EdgeInsets.fromLTRB(15, 0, 15, 0),
|
|
child: Column(
|
|
children: responseModelList
|
|
.map((PatiantInformtion item) {
|
|
return InkWell(
|
|
child: CardWithBgWidget(
|
|
widget: Column(
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
AppText(
|
|
item.firstName +
|
|
" " +
|
|
item.lastName +
|
|
"- " +
|
|
item.patientId
|
|
.toString(),
|
|
fontSize: 2.5 *
|
|
SizeConfig
|
|
.textMultiplier,
|
|
fontWeight:
|
|
FontWeight.bold,
|
|
),
|
|
SizedBox(
|
|
height: 8,
|
|
),
|
|
SERVICES_PATIANT2[int.parse(
|
|
patientType)] ==
|
|
"List_MyOutPatient"
|
|
? AppText(
|
|
convertDate(item
|
|
.appointmentDate
|
|
.toString()),
|
|
fontSize: 2.5 *
|
|
SizeConfig
|
|
.textMultiplier)
|
|
: AppText(
|
|
item
|
|
.nationalityName,
|
|
fontSize: 2.5 *
|
|
SizeConfig
|
|
.textMultiplier)
|
|
],
|
|
),
|
|
),
|
|
onTap: () {
|
|
Navigator.of(context).pushNamed(
|
|
PATIENTS_PROFILE,
|
|
arguments: {
|
|
"patient": item
|
|
});
|
|
},
|
|
);
|
|
}).toList(),
|
|
),
|
|
),
|
|
],
|
|
))
|
|
])));
|
|
}
|
|
|
|
//***********amjad update**buildInputDecoration ***to search box********
|
|
InputDecoration buildInputDecoration(BuildContext context, hint) {
|
|
return InputDecoration(
|
|
prefixIcon: Icon(Icons.search, color: Colors.red),
|
|
filled: true,
|
|
fillColor: Colors.white,
|
|
hintText: hint,
|
|
hintStyle: TextStyle(fontSize: 2 * SizeConfig.textMultiplier),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(20)),
|
|
borderSide: BorderSide(color: Hexcolor('#CCCCCC')),
|
|
),
|
|
focusedBorder: OutlineInputBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
|
borderSide: BorderSide(color: Theme.of(context).primaryColor),
|
|
));
|
|
}
|
|
|
|
Widget _locationBar(BuildContext _context) {
|
|
return Container(
|
|
height: MediaQuery.of(context).size.height * 0.065,
|
|
width: SizeConfig.screenWidth * 0.80,
|
|
decoration: BoxDecoration(
|
|
color: Color(0Xff59434f), borderRadius: BorderRadius.circular(20)),
|
|
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: <Widget>[
|
|
InkWell(
|
|
child: Text(
|
|
item,
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
onTap: () {
|
|
print(_locations.indexOf(item));
|
|
|
|
filterBooking(item.toString());
|
|
|
|
setState(() {
|
|
_activeLocation = _locations.indexOf(item);
|
|
});
|
|
}),
|
|
_isActive
|
|
? Container(
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(10),
|
|
color: Colors.white),
|
|
height: 3,
|
|
width: 80,
|
|
)
|
|
: Container()
|
|
]);
|
|
}).toList(),
|
|
));
|
|
}
|
|
}
|