fix DA-201

merge-requests/265/head
Elham Rababah 5 years ago
parent 4e4e6a3600
commit ba263ada44

@ -0,0 +1,36 @@
class GetMedicationResponseModel {
String description;
String genericName;
int itemId;
String keywords;
dynamic price;
dynamic quantity;
GetMedicationResponseModel(
{this.description,
this.genericName,
this.itemId,
this.keywords,
this.price,
this.quantity});
GetMedicationResponseModel.fromJson(Map<String, dynamic> json) {
description = json['Description'];
genericName = json['GenericName'];
itemId = json['ItemId'];
keywords = json['Keywords'];
price = json['Price'];
quantity = json['Quantity'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['Description'] = this.description;
data['GenericName'] = this.genericName;
data['ItemId'] = this.itemId;
data['Keywords'] = this.keywords;
data['Price'] = this.price;
data['Quantity'] = this.quantity;
return data;
}
}

@ -1,18 +1,18 @@
class SearchDrugRequestModel { class SearchDrugRequestModel {
List<String> search; List<String> search;
String vidaAuthTokenID; // String vidaAuthTokenID;
SearchDrugRequestModel({this.search, this.vidaAuthTokenID}); SearchDrugRequestModel({this.search});
SearchDrugRequestModel.fromJson(Map<String, dynamic> json) { SearchDrugRequestModel.fromJson(Map<String, dynamic> json) {
search = json['Search'].cast<String>(); search = json['Search'].cast<String>();
vidaAuthTokenID = json['VidaAuthTokenID']; // vidaAuthTokenID = json['VidaAuthTokenID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = new Map<String, dynamic>();
data['Search'] = this.search; data['Search'] = this.search;
data['VidaAuthTokenID'] = this.vidaAuthTokenID; // data['VidaAuthTokenID'] = this.vidaAuthTokenID;
return data; return data;
} }
} }

@ -1,5 +1,6 @@
import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/model/Prescription_model.dart'; import 'package:doctor_app_flutter/core/model/Prescription_model.dart';
import 'package:doctor_app_flutter/core/model/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/model/prescription_req_model.dart'; import 'package:doctor_app_flutter/core/model/prescription_req_model.dart';
import 'package:doctor_app_flutter/core/model/post_prescrition_req_model.dart'; import 'package:doctor_app_flutter/core/model/post_prescrition_req_model.dart';
import 'package:doctor_app_flutter/core/model/search_drug_model.dart'; import 'package:doctor_app_flutter/core/model/search_drug_model.dart';
@ -16,6 +17,7 @@ class PrescriptionService extends BaseService {
List<SearchDrugModel> _drugsList = List(); List<SearchDrugModel> _drugsList = List();
List<SearchDrugModel> get drugsList => _drugsList; List<SearchDrugModel> get drugsList => _drugsList;
List<dynamic> doctorsList = []; List<dynamic> doctorsList = [];
List<GetMedicationResponseModel> allMedicationList = [];
List<dynamic> specialityList = []; List<dynamic> specialityList = [];
List<dynamic> drugToDrug = []; List<dynamic> drugToDrug = [];
@ -59,6 +61,21 @@ class PrescriptionService extends BaseService {
}, body: _drugRequestModel.toJson()); }, body: _drugRequestModel.toJson());
} }
Future getMedicationList() async {
hasError = false;
_drugRequestModel.search =[""];
await baseAppClient.post(SEARCH_DRUG,
onSuccess: (dynamic response, int statusCode) {
allMedicationList = [];
response['MedicationList']['entityList'].forEach((v) {
allMedicationList.add(GetMedicationResponseModel.fromJson(v));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _drugRequestModel.toJson());
}
Future postPrescription( Future postPrescription(
PostPrescriptionReqModel postProcedureReqModel) async { PostPrescriptionReqModel postProcedureReqModel) async {
hasError = false; hasError = false;

@ -1,5 +1,7 @@
import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/service/medicine_service.dart'; import 'package:doctor_app_flutter/core/service/medicine_service.dart';
import 'package:doctor_app_flutter/core/service/prescription_service.dart';
import '../../locator.dart'; import '../../locator.dart';
import 'base_view_model.dart'; import 'base_view_model.dart';
@ -9,6 +11,9 @@ class MedicineViewModel extends BaseViewModel {
get pharmacyItemsList => _medicineService.pharmacyItemsList; get pharmacyItemsList => _medicineService.pharmacyItemsList;
get pharmaciesList => _medicineService.pharmaciesList; get pharmaciesList => _medicineService.pharmaciesList;
PrescriptionService _prescriptionService = locator<PrescriptionService>();
List<GetMedicationResponseModel> get allMedicationList => _prescriptionService.allMedicationList;
Future getMedicineItem(String itemName) async { Future getMedicineItem(String itemName) async {
setState(ViewState.Busy); setState(ViewState.Busy);
@ -19,6 +24,15 @@ class MedicineViewModel extends BaseViewModel {
} else } else
setState(ViewState.Idle); setState(ViewState.Idle);
} }
Future getMedicationList() async {
setState(ViewState.Busy);
await _prescriptionService.getMedicationList();
if (_prescriptionService.hasError) {
error = _prescriptionService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
Future getPharmaciesList(int itemId) async { Future getPharmaciesList(int itemId) async {
setState(ViewState.Busy); setState(ViewState.Busy);

@ -17,6 +17,7 @@ class PrescriptionViewModel extends BaseViewModel {
List<PrescriptionModel> get prescriptionList => List<PrescriptionModel> get prescriptionList =>
_prescriptionService.prescriptionList; _prescriptionService.prescriptionList;
List<dynamic> get drugsList => _prescriptionService.doctorsList; List<dynamic> get drugsList => _prescriptionService.doctorsList;
List<dynamic> get allMedicationList => _prescriptionService.allMedicationList;
Future getPrescription({int mrn}) async { Future getPrescription({int mrn}) async {
hasError = false; hasError = false;

@ -1,7 +1,8 @@
import 'dart:math'; import 'dart:math';
import 'package:doctor_app_flutter/config/config.dart'; import 'package:autocomplete_textfield/autocomplete_textfield.dart';
import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/viewModel/medicine_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/medicine_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.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/screens/base/base_view.dart';
@ -11,12 +12,12 @@ import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/medicine/medicine_item_widget.dart'; import 'package:doctor_app_flutter/widgets/medicine/medicine_item_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_error.dart';
@ -45,6 +46,9 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
bool _isInit = true; bool _isInit = true;
final SpeechToText speech = SpeechToText(); final SpeechToText speech = SpeechToText();
String lastStatus = ''; String lastStatus = '';
GetMedicationResponseModel _selectedMedication;
GlobalKey key =
new GlobalKey<AutoCompleteTextFieldState<GetMedicationResponseModel>>();
// String lastWords; // String lastWords;
List<LocaleName> _localeNames = []; List<LocaleName> _localeNames = [];
@ -84,142 +88,206 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
}); });
} }
InputDecoration textFieldSelectorDecoration(String hintText,
String selectedText, bool isDropDown,
{IconData icon}) {
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(icon ?? Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<MedicineViewModel>( return BaseView<MedicineViewModel>(
builder: (_, model, w) => AppScaffold( onModelReady: (model) async {
appBarTitle: TranslationBase.of(context).searchMedicine, if(model.allMedicationList.isNotEmpty)
body: FractionallySizedBox( await model.getMedicationList();
widthFactor: 0.97, },
child: SingleChildScrollView( builder: (_, model, w) =>
child: Column( AppScaffold(
children: <Widget>[ baseViewModel: model,
Column( appBarTitle: TranslationBase
children: <Widget>[ .of(context)
Container( .searchMedicine,
child: Icon( body: SingleChildScrollView(
DoctorApp.medicine_search, child: FractionallySizedBox(
size: 100, widthFactor: 0.97,
color: Colors.black, child: SingleChildScrollView(
),
margin: EdgeInsets.only(top: 50),
),
Padding(
padding: const EdgeInsets.only(top: 12.0),
child: AppText(
TranslationBase.of(context).type.toUpperCase(),
fontWeight: FontWeight.bold,
fontSize: SizeConfig.heightMultiplier * 2.5,
),
),
Padding(
padding: const EdgeInsets.only(top: 5.0),
child: AppText(
TranslationBase.of(context).searchMedicineImageCaption,
fontSize: SizeConfig.heightMultiplier * 2,
),
)
],
),
SizedBox(
height: 15,
),
FractionallySizedBox(
widthFactor: 0.9,
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
Container( Column(
child: AppTextFormField( children: <Widget>[
hintText: TranslationBase.of(context) Container(
.searchMedicineNameHere, child: Icon(
controller: myController, DoctorApp.medicine_search,
onSaved: (value) {}, size: 100,
onFieldSubmitted: (value) { color: Colors.black,
searchMedicine(context, model); ),
}, margin: EdgeInsets.only(top: 50),
textInputAction: TextInputAction.search, ),
// TODO return it back when it needed Padding(
// prefix: IconButton( padding: const EdgeInsets.only(top: 12.0),
// icon: Icon(Icons.mic), child: AppText(
// color: TranslationBase.of(context).type.toUpperCase(),
// lastStatus == 'listening' ? Colors.red : Colors.grey, fontWeight: FontWeight.bold,
// onPressed: () { fontSize: SizeConfig.heightMultiplier * 2.5,
// myController.text = ''; ),
// setState(() { ),
// lastStatus = 'listening'; Padding(
// }); padding: const EdgeInsets.only(top: 5.0),
// child: AppText(
// startVoiceSearch(); TranslationBase.of(context).searchMedicineImageCaption,
// }), fontSize: SizeConfig.heightMultiplier * 2,
inputFormatter: ONLY_LETTERS), ),
)
],
), ),
SizedBox( SizedBox(
height: 15, height: 15,
), ),
Container( FractionallySizedBox(
child: Wrap( widthFactor: 0.9,
alignment: WrapAlignment.center, child: Column(
children: <Widget>[ children: <Widget>[
// TODO change it secondary button and add loading Container(
AppButton( height: MediaQuery
title: TranslationBase.of(context).search, .of(context)
onPressed: () async{ .size
await searchMedicine(context, model); .height * 0.070,
child: InkWell(
}, onTap: model.allMedicationList != null
), ? () {
], setState(() {
), _selectedMedication = null;
), });
}
Column( : null,
children: [ child: _selectedMedication == null
Container( ? AutoCompleteTextField<
margin: EdgeInsets.only( GetMedicationResponseModel>(
left: SizeConfig.heightMultiplier * 2), decoration: textFieldSelectorDecoration(
child: Row( TranslationBase
crossAxisAlignment: CrossAxisAlignment.start, .of(context)
children: <Widget>[ .searchMedicineNameHere,
AppText( _selectedMedication != null
TranslationBase ? _selectedMedication.genericName
.of(context) : null,
.youCanFind + true,
model.pharmacyItemsList.length icon: EvaIcons.search),
.toString() + itemSubmitted: (item) =>
" " + setState(
() => _selectedMedication = item),
key: key,
suggestions: model.allMedicationList,
itemBuilder: (context, suggestion) =>
new Padding(
child: Texts(suggestion.description + '/' +
suggestion.genericName),
padding: EdgeInsets.all(8.0)),
itemSorter: (a, b) => 1,
itemFilter: (suggestion, input) =>
suggestion.genericName
.toLowerCase()
.startsWith(input.toLowerCase()) ||
suggestion.description
.toLowerCase()
.startsWith(input.toLowerCase()) ||
suggestion.keywords
.toLowerCase()
.startsWith(input.toLowerCase()),
)
: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase TranslationBase
.of(context) .of(context)
.itemsInSearch, .searchMedicineNameHere,
fontWeight: FontWeight.bold, _selectedMedication != null
? _selectedMedication.description +
('${_selectedMedication.genericName}')
: null,
true,
icon: EvaIcons.search),
enabled: false,
), ),
], ),
), ),
), SizedBox(
Container( height: 15,
height: MediaQuery ),
.of(context) Container(
.size child: Wrap(
.height * 0.35, alignment: WrapAlignment.center,
child: Container( children: <Widget>[
child: ListView.builder( // TODO change it secondary button and add loading
AppButton(
title: TranslationBase.of(context).search,
onPressed: () async {
await searchMedicine(context, model);
},
),
],
),
),
Column(
children: [
Container(
margin: EdgeInsets.only(
left: SizeConfig.heightMultiplier * 2),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AppText(
TranslationBase
.of(context)
.youCanFind +
model.pharmacyItemsList.length
.toString() +
" " +
TranslationBase
.of(context)
.itemsInSearch,
fontWeight: FontWeight.bold,
),
],
),
),
Container(
height: MediaQuery
.of(context)
.size
.height * 0.35,
child: Container(
child: ListView.builder(
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
shrinkWrap: true, shrinkWrap: true,
itemCount: itemCount: model.pharmacyItemsList == null
model.pharmacyItemsList == ? 0
null : model.pharmacyItemsList.length,
? 0 itemBuilder: (BuildContext context,
: model int index) {
.pharmacyItemsList.length,
itemBuilder:
(BuildContext context, int index) {
return InkWell( return InkWell(
child: MedicineItemWidget( child: MedicineItemWidget(
label: model label: model.pharmacyItemsList[index]
.pharmacyItemsList[index] ["ItemDescription"],
["ItemDescription"], url: model.pharmacyItemsList[index]
url: model ["ImageSRCUrl"],
.pharmacyItemsList[index]
["ImageSRCUrl"],
), ),
onTap: () { onTap: () {
Navigator.push( Navigator.push(
@ -227,8 +295,8 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
MaterialPageRoute( MaterialPageRoute(
builder: (context) => builder: (context) =>
PharmaciesListScreen( PharmaciesListScreen(
itemID: model itemID:
.pharmacyItemsList[ model.pharmacyItemsList[
index]["ItemID"], index]["ItemID"],
url: model url: model
.pharmacyItemsList[ .pharmacyItemsList[
@ -237,31 +305,32 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
); );
}, },
); );
}, },
), ),
),
),
],
), ),
), ],
], ),
), ),
], ],
), ),
), ),
],
),
), ),
),),); ),),);
} }
searchMedicine(context, MedicineViewModel model) async { searchMedicine(context, MedicineViewModel model) async {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (myController.text.isNullOrEmpty()) { if (_selectedMedication.isNullOrEmpty()) {
helpers.showErrorToast(TranslationBase helpers.showErrorToast(TranslationBase
.of(context) .of(context)
.typeMedicineName); .typeMedicineName);
//"Type Medicine Name") //"Type Medicine Name")
return; return;
} } else
if (myController.text.length < 3) { if (_selectedMedication.description.length < 3) {
helpers.showErrorToast(TranslationBase helpers.showErrorToast(TranslationBase
.of(context) .of(context)
.moreThan3Letter); .moreThan3Letter);
@ -270,7 +339,7 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
await model.getMedicineItem(myController.text); await model.getMedicineItem(_selectedMedication.description);
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);
} }

Loading…
Cancel
Save