Doctor replay add info status 99

merge-requests/837/head
Elham Rababh 4 years ago
parent 28140b6ca4
commit b119590e39

@ -703,9 +703,8 @@ const Map<String, Map<String, String>> localizedValues = {
"patientArrived": {"en": "Patient Arrived", "ar": "وصل المريض"},
"calledAndNoResponse": {"en": "Called And No Response", "ar": "تم الاتصال ولا يوجد رد"},
"underProcess": {"en": "Under Process", "ar": "تحت التجهيز"},
"textResponse": {"en": "Text Response", "ar": "استجابة النص"
}
,
"textResponse": {"en": "Text Response", "ar": "استجابة النص"},
"notReplied": {"en": "Not Replied", "ar": "لم يتم يرد"},
"requestType":{
"en":"Request Type",
"ar":"نوع الطلب"},

@ -8,39 +8,56 @@ import 'package:doctor_app_flutter/models/patient/my_referral/my_referral_patien
import 'package:doctor_app_flutter/models/patient/request_my_referral_patient_model.dart';
class DoctorReplyService extends BaseService {
List<ListGtMyPatientsQuestions> get listDoctorWorkingHoursTable => _listDoctorWorkingHoursTable;
List<ListGtMyPatientsQuestions> get listDoctorWorkingHoursTable =>
_listDoctorWorkingHoursTable;
List<ListGtMyPatientsQuestions> get listDoctorNotRepliedQuestions =>
_listDoctorNotRepliedQuestions;
List<ListGtMyPatientsQuestions> _listDoctorWorkingHoursTable = [];
List<ListGtMyPatientsQuestions> _listDoctorNotRepliedQuestions = [];
List<MyReferralPatientModel> _listMyReferralPatientModel = [];
List<MyReferralPatientModel> get listMyReferralPatientModel => _listMyReferralPatientModel;
List<MyReferralPatientModel> get listMyReferralPatientModel =>
_listMyReferralPatientModel;
int notRepliedCount = 0;
Future getDoctorReply(RequestDoctorReply _requestDoctorReply,{bool clearData = false}) async {
Future getDoctorReply(RequestDoctorReply _requestDoctorReply,
{bool clearData = false, bool isGettingNotReply = false}) async {
hasError = false;
await baseAppClient.post(GT_MY_PATIENT_QUESTION,
onSuccess: (dynamic response, int statusCode) {
if(clearData)
await baseAppClient.post(
GT_MY_PATIENT_QUESTION,
onSuccess: (dynamic response, int statusCode) {
if (clearData) {
if(isGettingNotReply)
_listDoctorNotRepliedQuestions.clear();
else
_listDoctorWorkingHoursTable.clear();
response['List_GtMyPatientsQuestions'].forEach((v) {
_listDoctorWorkingHoursTable
.add(ListGtMyPatientsQuestions.fromJson(v));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestDoctorReply.toJson(),);
}
response['List_GtMyPatientsQuestions'].forEach((v) {
if(isGettingNotReply)
_listDoctorNotRepliedQuestions.add(ListGtMyPatientsQuestions.fromJson(v));
else
_listDoctorWorkingHoursTable
.add(ListGtMyPatientsQuestions.fromJson(v));
});
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
body: _requestDoctorReply.toJson(),
);
}
Future createDoctorResponse(
CreateDoctorResponseModel createDoctorResponseModel) async {
hasError = false;
CreateDoctorResponseModel createDoctorResponseModel) async {
hasError = false;
await baseAppClient.post(
CREATE_DOCTOR_RESPONSE,
body: createDoctorResponseModel.toJson(),
onSuccess: (dynamic body, int statusCode) {
},
onSuccess: (dynamic body, int statusCode) {},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
@ -48,14 +65,12 @@ class DoctorReplyService extends BaseService {
);
}
Future getNotRepliedCount() async {
hasError = false;
hasError = false;
await baseAppClient.post(
GET_DOCTOR_NOT_REPLIED_COUNTS,
body: {},
onSuccess: (dynamic body
, int statusCode) {
onSuccess: (dynamic body, int statusCode) {
notRepliedCount = body["DoctorNotRepliedCounts"];
},
onFailure: (String error, int statusCode) {

@ -12,9 +12,14 @@ class DoctorReplayViewModel extends BaseViewModel {
List<ListGtMyPatientsQuestions> get listDoctorWorkingHoursTable =>
_doctorReplyService.listDoctorWorkingHoursTable;
List<ListGtMyPatientsQuestions> get listDoctorNotRepliedQuestions =>
_doctorReplyService.listDoctorNotRepliedQuestions;
Future getDoctorReply(
{int pageSize = 10, int pageIndex = 1, bool isLocalBusy = true}) async {
{int pageSize = 10,
int pageIndex = 1,
bool isLocalBusy = true,
bool isGettingNotReply = false}) async {
if (isLocalBusy) {
setState(ViewState.BusyLocal);
} else {
@ -23,8 +28,11 @@ class DoctorReplayViewModel extends BaseViewModel {
await getDoctorProfile();
RequestDoctorReply _requestDoctorReply =
RequestDoctorReply(pageIndex: pageIndex, pageSize: pageSize);
if (isGettingNotReply)
_requestDoctorReply.infoStatus = 99; //to get the not replied only
await _doctorReplyService.getDoctorReply(_requestDoctorReply, clearData:!isLocalBusy );
await _doctorReplyService.getDoctorReply(_requestDoctorReply,
clearData: !isLocalBusy, isGettingNotReply: isGettingNotReply);
if (_doctorReplyService.hasError) {
error = _doctorReplyService.error;
if (isLocalBusy) {

@ -1,4 +1,4 @@
import 'package:doctor_app_flutter/screens/doctor/doctor_reply_screen.dart';
import 'package:doctor_app_flutter/screens/doctor/doctor_replay/doctor_reply_screen.dart';
import 'package:doctor_app_flutter/screens/doctor/my_schedule_screen.dart';
import 'package:doctor_app_flutter/screens/home/home_screen.dart';
import 'package:doctor_app_flutter/screens/qr_reader/QR_reader_screen.dart';

@ -15,6 +15,7 @@ class RequestDoctorReply {
bool patientOutSA;
int pageIndex;
int pageSize;
int infoStatus;
RequestDoctorReply(
{this.projectID,
@ -30,6 +31,7 @@ class RequestDoctorReply {
this.isLoginForDoctorApp,
this.patientOutSA,
this.pageIndex,
this.infoStatus,
this.pageSize});
RequestDoctorReply.fromJson(Map<String, dynamic> json) {
@ -47,6 +49,7 @@ class RequestDoctorReply {
patientOutSA = json['PatientOutSA'];
pageIndex = json['PageIndex'];
pageSize = json['PageSize'];
pageSize = json['InfoStatus'];
}
Map<String, dynamic> toJson() {
@ -65,6 +68,8 @@ class RequestDoctorReply {
data['PatientOutSA'] = this.patientOutSA;
data['PageIndex'] = this.pageIndex;
data['PageSize'] = this.pageSize;
if(this.infoStatus != null)
data['InfoStatus'] = this.infoStatus;
return data;
}
}

@ -0,0 +1,101 @@
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.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/screens/doctor/doctor_replay/doctor_reply_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_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/errors/error_message.dart';
import 'package:flutter/material.dart';
import 'doctor_repaly_chat.dart';
class AllDoctorQuestions extends StatefulWidget {
final Function changeCurrentTab;
const AllDoctorQuestions({Key key, this.changeCurrentTab}) : super(key: key);
@override
_AllDoctorQuestionsState createState() => _AllDoctorQuestionsState();
}
class _AllDoctorQuestionsState extends State<AllDoctorQuestions> {
int pageIndex = 1;
@override
Widget build(BuildContext context) {
return BaseView<DoctorReplayViewModel>(
onModelReady: (model) {
model.getDoctorReply(isLocalBusy: false);
},
builder: (_, model, w) => WillPopScope(
onWillPop: () async {
widget.changeCurrentTab();
return false;
},
child: AppScaffold(
baseViewModel: model,
appBarTitle: TranslationBase.of(context).replay2,
isShowAppBar: false,
body: model.listDoctorWorkingHoursTable.isEmpty
?ErrorMessage(error: TranslationBase.of(context).noItem)// DrAppEmbeddedError(error: TranslationBase.of(context).noItem)
: Column(
children: [
Expanded(
child: Container(
padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),
child: NotificationListener(
child: ListView.builder(
scrollDirection: Axis.vertical,
itemCount: model.listDoctorWorkingHoursTable.length,
shrinkWrap: true,
itemBuilder: (BuildContext ctxt, int index) {
return Column(
children: [
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
DoctorReplayChat(
reply:
model.listDoctorWorkingHoursTable[
index],
previousModel: model,
),
settings: RouteSettings(
name: 'DoctorReplayChat'),
));
},
child: DoctorReplyWidget(
reply: model
.listDoctorWorkingHoursTable[index]),
),
if(model.state == ViewState.BusyLocal && index == model.listDoctorWorkingHoursTable.length-1)
DrAppCircularProgressIndeicator()
],
);
}),
onNotification: (t) {
if (t is ScrollUpdateNotification && t.metrics.pixels >= t.metrics.maxScrollExtent - 50 &&
model.state != ViewState.BusyLocal) {
setState(() {
pageIndex++;
});
model.getDoctorReply(pageIndex: pageIndex);
}
return;
},
),
),
),
],
),
),
),
);
}
}

@ -0,0 +1,185 @@
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/doctor_replay_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/doctor/doctor_replay/doctor_repaly_chat.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/screens/doctor/doctor_replay/doctor_reply_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/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:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'all_doctor_questions.dart';
import 'not_replaied_Doctor_Questions.dart';
/*
*@author: Mohammad Aljammal
*@Date:28/4/2020
*@param:
*@return:
*@desc: Doctor Reply Screen display data from GtMyPatientsQuestions service
*/
class DoctorReplyScreen extends StatefulWidget {
final Function changeCurrentTab;
const DoctorReplyScreen({Key key, this.changeCurrentTab}) : super(key: key);
@override
_DoctorReplyScreenState createState() => _DoctorReplyScreenState();
}
class _DoctorReplyScreenState extends State<DoctorReplyScreen>
with SingleTickerProviderStateMixin {
TabController _tabController;
int _activeTab = 0;
int pageIndex = 1;
@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
_tabController.addListener(_handleTabSelection);
}
@override
void dispose() {
super.dispose();
_tabController.dispose();
}
_handleTabSelection() {
setState(() {
_activeTab = _tabController.index;
});
}
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return WillPopScope(
onWillPop: () async {
widget.changeCurrentTab();
return false;
},
child: AppScaffold(
appBarTitle: TranslationBase.of(context).replay2,
isShowAppBar: false,
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Scaffold(
extendBodyBehindAppBar: false,
appBar: PreferredSize(
preferredSize: Size.fromHeight(
MediaQuery.of(context).size.height * 0.070),
child: Container(
height: MediaQuery.of(context).size.height * 0.070,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context).dividerColor,
width: 0.5), //width: 0.7
),
color: Colors.white),
child: Center(
child: TabBar(
isScrollable: false,
controller: _tabController,
indicatorColor: Colors.transparent,
indicatorWeight: 1.0,
indicatorSize: TabBarIndicatorSize.tab,
labelColor: Theme.of(context).primaryColor,
labelPadding: EdgeInsets.only(
top: 0, left: 0, right: 0, bottom: 0),
unselectedLabelColor: Colors.grey[800],
tabs: [
tabWidget(
screenSize,
_activeTab == 0,
"Not Replied",
),
tabWidget(
screenSize,
_activeTab == 1,
TranslationBase.of(context).all,
),
],
),
),
),
),
body: Column(
children: [
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController,
children: [
NotRepliedDoctorQuestions(),
AllDoctorQuestions(),
],
),
),
],
),
),
),
],
),
),
);
}
}
Widget tabWidget(Size screenSize, bool isActive, String title,
{int counter = -1}) {
return Center(
child: Container(
height: screenSize.height * 0.070,
decoration: TextFieldsUtils.containerBorderDecoration(
isActive ? Color(0xFFD02127 /*B8382B*/) : Color(0xFFEAEAEA),
isActive ? Color(0xFFD02127) : Color(0xFFEAEAEA),
borderRadius: 4,
borderWidth: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppText(
title,
fontSize: SizeConfig.textMultiplier * 1.5,
color: isActive ? Colors.white : Color(0xFF2B353E),
fontWeight: FontWeight.w700,
),
if (counter != -1)
Container(
margin: EdgeInsets.all(4),
width: 15,
height: 15,
decoration: BoxDecoration(
color: isActive ? Colors.white : Color(0xFFD02127),
shape: BoxShape.circle,
),
child: Center(
child: FittedBox(
child: AppText(
"$counter",
fontSize: SizeConfig.textMultiplier * 1.5,
color: !isActive ? Colors.white : Color(0xFFD02127),
fontWeight: FontWeight.w700,
),
),
),
),
],
),
),
);
}

@ -31,7 +31,7 @@ class _DoctorReplyWidgetState extends State<DoctorReplyWidget> {
return Container(
child: CardWithBgWidget(
bgColor: widget.reply.infoStatus == 0
bgColor: widget.reply.infoStatus == 99
? Color(0xFF2B353E)
: widget.reply.infoStatus == 4
? IN_PROGRESS_COLOR
@ -55,7 +55,8 @@ class _DoctorReplyWidgetState extends State<DoctorReplyWidget> {
color: Colors.black),
children: <TextSpan>[
new TextSpan(
text: widget.reply.infoStatus == 1
text: widget.reply.infoStatus == 99
? TranslationBase.of(context).notReplied:widget.reply.infoStatus == 1
? TranslationBase.of(context).replayCallStatus
: widget.reply.infoStatus == 2
? TranslationBase.of(context).patientArrived
@ -70,7 +71,9 @@ class _DoctorReplyWidgetState extends State<DoctorReplyWidget> {
.textResponse
: '',
style: TextStyle(
color: widget.reply.infoStatus == 4
color: widget.reply.infoStatus == 99
? Color(0xFF2B353E)
: widget.reply.infoStatus == 4
? IN_PROGRESS_COLOR
: widget.reply.infoStatus == 3
? Color(0xFFD02127)

@ -1,43 +1,35 @@
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/doctor_replay_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/doctor/doctor_repaly_chat.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/doctor/doctor_reply_widget.dart';
import 'package:doctor_app_flutter/screens/doctor/doctor_replay/doctor_reply_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/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/cupertino.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart';
import 'package:flutter/material.dart';
/*
*@author: Mohammad Aljammal
*@Date:28/4/2020
*@param:
*@return:
*@desc: Doctor Reply Screen display data from GtMyPatientsQuestions service
*/
class DoctorReplyScreen extends StatefulWidget {
import 'doctor_repaly_chat.dart';
class NotRepliedDoctorQuestions extends StatefulWidget {
final Function changeCurrentTab;
const DoctorReplyScreen({Key key, this.changeCurrentTab}) : super(key: key);
const NotRepliedDoctorQuestions({Key key, this.changeCurrentTab})
: super(key: key);
@override
_DoctorReplyScreenState createState() => _DoctorReplyScreenState();
_NotRepliedDoctorQuestionsState createState() =>
_NotRepliedDoctorQuestionsState();
}
class _DoctorReplyScreenState extends State<DoctorReplyScreen> {
class _NotRepliedDoctorQuestionsState extends State<NotRepliedDoctorQuestions> {
int pageIndex = 1;
@override
Widget build(BuildContext context) {
return BaseView<DoctorReplayViewModel>(
onModelReady: (model) {
model.getDoctorReply(isLocalBusy: false);
model.getDoctorReply(isLocalBusy: false, isGettingNotReply: true);
},
builder: (_, model, w) => WillPopScope(
onWillPop: () async {
@ -48,17 +40,18 @@ class _DoctorReplyScreenState extends State<DoctorReplyScreen> {
baseViewModel: model,
appBarTitle: TranslationBase.of(context).replay2,
isShowAppBar: false,
body: model.listDoctorWorkingHoursTable.isEmpty
? DrAppEmbeddedError(error: TranslationBase.of(context).noItem)
body: model.listDoctorNotRepliedQuestions.isEmpty
? ErrorMessage(error: TranslationBase.of(context).noItem)
: Column(
children: [
Expanded(
child: Container(
children: [
Expanded(
child: Container(
padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0),
child: NotificationListener(
child: ListView.builder(
scrollDirection: Axis.vertical,
itemCount: model.listDoctorWorkingHoursTable.length,
itemCount:
model.listDoctorNotRepliedQuestions.length,
shrinkWrap: true,
itemBuilder: (BuildContext ctxt, int index) {
return Column(
@ -70,9 +63,9 @@ class _DoctorReplyScreenState extends State<DoctorReplyScreen> {
MaterialPageRoute(
builder: (BuildContext context) =>
DoctorReplayChat(
reply:
model.listDoctorWorkingHoursTable[
index],
reply: model
.listDoctorNotRepliedQuestions[
index],
previousModel: model,
),
settings: RouteSettings(
@ -80,30 +73,36 @@ class _DoctorReplyScreenState extends State<DoctorReplyScreen> {
));
},
child: DoctorReplyWidget(
reply: model
.listDoctorWorkingHoursTable[index]),
reply:
model.listDoctorNotRepliedQuestions[
index]),
),
if(model.state == ViewState.BusyLocal && index == model.listDoctorWorkingHoursTable.length-1)
if (model.state == ViewState.BusyLocal &&
index ==
model.listDoctorNotRepliedQuestions
.length -
1)
DrAppCircularProgressIndeicator()
],
);
}),
onNotification: (t) {
if (t is ScrollUpdateNotification && t.metrics.pixels >= t.metrics.maxScrollExtent - 50 &&
onNotification: (t) {
if (t is ScrollUpdateNotification &&
t.metrics.pixels >=
t.metrics.maxScrollExtent - 50 &&
model.state != ViewState.BusyLocal) {
setState(() {
pageIndex++;
});
model.getDoctorReply(pageIndex: pageIndex);
model.getDoctorReply(pageIndex: pageIndex, isGettingNotReply: true);
}
return;
},
),
),
),
],
),
),
],
),
),
),
);

@ -1104,6 +1104,7 @@ class TranslationBase {
String get special => localizedValues['special'][locale.languageCode];
String get requestType => localizedValues['requestType'][locale.languageCode];
String get allClinic => localizedValues['allClinic'][locale.languageCode];
String get notReplied => localizedValues['notReplied'][locale.languageCode];
}

Loading…
Cancel
Save