Merge branch 'clinic_list' into 'development'

Clinic list

See merge request Cloud_Solution/doctor_app_flutter!362
merge-requests/363/merge
Mohammad Aljammal 5 years ago
commit e2e3cd9a29

@ -748,6 +748,8 @@ const Map<String, Map<String, String>> localizedValues = {
}, },
'appointmentDate': {'en': "Appointment Date", 'ar': "تاريخ الموعد"}, 'appointmentDate': {'en': "Appointment Date", 'ar': "تاريخ الموعد"},
'arrived_p': {'en': "Arrived", 'ar': "وصل"}, 'arrived_p': {'en': "Arrived", 'ar': "وصل"},
"open-rad": {"en": "Open Image", "ar": "فتح صور الاشعة"},
'fileNumber': {'en': "File Number: ", 'ar': " :رقم الملف"}, 'fileNumber': {'en': "File Number: ", 'ar': " :رقم الملف"},
'searchPatient-name': { 'searchPatient-name': {
'en': 'Search Name, Medical File, Phone Number', 'en': 'Search Name, Medical File, Phone Number',

@ -11,7 +11,7 @@ class MedicineService extends BaseService {
var _pharmaciesList = []; var _pharmaciesList = [];
get pharmacyItemsList => _pharmacyItemsList; get pharmacyItemsList => _pharmacyItemsList;
get pharmaciesList => _pharmaciesList; get pharmaciesList => _pharmaciesList;
String searchText='';
List<GetAssessmentResModel> patientAssessmentList = []; List<GetAssessmentResModel> patientAssessmentList = [];
PharmaciesItemsRequestModel _itemsRequestModel = PharmaciesItemsRequestModel _itemsRequestModel =
@ -20,6 +20,7 @@ class MedicineService extends BaseService {
Future getMedicineItem(String itemName) async { Future getMedicineItem(String itemName) async {
_itemsRequestModel.pHRItemName = itemName; _itemsRequestModel.pHRItemName = itemName;
searchText =itemName;
await baseAppClient.post( await baseAppClient.post(
PHARMACY_ITEMS_URL, PHARMACY_ITEMS_URL,
onSuccess: (dynamic response, int statusCode) { onSuccess: (dynamic response, int statusCode) {

@ -15,7 +15,7 @@ class MedicineViewModel extends BaseViewModel {
PrescriptionService _prescriptionService = locator<PrescriptionService>(); PrescriptionService _prescriptionService = locator<PrescriptionService>();
get pharmacyItemsList => _medicineService.pharmacyItemsList; get pharmacyItemsList => _medicineService.pharmacyItemsList;
get searchText=>_medicineService.searchText;
get pharmaciesList => _medicineService.pharmaciesList; get pharmaciesList => _medicineService.pharmaciesList;
get medicationStrengthList => _prescriptionService.medicationStrengthList; get medicationStrengthList => _prescriptionService.medicationStrengthList;
@ -34,6 +34,7 @@ class MedicineViewModel extends BaseViewModel {
List<GetAssessmentResModel> get patientAssessmentList => List<GetAssessmentResModel> get patientAssessmentList =>
_prescriptionService.patientAssessmentList; _prescriptionService.patientAssessmentList;
List<GetMedicationResponseModel> get allMedicationList => List<GetMedicationResponseModel> get allMedicationList =>
_prescriptionService.allMedicationList; _prescriptionService.allMedicationList;
List<dynamic> get itemMedicineList => _prescriptionService.itemMedicineList; List<dynamic> get itemMedicineList => _prescriptionService.itemMedicineList;
@ -41,6 +42,7 @@ class MedicineViewModel extends BaseViewModel {
_prescriptionService.itemMedicineListRoute; _prescriptionService.itemMedicineListRoute;
List<dynamic> get itemMedicineListUnit => List<dynamic> get itemMedicineListUnit =>
_prescriptionService.itemMedicineListUnit; _prescriptionService.itemMedicineListUnit;
Future getItem({int itemID}) async { Future getItem({int itemID}) async {
//hasError = false; //hasError = false;
//_insuranceCardService.clearInsuranceCard(); //_insuranceCardService.clearInsuranceCard();

@ -1,10 +1,10 @@
import 'dart:math'; import 'dart:math';
import 'package:autocomplete_textfield/autocomplete_textfield.dart'; import 'package:autocomplete_textfield/autocomplete_textfield.dart';
import 'package:doctor_app_flutter/config/config.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/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/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/medicine/pharmacies_list_screen.dart'; import 'package:doctor_app_flutter/screens/medicine/pharmacies_list_screen.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
@ -12,13 +12,13 @@ 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:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.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';
import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_recognition_result.dart';
@ -117,149 +117,169 @@ class _MedicineSearchState extends State<MedicineSearchScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<MedicineViewModel>( return BaseView<MedicineViewModel>(
onModelReady: (model) async { onModelReady: (model) async {
if (model.allMedicationList.length == 0) // if (model.allMedicationList.length == 0)
await model.getMedicationList(); // await model.getMedicationList();
}, },
builder: (_, model, w) => AppScaffold( builder: (_, model, w) {
baseViewModel: model, myController.text =model.searchText;
isShowAppBar: false, return AppScaffold(
appBarTitle: TranslationBase.of(context).searchMedicine, // baseViewModel: model,
body: SingleChildScrollView( isShowAppBar: false,
child: FractionallySizedBox( appBarTitle: TranslationBase.of(context).searchMedicine,
widthFactor: 0.97, body: SingleChildScrollView(
child: SingleChildScrollView( child: FractionallySizedBox(
child: Container( widthFactor: 0.97,
color: Colors.white, child: SingleChildScrollView(
// height: SizeConfig.screenHeight, child: Container(
child: Column( // height: SizeConfig.screenHeight,
mainAxisAlignment: MainAxisAlignment.spaceAround, child: Column(
children: <Widget>[ mainAxisAlignment: MainAxisAlignment.start,
SizedBox(height: 100), children: <Widget>[
Column(children: [ SizedBox(
FractionallySizedBox( height: SizeConfig.screenHeight * .16,
widthFactor: 0.9, ),
child: Column( FractionallySizedBox(
children: <Widget>[ widthFactor: 0.9,
Container( child: Container(
child: InkWell( decoration: BoxDecoration(
onTap: model.allMedicationList != null borderRadius:
? () { BorderRadius.all(Radius.circular(6.0)),
setState(() { border: Border.all(
_selectedMedication = null; width: 1.0, color: HexColor("#CCCCCC"))),
}); padding: EdgeInsets.all(10),
} child: AppTextFormField(
: null, borderColor: Colors.white,
child: _selectedMedication == null hintText: TranslationBase.of(context)
? AutoCompleteTextField< .searchMedicineNameHere,
GetMedicationResponseModel>( controller: myController,
decoration: textFieldSelectorDecoration( onSaved: (value) {},
TranslationBase.of(context) onFieldSubmitted: (value) {
.searchMedicineNameHere, searchMedicine(context, model);
_selectedMedication != null },
? _selectedMedication.genericName inputFormatter: ONLY_LETTERS,
: null,
true,
icon: EvaIcons.search),
itemSubmitted: (item) => setState(
() => _selectedMedication = item),
key: key,
suggestions: model.allMedicationList,
itemBuilder: (context, suggestion) =>
new Padding(
child: Texts(
suggestion.description +
'/' +
suggestion.genericName),
padding: EdgeInsets.all(10.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(
minLines: 2,
maxLines: 2,
decoration: textFieldSelectorDecoration(
TranslationBase.of(context)
.searchMedicineNameHere,
_selectedMedication != null
? _selectedMedication
.description +
(' (${_selectedMedication.genericName} )')
: null,
true,
icon: EvaIcons.search),
enabled: false,
),
), ),
), ),
], ),
), FractionallySizedBox(
) widthFactor: 0.9,
]), child: Container(
SizedBox( child: Wrap(
height: SizeConfig.screenHeight * .55, alignment: WrapAlignment.center,
), children: <Widget>[
Column( // TODO change it secondary button and add loading
children: [ AppButton(
FractionallySizedBox( title: TranslationBase.of(context).search,
widthFactor: 0.97, onPressed: () async{
child: Wrap( await searchMedicine(context, model);
alignment: WrapAlignment.center,
children: <Widget>[ },
// TODO change it secondary button and add loading ),
AppButton( ],
title: TranslationBase.of(context).search,
onPressed: () async {
await searchMedicine(context, model);
},
), ),
], ),
),
Container(
margin: EdgeInsets.only(
left: SizeConfig.heightMultiplier * 2),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AppText(
TranslationBase
.of(context)
.youCanFind +
(myController.text !=''?model.pharmacyItemsList.length
.toString():'0' )+
" " +
TranslationBase
.of(context)
.itemsInSearch,
fontWeight: FontWeight.bold,
),
],
),
),
SizedBox(
height:10,
), ),
) if(myController.text !='')
], Container(
) height: MediaQuery
], .of(context)
), .size
)), .height * 0.5,
child: ListView.builder(
padding: const EdgeInsets.only(top:20),
scrollDirection: Axis.vertical,
// shrinkWrap: true,
itemCount:
model.pharmacyItemsList ==
null
? 0
: model
.pharmacyItemsList.length,
itemBuilder:
(BuildContext context, int index) {
return InkWell(
child: MedicineItemWidget(
label: model
.pharmacyItemsList[index]
["ItemDescription"],
url: model
.pharmacyItemsList[index]
["ImageSRCUrl"],
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
PharmaciesListScreen(
itemID: model
.pharmacyItemsList[
index]["ItemID"],
url: model
.pharmacyItemsList[
index]["ImageSRCUrl"]),
),
);
},
);
},
),
),
],
),
)),
),
), ),
), );}
),
); );
} }
searchMedicine(context, MedicineViewModel model) async { searchMedicine(context, MedicineViewModel model) async {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (_selectedMedication.isNullOrEmpty()) { if (myController.text.isNullOrEmpty()) {
helpers.showErrorToast(TranslationBase.of(context).typeMedicineName); helpers.showErrorToast(TranslationBase
.of(context)
.typeMedicineName);
//"Type Medicine Name") //"Type Medicine Name")
return; return;
} else if (_selectedMedication.description.length < 3) { }
helpers.showErrorToast(TranslationBase.of(context).moreThan3Letter); if (myController.text.length < 3) {
helpers.showErrorToast(TranslationBase
.of(context)
.moreThan3Letter);
return; return;
} }
// GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
Navigator.push(
context, await model.getMedicineItem(myController.text);
MaterialPageRoute( GifLoaderDialogUtils.hideDialog(context);
builder: (context) => PharmaciesListScreen(
itemID: _selectedMedication.itemId,
selectedMedication: _selectedMedication,
),
),
);
// await model.getMedicineItem(_selectedMedication.description);
// GifLoaderDialogUtils.hideDialog(context);
} }
startVoiceSearch() { startVoiceSearch() {

@ -2,7 +2,6 @@ import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
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/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -23,11 +22,9 @@ class PharmaciesListScreen extends StatefulWidget {
final int itemID; final int itemID;
final String url; final String url;
final GetMedicationResponseModel selectedMedication;
// In the constructor, require a item id. // In the constructor, require a item id.
PharmaciesListScreen( PharmaciesListScreen({Key key, @required this.itemID, this.url})
{Key key, @required this.itemID, this.url, this.selectedMedication})
: super(key: key); : super(key: key);
@override @override
@ -52,39 +49,31 @@ class _PharmaciesListState extends State<PharmaciesListScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
projectsProvider = Provider.of(context); projectsProvider = Provider.of(context);
return BaseView<MedicineViewModel>( return BaseView<MedicineViewModel>(
onModelReady: (model) async { onModelReady: (model) => model.getPharmaciesList(widget.itemID),
await model.getPharmaciesList(widget.selectedMedication.itemId); builder: (_, model, w) => AppScaffold(
await model.getMedicineItem(widget.selectedMedication.description); baseViewModel: model,
appBarTitle: TranslationBase.of(context).pharmaciesList,
}, body: Container(
builder: (_, model, w) => height: SizeConfig.screenHeight,
AppScaffold( child: ListView(
baseViewModel: model, shrinkWrap: true,
appBarTitle: TranslationBase scrollDirection: Axis.vertical,
.of(context) physics: const AlwaysScrollableScrollPhysics(),
.pharmaciesList, children: <Widget>[
body: Container( model.pharmaciesList.length > 0
height: SizeConfig.screenHeight,
child: ListView(
shrinkWrap: true,
scrollDirection: Axis.vertical,
physics: const AlwaysScrollableScrollPhysics(),
children: <Widget>[
model.pharmaciesList.length > 0 && model.pharmacyItemsList.length > 0
? RoundedContainer( ? RoundedContainer(
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
flex: 1, flex: 1,
child: ClipRRect( child: ClipRRect(
borderRadius: borderRadius:
BorderRadius.all(Radius.circular(7)), BorderRadius.all(Radius.circular(7)),
child: model.pharmacyItemsList[0] child: widget.url != null
["ImageSRCUrl"]!= null ? Image.network(
? Image.network( widget.url,
model.pharmacyItemsList[0]["ImageSRCUrl"], height:
height: SizeConfig.imageSizeMultiplier *
SizeConfig.imageSizeMultiplier *
21, 21,
width: width:
SizeConfig.imageSizeMultiplier * SizeConfig.imageSizeMultiplier *
@ -241,8 +230,8 @@ class _PharmaciesListState extends State<PharmaciesListScreen> {
}), }),
), ),
) )
]), ]),
),),); ),),);
} }
@ -253,7 +242,7 @@ class _PharmaciesListState extends State<PharmaciesListScreen> {
//TODO CHECK THE URL IS NULL OR NOT //TODO CHECK THE URL IS NULL OR NOT
Uint8List dataFromBase64String(String base64String) { Uint8List dataFromBase64String(String base64String) {
if(base64String !=null) if(base64String !=null)
return base64Decode(base64String); return base64Decode(base64String);
} }
String base64String(Uint8List data) { String base64String(Uint8List data) {

@ -516,6 +516,7 @@ class _PatientsScreenState extends State<PatientsScreen> {
.getFrom, .getFrom,
"to": "to":
patient.getTo, patient.getTo,
"isSearch":isSearch
}); });
}, },
); );

@ -1,37 +1,76 @@
import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.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_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:url_launcher/url_launcher.dart';
class RadiologyReportScreen extends StatelessWidget { class RadiologyReportScreen extends StatelessWidget {
final String reportData; final String reportData;
final String url;
RadiologyReportScreen({Key key, this.reportData}); RadiologyReportScreen({Key key, this.reportData, this.url});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppScaffold( return AppScaffold(
appBarTitle: TranslationBase.of(context).radiologyReport, appBarTitle: TranslationBase.of(context).radiologyReport,
body: Container( body: SingleChildScrollView(
padding: EdgeInsets.all(10), child: Column(
margin: EdgeInsets.all(10), children: [
decoration: BoxDecoration( Container(
borderRadius: BorderRadius.all(Radius.circular(10)), padding: EdgeInsets.all(10),
color: Colors.white, margin: EdgeInsets.all(10),
border: Border( decoration: BoxDecoration(
bottom: BorderSide(color: Colors.grey, width: 0.5), borderRadius: BorderRadius.all(Radius.circular(10)),
top: BorderSide(color: Colors.grey, width: 0.5), color: Colors.white,
left: BorderSide(color: Colors.grey, width: 0.5), border: Border(
right: BorderSide(color: Colors.grey, width: 0.5), bottom: BorderSide(color: Colors.grey, width: 0.5),
top: BorderSide(color: Colors.grey, width: 0.5),
left: BorderSide(color: Colors.grey, width: 0.5),
right: BorderSide(color: Colors.grey, width: 0.5),
),
),
child: AppText(
reportData,
fontSize: 2.5 * SizeConfig.textMultiplier,
),
),
SizedBox(height:MediaQuery.of(context).size.height * 0.13 ,)
],
), ),
), ),
child: AppText( bottomSheet: url == null
reportData, ? Container(
fontSize: 2.5 * SizeConfig.textMultiplier, height: MediaQuery.of(context).size.height * 0,
), )
), : Container(
); width: double.infinity,
height: MediaQuery.of(context).size.height * 0.1,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
FractionallySizedBox(
widthFactor: 0.9,
child: Container(
child: Wrap(
alignment: WrapAlignment.center,
children: <Widget>[
// TODO change it secondary button and add loading
AppButton(
title: TranslationBase.of(context).openRad,
onPressed: () async {
launch(url);
},
),
],
),
),
),
],
),
));
} }
} }

@ -102,6 +102,8 @@ class _RadiologyScreenState extends State<RadiologyScreen> {
reportData: model reportData: model
.patientRadiologyList[index] .patientRadiologyList[index]
.reportData, .reportData,
url: model
.patientRadiologyList[index].imageURL,
)), )),
); );
}, },

