diff --git a/assets/images/dr_app_logo.png b/assets/images/dr_app_logo.png new file mode 100644 index 00000000..cc9186c2 Binary files /dev/null and b/assets/images/dr_app_logo.png differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cddfd571..0575cdb6 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -142,4 +142,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 649616dc336b3659ac6b2b25159d8e488e042b69 -COCOAPODS: 1.10.0.beta.1 +COCOAPODS: 1.9.3 diff --git a/lib/client/app_client.dart b/lib/client/app_client.dart deleted file mode 100644 index 89b62722..00000000 --- a/lib/client/app_client.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/interceptor/http_interceptor.dart'; -import 'package:http/http.dart'; - -// OWNER : Ibrahim albitar -// DATE : 22-04-2020 -// DESCRIPTION : Custom App client to pin base url for all srvices - -class AppClient { - static Client client = HttpInterceptor().getClient(); - - static Future post(dynamic path, {dynamic body}) async { - String _fullUrl = BASE_URL + path; - final response = await client.post(_fullUrl, body: body); - return response; - } -} diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart index 3ca3d40a..d497d8f7 100644 --- a/lib/client/base_app_client.dart +++ b/lib/client/base_app_client.dart @@ -59,7 +59,7 @@ class BaseAppClient { body['stamp'] = STAMP; body['IPAdress'] = IP_ADDRESS; body['VersionID'] = VERSION_ID; - if (body['Channel'] == null) body['Channel'] = CHANNEL; + body['Channel'] = CHANNEL; body['SessionID'] = SESSION_ID; body['IsLoginForDoctorApp'] = IS_LOGIN_FOR_DOCTOR_APP; body['PatientOutSA'] = 0; // PATIENT_OUT_SA; diff --git a/lib/config/config.dart b/lib/config/config.dart index e5b948ec..6549ada5 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -2,8 +2,8 @@ const MAX_SMALL_SCREEN = 660; const ONLY_NUMBERS = "[0-9]"; const ONLY_LETTERS = "[a-zA-Z &'\"]"; const ONLY_DATE = "[0-9/]"; -const BASE_URL = 'https://hmgwebservices.com/'; -//const BASE_URL = 'https://uat.hmgwebservices.com/'; +//const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const PHARMACY_ITEMS_URL = "Services/Lists.svc/REST/GetPharmcyItems_Region_enh"; const PHARMACY_LIST_URL = "Services/Patients.svc/REST/GetPharmcyList"; const PATIENT_PROGRESS_NOTE_URL = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 93f4a6b8..9d7d73c9 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -56,11 +56,8 @@ const Map> localizedValues = { 'en': 'Only Arrived Patient', 'ar': 'المريض الذي حضر للموعد' }, - 'searchMedicineNameHere': { - 'en': 'Search Medicine Name Here', - 'ar': 'ابحث عن الدواء هنا' - }, - 'youCanFind': {'en': 'You Can Find', 'ar': 'تستطيع ان تجد '}, + 'searchMedicineNameHere': {'en': 'Search Medicine ', 'ar': 'ابحث هنا'}, + 'youCanFind': {'en': 'You Can Find ', 'ar': 'تستطيع ان تجد '}, 'itemsInSearch': {'en': 'items in search', 'ar': 'عناصر في البحث'}, 'qrReader': {'en': 'QR Reader', 'ar': 'قارىء رمز الQR'}, 'startScanning': {'en': 'Start Scanning', 'ar': 'بدء المسح'}, @@ -220,4 +217,19 @@ const Map> localizedValues = { 'endcallwithcharge': {'en': 'End with charge', 'ar': 'ينتهي مع الشحن'}, 'endcall': {'en': 'End Call', 'ar': 'إنهاء المكالمة'}, 'transfertoadmin': {'en': 'Transfer to admin', 'ar': 'نقل إلى المسؤول'}, + "searchMedicineImageCaption": { + 'en': 'Type or speak the medicine name to search', + 'ar': ' اكتب أو انطق اسم الدواء للبحث' + }, + "type": {'en': 'Type or Speak', 'ar': 'اكتب أو تحدث '}, + "fromDate": {'en': 'From Date', 'ar': 'من تاريخ'}, + "toDate": {'en': 'To Date', 'ar': 'الى تاريخ'}, + "searchPatientImageCaptionTitle": { + 'en': 'SEARCH PATIENT', + 'ar': 'البحث عن المريض' + }, + "searchPatientImageCaptionBody": { + 'en': 'Add Details Of Patient To search', + 'ar': ' أضف تفاصيل المريض للبحث' + }, }; diff --git a/lib/interceptor/http_interceptor.dart b/lib/interceptor/http_interceptor.dart deleted file mode 100644 index 958be49c..00000000 --- a/lib/interceptor/http_interceptor.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'dart:convert'; - -import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; -import 'package:doctor_app_flutter/providers/auth_provider.dart'; -import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; -import 'package:http/http.dart'; -import 'package:http_interceptor/http_interceptor.dart'; - -import '../providers/auth_provider.dart'; -import '../util/dr_app_shared_pref.dart'; -import 'package:doctor_app_flutter/config/config.dart'; - -DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); -List publicUrls = [ - LOGIN_URL, - SELECT_DEVICE_IMEI, - MEMBER_CHECK_ACTIVATION_CODE_NEW, - SEND_ACTIVATION_CODE_BY_OTP_NOTIFICATION_TYPE -]; - -class HttpInterceptor extends InterceptorContract { - Client getClient() { - return HttpClientWithInterceptor.build(interceptors: [this]); - } - - Future interceptRequest({RequestData data}) async { - print('RequestData ${data.body}'); - print('RequestData ${data.url}'); - try { - data.headers["Content-Type"] = "application/json"; - data.headers["Accept"] = "application/json"; - // if (publicUrls.contains(data.url)) { - // var loggedUserInfo = await sharedPref.getObj(LOGGED_IN_USER); - // var token = await sharedPref.getString(TOKEN); - // // print("token"+token); - // // print('loggedUserInfo${loggedUserInfo["LogInTokenID"]}'); - // // // the sevices handel the token in differat name so I ask to be change - // // // we must change the imple - // var body = json.decode(data.body); - // body['LogInTokenID']=token; - // data.body = json.encode(body); - - // // data.body['LogInTokenID'] = ''; - // } else { - // if (data.body['LogInTokenID']) { - // data.body['LogInTokenID'] = ''; - // } - // if (data.body['TokenID']) { - // data.body['TokenID'] = ''; - // } - // } - } catch (e) { - print(e); - } - - // print('data.body${data.body}'); - return data; - } - - @override - Future interceptResponse({ResponseData data}) async { - // print('ResponseData ${data.body}'); - return data; - } -} diff --git a/lib/landing_page.dart b/lib/landing_page.dart index 5febcf56..dc3c5d3c 100644 --- a/lib/landing_page.dart +++ b/lib/landing_page.dart @@ -41,7 +41,7 @@ class _LandingPageState extends State { backgroundColor: Hexcolor('#515B5D'), textTheme: TextTheme( headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), + TextStyle(color: Colors.white)), title: Text(getText(currentTab).toUpperCase()), leading: Builder( builder: (BuildContext context) { diff --git a/lib/providers/patients_provider.dart b/lib/providers/patients_provider.dart index 15c9e1e4..805b48dd 100644 --- a/lib/providers/patients_provider.dart +++ b/lib/providers/patients_provider.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:doctor_app_flutter/client/app_client.dart'; import 'package:doctor_app_flutter/client/base_app_client.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 4e2dbfc6..df4853f1 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -85,7 +85,7 @@ class _DashboardScreenState extends State { Column( children: [ Container( - height: 150, + height: 140, color: Hexcolor('#515B5D'), width: double.infinity, child: FractionallySizedBox( @@ -101,7 +101,7 @@ class _DashboardScreenState extends State { children: [ AppText( "Welcome", - fontSize: SizeConfig.textMultiplier * 2, + fontSize: SizeConfig.textMultiplier * 1.7, color: Colors.white, ) ], @@ -130,7 +130,7 @@ class _DashboardScreenState extends State { : authProvider.doctorProfile .clinicDescription, fontSize: - SizeConfig.textMultiplier * 2, + SizeConfig.textMultiplier * 1.7, color: Colors.white, ), alignment: projectsProvider.isArabic @@ -201,14 +201,14 @@ class _DashboardScreenState extends State { ), Container( color: Colors.white, - height: 150, + height: 90, ), ], ), Positioned( - right: 0.0, - left: 0, - bottom: 40, + right: 9.0, + left: 9, + bottom: 19, child: Container( decoration: BoxDecoration( color: Hexcolor("#DED8CF"), @@ -376,10 +376,11 @@ class _DashboardScreenState extends State { ) ]), FractionallySizedBox( - widthFactor: 0.95, + widthFactor: 0.90, child: Container( color: Colors.white, child: Column( + mainAxisAlignment: MainAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -544,7 +545,7 @@ class _DashboardScreenState extends State { width: MediaQuery .of(context) .size - .width * 0.45, + .width * 0.44, height: MediaQuery .of(context) .orientation == Orientation.portrait @@ -598,7 +599,7 @@ class _DashboardScreenState extends State { width: MediaQuery .of(context) .size - .width * 0.45, + .width * 0.44, height: MediaQuery .of(context) .orientation == Orientation.portrait diff --git a/lib/screens/medicine/medicine_search_screen.dart b/lib/screens/medicine/medicine_search_screen.dart index 48a53af3..cdfaefb2 100644 --- a/lib/screens/medicine/medicine_search_screen.dart +++ b/lib/screens/medicine/medicine_search_screen.dart @@ -1,10 +1,12 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/icons_app/doctor_app_icons.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/util/translations_delegate_base.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'; @@ -13,7 +15,6 @@ 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:flutter/material.dart'; import 'package:provider/provider.dart'; - import '../../util/extenstions.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -89,124 +90,154 @@ class _MedicineSearchState extends State { Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).searchMedicine, - body: Column( - children: [ - Padding( - padding: EdgeInsets.only( - bottom: SizeConfig.heightMultiplier * 1, - right: SizeConfig.heightMultiplier * 2, - left: SizeConfig.heightMultiplier * 2, - top: SizeConfig.heightMultiplier * 3), - child: AppTextFormField( - hintText: TranslationBase.of(context).searchMedicineNameHere, - controller: myController, - onSaved: (value) {}, - onFieldSubmitted: (value) { - searchMedicine(context); - }, - textInputAction: TextInputAction.search, - prefix: IconButton( - icon: Icon(Icons.mic), - color: - lastStatus == 'listening' ? Colors.red : Colors.grey, - onPressed: () { - myController.text = ''; - setState(() { - lastStatus = 'listening'; - }); - - startVoiceSearch(); - }), - inputFormatter: ONLY_LETTERS), - ), - Container( - margin: EdgeInsets.only( - bottom: SizeConfig.heightMultiplier * 1, - right: SizeConfig.heightMultiplier * 2, - left: SizeConfig.heightMultiplier * 2, - top: SizeConfig.heightMultiplier * 1), - child: Wrap( - alignment: WrapAlignment.center, + body: FractionallySizedBox( + widthFactor: 0.97, + child: ListView( + children: [ + Column( children: [ - AppButton( - title: TranslationBase.of(context).search, - color: Color(PRIMARY_COLOR), - onPressed: () { - searchMedicine(context); - }, + Container( + child: Icon( + DoctorApp.medicinesearch, + size: 100, + color: Colors.black, + ), + margin: EdgeInsets.only(top: 50), ), - ], - ), - ), - Container( - margin: EdgeInsets.only(left: SizeConfig.heightMultiplier * 2), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText( - TranslationBase.of(context).youCanFind + - (_medicineProvider.pharmacyItemsList == null - ? "0" - : _medicineProvider.pharmacyItemsList.length - .toString()) + - TranslationBase.of(context).itemsInSearch, - fontWeight: FontWeight.bold, - margin: 5, + 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, + ), + ) ], ), - ), - Expanded( - child: Container( - width: SizeConfig.screenWidth * 0.90, - child: !_medicineProvider.isFinished - ? DrAppCircularProgressIndeicator() - : _medicineProvider.hasError - ? Center( - child: Text( - _medicineProvider.errorMsg, - style: TextStyle( - color: Theme.of(context).errorColor), + SizedBox(height: 15,), + FractionallySizedBox( + widthFactor: 0.9, + child: Column( + children: [ + Container( + child: AppTextFormField( + hintText: TranslationBase.of(context).searchMedicineNameHere, + controller: myController, + onSaved: (value) {}, + onFieldSubmitted: (value) { + searchMedicine(context); + }, + textInputAction: TextInputAction.search, + prefix: IconButton( + icon: Icon(Icons.mic), + color: + lastStatus == 'listening' ? Colors.red : Colors.grey, + onPressed: () { + myController.text = ''; + setState(() { + lastStatus = 'listening'; + }); + + startVoiceSearch(); + }), + inputFormatter: ONLY_LETTERS), + ), + SizedBox(height: 15,), + + Container( + child: Wrap( + alignment: WrapAlignment.center, + children: [ + AppButton( + title: TranslationBase + .of(context) + .search, + onPressed: () { + searchMedicine(context); + }, + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(left: SizeConfig.heightMultiplier * 2), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + TranslationBase + .of(context) + .youCanFind + + _medicineProvider.pharmacyItemsList.length + .toString() +" "+ + TranslationBase + .of(context) + .itemsInSearch, + fontWeight: FontWeight.bold, + ), + ], + ), + ), + Container( + child: !_medicineProvider.isFinished + ? DrAppCircularProgressIndeicator() + : _medicineProvider.hasError + ? Center( + child: Text( + _medicineProvider.errorMsg, + style: TextStyle( + color: Theme.of(context).errorColor), + ), + ) + : ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: _medicineProvider.pharmacyItemsList == + null + ? 0 + : _medicineProvider.pharmacyItemsList.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + child: MedicineItemWidget( + label: + _medicineProvider.pharmacyItemsList[index] + ["ItemDescription"], + url: + _medicineProvider.pharmacyItemsList[index] + ["ProductImageBase64"], ), - ) - : ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - itemCount: _medicineProvider.pharmacyItemsList == - null - ? 0 - : _medicineProvider.pharmacyItemsList.length, - itemBuilder: (BuildContext context, int index) { - return InkWell( - child: MedicineItemWidget( - label: - _medicineProvider.pharmacyItemsList[index] - ["ItemDescription"], - url: - _medicineProvider.pharmacyItemsList[index] - ["ImageThumbUrl"], + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + PharmaciesListScreen( + itemID: _medicineProvider + .pharmacyItemsList[index] + ["ItemID"], + url: _medicineProvider + .pharmacyItemsList[index] + ["ProductImageBase64"]), ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - PharmaciesListScreen( - itemID: _medicineProvider - .pharmacyItemsList[index] - ["ItemID"], - url: _medicineProvider - .pharmacyItemsList[index] - ["ProductImageBase64"]), - ), - ); - }, ); }, - ), + ); + }, + ), + ), + ], + ), ), - ), - ], + + ], + ), )); } diff --git a/lib/screens/patients/patient_search_screen.dart b/lib/screens/patients/patient_search_screen.dart index 54eaf5ee..2a36c216 100644 --- a/lib/screens/patients/patient_search_screen.dart +++ b/lib/screens/patients/patient_search_screen.dart @@ -1,26 +1,27 @@ import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; +import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; import 'package:doctor_app_flutter/models/patient/patient_model.dart'; import 'package:doctor_app_flutter/providers/project_provider.dart'; import 'package:doctor_app_flutter/routes.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/util/translations_delegate_base.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; +import '../../config/config.dart'; import '../../config/size_config.dart'; +import '../../lookups/patient_lookup.dart'; +import '../../models/doctor/doctor_profile_model.dart'; +import '../../widgets/patients/dynamic_elements.dart'; import '../../widgets/shared/app_buttons_widget.dart'; import '../../widgets/shared/app_scaffold_widget.dart'; import '../../widgets/shared/app_text_form_field.dart'; import '../../widgets/shared/app_texts_widget.dart'; import '../../widgets/shared/rounded_container_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; - -import '../../lookups/patient_lookup.dart'; -import '../../widgets/patients/dynamic_elements.dart'; -import '../../config/config.dart'; -import '../../models/doctor/doctor_profile_model.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:provider/provider.dart'; DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); Helpers helpers = Helpers(); @@ -126,10 +127,35 @@ class _PatientSearchScreenState extends State { RoundedContainer( child: Column( children: [ - Icon( - Icons.search, - size: SizeConfig.imageSizeMultiplier * 15, + Column( + children: [ + Container( + child: Icon( + DoctorApp.search_patient, + size: 100, + color: Colors.black, + ), + margin: EdgeInsets.only(top: 10), + ), + Padding( + padding: const EdgeInsets.only(top: 12.0), + child: AppText( + TranslationBase.of(context).searchPatientImageCaptionTitle.toUpperCase(), + fontWeight: FontWeight.bold, + fontSize: SizeConfig.heightMultiplier * 2.5, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 5.0), + child: AppText( + TranslationBase.of(context) + .searchPatientImageCaptionBody, + fontSize: SizeConfig.heightMultiplier * 2, + ), + ) + ], ), + Container( padding: EdgeInsets.all(15), width: SizeConfig.screenWidth * 1, @@ -143,20 +169,18 @@ class _PatientSearchScreenState extends State { height: 5, ), Container( + height: 40.0, decoration: ShapeDecoration( shape: RoundedRectangleBorder( side: BorderSide( width: 1.0, style: BorderStyle.solid, - color: Color(0xff707070)), + color: Hexcolor("#CCCCCC")), borderRadius: - BorderRadius.all(Radius.circular(5.0)), + BorderRadius.all(Radius.circular(6.0)), ), ), - // margin: 0, - // showBorder: true, - // raduis: 30, - // borderColor: Color(0xff707070), + width: double.infinity, child: Padding( padding: EdgeInsets.only( @@ -171,53 +195,54 @@ class _PatientSearchScreenState extends State { // add Expanded to have your dropdown button fill remaining space child: DropdownButtonHideUnderline( child: DropdownButton( - isExpanded: true, - value: _selectedType, - iconSize: 40, - elevation: 16, - selectedItemBuilder: - (BuildContext context) { - return PATIENT_TYPE.map((item) { - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - !projectsProvider.isArabic - ? AppText( - item['text'], - fontSize: SizeConfig - .textMultiplier * - 2.1, - ) - : AppText( - item['text_ar'], - fontSize: SizeConfig - .textMultiplier * - 2.1, - ), - ], - ); - }).toList(); - }, - onChanged: (String newValue) => { - setState(() { - _selectedType = newValue; - selectedPatientType = - int.parse(_selectedType); - }) - }, - items: PATIENT_TYPE.map((item) { - !projectsProvider.isArabic - ? itemText = item['text'] - : itemText = item['text_ar']; - return DropdownMenuItem( - child: Text( - itemText, - textAlign: TextAlign.end, - ), - value: item['val'], - ); - }).toList(), - )), + isExpanded: true, + value: _selectedType, + iconSize: 25, + elevation: 16, + selectedItemBuilder: + (BuildContext context) { + return PATIENT_TYPE.map((item) { + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + !projectsProvider.isArabic + ? AppText( + item['text'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + ) + : AppText( + item['text_ar'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + ), + ], + ); + }).toList(); + }, + onChanged: (String newValue) => + { + setState(() { + _selectedType = newValue; + selectedPatientType = + int.parse(_selectedType); + }) + }, + items: PATIENT_TYPE.map((item) { + !projectsProvider.isArabic + ? itemText = item['text'] + : itemText = item['text_ar']; + return DropdownMenuItem( + child: Text( + itemText, + textAlign: TextAlign.end, + ), + value: item['val'], + ); + }).toList(), + )), ), ], ), @@ -226,134 +251,212 @@ class _PatientSearchScreenState extends State { SizedBox( height: 10, ), - AppTextFormField( - hintText: TranslationBase.of(context).firstName, - onSaved: (value) { - value == null - ? _patientSearchFormValues.setFirstName = - "0" - : _patientSearchFormValues.setFirstName = - value; + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( - if (value.toString().trim().isEmpty) { - _patientSearchFormValues.setFirstName = "0"; - } - }, - // validator: (value) { - // return TextValidator().validateName(value); - // }, - inputFormatter: ONLY_LETTERS), - SizedBox( - height: 10, + labelText: TranslationBase + .of(context) + .firstName, + borderColor: Colors.white, + + onSaved: (value) { + value == null + ? _patientSearchFormValues.setFirstName = + "0" + : _patientSearchFormValues.setFirstName = + value; + + if (value + .toString() + .trim() + .isEmpty) { + _patientSearchFormValues.setFirstName = "0"; + } + }, + // validator: (value) { + // return TextValidator().validateName(value); + // }, + inputFormatter: ONLY_LETTERS), ), - AppTextFormField( - hintText: TranslationBase.of(context).middleName, - onSaved: (value) { - value == null - ? _patientSearchFormValues.setMiddleName = - "0" - : _patientSearchFormValues.setMiddleName = - value; - if (value.toString().trim().isEmpty) { - _patientSearchFormValues.setMiddleName = "0"; - } - }, - // validator: (value) { - // return TextValidator().validateName(value); - // }, - inputFormatter: ONLY_LETTERS), SizedBox( height: 10, ), - AppTextFormField( - hintText: TranslationBase.of(context).lastName, - onSaved: (value) { - value == null - ? _patientSearchFormValues.setLastName = "0" - : _patientSearchFormValues.setLastName = - value; - if (value.toString().trim().isEmpty) { - _patientSearchFormValues.setLastName = "0"; - } - }, - inputFormatter: ONLY_LETTERS), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( + labelText: TranslationBase + .of(context) + .middleName, + borderColor: Colors.white, + onSaved: (value) { + value == null + ? _patientSearchFormValues.setMiddleName = + "0" + : _patientSearchFormValues.setMiddleName = + value; + if (value + .toString() + .trim() + .isEmpty) { + _patientSearchFormValues.setMiddleName = + "0"; + } + }, + // validator: (value) { + // return TextValidator().validateName(value); + // }, + inputFormatter: ONLY_LETTERS), + ), SizedBox( height: 10, ), - AppTextFormField( - textInputType: TextInputType.number, - hintText: TranslationBase.of(context).phoneNumber, - // validator: (value) { - // return TextValidator().validateMobile(value); - // }, - inputFormatter: ONLY_NUMBERS, - onSaved: (value) { - value == null - ? _patientSearchFormValues - .setPatientMobileNumber = "0" - : _patientSearchFormValues - .setPatientMobileNumber = value; - - if (value.toString().trim().isEmpty) { - _patientSearchFormValues - .setPatientMobileNumber = "0"; - } - }, + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( + labelText: TranslationBase + .of(context) + .lastName, + borderColor: Colors.white, + onSaved: (value) { + value == null + ? + _patientSearchFormValues.setLastName = "0" + : _patientSearchFormValues.setLastName = + value; + if (value + .toString() + .trim() + .isEmpty) { + _patientSearchFormValues.setLastName = "0"; + } + }, + inputFormatter: ONLY_LETTERS), ), SizedBox( height: 10, ), - AppTextFormField( + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( + labelText: TranslationBase + .of(context) + .phoneNumber, + borderColor: Colors.white, textInputType: TextInputType.number, - hintText: TranslationBase.of(context).patientID, - // inputFormatter: ONLY_NUMBERS, onSaved: (value) { - // _patientSearchFormValues.PatientID = 89000; - value == null - ? _patientSearchFormValues.setPatientID = 0 - : _patientSearchFormValues.setPatientID = - int.parse(value); - if (value.toString().trim().isEmpty) { - _patientSearchFormValues.setPatientID = 0; + ? _patientSearchFormValues + .setPatientMobileNumber = "0" + : _patientSearchFormValues + .setPatientMobileNumber = value; + + if (value + .toString() + .trim() + .isEmpty) { + _patientSearchFormValues + .setPatientMobileNumber = "0"; } - }), + }, + ), + ), + SizedBox( + height: 10, + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( + labelText: TranslationBase + .of(context) + .patientID, + borderColor: Colors.white, + textInputType: TextInputType.number, + inputFormatter: ONLY_NUMBERS, + onSaved: (value) { + value == null + ? + _patientSearchFormValues.setPatientID = 0 + : _patientSearchFormValues.setPatientID = + int.parse(value); + if (value + .toString() + .trim() + .isEmpty) { + _patientSearchFormValues.setPatientID = 0; + } + }), + ), SizedBox( height: 10, ), - AppTextFormField( - textInputType: TextInputType.number, - hintText: TranslationBase.of(context).patientFile, - // validator: (value) { - // return TextValidator().validateIdNumber(value); - // }, - inputFormatter: ONLY_NUMBERS, - onSaved: (value) { - //_patientSearchFormValues. = value; - }, + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: Hexcolor("#CCCCCC")) + ), + padding: EdgeInsets.only(top: 5), + child: AppTextFormField( + labelText: TranslationBase + .of(context) + .patientFile, + borderColor: Colors.white, + textInputType: TextInputType.number, + inputFormatter: ONLY_NUMBERS, + onSaved: (value) {}, + ), ), (!(_selectedType == '2' || _selectedType == '4')) ? DynamicElements(_patientSearchFormValues) : SizedBox( - height: 0, - ), + height: 0, + ), SizedBox( height: 10, ), Container( - // margin: 0, - // showBorder: true, - // raduis: 30, - // borderColor: Color(0xff707070), + height: 40.0, decoration: ShapeDecoration( shape: RoundedRectangleBorder( side: BorderSide( width: 1.0, style: BorderStyle.solid, - color: Color(0xff707070)), + color: Hexcolor("#CCCCCC")), borderRadius: - BorderRadius.all(Radius.circular(5.0)), + BorderRadius.all(Radius.circular(6.0)), ), ), width: double.infinity, @@ -370,29 +473,29 @@ class _PatientSearchScreenState extends State { // add Expanded to have your dropdown button fill remaining space child: DropdownButtonHideUnderline( child: DropdownButton( - isExpanded: true, - value: _selectedLocation, - iconSize: 40, - elevation: 16, - selectedItemBuilder: - (BuildContext context) { - return LOCATIONS.map((item) { - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - !projectsProvider.isArabic - ? AppText( - item['text'], - fontSize: SizeConfig - .textMultiplier * - 2.1, - ) - : AppText( - item['text-ar'], - fontSize: SizeConfig - .textMultiplier * - 2.1, - ) + isExpanded: true, + value: _selectedLocation, + iconSize: 25, + elevation: 16, + selectedItemBuilder: + (BuildContext context) { + return LOCATIONS.map((item) { + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + !projectsProvider.isArabic + ? AppText( + item['text'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + ) + : AppText( + item['text-ar'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + ) ], ); }).toList(); @@ -414,25 +517,43 @@ class _PatientSearchScreenState extends State { value: item['val'], ); }).toList(), - )), + )), ), ], ), ), ), + SizedBox( + height: 10, + ), Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Checkbox( - value: true, - activeColor: Color(0xffFFDDD9), - onChanged: (bool newValue) {}), - AppText( - TranslationBase.of(context) - .onlyArrivedPatient, - fontSize: SizeConfig.textMultiplier * 2), - ])), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: Hexcolor("#CCCCCC")) + ), + height: 25, + width: 25, + child: Checkbox( + value: true, + checkColor: Hexcolor("#2A930A"), + activeColor: Colors.white, + onChanged: (bool newValue) {}), + ), + SizedBox(width: 12,), + AppText( + TranslationBase + .of(context) + .onlyArrivedPatient, + fontSize: SizeConfig.textMultiplier * + 2), + ])), SizedBox( height: 10, ), @@ -450,7 +571,6 @@ class _PatientSearchScreenState extends State { children: [ AppButton( title: TranslationBase.of(context).search, - color: Color(0xff58434F), onPressed: () { _validateInputs(); }, diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index a8821dda..6e01b3c2 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -233,14 +233,35 @@ class TranslationBase { String get livecare => localizedValues['livecare'][locale.languageCode]; String get beingBad => localizedValues['beingBad'][locale.languageCode]; String get beingGreat => localizedValues['beingGreat'][locale.languageCode]; + String get cancel => localizedValues['cancel'][locale.languageCode]; + String get done => localizedValues['done'][locale.languageCode]; + + String get searchMedicineImageCaption => + localizedValues['searchMedicineImageCaption'][locale.languageCode]; + + String get type => localizedValues['type'][locale.languageCode]; + String get resumecall => localizedValues['resumecall'][locale.languageCode]; + String get endcallwithcharge => localizedValues['endcallwithcharge'][locale.languageCode]; + String get endcall => localizedValues['endcall'][locale.languageCode]; + String get transfertoadmin => localizedValues['transfertoadmin'][locale.languageCode]; + + String get fromDate => localizedValues['toDate'][locale.languageCode]; + + String get toDate => localizedValues['toDate'][locale.languageCode]; + + String get searchPatientImageCaptionTitle => + localizedValues['searchPatientImageCaptionTitle'][locale.languageCode]; + + String get searchPatientImageCaptionBody => + localizedValues['searchPatientImageCaptionBody'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/auth/auth_header.dart b/lib/widgets/auth/auth_header.dart index e577d8b1..fb2cf322 100644 --- a/lib/widgets/auth/auth_header.dart +++ b/lib/widgets/auth/auth_header.dart @@ -67,15 +67,7 @@ class AuthHeader extends StatelessWidget { } Image buildImageLogo() { - String img = 'assets/images/login_icon.png'; - if (userType == loginType.unknownUser) { - img = 'assets/images/welcome_login_icon.png'; - } - if (userType == loginType.verifyPassword || - userType == loginType.verificationMethods) { - img = 'assets/images/verified_icon.png'; - } - + String img = 'assets/images/dr_app_logo.png'; return Image.asset( img, fit: BoxFit.cover, diff --git a/lib/widgets/patients/dynamic_elements.dart b/lib/widgets/patients/dynamic_elements.dart index 36808cb0..25d196d0 100644 --- a/lib/widgets/patients/dynamic_elements.dart +++ b/lib/widgets/patients/dynamic_elements.dart @@ -1,5 +1,6 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/models/patient/patient_model.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -68,34 +69,17 @@ class _DynamicElementsState extends State { ), AppTextFormField( textInputType: TextInputType.number, - hintText: 'From', + hintText: TranslationBase.of(context).fromDate, controller: _fromDateController, - inputFormatter: ONLY_DATE, onTap: () { _presentDatePicker('_selectedFromDate'); }, - - // validator: (value) { - // return TextValidator().validateDate(_fromDateController.text); - // }, - /* - *@author: Amjad Amireh - *@Date:13/5/2020 - *@param: - *@return:check if field empty added static value - - *@desc: - */ onSaved: (value) { if (_fromDateController.text.toString().trim().isEmpty) { widget._patientSearchFormValues.From = "0"; } else { widget._patientSearchFormValues.From = _fromDateController.text.replaceAll("/", "-"); - - - - // _fromDateController.text; } }, ), @@ -104,28 +88,23 @@ class _DynamicElementsState extends State { ), AppTextFormField( textInputType: TextInputType.number, - hintText: 'TO', + hintText: TranslationBase + .of(context) + .toDate, controller: _toDateController, onTap: () { _presentDatePicker('_selectedToDate'); }, - // validator: (value) { - // return TextValidator().validateDate(_toDateController.text); - // }, - /* - *@author: Amjad Amireh - *@Date:13/5/2020 - *@param: - *@return:check if field empty added static value - - *@desc: - */ inputFormatter: ONLY_DATE, onSaved: (value) { - if (_toDateController.text.toString().trim().isEmpty) { + if (_toDateController.text + .toString() + .trim() + .isEmpty) { widget._patientSearchFormValues.To = "0"; } else { - widget._patientSearchFormValues.To = _toDateController.text.replaceAll("/", "-"); + widget._patientSearchFormValues.To = + _toDateController.text.replaceAll("/", "-"); } }, ), diff --git a/lib/widgets/shared/app_buttons_widget.dart b/lib/widgets/shared/app_buttons_widget.dart index 7b911d9a..cc0d054e 100644 --- a/lib/widgets/shared/app_buttons_widget.dart +++ b/lib/widgets/shared/app_buttons_widget.dart @@ -1,6 +1,7 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; import 'app_texts_widget.dart'; @@ -14,7 +15,7 @@ class AppButton extends StatefulWidget { final double fontSize; final double padding; - AppButton({@required this.onPressed, this.title, this.icon, this.color, this.fontSize = 2.5, this.padding = 15}); + AppButton({@required this.onPressed, this.title, this.icon, this.color, this.fontSize = 2, this.padding = 5}); _AppButtonState createState() => _AppButtonState(); @@ -25,37 +26,38 @@ class AppButton extends StatefulWidget { Widget build(BuildContext context) { return RawMaterialButton( - fillColor: widget.color, - splashColor: widget.color, - child: Padding( - padding: EdgeInsets.only( - top: 15, - bottom: 15, - //right: SizeConfig.widthMultiplier * widget.padding, - //left: SizeConfig.widthMultiplier * widget.padding - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (widget.icon != null) Icon( + fillColor: widget.color != null ? widget.color : Hexcolor("#B8382C"), + splashColor: widget.color, + child: Padding( + padding: EdgeInsets.only( + top: widget.padding, + bottom: widget.padding, + //right: SizeConfig.widthMultiplier * widget.padding, + //left: SizeConfig.widthMultiplier * widget.padding + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (widget.icon != null) + Icon( widget.icon, color: Colors.white, ), - if (widget.icon != null) SizedBox( + if (widget.icon != null) + SizedBox( width: 5.0, ), - AppText( - widget.title, - color: Colors.white, + AppText( + widget.title.toUpperCase(), + color: Colors.white, fontSize: SizeConfig.textMultiplier * widget.fontSize , - fontWeight: FontWeight.bold, ), ], ), ), onPressed: widget.onPressed, - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))), + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(6))), ); } } \ No newline at end of file diff --git a/lib/widgets/shared/app_scaffold_widget.dart b/lib/widgets/shared/app_scaffold_widget.dart index 60828f71..1dc27114 100644 --- a/lib/widgets/shared/app_scaffold_widget.dart +++ b/lib/widgets/shared/app_scaffold_widget.dart @@ -25,14 +25,14 @@ class AppScaffold extends StatelessWidget { AppGlobal.CONTEX = context; ProjectProvider projectProvider = Provider.of(context); return Scaffold( - backgroundColor: Hexcolor('#F5F5F5'), + backgroundColor: Colors.white, appBar: isShowAppBar ? AppBar( elevation: 0, backgroundColor: Hexcolor('#515B5D'), textTheme: TextTheme( headline6: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold)), + color: Colors.white)), title: Text(appBarTitle.toUpperCase()), leading: Builder(builder: (BuildContext context) { return IconButton( diff --git a/lib/widgets/shared/app_text_form_field.dart b/lib/widgets/shared/app_text_form_field.dart index efe8d389..332d2219 100644 --- a/lib/widgets/shared/app_text_form_field.dart +++ b/lib/widgets/shared/app_text_form_field.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:hexcolor/hexcolor.dart'; // OWNER : Ibrahim albitar // DATE : 19-04-2020 @@ -21,7 +22,9 @@ class AppTextFormField extends FormField { FocusNode focusNode, TextInputAction textInputAction, ValueChanged onFieldSubmitted, - IconButton prefix}) + IconButton prefix, + String labelText, + borderColor}) : super( onSaved: onSaved, validator: validator, @@ -29,36 +32,45 @@ class AppTextFormField extends FormField { builder: (FormFieldState state) { return Column( children: [ - TextFormField( - focusNode: focusNode, - keyboardType: textInputType, - inputFormatters: [ - WhitelistingTextInputFormatter(RegExp(inputFormatter)), - ], - onChanged: onChanged ?? - (value) { - state.didChange(value); - }, - textInputAction: textInputAction, - onFieldSubmitted: onFieldSubmitted, - decoration: InputDecoration( - hintText: hintText, - suffixIcon: prefix, - hintStyle: - TextStyle(fontSize: SizeConfig.textMultiplier * 2), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - borderSide: BorderSide(color: Color(0xff707070)), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(10)), - ) - //BorderRadius.all(Radius.circular(20)); - ), - onTap: onTap, - controller: controller, - ), - state.hasError + SizedBox( + height: 40.0, + child: TextFormField( + focusNode: focusNode, + keyboardType: textInputType, + inputFormatters: [WhitelistingTextInputFormatter(RegExp(inputFormatter)), + ],onChanged: onChanged?? (value){ + state.didChange(value); + }, + textInputAction: textInputAction, + onFieldSubmitted: onFieldSubmitted, + decoration: InputDecoration( + hintText: hintText, + suffixIcon: prefix, + hintStyle: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.8,), + contentPadding: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + labelText: labelText, + labelStyle: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.7,), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(6)), + borderSide: BorderSide( + color: borderColor != null ? borderColor : Hexcolor( + "#CCCCCC")), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: borderColor != null ? borderColor : Hexcolor( + "#CCCCCC")), + borderRadius: BorderRadius.all(Radius.circular(6)), + ) + //BorderRadius.all(Radius.circular(20)); + ), + onTap: onTap, + controller: controller, + ), + ), + state.hasError ? Text( state.errorText, style: TextStyle(color: Colors.red),