diff --git a/.gitignore b/.gitignore index c8e6bcd9..6b5418ff 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ lib/generated_plugin_registrant.dart !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages .vscode/settings.json .vscode/settings.json +.vscode/settings.json +.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json index a1b95030..501a6f1f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "commentBox.styles": { "defaultStyle": { - "commentStartToken": "/* \n *@author: Elham Rababah \n *@Date:13/4/2020 \n *@param: \n *@return:\n *@desc: ", + "commentStartToken": "/* \n *@author: ibrahim albitar \n *@Date:27/4/2020 \n *@param: \n *@return:\n *@desc: ", "commentEndToken": "\n */", "leftEdgeToken": " * ", "rightEdgeToken": "", diff --git a/lib/config/config.dart b/lib/config/config.dart index e6c83c36..3c3a1491 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -1,10 +1,13 @@ const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/Services/'; const ONLY_NUMBERS = "[0-9]"; const ONLY_LETTERS = "[a-zA-Z]"; const ONLY_DATE = "[0-9/]"; + +const BASE_URL = 'https://hmgwebservices.com/Services/'; +const PHARMACY_ITEMS_URL = "Lists.svc/REST/GetPharmcyItems"; +const PHARMACY_LIST_URL = "Patients.svc/REST/GetPharmcyList"; //*********change value to decode json from Dropdown ************ var SERVICES_PATIANT = ["GetMyOutPatient", "GetMyInPatient", "GtMyDischargePatient","GtMyReferredPatient","GtMyDischargeReferralPatient","GtMyTomorrowPatient","GtMyReferralPatient"]; var SERVICES_PATIANT2 = ["List_MyOutPatient", "List_MyInPatient","List_MyDischargePatient" ,"List_MyReferredPatient","List_MyDischargeReferralPatient","List_MyTomorrowPatient","List_MyReferralPatient"]; var SERVICES_PATIANT_HEADER = ["OutPatient", "InPatient", "Discharge","Referred","Referral Discharge","Tomorrow","Referral"]; -//****************** \ No newline at end of file +//****************** diff --git a/lib/models/medicine_model.dart b/lib/models/medicine_model.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/models/pharmacies_List_request_model.dart b/lib/models/pharmacies_List_request_model.dart new file mode 100644 index 00000000..a2b4e5c2 --- /dev/null +++ b/lib/models/pharmacies_List_request_model.dart @@ -0,0 +1,67 @@ + +/* + *@author: Ibrahim Albitar + *@Date:27/4/2020 + *@param: + *@return: + *@desc: + */ + +class PharmaciesListRequestModel { + + + int itemID; + int languageID; + String stamp; + String ipAdress; + double versionID; + String tokenID; + String sessionID; + bool isLoginForDoctorApp; + bool patientOutSA; + int patientTypeID; + int channel; + + PharmaciesListRequestModel( + {this.itemID , + this.patientTypeID = 1, + this.languageID = 2, + this.stamp = '2020-04-23T21:01:21.492Z', + this.ipAdress = '11.11.11.11', + this.versionID = 1.2, + this.tokenID = '@dm!n', + this.sessionID = 'e29zoooEJ4', + this.isLoginForDoctorApp = true, + this.channel = 9, + this.patientOutSA = false}); + + PharmaciesListRequestModel.fromJson(Map json) { + itemID = json['ItemID']; + patientTypeID = json['PatientTypeID']; + languageID = json['LanguageID']; + stamp = json['stamp']; + ipAdress = json['IPAdress']; + versionID = json['VersionID']; + tokenID = json['TokenID']; + sessionID = json['SessionID']; + isLoginForDoctorApp = json['IsLoginForDoctorApp']; + channel = json['Channel']; + patientOutSA = json['PatientOutSA']; + } + + Map toJson() { + final Map data = new Map(); + data['ItemID'] = this.itemID; + data['PatientTypeID'] = this.patientTypeID; + data['LanguageID'] = this.languageID; + data['stamp'] = this.stamp; + data['IPAdress'] = this.ipAdress; + data['VersionID'] = this.versionID; + data['TokenID'] = this.tokenID; + data['SessionID'] = this.sessionID; + data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; + data['PatientOutSA'] = this.patientOutSA; + data['Channel'] = this.channel; + return data; + } +} \ No newline at end of file diff --git a/lib/models/pharmacies_items_request_model.dart b/lib/models/pharmacies_items_request_model.dart new file mode 100644 index 00000000..210c8db7 --- /dev/null +++ b/lib/models/pharmacies_items_request_model.dart @@ -0,0 +1,59 @@ +/* + *@author: Ibrahim Albitar + *@Date:27/4/2020 + *@param: + *@return: + *@desc: + */ +class PharmaciesItemsRequestModel { + String phrItemName; + int languageID; + String stamp; + String ipAdress; + double versionID; + String tokenID; + String sessionID; + bool isLoginForDoctorApp; + bool patientOutSA; + int patientTypeID; + + PharmaciesItemsRequestModel( + {this.phrItemName = '', + this.patientTypeID = 1, + this.languageID = 2, + this.stamp = '2020-04-23T21:01:21.492Z', + this.ipAdress = '11.11.11.11', + this.versionID = 1.2, + this.tokenID = '@dm!n', + this.sessionID = 'e29zoooEJ4', + this.isLoginForDoctorApp = true, + this.patientOutSA = false}); + + PharmaciesItemsRequestModel.fromJson(Map json) { + phrItemName = json['PHR_itemName']; + patientTypeID = json['PatientTypeID']; + languageID = json['LanguageID']; + stamp = json['stamp']; + ipAdress = json['IPAdress']; + versionID = json['VersionID']; + tokenID = json['TokenID']; + sessionID = json['SessionID']; + isLoginForDoctorApp = json['IsLoginForDoctorApp']; + patientOutSA = json['PatientOutSA']; + } + + Map toJson() { + final Map data = new Map(); + data['PHR_itemName'] = this.phrItemName; + data['PatientTypeID'] = this.patientTypeID; + data['LanguageID'] = this.languageID; + data['stamp'] = this.stamp; + data['IPAdress'] = this.ipAdress; + data['VersionID'] = this.versionID; + data['TokenID'] = this.tokenID; + data['SessionID'] = this.sessionID; + data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; + data['PatientOutSA'] = this.patientOutSA; + return data; + } +} diff --git a/lib/providers/medicine_provider.dart b/lib/providers/medicine_provider.dart index e69de29b..5e7a0ef4 100644 --- a/lib/providers/medicine_provider.dart +++ b/lib/providers/medicine_provider.dart @@ -0,0 +1,91 @@ +import 'dart:convert'; + +import 'package:doctor_app_flutter/client/app_client.dart'; +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/models/pharmacies_List_request_model.dart'; +import 'package:doctor_app_flutter/models/pharmacies_items_request_model.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:flutter/cupertino.dart'; + +class MedicineProvider with ChangeNotifier { + var pharmacyItemsList = []; + var pharmaciesList = []; + bool isFinished = false; + bool hasError = false; + String errorMsg = ''; + + PharmaciesItemsRequestModel _itemsRequestModel =PharmaciesItemsRequestModel(); + PharmaciesListRequestModel _listRequestModel = PharmaciesListRequestModel(); + + Future getMedicineItem(String itemName) async { + try { + if (await Helpers.checkConnection()) { + _itemsRequestModel.phrItemName = itemName; + final response = await AppClient.post(PHARMACY_ITEMS_URL, + body: json.encode(_itemsRequestModel.toJson())); + final int statusCode = response.statusCode; + if (statusCode < 200 || statusCode >= 400 || json == null) { + isFinished = true; + hasError = true; + errorMsg = 'Error While Fetching data'; + } else { + var parsed = json.decode(response.body.toString()); + if (parsed['MessageStatus'] == 1) { + pharmacyItemsList = parsed['ListPharmcy']; + hasError = false; + isFinished = true; + errorMsg = "Done"; + } else { + hasError = true; + errorMsg = parsed['ErrorMessage'] ?? parsed['ErrorEndUserMessage']; + } + } + } else { + isFinished = true; + hasError = true; + errorMsg = 'Please Check The Internet Connection'; + } + notifyListeners(); + } catch (error) { + throw error; + } + + return errorMsg; + } + + Future getPharmaciesList(int itemId) async { + try { + if (await Helpers.checkConnection()) { + _listRequestModel.itemID = itemId; + final response = await AppClient.post(PHARMACY_LIST_URL, + body: json.encode(_listRequestModel.toJson())); + final int statusCode = response.statusCode; + if (statusCode < 200 || statusCode >= 400 || json == null) { + isFinished = true; + hasError = true; + errorMsg = 'Error While Fetching data'; + } else { + var parsed = json.decode(response.body.toString()); + if (parsed['MessageStatus'] == 1) { + pharmaciesList = parsed['PharmList']; + hasError = false; + isFinished = true; + errorMsg = "Done"; + } else { + hasError = true; + errorMsg = parsed['ErrorMessage'] ?? parsed['ErrorEndUserMessage']; + } + } + } else { + isFinished = true; + hasError = true; + errorMsg = 'Please Check The Internet Connection'; + } + notifyListeners(); + } catch (error) { + throw error; + } + + return errorMsg; + } +} diff --git a/lib/routes.dart b/lib/routes.dart index ebba02ed..9c135640 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -3,6 +3,8 @@ import 'package:doctor_app_flutter/screens/doctor/services_screen.dart'; import './screens/doctor/my_schedule_screen.dart'; +import 'package:doctor_app_flutter/screens/medicine/pharmacies_list_screen.dart'; + import './screens/QR_reader_screen.dart'; import './screens/auth/change_password_screen.dart'; import './screens/auth/login_screen.dart'; @@ -33,10 +35,10 @@ const String PATIENTS = 'patients/patients'; const String PATIENTS_PROFILE = 'patients/patients-profile'; const String BLOOD_BANK = 'blood-bank'; const String DOCTOR_REPLY = 'doctor-reply'; +const String MEDICINE_SEARCH = 'medicine/medicine-search'; +const String PHARMACIES_LIST = 'medicine/pharmacies-list'; const String MESSAGES = 'messages'; const String SERVICES = 'services'; - -const String MEDICINE_SEARCH = 'medicine-search'; const String SETTINGS = 'settings'; const String VITAL_SIGN = 'vital-sign'; @@ -54,8 +56,9 @@ var routes = { SETTINGS: (_) => SettingsScreen(), CHANGE_PASSWORD: (_) => ChangePasswordScreen(), VERIFY_ACCOUNT: (_) => VerifyAccountScreen(), - VERIFICATION_METHODS: (_) => VerificationMethodsScreen(), - PATIENTS_PROFILE: (_) => PatientProfileScreen(), + VERIFICATION_METHODS:(_)=> VerificationMethodsScreen(), + PATIENTS_PROFILE:(_)=> PatientProfileScreen(), + PHARMACIES_LIST: (_) => PharmaciesListScreen(itemID: null,), VITAL_SIGN: (_) => VitalSignScreen(), MESSAGES: (_) => MessagesScreen(), SERVICES: (_) => ServicesScreen() diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 79ef6878..aade7083 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -1,5 +1,7 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/providers/doctor_reply_provider.dart'; +import 'package:doctor_app_flutter/providers/medicine_provider.dart'; +import 'package:doctor_app_flutter/screens/medicine/medicine_search_screen.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:provider/provider.dart'; import '../routes.dart'; @@ -212,7 +214,6 @@ class _DashboardScreenState extends State { flex: 2, child: InkWell( onTap: () { - Navigator.push( context, MaterialPageRoute( @@ -242,12 +243,25 @@ class _DashboardScreenState extends State { children: [ Expanded( flex: 2, - child: new DashboardItemIconText( - DoctorApp.home_icon, - "", - "In Patient", - showBorder: false, - backgroundColor: Colors.blueGrey[900], + child: InkWell( + child: DashboardItemIconText( + DoctorApp.home_icon, + "", + "In Patient", + showBorder: false, + backgroundColor: Colors.blueGrey[900], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChangeNotifierProvider( + create: (_) => MedicineProvider(), + child: MedicineSearchScreen(), + ), + ), + ); + }, ), ), Expanded( diff --git a/lib/screens/medicine/medicine_search_screen.dart b/lib/screens/medicine/medicine_search_screen.dart index 11e4d6ea..d49adb22 100644 --- a/lib/screens/medicine/medicine_search_screen.dart +++ b/lib/screens/medicine/medicine_search_screen.dart @@ -1,9 +1,128 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/providers/medicine_provider.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_toast_msg.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/widgets/medicine/medicine_item_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_text_form_field.dart'; +import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; import 'package:flutter/material.dart'; -class MedicineSearchScreen extends StatelessWidget { +import 'package:provider/provider.dart'; +import '../../util/extenstions.dart'; + +DrAppSharedPreferances sharedPref = DrAppSharedPreferances(); + +class MedicineSearchScreen extends StatefulWidget with DrAppToastMsg { + MedicineSearchScreen({this.changeLoadingStata}); + final Function changeLoadingStata; + + @override + _MedicineSearchState createState() => _MedicineSearchState(); +} + +class _MedicineSearchState extends State { + var data; + final myController = TextEditingController(); + Helpers helpers = new Helpers(); + + MedicineProvider _medicineProvider; + @override Widget build(BuildContext context) { - return Container( - - ); + _medicineProvider = Provider.of(context); + return AppScaffold( + appBarTitle: "Search Medicine", + body: Column( + children: [ + RoundedContainer( + child: Column( + children: [ + Icon( + Icons.search, + size: SizeConfig.imageSizeMultiplier * 15, + ), + Padding( + padding: EdgeInsets.only( + bottom: SizeConfig.heightMultiplier * 5, + right: SizeConfig.heightMultiplier * 3, + left: SizeConfig.heightMultiplier * 3, + top: SizeConfig.heightMultiplier * 3), + child: AppTextFormField( + hintText: 'Type Medicine Name Here..', + controller: myController, + onSaved: (value) {}, + // validator: (value) { + // return TextValidator().validateName(value); + // }, + inputFormatter: ONLY_LETTERS), + ) + ], + )), + Container( + margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5), + child: Wrap( + alignment: WrapAlignment.center, + children: [ + AppButton( + title: "Search", + color: Color(0xff58434F), + onPressed: () { + searchMedicine(context); + }, + ), + ], + ), + ), + Expanded( + child: Container( + width: SizeConfig.screenWidth * 0.80, + child: ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: data == null ? 0 : data.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + child: MedicineItemWidget( + label: data[index]["ItemDescription"], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChangeNotifierProvider( + create: (_) => MedicineProvider(), + child: PharmaciesListScreen( + itemID: data[index]["ItemID"]), + ), + ), + ); + }, + ); + }, + ), + ), + ), + ], + )); + } + + searchMedicine(context) { + FocusScope.of(context).unfocus(); + if (myController.text.isNullOrEmpty()) { + this.setState(() { + data = null; + }); + helpers.showErrorToast("Type Medicine Name"); + return; + } + _medicineProvider.getMedicineItem(myController.text).then((str) { + this.setState(() { + data = _medicineProvider.pharmacyItemsList; + }); + }); } -} \ No newline at end of file +} diff --git a/lib/screens/medicine/pharmacies_list_screen.dart b/lib/screens/medicine/pharmacies_list_screen.dart new file mode 100644 index 00000000..c68da864 --- /dev/null +++ b/lib/screens/medicine/pharmacies_list_screen.dart @@ -0,0 +1,128 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/models/pharmacies_List_request_model.dart'; +import 'package:doctor_app_flutter/providers/medicine_provider.dart'; +import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/widgets/medicine/medicine_item_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/rounded_container_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +DrAppSharedPreferances sharedPref = DrAppSharedPreferances(); + +class PharmaciesListScreen extends StatefulWidget { + final int itemID; + + // In the constructor, require a item id. + PharmaciesListScreen({Key key, @required this.itemID}) : super(key: key); + + @override + _PharmaciesListState createState() => _PharmaciesListState(); +} + +class _PharmaciesListState extends State { + var _data; + Helpers helpers = new Helpers(); + MedicineProvider _medicineProvider; + + @override + Widget build(BuildContext context) { + _medicineProvider = Provider.of(context); + pharmaciesList(); + return AppScaffold( + appBarTitle: "Pharmacies List", + body: Column( + children: [ + RoundedContainer( + child: !_medicineProvider.isFinished + ? DrAppCircularProgressIndeicator() + : _medicineProvider.hasError + ? Center( + child: Text( + _medicineProvider.errorMsg, + style: TextStyle( + color: Theme.of(context).errorColor), + ), + ) + : Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + AppText( + "Description", + margin: 10, + fontWeight: FontWeight.bold, + ), + AppText( + _data[0]["ItemDescription"], + marginLeft: 10, + marginTop: 0, + marginRight: 10, + marginBottom: 10, + ), + AppText( + "Price", + margin: 10, + fontWeight: FontWeight.bold, + ), + AppText( + _data[0]["SellingPrice"].toString(), + marginLeft: 10, + marginTop: 0, + marginRight: 10, + marginBottom: 10, + ), + ], + )), + Container( + margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5), + child: Align( + alignment: Alignment.centerLeft, + child: AppText( + "You can Find it in", + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 3, + ))), + Expanded( + child: Container( + width: SizeConfig.screenWidth * 0.80, + child: ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: _data == null ? 0 : _data.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + child: MedicineItemWidget( + label: _data[index]["LocationDescription"], + ), + onTap: () { + //Navigator.of(context).pushNamed(PHARMACIES_LIST); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PharmaciesListScreen( + itemID: _data[index]["ItemID"]), + ), + ); + }, + ); + }, + ), + ), + ), + ], + )); + } + + Future pharmaciesList() async { + _medicineProvider.getPharmaciesList(widget.itemID).then((result) { + this.setState(() { + _data = _medicineProvider.pharmaciesList; + }); + }); + return true; + } +} diff --git a/lib/widgets/medicine/medicine_item_widget.dart b/lib/widgets/medicine/medicine_item_widget.dart new file mode 100644 index 00000000..56cf4638 --- /dev/null +++ b/lib/widgets/medicine/medicine_item_widget.dart @@ -0,0 +1,51 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; + +import '../shared/rounded_container_widget.dart'; +import '../shared/app_texts_widget.dart'; +import 'package:flutter/material.dart'; + +/* + *@author: ibrahim albitar + *@Date:28/4/2020 + *@param: + *@return: + *@desc: + */ + +class MedicineItemWidget extends StatefulWidget { + +final String label; +final Color backgroundColor; +final bool showBorder; +final Color borderColor; + +MedicineItemWidget({ @required this.label, this.backgroundColor = Colors.white, this.showBorder = false, this.borderColor = Colors.white}); + @override + _MedicineItemWidgetState createState() => _MedicineItemWidgetState(); +} + +class _MedicineItemWidgetState extends State { + @override + Widget build(BuildContext context) { + return new RoundedContainer( + height: SizeConfig.heightMultiplier * 8, + child:Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + RoundedContainer( + width: SizeConfig.widthMultiplier * 2, + backgroundColor: Colors.red, + margin: 0, + topLeft: 6, + topRight: 0, + bottomLeft: 6, + bottomRight: 0, + customCornerRaduis: true, + child: SizedBox(width: SizeConfig.widthMultiplier, height: SizeConfig.heightMultiplier*3,), + ), + Expanded(child: Padding( padding: EdgeInsets.all(5), child: Align( alignment: Alignment.centerLeft, child: AppText(widget.label)))) + ],), + backgroundColor: widget.backgroundColor, showBorder: widget.showBorder, borderColor: widget.borderColor, margin: 4, raduis: 10,); + } +} \ No newline at end of file