@ -1141,6 +1141,8 @@ class TranslationBase {
String get fileNumber => localizedValues['fileNumber'][locale.languageCode]; String get fileNumber => localizedValues['fileNumber'][locale.languageCode];
String get reschedule => localizedValues['reschedule'][locale.languageCode]; String get reschedule => localizedValues['reschedule'][locale.languageCode];
String get leaves => localizedValues['leaves'][locale.languageCode]; String get leaves => localizedValues['leaves'][locale.languageCode];
String get openRad => localizedValues['open-rad'][locale.languageCode];
} }
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> { class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -17,13 +17,13 @@ class AppScaffold extends StatelessWidget {
final bool isLoading; final bool isLoading;
final bool isShowAppBar; final bool isShowAppBar;
final BaseViewModel baseViewModel; final BaseViewModel baseViewModel;
final Widget bottomSheet;
AppScaffold( AppScaffold(
{this.appBarTitle = '', {this.appBarTitle = '',
this.body, this.body,
this.isLoading = false, this.isLoading = false,
this.isShowAppBar = true, this.isShowAppBar = true,
this.baseViewModel}); this.baseViewModel, this.bottomSheet});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -59,6 +59,8 @@ class AppScaffold extends StatelessWidget {
], ],
) )
: null, : null,
bottomSheet: bottomSheet,
body: projectProvider.isInternetConnection body: projectProvider.isInternetConnection
? baseViewModel != null ? baseViewModel != null
? NetworkBaseView( ? NetworkBaseView(

Loading…
Cancel
Save