From d05988a679ffdaee9389beeaa2c8069d08a4b2d9 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Thu, 8 Oct 2020 14:52:12 +0300 Subject: [PATCH 01/69] added pharmacy folder --- lib/pages/pharmacy/profile.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/pages/pharmacy/profile.dart diff --git a/lib/pages/pharmacy/profile.dart b/lib/pages/pharmacy/profile.dart new file mode 100644 index 00000000..e69de29b From 815bc3926830459aa5cb0061226b123613fb19a9 Mon Sep 17 00:00:00 2001 From: enadhilal Date: Wed, 14 Oct 2020 10:04:02 +0300 Subject: [PATCH 02/69] add wishlist page --- lib/pages/pharmacies/wishlist.dart | 0 lib/services/pharmacy_services/wishList_service.dart | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/pages/pharmacies/wishlist.dart create mode 100644 lib/services/pharmacy_services/wishList_service.dart diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/services/pharmacy_services/wishList_service.dart b/lib/services/pharmacy_services/wishList_service.dart new file mode 100644 index 00000000..e69de29b From 068382e76f6325698f0639dd40cccf67068b5734 Mon Sep 17 00:00:00 2001 From: enadhilal Date: Sun, 18 Oct 2020 10:30:05 +0300 Subject: [PATCH 03/69] add call for backend service --- lib/config/config.dart | 5 + lib/core/service/client/base_app_client.dart | 30 +++ lib/pages/landing/home_page.dart | 4 + lib/pages/pharmacies/wishlist.dart | 246 ++++++++++++++++++ .../pharmacy_services/wishList_service.dart | 39 +++ lib/widgets/others/app_scaffold_widget.dart | 93 ++++--- pubspec.yaml | 2 +- 7 files changed, 379 insertions(+), 40 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 02b58b34..70c0d2fa 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -264,6 +264,11 @@ const GET_ALL_CITIES = 'services/Lists.svc/rest/GetAllCities'; const CREATE_E_REFERRAL = "Services/Patients.svc/REST/CreateEReferral"; const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; + +//Pharmacy wishlist +const GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; + + const TIMER_MIN = 10; class AppGlobal { diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index f5494049..5bb50b0a 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -133,6 +133,36 @@ class BaseAppClient { } } + + get( + String endPoint, { + Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + }) async { + try { + print("URL : $endPoint"); + + if (await Utils.checkConnection()) { + onFailure('Please Check The Internet Connection', -1); + } else { + final response = await http.get(endPoint, headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }); + final int statusCode = response.statusCode; + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } + } catch (e) { + print(e); + onFailure(e.toString(), -1); + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); Navigator.of(AppGlobal.context).pushReplacementNamed(LOGIN_TYPE); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 59c0a167..e12a0b95 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -7,6 +7,7 @@ import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/feedback/feedback_home_page.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; @@ -409,6 +410,9 @@ class _HomePageState extends State { ), height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', + onTap: (){ + Navigator.push(context, FadePage(page: WishlistPage())); + }, ), DashboardItem( child: Center( diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index e69de29b..e9b3e9e1 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -0,0 +1,246 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; + + +void main() => runApp(WishlistPage()); + +class WishlistPage extends StatefulWidget { + + @override + _WishlistPageState createState() => _WishlistPageState(); +} + +class _WishlistPageState extends State { + + @override + void initState(){ + WidgetsBinding.instance.addPostFrameCallback((_) => getWishListItems()); + } + + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: 'Wishlist page', + isShowAppBar: true, + isPharmacy: true, + body: Container( +// child: productTile(), + child: ListView.builder( + itemCount: 3, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + Container( + child: productTile(), + ), + Divider(height: 1, color: Colors.grey) + ], + ); + }), + ), + ); + } +} + +getWishListItems() { + + print("getWishListItems"); + WishListService service = new WishListService(); + service.getWishlist(AppGlobal.context).then((res) { + print(res); + }); + +} + +productTile() { + return Container( + height: 120, + width: double.infinity, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: Image( + image: + AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 80, + height: 80, + ), + ), + Expanded( + flex: 5, + child: Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Dulcolax 5 Mg 30 Tablets asdfasdfadsf asdfasdfas dasd fasdf asd fasdfsad', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR 9999.99', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Column( + children: [ + Icon(FontAwesomeIcons.trashAlt, size: 15), + SizedBox(height: 50,), + Icon(FontAwesomeIcons.shoppingCart, size: 15), + ], + ), + ), + ], + ), + ], + ), + ); +} + +//return Container( +//height: 120, +//color: Colors.white, +//child: Row( +//children: [ +//Container( +//margin: EdgeInsets.all(10), +//child: Image( +//image: AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), +//fit: BoxFit.cover, +//), +//), +//Column( +//mainAxisAlignment: MainAxisAlignment.center, +//crossAxisAlignment: CrossAxisAlignment.start, +//children: [ +//Container( +//margin: EdgeInsets.all(5), +//child: Align( +//alignment: Alignment.topLeft, +//child: RichText( +//text: TextSpan( +//text: 'Dulcolax 5 Mg 30 Tablets', +//style: TextStyle( +//color: Colors.black54, +//fontSize: 15, +//fontWeight: FontWeight.bold), +//), +//), +//), +//), +//SizedBox(height: 10,), +//Container( +//margin: EdgeInsets.all(5), +//child: Align( +//alignment: Alignment.topLeft, +//child: RichText( +//text: TextSpan( +//text: 'SAR 9999.99', +//style: TextStyle( +//fontWeight: FontWeight.bold, +//color: Colors.black, +//fontSize: 13), +//), +//), +//), +//), +//SizedBox(height: 5,), +//Container( +//margin: EdgeInsets.only( +//right: MediaQuery.of(AppGlobal.context).size.width * 0.20), +//child: RatingBar.readOnly( +//initialRating: 3, +//// widget.doctor.actualDoctorRate.toDouble(), +//size: 15.0, +//filledColor: Colors.yellow[700], +//emptyColor: Colors.grey[500], +//isHalfAllowed: true, +//halfFilledIcon: Icons.star_half, +//filledIcon: Icons.star, +//emptyIcon: Icons.star, +//), +//), +//], +//), +//SizedBox(width: MediaQuery.of(AppGlobal.context).size.width *0.18,), +//// SizedBox(width: MediaQuery.of(AppGlobal.context).size.width *0.52,), +//Container( +//margin: EdgeInsets.only(top: 20), +//child: Column( +//children: [ +//Padding( +//padding: const EdgeInsets.only(left: 15.0), +//child: Align( +//alignment: Alignment.centerLeft, +//child: Icon(FontAwesomeIcons.trashAlt, size: 15), +//), +//), +//SizedBox( +//height: 50, +//), +//Padding( +//padding: const EdgeInsets.only(left: 10.0), +//child: Align( +//alignment: Alignment.centerLeft, +//child: Icon(FontAwesomeIcons.shoppingCart, size: 15), +//), +//), +//], +//), +//), +//], +//), +// +// +// +//); diff --git a/lib/services/pharmacy_services/wishList_service.dart b/lib/services/pharmacy_services/wishList_service.dart index e69de29b..0f9687e8 100644 --- a/lib/services/pharmacy_services/wishList_service.dart +++ b/lib/services/pharmacy_services/wishList_service.dart @@ -0,0 +1,39 @@ + +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class WishListService extends BaseService { + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + + Future getWishlist(BuildContext context) async { + + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + authUser = data; + } + + dynamic localRes; + String URL; + URL = GET_WISHLIST+"272843"+"?shopping_cart_type=2"; + await baseAppClient.get(URL, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }); + return Future.value(localRes); + } + +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 80a3e7af..839f815b 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -26,6 +26,7 @@ class AppScaffold extends StatelessWidget { final bool hasAppBarParam; final BaseViewModel baseViewModel; final Widget floatingActionButton; + final bool isPharmacy; AppScaffold( {@required this.body, @@ -34,50 +35,64 @@ class AppScaffold extends StatelessWidget { this.isShowAppBar = false, this.hasAppBarParam, this.bottomSheet, - this.baseViewModel, this.floatingActionButton}); + this.baseViewModel, + this.floatingActionButton, + this.isPharmacy = false}); @override Widget build(BuildContext context) { AppGlobal.context = context; return Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(appBarTitle.toUpperCase()), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.of(context).popUntil(ModalRoute.withName('/')); - }, - ), - ], - ) - : null, - body: baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: baseViewModel, - ) - : buildBodyWidget(), - bottomSheet: bottomSheet, - // bottomNavigationBar: BottomBarSearch() - floatingActionButton: floatingActionButton??floatingActionButton, - ); + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: isPharmacy + ? Colors.green + : Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(appBarTitle.toUpperCase()), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + isPharmacy + ? IconButton( + icon: Icon(Icons.shopping_cart), + color: Colors.white, + onPressed: () { + Navigator.of(context) + .popUntil(ModalRoute.withName('/')); + }, + ) + : IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.of(context) + .popUntil(ModalRoute.withName('/')); + }, + ), + ], + ) + : null, + body: baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), + bottomSheet: bottomSheet, + // bottomNavigationBar: BottomBarSearch() + floatingActionButton: floatingActionButton ?? floatingActionButton, + ); } buildAppLoaderWidget(bool isLoading) { @@ -85,6 +100,6 @@ class AppScaffold extends StatelessWidget { } buildBodyWidget() { - return body ;//Stack(children: [body, buildAppLoaderWidget(isLoading)]); + return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); } } diff --git a/pubspec.yaml b/pubspec.yaml index 8bc2c52a..e72fc846 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -82,7 +82,7 @@ dependencies: table_calendar: ^2.2.3 # SVG Images - flutter_svg: ^0.18.0 + flutter_svg: any # Location Helper map_launcher: ^0.8.1 From d6d1c26c9a66acb8521de53db5d8351b202f9566 Mon Sep 17 00:00:00 2001 From: enadhilal Date: Sun, 18 Oct 2020 10:46:19 +0300 Subject: [PATCH 04/69] add product_tile widget --- lib/pages/pharmacies/wishlist.dart | 193 +------------------------ lib/widgets/pharmacy/product_tile.dart | 97 +++++++++++++ 2 files changed, 98 insertions(+), 192 deletions(-) create mode 100644 lib/widgets/pharmacy/product_tile.dart diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index e9b3e9e1..3c8942b7 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -1,9 +1,8 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rating_bar/rating_bar.dart'; import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; +import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart'; void main() => runApp(WishlistPage()); @@ -54,193 +53,3 @@ getWishListItems() { }); } - -productTile() { - return Container( - height: 120, - width: double.infinity, - color: Colors.white, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 80, - height: 80, - ), - ), - Expanded( - flex: 5, - child: Column( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Dulcolax 5 Mg 30 Tablets asdfasdfadsf asdfasdfas dasd fasdf asd fasdfsad', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR 9999.99', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - ], - ), - ), - Expanded( - flex: 1, - child: Column( - children: [ - Icon(FontAwesomeIcons.trashAlt, size: 15), - SizedBox(height: 50,), - Icon(FontAwesomeIcons.shoppingCart, size: 15), - ], - ), - ), - ], - ), - ], - ), - ); -} - -//return Container( -//height: 120, -//color: Colors.white, -//child: Row( -//children: [ -//Container( -//margin: EdgeInsets.all(10), -//child: Image( -//image: AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), -//fit: BoxFit.cover, -//), -//), -//Column( -//mainAxisAlignment: MainAxisAlignment.center, -//crossAxisAlignment: CrossAxisAlignment.start, -//children: [ -//Container( -//margin: EdgeInsets.all(5), -//child: Align( -//alignment: Alignment.topLeft, -//child: RichText( -//text: TextSpan( -//text: 'Dulcolax 5 Mg 30 Tablets', -//style: TextStyle( -//color: Colors.black54, -//fontSize: 15, -//fontWeight: FontWeight.bold), -//), -//), -//), -//), -//SizedBox(height: 10,), -//Container( -//margin: EdgeInsets.all(5), -//child: Align( -//alignment: Alignment.topLeft, -//child: RichText( -//text: TextSpan( -//text: 'SAR 9999.99', -//style: TextStyle( -//fontWeight: FontWeight.bold, -//color: Colors.black, -//fontSize: 13), -//), -//), -//), -//), -//SizedBox(height: 5,), -//Container( -//margin: EdgeInsets.only( -//right: MediaQuery.of(AppGlobal.context).size.width * 0.20), -//child: RatingBar.readOnly( -//initialRating: 3, -//// widget.doctor.actualDoctorRate.toDouble(), -//size: 15.0, -//filledColor: Colors.yellow[700], -//emptyColor: Colors.grey[500], -//isHalfAllowed: true, -//halfFilledIcon: Icons.star_half, -//filledIcon: Icons.star, -//emptyIcon: Icons.star, -//), -//), -//], -//), -//SizedBox(width: MediaQuery.of(AppGlobal.context).size.width *0.18,), -//// SizedBox(width: MediaQuery.of(AppGlobal.context).size.width *0.52,), -//Container( -//margin: EdgeInsets.only(top: 20), -//child: Column( -//children: [ -//Padding( -//padding: const EdgeInsets.only(left: 15.0), -//child: Align( -//alignment: Alignment.centerLeft, -//child: Icon(FontAwesomeIcons.trashAlt, size: 15), -//), -//), -//SizedBox( -//height: 50, -//), -//Padding( -//padding: const EdgeInsets.only(left: 10.0), -//child: Align( -//alignment: Alignment.centerLeft, -//child: Icon(FontAwesomeIcons.shoppingCart, size: 15), -//), -//), -//], -//), -//), -//], -//), -// -// -// -//); diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart new file mode 100644 index 00000000..4a33a1f6 --- /dev/null +++ b/lib/widgets/pharmacy/product_tile.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:rating_bar/rating_bar.dart'; + + +productTile() { + return Container( + height: 120, + width: double.infinity, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: Image( + image: + AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 80, + height: 80, + ), + ), + Expanded( + flex: 5, + child: Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + 'Dulcolax 5 Mg 30 Tablets asdfasdfadsf asdfasdfas dasd fasdf asd fasdfsad', + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR 9999.99', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Column( + children: [ + Icon(FontAwesomeIcons.trashAlt, size: 15), + SizedBox(height: 50,), + Icon(FontAwesomeIcons.shoppingCart, size: 15), + ], + ), + ), + ], + ), + ], + ), + ); +} \ No newline at end of file From 7ca6e6caa7ef0533d670069b654063f192abb26c Mon Sep 17 00:00:00 2001 From: enadhilal Date: Sun, 18 Oct 2020 11:41:18 +0300 Subject: [PATCH 05/69] fix widget of product_tile --- lib/pages/pharmacies/wishlist.dart | 2 +- lib/widgets/pharmacy/product_tile.dart | 170 +++++++++++++------------ 2 files changed, 91 insertions(+), 81 deletions(-) diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart index 3c8942b7..8fa7352d 100644 --- a/lib/pages/pharmacies/wishlist.dart +++ b/lib/pages/pharmacies/wishlist.dart @@ -33,7 +33,7 @@ class _WishlistPageState extends State { return Column( children: [ Container( - child: productTile(), + child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,), ), Divider(height: 1, color: Colors.grey) ], diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index 4a33a1f6..3fa93363 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -4,94 +4,104 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:rating_bar/rating_bar.dart'; -productTile() { - return Container( - height: 120, - width: double.infinity, - color: Colors.white, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 80, - height: 80, + +class productTile extends StatelessWidget { + final String productName; + final String productPrice; + final double productRate; + + productTile({this.productName, this.productPrice, this.productRate}); + + @override + Widget build(BuildContext context) { + return Container( + height: 120, + width: double.infinity, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: Image( + image: + AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 80, + height: 80, + ), ), - ), - Expanded( - flex: 5, - child: Column( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - 'Dulcolax 5 Mg 30 Tablets asdfasdfadsf asdfasdfas dasd fasdf asd fasdfsad', - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), + Expanded( + flex: 5, + child: Column( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: + productName, + style: TextStyle( + color: Colors.black54, + fontSize: 15, + fontWeight: FontWeight.bold), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR 9999.99', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: 'SAR $productPrice', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 13), + ), ), ), ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), ), ), - ), - ], + ], + ), ), - ), - Expanded( - flex: 1, - child: Column( - children: [ - Icon(FontAwesomeIcons.trashAlt, size: 15), - SizedBox(height: 50,), - Icon(FontAwesomeIcons.shoppingCart, size: 15), - ], + Expanded( + flex: 1, + child: Column( + children: [ + Icon(FontAwesomeIcons.trashAlt, size: 15), + SizedBox(height: 50,), + Icon(FontAwesomeIcons.shoppingCart, size: 15), + ], + ), ), - ), - ], - ), - ], - ), - ); -} \ No newline at end of file + ], + ), + ], + ), + ); + } +} From 1e00b9a4d8b80c50fa4ce558ed2f6cd90a63ac99 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 20 Oct 2020 11:37:04 +0300 Subject: [PATCH 06/69] added my-profile --- android/app/build.gradle | 1 + assets/images/pharmacy/check_icon.svg | 6 + assets/images/pharmacy/contact_us_icon.svg | 10 + assets/images/pharmacy/delete_red_icon.svg | 8 + assets/images/pharmacy/edit_icon.svg | 3 + assets/images/pharmacy/lakum_icon.svg | 8 + .../pharmacy/medication_refill_icon.svg | 32 ++ assets/images/pharmacy/mobile_number_icon.svg | 3 + assets/images/pharmacy/my_family_icon.svg | 19 + .../images/pharmacy/my_prescription_icon.svg | 54 +++ assets/images/pharmacy/orders_icon.svg | 8 + assets/images/pharmacy/our_locations_icon.svg | 10 + assets/images/pharmacy/pill_reminder_icon.svg | 49 +++ assets/images/pharmacy/review_icon.svg | 6 + .../pharmacy/shipping_addresses_icon.svg | 6 + assets/images/pharmacy/success_check_icon.svg | 6 + assets/images/pharmacy/user_icon.svg | 3 + assets/images/pharmacy/wishklist_icon.svg | 3 + assets/images/pharmacy/wishlist_icon.svg | 6 + lib/config/localized_values.dart | 112 +++-- lib/pages/landing/home_page.dart | 13 +- .../pharmacyAddresses/AddAddress.dart | 57 +++ .../pharmacyAddresses/PharmacyAddresses.dart | 269 ++++++++++++ lib/pages/pharmacy/profile.dart | 0 lib/pages/pharmacy/profile/profile.dart | 384 ++++++++++++++++++ lib/uitl/translations_delegate_base.dart | 38 +- pubspec.yaml | 1 + 27 files changed, 1067 insertions(+), 48 deletions(-) create mode 100644 assets/images/pharmacy/check_icon.svg create mode 100644 assets/images/pharmacy/contact_us_icon.svg create mode 100644 assets/images/pharmacy/delete_red_icon.svg create mode 100644 assets/images/pharmacy/edit_icon.svg create mode 100644 assets/images/pharmacy/lakum_icon.svg create mode 100644 assets/images/pharmacy/medication_refill_icon.svg create mode 100644 assets/images/pharmacy/mobile_number_icon.svg create mode 100644 assets/images/pharmacy/my_family_icon.svg create mode 100644 assets/images/pharmacy/my_prescription_icon.svg create mode 100644 assets/images/pharmacy/orders_icon.svg create mode 100644 assets/images/pharmacy/our_locations_icon.svg create mode 100644 assets/images/pharmacy/pill_reminder_icon.svg create mode 100644 assets/images/pharmacy/review_icon.svg create mode 100644 assets/images/pharmacy/shipping_addresses_icon.svg create mode 100644 assets/images/pharmacy/success_check_icon.svg create mode 100644 assets/images/pharmacy/user_icon.svg create mode 100644 assets/images/pharmacy/wishklist_icon.svg create mode 100644 assets/images/pharmacy/wishlist_icon.svg create mode 100644 lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart create mode 100644 lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart delete mode 100644 lib/pages/pharmacy/profile.dart create mode 100644 lib/pages/pharmacy/profile/profile.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 9640ea61..720330da 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.google.firebase:firebase-messaging:20.1.0" implementation 'pub.devrel:easypermissions:0.4.0' + implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' } diff --git a/assets/images/pharmacy/check_icon.svg b/assets/images/pharmacy/check_icon.svg new file mode 100644 index 00000000..cfa4f441 --- /dev/null +++ b/assets/images/pharmacy/check_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/contact_us_icon.svg b/assets/images/pharmacy/contact_us_icon.svg new file mode 100644 index 00000000..fa591d47 --- /dev/null +++ b/assets/images/pharmacy/contact_us_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/pharmacy/delete_red_icon.svg b/assets/images/pharmacy/delete_red_icon.svg new file mode 100644 index 00000000..8897a683 --- /dev/null +++ b/assets/images/pharmacy/delete_red_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/edit_icon.svg b/assets/images/pharmacy/edit_icon.svg new file mode 100644 index 00000000..df7cca2f --- /dev/null +++ b/assets/images/pharmacy/edit_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/lakum_icon.svg b/assets/images/pharmacy/lakum_icon.svg new file mode 100644 index 00000000..e2b223de --- /dev/null +++ b/assets/images/pharmacy/lakum_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/medication_refill_icon.svg b/assets/images/pharmacy/medication_refill_icon.svg new file mode 100644 index 00000000..d5951130 --- /dev/null +++ b/assets/images/pharmacy/medication_refill_icon.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/mobile_number_icon.svg b/assets/images/pharmacy/mobile_number_icon.svg new file mode 100644 index 00000000..d98aaf29 --- /dev/null +++ b/assets/images/pharmacy/mobile_number_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/my_family_icon.svg b/assets/images/pharmacy/my_family_icon.svg new file mode 100644 index 00000000..838b357e --- /dev/null +++ b/assets/images/pharmacy/my_family_icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/my_prescription_icon.svg b/assets/images/pharmacy/my_prescription_icon.svg new file mode 100644 index 00000000..bda0e22e --- /dev/null +++ b/assets/images/pharmacy/my_prescription_icon.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/orders_icon.svg b/assets/images/pharmacy/orders_icon.svg new file mode 100644 index 00000000..f09ae19d --- /dev/null +++ b/assets/images/pharmacy/orders_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/our_locations_icon.svg b/assets/images/pharmacy/our_locations_icon.svg new file mode 100644 index 00000000..2be16631 --- /dev/null +++ b/assets/images/pharmacy/our_locations_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/pharmacy/pill_reminder_icon.svg b/assets/images/pharmacy/pill_reminder_icon.svg new file mode 100644 index 00000000..f4fb4ddc --- /dev/null +++ b/assets/images/pharmacy/pill_reminder_icon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/review_icon.svg b/assets/images/pharmacy/review_icon.svg new file mode 100644 index 00000000..bb826f21 --- /dev/null +++ b/assets/images/pharmacy/review_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/shipping_addresses_icon.svg b/assets/images/pharmacy/shipping_addresses_icon.svg new file mode 100644 index 00000000..ebb8692f --- /dev/null +++ b/assets/images/pharmacy/shipping_addresses_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/success_check_icon.svg b/assets/images/pharmacy/success_check_icon.svg new file mode 100644 index 00000000..ed1379b8 --- /dev/null +++ b/assets/images/pharmacy/success_check_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/user_icon.svg b/assets/images/pharmacy/user_icon.svg new file mode 100644 index 00000000..8e978105 --- /dev/null +++ b/assets/images/pharmacy/user_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/wishklist_icon.svg b/assets/images/pharmacy/wishklist_icon.svg new file mode 100644 index 00000000..cd0ce16d --- /dev/null +++ b/assets/images/pharmacy/wishklist_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/pharmacy/wishlist_icon.svg b/assets/images/pharmacy/wishlist_icon.svg new file mode 100644 index 00000000..910a3ab8 --- /dev/null +++ b/assets/images/pharmacy/wishlist_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 81f8a3d4..9affe647 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -547,47 +547,79 @@ const Map> localizedValues = { "en": "Please enter the verification code send to", "ar": "الرجاء إدخال رمز التحقق المرسل إلى" }, - "EyeMeasurements":{"en":"Eye Measurements","ar":"قياسات النظر"}, - "Measurements":{"en":"Measurements","ar":"قياسات"}, - "Classes":{"en":"Classes","ar":"نظارات"}, - "ContactLens":{"en":"Contact Lens","ar":"العدسات اللاصقة"}, - "RightEye":{"en":"Right Eye","ar":"العين اليمين"}, - "Sphere":{"en":"Sphere","ar":"القوة"}, - "Cylinder":{"en":"Cylinder","ar":"الدائرية"}, - "Axis":{"en":"Axis","ar":"المحاور"}, - "Prism":{"en":"Prism","ar":"موشور"}, - "VA":{"en":"Prism","ar":"المحاور"}, - "LeftEye":{"en":"Left Eye","ar":"العين اليسرى"}, - "Brand":{"en":"Brand","ar":"النوع"}, - "Power":{"en":"Power","ar":"القوة"}, - "Diameter":{"en":"Diameter","ar":"القطر"}, - "Remarks":{"en":"Remarks","ar":"ملاحضات"}, - "ActiveMedications":{"en":"Active Medications","ar":"ادويتي النشطة"}, - "ExpDate":{"en":"Active Exp Date :","VA":"تاريخ الإنتهاء"}, - "Route":{"en":"Route :","ar":"الطريقة"}, - "Frequency":{"en":"Frequency :","ar":"المعدل"}, - "DailyQuantity":{"en":"Daily Quantity :","ar":"جرعات يومية"}, - "AddReminder":{"en":"Add Reminder","ar":"إضافة تذكير"}, - "reminderDes":{"en":"Please select treatment start day and time to be notified when it\'s time to take the medicine","ar":" يرجى تحديد يوم بدء العلاج والوقت ليتم ارسال تنبيه عندما يحين الوقت لتناول الدواء"}, - "StartDay":{"en":"Start Day","ar":"يوم البداية"}, - "EndDay":{"en":"End Day","ar":"يوم الانتهاء"}, - "Days":{"en":"Days ","ar":"أيام"}, - "ScheduleTime":{"en":"Schedule time","ar":"الجدول الزمني"}, - "AskDoctor":{"en":"Ask Doctor","ar":"اسأل طبيبك"}, - "DoctorResponses":{"en":"Doctor Responses","ar":"ردود الأطباء"}, - "New":{"en":"New","ar":"جديد"}, - "All":{"en":"All","ar":"الكل"}, - "QuestionHere":{"en":"Enter the question here...","ar":"اضف الاستفسار هنا"}, - "ViewDoctorResponses":{"en":"View Doctor Responses","ar":"الاطلاع على ردود الأطباء"}, - "ServiceInformationButton":{"en":"LOGIN / REGISTER","ar":"دخول / تسجيل"}, - "ServiceInformationTitle":{"en":"Service Information","ar":"معلومات الخدمة"}, + "EyeMeasurements": {"en": "Eye Measurements", "ar": "قياسات النظر"}, + "Measurements": {"en": "Measurements", "ar": "قياسات"}, + "Classes": {"en": "Classes", "ar": "نظارات"}, + "ContactLens": {"en": "Contact Lens", "ar": "العدسات اللاصقة"}, + "RightEye": {"en": "Right Eye", "ar": "العين اليمين"}, + "Sphere": {"en": "Sphere", "ar": "القوة"}, + "Cylinder": {"en": "Cylinder", "ar": "الدائرية"}, + "Axis": {"en": "Axis", "ar": "المحاور"}, + "Prism": {"en": "Prism", "ar": "موشور"}, + "VA": {"en": "Prism", "ar": "المحاور"}, + "LeftEye": {"en": "Left Eye", "ar": "العين اليسرى"}, + "Brand": {"en": "Brand", "ar": "النوع"}, + "Power": {"en": "Power", "ar": "القوة"}, + "Diameter": {"en": "Diameter", "ar": "القطر"}, + "Remarks": {"en": "Remarks", "ar": "ملاحضات"}, + "ActiveMedications": {"en": "Active Medications", "ar": "ادويتي النشطة"}, + "ExpDate": {"en": "Active Exp Date :", "VA": "تاريخ الإنتهاء"}, + "Route": {"en": "Route :", "ar": "الطريقة"}, + "Frequency": {"en": "Frequency :", "ar": "المعدل"}, + "DailyQuantity": {"en": "Daily Quantity :", "ar": "جرعات يومية"}, + "AddReminder": {"en": "Add Reminder", "ar": "إضافة تذكير"}, + "reminderDes": { + "en": + "Please select treatment start day and time to be notified when it\'s time to take the medicine", + "ar": + " يرجى تحديد يوم بدء العلاج والوقت ليتم ارسال تنبيه عندما يحين الوقت لتناول الدواء" + }, + "StartDay": {"en": "Start Day", "ar": "يوم البداية"}, + "EndDay": {"en": "End Day", "ar": "يوم الانتهاء"}, + "Days": {"en": "Days ", "ar": "أيام"}, + "ScheduleTime": {"en": "Schedule time", "ar": "الجدول الزمني"}, + "AskDoctor": {"en": "Ask Doctor", "ar": "اسأل طبيبك"}, + "DoctorResponses": {"en": "Doctor Responses", "ar": "ردود الأطباء"}, + "New": {"en": "New", "ar": "جديد"}, + "All": {"en": "All", "ar": "الكل"}, + "QuestionHere": { + "en": "Enter the question here...", + "ar": "اضف الاستفسار هنا" + }, + "ViewDoctorResponses": { + "en": "View Doctor Responses", + "ar": "الاطلاع على ردود الأطباء" + }, + "ServiceInformationButton": {"en": "LOGIN / REGISTER", "ar": "دخول / تسجيل"}, + "ServiceInformationTitle": { + "en": "Service Information", + "ar": "معلومات الخدمة" + }, "info-lab": { - "en": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", - "ar": "خدمة نتائج المختبر: هذه الخدمة تمكنك من الاطلاع على نتائج جميع الفحوصات المخبرية التي تمت في مجموعة الحبيب الطبية." + "en": + "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", + "ar": + "خدمة نتائج المختبر: هذه الخدمة تمكنك من الاطلاع على نتائج جميع الفحوصات المخبرية التي تمت في مجموعة الحبيب الطبية." }, "info-radiology": { - "en": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", - "ar": "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل." - }, - + "en": + "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", + "ar": + "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل." + }, + "orders": {"en": "Orders", "ar": "الطلبات"}, + "lakum": {"en": "Lakum", "ar": "لكم"}, + "wishlist": {"en": "Wishlist", "ar": "الرغبات"}, + "reviews": {"en": "Reviews", "ar": "التقيمات"}, + "myPrescriptions": {"en": "My Prescriptions", "ar": "وصفاتي"}, + "medicationRefill": {"en": "Medication Refill", "ar": "تعبئة الأدوية"}, + "pillReminder": {"en": "Pill Reminder", "ar": "تذكير الأدويه"}, + "shippingAddresses": {"en": "Shipping Addresses", "ar": "عناوين الشحن"}, + "reachUs": {"en": "Reach Us", "ar": "الوصول لنا"}, + "ourLocations": {"en": "Our Locations", "ar": "مواقعنا"}, + "changeAddress": {"en": "Change Address", "ar": "تغيير العنوان"}, + "edit": {"en": "Edit", "ar": "تعديل"}, + "delete": {"en": "Delete", "ar": " حذف"}, + "addAddress": {"en": "ADD A NEW ADDRESS", "ar": " اضافة عنوان جديد"}, + "addNewAddress": {"en": "Add New Address", "ar": " اضافة عنوان جديد"}, }; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 292006d0..d5493d99 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -9,6 +9,8 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -96,7 +98,9 @@ class _HomePageState extends State { children: [ Container( margin: EdgeInsets.only( - top: 15.0, left: 3.5, right: 3.5), + top: 15.0, + left: 3.5, + right: 3.5), // child: SvgPicture.asset( // 'assets/images/new-design/covid-19-car.svg', // width: 45.0, @@ -469,6 +473,8 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( + onTap: () => Navigator.push( + context, FadePage(page: PharmacyAddressesPage())), child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -495,8 +501,9 @@ class _HomePageState extends State { ), height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', - onTap: (){ - Navigator.push(context, FadePage(page: WishlistPage())); + onTap: () { + Navigator.push( + context, FadePage(page: WishlistPage())); }, ), DashboardItem( diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart new file mode 100644 index 00000000..ac4bfb35 --- /dev/null +++ b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart @@ -0,0 +1,57 @@ +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/style.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; + +class AddAddressPage extends StatefulWidget { + @override + _AddAddressState createState() => _AddAddressState(); +} + +class _AddAddressState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + child: Column( + children: [ + Container( + + ), + Container( + height: 50.0, + width: 400.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(10.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).save, + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ); + }} \ No newline at end of file diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart new file mode 100644 index 00000000..122fd0da --- /dev/null +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -0,0 +1,269 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; + + +class PharmacyAddressesPage extends StatefulWidget{ + @override + _PharmacyAddressesState createState() => _PharmacyAddressesState(); + } + +class _PharmacyAddressesState extends State{ + + int selectedRadio; + bool _value = false; + @override + void initState(){ + super.initState(); + selectedRadio=0; + } + setSelectedRadio(int val){ + setState(() { + selectedRadio = val; + }); + } + + Widget build (BuildContext context){ + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + child:SingleChildScrollView( + child: Column( + children:[ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: 2 , + itemBuilder: (context, index){ + return Container( + child: Padding( + padding:EdgeInsets.only(top:20.0, left:5.0, right:5.0, bottom:5.0,), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + _value = !_value; + }); + }, + child: Container( + margin: EdgeInsets.only(right: 20), + + child: Padding( + padding: const EdgeInsets.all(5.0), + child: _value + ? Container( + child: SvgPicture.asset( + 'assets/images/pharmacy/check_icon.svg', + height: 25, + width: 25,), + ) + : Container( + child: SvgPicture.asset( + 'assets/images/pharmacy/check_icon.svg', + height: 23, + width: 23, + color: Colors.transparent, + ), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(50.0) + ), + ), + ), + ), + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('NAME', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + SizedBox( + height: 5,), + Text('Address', + style: TextStyle(fontSize: 15.0, color: Colors.grey, + ), + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(bottom: 8), + child: SvgPicture.asset( + 'assets/images/pharmacy/mobile_number_icon.svg', + height: 13,), + ), + Container( + margin: EdgeInsets.only(left: 10, bottom: 8), + child: Text('588888778', + style: TextStyle(fontSize: 15.0, + ), + ), + ), + ], + ), + SizedBox( + height: 15,), + Row( + children: [ + Column( + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right:10, bottom: 15), + child: SvgPicture.asset( + 'assets/images/pharmacy/edit_icon.svg', + height: 15,), + ), + Container( + margin: EdgeInsets.only(right:5, bottom: 15), + padding: EdgeInsets.only(right: 10.0), + child: Text(TranslationBase.of(context).edit, + style: TextStyle(fontSize: 15.0, + color: Colors.blue, + ), + ), + decoration: BoxDecoration( + border: Border( + right: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + ), + ), + ], + ), + ), + ], + ), + Column( + children: [ + InkWell( + child: Row( + children: [ + Container( + margin: EdgeInsets.only(left: 15, right: 10, bottom: 15), + child: SvgPicture.asset( + 'assets/images/pharmacy/delete_red_icon.svg', + height: 15,), + ), + Container( + margin: EdgeInsets.only(bottom: 15), + child: Text(TranslationBase.of(context).delete, + style: TextStyle(fontSize: 15.0, + color: Colors.redAccent, + ), + ), + ), + ], + ), + ), + ], + ) + ], + ), + ], + ), + SizedBox( + height: 10, + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 6, + indent: 0, + endIndent: 0, + ), + ], + ), + ), + ); + } + ), + SizedBox( + height: 10, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, + child: Container( + height: 50.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).addAddress, + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + +} + + + + + diff --git a/lib/pages/pharmacy/profile.dart b/lib/pages/pharmacy/profile.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart new file mode 100644 index 00000000..272ef0d4 --- /dev/null +++ b/lib/pages/pharmacy/profile/profile.dart @@ -0,0 +1,384 @@ +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; + +class PharmacyProfilePage extends StatefulWidget { + @override + _ProfilePageState createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).myAccount, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + child:SingleChildScrollView( + child: Column( + children:[ + Container( + child:Row( + children: [ + Container( + padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), + child: LargeAvatar(name: "profile", url:'' ,), + ), + Container( + child: Column( + children: [ + Text( + TranslationBase.of(context).welcome, + style: TextStyle(fontSize: 14.0, + fontWeight: FontWeight.bold, + color:Colors.grey + ), + ), + Text( + 'NAME', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold + ), + ), + ], + ), + ) + ], + ), + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 15, + ), + Container( + child:Row( + children: [ + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/orders_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).orders, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), + ), + ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/lakum_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).lakum, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold + ), + ), + ], + ), + ), + ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/wishlist_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).wishlist, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), + ), + ), + Expanded( + child: InkWell( + child: Column( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/review_icon.svg', + width: 50, + height: 50,), + SizedBox( + height: 5, + ), + Text( + TranslationBase.of(context).reviews, + style: TextStyle(fontSize: 13.0, + fontWeight: FontWeight.bold,), + ), + ], + ), + ), + ), + ], + ) + ), + SizedBox( + height: 15, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).myAccount, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold + ), + ), + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/my_prescription_icon.svg', + width: 28, + height: 28,), + SizedBox( + width: 15, + ), + Text(TranslationBase.of(context).myPrescriptions, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/medication_refill_icon.svg', + width: 28, + height: 28,), + SizedBox( + width: 15, + ), + Text(TranslationBase.of(context).medicationRefill, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/pill_reminder_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, + ), + Text(TranslationBase.of(context).pillReminder, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/my_family_icon.svg', + width: 20, + height: 20,), + SizedBox( + width: 20, + ), + Text(TranslationBase.of(context).family, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_addresses_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, + ), + Text(TranslationBase.of(context).shippingAddresses, + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + ], + ), + ), + SizedBox( + height: 10, + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 5, + indent: 0, + endIndent: 0, + ), + SizedBox( + height: 10, + ), + Container( + padding: EdgeInsets.only(left: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).reachUs, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/contact_us_icon.svg', + width: 20, + height: 20,), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).contactUs, + style: TextStyle(fontSize: 13.0), + ), + ], + ), + ), + SizedBox( + height: 5, + ), + Divider( + color: Colors.grey, + height: 20, + ), + InkWell( + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/our_locations_icon.svg', + width: 30, + height: 30,), + SizedBox( + width: 20, + ), + Text( + TranslationBase.of(context).ourLocations, + style: TextStyle(fontSize: 13.0), + ), + ], + ), + ) + ], + ), + ) + ], + ), + ), + ), + ); + }} + + + + diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 63f56674..26f7d93e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -95,9 +95,11 @@ class TranslationBase { String get confirm => localizedValues['confirm'][locale.languageCode]; - String get confirmLiveCare => localizedValues['confirmLiveCare'][locale.languageCode]; + String get confirmLiveCare => + localizedValues['confirmLiveCare'][locale.languageCode]; - String get waitingForDoctor => localizedValues['waitingForDoctor'][locale.languageCode]; + String get waitingForDoctor => + localizedValues['waitingForDoctor'][locale.languageCode]; String get confirmLater => localizedValues['confirmLater'][locale.languageCode]; @@ -677,10 +679,36 @@ class TranslationBase { String get questionHere => localizedValues['QuestionHere'][locale.languageCode]; String get viewDoctorResponses => - localizedValues['ViewDoctorResponses'][locale.languageCode];String get serviceInformationButton => localizedValues['ServiceInformationButton'][locale.languageCode]; - String get serviceInformationTitle => localizedValues['ServiceInformationTitle'][locale.languageCode]; + localizedValues['ViewDoctorResponses'][locale.languageCode]; + String get serviceInformationButton => + localizedValues['ServiceInformationButton'][locale.languageCode]; + String get serviceInformationTitle => + localizedValues['ServiceInformationTitle'][locale.languageCode]; String get infoLab => localizedValues['info-lab'][locale.languageCode]; - String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; + String get infoRadiology => + localizedValues['info-radiology'][locale.languageCode]; + String get orders => localizedValues['orders'][locale.languageCode]; + String get lakum => localizedValues['lakum'][locale.languageCode]; + String get wishlist => localizedValues['wishlist'][locale.languageCode]; + String get reviews => localizedValues['reviews'][locale.languageCode]; + String get myPrescriptions => + localizedValues['myPrescriptions'][locale.languageCode]; + String get medicationRefill => + localizedValues['medicationRefill'][locale.languageCode]; + String get pillReminder => + localizedValues['pillReminder'][locale.languageCode]; + String get shippingAddresses => + localizedValues['shippingAddresses'][locale.languageCode]; + String get reachUs => localizedValues['reachUs'][locale.languageCode]; + String get ourLocations => + localizedValues['ourLocations'][locale.languageCode]; + String get changeAddress => + localizedValues['changeAddress'][locale.languageCode]; + String get edit => localizedValues['edit'][locale.languageCode]; + String get delete => localizedValues['delete'][locale.languageCode]; + String get addAddress => localizedValues['addAddress'][locale.languageCode]; + String get addNewAddress => + localizedValues['addNewAddress'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/pubspec.yaml b/pubspec.yaml index 21a14bab..846a264c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -163,6 +163,7 @@ flutter: # assets: assets: - assets/images/ + - assets/images/pharmacy/ - assets/images/medical/ - assets/images/new-design/ - assets/images/login/ From f7cee8f484e100276b8e3c11a73ca08971170787 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Sun, 1 Nov 2020 14:36:45 +0200 Subject: [PATCH 07/69] pharmacy module app && category home page --- android/app/build.gradle | 1 + lib/config/config.dart | 31 +- .../model/pharmacy/offer_products_model.dart | 579 ++++++++++++++++++ lib/core/model/pharmacy/offers_model.dart | 175 ++++++ .../model/pharmacy/pharmacy_categorise.dart | 103 ++++ lib/core/service/client/base_app_client.dart | 28 +- lib/core/service/offers_service.dart | 46 ++ .../service/pharmacy_categorise_service.dart | 26 + .../offers_Categorise_view_model.dart | 48 ++ .../pharmacy_categorise_view_model.dart | 26 + lib/locator.dart | 16 +- lib/pages/landing/home_page.dart | 8 +- lib/pages/landing/landing_page_pharmcy.dart | 152 +++++ lib/pages/offers_categorise_page.dart | 170 +++++ lib/pages/pharmacy_categorise.dart | 139 +++++ .../pharmacy/bottom_nav_pharmacy_bar.dart | 108 ++++ .../bottom_nav_pharmacy_home_item.dart | 74 +++ .../pharmacy/bottom_nav_pharmacy_item.dart | 76 +++ 18 files changed, 1789 insertions(+), 17 deletions(-) create mode 100644 lib/core/model/pharmacy/offer_products_model.dart create mode 100644 lib/core/model/pharmacy/offers_model.dart create mode 100644 lib/core/model/pharmacy/pharmacy_categorise.dart create mode 100644 lib/core/service/offers_service.dart create mode 100644 lib/core/service/pharmacy_categorise_service.dart create mode 100644 lib/core/viewModels/offers_Categorise_view_model.dart create mode 100644 lib/core/viewModels/pharmacy_categorise_view_model.dart create mode 100644 lib/pages/landing/landing_page_pharmcy.dart create mode 100644 lib/pages/offers_categorise_page.dart create mode 100644 lib/pages/pharmacy_categorise.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart create mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 9640ea61..bfba384a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.google.firebase:firebase-messaging:20.1.0" implementation 'pub.devrel:easypermissions:0.4.0' + implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' } diff --git a/lib/config/config.dart b/lib/config/config.dart index a3ce19e9..48695fc1 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,7 +6,7 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; @@ -57,9 +57,12 @@ const GET_NEAREST_HOSPITAL = 'Services/Patients.svc/REST/Patient_GetProjectAvgERWaitingTime'; ///Er Nearest -const GET_AMBULANCE_REQUEST = 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod'; -const GET_PATIENT_ALL_PRES_ORDERS= 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; -const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID= 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID'; +const GET_AMBULANCE_REQUEST = + 'Services/Patients.svc/REST/PatientER_RRT_GetAllTransportationMethod'; +const GET_PATIENT_ALL_PRES_ORDERS = + 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +const GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID = + 'Services/Patients.svc/REST/PatientER_RRT_GetPickUpRequestByPresOrderID'; ///FindUs const GET_FINDUS_REQUEST = 'Services/Lists.svc/REST/Get_HMG_Locations'; @@ -139,7 +142,8 @@ const GET_PATIENT_SHARE = "Services/Doctors.svc/REST/GetCheckinScreenAppointmentDetailsByAppointmentNO"; //URL to get patient appointment history -const GET_PATIENT_APPOINTMENT_HISTORY = "Services/Doctors.svc/REST/PateintHasAppoimentHistory"; +const GET_PATIENT_APPOINTMENT_HISTORY = + "Services/Doctors.svc/REST/PateintHasAppoimentHistory"; //URL to get patient appointment curfew history const GET_PATIENT_APPOINTMENT_CURFEW_HISTORY = @@ -262,13 +266,14 @@ const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment'; +const GET_COVID_DRIVETHRU_PROJECT_LIST = + 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter'; -const GET_COVID_DRIVETHRU_PROJECT_LIST = 'Services/Doctors.svc/REST/COVID19_ProjectDriveThroughTestingCenter'; - -const GET_COVID_DRIVETHRU_PAYMENT_INFO = 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation'; - -const GET_COVID_DRIVETHRU_FREE_SLOTS = 'Services/Doctors.svc/REST/COVID19_GetFreeSlots'; +const GET_COVID_DRIVETHRU_PAYMENT_INFO = + 'Services/Doctors.svc/REST/COVID19_GetPatientPaymentInormation'; +const GET_COVID_DRIVETHRU_FREE_SLOTS = + 'Services/Doctors.svc/REST/COVID19_GetFreeSlots'; ///My Trackers const GET_DIABETIC_RESULT_AVERAGE = @@ -323,6 +328,12 @@ const GET_ALL_CITIES = 'services/Lists.svc/rest/GetAllCities'; const CREATE_E_REFERRAL = "Services/Patients.svc/REST/CreateEReferral"; const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; +//Pharmacy + +const GET_PHARMACY_CATEGORISE = + 'epharmacy/api/categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=0'; +const GET_OFFERS_CATEGORISE = 'epharmacy/api/discountcategories'; +const GET_OFFERS_PRODUCTS = 'epharmacy/api/offerproducts/12'; const TIMER_MIN = 10; diff --git a/lib/core/model/pharmacy/offer_products_model.dart b/lib/core/model/pharmacy/offer_products_model.dart new file mode 100644 index 00000000..f41b731b --- /dev/null +++ b/lib/core/model/pharmacy/offer_products_model.dart @@ -0,0 +1,579 @@ +class OfferProductsModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + String discountName; + String discountNamen; + String discountDescription; + String discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + dynamic weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + OfferProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + OfferProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + discountIds = json['discount_ids'].cast(); + + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); + } + data['discount_ids'] = this.discountIds; + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); + } + if (this.manufacturerIds != null) { + data['manufacturer_ids'] = + this.manufacturerIds.map((v) => v.toJson()).toList(); + } + if (this.reviews != null) { + data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); + } + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + if (this.attributes != null) { + data['attributes'] = this.attributes.map((v) => v.toJson()).toList(); + } + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + if (this.associatedProductIds != null) { + data['associated_product_ids'] = + this.associatedProductIds.map((v) => v.toJson()).toList(); + } + if (this.tags != null) { + data['tags'] = this.tags.map((v) => v.toJson()).toList(); + } + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacy/offers_model.dart b/lib/core/model/pharmacy/offers_model.dart new file mode 100644 index 00000000..3add1d3d --- /dev/null +++ b/lib/core/model/pharmacy/offers_model.dart @@ -0,0 +1,175 @@ +class OffersModel { + String id; + String name; + String namen; + List localizedNames; + Null description; + int categoryTemplateId; + String metaKeywords; + String metaDescription; + String metaTitle; + int parentCategoryId; + int pageSize; + String pageSizeOptions; + Null priceRanges; + bool showOnHomePage; + bool includeInTopMenu; + Null hasDiscountsApplied; + bool published; + bool deleted; + int displayOrder; + String createdOnUtc; + String updatedOnUtc; + List roleIds; + List discountIds; + List storeIds; + Image image; + String seName; + bool isLeaf; + + OffersModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.categoryTemplateId, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.parentCategoryId, + this.pageSize, + this.pageSizeOptions, + this.priceRanges, + this.showOnHomePage, + this.includeInTopMenu, + this.hasDiscountsApplied, + this.published, + this.deleted, + this.displayOrder, + this.createdOnUtc, + this.updatedOnUtc, + this.roleIds, + this.discountIds, + this.storeIds, + this.image, + this.seName, + this.isLeaf}); + + OffersModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + categoryTemplateId = json['category_template_id']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + parentCategoryId = json['parent_category_id']; + pageSize = json['page_size']; + pageSizeOptions = json['page_size_options']; + priceRanges = json['price_ranges']; + showOnHomePage = json['show_on_home_page']; + includeInTopMenu = json['include_in_top_menu']; + hasDiscountsApplied = json['has_discounts_applied']; + published = json['published']; + deleted = json['deleted']; + displayOrder = json['display_order']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + + image = json['image'] != null ? new Image.fromJson(json['image']) : null; + seName = json['se_name']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['category_template_id'] = this.categoryTemplateId; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['parent_category_id'] = this.parentCategoryId; + data['page_size'] = this.pageSize; + data['page_size_options'] = this.pageSizeOptions; + data['price_ranges'] = this.priceRanges; + data['show_on_home_page'] = this.showOnHomePage; + data['include_in_top_menu'] = this.includeInTopMenu; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['display_order'] = this.displayOrder; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); + } + if (this.discountIds != null) { + data['discount_ids'] = this.discountIds.map((v) => v.toJson()).toList(); + } + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); + } + if (this.image != null) { + data['image'] = this.image.toJson(); + } + data['se_name'] = this.seName; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Image { + String src; + Null thumb; + Null attachment; + + Image({this.src, this.thumb, this.attachment}); + + Image.fromJson(Map json) { + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy/pharmacy_categorise.dart b/lib/core/model/pharmacy/pharmacy_categorise.dart new file mode 100644 index 00000000..33ac26f1 --- /dev/null +++ b/lib/core/model/pharmacy/pharmacy_categorise.dart @@ -0,0 +1,103 @@ +class PharmacyCategorise { + dynamic id; + String name; + dynamic namen; + List localizedNames; + dynamic description; + dynamic parentCategoryId; + dynamic displayOrder; + dynamic image; + dynamic isLeaf; + + PharmacyCategorise( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + PharmacyCategorise.fromJson(Map json) { + try { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image'] != null ? new Image.fromJson(json['image']) : null; + isLeaf = json['is_leaf']; + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + if (this.image != null) { + data['image'] = this.image.toJson(); + } + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Image { + String src; + Null thumb; + Null attachment; + + Image({this.src, this.thumb, this.attachment}); + + Image.fromJson(Map json) { + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 237245f8..e1f69dba 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -77,7 +77,7 @@ class BaseAppClient { body['PatientID'] = body['PatientID'] != null ? body['PatientID'] : user['PatientID']; body['PatientOutSA'] = user['OutSA']; - body['SessionID'] = SESSION_ID;//getSessionId(token); + body['SessionID'] = SESSION_ID; //getSessionId(token); } } @@ -138,6 +138,32 @@ class BaseAppClient { } } + get(String endPoint, + {Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + bool isAllowAny = false}) async { + String url = BASE_URL + endPoint; + print("URL : $url"); + + if (await Utils.checkConnection()) { + final response = await http.get(url.trim(), headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }); + final int statusCode = response.statusCode; + print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); Navigator.of(AppGlobal.context).pushReplacementNamed(LOGIN_TYPE); diff --git a/lib/core/service/offers_service.dart b/lib/core/service/offers_service.dart new file mode 100644 index 00000000..ebcbd9a2 --- /dev/null +++ b/lib/core/service/offers_service.dart @@ -0,0 +1,46 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; + +import 'base_service.dart'; + +class OffersCategoriseService extends BaseService { + List _offersList = List(); + List get offersList => _offersList; + List _offerProducts = List(); + List get offersProducts => _offerProducts; + + Future getOffersCategorise() async { + hasError = false; + _offersList.clear(); + await baseAppClient.get( + GET_OFFERS_CATEGORISE, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _offersList.add(OffersModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getOffersProducts() async { + hasError = false; + _offerProducts.clear(); + await baseAppClient.get( + GET_OFFERS_PRODUCTS, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _offerProducts.add(OfferProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } +} diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart new file mode 100644 index 00000000..676f900b --- /dev/null +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -0,0 +1,26 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; + +import 'base_service.dart'; + +class PharmacyCategoriseService extends BaseService { + List _categoriseList = List(); + List get categoriseList => _categoriseList; + + Future getCategorise() async { + hasError = false; + _categoriseList.clear(); + await baseAppClient.get( + GET_PHARMACY_CATEGORISE, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _categoriseList.add(PharmacyCategorise.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } +} diff --git a/lib/core/viewModels/offers_Categorise_view_model.dart b/lib/core/viewModels/offers_Categorise_view_model.dart new file mode 100644 index 00000000..3bb67ab7 --- /dev/null +++ b/lib/core/viewModels/offers_Categorise_view_model.dart @@ -0,0 +1,48 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; +import 'package:diplomaticquarterapp/core/service/offers_service.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +import 'base_view_model.dart'; + +class OffersCategoriseViewModel extends BaseViewModel { + bool hasError = false; + + OffersCategoriseService _offersCategoriseService = + locator(); + List get categorise => _offersCategoriseService.offersList; + + List get products => + _offersCategoriseService.offersProducts; + + Future getOffersCategorise() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _offersCategoriseService.getOffersCategorise(); + if (_offersCategoriseService.hasError) { + error = _offersCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + await getOffersProducts(); + } + + Future getOffersProducts() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + // setState(ViewState.Busy); + await _offersCategoriseService.getOffersProducts(); + if (_offersCategoriseService.hasError) { + error = _offersCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} +// await _offersCategoriseService.getOffersProducts(); +// if (_offersCategoriseService.hasError) { +// error = _offersCategoriseService.error; +// setState(ViewState.ErrorLocal); +// } else +// setState(ViewState.Idle); diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart new file mode 100644 index 00000000..62b658aa --- /dev/null +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -0,0 +1,26 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +import 'base_view_model.dart'; + +class PharmacyCategoriseViewModel extends BaseViewModel { + bool hasError = false; + PharmacyCategoriseService _pharmacyCategoriseService = + locator(); + List get categorise => + _pharmacyCategoriseService.categoriseList; + + Future getCategorise() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getCategorise(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index e6140ce1..a23cc0e2 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -39,6 +39,8 @@ import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; +import 'core/service/offers_service.dart'; +import 'core/service/pharmacy_categorise_service.dart'; import 'core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'core/viewModels/appointment_rate_view_model.dart'; import 'core/viewModels/blooddonation/blood_details_view_model.dart'; @@ -70,10 +72,12 @@ import 'core/viewModels/medical/reports_monthly_view_model.dart'; import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/medical/reports_view_model.dart'; import 'core/viewModels/medical/weight_pressure_view_model.dart'; +import 'core/viewModels/offers_Categorise_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; +import 'core/viewModels/pharmacy_categorise_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; @@ -105,7 +109,6 @@ void setupLocator() { locator.registerLazySingleton(() => AmService()); locator.registerLazySingleton(() => EReferralService()); - locator.registerLazySingleton(() => PatientSickLeaveService()); locator.registerLazySingleton(() => MyBalanceService()); locator.registerLazySingleton(() => BloodSugarService()); @@ -126,10 +129,11 @@ void setupLocator() { locator.registerLazySingleton(() => CreteNewBabyService()); locator.registerLazySingleton(() => DeleteBabyService()); - - locator.registerLazySingleton(() => VaccinationTableService()); + //pharmacy + locator.registerLazySingleton(() => PharmacyCategoriseService()); + locator.registerLazySingleton(() => OffersCategoriseService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -161,8 +165,6 @@ void setupLocator() { locator.registerFactory(() => UserInformationViewModel()); locator.registerFactory(() => VaccinationTableViewModel()); - - locator.registerFactory(() => AddNewChildViewModel()); locator.registerFactory(() => H2OViewModel()); @@ -173,4 +175,8 @@ void setupLocator() { locator.registerFactory(() => ActiveMedicationsViewModel()); locator.registerFactory(() => AskDoctorViewModel()); locator.registerFactory(() => AllergiesViewModel()); + + //pharmacy + locator.registerFactory(() => PharmacyCategoriseViewModel()); + locator.registerFactory(() => OffersCategoriseViewModel()); } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index cafd1f06..108e9b52 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -19,6 +19,8 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; +import 'landing_page_pharmcy.dart'; + class HomePage extends StatefulWidget { final Function goToMyProfile; @@ -95,7 +97,9 @@ class _HomePageState extends State { children: [ Container( margin: EdgeInsets.only( - top: 15.0, left: 3.5, right: 3.5), + top: 15.0, + left: 3.5, + right: 3.5), // child: SvgPicture.asset( // 'assets/images/new-design/covid-19-car.svg', // width: 45.0, @@ -494,6 +498,8 @@ class _HomePageState extends State { ), height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', + onTap: () => Navigator.push( + context, FadePage(page: LandingPagePharmacy())), ), DashboardItem( child: Center( diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart new file mode 100644 index 00000000..37b52f6e --- /dev/null +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -0,0 +1,152 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; +import 'package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart'; +import 'package:flutter/material.dart'; + +import '../offers_categorise_page.dart'; + +class LandingPagePharmacy extends StatefulWidget { + @override + _LandingPagePharmacyState createState() => _LandingPagePharmacyState(); +} + +class _LandingPagePharmacyState extends State { + int currentTab = 0; + PageController pageController; + ProjectViewModel projectProvider; + + _changeCurrentTab(int tab) { + setState(() { + currentTab = tab; + pageController.jumpToPage(tab); + }); + } + + void initState() { + super.initState(); + pageController = PageController(keepPage: true); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: currentTab == 0 || currentTab == 1 + ? AppBar( + backgroundColor: Color(0xff5AB145), + elevation: 0, + title: Container( + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: Colors.white, + ), + child: InkWell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Icon(Icons.search, size: 16.0), + SizedBox( + width: 5.0, + ), + Text( + 'Search your Medicine', + style: TextStyle( + fontSize: 13.0, fontWeight: FontWeight.w300), + ) + ], + ), + ), + ), + ), + leading: Builder( + builder: (BuildContext context) { + return Container( + height: 2.0, + width: 10.0, + child: Image.asset( + 'assets/images/pharmacy_logo.png', + ), + ); + }, + ), + actions: [ + // IconButton( + // iconSize: 70, + // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', + // height: 100, width: 100, fit: BoxFit.cover), + // onPressed: () { + // triggerRobot(); + // } //do something, + // ) + ], + centerTitle: true, + ) + : AppBar( + backgroundColor: Color(0xff5AB145), + elevation: 0, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(getText(currentTab).toUpperCase()), + leading: Builder( + builder: (BuildContext context) { + return IconButton( + icon: Icon(Icons.arrow_back), + color: Colors.white, + onPressed: () => Scaffold.of(context).openDrawer(), + ); + }, + ), + actions: [ + // IconButton( + // iconSize: 70, + // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', + // height: 100, width: 100, fit: BoxFit.cover), + // onPressed: () { + // triggerRobot(); + // } //do something, + // ) + ], + centerTitle: true, + ), + extendBody: true, + body: PageView( + physics: NeverScrollableScrollPhysics(), + controller: pageController, + children: [ + Container( + child: Text('text'), + ), + PharmacyCategorisePage(), + OffersCategorisePage(), + Container( + child: Center(child: Text('This Is My Account Page')), + ), + Container( + child: Center(child: Text('This Is Cart Page')), + ), + ], // Please do not remove the BookingOptions from this array + ), + bottomNavigationBar: BottomNavPharmacyBar( + changeIndex: _changeCurrentTab, + index: currentTab, + ), + ); + } + + getText(currentTab) { + switch (currentTab) { + case 2: + return 'Wishlist'; + case 3: + return 'My Account'; + case 4: + return 'Shopping Cart'; + } + } +} diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart new file mode 100644 index 00000000..94130fa3 --- /dev/null +++ b/lib/pages/offers_categorise_page.dart @@ -0,0 +1,170 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class OffersCategorisePage extends StatefulWidget { + @override + _OffersCategorisePageState createState() => _OffersCategorisePageState(); +} + +class _OffersCategorisePageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getOffersCategorise(), + builder: (BuildContext context, OffersCategoriseViewModel model, + Widget child) => + AppScaffold( + isShowDecPage: false, + baseViewModel: model, + body: Container( + height: MediaQuery.of(context).size.height * 0.58, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts('Categories'), + ), + ), + Divider( + thickness: 2.0, + color: Colors.grey.shade400, + ), + Expanded( + child: Container( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + InkWell( + child: Column( + children: [ + Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.2, + height: MediaQuery.of(context) + .size + .height * + 0.08, + child: Center( + child: Texts(model + .categorise[index].name), + ), + ), + ], + ), + onTap: () { + model.getOffersProducts(); + }), + ], + ), + ); + }), + ), + ), + Divider( + thickness: 2.0, + color: Colors.grey.shade400, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Texts('Parsonal Care'), + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.5, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ), + ), + ], + ), + ], + ), + Divider( + thickness: 2.0, + color: Colors.grey.shade400, + ), + Expanded( + child: Container( + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.2, + mainAxisSpacing: 7.0, + childAspectRatio: 3.2, + ), + itemCount: model.products.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(4.0), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(1), + color: Colors.grey.withOpacity(0.24), + ), + child: Column( + children: [ + Container( + child: Image.network(model + .products[index].images.isNotEmpty + ? model + .products[index].images[0].thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png'), + ), + ], + ), + ), + ); + }, + ), + ), + ), + ], + ), + ), + )); + } +} +// diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart new file mode 100644 index 00000000..04e1c105 --- /dev/null +++ b/lib/pages/pharmacy_categorise.dart @@ -0,0 +1,139 @@ +import 'package:charts_flutter/flutter.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class PharmacyCategorisePage extends StatefulWidget { + @override + _PharmacyCategorisePageState createState() => _PharmacyCategorisePageState(); +} + +class _PharmacyCategorisePageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getCategorise(), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + AppScaffold( + isShowDecPage: false, + baseViewModel: model, + body: Column( + children: [ + Container( + height: 400, + margin: EdgeInsets.only(bottom: 22), + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 1.0, + childAspectRatio: 3.2, + ), + itemCount: model.categorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(4.0), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: Colors.grey.withOpacity(0.24), + ), + child: Center( + child: Texts(model.categorise[index].name), + ), + ), + ); + }, + ), + ), + Container( + height: 200, + child: Column( + children: [ + Divider( + height: 2.0, + thickness: 2.0, + color: Colors.black12.withOpacity(0.14)), + SizedBox( + height: 15.0, + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + color: Colors.green.shade300.withOpacity(0.34), + ), + child: Center( + child: Texts( + 'best sellers', + )), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: Colors.orangeAccent.shade200 + .withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Center(child: Texts('Most Viewed')), + ), + ), + ), + ], + ), + Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: Colors.blue.shade200.withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Center(child: Texts('New Proudcts')), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: Colors.purple.shade200.withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Center(child: Texts('Recently Viewed')), + ), + ), + ), + ], + ), + ], + )), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart new file mode 100644 index 00000000..7012b392 --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart @@ -0,0 +1,108 @@ +import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:eva_icons_flutter/eva_icons_flutter.dart'; +import 'package:flutter/material.dart'; + +import 'bottom_nav_pharmacy_home_item.dart'; +import 'bottom_nav_pharmacy_item.dart'; + +class BottomNavPharmacyBar extends StatefulWidget { + final ValueChanged changeIndex; + final int index; + BottomNavPharmacyBar({Key key, this.changeIndex, this.index}) + : super(key: key); + + @override + _BottomNavPharmacyBarState createState() => _BottomNavPharmacyBarState(); +} + +class _BottomNavPharmacyBarState extends State { + int _index = 0; + + _changeIndex(int index) { + widget.changeIndex(index); + } + + @override + Widget build(BuildContext context) { + return BottomAppBar( + elevation: 4, + shape: CircularNotchedRectangle(), + color: Colors.white, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 18), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + BottomNavHomeItem( + icon: EvaIcons.image, + activeIcon: EvaIcons.image, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 0, + ), + + Container( + height: 65.0, + child: Center( + child: VerticalDivider( + color: Colors.grey, + thickness: 0.5, + width: 0.3, + indent: 25.5, + ), + ), + ), + + BottomNavPharmacyItem( + icon: EvaIcons.list, + activeIcon: EvaIcons.list, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 1, + title: 'Categorise', + ), +// Expanded( +// child: SizedBox( +// height: 50, +// child: Column( +// mainAxisSize: MainAxisSize.min, +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// SizedBox(height: 22), +// ], +// ), +// ), +// ), + + // Added Calendar Icon to access book appointment flow + BottomNavPharmacyItem( + icon: EvaIcons.heart, + activeIcon: EvaIcons.heart, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 2, + title: 'Wishlist'), + + BottomNavPharmacyItem( + icon: EvaIcons.person, + activeIcon: EvaIcons.person, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 3, + title: 'My Account', + ), + BottomNavPharmacyItem( + icon: EvaIcons.shoppingCart, + activeIcon: EvaIcons.shoppingCart, + changeIndex: _changeIndex, + index: widget.index, + currentIndex: 4, + title: 'Cart') + ], + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart new file mode 100644 index 00000000..c5c3519b --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart @@ -0,0 +1,74 @@ +import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class BottomNavHomeItem extends StatelessWidget { + final IconData icon; + final Image image; + + final ValueChanged changeIndex; + final int index; + final int currentIndex; + final Function onTap; + final IconData activeIcon; + + BottomNavHomeItem( + {this.icon, + this.changeIndex, + this.index, + this.currentIndex, + this.activeIcon, + this.onTap, + this.image}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: SizedBox( + // height: 72.0, + child: Material( + type: MaterialType.transparency, + child: InkWell( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + onTap: () => { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + ), + }, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 15, + ), + currentIndex == index + ? Divider( + // color: Color(0xff5AB145), + thickness: 0.5, + ) + : Divider( + thickness: 0, + ), + Container( + child: Image.asset( + 'assets/images/habib-logo.png', + height: 35.0, + ), + ), + SizedBox( + height: 11, + ), + + // Added TextAlign Property + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart new file mode 100644 index 00000000..9d46e2eb --- /dev/null +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart @@ -0,0 +1,76 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class BottomNavPharmacyItem extends StatelessWidget { + final String title; + final IconData icon; + + final ValueChanged changeIndex; + final int index; + final int currentIndex; + final Function onTap; + + final IconData activeIcon; + BottomNavPharmacyItem( + {this.icon, + this.changeIndex, + this.index, + this.currentIndex, + this.activeIcon, + this.title, + this.onTap}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: SizedBox( + // height: 72.0, + child: Material( + type: MaterialType.transparency, + child: InkWell( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + onTap: () => changeIndex(currentIndex), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 15, + ), + currentIndex == index + ? Divider( + color: Color(0xff5AB145), + thickness: 3.5, + ) + : Divider( + thickness: 0, + ), + Container( + child: Icon(currentIndex == index ? activeIcon : icon, + color: currentIndex == index + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColor, + size: 22.0), + ), + SizedBox( + height: 11, + ), + + // Added TextAlign Property + Texts( + title, + textAlign: TextAlign.center, + color: currentIndex == index + ? Theme.of(context).primaryColor + : Theme.of(context).primaryColor, + fontSize: 11, + ), + ], + ), + ), + ), + ), + ); + } +} From 69a6bc2812760ac392bac87f775f4cd6f3ccacc1 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Thu, 5 Nov 2020 15:39:36 +0200 Subject: [PATCH 08/69] offers page --- lib/config/config.dart | 6 +- .../pharmacy/categorise_parent_model.dart | 75 +++ .../model/pharmacy/parent_products_model.dart | 560 ++++++++++++++++ lib/core/service/offers_service.dart | 14 +- .../service/pharmacy_categorise_service.dart | 47 ++ .../offers_Categorise_view_model.dart | 10 +- .../pharmacy_categorise_view_model.dart | 33 + lib/locator.dart | 5 - lib/pages/landing/home_page.dart | 14 +- lib/pages/landing/landing_page_pharmcy.dart | 7 +- lib/pages/offers_categorise_page.dart | 626 ++++++++++++++--- lib/pages/parent_categorise_page.dart | 630 ++++++++++++++++++ lib/pages/pharmacy_categorise.dart | 28 +- .../others/app_scaffold_pharmacy_widget.dart | 114 ++++ lib/widgets/others/app_scaffold_widget.dart | 31 +- 15 files changed, 2067 insertions(+), 133 deletions(-) create mode 100644 lib/core/model/pharmacy/categorise_parent_model.dart create mode 100644 lib/core/model/pharmacy/parent_products_model.dart create mode 100644 lib/pages/parent_categorise_page.dart create mode 100644 lib/widgets/others/app_scaffold_pharmacy_widget.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 37392119..fd84adfa 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -354,7 +354,11 @@ const GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems"; const GET_PHARMACY_CATEGORISE = 'epharmacy/api/categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id=0'; const GET_OFFERS_CATEGORISE = 'epharmacy/api/discountcategories'; -const GET_OFFERS_PRODUCTS = 'epharmacy/api/offerproducts/12'; +const GET_OFFERS_PRODUCTS = 'epharmacy/api/offerproducts/'; +const GET_CATEGORISE_PARENT = + 'epharmacy/api/categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id='; +const GET_PARENT_PRODUCTS = + 'epharmacy/api/products?categoryid=1&page=1&limit=50'; const TIMER_MIN = 10; diff --git a/lib/core/model/pharmacy/categorise_parent_model.dart b/lib/core/model/pharmacy/categorise_parent_model.dart new file mode 100644 index 00000000..82c5b55f --- /dev/null +++ b/lib/core/model/pharmacy/categorise_parent_model.dart @@ -0,0 +1,75 @@ +class CategoriseParentModel { + String id; + String name; + String namen; + List localizedNames; + dynamic description; + int parentCategoryId; + int displayOrder; + dynamic image; + bool isLeaf; + + CategoriseParentModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + CategoriseParentModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + data['image'] = this.image; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} diff --git a/lib/core/model/pharmacy/parent_products_model.dart b/lib/core/model/pharmacy/parent_products_model.dart new file mode 100644 index 00000000..52530af5 --- /dev/null +++ b/lib/core/model/pharmacy/parent_products_model.dart @@ -0,0 +1,560 @@ +class ParentProductsModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + dynamic shortDescription; + dynamic shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + double price; + dynamic oldPrice; + double productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + ParentProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + ParentProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + manufacturerIds = json['manufacturer_ids'].cast(); + + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/service/offers_service.dart b/lib/core/service/offers_service.dart index ebcbd9a2..2247c833 100644 --- a/lib/core/service/offers_service.dart +++ b/lib/core/service/offers_service.dart @@ -10,6 +10,14 @@ class OffersCategoriseService extends BaseService { List _offerProducts = List(); List get offersProducts => _offerProducts; + clearCategorise() { + _offerProducts.clear(); + } + + // clearCategorise2() { + // _offersList.clear(); + // } + Future getOffersCategorise() async { hasError = false; _offersList.clear(); @@ -27,11 +35,13 @@ class OffersCategoriseService extends BaseService { ); } - Future getOffersProducts() async { + Future getOffersProducts({String id}) async { hasError = false; _offerProducts.clear(); + String endPoint = + id != null ? GET_OFFERS_PRODUCTS + "$id" : GET_OFFERS_PRODUCTS + "1"; await baseAppClient.get( - GET_OFFERS_PRODUCTS, + endPoint, onSuccess: (dynamic response, int statusCode) { response['products'].forEach((item) { _offerProducts.add(OfferProductsModel.fromJson(item)); diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart index 676f900b..162c023e 100644 --- a/lib/core/service/pharmacy_categorise_service.dart +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -1,12 +1,23 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; import 'base_service.dart'; class PharmacyCategoriseService extends BaseService { + //service one List _categoriseList = List(); List get categoriseList => _categoriseList; + //service two + List _parentCategoriseList = List(); + List get parentCategoriseList => _parentCategoriseList; + + //service three + List _parentProductsList = List(); + List get parentProductsList => _parentProductsList; + Future getCategorise() async { hasError = false; _categoriseList.clear(); @@ -23,4 +34,40 @@ class PharmacyCategoriseService extends BaseService { }, ); } + + Future getCategoriseParent({String id}) async { + hasError = false; + _parentCategoriseList.clear(); + String endPoint = + id != null ? GET_CATEGORISE_PARENT + "$id" : GET_CATEGORISE_PARENT + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _parentCategoriseList.add(CategoriseParentModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getParentProducts() async { + hasError = false; + _parentProductsList.clear(); + await baseAppClient.get( + GET_PARENT_PRODUCTS, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _parentProductsList.add(ParentProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } } diff --git a/lib/core/viewModels/offers_Categorise_view_model.dart b/lib/core/viewModels/offers_Categorise_view_model.dart index 3bb67ab7..b63dd553 100644 --- a/lib/core/viewModels/offers_Categorise_view_model.dart +++ b/lib/core/viewModels/offers_Categorise_view_model.dart @@ -18,7 +18,7 @@ class OffersCategoriseViewModel extends BaseViewModel { Future getOffersCategorise() async { hasError = false; - // _insuranceCardService.clearInsuranceCard(); + _offersCategoriseService.clearCategorise(); setState(ViewState.Busy); await _offersCategoriseService.getOffersCategorise(); if (_offersCategoriseService.hasError) { @@ -28,11 +28,11 @@ class OffersCategoriseViewModel extends BaseViewModel { await getOffersProducts(); } - Future getOffersProducts() async { + Future getOffersProducts({String i}) async { hasError = false; - // _insuranceCardService.clearInsuranceCard(); - // setState(ViewState.Busy); - await _offersCategoriseService.getOffersProducts(); + + setState(ViewState.Busy); + await _offersCategoriseService.getOffersProducts(id: i); if (_offersCategoriseService.hasError) { error = _offersCategoriseService.error; setState(ViewState.ErrorLocal); diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart index 62b658aa..5c39c9cb 100644 --- a/lib/core/viewModels/pharmacy_categorise_view_model.dart +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -1,4 +1,6 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -9,9 +11,16 @@ class PharmacyCategoriseViewModel extends BaseViewModel { bool hasError = false; PharmacyCategoriseService _pharmacyCategoriseService = locator(); + List get categorise => _pharmacyCategoriseService.categoriseList; + List get categoriseParent => + _pharmacyCategoriseService.parentCategoriseList; + + List get parentProducts => + _pharmacyCategoriseService.parentProductsList; + Future getCategorise() async { hasError = false; // _insuranceCardService.clearInsuranceCard(); @@ -23,4 +32,28 @@ class PharmacyCategoriseViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + + Future getCategoriseParent({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getCategoriseParent(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + await getParentProducts(); + } + + Future getParentProducts() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getParentProducts(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } } diff --git a/lib/locator.dart b/lib/locator.dart index 4e315ff5..911c9728 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -146,7 +146,6 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); - /// View Model locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => PharmacyViewModel()); @@ -190,12 +189,8 @@ void setupLocator() { locator.registerFactory(() => HomeHealthCareViewModel()); locator.registerFactory(() => CMCViewModel()); - - - locator.registerFactory(() => PharmacyModuleViewModel()); - //pharmacy locator.registerFactory(() => PharmacyCategoriseViewModel()); locator.registerFactory(() => OffersCategoriseViewModel()); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 567703b2..232719b8 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -483,8 +483,6 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( - onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), - child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -512,10 +510,12 @@ class _HomePageState extends State { height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', onTap: () => Navigator.push( - context, FadePage(page: LandingPagePharmacy())), + context, + FadePage(page: LandingPagePharmacy()), + ), ), DashboardItem( - onTap: (){ + onTap: () { Navigator.push( context, FadePage( @@ -829,8 +829,10 @@ class DashboardItem extends StatelessWidget { ? DecorationImage( image: ExactAssetImage('assets/images/$imageName'), fit: BoxFit.cover, - colorFilter: hasColorFilter ? new ColorFilter.mode( - Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, + colorFilter: hasColorFilter + ? new ColorFilter.mode( + Colors.black.withOpacity(0.2), BlendMode.dstIn) + : null, ) : null, ), diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart index 37b52f6e..058a42fe 100644 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; @@ -114,7 +115,7 @@ class _LandingPagePharmacyState extends State { ], centerTitle: true, ), - extendBody: true, + extendBody: false, body: PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, @@ -124,9 +125,7 @@ class _LandingPagePharmacyState extends State { ), PharmacyCategorisePage(), OffersCategorisePage(), - Container( - child: Center(child: Text('This Is My Account Page')), - ), + ParentCategorisePage(), Container( child: Center(child: Text('This Is Cart Page')), ), diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart index 94130fa3..34c3bff2 100644 --- a/lib/pages/offers_categorise_page.dart +++ b/lib/pages/offers_categorise_page.dart @@ -1,8 +1,12 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'base/base_view.dart'; @@ -12,17 +16,28 @@ class OffersCategorisePage extends StatefulWidget { } class _OffersCategorisePageState extends State { + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); return BaseView( onModelReady: (model) => model.getOffersCategorise(), builder: (BuildContext context, OffersCategoriseViewModel model, Widget child) => AppScaffold( + backgroundColor: Colors.white, isShowDecPage: false, baseViewModel: model, body: Container( - height: MediaQuery.of(context).size.height * 0.58, + //height: MediaQuery.of(context).size.height * 0.57, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -36,59 +51,64 @@ class _OffersCategorisePageState extends State { thickness: 2.0, color: Colors.grey.shade400, ), - Expanded( - child: Container( - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.categorise.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - InkWell( - child: Column( - children: [ - Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Icon( - Icons.apps_sharp, - size: 32.0, - ), + //Expanded widget heree if nassery + Container( + height: MediaQuery.of(context).size.height * 0.20, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + InkWell( + child: Column( + children: [ + Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.2, - height: MediaQuery.of(context) - .size - .height * - 0.08, - child: Center( - child: Texts(model - .categorise[index].name), - ), + child: Icon( + Icons.apps_sharp, + size: 32.0, ), - ], - ), - onTap: () { - model.getOffersProducts(); - }), - ], - ), - ); - }), - ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.2, + height: MediaQuery.of(context) + .size + .height * + 0.09, + child: Center( + child: Texts( + model.categorise[index].name), + ), + ), + ], + ), + onTap: () { + model.getOffersProducts( + i: model.categorise[index].id); + String ids = model.categorise[index].id; + + categoriseName = + model.categorise[index].name; + }), + ], + ), + ); + }), ), Divider( - thickness: 2.0, + thickness: 1.0, color: Colors.grey.shade400, ), Row( @@ -96,7 +116,7 @@ class _OffersCategorisePageState extends State { children: [ Padding( padding: EdgeInsets.all(8.0), - child: Texts('Parsonal Care'), + child: Texts(categoriseName), ), Row( children: [ @@ -104,17 +124,36 @@ class _OffersCategorisePageState extends State { height: 44.0, child: VerticalDivider( color: Colors.black45, - thickness: 1.5, + thickness: 1.0, //width: 0.3, // indent: 0.0, ), ), Padding( padding: EdgeInsets.all(8.0), - child: Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, + child: InkWell( + child: styleIcon, + onTap: () { + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); + }, ), ), ], @@ -122,49 +161,452 @@ class _OffersCategorisePageState extends State { ], ), Divider( - thickness: 2.0, + thickness: 1.0, color: Colors.grey.shade400, ), - Expanded( - child: Container( - child: GridView.builder( - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.2, - mainAxisSpacing: 7.0, - childAspectRatio: 3.2, - ), - itemCount: model.products.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.all(4.0), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(1), - color: Colors.grey.withOpacity(0.24), - ), - child: Column( - children: [ - Container( - child: Image.network(model - .products[index].images.isNotEmpty - ? model - .products[index].images[0].thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png'), - ), - ], + styleOne == true + ? Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 0.50, + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.2, ), + itemCount: model.products.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.products[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + if (model.products[index] + .discountName != + null) + RotatedBox( + quarterTurns: 4, + child: Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + right: 5.0, + top: 20.0, + bottom: 5.0, + ), + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight.w900, + ), + ), + transform: new Matrix4 + .rotationZ( + 5.837200), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.products[index] + .images.isNotEmpty + ? model + .products[index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model.products[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.products[index] + .rxMessage != + null + ? model + .products[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.products[index] + .discountName != + null) + Container( + width: double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .products[index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 10.4, + ), + ), + ), + Texts( + projectProvider.isArabic + ? model + .products[index] + .name + : model + .products[index] + .namen, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.products[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .products[ + index] + .approvedRatingSum > + 0 + ? (model.products[index].approvedRatingSum + .toDouble() / + model + .products[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.products[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, ), - ); - }, - ), - ), - ), + ), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.products.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model.products[index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), + ), + ), + ), + transform: + new Matrix4.rotationZ( + 6.15099), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.products[index] + .images.isNotEmpty + ? model + .products[index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model.products[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.products[index] + .rxMessage != + null + ? model + .products[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.products[index] + .discountName != + null) + Container( + width: 250.0, + height: 18.5, + decoration: BoxDecoration( + color: Color(0xff5AB145), + ), + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 5.5, + ), + child: Texts( + model.products[index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 11.4, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + projectProvider.isArabic + ? model + .products[index].name + : model.products[index] + .namen, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.products[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .products[ + index] + .approvedRatingSum > + 0 + ? (model + .products[ + index] + .approvedRatingSum + .toDouble() / + model + .products[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.products[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) ], ), ), )); } } -// diff --git a/lib/pages/parent_categorise_page.dart b/lib/pages/parent_categorise_page.dart new file mode 100644 index 00000000..007a3037 --- /dev/null +++ b/lib/pages/parent_categorise_page.dart @@ -0,0 +1,630 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'base/base_view.dart'; + +class ParentCategorisePage extends StatelessWidget { + final String id; + final String titleName; + + ParentCategorisePage({this.id, this.titleName}); + + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getCategoriseParent(i: id), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: titleName, + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: Container( +//height: MediaQuery.of(context).size.height * 0.57, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts(model.categoriseParent.length >= 8 + ? 'View All Categories' + : ''), + ), + ), + Divider( + thickness: 2.0, + color: Colors.grey.shade400, + ), +//Expanded widget heree if nassery + Container( + height: MediaQuery.of(context).size.height * 0.20, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categoriseParent.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + InkWell( + child: Column( + children: [ + Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.2, + height: MediaQuery.of(context) + .size + .height * + 0.09, + child: Center( + child: Texts(model + .categoriseParent[index].name), + ), + ), + ], + ), + ), + ], + ), + ); + }), + ), + + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Texts(categoriseName), + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }, + ), + ), + ], + ), + ], + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 0.50, + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.2, + ), + itemCount: model.parentProducts.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.parentProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + if (model + .parentProducts[index] + .discountName != + null) + RotatedBox( + quarterTurns: 4, + child: Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + right: 5.0, + top: 20.0, + bottom: 5.0, + ), + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight.w900, + ), + ), + transform: new Matrix4 + .rotationZ( + 5.837200), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model + .parentProducts[index] + .images[index] + .thumb, + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .parentProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model + .parentProducts[ + index] + .rxMessage != + null + ? model + .parentProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model + .parentProducts[ + index] + .discountName != + null) + Container( + width: double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .parentProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 10.4, + ), + ), + ), + Texts( + projectProvider.isArabic + ? model + .parentProducts[ + index] + .name + : model + .parentProducts[ + index] + .namen, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.parentProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .parentProducts[ + index] + .approvedRatingSum > + 0 + ? (model.parentProducts[index].approvedRatingSum + .toDouble() / + model + .parentProducts[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.parentProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.parentProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model + .parentProducts[index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), + ), + ), + ), + transform: + new Matrix4.rotationZ( + 6.15099), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model + .parentProducts[ + index] + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model + .parentProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model + .parentProducts[ + index] + .rxMessage != + null + ? model + .parentProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.parentProducts[index] + .discountName != + null) + Container( + width: 250.0, + height: 18.5, + decoration: BoxDecoration( + color: Color(0xff5AB145), + ), + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 5.5, + ), + child: Texts( + model + .parentProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 11.4, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + projectProvider.isArabic + ? model + .parentProducts[index] + .name + : model + .parentProducts[index] + .namen, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.parentProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .parentProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .parentProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .parentProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.parentProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart index 04e1c105..589a74d6 100644 --- a/lib/pages/pharmacy_categorise.dart +++ b/lib/pages/pharmacy_categorise.dart @@ -1,5 +1,6 @@ import 'package:charts_flutter/flutter.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -37,14 +38,27 @@ class _PharmacyCategorisePageState extends State { itemBuilder: (BuildContext context, int index) { return Padding( padding: EdgeInsets.all(4.0), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5), - color: Colors.grey.withOpacity(0.24), - ), - child: Center( - child: Texts(model.categorise[index].name), + child: InkWell( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5), + color: Colors.grey.withOpacity(0.24), + ), + child: Center( + child: Texts(model.categorise[index].name), + ), ), + onTap: () => { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ParentCategorisePage( + id: model.categorise[index].id, + titleName: model.categorise[index].name, + ), + ), + ), + }, ), ); }, diff --git a/lib/widgets/others/app_scaffold_pharmacy_widget.dart b/lib/widgets/others/app_scaffold_pharmacy_widget.dart new file mode 100644 index 00000000..764089e9 --- /dev/null +++ b/lib/widgets/others/app_scaffold_pharmacy_widget.dart @@ -0,0 +1,114 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; +import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; +import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; + +import '../../locator.dart'; +import 'floating_button_search.dart'; +import '../progress_indicator/app_loader_widget.dart'; +import 'arrow_back.dart'; +import 'network_base_view.dart'; +import 'not_auh_page.dart'; + +class PharmacyAppScaffold extends StatelessWidget { + final String appBarTitle; + final Widget body; + final Widget bottomSheet; + final bool isLoading; + final bool isShowAppBar; + final bool hasAppBarParam; + final BaseViewModel baseViewModel; + final bool isBottomBar; + final Widget floatingActionButton; + final String title; + final String description; + final bool isShowDecPage; + final Color backgroundColor; + + AuthenticatedUserObject authenticatedUserObject = + locator(); + + PharmacyAppScaffold( + {@required this.body, + this.appBarTitle = '', + this.isLoading = false, + this.isShowAppBar = false, + this.hasAppBarParam, + this.bottomSheet, + this.baseViewModel, + this.floatingActionButton, + this.title, + this.description, + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor}); + + @override + Widget build(BuildContext context) { + AppGlobal.context = context; + + return Scaffold( + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Color(0xff5AB145), + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(authenticatedUserObject.isLogin + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [], + ) + : null, + body: (!authenticatedUserObject.isLogin && isShowDecPage) + ? NotAutPage( + title: appBarTitle, + description: description, + ) + : baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), + bottomSheet: bottomSheet, + floatingActionButton: floatingActionButton ?? floatingActionButton, + // bottomNavigationBar: + // this.isBottomBar == true ? BottomBarSearch() : SizedBox() + // floatingActionButton: FloatingSearchButton(), + ); + } + + buildAppLoaderWidget(bool isLoading) { + return isLoading ? AppLoaderWidget() : Container(); + } + + buildBodyWidget() { + // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); + return Stack(children: [ + body, /*FloatingSearchButton()*/ + ]); + } +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 31005606..86f39159 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -51,14 +51,17 @@ class AppScaffold extends StatelessWidget { this.floatingActionButton, this.title, this.description, - this.isShowDecPage = true, this.isBottomBar,this.backgroundColor}); + this.isShowDecPage = true, + this.isBottomBar, + this.backgroundColor}); @override Widget build(BuildContext context) { AppGlobal.context = context; return Scaffold( - backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, appBar: isShowAppBar ? AppBar( elevation: 0, @@ -69,7 +72,8 @@ class AppScaffold extends StatelessWidget { ), title: Text(authenticatedUserObject.isLogin ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle),leading: Builder( + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( builder: (BuildContext context) { return ArrowBack(); }, @@ -80,7 +84,10 @@ class AppScaffold extends StatelessWidget { icon: Icon(FontAwesomeIcons.home), color: Colors.white, onPressed: () { - Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route r) => false); + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + (Route r) => false); }, ), ], @@ -91,12 +98,12 @@ class AppScaffold extends StatelessWidget { title: appBarTitle, description: description, ) - :baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: baseViewModel, - ) - : buildBodyWidget(), + : baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), bottomSheet: bottomSheet, floatingActionButton: floatingActionButton ?? floatingActionButton, // bottomNavigationBar: @@ -111,6 +118,8 @@ class AppScaffold extends StatelessWidget { buildBodyWidget() { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [body, /*FloatingSearchButton()*/]); + return Stack(children: [ + body, /*FloatingSearchButton()*/ + ]); } } From 6162833bba3c451b5f5b9337b5bfe53b309c0b7a Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Thu, 5 Nov 2020 16:08:21 +0200 Subject: [PATCH 09/69] offers products page --- lib/locator.dart | 7 ----- lib/pages/landing/home_page.dart | 30 ++++++++++----------- lib/widgets/others/app_scaffold_widget.dart | 10 ++++--- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/lib/locator.dart b/lib/locator.dart index 43bb1512..c4cf0c5d 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -120,7 +120,6 @@ void setupLocator() { locator.registerLazySingleton(() => HomeHealthCareService()); locator.registerLazySingleton(() => CMCService()); - locator.registerLazySingleton(() => PatientSickLeaveService()); locator.registerLazySingleton(() => MyBalanceService()); locator.registerLazySingleton(() => BloodSugarService()); @@ -150,7 +149,6 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); - /// View Model locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => PharmacyViewModel()); @@ -181,8 +179,6 @@ void setupLocator() { locator.registerFactory(() => UserInformationViewModel()); locator.registerFactory(() => VaccinationTableViewModel()); - - locator.registerFactory(() => AddNewChildViewModel()); locator.registerFactory(() => H2OViewModel()); locator.registerFactory(() => BloodSugarViewMode()); @@ -196,9 +192,6 @@ void setupLocator() { locator.registerFactory(() => HomeHealthCareViewModel()); locator.registerFactory(() => CMCViewModel()); - - - locator.registerFactory(() => PharmacyModuleViewModel()); locator.registerFactory(() => OrderPreviewViewModel()); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 97a3877b..d0c7b450 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -11,7 +11,7 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacyModule/pharmacy_module_page.dart'; + import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -104,10 +104,10 @@ class _HomePageState extends State { top: 15.0, left: 3.5, right: 3.5), - child: SvgPicture.asset( - 'assets/images/new-design/covid-19-car.svg', - width: 45.0, - height: 45.0), + child: SvgPicture.asset( + 'assets/images/new-design/covid-19-car.svg', + width: 45.0, + height: 45.0), ), Container( margin: EdgeInsets.only( @@ -181,11 +181,11 @@ class _HomePageState extends State { .withOpacity(0.3), borderRadius: BorderRadius.all( Radius.circular(5))), - child: SvgPicture.asset( - projectViewModel.isArabic - ? 'assets/images/new-design/livecare_arabic_logo.svg' - : 'assets/images/new-design/liveCare_white_logo.svg', - ), + child: SvgPicture.asset( + projectViewModel.isArabic + ? 'assets/images/new-design/livecare_arabic_logo.svg' + : 'assets/images/new-design/liveCare_white_logo.svg', + ), ), ), ), @@ -484,8 +484,6 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( - onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), - child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -518,7 +516,7 @@ class _HomePageState extends State { ), ), DashboardItem( - onTap: (){ + onTap: () { Navigator.push( context, FadePage( @@ -832,8 +830,10 @@ class DashboardItem extends StatelessWidget { ? DecorationImage( image: ExactAssetImage('assets/images/$imageName'), fit: BoxFit.cover, - colorFilter: hasColorFilter ? new ColorFilter.mode( - Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, + colorFilter: hasColorFilter + ? new ColorFilter.mode( + Colors.black.withOpacity(0.2), BlendMode.dstIn) + : null, ) : null, ), diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index f6ac453a..1ca31f02 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -52,14 +52,16 @@ class AppScaffold extends StatelessWidget { this.title, this.description, this.isShowDecPage = true, - this.isBottomBar,this.backgroundColor}); + this.isBottomBar, + this.backgroundColor}); @override Widget build(BuildContext context) { AppGlobal.context = context; return Scaffold( - backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, appBar: isShowAppBar ? AppBar( elevation: 0, @@ -116,6 +118,8 @@ class AppScaffold extends StatelessWidget { buildBodyWidget() { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [body, /*FloatingSearchButton()*/]); + return Stack(children: [ + body, /*FloatingSearchButton()*/ + ]); } } From 94fb41581ea194cf41357c07e97b32dfaf6a3bdd Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 9 Nov 2020 16:02:31 +0300 Subject: [PATCH 10/69] config update --- lib/config/config.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/config/config.dart b/lib/config/config.dart index ce8b79de..93cd798c 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -341,6 +341,7 @@ const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer"; const GET_PHARMACY_BEST_SELLER_PRODUCT = "epharmacy/api/bestsellerproducts"; const GET_PHARMACY_PRODUCTs_BY_IDS = "epharmacy/api/productsbyids/"; const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/"; +const GET_WISHLIST = "epharmacy/api/shopping_cart_items/"; // Home Health Care const HHC_GET_ALL_SERVICES = From f137bd44c0cf1860e9e4028dd6d332a047230e62 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 10 Nov 2020 11:43:20 +0300 Subject: [PATCH 11/69] created order and order details UI pages --- android/app/src/main/AndroidManifest.xml | 6 +- assets/images/pharmacy/Group 1206.svg | 14 + assets/images/pharmacy/Group 1207.svg | 17 + .../images/pharmacy/aramex_shipping_logo.svg | 14 + assets/images/pharmacy/arrow_right.svg | 6 + assets/images/pharmacy/credit_card_icon.svg | 6 + assets/images/pharmacy/hmg_shipping_logo.svg | 17 + assets/images/pharmacy/quote_end.svg | 8 + assets/images/pharmacy/quote_start.svg | 8 + assets/images/pharmacy/shipping_mark_icon.svg | 16 + .../images/pharmacy/shipping_truck_icon.svg | 34 + .../images/pharmacy/success_review_icon.svg | 24 + lib/config/config.dart | 7 + lib/config/localized_values.dart | 27 + lib/pages/landing/home_page.dart | 10 +- lib/pages/pharmacy/order/Order.dart | 781 ++++++++++++++++++ lib/pages/pharmacy/order/OrderDetails.dart | 467 +++++++++++ lib/pages/pharmacy/order/ProductReview.dart | 312 +++++++ .../pharmacyAddresses/AddAddress.dart | 142 +++- .../pharmacyAddresses/PharmacyAddresses.dart | 110 ++- .../orderDetails_service.dart | 39 + .../pharmacy_services/order_service.dart | 38 + .../pharmacyAddress_service.dart | 40 + lib/uitl/translations_delegate_base.dart | 27 + lib/widgets/pharmacy/product_tile.dart | 137 ++- pubspec.yaml | 3 + 26 files changed, 2257 insertions(+), 53 deletions(-) create mode 100644 assets/images/pharmacy/Group 1206.svg create mode 100644 assets/images/pharmacy/Group 1207.svg create mode 100644 assets/images/pharmacy/aramex_shipping_logo.svg create mode 100644 assets/images/pharmacy/arrow_right.svg create mode 100644 assets/images/pharmacy/credit_card_icon.svg create mode 100644 assets/images/pharmacy/hmg_shipping_logo.svg create mode 100644 assets/images/pharmacy/quote_end.svg create mode 100644 assets/images/pharmacy/quote_start.svg create mode 100644 assets/images/pharmacy/shipping_mark_icon.svg create mode 100644 assets/images/pharmacy/shipping_truck_icon.svg create mode 100644 assets/images/pharmacy/success_review_icon.svg create mode 100644 lib/pages/pharmacy/order/Order.dart create mode 100644 lib/pages/pharmacy/order/OrderDetails.dart create mode 100644 lib/pages/pharmacy/order/ProductReview.dart create mode 100644 lib/services/pharmacy_services/orderDetails_service.dart create mode 100644 lib/services/pharmacy_services/order_service.dart create mode 100644 lib/services/pharmacy_services/pharmacyAddress_service.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8c32edfd..065f9f47 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -25,6 +25,8 @@ android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:label="diplomaticquarterapp"> + - + + diff --git a/assets/images/pharmacy/Group 1206.svg b/assets/images/pharmacy/Group 1206.svg new file mode 100644 index 00000000..ef8f7473 --- /dev/null +++ b/assets/images/pharmacy/Group 1206.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/Group 1207.svg b/assets/images/pharmacy/Group 1207.svg new file mode 100644 index 00000000..fd2ffd41 --- /dev/null +++ b/assets/images/pharmacy/Group 1207.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/aramex_shipping_logo.svg b/assets/images/pharmacy/aramex_shipping_logo.svg new file mode 100644 index 00000000..30cc03b8 --- /dev/null +++ b/assets/images/pharmacy/aramex_shipping_logo.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/assets/images/pharmacy/arrow_right.svg b/assets/images/pharmacy/arrow_right.svg new file mode 100644 index 00000000..b4243287 --- /dev/null +++ b/assets/images/pharmacy/arrow_right.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/credit_card_icon.svg b/assets/images/pharmacy/credit_card_icon.svg new file mode 100644 index 00000000..9ba6c2bf --- /dev/null +++ b/assets/images/pharmacy/credit_card_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/pharmacy/hmg_shipping_logo.svg b/assets/images/pharmacy/hmg_shipping_logo.svg new file mode 100644 index 00000000..8e9db3d6 --- /dev/null +++ b/assets/images/pharmacy/hmg_shipping_logo.svg @@ -0,0 +1,17 @@ + + + diff --git a/assets/images/pharmacy/quote_end.svg b/assets/images/pharmacy/quote_end.svg new file mode 100644 index 00000000..083ff39a --- /dev/null +++ b/assets/images/pharmacy/quote_end.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/quote_start.svg b/assets/images/pharmacy/quote_start.svg new file mode 100644 index 00000000..74216f14 --- /dev/null +++ b/assets/images/pharmacy/quote_start.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/pharmacy/shipping_mark_icon.svg b/assets/images/pharmacy/shipping_mark_icon.svg new file mode 100644 index 00000000..5cf9606b --- /dev/null +++ b/assets/images/pharmacy/shipping_mark_icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/shipping_truck_icon.svg b/assets/images/pharmacy/shipping_truck_icon.svg new file mode 100644 index 00000000..8ffda974 --- /dev/null +++ b/assets/images/pharmacy/shipping_truck_icon.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pharmacy/success_review_icon.svg b/assets/images/pharmacy/success_review_icon.svg new file mode 100644 index 00000000..f6951456 --- /dev/null +++ b/assets/images/pharmacy/success_review_icon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/config/config.dart b/lib/config/config.dart index 0e2cb367..dd6e612a 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -8,6 +8,8 @@ const MAX_SMALL_SCREEN = 660; const BASE_URL = 'https://hmgwebservices.com/'; +const PHARMACY_BASE_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; + const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; ///Doctor @@ -327,6 +329,11 @@ const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; //Pharmacy wishlist const GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; +//Pharmacy address +const GET_ADDRESS = "https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses"; +//order + order details 'orders?customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=' + page_id + '&limit=200&customer_id='+ custmerId, +const GET_ORDER = "https://uat.hmgwebservices.com/epharmacy/api/orders?customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; +const GET_ORDER_DETAILS = "https://uat.hmgwebservices.com/epharmacy/api/orders/3584"; const TIMER_MIN = 10; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 9affe647..0440addb 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -622,4 +622,31 @@ const Map> localizedValues = { "delete": {"en": "Delete", "ar": " حذف"}, "addAddress": {"en": "ADD A NEW ADDRESS", "ar": " اضافة عنوان جديد"}, "addNewAddress": {"en": "Add New Address", "ar": " اضافة عنوان جديد"}, + "order": {"en": "My Order", "ar": " طلباتي"}, + "delivered": {"en": "Delivered", "ar": " تم التوصيل"}, + "pending": {"en": "Pending", "ar": " معلقة "}, + "processing": {"en": "Processing", "ar": " تحت المعالجة"}, + "cancelled": {"en": "Cancelled", "ar": " ملغي"}, + "writeReview": {"en": "Write Review", "ar": " اكتب تقييمك"}, + "shareReview": {"en": "SHARE REVIEW", "ar": " اكتب تقييمك"}, + "backMyAccount": {"en": "BACK TO MY ACCOUNT ", "ar": " الرجوع لحسابي الشخصي"}, + "reviewSuccessful": {"en": "Review Successful", "ar": " تقييم ناجح"}, + "reviewShared": {"en": "Your review has been shared on product review section", "ar": " تمت مشاركة تقييمك في قسم تقييم المنتج"}, + "reviewComment": {"en": "Your reviews help other to choose better product", "ar": " تقييمك سوف يساعد الأخرين في اختيار المنتج الأفضل"}, + "shippingAddress": {"en": "SHIPPING ADDRESS", "ar": " عنوان الشحن"}, + "shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"}, + "orderDetail": {"en": "Order Detail", "ar": " تفاصيل الطلب"}, + "orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"}, + "subtotal": {"en": "Subtotal", "ar": " المجموع"}, + "shipping": {"en": "Shipping", "ar": " الشحن"}, + "vat": {"en": "VAT (15%)", "ar": "(15%) القيمة المضافة"}, + "total": {"en": "TOTAL", "ar": " المجموع الكلي"}, + "sar": {"en": "SAR", "ar": " ر.س "}, + "payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "}, + "cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "}, + "confirmAddress": {"en": "CONFIRM ADDRESS ", "ar": " تأكيد العنوان "}, + "confirmLocation": {"en": "CONFIRM LOCATION ", "ar": " تأكيد الموقع "}, + "confirmDeleteMsg": {"en": "Are you sure! want to delete ", "ar": "هل انت متأكد تريد الحذف "}, + "confirmDelete": {"en": "DELETE", "ar": "حذف"}, + "confirmCancellation": {"en": "Are you sure! want to cancel this order ", "ar": "هل انت متأكد تريد حذف هذا المنتج "}, }; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index d5493d99..348fec58 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -9,8 +9,12 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -474,7 +478,7 @@ class _HomePageState extends State { ), DashboardItem( onTap: () => Navigator.push( - context, FadePage(page: PharmacyAddressesPage())), + context, FadePage(page: OrderPage())), child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -501,10 +505,6 @@ class _HomePageState extends State { ), height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', - onTap: () { - Navigator.push( - context, FadePage(page: WishlistPage())); - }, ), DashboardItem( child: Center( diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart new file mode 100644 index 00000000..bfbca83f --- /dev/null +++ b/lib/pages/pharmacy/order/Order.dart @@ -0,0 +1,781 @@ +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; + +class OrderPage extends StatefulWidget { + + @override + _OrderPageState createState() => _OrderPageState(); +} + +class _OrderPageState extends State with SingleTickerProviderStateMixin{ + TabController _tabController; + AppSharedPreferences sharedPref = AppSharedPreferences(); + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); + + super.initState(); + _tabController = new TabController(length: 4, vsync: this,); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).order, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: TranslationBase.of(context).delivered), + Tab(text: TranslationBase.of(context).processing), + Tab(text: TranslationBase.of(context).pending), + Tab(text: TranslationBase.of(context).cancelled), + ], + controller: _tabController, + ), + Divider( + color: Colors.grey[350], + height: 10, + thickness: 6, + indent: 0, + endIndent: 0, + ), + Expanded( + child: new TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + getDeliveredOrder(), + getProcessingOrder(), + getPendingOrder(), + getCancelledOrder(), + ], + controller: _tabController, + ), + ), + ], + ), + ), + ); + } + + Widget getDeliveredOrder(){ + return Container( + width: MediaQuery.of(context).size.width, + child: SingleChildScrollView( + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: 2 , + itemBuilder: (context, index){ + return Container( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Order#:', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + child: Text('3183', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Date', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + child: Text('Aug 12, 2020', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderDetailsPage())); + }, + child: SvgPicture.asset( + 'assets/images/pharmacy/arrow_right.svg', + height: 20, + width: 20,), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.blue[700], + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.blue[700], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).delivered, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text('564', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('SAR', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + child: Text('12', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('items(s)', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } + ) + ], + ), + ), + ); + } + + Widget getProcessingOrder(){ + return Container( + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Order#:', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + child: Text('3183', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Date', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + child: Text('Aug 12, 2020', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(8), + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderDetailsPage())); + }, + child: SvgPicture.asset( + 'assets/images/pharmacy/arrow_right.svg', + height: 20, + width: 20,), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.green, + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).processing, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text('564', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('SAR', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + child: Text('12', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('items(s)', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + ], + ), + ), + ); + } + + Widget getPendingOrder(){ + return Container( + child: SingleChildScrollView( + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: 2 , + itemBuilder: (context, index){ + return Container( + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Order#:', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + child: Text('3183', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Date', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + child: Text('Aug 12, 2020', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all( 8.0), + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderDetailsPage())); + }, + child: SvgPicture.asset( + 'assets/images/pharmacy/arrow_right.svg', + height: 20, + width: 20,), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(8.0), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange[300], + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.orange[300], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).pending, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.all(8.0), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text('564', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('SAR', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + child: Text('12', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('items(s)', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + ], + ), + ), + + ); + } + ) + ], + ), + ), + ); + } + + Widget getCancelledOrder(){ + return Container( + child: SingleChildScrollView( + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: 2 , + itemBuilder: (context, index){ + return Container( + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all( 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Order#:', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + child: Text('3183', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5), + child: Text('Date', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + child: Text('Aug 12, 2020', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => OrderDetailsPage())); + }, + child: SvgPicture.asset( + 'assets/images/pharmacy/arrow_right.svg', + height: 20, + width: 20,), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 10.0, right: 10.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.red[900], + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.red[900], + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).cancelled, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + child: Column( +// crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text('564', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('SAR', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + child: Text('12', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('items(s)', + style: TextStyle(fontSize: 14.0, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + ], + ), + ), + + ); + } + ) + ], + ), + ), + ); + } +} + + +getOrder() { + print("getOrder no4665"); + OrderService service = new OrderService(); + service.getOrder(AppGlobal.context).then((res) { + print(res); + }); + +} + +// filterOrders() { +// for () { +// if (order.order_status_id === 30 || order.order_status_id === 997 || order.order_status_id === 994) { // complete +// this.delivered.push(order); +// } else if (order.order_status_id === 40 || order.order_status_id === 200 || order.order_status_id === 996) { // cancelled & order refunded +// this.cancelled.push(order); +// } else if (order.order_status_id === 10) { // Pending +// this.pending.push(order); +// } else if (order.order_status_id === 20 || order.order_status_id === 995 || order.order_status_id === 998 || order.order_status_id === 999) { // Processing +// this.processing.push(order); +// } else { // Processing & other all other status +// this.other.push(order); +// } +// } +//} + + + diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart new file mode 100644 index 00000000..777ef1dd --- /dev/null +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -0,0 +1,467 @@ + +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; + + + +class OrderDetailsPage extends StatefulWidget { + + @override + _OrderDetailsPageState createState() => _OrderDetailsPageState(); +} + +class _OrderDetailsPageState extends State { + AppSharedPreferences sharedPref = AppSharedPreferences(); + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) => getOrderDetails()); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).orderDetail, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + color: Colors.white, + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_mark_icon.svg', + width: 28, + height: 28,), + Text(TranslationBase.of(context).shippingAddress, + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 15.0, right: 10.0), + padding: EdgeInsets.only(left: 11.0, right: 11.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.blue, + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.blue, + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).delivered, + style: TextStyle( + color: Colors.white, + fontSize: 13.0, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(left: 10.0, top: 13.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('NAME', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Cloud Solutions', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ], + ), + ), + Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/mobile_number_icon.svg', + height: 13,), + ), + Container( + margin: EdgeInsets.only(top: 5.0, bottom: 5.0), + child: Text('588888778', + style: TextStyle(fontSize: 15.0, + ), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 10.0, 5.0, 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/shipping_truck_icon.svg', + height: 20, + width: 20,), + ), + Container( + margin: EdgeInsets.all(10.0), + child:Text(TranslationBase.of(context).shippedMethod, + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/hmg_shipping_logo.svg', + height: 25, + width: 25,), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 10.0, 1.0, 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/credit_card_icon.svg', + height: 20, + width: 20,), + ), + Container( + margin: EdgeInsets.all(10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/credit_card_icon.svg', + height: 20, + width: 20,), + ), + Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child:Text('Mada', + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Container( + padding: EdgeInsets.only(bottom: 15.0), + margin: EdgeInsets.only(left: 10.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(TranslationBase.of(context).orderDetail, + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Container( + child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, + productReviews:4, totalPrice: '10.00', qyt: '3',), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(left: 10.0, top: 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(TranslationBase.of(context).orderSummary, + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + child: Text( + TranslationBase.of(context).subtotal, + style: TextStyle( + fontSize: 13.0, + ), + ), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), + ), + ), + Text('343.55', + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + child: Text( + TranslationBase.of(context).shipping, + style: TextStyle( + fontSize: 13.0, + ), + ), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), + ), + ), + Text('343.55', + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + child: Text( + TranslationBase.of(context).vat, + style: TextStyle( + fontSize: 13.0, + ), + ), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), + ), + ), + Text('343.55', + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + child: Text( + TranslationBase.of(context).total, + style: TextStyle( + fontSize: 15.0,fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold, + ), + ), + ), + Text('343.55', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ], + ), + InkWell( + onTap: (){ + }, + child: Container( + margin: EdgeInsets.only(top: 20.0), + height: 50.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).payOnline, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + InkWell( + onTap: () { +// confirmDelete(snapshot.data[index]["id"]); + cancelOrder("id"); + }, + child: Container( + height: 50.0, + color: Colors.transparent, + child: Center( + child: Text( + TranslationBase.of(context).cancelOrder, + style: TextStyle( + color: Colors.red[900], + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + cancelOrder(id){ + showDialog( + context: context, + builder: (BuildContext context)=> AlertDialog( + title: Text(TranslationBase.of(context).confirm, + style: TextStyle( + fontWeight: FontWeight.bold, + ),), + content: Text(TranslationBase.of(context).confirmCancellation, + style: TextStyle( + color: Colors.grey, + ),), + actions:[ + FlatButton( + child: Text(TranslationBase.of(context).cancel, + style: TextStyle( + color: Colors.red, + fontWeight: FontWeight.bold, + fontSize: 16, + ),), + onPressed: (){ + Navigator.pop(context); + }, + ), + FlatButton( + child: Text(TranslationBase.of(context).ok, + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 16, + ),), + onPressed: (){ +// http.delete(""https://uat.hmgwebservices.com/epharmacy/api/orders/$id"); + Navigator.push(context, + MaterialPageRoute(builder: (context)=> OrderDetailsPage())); + }, + ), + ], + ) + ); + } +} + + getOrderDetails() { + print("getOrderDetails 5466"); + OrderDetailsService service = new OrderDetailsService(); + service.getOrderDetails(AppGlobal.context).then((res) { + print(res); + }); + } + + + getPayOrder(){ + + } diff --git a/lib/pages/pharmacy/order/ProductReview.dart b/lib/pages/pharmacy/order/ProductReview.dart new file mode 100644 index 00000000..9de67849 --- /dev/null +++ b/lib/pages/pharmacy/order/ProductReview.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; +import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; + +class ProductReviewPage extends StatefulWidget { + + @override + _ProductReviewPageState createState() => _ProductReviewPageState(); +} + +class _ProductReviewPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text(TranslationBase.of(context).writeReview, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, + ), + body: Container( + color: Colors.white, + child: SingleChildScrollView( + child: Column( + children: [ +// Container( +// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, +// productReviews:4, ), +// ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + margin: EdgeInsets.only(left: 10), + child: Image( + image: + AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), + fit: BoxFit.cover, + width: 80, + height: 80, + ), + ), + Container( + margin: EdgeInsets.only(top :15.0, bottom: 15.0), + child: Column( + children: [ + Row( + children: [ + Text('medication name', + style: TextStyle(fontSize: 16.0, + ), + ), + ], + ), + Row( + children: [ + Container( + margin: EdgeInsets.only(left: 5), + child: Text('90.00', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('SAR', + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Row( + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: 3, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + Container( + child: Text('4.9', + style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 5), + child: Text('10 (reviews)', + style: TextStyle(fontSize: 12.0, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Container( + margin: EdgeInsets.only( top: 12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar( + // initialRating: + // this.doctor.actualDoctorRate.toDouble(), + size: 40.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ], + ), + ), + Container( + padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0,20.0), + child: Column( + children: [ + TextFormField ( + decoration: InputDecoration( + contentPadding: const EdgeInsets.symmetric(vertical: 60.0), + border: InputBorder.none, + hintText: 'Tell us more about product!', + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(5.0), + borderSide: BorderSide(width: 1, color: Colors.grey[400]), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(5.0)), + borderSide: BorderSide(color: Colors.grey[400], width: 1), + ), + ), + ), + ], + ), + ), + InkWell( + onTap: () { + + }, + child: Container( + height: 50.0, + width: 400.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.yellow[700], + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.yellow[700], + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).shareReview, + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + //new screen is showing after submitting the review + Widget getReviewedProduct(){ + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/check_icon.svg', + width: 28, + height: 28,), + Container( + margin: EdgeInsets.only(left: 10.0), + child: Text(TranslationBase.of(context).reviewSuccessful, + style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top:5.0, bottom: 20.0 ), + child: Text(TranslationBase.of(context).reviewShared, + style: TextStyle(fontSize: 15.0, + ), + ), + ), + Container( + margin: EdgeInsets.only(bottom: 30.0, top: 30.0 ), + child: SvgPicture.asset( + 'assets/images/pharmacy/success_review_icon.svg', + width: 100, + height: 100,), + ), + Container( + margin: EdgeInsets.only(left: 20.0, right: 20.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/quote_start.svg', + width: 15, + height: 15,), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(TranslationBase.of(context).reviewComment, + style: TextStyle(fontSize: 15.0, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/quote_end.svg', + width: 15, + height: 15,), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 20.0 ), + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return PharmacyProfilePage(); + }), + ); + }, + child: Container( + height: 50.0, color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).backMyAccount, + style: TextStyle( + color: Colors.orange, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart index ac4bfb35..bc19e510 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart @@ -1,8 +1,8 @@ import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/style.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; class AddAddressPage extends StatefulWidget { @override @@ -10,48 +10,118 @@ class AddAddressPage extends StatefulWidget { } class _AddAddressState extends State { + + void onMapCreated(controller){ + setState(() { + mapController= controller; + }); + } + void _getAddressFromLatLng() {} + _onMapTypeButtonPressed(){} + _onAddMarkerButtonPressed(){} + + LatLng _initialPosition; + GoogleMapController mapController; + @override + void initState() { + // TODO: implement initState + _initialPosition = LatLng(24.662617030, 46.7334844); + super.initState(); + } + + void _onMapCreated(GoogleMapController controller) { + mapController = controller; + } + + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: true, - title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, + title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)), + backgroundColor: Colors.green, ), - body: Container( - child: Column( - children: [ - Container( - - ), - Container( - height: 50.0, - width: 400.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(10.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).save, - style: TextStyle( - color: Colors.white, - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), + body: Stack( + children: [ + GoogleMap( + zoomControlsEnabled: true, + myLocationButtonEnabled: true, + myLocationEnabled: true, + onMapCreated: _onMapCreated, + onCameraMove: (object) { +// widget.currentLat = object.target.latitude; +// widget.currentLong = object.target.longitude; + }, + onCameraIdle: _getAddressFromLatLng, + padding: EdgeInsets.only(bottom: 90.0), + initialCameraPosition: CameraPosition( + target: _initialPosition, + zoom: 13.0, + ), + ), + Align( + alignment: Alignment.topRight, + child: Column( + children: [ + button(_onMapTypeButtonPressed,Icons.map), + SizedBox( + height:16.0, ), - ), + button(_onAddMarkerButtonPressed, Icons.add_location) + ], ), - ], + ), + ] ), - ), + bottomSheet: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, + child: Container( + height: 50.0, + color: Colors.green, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(10.0) + ), + child: Center( + child: Text(TranslationBase.of(context).confirmLocation, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), ); - }} \ No newline at end of file + } + + + Widget button(Function function, IconData icon){ + return FloatingActionButton( + onPressed: function, + materialTapTargetSize: MaterialTapTargetSize.padded, + backgroundColor: Colors.red, + child: Icon( + icon, + size: 18.0, + ),); + } + +} + diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 122fd0da..2de45546 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; - +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; class PharmacyAddressesPage extends StatefulWidget{ @override @@ -15,8 +17,14 @@ class _PharmacyAddressesState extends State{ int selectedRadio; bool _value = false; + + AppSharedPreferences sharedPref = AppSharedPreferences(); + + @override void initState(){ + WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); + super.initState(); selectedRadio=0; } @@ -41,11 +49,11 @@ class _PharmacyAddressesState extends State{ scrollDirection: Axis.vertical, shrinkWrap: true, physics: ScrollPhysics(), - itemCount: 2 , + itemCount: 5 , itemBuilder: (context, index){ return Container( child: Padding( - padding:EdgeInsets.only(top:20.0, left:5.0, right:5.0, bottom:5.0,), + padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,), child: Column( children: [ Row( @@ -174,6 +182,10 @@ class _PharmacyAddressesState extends State{ Column( children: [ InkWell( + onTap: () { +// confirmDelete(snapshot.data[index]["id"]); + confirmDelete("address"); + }, child: Row( children: [ Container( @@ -230,6 +242,7 @@ class _PharmacyAddressesState extends State{ ); }, child: Container( + margin: EdgeInsets.only(bottom: 100.0), height: 50.0, color: Colors.transparent, child: Container( @@ -258,8 +271,99 @@ class _PharmacyAddressesState extends State{ ), ), ), + bottomSheet: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, + child: Container( + height: 50.0, + color: Colors.green, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text(TranslationBase.of(context).confirmAddress, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), ); } + confirmDelete(address){ + showDialog( + context: context, + builder: (BuildContext context)=> AlertDialog( + title: Text(TranslationBase.of(context).confirmDeleteMsg, + style: TextStyle( + fontWeight: FontWeight.bold, + ),), + content: Text("address"), + actions:[ + FlatButton( + child: Text(TranslationBase.of(context).cancel, + style: TextStyle( + color: Colors.red, + fontWeight: FontWeight.bold, + fontSize: 16, + ),), + onPressed: (){ + Navigator.pop(context); + }, + ), + FlatButton( + child: Text(TranslationBase.of(context).confirmDelete, + style: TextStyle( + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 16, + ),), + onPressed: (){ +// http.delete("https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses/$id"); + Navigator.push(context, + MaterialPageRoute(builder: (context)=> PharmacyAddressesPage() )); + }, + ), + ], + ) + ); + } +} + +getAllAddress() { + print("ADDRESSES"); + PharmacyAddressService service = new PharmacyAddressService(); + service.getAddress(AppGlobal.context).then((res) { + print(res); + }); + +} + + + + getConfirmAddress(){ + + } + getEditAddress(){ + + } + getDeleteAddress(){ } diff --git a/lib/services/pharmacy_services/orderDetails_service.dart b/lib/services/pharmacy_services/orderDetails_service.dart new file mode 100644 index 00000000..b8201dc6 --- /dev/null +++ b/lib/services/pharmacy_services/orderDetails_service.dart @@ -0,0 +1,39 @@ + +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class OrderDetailsService extends BaseService{ + + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + Future getOrderDetails(BuildContext context ) async { + + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + authUser = data; + } + + dynamic localRes; + String URL; + URL = GET_ORDER_DETAILS; + + await baseAppClient.get(URL, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }); + return Future.value(localRes); + } +} \ No newline at end of file diff --git a/lib/services/pharmacy_services/order_service.dart b/lib/services/pharmacy_services/order_service.dart new file mode 100644 index 00000000..6e44a18b --- /dev/null +++ b/lib/services/pharmacy_services/order_service.dart @@ -0,0 +1,38 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class OrderService extends BaseService{ + + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + Future getOrder(BuildContext context ) async { + + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + authUser = data; + } + + dynamic localRes; + String URL; + URL = GET_ORDER; + + await baseAppClient.get(URL, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }); + return Future.value(localRes); + } +} \ No newline at end of file diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart new file mode 100644 index 00000000..624dd87e --- /dev/null +++ b/lib/services/pharmacy_services/pharmacyAddress_service.dart @@ -0,0 +1,40 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:flutter/material.dart'; + + +class PharmacyAddressService extends BaseService{ + + AppSharedPreferences sharedPref = AppSharedPreferences(); + AppGlobal appGlobal = new AppGlobal(); + + AuthenticatedUser authUser = new AuthenticatedUser(); + AuthProvider authProvider = new AuthProvider(); + + Future getAddress(BuildContext context ) async { + + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + authUser = data; + } + + dynamic localRes; + String URL; + +// URL = GET_ADDRESS+'272843?fields=addresses'; + URL = GET_ADDRESS; + + await baseAppClient.get(URL, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }); + return Future.value(localRes); + } +} \ No newline at end of file diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 26f7d93e..37aa6732 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -709,6 +709,33 @@ class TranslationBase { String get addAddress => localizedValues['addAddress'][locale.languageCode]; String get addNewAddress => localizedValues['addNewAddress'][locale.languageCode]; + String get order => localizedValues['order'][locale.languageCode]; + String get delivered => localizedValues['delivered'][locale.languageCode]; + String get processing => localizedValues['processing'][locale.languageCode]; + String get pending => localizedValues['pending'][locale.languageCode]; + String get cancelled => localizedValues['cancelled'][locale.languageCode]; + String get writeReview => localizedValues['writeReview'][locale.languageCode]; + String get shareReview => localizedValues['shareReview'][locale.languageCode]; + String get backMyAccount => localizedValues['backMyAccount'][locale.languageCode]; + String get reviewSuccessful => localizedValues['reviewSuccessful'][locale.languageCode]; + String get reviewShared => localizedValues['reviewShared'][locale.languageCode]; + String get reviewComment => localizedValues['reviewComment'][locale.languageCode]; + String get shippingAddress => localizedValues['shippingAddress'][locale.languageCode]; + String get shippedMethod => localizedValues['shippedMethod'][locale.languageCode]; + String get orderDetail => localizedValues['orderDetail'][locale.languageCode]; + String get orderSummary => localizedValues['orderSummary'][locale.languageCode]; + String get subtotal => localizedValues['subtotal'][locale.languageCode]; + String get shipping => localizedValues['shipping'][locale.languageCode]; + String get vat => localizedValues['vat'][locale.languageCode]; + String get total => localizedValues['total'][locale.languageCode]; + String get sar => localizedValues['sar'][locale.languageCode]; + String get payOnline => localizedValues['payOnline'][locale.languageCode]; + String get cancelOrder => localizedValues['cancelOrder'][locale.languageCode]; + String get confirmAddress => localizedValues['confirmAddress'][locale.languageCode]; + String get confirmLocation => localizedValues['confirmLocation'][locale.languageCode]; + String get confirmDeleteMsg => localizedValues['confirmDeleteMsg'][locale.languageCode]; + String get confirmDelete => localizedValues['confirmDelete'][locale.languageCode]; + String get confirmCancellation => localizedValues['confirmCancellation'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart index 3fa93363..e0182f08 100644 --- a/lib/widgets/pharmacy/product_tile.dart +++ b/lib/widgets/pharmacy/product_tile.dart @@ -1,7 +1,10 @@ +import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_html/style.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:rating_bar/rating_bar.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -9,13 +12,20 @@ class productTile extends StatelessWidget { final String productName; final String productPrice; final double productRate; + final int productReviews; + final String qyt; + final String totalPrice; + final bool isOrderDetails; - productTile({this.productName, this.productPrice, this.productRate}); + + productTile({this.productName, this.productPrice, this.productRate, + this.qyt, this.totalPrice, this.productReviews, + this.isOrderDetails=true}); @override Widget build(BuildContext context) { return Container( - height: 120, + height: 150, width: double.infinity, color: Colors.white, child: Column( @@ -69,7 +79,7 @@ class productTile extends StatelessWidget { ), ), ), - Container( + this.isOrderDetails == false ? Container( margin: EdgeInsets.all(5), child: Align( alignment: Alignment.topLeft, @@ -84,22 +94,135 @@ class productTile extends StatelessWidget { emptyIcon: Icons.star, ), ), - ), + ): Container(), ], ), ), - Expanded( + this.isOrderDetails == false ? Expanded( flex: 1, - child: Column( + child: Column ( children: [ Icon(FontAwesomeIcons.trashAlt, size: 15), SizedBox(height: 50,), Icon(FontAwesomeIcons.shoppingCart, size: 15), ], ), - ), + ) : Container(), ], ), + this.isOrderDetails == true ?Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( +// margin: EdgeInsets.all(5), + child: RichText( + text: TextSpan( + text: 'QYT: $qyt', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 13), + ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + TranslationBase.of(context).total, + style: TextStyle( + color: Colors.grey, + fontSize: 13.0, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + RichText( + text: TextSpan( + text: ' $totalPrice SAR', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: 15), + ), + ), + ], + ), + ], + ), + ], + ), + ): Container(), + this.isOrderDetails == true ?Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RatingBar.readOnly( + initialRating: productRate, + size: 15.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + ), + Container( + margin: EdgeInsets.all(5), + child: Align( + alignment: Alignment.topLeft, + child: RichText( + text: TextSpan( + text: '($productReviews reviews)', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey, + fontSize: 13), + ), + ), + ), + ), + InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (context) => ProductReviewPage())); + }, + child: Container( + padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), + height: 30.0, + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0) + ), + child: Text( + TranslationBase.of(context).writeReview, + style: TextStyle( + fontSize:12, + color: Colors.orange, + ), + ), + ), + ), + ], + ) : Container(), ], ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 846a264c..0c91972c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -138,6 +138,9 @@ dependencies: #google maps places google_maps_place_picker: ^0.10.0 + #google maps places + google_maps_flutter: ^0.5.28+1 + #Dependencies for video call implementation native_device_orientation: ^0.3.0 enum_to_string: ^1.0.9 From 69ea8b7bd789d7d92914832e9fd50c1d4b4d2673 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Sat, 14 Nov 2020 17:41:02 +0200 Subject: [PATCH 12/69] daynmic products listing --- lib/config/config.dart | 9 +- .../model/pharmacy/final_products_model.dart | 184 ++++ .../model/pharmacy/parent_products_model.dart | 114 +-- .../model/pharmacy/sub_categories_model.dart | 75 ++ .../model/pharmacy/sub_products_model.dart | 562 +++++++++++++ .../service/pharmacy_categorise_service.dart | 81 +- .../pharmacy_categorise_view_model.dart | 54 +- lib/pages/final_products_page.dart | 510 ++++++++++++ lib/pages/offers_categorise_page.dart | 58 +- lib/pages/parent_categorise_page.dart | 783 ++++++++++-------- lib/pages/pharmacy_categorise.dart | 61 +- lib/pages/sub_categorise_page.dart | 688 +++++++++++++++ 12 files changed, 2747 insertions(+), 432 deletions(-) create mode 100644 lib/core/model/pharmacy/final_products_model.dart create mode 100644 lib/core/model/pharmacy/sub_categories_model.dart create mode 100644 lib/core/model/pharmacy/sub_products_model.dart create mode 100644 lib/pages/final_products_page.dart create mode 100644 lib/pages/sub_categorise_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index d3f02c9c..1a6a97af 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -362,9 +362,12 @@ const GET_OFFERS_CATEGORISE = 'epharmacy/api/discountcategories'; const GET_OFFERS_PRODUCTS = 'epharmacy/api/offerproducts/'; const GET_CATEGORISE_PARENT = 'epharmacy/api/categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id='; -const GET_PARENT_PRODUCTS = - 'epharmacy/api/products?categoryid=1&page=1&limit=50'; - +const GET_PARENT_PRODUCTS = 'epharmacy/api/products?categoryid='; +const GET_SUB_CATEGORISE = + 'epharmacy/api/categories?fields=id,name,namen,description,image,localized_names,display_order,parent_category_id,is_leaf&parent_id='; +const GET_SUB_PRODUCTS = 'epharmacy/api/products?categoryid='; +const GET_FINAL_PRODUCTS = + 'epharmacy/api/products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId='; const TIMER_MIN = 10; const GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; diff --git a/lib/core/model/pharmacy/final_products_model.dart b/lib/core/model/pharmacy/final_products_model.dart new file mode 100644 index 00000000..52ab1d2d --- /dev/null +++ b/lib/core/model/pharmacy/final_products_model.dart @@ -0,0 +1,184 @@ +class FinalProductsModel { + String id; + String name; + String namen; + List localizedNames; + String shortDescription; + String fullDescription; + String fullDescriptionn; + dynamic approvedRatingSum; + dynamic approvedTotalReviews; + String sku; + bool isRx; + dynamic rxMessage; + dynamic rxMessagen; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic price; + dynamic oldPrice; + dynamic discountName; + dynamic discountNamen; + dynamic discountPercentage; + dynamic displayOrder; + List discountIds; + List reviews; + List images; + + FinalProductsModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.fullDescription, + this.fullDescriptionn, + this.approvedRatingSum, + this.approvedTotalReviews, + this.sku, + this.isRx, + this.rxMessage, + this.rxMessagen, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.price, + this.oldPrice, + this.discountName, + this.discountNamen, + this.discountPercentage, + this.displayOrder, + this.discountIds, + this.reviews, + this.images}); + + FinalProductsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['approved_rating_sum'] = this.approvedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_percentage'] = this.discountPercentage; + data['display_order'] = this.displayOrder; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/model/pharmacy/parent_products_model.dart b/lib/core/model/pharmacy/parent_products_model.dart index 52530af5..e962c290 100644 --- a/lib/core/model/pharmacy/parent_products_model.dart +++ b/lib/core/model/pharmacy/parent_products_model.dart @@ -1,102 +1,102 @@ class ParentProductsModel { - String id; - bool visibleIndividually; - String name; - String namen; + dynamic id; + dynamic visibleIndividually; + dynamic name; + dynamic namen; List localizedNames; dynamic shortDescription; dynamic shortDescriptionn; - String fullDescription; - String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - String metaKeywords; - String metaDescription; - String metaTitle; - bool allowCustomerReviews; + dynamic fullDescription; + dynamic fullDescriptionn; + dynamic markasNew; + dynamic showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + dynamic allowCustomerReviews; dynamic approvedRatingSum; dynamic notApprovedRatingSum; dynamic approvedTotalReviews; dynamic notApprovedTotalReviews; - String sku; - bool isRx; - bool prescriptionRequired; + dynamic sku; + dynamic isRx; + dynamic prescriptionRequired; dynamic rxMessage; dynamic rxMessagen; dynamic manufacturerPartNumber; dynamic gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; + dynamic isGiftCard; + dynamic requireOtherProducts; + dynamic automaticallyAddRequiredProducts; + dynamic isDownload; + dynamic unlimitedDownloads; dynamic maxNumberOfDownloads; dynamic downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; + dynamic hasSampleDownload; + dynamic hasUserAgreement; + dynamic isRecurring; dynamic recurringCycleLength; dynamic recurringTotalCycles; - bool isRental; + dynamic isRental; dynamic rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; + dynamic isShipEnabled; + dynamic isFreeShipping; + dynamic shipSeparately; dynamic additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; + dynamic isTaxExempt; + dynamic isTelecommunicationsOrBroadcastingOrElectronicServices; + dynamic useMultipleWarehouses; dynamic manageInventoryMethodId; dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; + dynamic stockAvailability; + dynamic stockAvailabilityn; + dynamic displayStockAvailability; + dynamic displayStockQuantity; dynamic minStockQuantity; dynamic notifyAdminForQuantityBelow; - bool allowBackInStockSubscriptions; + dynamic allowBackInStockSubscriptions; dynamic orderMinimumQuantity; dynamic orderMaximumQuantity; dynamic allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; + dynamic allowAddingOnlyExistingAttributeCombinations; + dynamic disableBuyButton; + dynamic disableWishlistButton; + dynamic availableForPreOrder; dynamic preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; - double price; + dynamic callForPrice; + dynamic price; dynamic oldPrice; - double productCost; + dynamic productCost; dynamic specialPrice; dynamic specialPriceStartDateTimeUtc; dynamic specialPriceEndDateTimeUtc; - bool customerEntersPrice; + dynamic customerEntersPrice; dynamic minimumCustomerEnteredPrice; dynamic maximumCustomerEnteredPrice; - bool basepriceEnabled; + dynamic basepriceEnabled; dynamic basepriceAmount; dynamic basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; + dynamic hasTierPrices; + dynamic hasDiscountsApplied; dynamic discountName; dynamic discountNamen; dynamic discountDescription; dynamic discountDescriptionn; dynamic discountPercentage; - String currency; - String currencyn; - double weight; + dynamic currency; + dynamic currencyn; + dynamic weight; dynamic length; dynamic width; dynamic height; dynamic availableStartDateTimeUtc; dynamic availableEndDateTimeUtc; dynamic displayOrder; - bool published; - bool deleted; - String createdOnUtc; - String updatedOnUtc; - String productType; + dynamic published; + dynamic deleted; + dynamic createdOnUtc; + dynamic updatedOnUtc; + dynamic productType; dynamic parentGroupedProductId; List roleIds; List discountIds; @@ -228,6 +228,12 @@ class ParentProductsModel { id = json['id']; visibleIndividually = json['visible_individually']; name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } namen = json['namen']; if (json['localized_names'] != null) { localizedNames = new List(); diff --git a/lib/core/model/pharmacy/sub_categories_model.dart b/lib/core/model/pharmacy/sub_categories_model.dart new file mode 100644 index 00000000..916ec023 --- /dev/null +++ b/lib/core/model/pharmacy/sub_categories_model.dart @@ -0,0 +1,75 @@ +class SubCategoriesModel { + String id; + String name; + String namen; + List localizedNames; + String description; + int parentCategoryId; + int displayOrder; + dynamic image; + bool isLeaf; + + SubCategoriesModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.description, + this.parentCategoryId, + this.displayOrder, + this.image, + this.isLeaf}); + + SubCategoriesModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + description = json['description']; + parentCategoryId = json['parent_category_id']; + displayOrder = json['display_order']; + image = json['image']; + isLeaf = json['is_leaf']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['description'] = this.description; + data['parent_category_id'] = this.parentCategoryId; + data['display_order'] = this.displayOrder; + data['image'] = this.image; + data['is_leaf'] = this.isLeaf; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} diff --git a/lib/core/model/pharmacy/sub_products_model.dart b/lib/core/model/pharmacy/sub_products_model.dart new file mode 100644 index 00000000..6e8964c9 --- /dev/null +++ b/lib/core/model/pharmacy/sub_products_model.dart @@ -0,0 +1,562 @@ +class SubProductsModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + SubProductsModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + SubProductsModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + + manufacturerIds = json['manufacturer_ids'].cast(); + + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart index 162c023e..562a4496 100644 --- a/lib/core/service/pharmacy_categorise_service.dart +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -1,7 +1,10 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; import 'base_service.dart'; @@ -18,6 +21,18 @@ class PharmacyCategoriseService extends BaseService { List _parentProductsList = List(); List get parentProductsList => _parentProductsList; + //service four + List _subCategoriseList = List(); + List get subCategoriseList => _subCategoriseList; + + //service five + List _subProductsList = List(); + List get subProductsList => _subProductsList; + + //service six + List _finalProducts = List(); + List get finalProducts => _finalProducts; + Future getCategorise() async { hasError = false; _categoriseList.clear(); @@ -54,11 +69,14 @@ class PharmacyCategoriseService extends BaseService { ); } - Future getParentProducts() async { + Future getParentProducts({String id}) async { hasError = false; _parentProductsList.clear(); + String endPoint = id != null + ? GET_PARENT_PRODUCTS + "$id" + '&page=1&limit=50' + : GET_PARENT_PRODUCTS + ""; await baseAppClient.get( - GET_PARENT_PRODUCTS, + endPoint, onSuccess: (dynamic response, int statusCode) { response['products'].forEach((item) { _parentProductsList.add(ParentProductsModel.fromJson(item)); @@ -70,4 +88,63 @@ class PharmacyCategoriseService extends BaseService { }, ); } + + Future getSubCategorise({String id}) async { + hasError = false; + _subCategoriseList.clear(); + + String endPoint = + id != null ? GET_SUB_CATEGORISE + "$id" : GET_SUB_CATEGORISE + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['categories'].forEach((item) { + _subCategoriseList.add(SubCategoriesModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getSubProducts({String id}) async { + hasError = false; + _subProductsList.clear(); + String endPoint = id != null + ? GET_SUB_PRODUCTS + "$id" + '&page=1&limit=50' + : GET_SUB_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _subProductsList.add(SubProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getFinalProducts({String id}) async { + hasError = false; + _finalProducts.clear(); + String endPoint = + id != null ? GET_FINAL_PRODUCTS + "$id" : GET_FINAL_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _finalProducts.add(FinalProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } } diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart index 5c39c9cb..16249206 100644 --- a/lib/core/viewModels/pharmacy_categorise_view_model.dart +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -1,7 +1,10 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -21,6 +24,15 @@ class PharmacyCategoriseViewModel extends BaseViewModel { List get parentProducts => _pharmacyCategoriseService.parentProductsList; + List get subCategorise => + _pharmacyCategoriseService.subCategoriseList; + + List get subProducts => + _pharmacyCategoriseService.subProductsList; + + List get finalProducts => + _pharmacyCategoriseService.finalProducts; + Future getCategorise() async { hasError = false; // _insuranceCardService.clearInsuranceCard(); @@ -42,14 +54,50 @@ class PharmacyCategoriseViewModel extends BaseViewModel { error = _pharmacyCategoriseService.error; setState(ViewState.ErrorLocal); } else - await getParentProducts(); + await getParentProducts(i: i); + } + + Future getParentProducts({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getParentProducts(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getSubCategorise({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getSubCategorise(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + getSubProducts(i: i); + } + + Future getSubProducts({String i}) async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getSubProducts(id: i); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); } - Future getParentProducts() async { + Future getFinalProducts({String i}) async { hasError = false; // _insuranceCardService.clearInsuranceCard(); setState(ViewState.Busy); - await _pharmacyCategoriseService.getParentProducts(); + await _pharmacyCategoriseService.getFinalProducts(id: i); if (_pharmacyCategoriseService.hasError) { error = _pharmacyCategoriseService.error; setState(ViewState.ErrorLocal); diff --git a/lib/pages/final_products_page.dart b/lib/pages/final_products_page.dart new file mode 100644 index 00000000..66b5ee0d --- /dev/null +++ b/lib/pages/final_products_page.dart @@ -0,0 +1,510 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class FinalProductsPage extends StatelessWidget { + String id; + FinalProductsPage({this.id}); + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getFinalProducts(i: id), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Products', + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: Container( + height: MediaQuery.of(context).size.height * 1.87, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ +//Expanded widget heree if nassery + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Texts( + 'Products', + fontWeight: FontWeight.w600, + ), + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }, + ), + ), + ], + ), + ], + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Expanded( + child: Container( + height: MediaQuery.of(context).size.height * 1.90, + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.finalProducts.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.finalProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.finalProducts[index] + .images.isNotEmpty + ? model + .finalProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .finalProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 2.8 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.finalProducts[index] + .rxMessage != + null + ? model + .finalProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w600, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model + .finalProducts[ + index] + .discountName != + null) + Container( + width: double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .finalProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 10.4, + ), + ), + ), + Texts( + model.finalProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.finalProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .finalProducts[ + index] + .approvedRatingSum > + 0 + ? (model.finalProducts[index].approvedRatingSum + .toDouble() / + model + .finalProducts[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.finalProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.finalProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model.finalProducts[index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), + ), + ), + ), + transform: + new Matrix4.rotationZ( + 6.15099), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.finalProducts[index] + .images[index].thumb, + fit: BoxFit.cover, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model + .finalProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.finalProducts[index] + .rxMessage != + null + ? model + .finalProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.finalProducts[index] + .discountName != + null) + Container( + width: 250.0, + height: 18.5, + decoration: BoxDecoration( + color: Color(0xff5AB145), + ), + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 5.5, + ), + child: Texts( + model + .finalProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 11.4, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + model.finalProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.finalProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .finalProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .finalProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .finalProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.finalProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), + ), + )); + } +} diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart index 34c3bff2..f81f0588 100644 --- a/lib/pages/offers_categorise_page.dart +++ b/lib/pages/offers_categorise_page.dart @@ -44,11 +44,14 @@ class _OffersCategorisePageState extends State { Padding( padding: EdgeInsets.all(10.0), child: Container( - child: Texts('Categories'), + child: Texts( + 'Categories', + fontWeight: FontWeight.w800, + ), ), ), Divider( - thickness: 2.0, + thickness: 1.0, color: Colors.grey.shade400, ), //Expanded widget heree if nassery @@ -89,7 +92,9 @@ class _OffersCategorisePageState extends State { 0.09, child: Center( child: Texts( - model.categorise[index].name), + model.categorise[index].name, + fontWeight: FontWeight.w600, + ), ), ), ], @@ -116,7 +121,10 @@ class _OffersCategorisePageState extends State { children: [ Padding( padding: EdgeInsets.all(8.0), - child: Texts(categoriseName), + child: Texts( + categoriseName, + fontWeight: FontWeight.w800, + ), ), Row( children: [ @@ -124,7 +132,7 @@ class _OffersCategorisePageState extends State { height: 44.0, child: VerticalDivider( color: Colors.black45, - thickness: 1.0, + thickness: 0.7, //width: 0.3, // indent: 0.0, ), @@ -174,7 +182,7 @@ class _OffersCategorisePageState extends State { crossAxisCount: 2, crossAxisSpacing: 0.5, mainAxisSpacing: 2.0, - childAspectRatio: 1.2, + childAspectRatio: 0.85, ), itemCount: model.products.length, itemBuilder: (BuildContext context, int index) { @@ -210,6 +218,7 @@ class _OffersCategorisePageState extends State { vertical: 4, ), child: Container( + height: 250.0, decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(110.0), @@ -321,7 +330,7 @@ class _OffersCategorisePageState extends State { null) Container( width: double.infinity, - height: 13.0, + height: 22.0, decoration: BoxDecoration( color: @@ -334,22 +343,19 @@ class _OffersCategorisePageState extends State { .discountName, regular: true, color: Colors.white, - fontSize: 10.4, + fontSize: 12.0, + fontWeight: + FontWeight.w700, ), ), ), Texts( - projectProvider.isArabic - ? model - .products[index] - .name - : model - .products[index] - .namen, + model + .products[index].name, regular: true, - fontSize: 12, + fontSize: 12.58, fontWeight: - FontWeight.w400, + FontWeight.w600, ), Padding( padding: @@ -521,7 +527,7 @@ class _OffersCategorisePageState extends State { null) Container( width: 250.0, - height: 18.5, + height: 22.5, decoration: BoxDecoration( color: Color(0xff5AB145), ), @@ -535,7 +541,9 @@ class _OffersCategorisePageState extends State { .discountName, regular: true, color: Colors.white, - fontSize: 11.4, + fontSize: 12.0, + fontWeight: + FontWeight.w700, ), ), ), @@ -543,14 +551,10 @@ class _OffersCategorisePageState extends State { height: 4.0, ), Texts( - projectProvider.isArabic - ? model - .products[index].name - : model.products[index] - .namen, + model.products[index].name, regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, + fontSize: 14.0, + fontWeight: FontWeight.w600, ), SizedBox( height: 8.0, @@ -591,7 +595,7 @@ class _OffersCategorisePageState extends State { regular: true, fontSize: 10, fontWeight: - FontWeight.w400, + FontWeight.w500, ) ], ), diff --git a/lib/pages/parent_categorise_page.dart b/lib/pages/parent_categorise_page.dart index 007a3037..ccb33bb2 100644 --- a/lib/pages/parent_categorise_page.dart +++ b/lib/pages/parent_categorise_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/sub_categorise_page.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; @@ -7,8 +8,10 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:giffy_dialog/giffy_dialog.dart'; import 'base/base_view.dart'; +import 'final_products_page.dart'; class ParentCategorisePage extends StatelessWidget { final String id; @@ -16,6 +19,8 @@ class ParentCategorisePage extends StatelessWidget { ParentCategorisePage({this.id, this.titleName}); + String categoriesID; + String categoriseName = "Personal Care"; bool styleOne = true; bool styleTwo = false; @@ -38,139 +43,253 @@ class ParentCategorisePage extends StatelessWidget { backgroundColor: Colors.white, isShowDecPage: false, baseViewModel: model, - body: Container( -//height: MediaQuery.of(context).size.height * 0.57, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: Container( - child: Texts(model.categoriseParent.length >= 8 - ? 'View All Categories' - : ''), + body: SingleChildScrollView( + child: Container( + height: MediaQuery.of(context).size.height * 5.90, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Image.network( + id == '1' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' + : id == '2' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' + : id == '3' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' + : id == '4' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' + : id == '5' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' + : id == '6' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' + : id == '7' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' + : id == '8' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' + : id == '9' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' + : id == '10' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' + : '', + fit: BoxFit.fill, + height: 160.0, + width: double.infinity), ), - ), - Divider( - thickness: 2.0, - color: Colors.grey.shade400, - ), -//Expanded widget heree if nassery - Container( - height: MediaQuery.of(context).size.height * 0.20, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.categoriseParent.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - InkWell( - child: Column( - children: [ - Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Icon( - Icons.apps_sharp, - size: 32.0, - ), - ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.2, - height: MediaQuery.of(context) - .size - .height * - 0.09, - child: Center( - child: Texts(model - .categoriseParent[index].name), + if (model.categoriseParent.length >= 8) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: InkWell( + child: Container( + child: Texts( + 'View All Categories', + fontWeight: FontWeight.w300, + ), + ), + onTap: () { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return Container( + height: + MediaQuery.of(context).size.height * + 0.9, + color: Colors.white, + child: Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + const Text('Modal BottomSheet'), + ElevatedButton( + child: const Text( + 'Close BottomSheet'), + onPressed: () => + Navigator.pop(context), + ) + ], ), ), - ], - ), - ), - ], + ); + }, + ); + }, ), - ); - }), - ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + ], + ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Texts(categoriseName), +//Expanded widget heree if nassery + Padding( + padding: EdgeInsets.only(top: 35.0), + child: Container( + height: MediaQuery.of(context).size.height * 0.2, + child: Center( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.categoriseParent.length > 8 + ? 8 + : model.categoriseParent.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: + EdgeInsets.symmetric(horizontal: 8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 13.0), + child: Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Center( + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.17, + height: MediaQuery.of(context) + .size + .height * + 0.10, + child: Center( + child: Texts( + model.categoriseParent[index] + .name, + fontSize: 14, + fontWeight: FontWeight.w600, + maxLines: 2, + ), + ), + ), + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + SubCategorisePage( + title: model + .categoriseParent[index] + .name, + id: model + .categoriseParent[index] + .id, + parentId: id, + )), + ); + print(id); + }, + ), + ); + }), + ), ), - Row( + ), + + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 1.0, - //width: 0.3, - // indent: 0.0, - ), + Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: FontWeight.w600, + ), + ], ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }, - ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }, + ), + ), + ], ), ], ), - ], - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Expanded( - child: Container( - height: MediaQuery.of(context).size.height * 0.50, + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Container( + height: MediaQuery.of(context).size.height * 4.89, child: GridView.builder( + physics: NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 0.5, mainAxisSpacing: 2.0, - childAspectRatio: 1.2, + childAspectRatio: 0.9, ), itemCount: model.parentProducts.length, itemBuilder: (BuildContext context, int index) { @@ -260,9 +379,16 @@ class ParentCategorisePage extends StatelessWidget { alignment: Alignment.center, child: Image.network( model - .parentProducts[index] - .images[index] - .thumb, + .parentProducts[ + index] + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', fit: BoxFit.cover, height: 80, ), @@ -341,19 +467,13 @@ class ParentCategorisePage extends StatelessWidget { ), ), Texts( - projectProvider.isArabic - ? model - .parentProducts[ - index] - .name - : model - .parentProducts[ - index] - .namen, + model + .parentProducts[index] + .name, regular: true, fontSize: 12, fontWeight: - FontWeight.w400, + FontWeight.w700, ), Padding( padding: @@ -401,228 +521,233 @@ class ParentCategorisePage extends StatelessWidget { )); }, ), - ), - ) - : Expanded( - child: Container( - child: ListView.builder( - itemCount: model.parentProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - // color: - // model.products[index].discountName != - // null - // ? Color(0xffFFFF00) - // : Colors.white, - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - if (model - .parentProducts[index] - .discountName != - null) - Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - child: Container( - color: Colors.yellow, - height: 25.0, - width: 70.0, - child: Center( - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight - .w900, + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.parentProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model + .parentProducts[ + index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: + Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: + Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), ), ), ), + transform: new Matrix4 + .rotationZ(6.15099), ), - transform: - new Matrix4.rotationZ( - 6.15099), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model - .parentProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model + Container( + margin: + EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: + Alignment.center, + child: Image.network( + model .parentProducts[ index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), ), - child: Texts( - model + ], + ), + Column( + children: [ + Container( + width: model .parentProducts[ index] .rxMessage != null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model.parentProducts[index] - .discountName != - null) - Container( - width: 250.0, - height: 18.5, - decoration: BoxDecoration( - color: Color(0xff5AB145), - ), - child: Padding( + ? MediaQuery.of( + context) + .size + .width / + 5 + : 0, padding: - EdgeInsets.symmetric( - horizontal: 5.5, + EdgeInsets.all(4), + decoration: BoxDecoration( + color: + Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular( + 6)), ), child: Texts( model - .parentProducts[ - index] - .discountName, - regular: true, + .parentProducts[ + index] + .rxMessage != + null + ? model + .parentProducts[ + index] + .rxMessage + : "", color: Colors.white, - fontSize: 11.4, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, ), ), - ), - SizedBox( - height: 4.0, - ), - Texts( - projectProvider.isArabic - ? model - .parentProducts[index] - .name - : model - .parentProducts[index] - .namen, - regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.parentProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .parentProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .parentProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .parentProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.parentProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) ], ), ], ), - ), - ], - ), - ); - }), - ), - ) - ], + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model + .parentProducts[index] + .discountName != + null) + Container( + width: 250.0, + height: 18.5, + decoration: BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: 5.5, + ), + child: Texts( + model + .parentProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 11.4, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + model.parentProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.parentProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .parentProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .parentProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .parentProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.parentProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), ), ), )); diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart index 589a74d6..640251ec 100644 --- a/lib/pages/pharmacy_categorise.dart +++ b/lib/pages/pharmacy_categorise.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'base/base_view.dart'; +import 'final_products_page.dart'; class PharmacyCategorisePage extends StatefulWidget { @override @@ -13,6 +14,8 @@ class PharmacyCategorisePage extends StatefulWidget { } class _PharmacyCategorisePageState extends State { + String idCategorise; + @override Widget build(BuildContext context) { return BaseView( @@ -44,18 +47,27 @@ class _PharmacyCategorisePageState extends State { borderRadius: BorderRadius.circular(5), color: Colors.grey.withOpacity(0.24), ), - child: Center( - child: Texts(model.categorise[index].name), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + model.categorise[index].name, + fontWeight: FontWeight.w600, + ), ), ), onTap: () => { Navigator.push( context, MaterialPageRoute( - builder: (context) => ParentCategorisePage( - id: model.categorise[index].id, - titleName: model.categorise[index].name, - ), + builder: (context) => + model.categorise[index].id != '12' + ? ParentCategorisePage( + id: model.categorise[index].id, + titleName: model.categorise[index].name, + ) + : FinalProductsPage( + id: model.categorise[index].id, + ), ), ), }, @@ -70,7 +82,7 @@ class _PharmacyCategorisePageState extends State { children: [ Divider( height: 2.0, - thickness: 2.0, + thickness: 1.0, color: Colors.black12.withOpacity(0.14)), SizedBox( height: 15.0, @@ -87,10 +99,13 @@ class _PharmacyCategorisePageState extends State { borderRadius: BorderRadius.circular(5.0), color: Colors.green.shade300.withOpacity(0.34), ), - child: Center( - child: Texts( - 'best sellers', - )), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + 'best sellers', + fontWeight: FontWeight.w600, + ), + ), ), ), ), @@ -105,7 +120,13 @@ class _PharmacyCategorisePageState extends State { .withOpacity(0.34), borderRadius: BorderRadius.circular(5.0), ), - child: Center(child: Texts('Most Viewed')), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + 'Most Viewed', + fontWeight: FontWeight.w600, + ), + ), ), ), ), @@ -123,7 +144,13 @@ class _PharmacyCategorisePageState extends State { color: Colors.blue.shade200.withOpacity(0.34), borderRadius: BorderRadius.circular(5.0), ), - child: Center(child: Texts('New Proudcts')), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + 'New Proudcts', + fontWeight: FontWeight.w600, + ), + ), ), ), ), @@ -137,7 +164,13 @@ class _PharmacyCategorisePageState extends State { color: Colors.purple.shade200.withOpacity(0.34), borderRadius: BorderRadius.circular(5.0), ), - child: Center(child: Texts('Recently Viewed')), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + 'Recently Viewed', + fontWeight: FontWeight.w600, + ), + ), ), ), ), diff --git a/lib/pages/sub_categorise_page.dart b/lib/pages/sub_categorise_page.dart new file mode 100644 index 00000000..039d40e2 --- /dev/null +++ b/lib/pages/sub_categorise_page.dart @@ -0,0 +1,688 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'base/base_view.dart'; +import 'final_products_page.dart'; + +class SubCategorisePage extends StatelessWidget { + String parentId; + String id; + String title; + SubCategorisePage({this.id, this.title, this.parentId}); + + String categoriseName = "Personal Care"; + bool styleOne = true; + bool styleTwo = false; + Icon styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getSubCategorise(i: id), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: title, + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + height: MediaQuery.of(context).size.height * 2.97, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Image.network( + parentId == '1' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' + : parentId == '2' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' + : parentId == '3' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' + : parentId == '4' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' + : parentId == '5' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' + : parentId == '6' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' + : parentId == '7' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' + : parentId == '8' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' + : parentId == '9' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' + : parentId == + '10' + ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' + : '', + fit: BoxFit.fill, + height: 160.0, + width: double.infinity), + ), + if (model.subCategorise.length >= 8) + Column( + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts(model.categoriseParent.length >= 8 + ? 'View All Categories' + : ''), + ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + ], + ), + +//Expanded widget heree if nassery + Padding( + padding: EdgeInsets.only(top: 35.0), + child: Container( + height: MediaQuery.of(context).size.height * 0.2, + child: Center( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: model.subCategorise.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: + EdgeInsets.symmetric(horizontal: 8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 13.0), + child: Container( + height: 60.0, + width: 65.0, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.orange.shade200 + .withOpacity(0.45), + ), + child: Center( + child: Icon( + Icons.apps_sharp, + size: 32.0, + ), + ), + ), + ), + Container( + width: MediaQuery.of(context) + .size + .width * + 0.17, + height: MediaQuery.of(context) + .size + .height * + 0.10, + child: Center( + child: Texts( + model.subCategorise[index].name, + fontSize: 14, + fontWeight: FontWeight.w600, + maxLines: 2, + ), + ), + ), + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + FinalProductsPage( + id: model.subCategorise[index].id, + ), + ), + ); + }, + ), + ); + }), + ), + ), + ), + + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(Icons.wrap_text), + SizedBox( + width: 10.0, + ), + Texts('Refine'), + ], + ), + Row( + children: [ + Container( + height: 44.0, + child: VerticalDivider( + color: Colors.black45, + thickness: 1.0, + //width: 0.3, + // indent: 0.0, + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: styleIcon, + onTap: () { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }, + ), + ), + ], + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.grey.shade400, + ), + styleOne == true + ? Container( + height: MediaQuery.of(context).size.height * 1.85, + child: GridView.builder( + physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.subProducts.length, + itemBuilder: (BuildContext context, int index) { + return NetworkBaseView( + baseViewModel: model, + child: Card( + color: model.subProducts[index] + .discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 0), + width: MediaQuery.of(context) + .size + .width / + 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + if (model.subProducts[index] + .discountName != + null) + RotatedBox( + quarterTurns: 4, + child: Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + right: 5.0, + top: 20.0, + bottom: 5.0, + ), + child: Texts( + 'offer' + .toUpperCase(), + color: Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight.w900, + ), + ), + transform: new Matrix4 + .rotationZ( + 5.837200), + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.subProducts[index] + .images.isNotEmpty + ? model + .subProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model + .subProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.subProducts[index] + .rxMessage != + null + ? model + .subProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.subProducts[index] + .discountName != + null) + Container( + width: double.infinity, + height: 13.0, + decoration: + BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Center( + child: Texts( + model + .subProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 10.4, + ), + ), + ), + Texts( + model.subProducts[index] + .name, + regular: true, + fontSize: 12, + fontWeight: + FontWeight.w400, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, + bottom: 4), + child: Texts( + "SAR ${model.subProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .subProducts[ + index] + .approvedRatingSum > + 0 + ? (model.subProducts[index].approvedRatingSum + .toDouble() / + model + .subProducts[index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.subProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + )); + }, + ), + ) + : Expanded( + child: Container( + child: ListView.builder( + itemCount: model.subProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + // color: + // model.products[index].discountName != + // null + // ? Color(0xffFFFF00) + // : Colors.white, + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + if (model.subProducts[index] + .discountName != + null) + Container( + decoration: + BoxDecoration(), + child: Padding( + padding: + EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, + ), + child: Container( + color: + Colors.yellow, + height: 25.0, + width: 70.0, + child: Center( + child: Texts( + 'offer' + .toUpperCase(), + color: + Colors.red, + fontSize: 13.0, + fontWeight: + FontWeight + .w900, + ), + ), + ), + ), + transform: new Matrix4 + .rotationZ(6.15099), + ), + Container( + margin: + EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: + Alignment.center, + child: Image.network( + model + .subProducts[index] + .images[index] + .thumb, + fit: BoxFit.cover, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model + .subProducts[ + index] + .rxMessage != + null + ? MediaQuery.of( + context) + .size + .width / + 5 + : 0, + padding: + EdgeInsets.all(4), + decoration: BoxDecoration( + color: + Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular( + 6)), + ), + child: Texts( + model.subProducts[index] + .rxMessage != + null + ? model + .subProducts[ + index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ), + ), + ], + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (model.subProducts[index] + .discountName != + null) + Container( + width: 250.0, + height: 18.5, + decoration: BoxDecoration( + color: + Color(0xff5AB145), + ), + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: 5.5, + ), + child: Texts( + model + .subProducts[ + index] + .discountName, + regular: true, + color: Colors.white, + fontSize: 11.4, + ), + ), + ), + SizedBox( + height: 4.0, + ), + Texts( + projectProvider.isArabic + ? model + .subProducts[index] + .name + : model + .subProducts[index] + .namen, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.subProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .subProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .subProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .subProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.subProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), + ), + ) + ], + ), + ), + ), + )); + } +} From 85062859c8f6f4ceceb9add6e8c1203c62745d4f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 25 Nov 2020 16:17:23 +0300 Subject: [PATCH 13/69] updates --- lib/pages/ToDoList/payment_method_select.dart | 78 +++++++++---------- lib/widgets/in_app_browser/InAppBrowser.dart | 16 ++-- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/pages/ToDoList/payment_method_select.dart b/lib/pages/ToDoList/payment_method_select.dart index a189128a..fe2a217b 100644 --- a/lib/pages/ToDoList/payment_method_select.dart +++ b/lib/pages/ToDoList/payment_method_select.dart @@ -163,45 +163,45 @@ class _PaymentMethodState extends State { ], ), ), - Container( - margin: EdgeInsets.only(top: 25.0), - child: Flex( - direction: Axis.horizontal, - children: [ - Expanded( - child: Container( - child: InkWell( - onTap: () { - updateSelectedPaymentMethod("ApplePay"); - }, - child: Card( - elevation: 3.0, - margin: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 8.0), - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - side: selectedPaymentMethod == "ApplePay" - ? BorderSide( - color: Colors.green, width: 5.0) - : BorderSide( - color: Colors.transparent, width: 0.0), - ), - child: Container( - height: 120.0, - padding: EdgeInsets.all(20.0), - child: SvgPicture.asset( - "assets/images/new-design/applepay.svg"), - ), - ), - ), - ), - ), - Expanded( - child: Container(), - ), - ], - ), - ), + // Container( + // margin: EdgeInsets.only(top: 25.0), + // child: Flex( + // direction: Axis.horizontal, + // children: [ + // Expanded( + // child: Container( + // child: InkWell( + // onTap: () { + // updateSelectedPaymentMethod("ApplePay"); + // }, + // child: Card( + // elevation: 3.0, + // margin: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 8.0), + // color: Colors.white, + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(10), + // side: selectedPaymentMethod == "ApplePay" + // ? BorderSide( + // color: Colors.green, width: 5.0) + // : BorderSide( + // color: Colors.transparent, width: 0.0), + // ), + // child: Container( + // height: 120.0, + // padding: EdgeInsets.all(20.0), + // child: SvgPicture.asset( + // "assets/images/new-design/applepay.svg"), + // ), + // ), + // ), + // ), + // ), + // Expanded( + // child: Container(), + // ), + // ], + // ), + // ), SizedBox( height: 150.0, ), diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index e465db39..c46b5616 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -10,17 +10,17 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class MyInAppBrowser extends InAppBrowser { - static String SERVICE_URL = - 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + // static String SERVICE_URL = + // 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT -// static String SERVICE_URL = -// 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + static String SERVICE_URL = + 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE - static String PREAUTH_SERVICE_URL = - 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT + // static String PREAUTH_SERVICE_URL = + // 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT -// static String PREAUTH_SERVICE_URL = -// 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store + static String PREAUTH_SERVICE_URL = + 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store static List successURLS = [ 'success', From d328c74fc4c862068621870f5feddf362b4eae83 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Thu, 26 Nov 2020 09:58:18 +0300 Subject: [PATCH 14/69] fix order and orderdetails --- assets/images/pharmacy/empty_box.svg | 18 + lib/config/config.dart | 12 +- lib/config/localized_values.dart | 4 + .../pharmacies/PharmacyAddressesModel.dart | 170 ++ lib/core/model/pharmacies/order_model.dart | 1486 +++++++++++++++++ lib/core/service/client/base_app_client.dart | 32 + .../PharmacyAddressesViewModel.dart | 24 + .../order_model_view_model.dart | 39 + lib/locator.dart | 11 + lib/pages/base/base_view.dart | 4 +- lib/pages/landing/home_page.dart | 2 +- lib/pages/pharmacy/order/Order.dart | 414 +++-- lib/pages/pharmacy/order/OrderDetails.dart | 650 +++---- .../pharmacyAddresses/AddAddress.dart | 44 +- .../pharmacyAddresses/PharmacyAddresses.dart | 491 +++--- .../orderDetails_service.dart | 30 +- .../pharmacy_services/order_service.dart | 61 +- .../pharmacyAddress_service.dart | 36 +- lib/uitl/translations_delegate_base.dart | 4 + 19 files changed, 2724 insertions(+), 808 deletions(-) create mode 100644 assets/images/pharmacy/empty_box.svg create mode 100644 lib/core/model/pharmacies/PharmacyAddressesModel.dart create mode 100644 lib/core/model/pharmacies/order_model.dart create mode 100644 lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart create mode 100644 lib/core/viewModels/pharmacyModule/order_model_view_model.dart diff --git a/assets/images/pharmacy/empty_box.svg b/assets/images/pharmacy/empty_box.svg new file mode 100644 index 00000000..05816608 --- /dev/null +++ b/assets/images/pharmacy/empty_box.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/lib/config/config.dart b/lib/config/config.dart index 9e64d9cb..e7341682 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -340,14 +340,6 @@ const GET_E_REFERRALS = "Services/Patients.svc/REST/GetEReferrals"; //Pharmacy wishlist // const GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; -//Pharmacy address -const GET_ADDRESS = - "https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses"; -//order + order details 'orders?customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=' + page_id + '&limit=200&customer_id='+ custmerId, -const GET_ORDER = - "https://uat.hmgwebservices.com/epharmacy/api/orders?customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; -const GET_ORDER_DETAILS = - "https://uat.hmgwebservices.com/epharmacy/api/orders/3584"; // pharmacy const GET_PHARMACY_BANNER = "epharmacy/api/promotionbanners"; const GET_PHARMACY_TOP_MANUFACTURER = "epharmacy/api/topmanufacturer"; @@ -355,7 +347,9 @@ const GET_PHARMACY_BEST_SELLER_PRODUCT = "epharmacy/api/bestsellerproducts"; const GET_PHARMACY_PRODUCTs_BY_IDS = "epharmacy/api/productsbyids/"; const GET_CUSTOMERS_ADDRESSES = "epharmacy/api/Customers/"; const GET_WISHLIST = "epharmacy/api/shopping_cart_items/"; - +const GET_ORDER = "orders?"; +const GET_ORDER_DETAILS ="epharmacy/api/orders/"; +const GET_ADDRESS ="epharmacy/api/Customers/272843?fields=addresses"; // Home Health Care const HHC_GET_ALL_SERVICES = "Services/Patients.svc/REST/PatientER_HHC_GetAllServices"; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 437bab38..c2a81962 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -677,6 +677,10 @@ const Map> localizedValues = { "en": "Are you sure! want to cancel this order ", "ar": "هل انت متأكد تريد حذف هذا المنتج " }, + "orderNumber": {"en": "Order#: ", "ar": "الطلب: "}, + "orderDate": {"en": "Date", "ar": "التاريخ:"}, + "itemsNo": {"en": "items(s)", "ar": "عناصر"}, + "noOrder": {"en": "You Don't have any orders.", "ar": "ليس لديك طلبات"}, "TermsService": {"en": "Terms of Service", "ar": "شروط الخدمه"}, "Beforeusing": { diff --git a/lib/core/model/pharmacies/PharmacyAddressesModel.dart b/lib/core/model/pharmacies/PharmacyAddressesModel.dart new file mode 100644 index 00000000..db9c20ae --- /dev/null +++ b/lib/core/model/pharmacies/PharmacyAddressesModel.dart @@ -0,0 +1,170 @@ + +import 'dart:convert'; + +PharmacyAddressesModel pharmacyAddressesModelFromJson(String str) => PharmacyAddressesModel.fromJson(json.decode(str)); + +String pharmacyAddressesModelToJson(PharmacyAddressesModel data) => json.encode(data.toJson()); + +class PharmacyAddressesModel { + PharmacyAddressesModel({ + this.customers, + }); + + List customers; + + factory PharmacyAddressesModel.fromJson(Map json) => PharmacyAddressesModel( + customers: List.from(json["customers"].map((x) => Customer.fromJson(x))), + ); + + Map toJson() => { + "customers": List.from(customers.map((x) => x.toJson())), + }; +} + +class Customer { + Customer({ + this.addresses, + }); + + List
addresses; + + factory Customer.fromJson(Map json) => Customer( + addresses: List
.from(json["addresses"].map((x) => Address.fromJson(x))), + ); + + Map toJson() => { + "addresses": List.from(addresses.map((x) => x.toJson())), + }; +} + +class Address { + Address({ + this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong, + }); + + String id; + FirstName firstName; + LastName lastName; + Email email; + dynamic company; + int countryId; + Country country; + dynamic stateProvinceId; + City city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + dynamic faxNumber; + String customerAttributes; + DateTime createdOnUtc; + dynamic province; + String latLong; + + factory Address.fromJson(Map json) => Address( + id: json["id"], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + email: emailValues.map[json["email"]], + company: json["company"], + countryId: json["country_id"], + country: countryValues.map[json["country"]], + stateProvinceId: json["state_province_id"], + city: cityValues.map[json["city"]], + address1: json["address1"], + address2: json["address2"], + zipPostalCode: json["zip_postal_code"], + phoneNumber: json["phone_number"], + faxNumber: json["fax_number"], + customerAttributes: json["customer_attributes"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + province: json["province"], + latLong: json["lat_long"], + ); + + Map toJson() => { + "id": id, + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "email": emailValues.reverse[email], + "company": company, + "country_id": countryId, + "country": countryValues.reverse[country], + "state_province_id": stateProvinceId, + "city": cityValues.reverse[city], + "address1": address1, + "address2": address2, + "zip_postal_code": zipPostalCode, + "phone_number": phoneNumber, + "fax_number": faxNumber, + "customer_attributes": customerAttributes, + "created_on_utc": createdOnUtc.toIso8601String(), + "province": province, + "lat_long": latLong, + }; +} + +enum City { RIYADH, AL_OYUN } + +final cityValues = EnumValues({ + "Al Oyun": City.AL_OYUN, + "Riyadh": City.RIYADH +}); + +enum Country { SAUDI_ARABIA } + +final countryValues = EnumValues({ + "Saudi Arabia": Country.SAUDI_ARABIA +}); + +enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM } + +final emailValues = EnumValues({ + "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM, + "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM +}); + +enum FirstName { TAMER, TAMER_FANASHEH } + +final firstNameValues = EnumValues({ + "TAMER": FirstName.TAMER, + "TAMER FANASHEH": FirstName.TAMER_FANASHEH +}); + +enum LastName { FANASHEH, MUSA } + +final lastNameValues = EnumValues({ + "FANASHEH": LastName.FANASHEH, + "MUSA": LastName.MUSA +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} diff --git a/lib/core/model/pharmacies/order_model.dart b/lib/core/model/pharmacies/order_model.dart new file mode 100644 index 00000000..a82b8716 --- /dev/null +++ b/lib/core/model/pharmacies/order_model.dart @@ -0,0 +1,1486 @@ + +import 'dart:convert'; + +List orderModelFromJson(String str) => List.from(json.decode(str).map((x) => OrderModel.fromJson(x))); + +String orderModelToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); + +class OrderModel { + OrderModel({ + this.id, + this.storeId, + this.orderGuid, + this.pickUpInStore, + this.paymentMethodSystemName, + this.paymentName, + this.paymentNamen, + this.customerCurrencyCode, + this.currencyRate, + this.customerTaxDisplayTypeId, + this.vatNumber, + this.orderSubtotalInclTax, + this.orderSubtotalExclTax, + this.orderSubTotalDiscountInclTax, + this.orderSubTotalDiscountExclTax, + this.orderShippingInclTax, + this.orderShippingExclTax, + this.paymentMethodAdditionalFeeInclTax, + this.paymentMethodAdditionalFeeExclTax, + this.taxRates, + this.orderTax, + this.orderDiscount, + this.orderTotal, + this.refundedAmount, + this.rewardPointsWereAdded, + this.rxAttachments, + this.checkoutAttributeDescription, + this.customerLanguageId, + this.affiliateId, + this.customerIp, + this.authorizationTransactionId, + this.authorizationTransactionCode, + this.authorizationTransactionResult, + this.captureTransactionId, + this.captureTransactionResult, + this.subscriptionTransactionId, + this.paidDateUtc, + this.shippingMethod, + this.shippingRateComputationMethodSystemName, + this.customValuesXml, + this.deleted, + this.createdOnUtc, + this.customer, + this.customerId, + this.billingAddress, + this.shippingAddress, + this.orderItems, + this.orderStatusId, + this.orderStatus, + this.orderStatusn, + this.paymentStatusId, + this.paymentStatus, + this.paymentStatusn, + this.shippingStatus, + this.shippingStatusn, + this.customerTaxDisplayType, + this.canCancel, + this.canRefund, + this.lakumAmount, + this.preferDeliveryDate, + this.preferDeliveryTime, + this.preferDeliveryTimen, + }); + + String id; + dynamic storeId; + String orderGuid; + bool pickUpInStore; + PaymentMethodSystemName paymentMethodSystemName; + PaymentName paymentName; + PaymentName paymentNamen; + CustomerCurrencyCode customerCurrencyCode; + dynamic currencyRate; + dynamic customerTaxDisplayTypeId; + dynamic vatNumber; + double orderSubtotalInclTax; + double orderSubtotalExclTax; + dynamic orderSubTotalDiscountInclTax; + dynamic orderSubTotalDiscountExclTax; + double orderShippingInclTax; + dynamic orderShippingExclTax; + dynamic paymentMethodAdditionalFeeInclTax; + dynamic paymentMethodAdditionalFeeExclTax; + String taxRates; + double orderTax; + dynamic orderDiscount; + double orderTotal; + dynamic refundedAmount; + dynamic rewardPointsWereAdded; + String rxAttachments; + CheckoutAttributeDescription checkoutAttributeDescription; + dynamic customerLanguageId; + dynamic affiliateId; + CustomerIp customerIp; + String authorizationTransactionId; + dynamic authorizationTransactionCode; + dynamic authorizationTransactionResult; + dynamic captureTransactionId; + dynamic captureTransactionResult; + dynamic subscriptionTransactionId; + DateTime paidDateUtc; + ShippingMethod shippingMethod; + ShippingRateComputationMethodSystemName shippingRateComputationMethodSystemName; + String customValuesXml; + bool deleted; + DateTime createdOnUtc; + OrderModelCustomer customer; + dynamic customerId; + IngAddress billingAddress; + IngAddress shippingAddress; + List orderItems; + dynamic orderStatusId; + OrderStatus orderStatus; + OrderStatusn orderStatusn; + dynamic paymentStatusId; + PaymentStatus paymentStatus; + PaymentStatusn paymentStatusn; + ShippingStatus shippingStatus; + ShippingStatusn shippingStatusn; + CustomerTaxDisplayType customerTaxDisplayType; + bool canCancel; + bool canRefund; + dynamic lakumAmount; + DateTime preferDeliveryDate; + PreferDeliveryTime preferDeliveryTime; + PreferDeliveryTimen preferDeliveryTimen; + + factory OrderModel.fromJson(Map json) => OrderModel( + id: json["id"], + storeId: json["store_id"], + orderGuid: json["order_guid"], + pickUpInStore: json["pick_up_in_store"], + paymentMethodSystemName: paymentMethodSystemNameValues.map[json["payment_method_system_name"]], + paymentName: paymentNameValues.map[json["payment_name"]], + paymentNamen: paymentNameValues.map[json["payment_namen"]], + customerCurrencyCode: customerCurrencyCodeValues.map[json["customer_currency_code"]], + currencyRate: json["currency_rate"], + customerTaxDisplayTypeId: json["customer_tax_display_type_id"], + vatNumber: json["vat_number"], + orderSubtotalInclTax: json["order_subtotal_incl_tax"].toDouble(), + orderSubtotalExclTax: json["order_subtotal_excl_tax"].toDouble(), + orderSubTotalDiscountInclTax: json["order_sub_total_discount_incl_tax"], + orderSubTotalDiscountExclTax: json["order_sub_total_discount_excl_tax"], + orderShippingInclTax: json["order_shipping_incl_tax"].toDouble(), + orderShippingExclTax: json["order_shipping_excl_tax"], + paymentMethodAdditionalFeeInclTax: json["payment_method_additional_fee_incl_tax"], + paymentMethodAdditionalFeeExclTax: json["payment_method_additional_fee_excl_tax"], + taxRates: json["tax_rates"], + orderTax: json["order_tax"].toDouble(), + orderDiscount: json["order_discount"], + orderTotal: json["order_total"].toDouble(), + refundedAmount: json["refunded_amount"], + rewardPointsWereAdded: json["reward_points_were_added"], + rxAttachments: json["rx_attachments"] == null ? null : json["rx_attachments"], + checkoutAttributeDescription: checkoutAttributeDescriptionValues.map[json["checkout_attribute_description"]], + customerLanguageId: json["customer_language_id"], + affiliateId: json["affiliate_id"], + customerIp: customerIpValues.map[json["customer_ip"]], + authorizationTransactionId: json["authorization_transaction_id"] == null ? null : json["authorization_transaction_id"], + authorizationTransactionCode: json["authorization_transaction_code"], + authorizationTransactionResult: json["authorization_transaction_result"], + captureTransactionId: json["capture_transaction_id"], + captureTransactionResult: json["capture_transaction_result"], + subscriptionTransactionId: json["subscription_transaction_id"], + paidDateUtc: json["paid_date_utc"] == null ? null : DateTime.parse(json["paid_date_utc"]), + shippingMethod: shippingMethodValues.map[json["shipping_method"]], + shippingRateComputationMethodSystemName: shippingRateComputationMethodSystemNameValues.map[json["shipping_rate_computation_method_system_name"]], + customValuesXml: json["custom_values_xml"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + customer: OrderModelCustomer.fromJson(json["customer"]), + customerId: json["customer_id"], + billingAddress: IngAddress.fromJson(json["billing_address"]), + shippingAddress: IngAddress.fromJson(json["shipping_address"]), + orderItems: List.from(json["order_items"].map((x) => OrderItem.fromJson(x))), + orderStatusId: json["order_status_id"], + orderStatus: orderStatusValues.map[json["order_status"]], + orderStatusn: orderStatusnValues.map[json["order_statusn"]], + paymentStatusId: json["payment_status_id"], + paymentStatus: paymentStatusValues.map[json["payment_status"]], + paymentStatusn: paymentStatusnValues.map[json["payment_statusn"]], + shippingStatus: shippingStatusValues.map[json["shipping_status"]], + shippingStatusn: shippingStatusnValues.map[json["shipping_statusn"]], + customerTaxDisplayType: customerTaxDisplayTypeValues.map[json["customer_tax_display_type"]], + canCancel: json["can_cancel"], + canRefund: json["can_refund"], + lakumAmount: json["lakum_amount"], + preferDeliveryDate: json["prefer_delivery_date"] == null ? null : DateTime.parse(json["prefer_delivery_date"]), + preferDeliveryTime: json["prefer_delivery_time"] == null ? null : preferDeliveryTimeValues.map[json["prefer_delivery_time"]], + preferDeliveryTimen: json["prefer_delivery_timen"] == null ? null : preferDeliveryTimenValues.map[json["prefer_delivery_timen"]], + ); + + Map toJson() => { + "id": id, + "store_id": storeId, + "order_guid": orderGuid, + "pick_up_in_store": pickUpInStore, + "payment_method_system_name": paymentMethodSystemNameValues.reverse[paymentMethodSystemName], + "payment_name": paymentNameValues.reverse[paymentName], + "payment_namen": paymentNameValues.reverse[paymentNamen], + "customer_currency_code": customerCurrencyCodeValues.reverse[customerCurrencyCode], + "currency_rate": currencyRate, + "customer_tax_display_type_id": customerTaxDisplayTypeId, + "vat_number": vatNumber, + "order_subtotal_incl_tax": orderSubtotalInclTax, + "order_subtotal_excl_tax": orderSubtotalExclTax, + "order_sub_total_discount_incl_tax": orderSubTotalDiscountInclTax, + "order_sub_total_discount_excl_tax": orderSubTotalDiscountExclTax, + "order_shipping_incl_tax": orderShippingInclTax, + "order_shipping_excl_tax": orderShippingExclTax, + "payment_method_additional_fee_incl_tax": paymentMethodAdditionalFeeInclTax, + "payment_method_additional_fee_excl_tax": paymentMethodAdditionalFeeExclTax, + "tax_rates": taxRates, + "order_tax": orderTax, + "order_discount": orderDiscount, + "order_total": orderTotal, + "refunded_amount": refundedAmount, + "reward_points_were_added": rewardPointsWereAdded, + "rx_attachments": rxAttachments == null ? null : rxAttachments, + "checkout_attribute_description": checkoutAttributeDescriptionValues.reverse[checkoutAttributeDescription], + "customer_language_id": customerLanguageId, + "affiliate_id": affiliateId, + "customer_ip": customerIpValues.reverse[customerIp], + "authorization_transaction_id": authorizationTransactionId == null ? null : authorizationTransactionId, + "authorization_transaction_code": authorizationTransactionCode, + "authorization_transaction_result": authorizationTransactionResult, + "capture_transaction_id": captureTransactionId, + "capture_transaction_result": captureTransactionResult, + "subscription_transaction_id": subscriptionTransactionId, + "paid_date_utc": paidDateUtc == null ? null : paidDateUtc.toIso8601String(), + "shipping_method": shippingMethodValues.reverse[shippingMethod], + "shipping_rate_computation_method_system_name": shippingRateComputationMethodSystemNameValues.reverse[shippingRateComputationMethodSystemName], + "custom_values_xml": customValuesXml, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "customer": customer.toJson(), + "customer_id": customerId, + "billing_address": billingAddress.toJson(), + "shipping_address": shippingAddress.toJson(), + "order_items": List.from(orderItems.map((x) => x.toJson())), + "order_status_id": orderStatusId, + "order_status": orderStatusValues.reverse[orderStatus], + "order_statusn": orderStatusnValues.reverse[orderStatusn], + "payment_status_id": paymentStatusId, + "payment_status": paymentStatusValues.reverse[paymentStatus], + "payment_statusn": paymentStatusnValues.reverse[paymentStatusn], + "shipping_status": shippingStatusValues.reverse[shippingStatus], + "shipping_statusn": shippingStatusnValues.reverse[shippingStatusn], + "customer_tax_display_type": customerTaxDisplayTypeValues.reverse[customerTaxDisplayType], + "can_cancel": canCancel, + "can_refund": canRefund, + "lakum_amount": lakumAmount, + "prefer_delivery_date": preferDeliveryDate == null ? null : "${preferDeliveryDate.year.toString().padLeft(4, '0')}-${preferDeliveryDate.month.toString().padLeft(2, '0')}-${preferDeliveryDate.day.toString().padLeft(2, '0')}", + "prefer_delivery_time": preferDeliveryTime == null ? null : preferDeliveryTimeValues.reverse[preferDeliveryTime], + "prefer_delivery_timen": preferDeliveryTimen == null ? null : preferDeliveryTimenValues.reverse[preferDeliveryTimen], + }; +} + +class IngAddress { + IngAddress({ + this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong, + }); + + String id; + FirstName firstName; + LastName lastName; + BillingAddressEmail email; + dynamic company; + dynamic countryId; + Country country; + dynamic stateProvinceId; + City city; + Address1 address1; + Address2 address2; + String zipPostalCode; + String phoneNumber; + dynamic faxNumber; + String customerAttributes; + DateTime createdOnUtc; + dynamic province; + LatLong latLong; + + factory IngAddress.fromJson(Map json) => IngAddress( + id: json["id"], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + email: billingAddressEmailValues.map[json["email"]], + company: json["company"], + countryId: json["country_id"], + country: countryValues.map[json["country"]], + stateProvinceId: json["state_province_id"], + city: cityValues.map[json["city"]], + address1: address1Values.map[json["address1"]], + address2: address2Values.map[json["address2"]], + zipPostalCode: json["zip_postal_code"], + phoneNumber: json["phone_number"], + faxNumber: json["fax_number"], + customerAttributes: json["customer_attributes"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + province: json["province"], + latLong: latLongValues.map[json["lat_long"]], + ); + + Map toJson() => { + "id": id, + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "email": billingAddressEmailValues.reverse[email], + "company": company, + "country_id": countryId, + "country": countryValues.reverse[country], + "state_province_id": stateProvinceId, + "city": cityValues.reverse[city], + "address1": address1Values.reverse[address1], + "address2": address2Values.reverse[address2], + "zip_postal_code": zipPostalCode, + "phone_number": phoneNumber, + "fax_number": faxNumber, + "customer_attributes": customerAttributes, + "created_on_utc": createdOnUtc.toIso8601String(), + "province": province, + "lat_long": latLongValues.reverse[latLong], + }; +} + +enum Address1 { THE_7960_MOSAB_IBN_UMAIR_STREET_AL_RIYADH, THE_6500_AL_AMEEN_ABDULLAH_AL_ALI_AL_NAEEM_STREET_AL_RIYADH, THE_6603_IBRAHIM_IBN_AL_HAMASI_AR_RIYAD, THE_9626_SALAH_AD_DIN_AL_AYYUBI_ROAD_AL_RIYADH, THE_3075_PRINCE_MANSUR_BIN_ABDULAZIZ_STREET_AL_RIYADH, THE_40, THE_7801_AL_IHSA_AL_RIYADH } + +final address1Values = EnumValues({ + "3075, Prince Mansur Bin Abdulaziz Street, Al Riyadh, ": Address1.THE_3075_PRINCE_MANSUR_BIN_ABDULAZIZ_STREET_AL_RIYADH, + "40,": Address1.THE_40, + "6500, Al Ameen Abdullah Al Ali Al Naeem Street, Al Riyadh, ": Address1.THE_6500_AL_AMEEN_ABDULLAH_AL_ALI_AL_NAEEM_STREET_AL_RIYADH, + "6603, Ibrahim Ibn Al Hamasi, Ar-Riyad, ": Address1.THE_6603_IBRAHIM_IBN_AL_HAMASI_AR_RIYAD, + "7801, Al Ihsa, Al Riyadh, ": Address1.THE_7801_AL_IHSA_AL_RIYADH, + "7960, Mosab Ibn Umair Street, Al Riyadh, ": Address1.THE_7960_MOSAB_IBN_UMAIR_STREET_AL_RIYADH, + "9626, Salah Ad Din Al Ayyubi Road, Al Riyadh, ": Address1.THE_9626_SALAH_AD_DIN_AL_AYYUBI_ROAD_AL_RIYADH +}); + +enum Address2 { AL_MALAZ_RIYADH_PROVINCE_3460, AL_MALAZ_RIYADH_PROVINCE_2817, AR_RAHMANIYYAH_RIYADH_PROVINCE_3816, AL_MALAZ_RIYADH_PROVINCE_3815, AL_WIZARAT_RIYADH_PROVINCE_7039, EASTERN_PROVINCE, AL_MALAZ_RIYADH_PROVINCE_3084 } + +final address2Values = EnumValues({ + "Al Malaz, Riyadh Province, 2817, ": Address2.AL_MALAZ_RIYADH_PROVINCE_2817, + "Al Malaz, Riyadh Province, 3084, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3084, + "Al Malaz, Riyadh Province, 3460, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3460, + "Al Malaz, Riyadh Province, 3815, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3815, + "Al Wizarat, Riyadh Province, 7039, ": Address2.AL_WIZARAT_RIYADH_PROVINCE_7039, + "Ar Rahmaniyyah, Riyadh Province, 3816, ": Address2.AR_RAHMANIYYAH_RIYADH_PROVINCE_3816, + "Eastern Province,": Address2.EASTERN_PROVINCE +}); + +enum City { RIYADH, DAMMAM } + +final cityValues = EnumValues({ + "Dammam": City.DAMMAM, + "Riyadh": City.RIYADH +}); + +enum Country { SAUDI_ARABIA } + +final countryValues = EnumValues({ + "Saudi Arabia": Country.SAUDI_ARABIA +}); + +enum BillingAddressEmail { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM, TAMER_FANASHEH_DRSULAIMANALHABIB_COM } + +final billingAddressEmailValues = EnumValues({ + "Tamer.dasdasdas@gmail.com": BillingAddressEmail.TAMER_DASDASDAS_GMAIL_COM, + "tamer.fanasheh@drsulaimanalhabib.com": BillingAddressEmail.TAMER_FANASHEH_DRSULAIMANALHABIB_COM, + "Tamer.fanasheh@gmail.com": BillingAddressEmail.TAMER_FANASHEH_GMAIL_COM +}); + +enum FirstName { TAMER, TAMER_FANASHEH, FIRST_NAME_TAMER } + +final firstNameValues = EnumValues({ + "tamer": FirstName.FIRST_NAME_TAMER, + "TAMER": FirstName.TAMER, + "TAMER FANASHEH": FirstName.TAMER_FANASHEH +}); + +enum LastName { FANASHEH, MUSA, LAST_NAME_FANASHEH } + +final lastNameValues = EnumValues({ + "FANASHEH": LastName.FANASHEH, + "Fanasheh": LastName.LAST_NAME_FANASHEH, + "MUSA": LastName.MUSA +}); + +enum LatLong { THE_246784385694919524674091019299842, THE_24664749106968054673501121876645, THE_2470993657522702246664724647270134, THE_246626170308533764673348444086107, THE_24664875225999005467347443322574, THE_24674331807435784671024726818286, THE_263430228396836664991113909164471, THE_246767400793488074673774399406786, THE_24665374673515 } + +final latLongValues = EnumValues({ + "24.662617030853376,46.73348444086107": LatLong.THE_246626170308533764673348444086107, + "24.66474910696805,46.73501121876645": LatLong.THE_24664749106968054673501121876645, + "24.664875225999005,46.7347443322574": LatLong.THE_24664875225999005467347443322574, + "24.66537,46.73515": LatLong.THE_24665374673515, + "24.67433180743578,46.71024726818286": LatLong.THE_24674331807435784671024726818286, + "24.676740079348807,46.73774399406786": LatLong.THE_246767400793488074673774399406786, + "24.678438569491952,46.74091019299842": LatLong.THE_246784385694919524674091019299842, + "24.709936575227022,46.664724647270134": LatLong.THE_2470993657522702246664724647270134, + "26.343022839683666, 49.91113909164471": LatLong.THE_263430228396836664991113909164471 +}); + +enum CheckoutAttributeDescription { EMPTY, CHECKOUT_ATTRIBUTE_DESCRIPTION } + +final checkoutAttributeDescriptionValues = EnumValues({ + "ارفاق وصفة: ": CheckoutAttributeDescription.CHECKOUT_ATTRIBUTE_DESCRIPTION, + "": CheckoutAttributeDescription.EMPTY +}); + +class OrderModelCustomer { + OrderModelCustomer({ + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + String id; + Username username; + BillingAddressEmail email; + FirstName firstName; + LastName lastName; + String languageId; + dynamic adminComment; + bool isTaxExempt; + bool hasShoppingCartItems; + bool active; + bool deleted; + bool isSystemAccount; + dynamic systemName; + LastIpAddress lastIpAddress; + DateTime createdOnUtc; + DateTime lastLoginDateUtc; + DateTime lastActivityDateUtc; + dynamic registeredInStoreId; + List roleIds; + + factory OrderModelCustomer.fromJson(Map json) => OrderModelCustomer( + id: json["id"], + username: usernameValues.map[json["username"]], + email: billingAddressEmailValues.map[json["email"]], + firstName: firstNameValues.map[json["first_name"]], + lastName: lastNameValues.map[json["last_name"]], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: lastIpAddressValues.map[json["last_ip_address"]], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]), + lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]), + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "id": id, + "username": usernameValues.reverse[username], + "email": billingAddressEmailValues.reverse[email], + "first_name": firstNameValues.reverse[firstName], + "last_name": lastNameValues.reverse[lastName], + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddressValues.reverse[lastIpAddress], + "created_on_utc": createdOnUtc.toIso8601String(), + "last_login_date_utc": lastLoginDateUtc.toIso8601String(), + "last_activity_date_utc": lastActivityDateUtc.toIso8601String(), + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +enum LastIpAddress { THE_1050220126 } + +final lastIpAddressValues = EnumValues({ + "10.50.220.126": LastIpAddress.THE_1050220126 +}); + +enum Username { TAMERF } + +final usernameValues = EnumValues({ + "tamerf": Username.TAMERF +}); + +enum CustomerCurrencyCode { SAR } + +final customerCurrencyCodeValues = EnumValues({ + "SAR": CustomerCurrencyCode.SAR +}); + +enum CustomerIp { THE_105010210, THE_127001, THE_1020200101, THE_102020041, THE_10501028, THE_102020033, THE_1020200170, THE_102020011 } + +final customerIpValues = EnumValues({ + "10.20.200.101": CustomerIp.THE_1020200101, + "10.20.200.11": CustomerIp.THE_102020011, + "10.20.200.170": CustomerIp.THE_1020200170, + "10.20.200.33": CustomerIp.THE_102020033, + "10.20.200.41": CustomerIp.THE_102020041, + "10.50.102.10": CustomerIp.THE_105010210, + "10.50.102.8": CustomerIp.THE_10501028, + "127.0.0.1": CustomerIp.THE_127001 +}); + +enum CustomerTaxDisplayType { EXCLUDING_TAX } + +final customerTaxDisplayTypeValues = EnumValues({ + "ExcludingTax": CustomerTaxDisplayType.EXCLUDING_TAX +}); + +class OrderItem { + OrderItem({ + this.quantity, + this.unitPriceInclTax, + this.unitPriceExclTax, + this.priceInclTax, + this.priceExclTax, + this.discountAmountInclTax, + this.discountAmountExclTax, + this.originalProductCost, + this.attributeDescription, + this.downloadCount, + this.isDownloadActivated, + this.licenseDownloadId, + this.itemWeight, + this.rentalStartDateUtc, + this.rentalEndDateUtc, + this.product, + this.productId, + }); + + dynamic quantity; + double unitPriceInclTax; + double unitPriceExclTax; + double priceInclTax; + double priceExclTax; + double discountAmountInclTax; + double discountAmountExclTax; + double originalProductCost; + String attributeDescription; + dynamic downloadCount; + bool isDownloadActivated; + dynamic licenseDownloadId; + double itemWeight; + dynamic rentalStartDateUtc; + dynamic rentalEndDateUtc; + Product product; + dynamic productId; + + factory OrderItem.fromJson(Map json) => OrderItem( + quantity: json["quantity"], + unitPriceInclTax: json["unit_price_incl_tax"].toDouble(), + unitPriceExclTax: json["unit_price_excl_tax"].toDouble(), + priceInclTax: json["price_incl_tax"].toDouble(), + priceExclTax: json["price_excl_tax"].toDouble(), + discountAmountInclTax: json["discount_amount_incl_tax"].toDouble(), + discountAmountExclTax: json["discount_amount_excl_tax"].toDouble(), + originalProductCost: json["original_product_cost"].toDouble(), + attributeDescription: json["attribute_description"], + downloadCount: json["download_count"], + isDownloadActivated: json["isDownload_activated"], + licenseDownloadId: json["license_download_id"], + itemWeight: json["item_weight"].toDouble(), + rentalStartDateUtc: json["rental_start_date_utc"], + rentalEndDateUtc: json["rental_end_date_utc"], + product: Product.fromJson(json["product"]), + productId: json["product_id"], + ); + + Map toJson() => { + "quantity": quantity, + "unit_price_incl_tax": unitPriceInclTax, + "unit_price_excl_tax": unitPriceExclTax, + "price_incl_tax": priceInclTax, + "price_excl_tax": priceExclTax, + "discount_amount_incl_tax": discountAmountInclTax, + "discount_amount_excl_tax": discountAmountExclTax, + "original_product_cost": originalProductCost, + "attribute_description": attributeDescription, + "download_count": downloadCount, + "isDownload_activated": isDownloadActivated, + "license_download_id": licenseDownloadId, + "item_weight": itemWeight, + "rental_start_date_utc": rentalStartDateUtc, + "rental_end_date_utc": rentalEndDateUtc, + "product": product.toJson(), + "product_id": productId, + }; +} + +class Product { + Product({ + this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName, + }); + + String id; + bool visibleIndividually; + String name; + String namen; + dynamic localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + dynamic stockAvailability; + dynamic stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + double price; + dynamic oldPrice; + double productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + dynamic currency; + dynamic currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + DateTime createdOnUtc; + DateTime updatedOnUtc; + ProductType productType; + dynamic parentGroupedProductId; + dynamic roleIds; + dynamic discountIds; + dynamic storeIds; + dynamic manufacturerIds; + List reviews; + List images; + dynamic attributes; + dynamic specifications; + dynamic associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + factory Product.fromJson(Map json) => Product( + id: json["id"], + visibleIndividually: json["visible_individually"], + name: json["name"], + namen: json["namen"], + localizedNames: json["localized_names"], + shortDescription: json["short_description"] == null ? null : json["short_description"], + shortDescriptionn: json["short_descriptionn"] == null ? null : json["short_descriptionn"], + fullDescription: json["full_description"], + fullDescriptionn: json["full_descriptionn"], + markasNew: json["markas_new"], + showOnHomePage: json["show_on_home_page"], + metaKeywords: json["meta_keywords"] == null ? null : json["meta_keywords"], + metaDescription: json["meta_description"] == null ? null : json["meta_description"], + metaTitle: json["meta_title"] == null ? null : json["meta_title"], + allowCustomerReviews: json["allow_customer_reviews"], + approvedRatingSum: json["approved_rating_sum"], + notApprovedRatingSum: json["not_approved_rating_sum"], + approvedTotalReviews: json["approved_total_reviews"], + notApprovedTotalReviews: json["not_approved_total_reviews"], + sku: json["sku"], + isRx: json["is_rx"], + prescriptionRequired: json["prescription_required"], + rxMessage: json["rx_message"], + rxMessagen: json["rx_messagen"], + manufacturerPartNumber: json["manufacturer_part_number"], + gtin: json["gtin"], + isGiftCard: json["is_gift_card"], + requireOtherProducts: json["require_other_products"], + automaticallyAddRequiredProducts: json["automatically_add_required_products"], + isDownload: json["is_download"], + unlimitedDownloads: json["unlimited_downloads"], + maxNumberOfDownloads: json["max_number_of_downloads"], + downloadExpirationDays: json["download_expiration_days"], + hasSampleDownload: json["has_sample_download"], + hasUserAgreement: json["has_user_agreement"], + isRecurring: json["is_recurring"], + recurringCycleLength: json["recurring_cycle_length"], + recurringTotalCycles: json["recurring_total_cycles"], + isRental: json["is_rental"], + rentalPriceLength: json["rental_price_length"], + isShipEnabled: json["is_ship_enabled"], + isFreeShipping: json["is_free_shipping"], + shipSeparately: json["ship_separately"], + additionalShippingCharge: json["additional_shipping_charge"], + isTaxExempt: json["is_tax_exempt"], + isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], + useMultipleWarehouses: json["use_multiple_warehouses"], + manageInventoryMethodId: json["manage_inventory_method_id"], + stockQuantity: json["stock_quantity"], + stockAvailability: json["stock_availability"], + stockAvailabilityn: json["stock_availabilityn"], + displayStockAvailability: json["display_stock_availability"], + displayStockQuantity: json["display_stock_quantity"], + minStockQuantity: json["min_stock_quantity"], + notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], + allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], + orderMinimumQuantity: json["order_minimum_quantity"], + orderMaximumQuantity: json["order_maximum_quantity"], + allowedQuantities: json["allowed_quantities"], + allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], + disableBuyButton: json["disable_buy_button"], + disableWishlistButton: json["disable_wishlist_button"], + availableForPreOrder: json["available_for_pre_order"], + preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], + callForPrice: json["call_for_price"], + price: json["price"].toDouble(), + oldPrice: json["old_price"], + productCost: json["product_cost"].toDouble(), + specialPrice: json["special_price"], + specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], + specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], + customerEntersPrice: json["customer_enters_price"], + minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], + maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], + basepriceEnabled: json["baseprice_enabled"], + basepriceAmount: json["baseprice_amount"], + basepriceBaseAmount: json["baseprice_base_amount"], + hasTierPrices: json["has_tier_prices"], + hasDiscountsApplied: json["has_discounts_applied"], + discountName: json["discount_name"], + discountNamen: json["discount_namen"], + discountDescription: json["discount_description"], + discountDescriptionn: json["discount_Descriptionn"], + discountPercentage: json["discount_percentage"], + currency: json["currency"], + currencyn: json["currencyn"], + weight: json["weight"].toDouble(), + length: json["length"], + width: json["width"], + height: json["height"], + availableStartDateTimeUtc: json["available_start_date_time_utc"], + availableEndDateTimeUtc: json["available_end_date_time_utc"], + displayOrder: json["display_order"], + published: json["published"], + deleted: json["deleted"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + updatedOnUtc: DateTime.parse(json["updated_on_utc"]), + productType: productTypeValues.map[json["product_type"]], + parentGroupedProductId: json["parent_grouped_product_id"], + roleIds: json["role_ids"], + discountIds: json["discount_ids"], + storeIds: json["store_ids"], + manufacturerIds: json["manufacturer_ids"], + reviews: List.from(json["reviews"].map((x) => Review.fromJson(x))), + images: List.from(json["images"].map((x) => Image.fromJson(x))), + attributes: json["attributes"], + specifications: json["specifications"], + associatedProductIds: json["associated_product_ids"], + tags: List.from(json["tags"].map((x) => x)), + vendorId: json["vendor_id"], + seName: json["se_name"], + ); + + Map toJson() => { + "id": id, + "visible_individually": visibleIndividually, + "name": name, + "namen": namen, + "localized_names": localizedNames, + "short_description": shortDescription == null ? null : shortDescription, + "short_descriptionn": shortDescriptionn == null ? null : shortDescriptionn, + "full_description": fullDescription, + "full_descriptionn": fullDescriptionn, + "markas_new": markasNew, + "show_on_home_page": showOnHomePage, + "meta_keywords": metaKeywords == null ? null : metaKeywords, + "meta_description": metaDescription == null ? null : metaDescription, + "meta_title": metaTitle == null ? null : metaTitle, + "allow_customer_reviews": allowCustomerReviews, + "approved_rating_sum": approvedRatingSum, + "not_approved_rating_sum": notApprovedRatingSum, + "approved_total_reviews": approvedTotalReviews, + "not_approved_total_reviews": notApprovedTotalReviews, + "sku": sku, + "is_rx": isRx, + "prescription_required": prescriptionRequired, + "rx_message": rxMessage, + "rx_messagen": rxMessagen, + "manufacturer_part_number": manufacturerPartNumber, + "gtin": gtin, + "is_gift_card": isGiftCard, + "require_other_products": requireOtherProducts, + "automatically_add_required_products": automaticallyAddRequiredProducts, + "is_download": isDownload, + "unlimited_downloads": unlimitedDownloads, + "max_number_of_downloads": maxNumberOfDownloads, + "download_expiration_days": downloadExpirationDays, + "has_sample_download": hasSampleDownload, + "has_user_agreement": hasUserAgreement, + "is_recurring": isRecurring, + "recurring_cycle_length": recurringCycleLength, + "recurring_total_cycles": recurringTotalCycles, + "is_rental": isRental, + "rental_price_length": rentalPriceLength, + "is_ship_enabled": isShipEnabled, + "is_free_shipping": isFreeShipping, + "ship_separately": shipSeparately, + "additional_shipping_charge": additionalShippingCharge, + "is_tax_exempt": isTaxExempt, + "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, + "use_multiple_warehouses": useMultipleWarehouses, + "manage_inventory_method_id": manageInventoryMethodId, + "stock_quantity": stockQuantity, + "stock_availability": stockAvailability, + "stock_availabilityn": stockAvailabilityn, + "display_stock_availability": displayStockAvailability, + "display_stock_quantity": displayStockQuantity, + "min_stock_quantity": minStockQuantity, + "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, + "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, + "order_minimum_quantity": orderMinimumQuantity, + "order_maximum_quantity": orderMaximumQuantity, + "allowed_quantities": allowedQuantities, + "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, + "disable_buy_button": disableBuyButton, + "disable_wishlist_button": disableWishlistButton, + "available_for_pre_order": availableForPreOrder, + "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, + "call_for_price": callForPrice, + "price": price, + "old_price": oldPrice, + "product_cost": productCost, + "special_price": specialPrice, + "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, + "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, + "customer_enters_price": customerEntersPrice, + "minimum_customer_entered_price": minimumCustomerEnteredPrice, + "maximum_customer_entered_price": maximumCustomerEnteredPrice, + "baseprice_enabled": basepriceEnabled, + "baseprice_amount": basepriceAmount, + "baseprice_base_amount": basepriceBaseAmount, + "has_tier_prices": hasTierPrices, + "has_discounts_applied": hasDiscountsApplied, + "discount_name": discountName, + "discount_namen": discountNamen, + "discount_description": discountDescription, + "discount_Descriptionn": discountDescriptionn, + "discount_percentage": discountPercentage, + "currency": currency, + "currencyn": currencyn, + "weight": weight, + "length": length, + "width": width, + "height": height, + "available_start_date_time_utc": availableStartDateTimeUtc, + "available_end_date_time_utc": availableEndDateTimeUtc, + "display_order": displayOrder, + "published": published, + "deleted": deleted, + "created_on_utc": createdOnUtc.toIso8601String(), + "updated_on_utc": updatedOnUtc.toIso8601String(), + "product_type": productTypeValues.reverse[productType], + "parent_grouped_product_id": parentGroupedProductId, + "role_ids": roleIds, + "discount_ids": discountIds, + "store_ids": storeIds, + "manufacturer_ids": manufacturerIds, + "reviews": List.from(reviews.map((x) => x.toJson())), + "images": List.from(images.map((x) => x.toJson())), + "attributes": attributes, + "specifications": specifications, + "associated_product_ids": associatedProductIds, + "tags": List.from(tags.map((x) => x)), + "vendor_id": vendorId, + "se_name": seName, + }; +} + +class Image { + Image({ + this.id, + this.position, + this.src, + this.thumb, + this.attachment, + }); + + dynamic id; + dynamic position; + String src; + String thumb; + String attachment; + + factory Image.fromJson(Map json) => Image( + id: json["id"], + position: json["position"], + src: json["src"], + thumb: json["thumb"], + attachment: json["attachment"], + ); + + Map toJson() => { + "id": id, + "position": position, + "src": src, + "thumb": thumb, + "attachment": attachment, + }; +} + +enum ProductType { SIMPLE_PRODUCT } + +final productTypeValues = EnumValues({ + "SimpleProduct": ProductType.SIMPLE_PRODUCT +}); + +class Review { + Review({ + this.id, + this.position, + this.reviewId, + this.customerId, + this.productId, + this.storeId, + this.isApproved, + this.title, + this.reviewText, + this.replyText, + this.rating, + this.helpfulYesTotal, + this.helpfulNoTotal, + this.createdOnUtc, + this.customer, + this.product, + }); + + dynamic id; + dynamic position; + dynamic reviewId; + dynamic customerId; + dynamic productId; + dynamic storeId; + bool isApproved; + Title title; + ReviewText reviewText; + dynamic replyText; + dynamic rating; + dynamic helpfulYesTotal; + dynamic helpfulNoTotal; + DateTime createdOnUtc; + ReviewCustomer customer; + dynamic product; + + factory Review.fromJson(Map json) => Review( + id: json["id"], + position: json["position"], + reviewId: json["review_id"], + customerId: json["customer_id"], + productId: json["product_id"], + storeId: json["store_id"], + isApproved: json["is_approved"], + title: titleValues.map[json["title"]], + reviewText: reviewTextValues.map[json["review_text"]], + replyText: json["reply_text"], + rating: json["rating"], + helpfulYesTotal: json["helpful_yes_total"], + helpfulNoTotal: json["helpful_no_total"], + createdOnUtc: DateTime.parse(json["created_on_utc"]), + customer: ReviewCustomer.fromJson(json["customer"]), + product: json["product"], + ); + + Map toJson() => { + "id": id, + "position": position, + "review_id": reviewId, + "customer_id": customerId, + "product_id": productId, + "store_id": storeId, + "is_approved": isApproved, + "title": titleValues.reverse[title], + "review_text": reviewTextValues.reverse[reviewText], + "reply_text": replyText, + "rating": rating, + "helpful_yes_total": helpfulYesTotal, + "helpful_no_total": helpfulNoTotal, + "created_on_utc": createdOnUtc.toIso8601String(), + "customer": customer.toJson(), + "product": product, + }; +} + +class ReviewCustomer { + ReviewCustomer({ + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.addresses, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId, + this.roleIds, + }); + + dynamic fileNumber; + dynamic iqamaNumber; + dynamic isOutSa; + dynamic patientType; + dynamic gender; + DateTime birthDate; + dynamic phone; + dynamic countryCode; + dynamic yahalaAccountno; + dynamic billingAddress; + dynamic shippingAddress; + List addresses; + String id; + String username; + PurpleEmail email; + dynamic firstName; + dynamic lastName; + dynamic languageId; + dynamic adminComment; + dynamic isTaxExempt; + dynamic hasShoppingCartItems; + dynamic active; + dynamic deleted; + dynamic isSystemAccount; + dynamic systemName; + dynamic lastIpAddress; + dynamic createdOnUtc; + dynamic lastLoginDateUtc; + dynamic lastActivityDateUtc; + dynamic registeredInStoreId; + List roleIds; + + factory ReviewCustomer.fromJson(Map json) => ReviewCustomer( + fileNumber: json["file_number"], + iqamaNumber: json["iqama_number"], + isOutSa: json["is_out_sa"], + patientType: json["patient_type"], + gender: json["gender"], + birthDate: DateTime.parse(json["birth_date"]), + phone: json["phone"], + countryCode: json["country_code"], + yahalaAccountno: json["yahala_accountno"], + billingAddress: json["billing_address"], + shippingAddress: json["shipping_address"], + addresses: List.from(json["addresses"].map((x) => x)), + id: json["id"], + username: json["username"], + email: purpleEmailValues.map[json["email"]], + firstName: json["first_name"], + lastName: json["last_name"], + languageId: json["language_id"], + adminComment: json["admin_comment"], + isTaxExempt: json["is_tax_exempt"], + hasShoppingCartItems: json["has_shopping_cart_items"], + active: json["active"], + deleted: json["deleted"], + isSystemAccount: json["is_system_account"], + systemName: json["system_name"], + lastIpAddress: json["last_ip_address"], + createdOnUtc: json["created_on_utc"], + lastLoginDateUtc: json["last_login_date_utc"], + lastActivityDateUtc: json["last_activity_date_utc"], + registeredInStoreId: json["registered_in_store_id"], + roleIds: List.from(json["role_ids"].map((x) => x)), + ); + + Map toJson() => { + "file_number": fileNumber, + "iqama_number": iqamaNumber, + "is_out_sa": isOutSa, + "patient_type": patientType, + "gender": gender, + "birth_date": birthDate.toIso8601String(), + "phone": phone, + "country_code": countryCode, + "yahala_accountno": yahalaAccountno, + "billing_address": billingAddress, + "shipping_address": shippingAddress, + "addresses": List.from(addresses.map((x) => x)), + "id": id, + "username": username, + "email": purpleEmailValues.reverse[email], + "first_name": firstName, + "last_name": lastName, + "language_id": languageId, + "admin_comment": adminComment, + "is_tax_exempt": isTaxExempt, + "has_shopping_cart_items": hasShoppingCartItems, + "active": active, + "deleted": deleted, + "is_system_account": isSystemAccount, + "system_name": systemName, + "last_ip_address": lastIpAddress, + "created_on_utc": createdOnUtc, + "last_login_date_utc": lastLoginDateUtc, + "last_activity_date_utc": lastActivityDateUtc, + "registered_in_store_id": registeredInStoreId, + "role_ids": List.from(roleIds.map((x) => x)), + }; +} + +enum PurpleEmail { STEVE_GATES_NOP_COMMERCE_COM, TAMER_FANASHEH_DRSULAIMANALHABIB_COM, ASIF_RAZA_DRSULAIMANALHABIB_COM, ABOSAMI_YMAIL_COM } + +final purpleEmailValues = EnumValues({ + "abosami@ymail.com": PurpleEmail.ABOSAMI_YMAIL_COM, + "asif.raza@drsulaimanalhabib.com": PurpleEmail.ASIF_RAZA_DRSULAIMANALHABIB_COM, + "steve_gates@nopCommerce.com": PurpleEmail.STEVE_GATES_NOP_COMMERCE_COM, + "tamer.fanasheh@drsulaimanalhabib.com": PurpleEmail.TAMER_FANASHEH_DRSULAIMANALHABIB_COM +}); + +enum ReviewText { GOOD, NICE_PRICE, GREAT, REVIEW_TEXT_GOOD, GG, ENAD_TEST_REVIEW_001, ENAD, ENADDD, ENAD_TEST_0001, PURPLE_GOOD, EMPTY } + +final reviewTextValues = EnumValues({ + "افضل علاج للزكام": ReviewText.EMPTY, + "ENAD ": ReviewText.ENAD, + "enaddd": ReviewText.ENADDD, + "ENAD TEST 0001": ReviewText.ENAD_TEST_0001, + "Enad Test Review 001": ReviewText.ENAD_TEST_REVIEW_001, + "gg": ReviewText.GG, + "good ": ReviewText.GOOD, + "great": ReviewText.GREAT, + "nice price": ReviewText.NICE_PRICE, + "Good": ReviewText.PURPLE_GOOD, + "good": ReviewText.REVIEW_TEXT_GOOD +}); + +enum Title { EMPTY, GOOD, TITLE } + +final titleValues = EnumValues({ + "": Title.EMPTY, + "Good": Title.GOOD, + "ممتاز": Title.TITLE +}); + +enum OrderStatus { ORDER_SUBMITTED, PENDING, ORDER_IN_PROGRESS, ORDER_COMPLETED, CANCELLED, PROCESSING, ORDER_REFUNDED, COMPLETE } + +final orderStatusValues = EnumValues({ + "Cancelled": OrderStatus.CANCELLED, + "Complete": OrderStatus.COMPLETE, + "OrderCompleted": OrderStatus.ORDER_COMPLETED, + "OrderInProgress": OrderStatus.ORDER_IN_PROGRESS, + "OrderRefunded": OrderStatus.ORDER_REFUNDED, + "OrderSubmitted": OrderStatus.ORDER_SUBMITTED, + "Pending": OrderStatus.PENDING, + "Processing": OrderStatus.PROCESSING +}); + +enum OrderStatusn { ORDER_SUBMITTED, EMPTY, ORDER_IN_PROGRESS, ORDER_COMPLETED, ORDER_STATUSN, PURPLE, FLUFFY, TENTACLED } + +final orderStatusnValues = EnumValues({ + "معلقة": OrderStatusn.EMPTY, + "تم ارجاع مبلغ الطلبية المدفوع للعميل": OrderStatusn.FLUFFY, + "Order Completed": OrderStatusn.ORDER_COMPLETED, + "Order In Progress": OrderStatusn.ORDER_IN_PROGRESS, + "ملغي": OrderStatusn.ORDER_STATUSN, + "Order Submitted": OrderStatusn.ORDER_SUBMITTED, + "قيد التنفيذ": OrderStatusn.PURPLE, + "مكتمل": OrderStatusn.TENTACLED +}); + +enum PaymentMethodSystemName { PAYMENTS_PAY_FORT, PAYMENTS_CASH_ON_DELIVERY } + +final paymentMethodSystemNameValues = EnumValues({ + "Payments.CashOnDelivery": PaymentMethodSystemName.PAYMENTS_CASH_ON_DELIVERY, + "Payments.PayFort": PaymentMethodSystemName.PAYMENTS_PAY_FORT +}); + +enum PaymentName { CREDIT_DEBIT_CARD_PAYFORT, CASH_ON_DELIVERY_COD } + +final paymentNameValues = EnumValues({ + "Cash On Delivery (COD)": PaymentName.CASH_ON_DELIVERY_COD, + "Credit / Debit Card Payfort": PaymentName.CREDIT_DEBIT_CARD_PAYFORT +}); + +enum PaymentStatus { PAID, PENDING } + +final paymentStatusValues = EnumValues({ + "Paid": PaymentStatus.PAID, + "Pending": PaymentStatus.PENDING +}); + +enum PaymentStatusn { EMPTY, PAYMENT_STATUSN } + +final paymentStatusnValues = EnumValues({ + "تم الدفع": PaymentStatusn.EMPTY, + "قيد الإنتظار": PaymentStatusn.PAYMENT_STATUSN +}); + +enum PreferDeliveryTime { THE_1000_AM_330_PM, THE_530_PM_730_PM } + +final preferDeliveryTimeValues = EnumValues({ + "10:00 AM - 3:30 PM": PreferDeliveryTime.THE_1000_AM_330_PM, + "5:30 PM - 7:30 PM": PreferDeliveryTime.THE_530_PM_730_PM +}); + +enum PreferDeliveryTimen { THE_1000330, THE_530730 } + +final preferDeliveryTimenValues = EnumValues({ + "10:00 ص - 3:30 م": PreferDeliveryTimen.THE_1000330, + "5:30 م - 7:30 م": PreferDeliveryTimen.THE_530730 +}); + +enum ShippingMethod { EMPTY, FIXED_PRICE } + +final shippingMethodValues = EnumValues({ + "سعر ثابت ": ShippingMethod.EMPTY, + "Fixed Price": ShippingMethod.FIXED_PRICE +}); + +enum ShippingRateComputationMethodSystemName { SHIPPING_FIXED_OR_BY_WEIGHT } + +final shippingRateComputationMethodSystemNameValues = EnumValues({ + "Shipping.FixedOrByWeight": ShippingRateComputationMethodSystemName.SHIPPING_FIXED_OR_BY_WEIGHT +}); + +enum ShippingStatus { NOT_YET_SHIPPED } + +final shippingStatusValues = EnumValues({ + "NotYetShipped": ShippingStatus.NOT_YET_SHIPPED +}); + +enum ShippingStatusn { EMPTY } + +final shippingStatusnValues = EnumValues({ + "لم يتم شحنها بعد": ShippingStatusn.EMPTY +}); + +class EnumValues { + Map map; + Map reverseMap; + + EnumValues(this.map); + + Map get reverse { + if (reverseMap == null) { + reverseMap = map.map((k, v) => new MapEntry(v, k)); + } + return reverseMap; + } +} + + + diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 696489c6..57af3169 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -170,6 +170,38 @@ class BaseAppClient { } } + getPharmacy(String endPoint, + {Function(dynamic response, int statusCode) onSuccess, + Function(String error, int statusCode) onFailure, + bool isAllowAny = false, + Map queryParams}) async { + String url = PHARMACY_BASE_URL + endPoint; + if (queryParams != null) { + String queryString = Uri(queryParameters: queryParams).query; + url += '?' + queryString; + } + + print("URL : $url"); + + if (await Utils.checkConnection()) { + final response = await http.get(url.trim(), headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }); + final int statusCode = response.statusCode; + print("statusCode :$statusCode"); + + if (statusCode < 200 || statusCode >= 400 || json == null) { + onFailure('Error While Fetching data', statusCode); + } else { + var parsed = json.decode(response.body.toString()); + onSuccess(parsed, statusCode); + } + } else { + onFailure('Please Check The Internet Connection', -1); + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); Navigator.of(AppGlobal.context).pushReplacementNamed(LOGIN_TYPE); diff --git a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart new file mode 100644 index 00000000..75a178fa --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart @@ -0,0 +1,24 @@ + +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class PharmacyAddressesViewModel extends BaseViewModel { + PharmacyAddressService _PharmacyAddressService = locator(); + + List get address => _PharmacyAddressService.address; + + + Future getAddress() async { + setState(ViewState.Busy); + await _PharmacyAddressService.getAddress(); + if (_PharmacyAddressService.hasError) { + error = _PharmacyAddressService.error; + setState(ViewState.Error); + } else { + + } + } +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart new file mode 100644 index 00000000..beb62a53 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart @@ -0,0 +1,39 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class OrderModelViewModel extends BaseViewModel { + OrderService _orderService = locator(); + List get order => _orderService.orderList; + + OrderDetailsService _orderDetailsService = locator(); + List get orderDetails => _orderDetailsService.orderDetails; + + + + + Future getOrder(id, pageId) async { + setState(ViewState.Busy); + await _orderService.getOrder(id,pageId); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + + } + } + + Future getOrderDetails(orderId) async { + setState(ViewState.Busy); + await _orderDetailsService.getOrderDetails(orderId); + if (_orderDetailsService.hasError) { + error = _orderDetailsService.error; + setState(ViewState.Error); + } else { + + } + } +} \ No newline at end of file diff --git a/lib/locator.dart b/lib/locator.dart index a7352b47..dee43d78 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -4,6 +4,9 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/H2O_v import 'package:diplomaticquarterapp/core/viewModels/child_vaccines/user_information_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; @@ -86,6 +89,9 @@ import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; +import 'services/pharmacy_services/orderDetails_service.dart'; +import 'services/pharmacy_services/pharmacyAddress_service.dart'; + GetIt locator = GetIt.instance; @@ -142,6 +148,9 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); + locator.registerLazySingleton(() => OrderService()); + locator.registerLazySingleton(() => PharmacyAddressService()); + locator.registerLazySingleton(() => OrderDetailsService()); /// View Model @@ -173,6 +182,8 @@ void setupLocator() { locator.registerFactory(() => ChildVaccinesViewModel()); locator.registerFactory(() => UserInformationViewModel()); locator.registerFactory(() => VaccinationTableViewModel()); + locator.registerFactory(() => OrderModelViewModel()); + locator.registerFactory(() => PharmacyAddressesViewModel()); diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index f5311aae..91e8a80f 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -24,9 +24,9 @@ class _BaseViewState extends State> { @override void initState() { - if (widget.onModelReady != null && authenticatedUserObject.isLogin) { +// if (widget.onModelReady != null && authenticatedUserObject.isLogin) { widget.onModelReady(model); - } +// } super.initState(); } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 8de6fe6b..57fc074a 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -489,7 +489,7 @@ class _HomePageState extends State { ), DashboardItem( onTap: () => Navigator.push( - context, FadePage(page: PharmacyPage())), + context, FadePage(page: OrderPage())), child: Center( child: Padding( diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart index bfbca83f..17849c47 100644 --- a/lib/pages/pharmacy/order/Order.dart +++ b/lib/pages/pharmacy/order/Order.dart @@ -1,3 +1,6 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -8,17 +11,26 @@ import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; class OrderPage extends StatefulWidget { +// orderList({this.customerId, this.pageId}); + @override _OrderPageState createState() => _OrderPageState(); } class _OrderPageState extends State with SingleTickerProviderStateMixin{ + String customerId=""; + String page_id=""; + + List delivered = [] ; + List processing = []; + List cancelled = []; + List pending = []; TabController _tabController; AppSharedPreferences sharedPref = AppSharedPreferences(); @override void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); +// WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); super.initState(); _tabController = new TabController(length: 4, vsync: this,); @@ -26,54 +38,61 @@ class _OrderPageState extends State with SingleTickerProviderStateMix @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).order, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - child: Column( - children: [ - TabBar( - tabs: [ - Tab(text: TranslationBase.of(context).delivered), - Tab(text: TranslationBase.of(context).processing), - Tab(text: TranslationBase.of(context).pending), - Tab(text: TranslationBase.of(context).cancelled), - ], - controller: _tabController, - ), - Divider( - color: Colors.grey[350], - height: 10, - thickness: 6, - indent: 0, - endIndent: 0, - ), - Expanded( - child: new TabBarView( - physics: NeverScrollableScrollPhysics(), - children: [ - getDeliveredOrder(), - getProcessingOrder(), - getPendingOrder(), - getCancelledOrder(), + return BaseView( + onModelReady: (model) => model.getOrder(customerId, page_id), + builder: (_,model, wi )=> AppScaffold( + appBarTitle:(TranslationBase.of(context).order), +// backgroundColor: Colors.green , +// centerTitle: true, +// title: Text(TranslationBase.of(context).order, style: TextStyle(color:Colors.white)), +// backgroundColor: Colors.green, + isShowAppBar: true, + isPharmacy:true , + body: Container( + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: TranslationBase.of(context).delivered), +// Tab(text: model.order.length.toString()), + Tab(text: TranslationBase.of(context).processing), + Tab(text: TranslationBase.of(context).pending), + Tab(text: TranslationBase.of(context).cancelled), ], controller: _tabController, ), - ), - ], + Divider( + color: Colors.grey[350], + height: 10, + thickness: 6, + indent: 0, + endIndent: 0, + ), + Expanded( + child: new TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + getDeliveredOrder(model), + getProcessingOrder(model), + getPendingOrder(model), + getCancelledOrder(model), + ], + controller: _tabController, + ), + ), + ], + ), ), ), ); } - Widget getDeliveredOrder(){ + Widget getDeliveredOrder(OrderModelViewModel model){ return Container( width: MediaQuery.of(context).size.width, - child: SingleChildScrollView( - child: Column( + child: model.order.length != 0 && model.order[0].orderStatusId == 30 + ? SingleChildScrollView( + child: Column( children: [ ListView.builder( scrollDirection: Axis.vertical, @@ -96,13 +115,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Order#:', + child: Text(TranslationBase.of(context).orderNumber, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( - child: Text('3183', + child: Text(model.order[0].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -115,13 +134,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Date', + child: Text(TranslationBase.of(context).orderDate, style: TextStyle(fontSize: 14.0, ), ), ), Container( - child: Text('Aug 12, 2020', + child: Text(model.order[0].createdOnUtc.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -156,24 +175,27 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( + Expanded( + child: Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.blue[700], + style: BorderStyle.solid, + width: 5.0, + ), color: Colors.blue[700], - style: BorderStyle.solid, - width: 5.0, + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + model.order[0].orderStatus.toString(), +// TranslationBase.of(context).delivered, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, ), - color: Colors.blue[700], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, ), ), ), @@ -186,14 +208,14 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text('564', + child: Text(model.order[0].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('SAR', + child: Text(TranslationBase.of(context).sar, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -212,7 +234,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), Container( margin: EdgeInsets.only(left: 5), - child: Text('items(s)', + child: Text(TranslationBase.of(context).itemsNo, style: TextStyle(fontSize: 14.0, ), ), @@ -238,14 +260,34 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ) ], ), + ) + : Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/pharmacy/empty_box.svg'), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text(TranslationBase.of(context).noOrder, + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), + ), ), ); } - Widget getProcessingOrder(){ + Widget getProcessingOrder(OrderModelViewModel model){ return Container( - child: SingleChildScrollView( - child: Column( + child: model.order.length != 0 && model.order[0].orderStatusId == 20 + ? SingleChildScrollView( + child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -259,13 +301,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Order#:', + child: Text(TranslationBase.of(context).orderNumber, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( - child: Text('3183', + child: Text(model.order[0].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -278,13 +320,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Date', + child: Text(TranslationBase.of(context).orderDate, style: TextStyle(fontSize: 14.0, ), ), ), Container( - child: Text('Aug 12, 2020', + child: Text(model.order[0].createdOnUtc.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -319,24 +361,27 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( + Expanded( + child: Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 5.0, + ), color: Colors.green, - style: BorderStyle.solid, - width: 5.0, + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + model.order[0].orderStatus.toString(), +// TranslationBase.of(context).processing, + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, ), - color: Colors.green, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).processing, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, ), ), ), @@ -349,14 +394,14 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text('564', + child: Text(model.order[0].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('SAR', + child: Text(TranslationBase.of(context).sar, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -375,7 +420,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), Container( margin: EdgeInsets.only(left: 5), - child: Text('items(s)', + child: Text(TranslationBase.of(context).itemsNo, style: TextStyle(fontSize: 14.0, ), ), @@ -396,15 +441,35 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ], ), - ), + ) + : Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/pharmacy/empty_box.svg'), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text(TranslationBase.of(context).noOrder, + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), + ), + ), ); } - Widget getPendingOrder(){ + Widget getPendingOrder(OrderModelViewModel model){ return Container( - child: SingleChildScrollView( - child: Column( - children: [ + child: model.order.length != 0 && model.order[0].orderStatusId == 10 + ? SingleChildScrollView( + child: Column( + children: [ ListView.builder( scrollDirection: Axis.vertical, shrinkWrap: true, @@ -427,13 +492,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Order#:', + child: Text(TranslationBase.of(context).orderNumber, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( - child: Text('3183', + child: Text(model.order[0].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -446,13 +511,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Date', + child: Text(TranslationBase.of(context).orderDate, style: TextStyle(fontSize: 14.0, ), ), ), Container( - child: Text('Aug 12, 2020', + child: Text(model.order[0].createdOnUtc.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -487,27 +552,28 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - margin: EdgeInsets.all(8.0), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange[300], - style: BorderStyle.solid, - width: 5.0, + Expanded( + child:Container( + margin: EdgeInsets.all(8.0), + padding: EdgeInsets.only(left: 13.0, right: 13.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.orange[300], + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.orange[300], + borderRadius: BorderRadius.circular(30.0) ), - color: Colors.orange[300], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).pending, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), + child: Text( + model.order[0].orderStatus.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), ), Container( margin: EdgeInsets.all(8.0), child: Column( @@ -517,14 +583,14 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text('564', + child: Text(model.order[0].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('SAR', + child: Text(TranslationBase.of(context).sar, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -543,7 +609,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), Container( margin: EdgeInsets.only(left: 5), - child: Text('items(s)', + child: Text(TranslationBase.of(context).itemsNo, style: TextStyle(fontSize: 14.0, ), ), @@ -571,13 +637,34 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ) ], ), + ) + : Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/pharmacy/empty_box.svg'), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text(TranslationBase.of(context).noOrder, + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), + ), ), + ); } - Widget getCancelledOrder(){ + Widget getCancelledOrder(OrderModelViewModel model){ return Container( - child: SingleChildScrollView( + child: model.order.length != 0 && model.order[0].orderStatusId == 40 + ? SingleChildScrollView( child: Column( children: [ ListView.builder( @@ -602,13 +689,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Order#:', + child: Text(TranslationBase.of(context).orderNumber, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( - child: Text('3183', + child: Text(model.order[0].id.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -621,13 +708,13 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(right: 5), - child: Text('Date', + child: Text(TranslationBase.of(context).orderDate, style: TextStyle(fontSize: 14.0, ), ), ), Container( - child: Text('Aug 12, 2020', + child: Text(model.order[0].createdOnUtc.toString(), style: TextStyle(fontSize: 14.0, ), ), @@ -662,27 +749,28 @@ class _OrderPageState extends State with SingleTickerProviderStateMix Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 10.0, right: 10.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.red[900], - style: BorderStyle.solid, - width: 5.0, + Expanded( + child:Container( + margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), + padding: EdgeInsets.only(left: 10.0, right: 10.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.red[900], + style: BorderStyle.solid, + width: 5.0, + ), + color: Colors.red[900], + borderRadius: BorderRadius.circular(30.0) ), - color: Colors.red[900], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).cancelled, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), + child: Text( + model.order[0].orderStatus.toString(), + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + fontWeight: FontWeight.bold, + ), + ), + ), ), Container( margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), child: Column( @@ -692,14 +780,14 @@ class _OrderPageState extends State with SingleTickerProviderStateMix children: [ Container( margin: EdgeInsets.only(left: 5), - child: Text('564', + child: Text(model.order[0].orderTotal.toString(), style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), Container( margin: EdgeInsets.only(left: 5), - child: Text('SAR', + child: Text(TranslationBase.of(context).sar, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, ), ), @@ -718,7 +806,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), Container( margin: EdgeInsets.only(left: 5), - child: Text('items(s)', + child: Text(TranslationBase.of(context).itemsNo, style: TextStyle(fontSize: 14.0, ), ), @@ -746,20 +834,32 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ) ], ), - ), + ) + : Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/pharmacy/empty_box.svg'), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text(TranslationBase.of(context).noOrder, + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), + ), + ), ); } } -getOrder() { - print("getOrder no4665"); - OrderService service = new OrderService(); - service.getOrder(AppGlobal.context).then((res) { - print(res); - }); -} // filterOrders() { // for () { diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 777ef1dd..d406e7f5 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -1,4 +1,7 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -17,7 +20,9 @@ class OrderDetailsPage extends StatefulWidget { class _OrderDetailsPageState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); - + String customerId=""; + String page_id=""; + String orderId="3516"; @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) => getOrderDetails()); @@ -26,385 +31,388 @@ class _OrderDetailsPageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).orderDetail, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - color: Colors.white, - child: SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_mark_icon.svg', - width: 28, - height: 28,), - Text(TranslationBase.of(context).shippingAddress, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + return BaseView( + onModelReady:(model) => model.getOrderDetails(orderId), + builder: (_,model, wi )=> AppScaffold( + appBarTitle: (TranslationBase.of(context).orderDetail), +// title: Text(TranslationBase.of(context).orderDetail, style: TextStyle(color:Colors.white)), +// backgroundColor: Colors.green, + isShowAppBar: true, + isPharmacy:true , + body: Container( + color: Colors.white, + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), + child: Row( + children: [ + SvgPicture.asset( + 'assets/images/pharmacy/shipping_mark_icon.svg', + width: 28, + height: 28,), + Text(TranslationBase.of(context).shippingAddress, + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + ), ), - ), - ], + ], + ), ), - ), - Container( - margin: EdgeInsets.only(top: 15.0, right: 10.0), - padding: EdgeInsets.only(left: 11.0, right: 11.0), - decoration: BoxDecoration( - border: Border.all( + Container( + margin: EdgeInsets.only(top: 15.0, right: 10.0), + padding: EdgeInsets.only(left: 11.0, right: 11.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.blue, + style: BorderStyle.solid, + width: 5.0, + ), color: Colors.blue, - style: BorderStyle.solid, - width: 5.0, + borderRadius: BorderRadius.circular(30.0) + ), + child: Text( + TranslationBase.of(context).delivered, + style: TextStyle( + color: Colors.white, + fontSize: 13.0, + fontWeight: FontWeight.bold, ), - color: Colors.blue, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 13.0, - fontWeight: FontWeight.bold, ), ), + ], + ), + Container( + margin: EdgeInsets.only(left: 10.0, top: 13.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('NAME', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + ), + ], ), - ], - ), - Container( - margin: EdgeInsets.only(left: 10.0, top: 13.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Cloud Solutions', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + color: Colors.grey, + ), ), - ), - ], + ], + ), ), - ), - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + Row( children: [ - Text('Cloud Solutions', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - color: Colors.grey, + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/mobile_number_icon.svg', + height: 13,), + ), + Container( + margin: EdgeInsets.only(top: 5.0, bottom: 5.0), + child: Text('588888778', + style: TextStyle(fontSize: 15.0, + ), ), ), ], ), - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), - ), - Container( - margin: EdgeInsets.only(top: 5.0, bottom: 5.0), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, - ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 10.0, 5.0, 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/shipping_truck_icon.svg', + height: 20, + width: 20,), ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 10.0, 5.0, 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/shipping_truck_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.all(10.0), - child:Text(TranslationBase.of(context).shippedMethod, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + Container( + margin: EdgeInsets.all(10.0), + child:Text(TranslationBase.of(context).shippedMethod, + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, + ), ), ), - ), - Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/hmg_shipping_logo.svg', - height: 25, - width: 25,), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 10.0, 1.0, 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/credit_card_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.all(10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/credit_card_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child:Text('Mada', - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, - ), + Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/hmg_shipping_logo.svg', + height: 25, + width: 25,), ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - Container( - padding: EdgeInsets.only(bottom: 15.0), - margin: EdgeInsets.only(left: 10.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TranslationBase.of(context).orderDetail, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), ], ), - ), - Container( - child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, - productReviews:4, totalPrice: '10.00', qyt: '3',), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(left: 10.0, top: 5.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TranslationBase.of(context).orderSummary, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Row( + children: [ + Container( + margin: EdgeInsets.fromLTRB(10.0, 10.0, 1.0, 10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/credit_card_icon.svg', + height: 20, + width: 20,), + ), + Container( + margin: EdgeInsets.all(10.0), + child: SvgPicture.asset( + 'assets/images/pharmacy/credit_card_icon.svg', + height: 20, + width: 20,), + ), + Container( + margin: EdgeInsets.only(bottom: 10.0, top: 10.0), + child:Text('Mada', + style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, ), ), + ), ], ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), - child: Text( - TranslationBase.of(context).subtotal, - style: TextStyle( - fontSize: 13.0, - ), - ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, - ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 8, + indent: 0, + endIndent: 0, + ), + Container( + padding: EdgeInsets.only(bottom: 15.0), + margin: EdgeInsets.only(left: 10.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(TranslationBase.of(context).orderDetail, + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), - Text('343.55', - style: TextStyle(fontSize: 13.0, + ], + ), + ), + Container( + child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, + productReviews:4, totalPrice: '10.00', qyt: '3',), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(left: 10.0, top: 5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(TranslationBase.of(context).orderSummary, + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, ), ), - ], - ), + ], ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), - child: Text( - TranslationBase.of(context).shipping, - style: TextStyle( - fontSize: 13.0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + child: Text( + TranslationBase.of(context).subtotal, + style: TextStyle( + fontSize: 13.0, + ), ), ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), ), ), - ), - Text('343.55', - style: TextStyle(fontSize: 13.0, + Text('343.55', + style: TextStyle(fontSize: 13.0, + ), ), - ), - ], + ], + ), ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), - child: Text( - TranslationBase.of(context).vat, - style: TextStyle( - fontSize: 13.0, + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0, left: 10.0 ), + child: Text( + TranslationBase.of(context).shipping, + style: TextStyle( + fontSize: 13.0, + ), ), ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), + ), + ), + Text('343.55', style: TextStyle(fontSize: 13.0, ), ), + ], + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + child: Text( + TranslationBase.of(context).vat, + style: TextStyle( + fontSize: 13.0, ), - Text('343.55', - style: TextStyle(fontSize: 13.0, + ), + ), + Container( + padding: EdgeInsets.only(bottom: 10.0), + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 13.0, + ), + ), ), - ), - ], + Text('343.55', + style: TextStyle(fontSize: 13.0, + ), + ), + ], + ), ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), - child: Text( - TranslationBase.of(context).total, - style: TextStyle( - fontSize: 15.0,fontWeight: FontWeight.bold, + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.only(top: 5.0,left: 10.0 ), + child: Text( + TranslationBase.of(context).total, + style: TextStyle( + fontSize: 15.0,fontWeight: FontWeight.bold, + ), ), ), - ), - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold, + Container( + margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.0), + child: Text(TranslationBase.of(context).sar, + style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold, + ), ), ), - ), - Text('343.55', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + Text('343.55', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), ), - ), - ], + ], + ), ), - ), - ], - ), - InkWell( - onTap: (){ - }, - child: Container( - margin: EdgeInsets.only(top: 20.0), - height: 50.0, - color: Colors.transparent, + ], + ), + InkWell( + onTap: (){ + }, child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).payOnline, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + margin: EdgeInsets.only(top: 20.0), + height: 50.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).payOnline, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), ), ), ), ), - ), - InkWell( - onTap: () { + InkWell( + onTap: () { // confirmDelete(snapshot.data[index]["id"]); - cancelOrder("id"); - }, - child: Container( - height: 50.0, - color: Colors.transparent, - child: Center( - child: Text( - TranslationBase.of(context).cancelOrder, - style: TextStyle( - color: Colors.red[900], - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline + cancelOrder("id"); + }, + child: Container( + height: 50.0, + color: Colors.transparent, + child: Center( + child: Text( + TranslationBase.of(context).cancelOrder, + style: TextStyle( + color: Colors.red[900], + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline + ), ), ), ), - ), - ), - ], + ), + ], + ), ), ), ), diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart index bc19e510..30fd4cd6 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart @@ -60,18 +60,18 @@ class _AddAddressState extends State { zoom: 13.0, ), ), - Align( - alignment: Alignment.topRight, - child: Column( - children: [ - button(_onMapTypeButtonPressed,Icons.map), - SizedBox( - height:16.0, - ), - button(_onAddMarkerButtonPressed, Icons.add_location) - ], - ), - ), +// Align( +// alignment: Alignment.topRight, +// child: Column( +// children: [ +// button(_onMapTypeButtonPressed,Icons.map), +// SizedBox( +// height:16.0, +// ), +// button(_onAddMarkerButtonPressed, Icons.add_location) +// ], +// ), +// ), ] ), bottomSheet: InkWell( @@ -112,16 +112,16 @@ class _AddAddressState extends State { } - Widget button(Function function, IconData icon){ - return FloatingActionButton( - onPressed: function, - materialTapTargetSize: MaterialTapTargetSize.padded, - backgroundColor: Colors.red, - child: Icon( - icon, - size: 18.0, - ),); - } +// Widget button(Function function, IconData icon){ +// return FloatingActionButton( +// onPressed: function, +// materialTapTargetSize: MaterialTapTargetSize.padded, +// backgroundColor: Colors.red, +// child: Icon( +// icon, +// size: 18.0, +// ),); +// } } diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart index 2de45546..44df964d 100644 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart @@ -1,4 +1,7 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -23,7 +26,7 @@ class _PharmacyAddressesState extends State{ @override void initState(){ - WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); +// WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); super.initState(); selectedRadio=0; @@ -35,269 +38,273 @@ class _PharmacyAddressesState extends State{ } Widget build (BuildContext context){ - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - child:SingleChildScrollView( - child: Column( - children:[ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 5 , - itemBuilder: (context, index){ - return Container( - child: Padding( - padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InkWell( - onTap: () { - setState(() { - _value = !_value; - }); - }, - child: Container( - margin: EdgeInsets.only(right: 20), + return BaseView( + onModelReady: (model) => model.getAddress(), + builder: (_,model, wi )=> AppScaffold( + appBarTitle: "", +// centerTitle: true, +// title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), +// backgroundColor: Colors.green, + isShowAppBar: true, + isPharmacy:true , + body: Container( + child:SingleChildScrollView( + child: Column( + children:[ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: 5 , + itemBuilder: (context, index){ + return Container( + child: Padding( + padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + InkWell( + onTap: () { + setState(() { + _value = !_value; + }); + }, + child: Container( + margin: EdgeInsets.only(right: 20), - child: Padding( - padding: const EdgeInsets.all(5.0), - child: _value - ? Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 25, - width: 25,), - ) - : Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 23, - width: 23, - color: Colors.transparent, - ), - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(50.0) + child: Padding( + padding: const EdgeInsets.all(5.0), + child: _value + ? Container( + child: SvgPicture.asset( + 'assets/images/pharmacy/check_icon.svg', + height: 25, + width: 25,), + ) + : Container( + child: SvgPicture.asset( + 'assets/images/pharmacy/check_icon.svg', + height: 23, + width: 23, + color: Colors.transparent, ), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(50.0) ), + ), + ), ), ), - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - SizedBox( - height: 5,), - Text('Address', - style: TextStyle(fontSize: 15.0, color: Colors.grey, + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('NAME', + style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, + ), ), - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(bottom: 8), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), + SizedBox( + height: 5,), + Text('Address', + style: TextStyle(fontSize: 15.0, color: Colors.grey, ), - Container( - margin: EdgeInsets.only(left: 10, bottom: 8), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, + ), + SizedBox( + height: 5,), + Row( + children: [ + Container( + margin: EdgeInsets.only(bottom: 8), + child: SvgPicture.asset( + 'assets/images/pharmacy/mobile_number_icon.svg', + height: 13,), + ), + Container( + margin: EdgeInsets.only(left: 10, bottom: 8), + child: Text('588888778', + style: TextStyle(fontSize: 15.0, + ), ), ), - ), - ], - ), - SizedBox( - height: 15,), - Row( - children: [ - Column( - children: [ - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right:10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/edit_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(right:5, bottom: 15), - padding: EdgeInsets.only(right: 10.0), - child: Text(TranslationBase.of(context).edit, - style: TextStyle(fontSize: 15.0, - color: Colors.blue, - ), + ], + ), + SizedBox( + height: 15,), + Row( + children: [ + Column( + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right:10, bottom: 15), + child: SvgPicture.asset( + 'assets/images/pharmacy/edit_icon.svg', + height: 15,), ), - decoration: BoxDecoration( - border: Border( - right: BorderSide( - color: Colors.grey, - width: 1.0, + Container( + margin: EdgeInsets.only(right:5, bottom: 15), + padding: EdgeInsets.only(right: 10.0), + child: Text(TranslationBase.of(context).edit, + style: TextStyle(fontSize: 15.0, + color: Colors.blue, ), - ), - ), - ), - ], + ), + decoration: BoxDecoration( + border: Border( + right: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + ), + ), + ], + ), ), - ), - ], - ), - Column( - children: [ - InkWell( - onTap: () { + ], + ), + Column( + children: [ + InkWell( + onTap: () { // confirmDelete(snapshot.data[index]["id"]); - confirmDelete("address"); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(left: 15, right: 10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/delete_red_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(bottom: 15), - child: Text(TranslationBase.of(context).delete, - style: TextStyle(fontSize: 15.0, - color: Colors.redAccent, + confirmDelete("address"); + }, + child: Row( + children: [ + Container( + margin: EdgeInsets.only(left: 15, right: 10, bottom: 15), + child: SvgPicture.asset( + 'assets/images/pharmacy/delete_red_icon.svg', + height: 15,), + ), + Container( + margin: EdgeInsets.only(bottom: 15), + child: Text(TranslationBase.of(context).delete, + style: TextStyle(fontSize: 15.0, + color: Colors.redAccent, + ), ), ), - ), - ], + ], + ), ), - ), - ], - ) - ], - ), - ], - ), - SizedBox( - height: 10, - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 6, - indent: 0, - endIndent: 0, - ), - ], + ], + ) + ], + ), + ], + ), + SizedBox( + height: 10, + ), + ], + ), + Divider( + color: Colors.grey[350], + height: 20, + thickness: 6, + indent: 0, + endIndent: 0, + ), + ], + ), ), - ), - ); - } - ), - SizedBox( - height: 10, - ), - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - margin: EdgeInsets.only(bottom: 100.0), - height: 50.0, - color: Colors.transparent, + ); + } + ), + SizedBox( + height: 10, + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).addAddress, - style: TextStyle( + margin: EdgeInsets.only(bottom: 100.0), + height: 50.0, + color: Colors.transparent, + child: Container( + decoration: BoxDecoration( + border: Border.all( color: Colors.green, - fontWeight: FontWeight.bold, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.transparent, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text( + TranslationBase.of(context).addAddress, + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), ), ), ), ), ), - ), - ], + ], + ), ), ), - ), - bottomSheet: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - height: 50.0, - color: Colors.green, + bottomSheet: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AddAddressPage(); + }), + ); + }, child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text(TranslationBase.of(context).confirmAddress, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + height: 50.0, + color: Colors.green, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 1.0 + ), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0) + ), + child: Center( + child: Text(TranslationBase.of(context).confirmAddress, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), ), ), ), @@ -347,11 +354,11 @@ class _PharmacyAddressesState extends State{ } getAllAddress() { - print("ADDRESSES"); - PharmacyAddressService service = new PharmacyAddressService(); - service.getAddress(AppGlobal.context).then((res) { - print(res); - }); +// print("ADDRESSES"); +// PharmacyAddressService service = new PharmacyAddressService(); +// service.getAddress(AppGlobal.context).then((res) { +// print(res); +// }); } diff --git a/lib/services/pharmacy_services/orderDetails_service.dart b/lib/services/pharmacy_services/orderDetails_service.dart index b8201dc6..fb58097f 100644 --- a/lib/services/pharmacy_services/orderDetails_service.dart +++ b/lib/services/pharmacy_services/orderDetails_service.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; @@ -16,24 +17,23 @@ class OrderDetailsService extends BaseService{ AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); - Future getOrderDetails(BuildContext context ) async { + List get orderDetails => orderDetails; + List _orderList = List(); + List get orderList => _orderList; - if (await this.sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson( - await this.sharedPref.getObject(USER_PROFILE)); - authUser = data; - } - dynamic localRes; - String URL; - URL = GET_ORDER_DETAILS; - - await baseAppClient.get(URL, - onSuccess: (response, statusCode) async { - localRes = response; + Future getOrderDetails(orderId) async { + print("step 1"); + hasError = false; + await baseAppClient.getPharmacy(GET_ORDER_DETAILS+orderId, + onSuccess: (dynamic response, int statusCode) { + _orderList.clear(); + response['orders'].forEach((item) { + _orderList.add(OrderModel.fromJson(item)); + }); }, onFailure: (String error, int statusCode) { - throw error; + hasError = true; + super.error = error; }); - return Future.value(localRes); } } \ No newline at end of file diff --git a/lib/services/pharmacy_services/order_service.dart b/lib/services/pharmacy_services/order_service.dart index 6e44a18b..d43d417b 100644 --- a/lib/services/pharmacy_services/order_service.dart +++ b/lib/services/pharmacy_services/order_service.dart @@ -5,34 +5,57 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; class OrderService extends BaseService{ - AppSharedPreferences sharedPref = AppSharedPreferences(); AppGlobal appGlobal = new AppGlobal(); - AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); - Future getOrder(BuildContext context ) async { - - if (await this.sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson( - await this.sharedPref.getObject(USER_PROFILE)); - authUser = data; - } - - dynamic localRes; - String URL; - URL = GET_ORDER; - - await baseAppClient.get(URL, - onSuccess: (response, statusCode) async { - localRes = response; + List _orderList = List(); + List get orderList => _orderList; +String url =""; + + Future getOrder(custmerId, page_id) async { + print("step 1"); + hasError = false; + url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; +// url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=$page_id&limit=200&customer_id=$custmerId"; + print(url); + await baseAppClient.getPharmacy(url, + onSuccess: (dynamic response, int statusCode) { + _orderList.clear(); + response['orders'].forEach((item) { + _orderList.add(OrderModel.fromJson(item)); + }); + print(response); }, onFailure: (String error, int statusCode) { - throw error; + hasError = true; + super.error = error; }); - return Future.value(localRes); } + + +// Future getOrder(BuildContext context ) async { +// +// if (await this.sharedPref.getObject(USER_PROFILE) != null) { +// var data = AuthenticatedUser.fromJson( +// await this.sharedPref.getObject(USER_PROFILE)); +// authUser = data; +// } +// +// dynamic localRes; +// String URL; +// URL = GET_ORDER; +// +// await baseAppClient.get(URL, +// onSuccess: (response, statusCode) async { +// localRes = response; +// }, onFailure: (String error, int statusCode) { +// throw error; +// }); +// return Future.value(localRes); +// } } \ No newline at end of file diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart index 624dd87e..eae5ac8c 100644 --- a/lib/services/pharmacy_services/pharmacyAddress_service.dart +++ b/lib/services/pharmacy_services/pharmacyAddress_service.dart @@ -5,36 +5,32 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; class PharmacyAddressService extends BaseService{ + List get address => address; AppSharedPreferences sharedPref = AppSharedPreferences(); AppGlobal appGlobal = new AppGlobal(); - AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); - Future getAddress(BuildContext context ) async { - - if (await this.sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson( - await this.sharedPref.getObject(USER_PROFILE)); - authUser = data; - } - - dynamic localRes; - String URL; + List _addressList = List(); + List get reviewList => _addressList; -// URL = GET_ADDRESS+'272843?fields=addresses'; - URL = GET_ADDRESS; - await baseAppClient.get(URL, - onSuccess: (response, statusCode) async { - localRes = response; + Future getAddress() async { + print("step 1"); + hasError = false; + await baseAppClient.getPharmacy(GET_ORDER, + onSuccess: (dynamic response, int statusCode) { + _addressList.clear(); + response['customers'].forEach((item) { + _addressList.add(PharmacyAddressesModel.fromJson(item)); + }); }, onFailure: (String error, int statusCode) { - throw error; + hasError = true; + super.error = error; }); - return Future.value(localRes); - } -} \ No newline at end of file + }} \ No newline at end of file diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 932ad3fa..345592d7 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -760,6 +760,10 @@ class TranslationBase { String get orderLog => localizedValues['OrderLog'][locale.languageCode]; // String get infoLab => localizedValues['info-lab'][locale.languageCode]; // String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; + String get orderNumber => localizedValues['orderNumber'][locale.languageCode]; + String get orderDate => localizedValues['orderDate'][locale.languageCode]; + String get itemsNo => localizedValues['itemsNo'][locale.languageCode]; + String get noOrder => localizedValues['noOrder'][locale.languageCode]; // pharmacy module // String get medicationRefill => localizedValues['medicationRefill'][locale.languageCode]; From e5feef8a9dbe477fcdb9e4c503a87546717dc0b4 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 29 Nov 2020 12:17:46 +0300 Subject: [PATCH 15/69] Updates & UI Fixes --- lib/config/localized_values.dart | 8 +++++ lib/pages/BookAppointment/BookSuccess.dart | 2 +- .../MyAppointments/models/ArrivedButtons.dart | 32 +++++++++---------- .../widgets/AppointmentActions.dart | 14 ++++---- lib/pages/landing/home_page.dart | 2 +- .../medical/vital_sign/vital_sign_item.dart | 6 ++-- lib/uitl/translations_delegate_base.dart | 1 + .../medical/medical_profile_item.dart | 2 +- 8 files changed, 38 insertions(+), 29 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 0ced0591..95ae6d74 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1035,5 +1035,13 @@ const Map localizedValues = { "en": "Email the Report", "ar": "أرسل التقرير" }, + "appoSurvey": { + "en": "Survey", + "ar": "إستبيان" + }, + "appoSurveySubtitle": { + "en": "Survey", + "ar": "إستبيان" + }, }; diff --git a/lib/pages/BookAppointment/BookSuccess.dart b/lib/pages/BookAppointment/BookSuccess.dart index 82248560..92e6bc9e 100644 --- a/lib/pages/BookAppointment/BookSuccess.dart +++ b/lib/pages/BookAppointment/BookSuccess.dart @@ -554,7 +554,7 @@ class _BookSuccessState extends State { AppoitmentAllHistoryResultList appo) async { if (paymentMethod == "ApplePay") { await widget.chromeBrowser.open( - url: "https://flutter.dev/", + url: "https://applepay-datatrans-sample.herokuapp.com/", options: ChromeSafariBrowserClassOptions( android: AndroidChromeCustomTabsOptions( addDefaultShareMenuItem: false), diff --git a/lib/pages/MyAppointments/models/ArrivedButtons.dart b/lib/pages/MyAppointments/models/ArrivedButtons.dart index a89253c6..a30349ba 100644 --- a/lib/pages/MyAppointments/models/ArrivedButtons.dart +++ b/lib/pages/MyAppointments/models/ArrivedButtons.dart @@ -4,32 +4,32 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class ArrivedButtons { static var buttons = [ { - "title": "Arrived", - "subtitle": "Status", + "title": TranslationBase.of(AppGlobal.context).arrived, + "subtitle": TranslationBase.of(AppGlobal.context).status, "icon": "assets/images/new-design/waiting-room.png", "caller": "openReschedule" }, { - "title": "Medicines", - "subtitle": "Prescriptions", + "title": TranslationBase.of(AppGlobal.context).medicines, + "subtitle": TranslationBase.of(AppGlobal.context).medicinesSubtitle, "icon": "assets/images/new-design/medicine_prescriptions_icon.png", "caller": "prescriptions" }, { - "title": "Radiology", - "subtitle": "Services", + "title": TranslationBase.of(AppGlobal.context).radiology, + "subtitle": TranslationBase.of(AppGlobal.context).radiologySubtitle, "icon": "assets/images/new-design/radiology_service_icon.png", "caller": "radiology" }, { - "title": "Lab", - "subtitle": "Result", + "title": TranslationBase.of(AppGlobal.context).lab, + "subtitle": TranslationBase.of(AppGlobal.context).labSubtitle, "icon": "assets/images/new-design/lab_result_icon.png", "caller": "labResult" }, { - "title": "Vital Signs", - "subtitle": "Values", + "title": TranslationBase.of(AppGlobal.context).vitalSigns, + "subtitle": TranslationBase.of(AppGlobal.context).vitalSignsSubtitle, "icon": "assets/images/new-design/vital_signs.png", "caller": "VitalSigns" }, @@ -40,20 +40,20 @@ class ArrivedButtons { "caller": "insertComplaint" }, { - "title": "Insurance", - "subtitle": "Approvals", + "title": TranslationBase.of(AppGlobal.context).insurance, + "subtitle": TranslationBase.of(AppGlobal.context).insuranceSubtitle, "icon": "assets/images/new-design/insurance_approvals_icon.png", "caller": "Insurance" }, { - "title": "Ask Your", - "subtitle": "Doctor", + "title": TranslationBase.of(AppGlobal.context).askYour, + "subtitle": TranslationBase.of(AppGlobal.context).askYourSubtitle, "icon": "assets/images/new-design/ask_doctor_icon.png", "caller": "askDoc" }, { - "title": "Survey", - "subtitle": "Service", + "title": TranslationBase.of(AppGlobal.context).appoSurvey, + "subtitle": TranslationBase.of(AppGlobal.context).service, "icon": "assets/images/new-design/survey.png", "caller": "Survey" } diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index 7bb45bad..93069f1e 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -53,7 +53,7 @@ class _AppointmentActionsState extends State { @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; - final double itemHeight = ((size.height - kToolbarHeight - 24) * 0.42) / 2; + final double itemHeight = ((size.height - kToolbarHeight - 24) * 0.455) / 2; final double itemWidth = size.width / 2; return Container( @@ -73,8 +73,8 @@ class _AppointmentActionsState extends State { _handleButtonClicks(e); }, child: Container( - height: 100.0, - margin: EdgeInsets.all(9.0), + // height: 100.0, + margin: EdgeInsets.all(7.0), decoration: BoxDecoration( boxShadow: [ BoxShadow( @@ -90,17 +90,17 @@ class _AppointmentActionsState extends State { children: [ Container( margin: - EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 0.0), + EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 0.0), child: Text(e.title, overflow: TextOverflow.clip, style: TextStyle( color: new Color(0xFF40ACC9), letterSpacing: 1.0, - fontSize: 20.0)), + fontSize: 18.0)), ), Container( margin: - EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0), + EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0), child: Text(e.subtitle, overflow: TextOverflow.clip, style: TextStyle( @@ -113,7 +113,7 @@ class _AppointmentActionsState extends State { margin: EdgeInsets.fromLTRB(0.0, 10.0, 10.0, 7.0), child: Image.asset(e.icon, - width: 45.0, height: 45.0), + width: 40.0, height: 40.0), ), ], ), diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 6716535b..a98bb8eb 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -734,7 +734,7 @@ class _HomePageState extends State { ], ), ), - height: 100, + height: 106, imageName: 'rectangle.png', color: Colors.grey[700], width: MediaQuery.of(context).size.width * 0.45, diff --git a/lib/pages/medical/vital_sign/vital_sign_item.dart b/lib/pages/medical/vital_sign/vital_sign_item.dart index fb44772d..fd3fdbdf 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item.dart @@ -46,7 +46,7 @@ class VitalSignItem extends StatelessWidget { des, style: TextStyle( fontSize: 1.7 * SizeConfig.textMultiplier, - color: HexColor('#B8382C'), + color: Color(0xff40ACC9), fontWeight: FontWeight.bold, ), ), @@ -78,9 +78,9 @@ class VitalSignItem extends StatelessWidget { children: [ TextSpan(text: lastVal), TextSpan( - text: unit, + text: " " + unit, style: TextStyle( - color: HexColor('#B8382C'), + color: Color(0xff40ACC9), ), ), ]), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 6e991e01..ab32218e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -866,6 +866,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get report => localizedValues['report'][locale.languageCode]; String get openRad => localizedValues['open-rad'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; + String get appoSurvey => localizedValues['appoSurvey'][locale.languageCode]; } diff --git a/lib/widgets/data_display/medical/medical_profile_item.dart b/lib/widgets/data_display/medical/medical_profile_item.dart index 6aadb3e0..8c14fb02 100644 --- a/lib/widgets/data_display/medical/medical_profile_item.dart +++ b/lib/widgets/data_display/medical/medical_profile_item.dart @@ -25,7 +25,7 @@ class MedicalProfileItem extends StatelessWidget { showBorder: true, borderWidth: 0, margin: 4, - height: 120, + // height: 120, // MediaQuery.of(context).size.height * 0.12, child: Container( //width: MediaQuery.of(context).size.width * 0.25, From 340b9770c8a54b535a827d496f6c4cf0350490ab Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sun, 29 Nov 2020 12:51:07 +0300 Subject: [PATCH 16/69] login --- lib/core/service/client/base_app_client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index ff7e7776..60142fc6 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -140,7 +140,7 @@ class BaseAppClient { parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); } else if (!parsed['IsAuthenticated']) { - await logout(); + // await logout(); //helpers.showErrorToast('Your session expired Please login agian'); } else { From 603833db3743e84c7c3f981d82b8415d2a99e46e Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sun, 29 Nov 2020 12:51:27 +0300 Subject: [PATCH 17/69] login changes --- lib/pages/DrawerPages/family/my-family.dart | 93 ++++++++++++++++--- lib/pages/landing/home_page.dart | 12 +-- .../family_files/family_files_provider.dart | 45 ++++----- lib/widgets/drawer/app_drawer_widget.dart | 4 +- 4 files changed, 111 insertions(+), 43 deletions(-) diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 0e6d86bf..f8c6b121 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -1,12 +1,18 @@ import 'dart:ui'; import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; @@ -21,6 +27,7 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/routes.dart'; +import 'package:provider/provider.dart'; class MyFamily extends StatefulWidget { final bool isAppbarVisible; @@ -35,15 +42,23 @@ class _MyFamily extends State with TickerProviderStateMixin { var userID; TabController _tabController; int _tabIndex = 0; + AuthenticatedUserObject authenticatedUserObject = + locator(); + AppointmentRateViewModel appointmentRateViewModel = + locator(); + ProjectViewModel projectViewModel; + AuthenticatedUser user; @override void initState() { _tabController = new TabController(length: 2, vsync: this, initialIndex: 0); - + checkUserData(); super.initState(); } bool expandFlag = false; Widget build(BuildContext context) { + projectViewModel = Provider.of(context); + return AppScaffold( appBarTitle: TranslationBase.of(context).myFamilyFiles, isShowAppBar: widget.isAppbarVisible, @@ -117,14 +132,14 @@ class _MyFamily extends State with TickerProviderStateMixin { body: Column( children: [ Expanded( - child: TabBarView( + child: (user != null && projectViewModel.isLogin) ? TabBarView( physics: BouncingScrollPhysics(), controller: _tabController, children: [ myFamilyDetails(context), myFamilyRequest(context) ], - ), + ) : Container(child:AppText('Loading..')), ) ], ), @@ -540,12 +555,14 @@ class _MyFamily extends State with TickerProviderStateMixin { } Future getFamilyFiles() async { - if (await sharedPref.getObject(FAMILY_FILE) != null) { - // print(await sharedPref.getObject(FAMILY_FILE)); - return Future.value(GetAllSharedRecordsByStatusResponse.fromJson( - await sharedPref.getObject(FAMILY_FILE))); - } else { - return familyFileProvider.getSharedRecordByStatus(); + if (user != null) { + if (await sharedPref.getObject(FAMILY_FILE) != null) { + // print(await sharedPref.getObject(FAMILY_FILE)); + return Future.value(GetAllSharedRecordsByStatusResponse.fromJson( + await sharedPref.getObject(FAMILY_FILE))); + } else { + return familyFileProvider.getSharedRecordByStatus(); + } } } @@ -592,20 +609,55 @@ class _MyFamily extends State with TickerProviderStateMixin { } switchUser(user, context) { - GifLoaderDialogUtils.showMyDialog(context); + GifLoaderDialogUtils.showMyDialog(context); + // this + // .familyFileProvider + // .silentLoggin(user) + // .then((value) => loginAfter(value, context)); + + // Utils.showProgressDialog(context); this .familyFileProvider - .silentLoggin(user) - .then((value) => loginAfter(value, context)); + .silentLoggin(user is AuthenticatedUser ? null : user, + mainUser: user is AuthenticatedUser) + .then((value) => loginAfter(value, context)) + .catchError((err) { + print(err); + AppToast.showErrorToast(message: err); + Navigator.of(context).pop(); + }); } loginAfter(result, context) async{ GifLoaderDialogUtils.hideDialog(context); - var familyFile = await sharedPref.getObject(FAMILY_FILE); + // var familyFile = await sharedPref.getObject(FAMILY_FILE); + // var mainUser = await sharedPref.getObject(MAIN_USER); + // result = CheckActivationCode.fromJson(result); + // this.sharedPref.clear(); + // this.sharedPref.setObject(FAMILY_FILE, familyFile); + // this.sharedPref.setObject(MAIN_USER, mainUser); + // result.list.isFamily = true; + // this.sharedPref.setObject(USER_PROFILE, result.list); + // this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); + // this.sharedPref.setString(TOKEN, result.authenticationTokenID); + // + // authenticatedUserObject.isLogin = true; + // appointmentRateViewModel.isLogin = true; + // projectViewModel.isLogin = true; + // //this.checkIfUserAgreedBefore(result), + // Navigator.of(context).pushNamed( + // HOME, + // ); result = CheckActivationCode.fromJson(result); + var familyFile = await sharedPref.getObject(FAMILY_FILE); + var mainUser = await sharedPref.getObject(MAIN_USER); this.sharedPref.clear(); - this.sharedPref.setObject(FAMILY_FILE, familyFile); + if (mainUser["PatientID"] != result.list.patientID) { + result.list.isFamily = true; + } + this.sharedPref.setObject(MAIN_USER, mainUser); this.sharedPref.setObject(USER_PROFILE, result.list); + this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); //this.checkIfUserAgreedBefore(result), @@ -634,4 +686,17 @@ class _MyFamily extends State with TickerProviderStateMixin { refreshFamily(context) }); } + checkUserData() async{ + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + + var data2 = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(MAIN_USER)); + print(data2); + setState(() { + this.user = data; + }); + } + } } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 6716535b..843dd462 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -43,12 +43,12 @@ class _HomePageState extends State { ToDoCountProviderModel toDoProvider; @override - void initState() { - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - getToDoCount(); - }); - super.initState(); - } + // void initState() { + // WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + // getToDoCount(); + // }); + // super.initState(); + // } AuthenticatedUserObject authenticatedUserObject = locator(); diff --git a/lib/services/family_files/family_files_provider.dart b/lib/services/family_files/family_files_provider.dart index ea2b87fd..0b0c1ef5 100644 --- a/lib/services/family_files/family_files_provider.dart +++ b/lib/services/family_files/family_files_provider.dart @@ -37,8 +37,10 @@ const String SENT_REQUEST_URL = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; const String RECEVIED_REQUEST_URL = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId'; -const ACCEPT_REJECT_FAMILY = 'Services/Authentication.svc/REST/Update_FileStatus'; -const DEACTIVATE_FAMILY = 'Services/Authentication.svc/REST/DeactivateRequestByRensponse'; +const ACCEPT_REJECT_FAMILY = + 'Services/Authentication.svc/REST/Update_FileStatus'; +const DEACTIVATE_FAMILY = + 'Services/Authentication.svc/REST/DeactivateRequestByRensponse'; class FamilyFilesProvider with ChangeNotifier { bool isLogin = false; @@ -49,7 +51,9 @@ class FamilyFilesProvider with ChangeNotifier { try { dynamic localRes; var request = GetAllSharedRecordsByStatusReq(); + var result = await sharedPref.getObject(MAIN_USER); request.status = 0; + request.patientID = result["PatientID"]; await new BaseAppClient().post(GET_SHARED_RECORD_BY_STATUS, onSuccess: (dynamic response, int statusCode) { localRes = response; @@ -57,7 +61,7 @@ class FamilyFilesProvider with ChangeNotifier { AppToast.showErrorToast(message: error); throw error; }, body: request.toJson()); - + sharedPref.setObject(FAMILY_FILE, localRes); return Future.value( GetAllSharedRecordsByStatusResponse.fromJson(localRes)); @@ -80,7 +84,7 @@ class FamilyFilesProvider with ChangeNotifier { return Future.error(error); }, body: request); if (localRes != null) { - sharedPref.setObject(FAMILY_FILE, localRes); + // sharedPref.setObject(FAMILY_FILE, localRes); allSharedRecordsByStatusResponse = GetAllSharedRecordsByStatusResponse.fromJson(localRes); return Future.value(allSharedRecordsByStatusResponse); @@ -105,7 +109,7 @@ class FamilyFilesProvider with ChangeNotifier { //AppToast.showErrorToast(message: error); //throw error; }, body: request); - sharedPref.setObject(FAMILY_FILE, localRes); + //sharedPref.setObject(FAMILY_FILE, localRes); return Future.value( GetAllSharedRecordsByStatusResponse.fromJson(localRes)); } catch (error) { @@ -251,9 +255,9 @@ class FamilyFilesProvider with ChangeNotifier { Future silentLoggin(GetAllSharedRecordsByStatusList switchUser, {onSuccess, mainUser}) async { Map request = {}; - if(mainUser ==true){ + if (mainUser == true) { var currentUser = - AuthenticatedUser.fromJson(await sharedPref.getObject(MAIN_USER)); + AuthenticatedUser.fromJson(await sharedPref.getObject(MAIN_USER)); //const request = new SwitchUserRequest(); request['LogInTokenID'] = ''; request['PatientOutSA'] = currentUser.outSA; //? 1 : 0; @@ -267,9 +271,9 @@ class FamilyFilesProvider with ChangeNotifier { request['ZipCode'] = currentUser.outSA == 1 ? "971" : "966"; request['activationCode'] = '0000'; request['isRegister'] = false; - }else { + } else { var currentUser = - AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); + AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); //const request = new SwitchUserRequest(); request['LogInTokenID'] = ''; @@ -309,11 +313,11 @@ class FamilyFilesProvider with ChangeNotifier { await new BaseAppClient().post(ACCEPT_REJECT_FAMILY, onSuccess: (dynamic response, int statusCode) { - localRes = response; - }, onFailure: (String error, int statusCode) { - AppToast.showErrorToast(message: error); - throw error; - }, body: request); + localRes = response; + }, onFailure: (String error, int statusCode) { + AppToast.showErrorToast(message: error); + throw error; + }, body: request); return Future.value(localRes); } catch (error) { @@ -321,17 +325,18 @@ class FamilyFilesProvider with ChangeNotifier { throw error; } } + Future deactivateFamily(request) async { try { dynamic localRes; await new BaseAppClient().post(DEACTIVATE_FAMILY, onSuccess: (dynamic response, int statusCode) { - localRes = response; - }, onFailure: (String error, int statusCode) { - AppToast.showErrorToast(message: error); - throw error; - }, body: request); + localRes = response; + }, onFailure: (String error, int statusCode) { + AppToast.showErrorToast(message: error); + throw error; + }, body: request); return Future.value(localRes); } catch (error) { @@ -339,6 +344,4 @@ class FamilyFilesProvider with ChangeNotifier { throw error; } } - - } diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index f9658c02..bbe007d6 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -155,7 +155,7 @@ class _AppDrawerState extends State { ? Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - InkWell( + user.isFamily ==null || user.isFamily ==false ? InkWell( child: DrawerItem( TranslationBase.of(context).family, Icons.group, @@ -169,7 +169,7 @@ class _AppDrawerState extends State { MY_FAMILIY, ); }, - ), + ) : SizedBox(), FutureBuilder( future: getFamilyFiles(), // async work builder: (BuildContext context, From a87855f445e07761791a0173a28304e196a0171f Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 29 Nov 2020 12:31:52 +0200 Subject: [PATCH 18/69] Fix issues on hhc module --- lib/config/config.dart | 4 +- lib/config/localized_values.dart | 3 + .../home_health_care_service.dart | 5 +- .../home_health_care_index_page.dart | 69 ------------------- .../HomeHealthCare/home_health_care_page.dart | 2 + lib/pages/landing/home_page.dart | 4 +- lib/uitl/translations_delegate_base.dart | 2 + 7 files changed, 15 insertions(+), 74 deletions(-) delete mode 100644 lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index c67e2990..c034d2fc 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,7 +6,7 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; @@ -336,6 +336,8 @@ const PATIENT_ER_UPDATE_PRES_ORDER ="Services/Patients.svc/REST/PatientER_Update const GET_ORDER_DETAIL_BY_ID ="Services/Patients.svc/REST/PatientER_HHC_GetTransactionsForOrder"; const GET_CMC_ORDER_DETAIL_BY_ID ="Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder"; const GET_CHECK_UP_ITEMS ="Services/Patients.svc/REST/GetCheckUpItems"; +const GET_PATIENT_ALL_PRES_ORD= 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; + const TIMER_MIN = 10; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index fbdf2ab5..c92ad50e 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -667,5 +667,8 @@ const Map> localizedValues = { "drag-point": { "en": "Drag point to change your age", "ar": "اسحب لتغيير عمرك" + },"HHCNotAuthMsg": { + "en": "This service provides a set of home health care services, continuous and comprehensive follow-up in their places of residence for those who cannot access health facilities, such as (laboratory analyzes - radiology - vaccinations - physical therapy), etc.", + "ar": "من خلال هذه الخدمة يمكنك طلب مجموعة من الفحوصات التي تساعدك وتساعد طبيبك في فهم حالتك الصحية الحالية ومن ثم تحديد المخاطر المحتملة" }, }; diff --git a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart index e636321b..2c8683f5 100644 --- a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart +++ b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/HHC_get_all_services_request_modle.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/HHC_get_all_services_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_hHC_all_pres_orders_request_model.dart'; @@ -37,11 +38,11 @@ class HomeHealthCareService extends BaseService { GetHHCAllPresOrdersRequestModel getHHCAllPresOrdersRequestModel = GetHHCAllPresOrdersRequestModel(); hasError = false; - await baseAppClient.post(GET_PATIENT_ALL_PRES_ORDERS, + await baseAppClient.post(GET_PATIENT_ALL_PRES_ORD, onSuccess: (dynamic response, int statusCode) { hhcAllPresOrdersList.clear(); response['PatientER_GetPatientAllPresOrdersList'].forEach((data) { - if (data['ServiceID'] == 2) + if (data['ServiceID'] == OrderService.HOME_HEALTH_CARE.getIdOrderService()) hhcAllPresOrdersList .add(GetHHCAllPresOrdersResponseModel.fromJson(data)); }); diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart deleted file mode 100644 index fa0799f9..00000000 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; - -import 'home_health_care_page.dart'; - -class HomeHealthCareIndexPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return AppScaffold( - isShowAppBar: true, - appBarTitle: TranslationBase.of(context).serviceInformation, - body: SingleChildScrollView( - padding: EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context).homeHealthCare, - fontWeight: FontWeight.normal, - fontSize: 25, - color: Color(0xff60686b), - ), - SizedBox( - height: 12, - ), - Texts( - TranslationBase.of(context).homeHealthCareText, - fontWeight: FontWeight.normal, - fontSize: 17, - ), - SizedBox( - height: 22, - ), - Center( - child: Image.asset( - 'assets/images/AlHabibMedicalService/Wifi-AR.png')), - SizedBox( - height: 77, - ), - ], - )), - bottomSheet: Container( - height: MediaQuery.of(context).size.height * 0.10, - width: double.infinity, - child: Column( - children: [ - Container( - width: MediaQuery.of(context).size.width * 0.9, - child: SecondaryButton( - onTap: () => Navigator.push( - context, - FadePage( - page: HomeHealthCarePage(), - ), - ), - label: TranslationBase.of(context).loginRegister, - textColor: Theme.of(context).backgroundColor), - ), - ], - ), - )); - } -} diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart index 8f4821f6..c249362b 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart @@ -42,7 +42,9 @@ class _HomeHealthCarePageState extends State }, builder: (_, model, widget) => AppScaffold( isShowAppBar: true, + description: TranslationBase.of(context).HHCNotAuthMsg, appBarTitle: TranslationBase.of(context).homeHealthCare, + // appBarTitle: TranslationBase.of(context).homeHealthCare, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 2744d3a6..d5bbe7c6 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -2,7 +2,7 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart'; -import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/contact_us_page.dart'; import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-drivethru-location.dart'; @@ -444,7 +444,7 @@ class _HomePageState extends State { Navigator.push( context, FadePage( - page: HomeHealthCareIndexPage(), + page: HomeHealthCarePage(), ), ); }, diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 3e0e67e0..46fa82b2 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -689,6 +689,8 @@ class TranslationBase { localizedValues['ServiceInformation'][locale.languageCode]; String get homeHealthCare => localizedValues['HomeHealthCare'][locale.languageCode]; + String get HHCNotAuthMsg => + localizedValues['HHCNotAuthMsg'][locale.languageCode]; String get homeHealthCareText => localizedValues['HomeHealthCareText'][locale.languageCode]; String get loginRegister => From fd80afeb5a2c75d5508443e4fc6d63dffebdf6e6 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 29 Nov 2020 13:24:15 +0200 Subject: [PATCH 19/69] finish hhc module --- .../NewHomeHealthCare/new_Home_health_care_step_one_page.dart | 1 + .../NewHomeHealthCare/new_Home_health_care_step_three_page.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart index 1dbee1b5..06cb7b69 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart @@ -139,6 +139,7 @@ class _NewHomeHealthCareStepOnePageState extends State Date: Sun, 29 Nov 2020 15:46:33 +0200 Subject: [PATCH 20/69] finish CMC module --- lib/config/config.dart | 1 + .../AlHabibMedicalService/cmc_service.dart | 6 +- .../NewCMC/new_cmc_page.dart | 2 +- .../NewCMC/new_cmc_step_one_page.dart | 24 +++++-- .../NewCMC/new_cmc_step_three_page.dart | 1 + .../cmc_index_page.dart | 68 ------------------- lib/pages/landing/home_page.dart | 4 +- 7 files changed, 27 insertions(+), 79 deletions(-) delete mode 100644 lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 39f90022..5259f1d7 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -372,6 +372,7 @@ const PUSH_NOTIFICATION_GET_ALL_NOTIFICATIONS = const PUSH_NOTIFICATION_SET_MESSAGES_FROM_POOL_AS_READ = 'Services/MobileNotifications.svc/REST/PushNotification_SetMessagesFromPoolAsRead'; const GET_PATIENT_ALL_PRES_ORD= 'Services/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +const PATIENT_ER_INSERT_PRES_ORDER= 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; const TIMER_MIN = 10; diff --git a/lib/core/service/AlHabibMedicalService/cmc_service.dart b/lib/core/service/AlHabibMedicalService/cmc_service.dart index dffa6683..9e99f3ad 100644 --- a/lib/core/service/AlHabibMedicalService/cmc_service.dart +++ b/lib/core/service/AlHabibMedicalService/cmc_service.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_get_items_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_get_items_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; @@ -47,8 +48,9 @@ class CMCService extends BaseService { await baseAppClient.post(GET_PATIENT_ALL_PRES_ORDERS, onSuccess: (dynamic response, int statusCode) { cmcAllPresOrdersList.clear(); + cmcAllOrderDetail.clear(); response['PatientER_GetPatientAllPresOrdersList'].forEach((data) { - if (data['ServiceID'] == 3) + if (data['ServiceID'] == OrderService.Comprehensive_Medical_Checkup.getIdOrderService()) cmcAllPresOrdersList .add(GetHHCAllPresOrdersResponseModel.fromJson(data)); }); @@ -104,7 +106,7 @@ class CMCService extends BaseService { Future insertPresPresOrder({CMCInsertPresOrderRequestModel order}) async { hasError = false; - await baseAppClient.post(PATIENT_ER_UPDATE_PRES_ORDER, + await baseAppClient.post(PATIENT_ER_INSERT_PRES_ORDER, onSuccess: (dynamic response, int statusCode) { isOrderUpdated = true; }, onFailure: (String error, int statusCode) { diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart index 532396cc..cedd4018 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart @@ -134,7 +134,7 @@ class _NewCMCPageState extends State children: [ widget.model.cmcAllOrderDetail.length != 0 ? FractionallySizedBox( - heightFactor: 0.8, + heightFactor: 0.9, widthFactor: 0.9, child: Container( width: double.infinity, diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart index 02d099b4..928444d6 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart @@ -199,18 +199,30 @@ class _NewCMCStepOnePageState extends State { child: SecondaryButton( label: "Next", textColor: Theme.of(context).backgroundColor, + color: Colors.grey[800], onTap: () { - if (widget.cMCInsertPresOrderRequestModel.patientERCMCInsertServicesList.length = null) { + if (widget.cMCInsertPresOrderRequestModel + .patientERCMCInsertServicesList.length != + 0 || + widget.cMCInsertPresOrderRequestModel + .patientERCMCInsertServicesList == + null) { int index = widget.model.cmcAllServicesList.length; PatientERCMCInsertServicesList patientERCMCInsertServicesList = new PatientERCMCInsertServicesList( - price: widget.model.cmcAllServicesList[index-1].price, - serviceID: widget.model.cmcAllServicesList[index-1].serviceID.toString(), - selectedServiceName: widget.model.cmcAllServicesList[index-1].description, - selectedServiceNameAR: widget.model.cmcAllServicesList[index-1].description, + price: widget + .model.cmcAllServicesList[index - 1].price, + serviceID: widget + .model.cmcAllServicesList[index - 1].serviceID + .toString(), + selectedServiceName: widget.model + .cmcAllServicesList[index - 1].description, + selectedServiceNameAR: widget.model + .cmcAllServicesList[index - 1].description, recordID: 1, - totalPrice: widget.model.cmcAllServicesList[index-1].totalPrice, + totalPrice: widget + .model.cmcAllServicesList[index - 1].totalPrice, vAT: widget.model.cmcAllServicesList[index-1].vAT); widget.cMCInsertPresOrderRequestModel diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart index e48bb5d5..893fbfa9 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart @@ -149,6 +149,7 @@ class _NewCMCStepThreePageState width: MediaQuery.of(context).size.width * 0.9, child: SecondaryButton( label: "Confirm", + color: Colors.grey[800], onTap: () async { await widget.model.insertPresPresOrder(order: widget.cmcInsertPresOrderRequestModel); if (widget.model.state != ViewState.ErrorLocal) { diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart deleted file mode 100644 index e8e9eccc..00000000 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; -import 'cmc_page.dart'; - -class CMCIndexPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return AppScaffold( - isShowAppBar: true, - appBarTitle: TranslationBase.of(context).serviceInformation, - body: SingleChildScrollView( - padding: EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "CMC", - fontWeight: FontWeight.normal, - fontSize: 25, - color: Color(0xff60686b), - ), - SizedBox( - height: 12, - ), - Texts( - "This service is designed to help you to set drinking water goals and track the volume of water you are drinking on a daily basis. This service allows for schedule reminders and offers a basic statistical analysis of the amount of what you have consumed over the course of a day, week or month.", - fontWeight: FontWeight.normal, - fontSize: 17, - ), - SizedBox( - height: 22, - ), - Center( - child: Image.asset( - 'assets/images/AlHabibMedicalService/Wifi-AR.png')), - SizedBox( - height: 77, - ), - ], - )), - bottomSheet: Container( - height: MediaQuery.of(context).size.height * 0.10, - width: double.infinity, - child: Column( - children: [ - Container( - width: MediaQuery.of(context).size.width * 0.9, - child: SecondaryButton( - onTap: () => Navigator.push( - context, - FadePage( - page: CMCPage(), - ), - ), - label: "CMC", - textColor: Theme.of(context).backgroundColor), - ), - ], - ), - )); - } -} diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index ed538d27..fb2cc108 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -1,7 +1,7 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/contact_us_page.dart'; @@ -513,7 +513,7 @@ class _HomePageState extends State { Navigator.push( context, FadePage( - page: CMCIndexPage(), + page: CMCPage(), ), ); }, From e7c862c801084705ab5a98d3ae0178bc4593c894 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Mon, 30 Nov 2020 08:13:57 +0300 Subject: [PATCH 21/69] health weather indicator --- .../health-weather/health-weather-indicator.dart | 0 lib/widgets/slider/slider.dart | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart create mode 100644 lib/widgets/slider/slider.dart diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/widgets/slider/slider.dart b/lib/widgets/slider/slider.dart new file mode 100644 index 00000000..e69de29b From a03d5c6d575d502910247d896f23084335d5fce5 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 30 Nov 2020 11:49:37 +0300 Subject: [PATCH 22/69] App initial release to stores --- android/app/build.gradle | 42 ++++-- android/app/google-services.json | 28 ++-- android/app/src/main/AndroidManifest.xml | 2 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 3287 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1957 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 4315 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 7926 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 11608 bytes android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- ios/Flutter/.last_build_id | 2 +- ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/GoogleService-Info.plist | 36 ----- ios/Podfile | 84 +++--------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../xcshareddata/WorkspaceSettings.xcsettings | 2 + ios/Runner/AppDelegate.swift | 2 - .../AppIcon.appiconset/Contents.json | 123 +----------------- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 ---- .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - ios/Runner/Base.lproj/Main.storyboard | 13 +- ios/Runner/GoogleService-Info.plist | 36 ----- ios/Runner/Info.plist | 54 +++++--- key.properties | 2 +- lib/config/config.dart | 4 +- pubspec.yaml | 4 +- 44 files changed, 123 insertions(+), 357 deletions(-) delete mode 100644 ios/GoogleService-Info.plist delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 ios/Runner/GoogleService-Info.plist diff --git a/android/app/build.gradle b/android/app/build.gradle index 5d196986..faff5fa6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,6 +26,12 @@ apply plugin: 'kotlin-android' apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + android { compileSdkVersion 30 @@ -34,7 +40,9 @@ android { } lintOptions { - disable 'InvalidPackage' +// disable 'InvalidPackage' + checkReleaseBuilds false + abortOnError false } defaultConfig { @@ -48,21 +56,35 @@ android { } + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { debug {} release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - staging { - // Specifies a sorted list of fallback build types that the - // plugin should try to use when a dependency does not include a - // "staging" build type. You may specify as many fallbacks as you - // like, and the plugin selects the first build type that's - // available in the dependency. - matchingFallbacks = ['debug', 'qa', 'release'] +// signingConfig signingConfigs.debug +// useProguard true + +// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + + signingConfigs.release } +// staging { +// // Specifies a sorted list of fallback build types that the +// // plugin should try to use when a dependency does not include a +// // "staging" build type. You may specify as many fallbacks as you +// // like, and the plugin selects the first build type that's +// // available in the dependency. +// matchingFallbacks = ['debug', 'qa', 'release'] +// } } } diff --git a/android/app/google-services.json b/android/app/google-services.json index f86832ad..a4655794 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -1,39 +1,37 @@ { "project_info": { - "project_number": "815750722565", - "firebase_url": "https://api-project-815750722565.firebaseio.com", - "project_id": "api-project-815750722565", - "storage_bucket": "api-project-815750722565.appspot.com" + "project_number": "864393916058", + "firebase_url": "https://diplomaticquarter-d2385.firebaseio.com", + "project_id": "diplomaticquarter-d2385", + "storage_bucket": "diplomaticquarter-d2385.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063", + "mobilesdk_app_id": "1:864393916058:android:5b5a65cd6d8c18b4b97923", "android_client_info": { "package_name": "com.cloud.diplomaticquarterapp" } }, "oauth_client": [ { - "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", + "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw" + "current_key": "AIzaSyBdV3mos1BPhUzNKCj2KANJtiO3o2zh9IM" } ], "services": { - "analytics_service": { - "status": 1 - }, "appinvite_service": { - "status": 1, - "other_platform_oauth_client": [] - }, - "ads_service": { - "status": 2 + "other_platform_oauth_client": [ + { + "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", + "client_type": 3 + } + ] } } } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d0751535..12ced804 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,7 +24,7 @@ android:name="io.flutter.app.FlutterApplication" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" - android:label="diplomaticquarterapp"> + android:label="Dr. Alhabib MC"> S&<@6q*62VXPgs1c+KdV4Mml6e9luA%P@@B;?OslH1O2|J?2Fz1`c}y(?jc zH*=8N-M8<(&-?v*zqflFZWT)c+$}!V1a1L}AtCVsqU+;L{a2JVpDtT z`TxH4!-raw?peZ$HBcUQ= z^2#S{=m=p^NNQbf(yG(C^K@;b*ZR7VaqGzF2OS3>381ldM92)?fWUFc5wNB8(EgwA zd7-k|43Zfjen#c$>|tMjV0FNg{*w@ps!pR(a-wF@Aowu>8E&AJytvvj05X@Zut0+6 zxIlVe@4Ci4Z@=*I>o0e(Y?B!v&&-!z8=pIV>bw2m3Zvj?#KaO%SS@r47e=Uxy+(^P zcs0_hR5xu)r+y}FnM{NSVnb)$C-V+I{rE{m-E>pT0z}8s7XS6V$^n1=i;m%h?FPHU zVaA${Gu6xFyzbf<6Ct%_+72MJx2)Q|Z2o!x0izVL00{uRi>hk3Av1enlxABr#1`ws z0CFR#Mgt#Zsk%CM?p-qLF#uggTf_q70pR;aRqZZ5(|4b7rr7Eb(d+Peqy8`y+%wcWK#<~#_X6VL}2EI=s$vKMaOw~O~>PuClaXb?e9h=z80p+NE;|5E*K6`{7~=sABuRU4jb8 zLap?JQvk*(J*I$M*dKD^Qwsce{3|1{`Q#FGmveXBFG)1Ff&cQH|c;#5qiY6X=RQBhrEnb zJTNjBQwwsCo#w%B4}Wd~NVc$|EJ5)C+FLDT`6U%I8b~_k_3+p_XMz-P>5B2Y{%rW$ z)$Rb+etZrmzvwb7NA&h*XnG1(P9B9x`F?#^YmEHVJ9C6cU)CJ@9JLLy1hG7&GeFz+ zR`Wg?5UXT(cx;<s$YK2{&I{NR1HmpB-0bPBnB+TyhsR+%)Ot)n zoo#z+zaOszSpcHJkp#H`L>+JH4&WF2Pvc5=P@$*?;7ukI;D*^o?IAj~c@1Ej8yB^7fcL1s3{tpr5?Q2?tT z(lnN6KxUD;V?dmR4e|;+w#{{Jg9wOLf{dPv&JRgX!RiD^&~FZXjt?5zma0czi2@{hR{5@8kB~4xjoq?} zX{R{ZfV8o!I|+)!W4aN@5;W1Vo7bwC1c(teCrg6D>g-m6I4P25gvN@SPXwS!@?u?z z1Q`OkW@0^I!5`%mM@6SeTdP5{j#H*cY0G>(_QT88ntKBs)7HQ4gn6KK@fAoXT6hP?C?JU?wL#`wLC+ZYf< zEdAGUr42oxFsEbyqMLuMXo$2{idxaz91d+I(OT?i3nlU*MeTTjHx<9XuN=AQ%BG6V z`)V)Scj*hfaO4cAtuPRsXLhJ!W)h^$GLU*zjLOH9LO)oG?NpveaaKAqQz*^NE=R6h z!{r;q~Je(b5}?f};z&+(?kF zU6wIYy3abrb0Y2^k%u3QF9xm5S%qfypXZwKpXLtq_J`A87@On8x5pMD+oWE9NW{*% zChVwdL}yS=m*`SNx-5)|?NK}A6cCqb?&eu4p$8y$D#Ih-$%!SHF?^`0B!onur+)xs zFVsSjx|N4K)7}kQLNxaT^Z~U#hV)QnClWMwD`gbTbJEeB*2Ea% zpT>@z=tdVhd+^MGI>Rz0_MSeo6HWll*;-Q_&PiL~CxB-0N}3>Gc1bQCDKC;TkgU=X z?8l#u)#J0)>(X+7j4ln6BJkxCOHks=VAi9U>8-O@QFW>jZGk=suI$lNNRbW1n2yFV zAZ2Hj)kA8O2K{jPFigHJo2fpuM$6AgMVf_irfB%jpI!``e(hlHx-A=Prj?ma07cVR zdxGeeHXcQ3OFCRc;Bt2WuN|+))$qQXi4Z3O5KF7(mE_~eNhOY-3#PTyPxpQ%sS9hC zX|ejd>Elq8neNzhebjgjln>HI=}|Xx3J4YwM5^_N8MmV}$9XD()a!|TC#0EXm0Ts= zF*e8f#vy6lV>QQdzN5z+vJ*hFx7Jki7Jx`?b}pENR2O^Z?SVc#@%~A6K1h_eeJCH~ zHlz5oPZQ@@}?w6f@)9VG9xEV>Tq)aGU%83m240hX?NQ`eOO*= zVx$46Ud*kLPMQtkGX2xpQK*PakB~G#YMU~kQj8mtbg+IlEXYT%z^gy_q zk`x=H0y68ETR;@^ymz4)8;;dWNiQnK$M7f{@Njt%zE@u4>N%tv0*H1f{$4>6Bxea} z!0{vu&vo?R#Up2NuA^Ilqfb?+-)Kd@YRVW)pl1LaCM4G!K9l&RMwA38`3^POrM~8* z(R(j)p=6g?N|hKI&$R`Dpmc{UIm$nbgg>3)I1bsV0{A!xsS`)_DQnQHY;7|&!pT}} z=9b;ne5U!6_Et6_W(Lprc4>^fwj29ntF9wJn|E8LJ6H`{gNd9C|7B7kHeg%BwtrEw z0NEP|158-2B4e<3FZ*MT=Sq5C?1MO;w9lTg>D?;9KXevjEH>KK*cR>8H(HfUdOpzJ z`u2y9&0lKwg*xe#%zM{vdCoh!e1#1fO!uQ>F<4Z|WH3D!>ee4x`N(SJmCTqg)Y1M- zR_W3e_Y}`rw1ZE}FhptUX!S0~4iIP37~d4ddvz!n>}aUj_1!a@UO7O|dDwYpmDUdF zd3WAjT)J%K^WLJ7i^20zn_5vq5yObwNE>4cEfgB)X}nl{X5+eNTaN9&2%y)_ThG#7 zAidZ-e9pHf6fb<}Rc~SOMAInnW(1@BWJYgu!_iCssCug5ot;ND_D44&)1RiG9~Yol z&^vNuQQ5MmpUNs3GgCsAiw$`rt z({(KeYEA_^I|&RuVoR#U{Pmq!s~dtu>j?ryACf9MM)hLVP5cPm-H`;FJ_LfKg`m)< z&kT;V%(2lX8EyIy81;V})duY)1c-!O{ohjH?Eo@@v|DGe64IK;nC9|kA8gVm;eQ@f Vd9uLGJ)-~s002ovPDHLkV1ljaHBbNm literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..a35f0ed789cd85017f50cff69ef39c384dbb7d4f 100644 GIT binary patch delta 1954 zcmV;T2VMBO1Emj;8Gi-<00374`G)`i2W&}1K~!i%)mnLM6jd1i&E5+=u;r*gRVso} zj6e}em5NZV7OJ9uNNYSu@W7ZDgF&Mvg7J#P7?DK97!3lYEefRwK{;Al39*F|3KWnY zVks0z?{0UyyJNn&_RZ|6?>1YX@$pE5i39wiXjY0Mnb*kX{R04e(iCN)o+ipnzxYWl zpXWJnjSm0758IYz{zNjh0QCS^3(EfZu8%iA&4d0)7eBc2Dg~t*SuNqO>KP+XkgWqi z8c#|N;d~oQmw(QD1ppaGxwHUGPi*-u-xr^>NfsY=VbY1Qe!wGv1!4h!WRRlPuJ&bn zpI=Y}g%9F$_Od@-QdP>^9rIQ03}JmTS~$xE=pc;>>BYcmp}h!jp8mc2mt{Q$z%47S z1rYb>_9Hc%%{E~$>Ih5fSzm`L3d{%qh{jRJ9q;Ksb$@VK)(il>dH@Jad|pXa4QF?Z zXCq24a0jzKYg0XAsGqUE0;Y^eK&RV_3!Qz88a(`NSN);<*#w|ljwsdx^f_TkNmaGU zCIVm;PqbN-dyWG*=1X=QE$ro);Fn3pi+oMATS4>v@)(AO4vQI&j7>tp#L;-I;tbBU z_c1yc1%FUnRc*36#xdG7LLq4>tBFHV4goM$xIeCLKt)Tt;6pi!rN%q(_1sBeD<^9cEdU{< z8=_EgRkaL2whwtA5&#=c{Ds|3S5*KW7?p^%Gk@<2={fBeY5<}k_WqXW>USf9j11K@0j7{szC4FOopctB18M4{qb;}jA-5CA~dn;xMDUf5rU3!Sb2 z019@Z&|n@=05I8sJW!lF#c&J|fU>4GRqGHv0Hz2U0#HO0vWsms&Ou_4?kbHf<782yPN}#w05AmTWx)z4j2W%NxhKP zTI{Q`hwhZQM9?LlKcJJyIj&DR3TD?uN~JZvI}8h?OV z@qkF#LsTQ;tQJG`UUKQ2Y!WFcGGva}T+r$_MR$8MtW11}s@5e0;YeWEO zFOgeX1CLK!NpJI`er}LL1VG))se5(JYQn->qX0m17VoS315U*;SVZ1$$3mK-twvxycBH<`ac99x!tp zb}X3+vbd3JeQgs;rDjeZPtDv1I#dfKZ~3n$gS=qK16ly&32NpD00A*_eNo$lT?_!K zvNKX513;DhY`gOIL`;50J%0d=2ciYQzB0XG0On~a!~-^S;1A6H;<^Zw_DTvkWG*M`0Ub^uZkN~im?0*G7 z*{3uD0G}UM2QgKH=_!f$D08Bb93YH|nnKxy<<;6CrhdMR02oZ8?|&XSkKbE6nC2Kr zOK{@b?EC(E0CNhr3YRuYSdtp>&fdqSarA_KKA{n#3g#Mm8sKGu;OG{ zFCRP|T^f}Eu)8r@AY8M?I;Pj_6O^xBM678N3V)63O3UG+s|pI>al0AJBhuZSn1B761SM07*qoM6N<$g8A5c?f?J) literal 442 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 JPDHLkV1l(q`MLlA literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..fc595a387b91d6c5bc60f062c8b9a684efbc5ccb 100644 GIT binary patch literal 7926 zcmVcS3LPV3 zG$#q7aZ55YnHe)$0v;p~@({NawIl&30jLB5PZB5r$dmX=kxKw7VZf6FN&xaC zzEb2u1E|pHms(IP0j1CaDntX*X`0h7M1F2%RB++CEm)r8(e=!Go%7Y8Bpv)qJ}3wJ z_dLrb@5$v|xOp$3y97zS=)dOQ+@(x4u-gR8zzI*k_S*8fS6n;1vc6$#sH|dkC|Wid zBH@_Z3`FrVb}z$v04gAU#h>wSD3ekk1IIIpl9nl-B|l*S_$kt5un&bHNDT7b8jD$! zw9=PJC3hwVP9E;>Io7%TvE^NR_UysBB7o?RO!b*zyl5a=+k`Lw((RR#K6cfdaAob) z$w*{jDg#X^B~zKoC^2Ezre2D|*{KIb4Zse?jjI5JL!k_WLJA$#8lIoK<&9*0*rg?r zLtrQnqv@C>(to6j5Dh8GNGNnF3d+tnq+dOA;>6nbo?W?f>)N#gIx_jFlz^3601@zD zXAalTn-~Ab2cP!NH{UHEPODQO0HS`<-c1A9UUnEFl!_U*yMt^0Z$g8A@wA>bFZsCECKby>EES<<eOAtB|J(>u4``Kw!R-0c=b zP5@*8PhDMI`KO-$-7mY-aB)geDDW7XMbi@O?qK-Um8#cM5ZOO=)F=XgomC|QfKGc@B$zXvUpyYovbvw(3vc%BFcf}_IE$?%3U}8 zQP)DWVJ!ra41h=&)IL!FDF6ExfBW@Rb=^H_1Ksz}awv=kTB~uuk-i{v)~iSe2I6OW?)~r2Uhx9}K=&T0j2P8<0T6;n)jk(|{^pSr zuKw&(iL&_RJWjIEmTS+8DtnPteF$(Yh5*xA0VXx;Fy{M%T77sFrh0Z3FHAsTCfd?j zU7&%?#Gb2Hd1~O-?Jqxb^VVm7^gaM2P3}DxM6wzP!>QV5(S6^WGweePewGMDMsNYd z%Z`$qT@Mv%A3d@c%_CCv{GKjPVWRp8?U*dUimOq}6s5Cg)4ES>Tz=bDN(*5jgiR$2 zAfzvxj)-5~y5iswiU=Su>J7!zY z9E4*6JUjG7I! zF3`A~Mp6_dnK`)Y+pqu2^-ll*y7LGi^u{~^h`8@)|EK`E>aiD=#3xRAy>J20b~e(p40(EyYsHSFcgsiKv%Xt zyCgno`fb9sL@sH|t9s{qPn5YYp#qIT$bUJ+89{E8tzGh#_tXzL-NrX$%<+fCWAMe9 zW1%b(hWj?|5t?7Tda3y;nPhtJ_V28_{R;@7GrA{+6ee6NWoH8s01*nSvIS5fz(XM; zmpoq~OBu18mKISL6W|W(%T3=vVRCh=ibml2>7(J}6B^;|&K|f|03h3XDVbzy&!3mS zamS5FVFdw@N?}*FKHHMjK-SKwwjEdHa#~hMTY2!j%qv0I-k&yzr-;bv7W%Uqbkeck}-8~>F5TSR9l&qDi1)?_3}jn35*s|W0pli zFr&Uk?K#FItg*_%VO(}<$4XL0c{-y&XWsxEI(-(B8Eam4YTi;^gZ%3HY0s%lBR-0!XX$IFN3LdRWP%m28LJ0AQm>Rpn0>Sdyr9>I`))%IBdpj zSTy`rEt~=65qn^SJb;JMhLFf);MWI^!HYYOz^Mez8ER$V4YCObOZ5z}h_f1Mpk>Z@ z7*Scy1-#w5B~dT2>qH_7Gp;)!y*9TTMJrb^DXiJ*g~`wd5fB3CiA4w?#yT|Dx<)=? zMp58*hr3|KrUMKuXn~zcOX}~b3Qwu4f+cgBVEm8@-%hLG1BfRV6Ezo=!b|{i0v@c6 z-vGigq%sPu+`J!NYwx0rOg4Cg)TJnJ_q<8)k#p+g5nO^0aV^R{k9Me zBsvrX2|wIt4Md84;8Z^>ePbu|r_u}x!%&=+hm=cnPIWmvwP+?pi9zR3Cix2Pl)}iS z0JU=zo5B!4ZZ;(n0HFr@fsYhM8m;SW627%@H|#lyQ$O@0=Xs&vzkdFBxO&3yeBr=# zI&LW}XS5g5266)+T3ZDLK&KNacw}=Myz~AkM#I^I2uFWgFP;h$hvwXA*9hicMi64TObe&q-gM$g6TwRQ9kQ;2V?&S^;fb5LxU;~IlT^3gi z)aitv0Ek6lb_1h^_kK{A9aU)qD7kIO7EzO*a)D# zMVd@C8_{+e$IR=&1`uN-BFDrIDu76Ft?eRk42lV$GM8?=rjY=KRRqJ0HyY7Kjxwru zD}sWifqr+W3m*K#KD*7b);%AjqP_r#v*_JITUae>#oh3VvOtUj(EvhZXEi#9o6SE5 zNdx`*z;Sr^oqg&&oN)0xH5I0I3qsAl07%B?q`ES({DTM}dL ze=8hilK;KQV6Uo?=-;&5#x zT+X{8=IOACGI%loQyDo5J0Z1<(u}9z0*J-IHYbYs0wDI-8xu5i&_Du+Qy0 z{gi0%Fentpq$h*p%?a$?u9ws6rd7bF^%ZhM6#TNBXt|^ zEYJWlm0dJQ8e9OeiB~wbReS*9Hh#fQegTLA2_Qb>a`#FM4gd)}FWLlBGRb7I+;~j` zspml0J}iG=cz|r6R^0}omsfJe5iP?*2%y%$QWzGOa~v^C%N7qnYg%FxXE#2!biy1w)T^ewE1Cv!4j{7~5jX&K;DR#aBeH!+$lwA<()03%!g2s& z4_DbAbzUEj!4EH+32~pc_0Vp-N?|4d$$$sL1c}1_cmHwt?j~(6j6Ql$`Z!|0HIR(Z zNyFiOur-TkK{aa!r>#|$zW_K6^g#g-Zj}7twnLx|B<5N}=y?T!!khqyG(A@FI}0YO zyE*-Q)Pclz_rtpO9EHi$hlD{*y7Hq_VU*8nqOm+U6aVVLE}E3o?{)ynzAvT*iaIf( z%{-?r>j1cHTsqg!{dwN+8-Tku?1ufi_A!9R z01#{Wj2g9wZhV%)81$s6(Cl?yxr@(q>Qbwr+j)3I$ya8Nh54guwSyLe>|uK`Y5??LR&Q^Io`IxrP!ToX zw1#T<#+(T-y4wAYR6OkJrCpuyi#a5op9)6zc!wtZv?<9sVAC+Kt0Cg z>ZV3jbGm&nsh8W1!c*H0LLy~8=!s>km@i>5Z^6#Zc@YzWHWg$vdeNpb7PnGU8ID0C z7P+|du`|P8DTy@M6o?}nz zjIGKHAqcZ7Du5<9U(O-dlgzc|EA4DZJqSYX(Tk_T^!ny2<@xu)^3HPeRvs;c(ho`_~q^M zVn|ac7=JX7n4UC;OypHrsfu;1u9}WH8I%U)@!{8H7dFFupAWmVLoZIBT=&XWIM$!A zz1vIbgn6+DC5~s;OY9GTtm1O6X|ny$k{I9Mv*wFqLiY{=4P*e29om@pP3Al=>mgAd z+QUx(xdRQYpsj;PPQaroqd`Jp1VBgoH3}0wGQ%2%Fit%$KWw1OTGzCcWo;n0^kiD} zq$eXoRXj6W(?HEIZ=}EHHOqkFpVn@Lj$XWui&YzqlepAR9e!nZb2MMKv$8JIWU3KB zcH*L|z#pP^s%;D%NB@UV7>-H@{kdW7Ryf22kXCZXnuim~5i=Bv!khz$rYd98N>xx0 zh<=3t8Vp_-O29pUat9`@WmjndF&~W*9Jwmf$X<7OX0#gUdU|+QF@ip2&}nc7W=L)*_JI* zxc_N83M)46Hvq_9R`$0=y9SRMv8Vvj4p(4N5|f^62D{8gv52ZzZH&Udd~5^UI(I^m zAmA+&I|x9b0rUcOX~mQuo{@U)H_@90?m&OUg%^Q6rsms%x<$5hN zYVHk3y5W&cZE)IlF~25_f`iBx0I_Un$rXvTzkvc$7iu|JtA#=FKGloPsfEwa7~^Sc z&B0UsaL0yS>im?s2xh+s%Zf{2Z=5j(K0SGqr$zm*95@E6|J)8I6Dh-8st7O~v9=ug z%%Cl&bk8?1i)aI7Da@&=u(+)NBP+{c?ua4k<~%2twjtogRL9}`;X@q7GYb&+QmxqB z2ERQ-@9MOQ*<4jT<7nBuX3xt<4)>mgjYoO_cgd0mm(OaK0y6}x|Ag;xQT?_Pz03=Q z9dminHIV7jT_*)5VnNW{I(H&WsjJj(A$FjFFh7UEnMK^)(+A7m+65=hCi$I{^X6|S zHo})@jZ|@#WO~e=4Qa|5~3-ddvO@%H?Qd9snu`k^fIa_9C!$s*|nLQ2` zj~zy~TDh#b`)Js3FYfMuXSR13DMU}w!p0^(n=@hveDi{4z++zgdb$Ua>b^GI-s9=< z8$fj7?RpP}Mf$-t%ziFGMH=|mEeGJ`wqu4pX)@)i}PQz{M@$T20 z_vpAhega5V;G|L*{vW1{g6pS^&I=7W7M30XFWX)D?tXafuy#^CK2GX_6ujc2Q(>gf zr*ohkxAcu2u=O~5cde9siUpuWxUGjlVN!+E1L2OURST#4e%B}(t}8aR!MYB{IngxQ zX>{q|k^bt+qwv_J(*tqk<&%Fp1b9Y}>s?310uau|M?C_lG8TcKUU?o=df1%j1hBlY zQUKyaMgZXe=Jx{vpjY;5=R^k{K>5%>=mP&}aWIa!v(-Qh0Fj*(K>`pS@p8|`J?{He zu{4lV0I>$*8g&4vCvy1spa#ODU68^IjyP3l)=49z$Uy?o`u1*EwsE(6X$BQQEblDv z0Agt!hJ{@Mko{O3c1%eTyExPz~?gnR^gbW0Q=^E&D>Z$`PUUKf4dAo6Kc?=#eQJ9dv`2dnwP-a}s zn_FEoxB!%skD29E4TKlYRhMia9*U#@#9=Ci)u4e0*U$VU2yQ%TpiOP?I^(`D)(ASw z3oB_LvH!pXP-ML5(p}y*=UhfX2axQs!zBuH>BfrzWbe@i9YCZ8V#iDY6+k5lb8Z7^ z0Ft|Omz8?Z0VM0uYhGAs97u#928FF|iHw&&rPaKg0}~7sfHt=QdSTjPR>smp%kSDG z8G4;{aWtZ*myBouf;cwNG{?6#(|O=ce@|aA+tW@`d!n=t(VI-c!|$}gTSs~%*FxuX z6MjPtw5kLkrxfN)1F`IhA-JUVs`H`3=OwMUuL`e=MJ=(IGD7S-)3?z;&O=WQ9 zC!{c`+*II;p?1n2kaMhD89)Z1DGvjzOb=@MG5?I{Gs!f(xa$Z! zx3fdn9L8Pn+;Jezi+Lkzp=Hi^Uw5ef#R2Gx3-G>m?J>IN%oGHpi+I!w9#M14`AsmaA|_D^yHfJsV;xzwTz{ko?i&o-dM;hD zx+O|Zsu%2^QY%R&^By1;6(^QJRHjI%w#Q= z#3NDgn(X6e@tOg~HIbs@MNDnVGP7})30?qZOq2yCs6>$bSGJHT77aiQH{P(ELvC${XHmFo zKx^Tc;IRR|ySzPDxv&Wo4L~baw?t?P%X_tQv?aT&LVTE@cdBx8^h@5wQs@MW3ZN$W z$<%z*TfWD$2LMSK+)x!aZayj&q%=Ng0Fnm{s}&@u$^kOGl_f|h5tJpk01{IY?S*TFhyQC^fuh3iB+_#~xF^dME@2E=|rcopY03A>j1}#iEeT9Zx=1L}+*uCZc4R_u2BLFx90C=S$9$uY0z?zYg-Ow#r z&JiKUyIget$>4GgF-Sux>2#w1 zk8j=b_VT5_1c1JL0tn?x&IhWT{k3m?q<;PttHbe%n!?CROiw~B;ZS`z3|^S(1|(G_ zndt3${a4p-d-9DK%M}ERl`{+q%Z_fMfs57wddXa$kOVj zDPIDdv~sWzo%Wd2brSl7nYt~S`mXPgW-q0X^rTqWDp3{3p~+-2{Rj6xz2)IM9vV1y z74k(Ml!*1IOO)*#E;v zuIt?LW}6NkLSG0V6mMPtgvCM{LoI|yQB(pz_2kd}^X0=ne94{V^^Idf5qxcYq^ZLL zJ&_!x^Ku~I4{}fhPon!+$MKEp9^SqB(N}cpBE~b)7ur6yx3|bp7)@ium_`s)l~q*@ z9e3>)7d6aXu&ko-ocd7I#kEIyX!$%O@j=FlwPUAJaQ1jd_wmge9z68Y)2}AZbmPW2 z96UtZhc=#VMe77W#3MsvTJ^|uO;j~<(KXXXUw+M<6(dGZj#SrFg~L%$-722PRHCQi z16ENWlTJaZ_jKRcqwTvpU;EWV9c%w%o9?os=D`nwhiD&L@DR-+TN!M2+9M+%LLgN% zOuJxI!-9n$scxRKxV*N0YPc+39gda7LQ#DIrc`m{ijv2qHWKY)3xE%^(VG%YS-O$w0ThT;M4`}c}a;`Rs+#sBjZBIR|q1cGwlISM@%ZKshtQ)$ii(>r5nTz7lfiKAtjUQ?QKhRb?oXpa^z6&-uK#1 z?%&Y`$s_>{0S2pIfJJ~Vi+z6Api3q+`0@PnYCKP3S92R$=@$gDa7i2fjO$as%+ zkCR0C-D(69k7ySH7UJsD;2~k$<|R>$QV@m&$QTaMKmmU5(dNPb=#m5z%b zp}|B(uW9gj$*Y7A=Mo?QqG=4jlj#Wr7ClfXOn2z0=fOGXMYp07*qoM6N<$f;vsq#Q*>R literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..605c7e4a7772aba3eca43f602084b513da944907 100644 GIT binary patch literal 11608 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 diff --git a/android/build.gradle b/android/build.gradle index 8e56476b..8c57e18a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:3.6.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.2' } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 5660070d..5ffeb56f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Sep 03 16:26:30 EEST 2020 +#Wed Nov 25 14:25:50 AST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index 44c4b26c..b5ed87ba 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -da98d9f0c1f407e541c636e84847ac81 \ No newline at end of file +a30437b5671472a3d6a8672edcfc504b \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 6b4c0f78..f2872cf4 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 9.0 diff --git a/ios/GoogleService-Info.plist b/ios/GoogleService-Info.plist deleted file mode 100644 index 0c093a2a..00000000 --- a/ios/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r - API_KEY - AIzaSyA_6ayGCk4fly7o7eTVBrj9kuHBYHMAOfs - GCM_SENDER_ID - 864393916058 - PLIST_VERSION - 1 - BUNDLE_ID - com.cloud.diplomaticquarterapp - PROJECT_ID - diplomaticquarter-d2385 - STORAGE_BUCKET - diplomaticquarter-d2385.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:864393916058:ios:13f787bbfe6051f8b97923 - DATABASE_URL - https://diplomaticquarter-d2385.firebaseio.com - - \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile index c2702b3e..1d1a003e 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -10,82 +10,32 @@ project 'Runner', { 'Release' => :release, } -# pod 'FBSDKCoreKit' -# pod 'FBSDKLoginKit' - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - generated_key_values = {} - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) do |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - generated_key_values[podname] = podpath - else - puts "Invalid plugin specification: #{line}" - end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - generated_key_values + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do use_frameworks! use_modular_headers! - # Flutter Pod - - copied_flutter_dir = File.join(__dir__, 'Flutter') - copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') - copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') - unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) - # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. - # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. - # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. - - generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') - unless File.exist?(generated_xcode_build_settings_path) - raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) - cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; - - unless File.exist?(copied_framework_path) - FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) - end - unless File.exist?(copied_podspec_path) - FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) - end - end - - # Keep pod path relative so it can be checked into Podfile.lock. - pod 'Flutter', :path => 'Flutter' - - # Plugin Pods - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.each do |name, path| - symlink = File.join('.symlinks', 'plugins', name) - File.symlink(path, symlink) - pod name, :path => File.join(symlink, 'ios') - end + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end -end - +end \ No newline at end of file diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cf..31d8d1f5 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - + DisableBuildSystemDeprecationWarning + PreviewsEnabled diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 23dd69b8..70693e4a 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,6 +1,5 @@ import UIKit import Flutter -import GoogleMaps @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { @@ -8,7 +7,6 @@ import GoogleMaps _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - GMSServices.provideAPIKey("AIzaSyCiiJiHkocPbcziHt9O8rGWavDrxHRQys8") GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fab..65b74d7e 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b..00000000 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index 00abc512..f3c28516 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,10 +1,8 @@ - - - + + - - + @@ -16,14 +14,13 @@ - + - + - diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist deleted file mode 100644 index 0c093a2a..00000000 --- a/ios/Runner/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r - API_KEY - AIzaSyA_6ayGCk4fly7o7eTVBrj9kuHBYHMAOfs - GCM_SENDER_ID - 864393916058 - PLIST_VERSION - 1 - BUNDLE_ID - com.cloud.diplomaticquarterapp - PROJECT_ID - diplomaticquarter-d2385 - STORAGE_BUCKET - diplomaticquarter-d2385.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:864393916058:ios:13f787bbfe6051f8b97923 - DATABASE_URL - https://diplomaticquarter-d2385.firebaseio.com - - \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b807d9c6..6a2a87ce 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Dr. Alhabib MC CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -11,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - diplomaticquarterapp + DiplomaticQuarter CFBundlePackageType APPL CFBundleShortVersionString @@ -22,27 +24,47 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS - io.flutter.embedded_views_preview - + NSBluetoothAlwaysUsageDescription + This App requires access to Bluetooth to connect blood pressure & blood sugar devices with the app to analyze the data. + NSBluetoothPeripheralUsageDescription + This App requires access to Bluetooth to connect blood pressure & blood sugar devices with the app to analyze the data. + NSCalendarsUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSCameraUsageDescription + This app requires camera access to enable virtual consultation between patient & doctor + NSContactsUsageDescription + This app requires contacts access to show incoming virtual consultation request. + NSFaceIDUsageDescription + This app requires Face ID to allow biometric authentication for app login. + NSLocationAlwaysAndWhenInUseUsageDescription + This App requires access to your location to show the nearest hospitals & ER Locations from your location. + NSLocationAlwaysUsageDescription + This App requires access to your location to show the nearest hospitals from your location. + NSLocationWhenInUseUsageDescription + This App requires access to your location to show the nearest hospitals from your location. + NSMicrophoneUsageDescription + This app requires microphone access to enable virtual consultation between patient & doctor + NSMotionUsageDescription + This app requires motion detection access to function properly. + NSPhotoLibraryUsageDescription + This app requires photo library access to select image as document & upload it. + NSRemindersUsageDescription + This app requires calendar access to set reminders for Virtual & Normal Appointments. + NSSpeechRecognitionUsageDescription + This app requires access to speech recognition to identify which words are spoken into the microphone. + NSAppleMusicUsageDescription + Required usage description for a Flutter dependency + UIBackgroundModes + + remote-notification + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main - NSMicrophoneUsageDescription - Need microphone access for uploading videos - NSCameraUsageDescription - Need camera access for uploading images - NSLocationUsageDescription - Need location access for updating nearby friends - NSLocationWhenInUseUsageDescription - This app will use your location to show cool stuffs near you. - NSPhotoLibraryUsageDescription - Need photo library access for uploading images UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad @@ -53,5 +75,7 @@ UIViewControllerBasedStatusBarAppearance + io.flutter.embedded_views_preview + diff --git a/key.properties b/key.properties index 01c8cbe8..eec491b8 100644 --- a/key.properties +++ b/key.properties @@ -1,4 +1,4 @@ storePassword=HmGsa123 keyPassword=HmGsa123 -keyAlias=DQKey +keyAlias=key storeFile=DQKey.jks \ No newline at end of file diff --git a/lib/config/config.dart b/lib/config/config.dart index 37da28b4..55845a3d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -7,8 +7,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; - const BASE_URL = 'https://uat.hmgwebservices.com/'; -// const BASE_URL = 'https://hmgwebservices.com/'; + // const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; ///Doctor diff --git a/pubspec.yaml b/pubspec.yaml index 26fafc7f..4f21803d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: diplomaticquarterapp description: A new Flutter application. -version: 1.0.0+1 +version: 1.0.4+5 environment: sdk: ">=2.6.0 <3.0.0" @@ -150,7 +150,7 @@ dependencies: # recase: ^3.0.0 wakelock: ^0.1.4 after_layout: ^1.0.7 - twilio_programmable_video: ^0.5.0+3 + twilio_programmable_video: ^0.6.3+1 flutter_tts: ^1.2.6 vibration: ^1.7.2 speech_to_text: From 97b8aeeff52a77e2df169b46e6e065e3e6b73f36 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 30 Nov 2020 14:43:27 +0300 Subject: [PATCH 23/69] Version Control finished --- lib/config/localized_values.dart | 4 + lib/core/service/client/base_app_client.dart | 18 ++- lib/pages/appUpdatePage/app_update_page.dart | 109 ++++++++++++++++++ lib/pages/medical/medical_profile_page.dart | 4 +- lib/routes.dart | 5 +- lib/uitl/translations_delegate_base.dart | 1 + .../bottom_navigation_item.dart | 3 +- 7 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 lib/pages/appUpdatePage/app_update_page.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 978d83af..29a4203e 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1128,5 +1128,9 @@ const Map localizedValues = { "en": "Due date", "ar": "تاريخ الاستحقاق" }, + "appUpdate": { + "en": "UPDATE THE APP", + "ar": "تحديث التطبيق" + }, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index af8058b9..2201da3e 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -4,9 +4,11 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/appUpdatePage/app_update_page.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; @@ -54,9 +56,9 @@ class BaseAppClient { : languageID == 'ar' ? 1 : 2 - : languageID == 'ar' - ? 1 - : 2; + : languageID == 'en' + ? 2 + : 1; body['IPAdress'] = IP_ADDRESS; body['generalid'] = GENERAL_ID; @@ -122,6 +124,9 @@ class BaseAppClient { if (parsed['Response_Message'] != null) { onSuccess(parsed, statusCode); } else { + if(parsed['ErrorType'] == 4) { + navigateToAppUpdate(AppGlobal.context, parsed['ErrorEndUserMessage']); + } if (isAllowAny) { onSuccess(parsed, statusCode); } else if (parsed['IsAuthenticated'] == null) { @@ -163,6 +168,13 @@ class BaseAppClient { } } + Future navigateToAppUpdate(context, String text) async { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => AppUpdatePage(appUpdateText: text))); + } + get(String endPoint, {Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, diff --git a/lib/pages/appUpdatePage/app_update_page.dart b/lib/pages/appUpdatePage/app_update_page.dart new file mode 100644 index 00000000..7bcf2388 --- /dev/null +++ b/lib/pages/appUpdatePage/app_update_page.dart @@ -0,0 +1,109 @@ +import 'dart:io'; + +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class AppUpdatePage extends StatefulWidget { + String appUpdateText; + + AppUpdatePage({@required this.appUpdateText}); + + @override + _AppUpdatePageState createState() => _AppUpdatePageState(); +} + +class _AppUpdatePageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: "App Update", + backgroundColor: Colors.white, + isShowAppBar: false, + isShowDecPage: false, + body: SingleChildScrollView( + child: Container( + child: Column( + children: [ + Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SvgPicture.asset( + "assets/images/new-design/update_rocket_image.svg", + fit: BoxFit.fill), + ]), + Container( + margin: EdgeInsets.only(top: 40.0), + width: MediaQuery.of(context).size.width, + child: Text(TranslationBase.of(context).appUpdate, + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xff2d6c90).withOpacity(1.0), + fontSize: 22.0, + fontWeight: FontWeight.bold))), + ], + ), + Container( + margin: EdgeInsets.only(top: 5.0, bottom: 5.0), + child: SvgPicture.asset("assets/images/new-design/HMG_logo.svg", + fit: BoxFit.fill), + ), + Container( + margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), + width: MediaQuery.of(context).size.width, + child: Text(widget.appUpdateText, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey[600], + fontSize: 16.0, + height: 1.5, + fontWeight: FontWeight.bold))), + Container( + margin: EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0), + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + minWidth: MediaQuery.of(context).size.width, + height: 45.0, + child: RaisedButton( + color: Colors.red[800], + textColor: Colors.white, + disabledTextColor: Colors.white, + disabledColor: new Color(0xFFbcc2c4), + onPressed: () { + openAppUpdateLink(); + }, + child: Text(TranslationBase.of(context).appUpdate, + style: TextStyle(fontSize: 18.0)), + ), + ), + ), + ], + ), + ), + ), + ); + } + + openAppUpdateLink() { + if (Platform.isAndroid) { + _launchURL("https://play.google.com/store/apps/details?id=com.ejada.hmg"); + } + if (Platform.isIOS) { + _launchURL("https://itunes.apple.com/app/id733503978"); + } + } + + _launchURL(String url) async { + if (await canLaunch(url)) { + await launch(url); + } else { + throw 'Could not launch $url'; + } + } +} diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 741f2020..052b196e 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -134,8 +134,8 @@ class _MedicalProfilePageState extends State { position: BadgePosition.topEnd(), shape: BadgeShape.circle, - badgeColor: Color(0xFF40ACC9) - .withOpacity(1.0), + badgeColor: Colors + .red[800].withOpacity(1.0), borderRadius: BorderRadius.circular(8), badgeContent: Container( diff --git a/lib/routes.dart b/lib/routes.dart index b11025c2..1fdff27b 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/pages/DrawerPages/family/add-family-member.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/add-family_type.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; +import 'package:diplomaticquarterapp/pages/appUpdatePage/app_update_page.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/login/confirm-login.dart'; @@ -35,6 +36,7 @@ const String SYMPTOM_CHECKER = 'symptom-checker'; const String SYMPTOM_CHECKER_INFO = 'symptom-checker-info'; const String SELECT_GENDER = 'select-gender'; const String SETTINGS = 'settings'; +const String APP_UPDATE = 'app_update'; var routes = { SPLASH: (_) => SplashScreen(), HOME: (_) => LandingPage(), @@ -52,5 +54,6 @@ var routes = { SYMPTOM_CHECKER: (_) => SymptomChecker(), SYMPTOM_CHECKER_INFO: (_) => SymptomInfo(), SELECT_GENDER: (_) => SelectGender(), - SETTINGS: (_) => Settings() + SETTINGS: (_) => Settings(), + APP_UPDATE: (_) => AppUpdatePage() }; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index b1162f5b..845fa869 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -889,6 +889,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get visit => localizedValues['visit'][locale.languageCode]; String get descriptionVaccination => localizedValues['description-vaccination'][locale.languageCode]; String get dueDate => localizedValues['due-date'][locale.languageCode]; + String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; } diff --git a/lib/widgets/bottom_navigation/bottom_navigation_item.dart b/lib/widgets/bottom_navigation/bottom_navigation_item.dart index ba35f3c6..31ed59dc 100644 --- a/lib/widgets/bottom_navigation/bottom_navigation_item.dart +++ b/lib/widgets/bottom_navigation/bottom_navigation_item.dart @@ -80,7 +80,8 @@ class BottomNavigationItem extends StatelessWidget { toAnimate: false, position: BadgePosition.topEnd(), shape: BadgeShape.circle, - badgeColor: Color(0xFF40ACC9).withOpacity(1.0), + badgeColor: Colors + .red[800].withOpacity(1.0), borderRadius: BorderRadius.circular(8), badgeContent: Container( padding: EdgeInsets.all(2.0), From ed56476d816a01c3bb7aab7c326ed8e988c75f42 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Mon, 30 Nov 2020 19:17:19 +0200 Subject: [PATCH 24/69] second step from location fixes --- .../home_health_care_service.dart | 165 ++++++++++++++- lib/core/service/client/base_app_client.dart | 18 +- .../home_health_care_view_model.dart | 28 +++ .../Dialog/select_location_dialog.dart | 140 +++++++++++++ .../NewHomeHealthCare/location_page.dart | 108 ++++++++++ .../new_Home_health_care_step_one_page.dart | 6 +- .../new_Home_health_care_step_tow_page.dart | 193 +++++++++++++----- 7 files changed, 598 insertions(+), 60 deletions(-) create mode 100644 lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/select_location_dialog.dart create mode 100644 lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart diff --git a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart index 2c8683f5..9933b83d 100644 --- a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart +++ b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart @@ -16,9 +16,10 @@ class HomeHealthCareService extends BaseService { List hhcAllPresOrdersList = List(); List hhcAllOrderDetail = List(); + List addressesList = List(); bool isOrderUpdated; - + CustomerInfo customerInfo; Future getHHCAllServices( HHCGetAllServicesRequestModel hHCGetAllServicesRequestModel) async { hasError = false; @@ -91,4 +92,166 @@ class HomeHealthCareService extends BaseService { super.error = error; }, body: order.toJson()); } + + Future getCustomerAddresses() async { + Map queryParams = { + 'fields':'addresses' + }; + hasError = false; + await baseAppClient.get("https://mdlaboratories.com/exacartapi/api/Customers/${customerInfo.customerId}", + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } + + + Future getCustomerInfo() async { + Map queryParams = { + 'FileNumber':'${user.patientID}' + }; + + hasError = false; + await baseAppClient.get("https://mdlaboratories.com/exacartapi/api/VerifyCustomer", + onSuccess: (dynamic response, int statusCode) { + customerInfo= CustomerInfo.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } +} + + +class CustomerInfo { + bool isRegistered; + String userName; + Null password; + String email; + Null errorMessage; + String mobileNumber; + int customerId; + + CustomerInfo( + {this.isRegistered, + this.userName, + this.password, + this.email, + this.errorMessage, + this.mobileNumber, + this.customerId}); + + CustomerInfo.fromJson(Map json) { + isRegistered = json['IsRegistered']; + userName = json['UserName']; + password = json['Password']; + email = json['Email']; + errorMessage = json['ErrorMessage']; + mobileNumber = json['MobileNumber']; + customerId = json['CustomerId']; + } + + Map toJson() { + final Map data = new Map(); + data['IsRegistered'] = this.isRegistered; + data['UserName'] = this.userName; + data['Password'] = this.password; + data['Email'] = this.email; + data['ErrorMessage'] = this.errorMessage; + data['MobileNumber'] = this.mobileNumber; + data['CustomerId'] = this.customerId; + return data; + } +} + + +class AddressInfo { + String id; + String firstName; + String lastName; + String email; + Null company; + int countryId; + String country; + Null stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + Null faxNumber; + String customerAttributes; + String createdOnUtc; + Null province; + String latLong; + + AddressInfo( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + AddressInfo.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } } diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index af8058b9..5baef20e 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -166,8 +166,14 @@ class BaseAppClient { get(String endPoint, {Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, - Map queryParams}) async { - String url = BASE_URL + endPoint; + Map queryParams, + bool isExternal = false}) async { + String url; + if (isExternal) { + url = endPoint; + } else { + url = BASE_URL + endPoint; + } if (queryParams != null) { String queryString = Uri(queryParameters: queryParams).query; url += '?' + queryString; @@ -176,9 +182,11 @@ class BaseAppClient { print("URL : $url"); if (await Utils.checkConnection()) { - final response = await http.get(url.trim(), headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' + final response = await http.get( + url.trim(), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' },); final int statusCode = response.statusCode; print("statusCode :$statusCode"); diff --git a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart index 031d0a0c..adde9224 100644 --- a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart @@ -20,6 +20,10 @@ class HomeHealthCareViewModel extends BaseViewModel { List get hhcAllServicesList => _homeHealthCareService.hhcAllServicesList; + + List get addressesList => + _homeHealthCareService.addressesList; + List get hhcAllPresOrders => _homeHealthCareService.hhcAllPresOrdersList; @@ -93,5 +97,29 @@ class HomeHealthCareViewModel extends BaseViewModel { } + Future getCustomerAddresses() async { + setState(ViewState.Busy); + await _homeHealthCareService.getCustomerAddresses( + ); + if (_homeHealthCareService.hasError) { + error = _homeHealthCareService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + Future getCustomerInfo() async { + setState(ViewState.Busy); + await _homeHealthCareService.getCustomerInfo( + ); + if (_homeHealthCareService.hasError) { + error = _homeHealthCareService.error; + setState(ViewState.ErrorLocal); + } else { + await getCustomerAddresses(); + } + } + } \ No newline at end of file diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/select_location_dialog.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/select_location_dialog.dart new file mode 100644 index 00000000..7adc52d5 --- /dev/null +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/select_location_dialog.dart @@ -0,0 +1,140 @@ +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_cities_response_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/home_health_care_service.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +// ignore: must_be_immutable +class SelectLocationDialog extends StatefulWidget { + final List addresses; + final Function(AddressInfo) onValueSelected; + AddressInfo selectedAddress; + + SelectLocationDialog( + {Key key, this.addresses, this.onValueSelected, this.selectedAddress}); + + @override + _SelectLocationDialogState createState() => _SelectLocationDialogState(); +} + +class _SelectLocationDialogState extends State { + @override + void initState() { + super.initState(); + widget.selectedAddress = widget.selectedAddress ?? widget.addresses[0]; + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Texts("sdsdsd"), + children: [ + Column( + children: [ + Container( + height: 150, + child: SingleChildScrollView( + child: Column( + children: [ + Divider(), + ...List.generate( + widget.addresses.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 2, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + setState(() { + widget.selectedAddress = widget.addresses[index]; + }); + }, + child: ListTile( + title: Text(widget.addresses[index].address1), + leading: Radio( + value: widget.addresses[index], + groupValue: widget.selectedAddress, + activeColor: Colors.red[800], + onChanged: (value) { + setState(() { + widget.selectedAddress = value; + }); + }, + ), + ), + ), + ) + ], + ), + SizedBox( + height: 5.0, + ), + ], + ), + ), + SizedBox( + height: 5.0, + ), + ], + ), + ), + ), + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Center( + child: Texts( + TranslationBase.of(context).cancel.toUpperCase(), + color: Colors.red, + ), + ), + ), + ), + ), + ), + Container( + width: 1, + height: 30, + color: Colors.grey[500], + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + widget.onValueSelected(widget.selectedAddress); + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts( + TranslationBase.of(context).ok, + fontWeight: FontWeight.w400, + )), + ), + ), + ), + ], + ) + ], + ) + ], + ); + } +} diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart new file mode 100644 index 00000000..5f93571a --- /dev/null +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart @@ -0,0 +1,108 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; +import 'package:provider/provider.dart'; + +class LocationPage extends StatefulWidget { + final Function(PickResult) onPick; + final double latitude; + final double longitude; + + const LocationPage( + {Key key, + this.onPick, + this.latitude, + this.longitude, + }) + : super(key: key); + + @override + _LocationPageState createState() => + _LocationPageState(); +} + +class _LocationPageState + extends State { + double latitude = 0; + double longitude = 0; + + @override + void initState() { + + latitude = widget.latitude; + longitude = widget.longitude; + super.initState(); + } + + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return AppScaffold( + isShowDecPage: false, + isShowAppBar: true, + body: PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + onPlacePicked: (PickResult result) { + print(result.adrAddress); + + }, + selectedPlaceWidgetBuilder: + (_, selectedPlace, state, isSearchBarFocused) { + print("state: $state, isSearchBarFocused: $isSearchBarFocused"); + return isSearchBarFocused + ? Container() + : FloatingCard( + bottomPosition: 0.0, + leftPosition: 0.0, + rightPosition: 0.0, + width: 500, + borderRadius: BorderRadius.circular(12.0), + child: state == SearchingState.Searching + ? Center(child: CircularProgressIndicator()) + : Container( + margin: EdgeInsets.all(12), + child: Column( + children: [ + SecondaryButton( + color: Colors.grey[800], + textColor: Colors.white, + onTap: () { + print(selectedPlace); + // setState(() { + // widget.patientERInsertPresOrderRequestModel + // .latitude = + // selectedPlace.geometry.location.lat; + // widget.patientERInsertPresOrderRequestModel + // .longitude = + // selectedPlace.geometry.location.lng; + // }); + }, + label: " Add New Address ", + ), + ], + ), + ), + ); + }, + initialPosition: LatLng(latitude, longitude), + useCurrentLocation: false, + ), + ); + } +} diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart index 06cb7b69..c41892d3 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart @@ -138,9 +138,11 @@ class _NewHomeHealthCareStepOnePageState extends State { double latitude = 0; double longitude = 0; + AddressInfo _selectedAddress; @override void initState() { + print(widget.model.addressesList); if (widget.patientERInsertPresOrderRequestModel.latitude == null) { - latitude = widget.latitude; - longitude = widget.longitude; + setLatitudeAndLongitude(); } else { latitude = widget.patientERInsertPresOrderRequestModel.latitude; longitude = widget.patientERInsertPresOrderRequestModel.longitude; } + super.initState(); } + setLatitudeAndLongitude({bool isSetState = false, String latLong}) { + if (latLong == null) + latLong = widget.model.addressesList[widget.model.addressesList + .length - 1].latLong; + List latLongArr = latLong.split(','); + + latitude = double.parse(latLongArr[0]); + longitude = double.parse(latLongArr[1]); + } + @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( isShowDecPage: false, - body: PlacePicker( - apiKey: GOOGLE_API_KEY, - enableMyLocationButton: true, - automaticallyImplyAppBarLeading: false, - autocompleteOnTrailingWhitespace: true, - selectInitialPosition: true, - autocompleteLanguage: projectViewModel.currentLanguage, - enableMapTypeButton: true, - onPlacePicked: (PickResult result) { - print(result.adrAddress); - widget.changePageViewIndex(3); - }, - selectedPlaceWidgetBuilder: - (_, selectedPlace, state, isSearchBarFocused) { - print("state: $state, isSearchBarFocused: $isSearchBarFocused"); - return isSearchBarFocused - ? Container() - : FloatingCard( - bottomPosition: 0.0, - leftPosition: 0.0, - rightPosition: 0.0, - width: 500, - borderRadius: BorderRadius.circular(12.0), - child: state == SearchingState.Searching - ? Center(child: CircularProgressIndicator()) - : Container( - margin: EdgeInsets.all(12), - child: SecondaryButton( - color: Colors.grey[800], - textColor: Colors.white, - onTap: () { - setState(() { - widget.patientERInsertPresOrderRequestModel - .latitude = - selectedPlace.geometry.location.lat; - widget.patientERInsertPresOrderRequestModel - .longitude = - selectedPlace.geometry.location.lng; - }); - widget.changePageViewIndex(3); - }, - label: TranslationBase.of(context).next, - ), - ), - ); + body: Stack( + children: [ + PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + + onPlacePicked: (PickResult result) { + print(result.adrAddress); + widget.changePageViewIndex(3); + }, + selectedPlaceWidgetBuilder: + (_, selectedPlace, state, isSearchBarFocused) { + print("state: $state, isSearchBarFocused: $isSearchBarFocused"); + return isSearchBarFocused + ? Container() + : FloatingCard( + bottomPosition: 0.0, + leftPosition: 0.0, + rightPosition: 0.0, + width: 500, + borderRadius: BorderRadius.circular(12.0), + child: state == SearchingState.Searching + ? Center(child: CircularProgressIndicator()) + : Container( + margin: EdgeInsets.all(12), + child: Column( + children: [ + SecondaryButton( + color: Colors.grey[800], + textColor: Colors.white, + onTap: () { + Navigator.pushReplacement( + context, MaterialPageRoute( + builder: (BuildContext context) => + LocationPage(latitude: latitude, + longitude: longitude,))); + }, + label: " Add New Address ", + ), + SizedBox(height: 10,), + SecondaryButton( + color: Colors.red[800], + textColor: Colors.white, + onTap: () { + setState(() { + widget.patientERInsertPresOrderRequestModel + .latitude = + selectedPlace.geometry.location.lat; + widget.patientERInsertPresOrderRequestModel + .longitude = + selectedPlace.geometry.location.lng; + }); + widget.changePageViewIndex(3); + }, + label: " Continue ", + ), + ], + ), + ), + ); + }, + initialPosition: LatLng(latitude, longitude), + useCurrentLocation: false, + ), + Container( + child: InkWell( + onTap: () => + confirmSelectLocationDialog(widget.model.addressesList), + child: Container( + padding: EdgeInsets.all(10), + width: double.infinity, + // height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: Texts(getAddressName(), fontSize: 14,),), + Icon(Icons.arrow_drop_down) + ], + ), + ), + ), + height: 56, width: double.infinity, color: Theme + .of(context) + .scaffoldBackgroundColor, + + ) + ], + ), + ); + } + + + void confirmSelectLocationDialog(List addresses) { + showDialog( + context: context, + child: SelectLocationDialog( + addresses: addresses, + selectedAddress: _selectedAddress + , + onValueSelected: (value) { + setLatitudeAndLongitude(latLong: value.latLong); + setState(() { + _selectedAddress = value; + }); }, - initialPosition: LatLng(latitude, longitude), - useCurrentLocation: true, ), ); } + + String getAddressName() { + if (_selectedAddress != null) + return _selectedAddress.address1; + else + return "Select Address" /*TranslationBase.of(context).selectHospital*/; + } } From 648d9d245d1285f57a1260c3d86db1b1ffabf815 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Mon, 30 Nov 2020 08:14:07 +0300 Subject: [PATCH 25/69] health weather indicator --- lib/core/model/weahter/weather_model.dart | 266 ++++++++++++++++++ lib/core/service/weather_service.dart | 38 +++ .../weather/weather_view_model.dart | 31 ++ .../all_habib_medical_service_page.dart | 14 +- .../health-weather-indicator.dart | 106 +++++++ lib/routes.dart | 4 +- lib/widgets/slider/slider.dart | 0 .../weather_slider/weather_slider.dart | 55 ++++ 8 files changed, 511 insertions(+), 3 deletions(-) create mode 100644 lib/core/model/weahter/weather_model.dart create mode 100644 lib/core/service/weather_service.dart create mode 100644 lib/core/viewModels/weather/weather_view_model.dart delete mode 100644 lib/widgets/slider/slider.dart create mode 100644 lib/widgets/weather_slider/weather_slider.dart diff --git a/lib/core/model/weahter/weather_model.dart b/lib/core/model/weahter/weather_model.dart new file mode 100644 index 00000000..7ee84bac --- /dev/null +++ b/lib/core/model/weahter/weather_model.dart @@ -0,0 +1,266 @@ +class WeatherIndicatorModel { + Null date; + int languageID; + int serviceName; + Null time; + Null androidLink; + Null authenticationTokenID; + Null data; + bool dataw; + int dietType; + Null errorCode; + Null errorEndUserMessage; + Null errorEndUserMessageN; + Null errorMessage; + int errorType; + int foodCategory; + Null iOSLink; + bool isAuthenticated; + int mealOrderStatus; + int mealType; + int messageStatus; + int numberOfResultRecords; + Null patientBlodType; + Null successMsg; + Null successMsgN; + Null citiesList; + Null cityName; + Null get5DaysWeatherForecastList; + List getCityInfoList; + Null getTodayWeatherForecastList; + Null iniciesList; + + WeatherIndicatorModel( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.citiesList, + this.cityName, + this.get5DaysWeatherForecastList, + this.getCityInfoList, + this.getTodayWeatherForecastList, + this.iniciesList}); + + WeatherIndicatorModel.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + citiesList = json['CitiesList']; + cityName = json['CityName']; + get5DaysWeatherForecastList = json['Get5DaysWeatherForecastList']; + if (json['GetCityInfo_List'] != null) { + getCityInfoList = new List(); + json['GetCityInfo_List'].forEach((v) { + getCityInfoList.add(new GetCityInfoList.fromJson(v)); + }); + } + getTodayWeatherForecastList = json['GetTodayWeatherForecastList']; + iniciesList = json['IniciesList']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['CitiesList'] = this.citiesList; + data['CityName'] = this.cityName; + data['Get5DaysWeatherForecastList'] = this.get5DaysWeatherForecastList; + if (this.getCityInfoList != null) { + data['GetCityInfo_List'] = + this.getCityInfoList.map((v) => v.toJson()).toList(); + } + data['GetTodayWeatherForecastList'] = this.getTodayWeatherForecastList; + data['IniciesList'] = this.iniciesList; + return data; + } +} + +class GetCityInfoList { + CategoriesNames categoriesNames; + String category; + String categoryValue; + int cityID; + String cityName; + String cityNameN; + String colorName; + String createdOn; + String iD; + int iniceID; + bool isOrderEmpty; + bool isValuesReversed; + bool language; + double latitude; + double longitude; + String name; + int orderNum; + double temperature; + String value; + + GetCityInfoList( + {this.categoriesNames, + this.category, + this.categoryValue, + this.cityID, + this.cityName, + this.cityNameN, + this.colorName, + this.createdOn, + this.iD, + this.iniceID, + this.isOrderEmpty, + this.isValuesReversed, + this.language, + this.latitude, + this.longitude, + this.name, + this.orderNum, + this.temperature, + this.value}); + + GetCityInfoList.fromJson(Map json) { + categoriesNames = json['CategoriesNames'] != null + ? new CategoriesNames.fromJson(json['CategoriesNames']) + : null; + category = json['Category']; + categoryValue = json['CategoryValue']; + cityID = json['CityID']; + cityName = json['CityName']; + cityNameN = json['CityNameN']; + colorName = json['ColorName']; + createdOn = json['CreatedOn']; + iD = json['ID']; + iniceID = json['IniceID']; + isOrderEmpty = json['IsOrderEmpty']; + isValuesReversed = json['IsValuesReversed']; + language = json['Language']; + latitude = json['Latitude']; + longitude = json['Longitude']; + name = json['Name']; + orderNum = json['OrderNum']; + temperature = json['Temperature']; + value = json['Value']; + } + + Map toJson() { + final Map data = new Map(); + if (this.categoriesNames != null) { + data['CategoriesNames'] = this.categoriesNames.toJson(); + } + data['Category'] = this.category; + data['CategoryValue'] = this.categoryValue; + data['CityID'] = this.cityID; + data['CityName'] = this.cityName; + data['CityNameN'] = this.cityNameN; + data['ColorName'] = this.colorName; + data['CreatedOn'] = this.createdOn; + data['ID'] = this.iD; + data['IniceID'] = this.iniceID; + data['IsOrderEmpty'] = this.isOrderEmpty; + data['IsValuesReversed'] = this.isValuesReversed; + data['Language'] = this.language; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['Name'] = this.name; + data['OrderNum'] = this.orderNum; + data['Temperature'] = this.temperature; + data['Value'] = this.value; + return data; + } +} + +class CategoriesNames { + String category1; + String category2; + String category3; + String category4; + String category5; + + CategoriesNames( + {this.category1, + this.category2, + this.category3, + this.category4, + this.category5}); + + CategoriesNames.fromJson(Map json) { + category1 = json['Category1']; + category2 = json['Category2']; + category3 = json['Category3']; + category4 = json['Category4']; + category5 = json['Category5']; + } + + Map toJson() { + final Map data = new Map(); + data['Category1'] = this.category1; + data['Category2'] = this.category2; + data['Category3'] = this.category3; + data['Category4'] = this.category4; + data['Category5'] = this.category5; + return data; + } +} diff --git a/lib/core/service/weather_service.dart b/lib/core/service/weather_service.dart new file mode 100644 index 00000000..828a665b --- /dev/null +++ b/lib/core/service/weather_service.dart @@ -0,0 +1,38 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/er/projectavgerwaitingtime.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class WeatherService extends BaseService { + List projectAvgERWaitingTimeModelList = List(); + + Map body = Map(); + String Latitude = ""; + String Longitude = ""; + String PhoneNumber = ""; + + Future getProjectAvgERWaitingTimeOrders() async { + hasError = false; + + var lat = await sharedPref.getDouble(USER_LAT); + var long = await sharedPref.getDouble(USER_LONG); + body['Latitude'] = lat ?? 0; + body['Longitude'] = long ?? 0; + + await baseAppClient.post(GET_NEAREST_HOSPITAL, + onSuccess: (dynamic response, int statusCode) { + response['List_ProjectAvgERWaitingTime'].forEach((vital) { + projectAvgERWaitingTimeModelList + .add(ProjectAvgERWaitingTime.fromJson(vital)); + }); + projectAvgERWaitingTimeModelList.forEach((element) { + Latitude = '${element.latitude}'; + Longitude = '${element.longitude}'; + PhoneNumber = '${element.phoneNumber}'; + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/weather/weather_view_model.dart b/lib/core/viewModels/weather/weather_view_model.dart new file mode 100644 index 00000000..eb00db9b --- /dev/null +++ b/lib/core/viewModels/weather/weather_view_model.dart @@ -0,0 +1,31 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/er/projectavgerwaitingtime.dart'; + +import 'package:diplomaticquarterapp/core/service/er/er_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; + +import '../../../locator.dart'; + +class WeatherViewModel extends BaseViewModel { + ErService _erService = locator(); + + List get ProjectAvgERWaitingTimeModeList => + _erService.projectAvgERWaitingTimeModelList; + + getProjectAvgERWaitingTimeOrders({int id, int projectID}) async { + setState(ViewState.Busy); + + if (id != null && projectID != null) { + await _erService.getProjectAvgERWaitingTimeOrders( + id: id, projectID: projectID); + } else { + await _erService.getProjectAvgERWaitingTimeOrders(); + } + if (_erService.hasError) { + error = _erService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index 7e3d4181..d46a357c 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20hea import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/h2o/h2o_index_page.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/health_converter.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/my_web_view.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/parking_page.dart'; @@ -98,7 +99,16 @@ class _AllHabibMedicalServiceState extends State { ], ), Expanded( - child: Column( + child:InkWell( + onTap: (){ + Navigator.push( + context, + FadePage( + page: HealthWeatherIndicator(), + ), + ); + }, + child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Image.asset('assets/images/Weather_ico.png',width: 80,height: 80,), @@ -108,7 +118,7 @@ class _AllHabibMedicalServiceState extends State { decoration: TextDecoration.underline, ), ], - ), + )), ) ], ), diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart index e69de29b..aa384a66 100644 --- a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart +++ b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart @@ -0,0 +1,106 @@ +import 'package:diplomaticquarterapp/core/model/contactus/get_hmg_locations.dart'; +import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/slider/slider.dart'; +import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_xlider/flutter_xlider.dart'; +import 'package:giffy_dialog/giffy_dialog.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:maps_launcher/maps_launcher.dart'; + +class HealthWeatherIndicator extends StatefulWidget { + + + @override + _HospitalsPageState createState() => _HospitalsPageState(); +} + +class _HospitalsPageState extends State { + LinearGradient gradient = LinearGradient( + colors: [ + Colors.red, + Colors.orange, + Colors.yellow, + Colors.green, + Colors.blue, + Colors.blue[900], + Colors.purple + ] + ); + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowDecPage: false, + appBarTitle: TranslationBase.of(context).healthWeatherIndicators, + isShowAppBar: true, + body: SingleChildScrollView( + child: Column(children: [ + WeatherSlider(.4, LinearGradient(colors: [Colors.redAccent[100],Colors.redAccent ])), + WeatherSlider(.6, LinearGradient(colors: [Colors.greenAccent[100],Colors.greenAccent ])), + WeatherSlider(.8, LinearGradient(colors: [Colors.yellowAccent[100],Colors.yellowAccent ])), + ]) + ), + ); + } +} + + +class WeatherSlider extends StatelessWidget{ + final width; + final LinearGradient color; + WeatherSlider(this.width, this.color); + + @override + Widget build(BuildContext context) { + // TODO: implement build + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + AppText('Low', fontSize: 24,), + + Padding( + padding: EdgeInsets.all(10), + child: + Stack( + children: [ + Container( + decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.grey[100],Colors.grey[400] ]), + borderRadius: BorderRadius.circular(10) + ), + height: 15, width: MediaQuery.of(context).size.width, + child:SizedBox(), + ), + Positioned( + top:0, + child: Container( + decoration: BoxDecoration(gradient: color, + borderRadius: BorderRadius.circular(10) + ), + height: 15, + width: MediaQuery.of(context).size.width * width, + padding: EdgeInsets.all(10), + child:SizedBox(), + + )), + + ], + )), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText('Low', fontSize: 12,), + AppText('Moderate', fontSize: 12,), + AppText('High', fontSize: 12,), + AppText('Very High', fontSize: 12,), + AppText('Extreme', fontSize: 12,), + ],) + ],); + + } +} \ No newline at end of file diff --git a/lib/routes.dart b/lib/routes.dart index b11025c2..74a6a189 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/add-family-member.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/add-family_type.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; @@ -52,5 +53,6 @@ var routes = { SYMPTOM_CHECKER: (_) => SymptomChecker(), SYMPTOM_CHECKER_INFO: (_) => SymptomInfo(), SELECT_GENDER: (_) => SelectGender(), - SETTINGS: (_) => Settings() + SETTINGS: (_) => Settings(), + HEALTH_WEATHER: (_)=> HealthWeatherIndicator() }; diff --git a/lib/widgets/slider/slider.dart b/lib/widgets/slider/slider.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/widgets/weather_slider/weather_slider.dart b/lib/widgets/weather_slider/weather_slider.dart new file mode 100644 index 00000000..8eafab4c --- /dev/null +++ b/lib/widgets/weather_slider/weather_slider.dart @@ -0,0 +1,55 @@ + + +class WeatherSlider extends StatelessWidget{ + final width; + final LinearGradient color; + WeatherSlider(this.width, this.color); + + @override + Widget build(BuildContext context) { + // TODO: implement build + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText('Low', fontSize: 24,), + + Padding( + padding: EdgeInsets.all(10), + child: + Stack( + children: [ + Container( + decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.grey[100],Colors.grey[400] ]), + borderRadius: BorderRadius.circular(10) + ), + height: 15, width: MediaQuery.of(context).size.width, + child:SizedBox(), + ), + Positioned( + top:0, + child: Container( + decoration: BoxDecoration(gradient: color, + borderRadius: BorderRadius.circular(10) + ), + height: 15, + width: MediaQuery.of(context).size.width * width, + padding: EdgeInsets.all(10), + child:SizedBox(), + + )), + + ], + )), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText('Low', fontSize: 12,), + AppText('Moderate', fontSize: 12,), + AppText('High', fontSize: 12,), + AppText('Very High', fontSize: 12,), + AppText('Extreme', fontSize: 12,), + ],) + ],); + + } +} \ No newline at end of file From 7d3c1ac852f5acd530ad1ab763c862c2b24cf4dc Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Tue, 1 Dec 2020 15:30:38 +0300 Subject: [PATCH 26/69] weather indicator updated --- lib/config/config.dart | 9 +- lib/config/shared_pref_kay.dart | 3 +- lib/core/service/weather_service.dart | 23 +- .../weather/weather_view_model.dart | 28 +-- lib/locator.dart | 6 +- .../all_habib_medical_service_page.dart | 100 ++++---- .../health-weather-indicator.dart | 126 +++------- lib/routes.dart | 1 + .../weather_slider/weather_slider.dart | 224 ++++++++++++++---- 9 files changed, 314 insertions(+), 206 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 37da28b4..2cd553fa 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,11 +6,13 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; - - const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; // const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; +//weather +const WEATHER_INDICATOR = 'Services/Weather.svc/REST/GetCityInfo'; + ///Doctor const GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; @@ -256,8 +258,7 @@ const GET_PAtIENTS_INSURANCE = const GET_PAtIENTS_INSURANCE_UPDATED = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; -const INSURANCE_DETAILS = - "Services/Patients.svc/REST/Get_InsuranceCheckList"; +const INSURANCE_DETAILS = "Services/Patients.svc/REST/Get_InsuranceCheckList"; const GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID"; const GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail"; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index ac611c71..bcd7195b 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -18,4 +18,5 @@ const IS_SEARCH_APPO = 'is-search-appo'; const IS_LIVECARE_APPOINTMENT = 'is_livecare_appointment'; const IS_VIBRATION = 'is_vibration'; const THEME_VALUE = 'is_vibration'; -const MAIN_USER = 'main-user'; \ No newline at end of file +const MAIN_USER = 'main-user'; +const WEATHER = 'weather'; \ No newline at end of file diff --git a/lib/core/service/weather_service.dart b/lib/core/service/weather_service.dart index 828a665b..b2dcf0ef 100644 --- a/lib/core/service/weather_service.dart +++ b/lib/core/service/weather_service.dart @@ -1,17 +1,17 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/model/er/projectavgerwaitingtime.dart'; +import 'package:diplomaticquarterapp/core/model/weahter/weather_model.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; class WeatherService extends BaseService { - List projectAvgERWaitingTimeModelList = List(); + List weatherIndicatorData = List(); Map body = Map(); String Latitude = ""; String Longitude = ""; String PhoneNumber = ""; - Future getProjectAvgERWaitingTimeOrders() async { + Future getWeatherData() async { hasError = false; var lat = await sharedPref.getDouble(USER_LAT); @@ -19,20 +19,19 @@ class WeatherService extends BaseService { body['Latitude'] = lat ?? 0; body['Longitude'] = long ?? 0; - await baseAppClient.post(GET_NEAREST_HOSPITAL, + await baseAppClient.post(WEATHER_INDICATOR, onSuccess: (dynamic response, int statusCode) { - response['List_ProjectAvgERWaitingTime'].forEach((vital) { - projectAvgERWaitingTimeModelList - .add(ProjectAvgERWaitingTime.fromJson(vital)); - }); - projectAvgERWaitingTimeModelList.forEach((element) { - Latitude = '${element.latitude}'; - Longitude = '${element.longitude}'; - PhoneNumber = '${element.phoneNumber}'; + + + response['GetCityInfo_List'].forEach((data) { + weatherIndicatorData.add(GetCityInfoList.fromJson(data)); }); + print(weatherIndicatorData); + }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, body: body); + await this.sharedPref.setObject(WEATHER,weatherIndicatorData[0]); } } diff --git a/lib/core/viewModels/weather/weather_view_model.dart b/lib/core/viewModels/weather/weather_view_model.dart index eb00db9b..85b019e4 100644 --- a/lib/core/viewModels/weather/weather_view_model.dart +++ b/lib/core/viewModels/weather/weather_view_model.dart @@ -1,29 +1,29 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/er/projectavgerwaitingtime.dart'; +import 'package:diplomaticquarterapp/core/model/weahter/weather_model.dart'; import 'package:diplomaticquarterapp/core/service/er/er_service.dart'; +import 'package:diplomaticquarterapp/core/service/weather_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; import '../../../locator.dart'; class WeatherViewModel extends BaseViewModel { - ErService _erService = locator(); - - List get ProjectAvgERWaitingTimeModeList => - _erService.projectAvgERWaitingTimeModelList; - - getProjectAvgERWaitingTimeOrders({int id, int projectID}) async { + WeatherService _weatherService = locator(); + List get weatherIndicatorData => + _weatherService.weatherIndicatorData; + getWeatherData({int id, int projectID}) async { setState(ViewState.Busy); - if (id != null && projectID != null) { - await _erService.getProjectAvgERWaitingTimeOrders( - id: id, projectID: projectID); - } else { - await _erService.getProjectAvgERWaitingTimeOrders(); - } - if (_erService.hasError) { - error = _erService.error; + // if (id != null && projectID != null) { + // await _erService.getProjectAvgERWaitingTimeOrders( + // id: id, projectID: projectID); + // } else { + await _weatherService.getWeatherData(); + // } + if (_weatherService.hasError) { + error = _weatherService.error; setState(ViewState.Error); } else setState(ViewState.Idle); diff --git a/lib/locator.dart b/lib/locator.dart index d13d4057..310558f2 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -1,9 +1,11 @@ import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/H2O_service.dart'; import 'package:diplomaticquarterapp/core/service/qr_service.dart'; +import 'package:diplomaticquarterapp/core/service/weather_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/H2O_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/child_vaccines/user_information_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/weather/weather_view_model.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; @@ -132,7 +134,7 @@ void setupLocator() { locator.registerLazySingleton(() => DeleteBabyService()); locator.registerLazySingleton(() => VaccinationTableService()); locator.registerLazySingleton(() => NotificationService()); - + locator.registerLazySingleton(() => WeatherService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -152,6 +154,7 @@ void setupLocator() { locator.registerFactory(() => QrViewModel()); locator.registerFactory(() => ReportsMonthlyViewModel()); locator.registerFactory(() => NearHospitalViewModel()); + locator.registerFactory(() => WeatherViewModel()); locator.registerFactory(() => AmRequestViewModel()); locator.registerFactory(() => PatientSickLeaveViewMode()); locator.registerFactory(() => MyBalanceViewModel()); @@ -175,5 +178,4 @@ void setupLocator() { locator.registerFactory(() => HomeHealthCareViewModel()); locator.registerFactory(() => CMCViewModel()); locator.registerFactory(() => NotificationViewModel()); - } diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index d46a357c..5deac2f2 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -22,10 +22,12 @@ import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/symptom-checker/info.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/services)contaniner.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -44,11 +46,13 @@ class AllHabibMedicalService extends StatefulWidget { class _AllHabibMedicalServiceState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); AuthenticatedUser authUser = new AuthenticatedUser(); - + LocationUtils locationUtils; + var weather ='--'; @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { getAuthUser(); + locationUtils.getCurrentLocation(); }); super.initState(); } @@ -77,28 +81,33 @@ class _AllHabibMedicalServiceState extends State { fit: BoxFit.cover, ), borderRadius: BorderRadius.circular(8.0)), + child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Row( children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context) - .healthWeatherIndicators, - color: Colors.white, - fontWeight: FontWeight.w600, - ), - Texts( - TranslationBase.of(context).healthTipsBasedOnCurrentWeather, - color: Colors.white, - fontSize: 14, - ), - ], - ), Expanded( + flex:3, + child: + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context) + .healthWeatherIndicators, + color: Colors.white, + fontWeight: FontWeight.w600, + ), + Texts( + TranslationBase.of(context).healthTipsBasedOnCurrentWeather, + color: Colors.white, + fontSize: 14, + ), + ], + )), + Expanded( + flex: 2, child:InkWell( onTap: (){ Navigator.push( @@ -109,16 +118,22 @@ class _AllHabibMedicalServiceState extends State { ); }, child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Image.asset('assets/images/Weather_ico.png',width: 80,height: 80,), - Texts( - TranslationBase.of(context).moreDetails, - color: Colors.white, - decoration: TextDecoration.underline, - ), - ], - )), + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/images/Weather_ico.png',width: 60,height: 60,), + AppText(weather, fontSize: 22, color:Colors.white) + ],), + + Texts( + TranslationBase.of(context).moreDetails, + color: Colors.white, + decoration: TextDecoration.underline, + ), + ], + )), ) ], ), @@ -130,7 +145,7 @@ class _AllHabibMedicalServiceState extends State { widget.goToMyProfile(); }, imageLocation: - 'assets/images/new-design/my_file_bottom_bar.png', + 'assets/images/new-design/my_file_bottom_bar.png', title: TranslationBase.of(context).myMedicalFile, ), @@ -144,7 +159,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/booking_icon_active.png', + 'assets/images/new-design/booking_icon_active.png', title: TranslationBase.of(context).bookAppo, ), ServicesContainer( @@ -155,7 +170,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/al-habib_online_payment_service_icon.png', + 'assets/images/al-habib_online_payment_service_icon.png', title: TranslationBase.of(context).onlinePaymentService, ), @@ -182,7 +197,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/family_menu_icon_red.png', + 'assets/images/new-design/family_menu_icon_red.png', title: 'My Family', ), @@ -194,7 +209,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/upcoming_icon_bottom_bar.png', + 'assets/images/new-design/upcoming_icon_bottom_bar.png', title: TranslationBase.of(context).todoList, ), @@ -206,27 +221,27 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/parking_system_icon.png', + 'assets/images/new-design/parking_system_icon.png', title: TranslationBase.of(context).parking, ), ServicesContainer( onTap: () => launch( "https://hmgwebservices.com/vt_mobile/html/index.html"), imageLocation: - 'assets/images/new-design/virtual_tour_icon.png', + 'assets/images/new-design/virtual_tour_icon.png', title: 'Virtual Tour', ), ServicesContainer( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (BuildContext context) => MyWebView( - title: "HMG News", - selectedUrl: - "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", - ))); + title: "HMG News", + selectedUrl: + "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", + ))); }, imageLocation: - 'assets/images/new-design/twitter_dashboard_icon.png', + 'assets/images/new-design/twitter_dashboard_icon.png', title: 'Latest News', ), ServicesContainer( @@ -248,13 +263,16 @@ class _AllHabibMedicalServiceState extends State { } getAuthUser() async { + if (await this.sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson( await this.sharedPref.getObject(USER_PROFILE)); setState(() { authUser = data; }); - print(authUser.patientID); } + var data = await this.sharedPref.getObject(WEATHER); + weather = data['Temperature'].toString() + '\u2103' ?? '--'; + print(data); } } diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart index aa384a66..98aba205 100644 --- a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart +++ b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart @@ -1,106 +1,56 @@ -import 'package:diplomaticquarterapp/core/model/contactus/get_hmg_locations.dart'; -import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/weather/weather_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/slider/slider.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_xlider/flutter_xlider.dart'; -import 'package:giffy_dialog/giffy_dialog.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:maps_launcher/maps_launcher.dart'; +import 'package:provider/provider.dart'; class HealthWeatherIndicator extends StatefulWidget { - - @override _HospitalsPageState createState() => _HospitalsPageState(); } + class _HospitalsPageState extends State { - LinearGradient gradient = LinearGradient( - colors: [ - Colors.red, - Colors.orange, - Colors.yellow, - Colors.green, - Colors.blue, - Colors.blue[900], - Colors.purple - ] - ); + var data; + LocationUtils locationUtils; + @override + void initState() { + locationUtils = + new LocationUtils(isShowConfirmDialog: true, context: context); + WidgetsBinding.instance + .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); + + super.initState(); + } @override Widget build(BuildContext context) { - return AppScaffold( - isShowDecPage: false, - appBarTitle: TranslationBase.of(context).healthWeatherIndicators, - isShowAppBar: true, - body: SingleChildScrollView( - child: Column(children: [ - WeatherSlider(.4, LinearGradient(colors: [Colors.redAccent[100],Colors.redAccent ])), - WeatherSlider(.6, LinearGradient(colors: [Colors.greenAccent[100],Colors.greenAccent ])), - WeatherSlider(.8, LinearGradient(colors: [Colors.yellowAccent[100],Colors.yellowAccent ])), - ]) - ), + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getWeatherData(), + builder: (_, mode, widget) => AppScaffold( + isShowDecPage: false, + appBarTitle: TranslationBase.of(context).healthWeatherIndicators, + isShowAppBar: true, + baseViewModel: mode, + body: mode.weatherIndicatorData.length>0 ? SingleChildScrollView( + child: Column(children: [ + Padding(padding: EdgeInsets.all(15), child:AppText( projectViewModel.isArabic ? mode.weatherIndicatorData[0].cityNameN : mode.weatherIndicatorData[0].cityName, fontSize: 24, fontWeight: FontWeight.bold,)), + Padding( + padding: EdgeInsets.all(15), + child: Column(children: + mode.weatherIndicatorData + .map((data) { + return WeatherSlider( + data); + }).toList() + + ))])) : Container(child:AppText('Loading...'))), ); } } - - -class WeatherSlider extends StatelessWidget{ - final width; - final LinearGradient color; - WeatherSlider(this.width, this.color); - - @override - Widget build(BuildContext context) { - // TODO: implement build - return Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - AppText('Low', fontSize: 24,), - - Padding( - padding: EdgeInsets.all(10), - child: - Stack( - children: [ - Container( - decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.grey[100],Colors.grey[400] ]), - borderRadius: BorderRadius.circular(10) - ), - height: 15, width: MediaQuery.of(context).size.width, - child:SizedBox(), - ), - Positioned( - top:0, - child: Container( - decoration: BoxDecoration(gradient: color, - borderRadius: BorderRadius.circular(10) - ), - height: 15, - width: MediaQuery.of(context).size.width * width, - padding: EdgeInsets.all(10), - child:SizedBox(), - - )), - - ], - )), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText('Low', fontSize: 12,), - AppText('Moderate', fontSize: 12,), - AppText('High', fontSize: 12,), - AppText('Very High', fontSize: 12,), - AppText('Extreme', fontSize: 12,), - ],) - ],); - - } -} \ No newline at end of file diff --git a/lib/routes.dart b/lib/routes.dart index 74a6a189..dc49ce18 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -36,6 +36,7 @@ const String SYMPTOM_CHECKER = 'symptom-checker'; const String SYMPTOM_CHECKER_INFO = 'symptom-checker-info'; const String SELECT_GENDER = 'select-gender'; const String SETTINGS = 'settings'; +const String HEALTH_WEATHER = 'health-weather'; var routes = { SPLASH: (_) => SplashScreen(), HOME: (_) => LandingPage(), diff --git a/lib/widgets/weather_slider/weather_slider.dart b/lib/widgets/weather_slider/weather_slider.dart index 8eafab4c..61d5c1d5 100644 --- a/lib/widgets/weather_slider/weather_slider.dart +++ b/lib/widgets/weather_slider/weather_slider.dart @@ -1,55 +1,191 @@ +import 'package:diplomaticquarterapp/core/model/weahter/weather_model.dart'; +import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; - -class WeatherSlider extends StatelessWidget{ - final width; - final LinearGradient color; - WeatherSlider(this.width, this.color); - +class WeatherSlider extends StatelessWidget { + // final width; + // final LinearGradient color; + final GetCityInfoList data; + WeatherSlider(this.data); + LinearGradient red = LinearGradient( + colors: [ + Colors.redAccent[100], + Colors.redAccent + ]); + LinearGradient green = LinearGradient( + colors: [ + Colors.greenAccent[100], + Colors.greenAccent + ]); + LinearGradient grey = LinearGradient( + colors: [ + Colors.grey[100], + Colors.grey + ]); + LinearGradient orange = LinearGradient( + colors: [ + Colors.orangeAccent[100], + Colors.orange + ]); + LinearGradient yellow = LinearGradient( + colors: [ + Colors.yellow[100], + Colors.yellow[600] + ]); @override Widget build(BuildContext context) { // TODO: implement build return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppText('Low', fontSize: 24,), - - Padding( - padding: EdgeInsets.all(10), - child: - Stack( - children: [ - Container( - decoration: BoxDecoration(gradient: LinearGradient(colors: [Colors.grey[100],Colors.grey[400] ]), - borderRadius: BorderRadius.circular(10) + Padding( + padding: EdgeInsets.only(top:10), + child: AppText(data.name)), + AppText( + data.category, + fontSize: 24, + ), + Padding( + padding: EdgeInsets.all(10), + child: Stack( + children: [ + Container( + margin: EdgeInsets.only(bottom:10), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.grey[100], Colors.grey[400]]), + borderRadius: BorderRadius.circular(10)), + height: 15, + width: MediaQuery.of(context).size.width, + child: SizedBox(), + ), + Positioned( + top: 0, + child: Container( + decoration: BoxDecoration( + gradient: data.colorName =='red' ? red : data.colorName =='orange' ? orange : data.colorName =='green' ? green : data.colorName == 'yellow' ? yellow : grey, + borderRadius: BorderRadius.circular(10)), + height: 15, + width: (MediaQuery.of(context).size.width * (double.parse(data.value) / 10)), + padding: EdgeInsets.all(15), + child: SizedBox(), + )), + Positioned(child: Container( + height: 0, + width:0, + decoration: ShapeDecoration( + color:data.colorName =='red' ? Colors.redAccent : data.colorName =='orange' ? Colors.orangeAccent : data.colorName =='green' ? Colors.greenAccent : data.colorName == 'yellow' ? Colors.yellowAccent : Colors.grey, + shape: MessageBorder(), + + )),top:25, left: (MediaQuery.of(context).size.width * (double.parse(data.value) / 10)),) + + ], + ), + + ), + Padding( + padding: EdgeInsets.only(top:10), + child: data.isValuesReversed == false ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText( + data.categoriesNames.category1, + fontSize: 12, + color: data.categoriesNames.category1== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category1== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category1== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category1== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + ), + AppText( + data.categoriesNames.category2, + fontSize: 12, + color: data.categoriesNames.category2== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category2== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category2== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category2== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category3, + fontSize: 12, + color: data.categoriesNames.category3== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category3== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category3== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category3== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category4, + fontSize: 12, + color: data.categoriesNames.category4== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category4== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category4== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category4== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category5, + fontSize: 12, + color: data.categoriesNames.category5== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category5== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category5== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category5== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + ], + ) : Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText( + data.categoriesNames.category5, + fontSize: 12, + color: data.categoriesNames.category5== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category5== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category5== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category5== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + ), + AppText( + data.categoriesNames.category4, + fontSize: 12, + color: data.categoriesNames.category4== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category4== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category4== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category4== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category3, + fontSize: 12, + color: data.categoriesNames.category3== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category3== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category3== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category3== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category2, + fontSize: 12, + color: data.categoriesNames.category2== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category2== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category2== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category2== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category1, + fontSize: 12, + color: data.categoriesNames.category1== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category1== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category1== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category1== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + ), - height: 15, width: MediaQuery.of(context).size.width, - child:SizedBox(), - ), - Positioned( - top:0, - child: Container( - decoration: BoxDecoration(gradient: color, - borderRadius: BorderRadius.circular(10) - ), - height: 15, - width: MediaQuery.of(context).size.width * width, - padding: EdgeInsets.all(10), - child:SizedBox(), - - )), - - ], - )), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText('Low', fontSize: 12,), - AppText('Moderate', fontSize: 12,), - AppText('High', fontSize: 12,), - AppText('Very High', fontSize: 12,), - AppText('Extreme', fontSize: 12,), - ],) - ],); + ], + )), + Padding( + padding: EdgeInsets.all(15), + child:Divider()) + ], + ); } +} +class MessageBorder extends ShapeBorder { + final bool usePadding; + + MessageBorder({this.usePadding = true}); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.only(bottom: usePadding? 0 : 0); + + @override + Path getInnerPath(Rect rect, {TextDirection textDirection}) => null; + + @override + Path getOuterPath(Rect rect, {TextDirection textDirection}) { + rect = Rect.fromPoints(rect.bottomRight, rect.bottomLeft - Offset(0, 0)); + return Path() + ..addRRect(RRect.fromRectAndRadius(rect, Radius.circular(rect.height / 2))) + ..moveTo(rect.topCenter.dx - 10, rect.topCenter.dy) + ..relativeLineTo(10, -10) + ..relativeLineTo(10,10) + ..close(); + } + + @override + void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {} + + @override + ShapeBorder scale(double t) => this; } \ No newline at end of file From 68e4b92717791abbc15cde0ce9691b1a054fe6ad Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Tue, 1 Dec 2020 14:36:05 +0200 Subject: [PATCH 27/69] Address Added Successfully --- .../home_health_care_service.dart | 17 +++ lib/core/service/client/base_app_client.dart | 137 +++++++++--------- .../add_new_address_Request_Model.dart | 136 +++++++++++++++++ .../home_health_care_view_model.dart | 29 ++++ .../NewHomeHealthCare/location_page.dart | 111 +++++++++----- .../new_Home_health_care_step_tow_page.dart | 18 ++- 6 files changed, 339 insertions(+), 109 deletions(-) create mode 100644 lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart diff --git a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart index 9933b83d..c444eff9 100644 --- a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart +++ b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; import '../base_service.dart'; @@ -93,6 +94,22 @@ class HomeHealthCareService extends BaseService { }, body: order.toJson()); } + Future addAddressInfo({ AddNewAddressRequestModel + addNewAddressRequestModel }) async { + hasError = false; + await baseAppClient.post("https://mdlaboratories.com/exacartapi/api/addcustomeraddress", + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: addNewAddressRequestModel.toJson(), isExternal: true, isAllowAny: true); + } + Future getCustomerAddresses() async { Map queryParams = { 'fields':'addresses' diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 5baef20e..814eb249 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -31,74 +31,81 @@ class BaseAppClient { {Map body, Function(dynamic response, int statusCode) onSuccess, Function(String error, int statusCode) onFailure, - bool isAllowAny = false}) async { - String url = BASE_URL + endPoint; + bool isAllowAny = false, bool isExternal = false}) async { + String url; + if(isExternal) { + url = endPoint; + }else{ + url = BASE_URL + endPoint; + } try { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); - String token = await sharedPref.getString(TOKEN); - var languageID = - await sharedPref.getString(APP_LANGUAGE); - var user = await sharedPref.getObject(USER_PROFILE); - if (body.containsKey('SetupID')) { - body['SetupID'] = body.containsKey('SetupID') - ? body['SetupID'] != null - ? body['SetupID'] - : SETUP_ID - : SETUP_ID; - } - body['VersionID'] = VERSION_ID; - body['Channel'] = CHANNEL; - body['LanguageID'] = body.containsKey('LanguageID') - ? body['LanguageID'] != null - ? body['LanguageID'] - : languageID == 'ar' - ? 1 - : 2 - : languageID == 'ar' - ? 1 - : 2; - - body['IPAdress'] = IP_ADDRESS; - body['generalid'] = GENERAL_ID; - body['PatientOutSA'] = body.containsKey('PatientOutSA') - ? body['PatientOutSA'] != null - ? body['PatientOutSA'] - : PATIENT_OUT_SA - : PATIENT_OUT_SA; - - if (body.containsKey('isDentalAllowedBackend')) { - body['isDentalAllowedBackend'] = - body.containsKey('isDentalAllowedBackend') - ? body['isDentalAllowedBackend'] != null - ? body['isDentalAllowedBackend'] - : IS_DENTAL_ALLOWED_BACKEND - : IS_DENTAL_ALLOWED_BACKEND; - } + if (!isExternal) { + String token = await sharedPref.getString(TOKEN); + var languageID = + await sharedPref.getString(APP_LANGUAGE); + var user = await sharedPref.getObject(USER_PROFILE); + if (body.containsKey('SetupID')) { + body['SetupID'] = body.containsKey('SetupID') + ? body['SetupID'] != null + ? body['SetupID'] + : SETUP_ID + : SETUP_ID; + } + body['VersionID'] = VERSION_ID; + body['Channel'] = CHANNEL; + body['LanguageID'] = body.containsKey('LanguageID') + ? body['LanguageID'] != null + ? body['LanguageID'] + : languageID == 'ar' + ? 1 + : 2 + : languageID == 'ar' + ? 1 + : 2; + + body['IPAdress'] = IP_ADDRESS; + body['generalid'] = GENERAL_ID; + body['PatientOutSA'] = body.containsKey('PatientOutSA') + ? body['PatientOutSA'] != null + ? body['PatientOutSA'] + : PATIENT_OUT_SA + : PATIENT_OUT_SA; + + if (body.containsKey('isDentalAllowedBackend')) { + body['isDentalAllowedBackend'] = + body.containsKey('isDentalAllowedBackend') + ? body['isDentalAllowedBackend'] != null + ? body['isDentalAllowedBackend'] + : IS_DENTAL_ALLOWED_BACKEND + : IS_DENTAL_ALLOWED_BACKEND; + } - body['DeviceTypeID'] = DeviceTypeID; - - if (!body.containsKey('IsPublicRequest')) { - body['PatientType'] = body.containsKey('PatientType') - ? body['PatientType'] != null - ? body['PatientType'] - : user['PatientType'] != null - ? user['PatientType'] - : PATIENT_TYPE - : PATIENT_TYPE; - - body['PatientTypeID'] = body.containsKey('PatientTypeID') - ? body['PatientTypeID'] != null - ? body['PatientTypeID'] - :user['PatientType'] != null - ? user['PatientType'] - : PATIENT_TYPE_ID - : PATIENT_TYPE_ID; - if (user != null) { - body['TokenID'] = token; - body['PatientID'] = - body['PatientID'] != null ? body['PatientID'] : user['PatientID']; - body['PatientOutSA'] = user['OutSA']; - body['SessionID'] = SESSION_ID; //getSessionId(token); + body['DeviceTypeID'] = DeviceTypeID; + + if (!body.containsKey('IsPublicRequest')) { + body['PatientType'] = body.containsKey('PatientType') + ? body['PatientType'] != null + ? body['PatientType'] + : user['PatientType'] != null + ? user['PatientType'] + : PATIENT_TYPE + : PATIENT_TYPE; + + body['PatientTypeID'] = body.containsKey('PatientTypeID') + ? body['PatientTypeID'] != null + ? body['PatientTypeID'] + :user['PatientType'] != null + ? user['PatientType'] + : PATIENT_TYPE_ID + : PATIENT_TYPE_ID; + if (user != null) { + body['TokenID'] = token; + body['PatientID'] = + body['PatientID'] != null ? body['PatientID'] : user['PatientID']; + body['PatientOutSA'] = user['OutSA']; + body['SessionID'] = SESSION_ID; //getSessionId(token); + } } } diff --git a/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart new file mode 100644 index 00000000..5bde5a5f --- /dev/null +++ b/lib/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart @@ -0,0 +1,136 @@ +class AddNewAddressRequestModel { + Customer customer; + + AddNewAddressRequestModel({this.customer}); + + AddNewAddressRequestModel.fromJson(Map json) { + customer = json['customer'] != null + ? new Customer.fromJson(json['customer']) + : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.customer != null) { + data['customer'] = this.customer.toJson(); + } + return data; + } +} + +class Customer { + List addresses; + int id; + String email; + List roleIds; + + Customer({this.addresses, this.id, this.email, this.roleIds}); + + Customer.fromJson(Map json) { + if (json['addresses'] != null) { + addresses = new List(); + json['addresses'].forEach((v) { + addresses.add(new Addresses.fromJson(v)); + }); + } + id = json['id']; + email = json['email']; + roleIds = json['role_ids'].cast(); + } + + Map toJson() { + final Map data = new Map(); + if (this.addresses != null) { + data['addresses'] = this.addresses.map((v) => v.toJson()).toList(); + } + data['id'] = this.id; + data['email'] = this.email; + data['role_ids'] = this.roleIds; + return data; + } +} + +class Addresses { + int id; + String firstName; + String lastName; + String email; + Null company; + int countryId; + String country; + Null stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + Null faxNumber; + String customerAttributes; + String createdOnUtc; + Null province; + String latLong; + + Addresses( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + Addresses.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart index adde9224..7859cdcf 100644 --- a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart @@ -10,8 +10,10 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/home_health_care_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:intl/intl.dart'; import '../../../locator.dart'; +import 'add_new_address_Request_Model.dart'; class HomeHealthCareViewModel extends BaseViewModel { HomeHealthCareService _homeHealthCareService = @@ -121,5 +123,32 @@ class HomeHealthCareViewModel extends BaseViewModel { } } + Future addAddressInfo( + {AddNewAddressRequestModel addNewAddressRequestModel}) async { + addNewAddressRequestModel.customer.email = _homeHealthCareService.customerInfo.email; + addNewAddressRequestModel.customer.id = _homeHealthCareService.customerInfo.customerId; + addNewAddressRequestModel.customer.roleIds = [3]; + addNewAddressRequestModel.customer.addresses[0].email = _homeHealthCareService.customerInfo.email; + addNewAddressRequestModel.customer.addresses[0].phoneNumber = _homeHealthCareService.customerInfo.mobileNumber; + addNewAddressRequestModel.customer.addresses[0].firstName = user.firstName; + addNewAddressRequestModel.customer.addresses[0].lastName = user.lastName; + addNewAddressRequestModel.customer.addresses[0].countryId = 69; + + var f = DateFormat('E, d MMM yyyy HH:mm:ss'); + var date = f.format(DateTime.now().toUtc()) + " GMT"; + addNewAddressRequestModel.customer.addresses[0].createdOnUtc = date; + + setState(ViewState.Busy); + await _homeHealthCareService.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel + ); + if (_homeHealthCareService.hasError) { + error = _homeHealthCareService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + } \ No newline at end of file diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart index 5f93571a..14824532 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart @@ -1,8 +1,11 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -16,12 +19,7 @@ class LocationPage extends StatefulWidget { final double latitude; final double longitude; - const LocationPage( - {Key key, - this.onPick, - this.latitude, - this.longitude, - }) + const LocationPage({Key key, this.onPick, this.latitude, this.longitude}) : super(key: key); @override @@ -46,20 +44,23 @@ class _LocationPageState @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - return AppScaffold( - isShowDecPage: false, - isShowAppBar: true, - body: PlacePicker( - apiKey: GOOGLE_API_KEY, - enableMyLocationButton: true, - automaticallyImplyAppBarLeading: false, - autocompleteOnTrailingWhitespace: true, - selectInitialPosition: true, - autocompleteLanguage: projectViewModel.currentLanguage, - enableMapTypeButton: true, - searchForInitialValue: false, - onPlacePicked: (PickResult result) { - print(result.adrAddress); + return BaseView( + onModelReady: (model) {}, + builder: (_, model, widget) => AppScaffold( + isShowDecPage: false, + isShowAppBar: true, + baseViewModel: model, + body: PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + onPlacePicked: (PickResult result) { + print(result.adrAddress); }, selectedPlaceWidgetBuilder: @@ -82,27 +83,63 @@ class _LocationPageState SecondaryButton( color: Colors.grey[800], textColor: Colors.white, - onTap: () { + onTap: () async { print(selectedPlace); - // setState(() { - // widget.patientERInsertPresOrderRequestModel - // .latitude = - // selectedPlace.geometry.location.lat; - // widget.patientERInsertPresOrderRequestModel - // .longitude = - // selectedPlace.geometry.location.lng; - // }); + AddNewAddressRequestModel + addNewAddressRequestModel = + new AddNewAddressRequestModel( + customer: Customer(addresses: [ + Addresses( + address1: + selectedPlace.formattedAddress, + address2: selectedPlace + .formattedAddress, + customerAttributes: "", + city: "", + createdOnUtc: "", + id: 0, + latLong: "$latitude,$longitude", + email: "") + ]), + ); + + selectedPlace.addressComponents.forEach((e) { + if (e.types.contains("country")) { + addNewAddressRequestModel.customer + .addresses[0].country = e.longName; + } + if (e.types.contains("postal_code")) { + addNewAddressRequestModel.customer + .addresses[0].zipPostalCode = + e.longName; + } + if (e.types.contains("locality")) { + addNewAddressRequestModel.customer + .addresses[0].city = + e.longName; + } + }); + + await model.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + } else { + AppToast.showSuccessToast( + message: "Address Added Successfully"); + } + Navigator.of(context).pop(); }, label: " Add New Address ", ), ], ), - ), - ); + ), + ); }, - initialPosition: LatLng(latitude, longitude), - useCurrentLocation: false, - ), - ); + initialPosition: LatLng(latitude, longitude), + useCurrentLocation: false, + ), + )); } } diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart index 83f42f20..759fb697 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart @@ -47,7 +47,6 @@ class _NewHomeHealthCareStepTowPageState @override void initState() { - print(widget.model.addressesList); if (widget.patientERInsertPresOrderRequestModel.latitude == null) { setLatitudeAndLongitude(); } else { @@ -110,12 +109,17 @@ class _NewHomeHealthCareStepTowPageState color: Colors.grey[800], textColor: Colors.white, onTap: () { - Navigator.pushReplacement( - context, MaterialPageRoute( - builder: (BuildContext context) => - LocationPage(latitude: latitude, - longitude: longitude,))); - }, + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + LocationPage( + latitude: latitude, + longitude: longitude, + ), + ), + ); + }, label: " Add New Address ", ), SizedBox(height: 10,), From 078183c1fbfbd8db8c996511b848474bb88109f8 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Tue, 1 Dec 2020 16:23:40 +0300 Subject: [PATCH 28/69] not authenticated page updated --- lib/widgets/others/not_auh_page.dart | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/widgets/others/not_auh_page.dart b/lib/widgets/others/not_auh_page.dart index a1a2f00c..d1684125 100644 --- a/lib/widgets/others/not_auh_page.dart +++ b/lib/widgets/others/not_auh_page.dart @@ -1,5 +1,7 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/login/login-type.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -8,6 +10,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../splashPage.dart'; + class NotAutPage extends StatelessWidget { final String title; final String description; @@ -99,8 +103,9 @@ class NotAutPage extends StatelessWidget { Container( width: MediaQuery.of(context).size.width * 0.9, child: SecondaryButton( - onTap: () => Navigator.pushReplacement( - context, FadePage(page: LoginType())), + onTap: (){ + loginCheck(context); + }, label: TranslationBase.of(context).serviceInformationButton, textColor: Theme.of(context).backgroundColor), ), @@ -109,4 +114,16 @@ class NotAutPage extends StatelessWidget { ), ); } + + loginCheck(context) async{ + var data = await sharedPref.getObject(IMEI_USER_DATA); + sharedPref.remove(REGISTER_DATA_FOR_LOGIIN); + if (data != null) { + Navigator.of(context).pushNamed(CONFIRM_LOGIN); + } else { + Navigator.of(context).pushNamed( + WELCOME_LOGIN, + ); + } + } } From 05deaa632237576b11e013f0f8607c8aa839d650 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Tue, 1 Dec 2020 18:35:45 +0200 Subject: [PATCH 29/69] Address Added Successfully --- lib/config/config.dart | 6 + .../customer_addresses_service.dart | 211 ++++++++++++++++++ .../home_health_care_service.dart | 177 +-------------- .../AlHabibMedicalService/cmc_view_model.dart | 48 +++- .../home_health_care_view_model.dart | 36 ++- lib/locator.dart | 5 +- .../NewCMC/cmc_location_page.dart | 147 ++++++++++++ .../NewCMC/new_cmc_step_one_page.dart | 12 +- .../NewCMC/new_cmc_step_tow_page.dart | 202 ++++++++++++----- .../ComprehensiveMedicalCheckup/cmc_page.dart | 1 + .../NewHomeHealthCare/location_page.dart | 4 +- .../new_Home_health_care_step_one_page.dart | 8 +- .../new_Home_health_care_step_tow_page.dart | 4 +- .../dialogs}/select_location_dialog.dart | 3 +- 14 files changed, 598 insertions(+), 266 deletions(-) create mode 100644 lib/core/service/AlHabibMedicalService/customer_addresses_service.dart create mode 100644 lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart rename lib/{pages/AlHabibMedicalService/HomeHealthCare/Dialog => widgets/dialogs}/select_location_dialog.dart (96%) diff --git a/lib/config/config.dart b/lib/config/config.dart index 5259f1d7..859e25be 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -375,6 +375,12 @@ const GET_PATIENT_ALL_PRES_ORD= 'Services/Patients.svc/REST/PatientER_GetPatient const PATIENT_ER_INSERT_PRES_ORDER= 'Services/Patients.svc/REST/PatientER_InsertPresOrder'; +// External API +const ADD_ADDRESS_INFO= "https://mdlaboratories.com/exacartapi/api/addcustomeraddress"; +const GET_CUSTOMER_ADDRESSES= "https://mdlaboratories.com/exacartapi/api/Customers/"; +const GET_CUSTOMER_INFO = "https://mdlaboratories.com/exacartapi/api/VerifyCustomer"; + + const TIMER_MIN = 10; const GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; diff --git a/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart new file mode 100644 index 00000000..cb457735 --- /dev/null +++ b/lib/core/service/AlHabibMedicalService/customer_addresses_service.dart @@ -0,0 +1,211 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/HHC_get_all_services_request_modle.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/HHC_get_all_services_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_hHC_all_pres_orders_request_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_hhc_all_pres_orders_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_request_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; +import 'package:intl/intl.dart'; + +import '../base_service.dart'; + +class CustomerAddressesService extends BaseService { + + List addressesList = List(); + CustomerInfo customerInfo; + + Future addAddressInfo({ AddNewAddressRequestModel + addNewAddressRequestModel }) async { + + addNewAddressRequestModel.customer.email = customerInfo.email; + addNewAddressRequestModel.customer.id = customerInfo.customerId; + addNewAddressRequestModel.customer.roleIds = [3]; + addNewAddressRequestModel.customer.addresses[0].email = customerInfo.email; + addNewAddressRequestModel.customer.addresses[0].phoneNumber = customerInfo.mobileNumber; + addNewAddressRequestModel.customer.addresses[0].firstName = user.firstName; + addNewAddressRequestModel.customer.addresses[0].lastName = user.lastName; + addNewAddressRequestModel.customer.addresses[0].countryId = 69; + + var f = DateFormat('E, d MMM yyyy HH:mm:ss'); + var date = f.format(DateTime.now().toUtc()) + " GMT"; + addNewAddressRequestModel.customer.addresses[0].createdOnUtc = date; + hasError = false; + await baseAppClient.post(ADD_ADDRESS_INFO, + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: addNewAddressRequestModel.toJson(), isExternal: true, isAllowAny: true); + } + + Future getCustomerAddresses() async { + Map queryParams = { + 'fields':'addresses' + }; + hasError = false; + await baseAppClient.get("$GET_CUSTOMER_ADDRESSES${customerInfo.customerId}", + onSuccess: (dynamic response, int statusCode) { + addressesList.clear(); + response["customers"][0]["addresses"].forEach((data) { + addressesList + .add(AddressInfo.fromJson(data)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } + + + Future getCustomerInfo() async { + Map queryParams = { + 'FileNumber':'${user.patientID}' + }; + + hasError = false; + await baseAppClient.get(GET_CUSTOMER_INFO, + onSuccess: (dynamic response, int statusCode) { + customerInfo= CustomerInfo.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams, isExternal: true); + } +} + + +class CustomerInfo { + bool isRegistered; + String userName; + Null password; + String email; + Null errorMessage; + String mobileNumber; + int customerId; + + CustomerInfo( + {this.isRegistered, + this.userName, + this.password, + this.email, + this.errorMessage, + this.mobileNumber, + this.customerId}); + + CustomerInfo.fromJson(Map json) { + isRegistered = json['IsRegistered']; + userName = json['UserName']; + password = json['Password']; + email = json['Email']; + errorMessage = json['ErrorMessage']; + mobileNumber = json['MobileNumber']; + customerId = json['CustomerId']; + } + + Map toJson() { + final Map data = new Map(); + data['IsRegistered'] = this.isRegistered; + data['UserName'] = this.userName; + data['Password'] = this.password; + data['Email'] = this.email; + data['ErrorMessage'] = this.errorMessage; + data['MobileNumber'] = this.mobileNumber; + data['CustomerId'] = this.customerId; + return data; + } +} + + +class AddressInfo { + String id; + String firstName; + String lastName; + String email; + Null company; + int countryId; + String country; + Null stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + Null faxNumber; + String customerAttributes; + String createdOnUtc; + Null province; + String latLong; + + AddressInfo( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + AddressInfo.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart index c444eff9..2ec1e310 100644 --- a/lib/core/service/AlHabibMedicalService/home_health_care_service.dart +++ b/lib/core/service/AlHabibMedicalService/home_health_care_service.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; import '../base_service.dart'; @@ -93,182 +94,6 @@ class HomeHealthCareService extends BaseService { super.error = error; }, body: order.toJson()); } - - Future addAddressInfo({ AddNewAddressRequestModel - addNewAddressRequestModel }) async { - hasError = false; - await baseAppClient.post("https://mdlaboratories.com/exacartapi/api/addcustomeraddress", - onSuccess: (dynamic response, int statusCode) { - addressesList.clear(); - response["customers"][0]["addresses"].forEach((data) { - addressesList - .add(AddressInfo.fromJson(data)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: addNewAddressRequestModel.toJson(), isExternal: true, isAllowAny: true); - } - - Future getCustomerAddresses() async { - Map queryParams = { - 'fields':'addresses' - }; - hasError = false; - await baseAppClient.get("https://mdlaboratories.com/exacartapi/api/Customers/${customerInfo.customerId}", - onSuccess: (dynamic response, int statusCode) { - addressesList.clear(); - response["customers"][0]["addresses"].forEach((data) { - addressesList - .add(AddressInfo.fromJson(data)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams, isExternal: true); - } - - - Future getCustomerInfo() async { - Map queryParams = { - 'FileNumber':'${user.patientID}' - }; - - hasError = false; - await baseAppClient.get("https://mdlaboratories.com/exacartapi/api/VerifyCustomer", - onSuccess: (dynamic response, int statusCode) { - customerInfo= CustomerInfo.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams, isExternal: true); - } } -class CustomerInfo { - bool isRegistered; - String userName; - Null password; - String email; - Null errorMessage; - String mobileNumber; - int customerId; - - CustomerInfo( - {this.isRegistered, - this.userName, - this.password, - this.email, - this.errorMessage, - this.mobileNumber, - this.customerId}); - - CustomerInfo.fromJson(Map json) { - isRegistered = json['IsRegistered']; - userName = json['UserName']; - password = json['Password']; - email = json['Email']; - errorMessage = json['ErrorMessage']; - mobileNumber = json['MobileNumber']; - customerId = json['CustomerId']; - } - - Map toJson() { - final Map data = new Map(); - data['IsRegistered'] = this.isRegistered; - data['UserName'] = this.userName; - data['Password'] = this.password; - data['Email'] = this.email; - data['ErrorMessage'] = this.errorMessage; - data['MobileNumber'] = this.mobileNumber; - data['CustomerId'] = this.customerId; - return data; - } -} - - -class AddressInfo { - String id; - String firstName; - String lastName; - String email; - Null company; - int countryId; - String country; - Null stateProvinceId; - String city; - String address1; - String address2; - String zipPostalCode; - String phoneNumber; - Null faxNumber; - String customerAttributes; - String createdOnUtc; - Null province; - String latLong; - - AddressInfo( - {this.id, - this.firstName, - this.lastName, - this.email, - this.company, - this.countryId, - this.country, - this.stateProvinceId, - this.city, - this.address1, - this.address2, - this.zipPostalCode, - this.phoneNumber, - this.faxNumber, - this.customerAttributes, - this.createdOnUtc, - this.province, - this.latLong}); - - AddressInfo.fromJson(Map json) { - id = json['id']; - firstName = json['first_name']; - lastName = json['last_name']; - email = json['email']; - company = json['company']; - countryId = json['country_id']; - country = json['country']; - stateProvinceId = json['state_province_id']; - city = json['city']; - address1 = json['address1']; - address2 = json['address2']; - zipPostalCode = json['zip_postal_code']; - phoneNumber = json['phone_number']; - faxNumber = json['fax_number']; - customerAttributes = json['customer_attributes']; - createdOnUtc = json['created_on_utc']; - province = json['province']; - latLong = json['lat_long']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['first_name'] = this.firstName; - data['last_name'] = this.lastName; - data['email'] = this.email; - data['company'] = this.company; - data['country_id'] = this.countryId; - data['country'] = this.country; - data['state_province_id'] = this.stateProvinceId; - data['city'] = this.city; - data['address1'] = this.address1; - data['address2'] = this.address2; - data['zip_postal_code'] = this.zipPostalCode; - data['phone_number'] = this.phoneNumber; - data['fax_number'] = this.faxNumber; - data['customer_attributes'] = this.customerAttributes; - data['created_on_utc'] = this.createdOnUtc; - data['province'] = this.province; - data['lat_long'] = this.latLong; - return data; - } -} diff --git a/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart index bf3404a9..0774e5a7 100644 --- a/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/cmc_view_model.dart @@ -9,14 +9,19 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/cmc_service.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import '../../../locator.dart'; +import 'add_new_address_Request_Model.dart'; class CMCViewModel extends BaseViewModel { CMCService _cMCService = locator(); - + CustomerAddressesService _customerAddressesService = + locator(); + List get addressesList => + _customerAddressesService.addressesList; List get cmcAllServicesList => _cMCService.cmcAllServicesList; @@ -94,7 +99,6 @@ class CMCViewModel extends BaseViewModel { await _cMCService .getOrderDetailByOrderID(getOrderDetailByOrderIDRequestModel); } - //TODO check it in uat Future insertPresPresOrder({CMCInsertPresOrderRequestModel order}) async { setState(ViewState.Busy); order.createdBy = user.patientID; @@ -107,4 +111,44 @@ class CMCViewModel extends BaseViewModel { getCmcAllPresOrders(); } } + + Future getCustomerAddresses() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerAddresses( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + Future getCustomerInfo() async { + setState(ViewState.Busy); + await _customerAddressesService.getCustomerInfo( + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + await getCustomerAddresses(); + } + } + + Future addAddressInfo( + {AddNewAddressRequestModel addNewAddressRequestModel}) async { + + + setState(ViewState.Busy); + await _customerAddressesService.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel + ); + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } } \ No newline at end of file diff --git a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart index 7859cdcf..20a19b23 100644 --- a/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart +++ b/lib/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/home_health_care_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:intl/intl.dart'; @@ -19,12 +20,15 @@ class HomeHealthCareViewModel extends BaseViewModel { HomeHealthCareService _homeHealthCareService = locator(); + CustomerAddressesService _customerAddressesService = + locator(); + List get hhcAllServicesList => _homeHealthCareService.hhcAllServicesList; List get addressesList => - _homeHealthCareService.addressesList; + _customerAddressesService.addressesList; List get hhcAllPresOrders => _homeHealthCareService.hhcAllPresOrdersList; @@ -101,10 +105,10 @@ class HomeHealthCareViewModel extends BaseViewModel { Future getCustomerAddresses() async { setState(ViewState.Busy); - await _homeHealthCareService.getCustomerAddresses( + await _customerAddressesService.getCustomerAddresses( ); - if (_homeHealthCareService.hasError) { - error = _homeHealthCareService.error; + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; setState(ViewState.ErrorLocal); } else { setState(ViewState.Idle); @@ -113,10 +117,10 @@ class HomeHealthCareViewModel extends BaseViewModel { Future getCustomerInfo() async { setState(ViewState.Busy); - await _homeHealthCareService.getCustomerInfo( + await _customerAddressesService.getCustomerInfo( ); - if (_homeHealthCareService.hasError) { - error = _homeHealthCareService.error; + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; setState(ViewState.ErrorLocal); } else { await getCustomerAddresses(); @@ -125,25 +129,13 @@ class HomeHealthCareViewModel extends BaseViewModel { Future addAddressInfo( {AddNewAddressRequestModel addNewAddressRequestModel}) async { - addNewAddressRequestModel.customer.email = _homeHealthCareService.customerInfo.email; - addNewAddressRequestModel.customer.id = _homeHealthCareService.customerInfo.customerId; - addNewAddressRequestModel.customer.roleIds = [3]; - addNewAddressRequestModel.customer.addresses[0].email = _homeHealthCareService.customerInfo.email; - addNewAddressRequestModel.customer.addresses[0].phoneNumber = _homeHealthCareService.customerInfo.mobileNumber; - addNewAddressRequestModel.customer.addresses[0].firstName = user.firstName; - addNewAddressRequestModel.customer.addresses[0].lastName = user.lastName; - addNewAddressRequestModel.customer.addresses[0].countryId = 69; - - var f = DateFormat('E, d MMM yyyy HH:mm:ss'); - var date = f.format(DateTime.now().toUtc()) + " GMT"; - addNewAddressRequestModel.customer.addresses[0].createdOnUtc = date; setState(ViewState.Busy); - await _homeHealthCareService.addAddressInfo( + await _customerAddressesService.addAddressInfo( addNewAddressRequestModel: addNewAddressRequestModel ); - if (_homeHealthCareService.hasError) { - error = _homeHealthCareService.error; + if (_customerAddressesService.hasError) { + error = _customerAddressesService.error; setState(ViewState.ErrorLocal); } else { setState(ViewState.Idle); diff --git a/lib/locator.dart b/lib/locator.dart index 6b7bb076..d02d647f 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; import 'core/service/AlHabibMedicalService/cmc_service.dart'; +import 'core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'core/service/AlHabibMedicalService/e_referral_service.dart'; import 'core/service/AlHabibMedicalService/home_health_care_service.dart'; import 'core/service/AuthenticatedUserObject.dart'; @@ -135,13 +136,11 @@ void setupLocator() { locator.registerLazySingleton(() => UserInformationService()); locator.registerLazySingleton(() => CreteNewBabyService()); locator.registerLazySingleton(() => DeleteBabyService()); - locator.registerLazySingleton(() => VaccinationTableService()); locator.registerLazySingleton(() => NotificationService()); - - locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); + locator.registerLazySingleton(() => CustomerAddressesService()); /// View Model diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart new file mode 100644 index 00000000..ee32bcb6 --- /dev/null +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart @@ -0,0 +1,147 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/add_new_address_Request_Model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; +import 'package:provider/provider.dart'; + +class CMCLocationPage extends StatefulWidget { + final Function(PickResult) onPick; + final double latitude; + final double longitude; + final dynamic model; + + const CMCLocationPage({Key key, this.onPick, this.latitude, this.longitude, this.model}) + : super(key: key); + + @override + _CMCLocationPageState createState() => + _CMCLocationPageState(); +} + +class _CMCLocationPageState + extends State { + double latitude = 0; + double longitude = 0; + + @override + void initState() { + + latitude = widget.latitude; + longitude = widget.longitude; + super.initState(); + } + + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + onModelReady: (model) {}, + builder: (_, model, widget) => AppScaffold( + isShowDecPage: false, + isShowAppBar: true, + baseViewModel: model, + body: PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + onPlacePicked: (PickResult result) { + print(result.adrAddress); + + }, + selectedPlaceWidgetBuilder: + (_, selectedPlace, state, isSearchBarFocused) { + print("state: $state, isSearchBarFocused: $isSearchBarFocused"); + return isSearchBarFocused + ? Container() + : FloatingCard( + bottomPosition: 0.0, + leftPosition: 0.0, + rightPosition: 0.0, + width: 500, + borderRadius: BorderRadius.circular(12.0), + child: state == SearchingState.Searching + ? Center(child: CircularProgressIndicator()) + : Container( + margin: EdgeInsets.all(12), + child: Column( + children: [ + SecondaryButton( + color: Colors.grey[800], + textColor: Colors.white, + onTap: () async { + print(selectedPlace); + AddNewAddressRequestModel + addNewAddressRequestModel = + new AddNewAddressRequestModel( + customer: Customer(addresses: [ + Addresses( + address1: + selectedPlace.formattedAddress, + address2: selectedPlace + .formattedAddress, + customerAttributes: "", + city: "", + createdOnUtc: "", + id: 0, + latLong: "$latitude,$longitude", + email: "") + ]), + ); + + selectedPlace.addressComponents.forEach((e) { + if (e.types.contains("country")) { + addNewAddressRequestModel.customer + .addresses[0].country = e.longName; + } + if (e.types.contains("postal_code")) { + addNewAddressRequestModel.customer + .addresses[0].zipPostalCode = + e.longName; + } + if (e.types.contains("locality")) { + addNewAddressRequestModel.customer + .addresses[0].city = + e.longName; + } + }); + + await model.addAddressInfo( + addNewAddressRequestModel: addNewAddressRequestModel); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + } else { + AppToast.showSuccessToast( + message: "Address Added Successfully"); + } + Navigator.of(context).pop(); + }, + label: " Add New Address ", + ), + ], + ), + ), + ); + }, + initialPosition: LatLng(latitude, longitude), + useCurrentLocation: false, + ), + )); + } +} diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart index 928444d6..7da00dee 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart @@ -1,6 +1,8 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_get_items_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -200,7 +202,7 @@ class _NewCMCStepOnePageState extends State { label: "Next", textColor: Theme.of(context).backgroundColor, color: Colors.grey[800], - onTap: () { + onTap: () async { if (widget.cMCInsertPresOrderRequestModel .patientERCMCInsertServicesList.length != 0 || @@ -229,8 +231,12 @@ class _NewCMCStepOnePageState extends State { .patientERCMCInsertServicesList = [ patientERCMCInsertServicesList ]; - - widget.changePageViewIndex(1); + await widget.model.getCustomerInfo(); + if(widget.model.state == ViewState.ErrorLocal){ + Utils.showErrorToast(); + } else { + widget.changePageViewIndex(1); + } } }, ), diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart index 27cddfe3..c1ec952f 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart @@ -1,19 +1,22 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; -import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/customer_addresses_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/select_location_dialog.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/close_back.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:provider/provider.dart'; +import 'cmc_location_page.dart'; + class NewCMCStepTowPage extends StatefulWidget { final Function(PickResult) onPick; final double latitude; @@ -41,12 +44,13 @@ class _NewCMCStepTowPageState extends State { double latitude = 0; double longitude = 0; + AddressInfo _selectedAddress; + @override void initState() { if (widget.cmcInsertPresOrderRequestModel.latitude == null) { - latitude = widget.latitude; - longitude = widget.longitude; + setLatitudeAndLongitude(); } else { latitude = widget.cmcInsertPresOrderRequestModel.latitude; longitude = widget.cmcInsertPresOrderRequestModel.longitude; @@ -54,60 +58,152 @@ class _NewCMCStepTowPageState super.initState(); } + setLatitudeAndLongitude({bool isSetState = false, String latLong}) { + if (latLong == null) + latLong = widget.model.addressesList[widget.model.addressesList + .length - 1].latLong; + List latLongArr = latLong.split(','); + + latitude = double.parse(latLongArr[0]); + longitude = double.parse(latLongArr[1]); + } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - return AppScaffold( + return AppScaffold( isShowDecPage: false, - body: PlacePicker( - apiKey: GOOGLE_API_KEY, - enableMyLocationButton: true, - automaticallyImplyAppBarLeading: false, - autocompleteOnTrailingWhitespace: true, - selectInitialPosition: true, - autocompleteLanguage: projectViewModel.currentLanguage, - enableMapTypeButton: true, - onPlacePicked: (PickResult result) { - print(result.adrAddress); - widget.changePageViewIndex(3); - }, - selectedPlaceWidgetBuilder: - (_, selectedPlace, state, isSearchBarFocused) { - print("state: $state, isSearchBarFocused: $isSearchBarFocused"); - return isSearchBarFocused - ? Container() - : FloatingCard( - bottomPosition: 0.0, - leftPosition: 0.0, - rightPosition: 0.0, - width: 500, - borderRadius: BorderRadius.circular(12.0), - child: state == SearchingState.Searching - ? Center(child: CircularProgressIndicator()) - : Container( - margin: EdgeInsets.all(12), - child: SecondaryButton( - color: Colors.grey[800], - textColor: Colors.white, - onTap: () { - setState(() { - widget.cmcInsertPresOrderRequestModel - .latitude = - selectedPlace.geometry.location.lat; - widget.cmcInsertPresOrderRequestModel - .longitude = - selectedPlace.geometry.location.lng; - }); - widget.changePageViewIndex(3); - }, - label: TranslationBase.of(context).next, - ), + body: Stack( + children: [ + PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + + onPlacePicked: (PickResult result) { + print(result.adrAddress); + widget.changePageViewIndex(3); + }, + selectedPlaceWidgetBuilder: + (_, selectedPlace, state, isSearchBarFocused) { + print("state: $state, isSearchBarFocused: $isSearchBarFocused"); + return isSearchBarFocused + ? Container() + : FloatingCard( + bottomPosition: 0.0, + leftPosition: 0.0, + rightPosition: 0.0, + width: 500, + borderRadius: BorderRadius.circular(12.0), + child: state == SearchingState.Searching + ? Center(child: CircularProgressIndicator()) + : Container( + margin: EdgeInsets.all(12), + child: Column( + children: [ + SecondaryButton( + color: Colors.grey[800], + textColor: Colors.white, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + CMCLocationPage( + latitude: latitude, + longitude: longitude, + + ), + ), + ); + }, + label: " Add New Address ", + ), + SizedBox(height: 10,), + SecondaryButton( + color: Colors.red + [800], + textColor: Colors.white, + onTap: () { + setState(() { + widget.cmcInsertPresOrderRequestModel + .latitude = + selectedPlace.geometry.location.lat; + widget.cmcInsertPresOrderRequestModel + .longitude = + selectedPlace.geometry.location.lng; + }); + widget.changePageViewIndex(3); + }, + label: TranslationBase.of(context).confirm, ), - ); + ], + ) + ), + ); + }, + initialPosition: LatLng(latitude, longitude), + useCurrentLocation: false, + ), + Container( + child: InkWell( + onTap: () => + confirmSelectLocationDialog(widget.model.addressesList), + child: Container( + padding: EdgeInsets.all(10), + width: double.infinity, + // height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: Texts(getAddressName(), fontSize: 14,),), + Icon(Icons.arrow_drop_down) + ], + ), + ), + ), + height: 56, width: double.infinity, color: Theme + .of(context) + .scaffoldBackgroundColor, + + ) + ], + ), + ); + + + } + + + void confirmSelectLocationDialog(List addresses) { + showDialog( + context: context, + child: SelectLocationDialog( + addresses: addresses, + selectedAddress: _selectedAddress + , + onValueSelected: (value) { + setLatitudeAndLongitude(latLong: value.latLong); + setState(() { + _selectedAddress = value; + }); }, - initialPosition: LatLng(latitude, longitude), - useCurrentLocation: true, ), ); } + + String getAddressName() { + if (_selectedAddress != null) + return _selectedAddress.address1; + else + return "Select Address" /*TranslationBase.of(context).selectHospital*/; + } } diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart index 385d0da3..01e2a14d 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart @@ -40,6 +40,7 @@ class _CMCPageState extends State }, builder: (_, model, widget) => AppScaffold( isShowAppBar: true, + description: TranslationBase.of(context).HHCNotAuthMsg, appBarTitle: TranslationBase.of(context).homeHealthCare, body: Scaffold( extendBodyBehindAppBar: true, diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart index 14824532..8592cb34 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart @@ -18,8 +18,9 @@ class LocationPage extends StatefulWidget { final Function(PickResult) onPick; final double latitude; final double longitude; + final dynamic model; - const LocationPage({Key key, this.onPick, this.latitude, this.longitude}) + const LocationPage({Key key, this.onPick, this.latitude, this.longitude, this.model}) : super(key: key); @override @@ -84,7 +85,6 @@ class _LocationPageState color: Colors.grey[800], textColor: Colors.white, onTap: () async { - print(selectedPlace); AddNewAddressRequestModel addNewAddressRequestModel = new AddNewAddressRequestModel( diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart index c41892d3..bc5a4a99 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -143,7 +144,12 @@ class _NewHomeHealthCareStepOnePageState extends State Date: Tue, 1 Dec 2020 18:43:29 +0200 Subject: [PATCH 30/69] naming issue fix --- .../ComprehensiveMedicalCheckup/cmc_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart index 01e2a14d..04d8ea36 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart @@ -41,7 +41,7 @@ class _CMCPageState extends State builder: (_, model, widget) => AppScaffold( isShowAppBar: true, description: TranslationBase.of(context).HHCNotAuthMsg, - appBarTitle: TranslationBase.of(context).homeHealthCare, + appBarTitle: TranslationBase.of(context).comprehensiveMedicalCheckup, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( From 0181043da802816a0b7ff5b89b09ea4a9ddbadd4 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 2 Dec 2020 10:28:39 +0300 Subject: [PATCH 31/69] Ereferral fixes, smartwatch health data integration --- lib/config/localized_values.dart | 4 + .../get_all_projects_response_model.dart | 76 ++++++++++ .../e_referral_service.dart | 26 +++- .../e_referral_view_model.dart | 55 +++++-- .../new_e_referral_index_page.dart | 54 ++++--- .../new_e_referral_step_one_page.dart | 78 +++++----- .../new_e_referral_step_three_page.dart | 135 +++++++++++------- .../new_e_referral_step_two_page.dart | 2 +- .../dialogs/select_project_dialog.dart | 129 +++++++++++++++++ .../E-Referral/e_referral_page.dart | 4 +- .../health_data_list.dart | 38 ++++- .../smart_watch_instructions.dart | 19 ++- .../medical/vital_sign/vital_sign_item.dart | 6 +- lib/theme/theme_value.dart | 1 + lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/bottom_options/BottomSheet.dart | 2 +- 16 files changed, 484 insertions(+), 146 deletions(-) create mode 100644 lib/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart create mode 100644 lib/pages/AlHabibMedicalService/E-Referral/dialogs/select_project_dialog.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 29a4203e..ab0ac7bb 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1132,5 +1132,9 @@ const Map localizedValues = { "en": "UPDATE THE APP", "ar": "تحديث التطبيق" }, + "ereferralSaveSuccess": { + "en": "The referral request has been submitted successfully, you will be contacted ASAP to complete the process. Referral request no is ", + "ar": " تم إرسال طلب الإحالة بنجاح ، وسيتم الاتصال بك في أسرع وقت ممكن لإكمال العملية. رقم طلب الإحالة" + }, }; diff --git a/lib/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart b/lib/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart new file mode 100644 index 00000000..438f1630 --- /dev/null +++ b/lib/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart @@ -0,0 +1,76 @@ +class GetAllProjectsResponseModel { + String desciption; + Null desciptionN; + int iD; + String legalName; + String legalNameN; + String name; + Null nameN; + String phoneNumber; + String setupID; + int distanceInKilometers; + bool isActive; + String latitude; + String longitude; + int mainProjectID; + Null projectOutSA; + bool usingInDoctorApp; + + GetAllProjectsResponseModel( + {this.desciption, + this.desciptionN, + this.iD, + this.legalName, + this.legalNameN, + this.name, + this.nameN, + this.phoneNumber, + this.setupID, + this.distanceInKilometers, + this.isActive, + this.latitude, + this.longitude, + this.mainProjectID, + this.projectOutSA, + this.usingInDoctorApp}); + + GetAllProjectsResponseModel.fromJson(Map json) { + desciption = json['Desciption']; + desciptionN = json['DesciptionN']; + iD = json['ID']; + legalName = json['LegalName']; + legalNameN = json['LegalNameN']; + name = json['Name']; + nameN = json['NameN']; + phoneNumber = json['PhoneNumber']; + setupID = json['SetupID']; + distanceInKilometers = json['DistanceInKilometers']; + isActive = json['IsActive']; + latitude = json['Latitude']; + longitude = json['Longitude']; + mainProjectID = json['MainProjectID']; + projectOutSA = json['ProjectOutSA']; + usingInDoctorApp = json['UsingInDoctorApp']; + } + + Map toJson() { + final Map data = new Map(); + data['Desciption'] = this.desciption; + data['DesciptionN'] = this.desciptionN; + data['ID'] = this.iD; + data['LegalName'] = this.legalName; + data['LegalNameN'] = this.legalNameN; + data['Name'] = this.name; + data['NameN'] = this.nameN; + data['PhoneNumber'] = this.phoneNumber; + data['SetupID'] = this.setupID; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['IsActive'] = this.isActive; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['MainProjectID'] = this.mainProjectID; + data['ProjectOutSA'] = this.projectOutSA; + data['UsingInDoctorApp'] = this.usingInDoctorApp; + return data; + } +} diff --git a/lib/core/service/AlHabibMedicalService/e_referral_service.dart b/lib/core/service/AlHabibMedicalService/e_referral_service.dart index 6c356f5c..6e8da51b 100644 --- a/lib/core/service/AlHabibMedicalService/e_referral_service.dart +++ b/lib/core/service/AlHabibMedicalService/e_referral_service.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/check_activation_code_for_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/create_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_cities_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_relationship_types_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_response_model.dart'; @@ -14,6 +15,9 @@ class EReferralService extends BaseService { List _allCities = List(); List get allCities => _allCities; + List _allProjects = List(); + List get allProjects => _allProjects; + List _allReferral = List(); List get allReferral => _allReferral; String _activationCode; @@ -53,6 +57,20 @@ class EReferralService extends BaseService { }, body: {}); } + Future getAllProjects() async { + await baseAppClient.post(GET_PROJECT, + onSuccess: (dynamic response, int statusCode) { + _allProjects.clear(); + response['ListProject'].forEach((city) { + _allProjects + .add(GetAllProjectsResponseModel.fromJson(city)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: {}); + } + Future sendActivationCodeForEReferral( SendActivationCodeForEReferralRequestModel @@ -60,6 +78,7 @@ class EReferralService extends BaseService { hasError = false; await baseAppClient.post(SEND_ACTIVATION_CODE_FOR_E_REFERRAL, onSuccess: (dynamic response, int statusCode) { + print(response["VerificationCode"]); _activationCode = response["VerificationCode"]; _logInTokenID = response["LogInTokenID"]; @@ -86,19 +105,20 @@ class EReferralService extends BaseService { }, body: checkActivationCodeForEReferralRequestModel.toJson()); } - Future createEReferral( + Future createEReferral( CreateEReferralRequestModel createEReferralRequestModel ) async { hasError = false; + dynamic localRes; await baseAppClient.post(CREATE_E_REFERRAL/*'Services/Patients.svc/REST/CreateEReferral'*/, onSuccess: (dynamic response, int statusCode) { // TODO Waiting for fix service - var asd= ("EEEEEE"); - + localRes = response; }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, body: createEReferralRequestModel.toJson()); + return Future.value(localRes); } Future getEReferrals( diff --git a/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart b/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart index 1972e08f..45adb6d3 100644 --- a/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart +++ b/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/check_activation_code_for_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/create_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_cities_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_relationship_types_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_response_model.dart'; @@ -18,64 +19,92 @@ class EReferralViewModel extends BaseViewModel { List get relationTypes => _eReferralService.relationTypes; + List get allCities => _eReferralService.allCities; - List get allReferral => _eReferralService.allReferral; + List get allHospitals => + _eReferralService.allProjects; + List get allReferral => + _eReferralService.allReferral; - void getRelationTypes() async { + void getRelationTypes() async { setState(ViewState.Busy); await _eReferralService.getRelationTypes(); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.Error); - } else{ + } else { setState(ViewState.Idle); } } - void getAllCities() async { + + void getAllCities() async { setState(ViewState.Busy); await _eReferralService.getAllCities(); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.Error); - } else{ + } else { setState(ViewState.Idle); } } - void sendActivationCodeForEReferral(SendActivationCodeForEReferralRequestModel sendActivationCodeForEReferralRequestModel) async { + void getAllProjects() async { + setState(ViewState.Busy); + await _eReferralService.getAllProjects(); + if (_eReferralService.hasError) { + error = _eReferralService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + void sendActivationCodeForEReferral( + SendActivationCodeForEReferralRequestModel + sendActivationCodeForEReferralRequestModel) async { setState(ViewState.BusyLocal); - await _eReferralService.sendActivationCodeForEReferral(sendActivationCodeForEReferralRequestModel); + await _eReferralService.sendActivationCodeForEReferral( + sendActivationCodeForEReferralRequestModel); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.ErrorLocal); - } else{ + } else { setState(ViewState.Idle); } } - checkActivationCodeForEReferral(CheckActivationCodeForEReferralResponseModel checkActivationCodeForEReferralRequestModel) async { + checkActivationCodeForEReferral( + CheckActivationCodeForEReferralResponseModel + checkActivationCodeForEReferralRequestModel) async { setState(ViewState.BusyLocal); - await _eReferralService.checkActivationCodeForEReferral(checkActivationCodeForEReferralRequestModel); + await _eReferralService.checkActivationCodeForEReferral( + checkActivationCodeForEReferralRequestModel); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.ErrorLocal); - } else{ + } else { setState(ViewState.Idle); } } - void createEReferral( + Future createEReferral( CreateEReferralRequestModel createEReferralRequestModel) async { + dynamic localRes; setState(ViewState.BusyLocal); - await _eReferralService.createEReferral(createEReferralRequestModel); + await _eReferralService + .createEReferral(createEReferralRequestModel) + .then((response) { + localRes = response; + }); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.ErrorLocal); } else { setState(ViewState.Idle); } + return Future.value(localRes); } getEReferrals(SearchEReferralRequestModel searchEReferralRequestModel) async { diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_index_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_index_page.dart index fb2b94c6..2cb179b8 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_index_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_index_page.dart @@ -40,34 +40,32 @@ class _StartIndexForNewEReferralState extends State @override Widget build(BuildContext context) { return Scaffold( - body: SafeArea( - child: SingleChildScrollView( - child: Container( - height: MediaQuery.of(context).size.height * 0.9, - child: PageView( - physics: NeverScrollableScrollPhysics(), - controller: _controller, - onPageChanged: (index) { - setState(() { - _currentIndex = index; - }); - }, - scrollDirection: Axis.horizontal, - children: [ - NewEReferralStepOnePage( - changePageViewIndex: changePageViewIndex, - createEReferralRequestModel: createEReferralRequestModel, - ), - NewEReferralStepTowPage( - changePageViewIndex: changePageViewIndex, - createEReferralRequestModel: createEReferralRequestModel, - ), - NewEReferralStepThreePage( - changePageViewIndex: changePageViewIndex, - createEReferralRequestModel: createEReferralRequestModel, - ), - ], - ), + body: SingleChildScrollView( + child: Container( + height: MediaQuery.of(context).size.height * 0.9, + child: PageView( + physics: NeverScrollableScrollPhysics(), + controller: _controller, + onPageChanged: (index) { + setState(() { + _currentIndex = index; + }); + }, + scrollDirection: Axis.horizontal, + children: [ + NewEReferralStepOnePage( + changePageViewIndex: changePageViewIndex, + createEReferralRequestModel: createEReferralRequestModel, + ), + NewEReferralStepTowPage( + changePageViewIndex: changePageViewIndex, + createEReferralRequestModel: createEReferralRequestModel, + ), + NewEReferralStepThreePage( + changePageViewIndex: changePageViewIndex, + createEReferralRequestModel: createEReferralRequestModel, + ), + ], ), ), ), diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart index 62799c6d..db549626 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart @@ -6,28 +6,29 @@ import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart'; import 'package:diplomaticquarterapp/core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; -import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_confirm_sms_dialog.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/dialogs/select_country_ingo_Dialog.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/dialogs/select_relation_type_dialog.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_confirm_sms_dialog.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - class NewEReferralStepOnePage extends StatefulWidget { final CreateEReferralRequestModel createEReferralRequestModel; final Function changePageViewIndex; - const NewEReferralStepOnePage({Key key, this.createEReferralRequestModel, this.changePageViewIndex}) : super(key: key); + const NewEReferralStepOnePage( + {Key key, this.createEReferralRequestModel, this.changePageViewIndex}) + : super(key: key); @override - _NewEReferralStepOnePageState createState() => _NewEReferralStepOnePageState(); + _NewEReferralStepOnePageState createState() => + _NewEReferralStepOnePageState(); } class _NewEReferralStepOnePageState extends State { @@ -64,27 +65,25 @@ class _NewEReferralStepOnePageState extends State { context: context, barrierDismissible: false, child: EReferralConfirmSMSDialog( - phoneNumber: _selectedCountry['code']+_mobileTextController.text, - onSucces: (){ - Navigator.of(context).pop(); - widget.changePageViewIndex(1); - widget.createEReferralRequestModel.requesterName=_nameTextController.text; - widget.createEReferralRequestModel.requesterContactNo = _selectedCountry['code'].toString().substring(1)+_mobileTextController.text; - widget.createEReferralRequestModel.requesterRelationship=_selectedRelation.iD; - - - } - - - ), + phoneNumber: _selectedCountry['code'] + _mobileTextController.text, + onSucces: () { + Navigator.of(context).pop(); + widget.changePageViewIndex(1); + widget.createEReferralRequestModel.requesterName = + _nameTextController.text; + widget.createEReferralRequestModel.requesterContactNo = + _selectedCountry['code'].toString().substring(1) + + _mobileTextController.text; + widget.createEReferralRequestModel.requesterRelationship = + _selectedRelation.iD; + }), ).then((value) { print("dialog dismissed"); print(value); - if (value != null && value) { - - } + if (value != null && value) {} }); } + return BaseView( onModelReady: (model) => model.getRelationTypes(), builder: (_, model, widget) => AppScaffold( @@ -92,7 +91,7 @@ class _NewEReferralStepOnePageState extends State { body: SingleChildScrollView( physics: ScrollPhysics(), child: Container( - margin: EdgeInsets.all(12), + margin: EdgeInsets.all(10), child: Center( child: FractionallySizedBox( widthFactor: 0.9, @@ -100,11 +99,10 @@ class _NewEReferralStepOnePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 20, + height: 80, ), Center( child: Texts( -// TranslationBase.of(context).advancePaymentLabel, "Referral requester information", textAlign: TextAlign.center, ), @@ -185,34 +183,30 @@ class _NewEReferralStepOnePageState extends State { ), ), bottomSheet: Container( - height: MediaQuery - .of(context) - .size - .height * 0.1, + height: MediaQuery.of(context).size.height * 0.1, width: double.infinity, padding: EdgeInsets.all(9), child: SecondaryButton( textColor: Colors.white, label: "Next", - onTap: () async { - SendActivationCodeForEReferralRequestModel sendActivationCodeForEReferralRequestModel = - SendActivationCodeForEReferralRequestModel( + onTap: () async { + SendActivationCodeForEReferralRequestModel + sendActivationCodeForEReferralRequestModel = + SendActivationCodeForEReferralRequestModel( zipCode: _selectedCountry['code'], - patientMobileNumber: int.parse( - _mobileTextController.text),); - await model.sendActivationCodeForEReferral(sendActivationCodeForEReferralRequestModel); + patientMobileNumber: int.parse(_mobileTextController.text), + ); + await model.sendActivationCodeForEReferral( + sendActivationCodeForEReferralRequestModel); showSMSDialog(); }, loading: model.state == ViewState.BusyLocal, - disabled: - _nameTextController.text.isEmpty || + disabled: _nameTextController.text.isEmpty || _selectedRelation == null || _mobileTextController.text.isEmpty, ), ))); - - } void confirmSelectRelationTypeDialog( @@ -261,12 +255,8 @@ class _NewEReferralStepOnePageState extends State { } class MobileNumberTextFiled extends StatelessWidget { - const MobileNumberTextFiled({ - Key key, - this.controller, - this.code - }) : super(key: key); - + const MobileNumberTextFiled({Key key, this.controller, this.code}) + : super(key: key); final TextEditingController controller; final String code; diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart index d84b9d61..cb9f03df 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart @@ -1,21 +1,23 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/create_e_referral_request_model.dart'; -import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_cities_response_model.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/dialogs/select_project_dialog.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_options/BottomSheet.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import '../dialogs/select_city_dialog.dart'; - class NewEReferralStepThreePage extends StatefulWidget { final CreateEReferralRequestModel createEReferralRequestModel; final Function changePageViewIndex; @@ -32,7 +34,8 @@ class NewEReferralStepThreePage extends StatefulWidget { class _NewEReferralStepThreePageState extends State { TextEditingController _nameTextController = TextEditingController(); TextEditingController _mobileTextController = TextEditingController(); - GetAllCitiesResponseModel _selectedCity; + + GetAllProjectsResponseModel _selectedHospital; GetAllSharedRecordsByStatusList selectedPatientFamily; List medicalReportImages = []; @@ -50,6 +53,7 @@ class _NewEReferralStepThreePageState extends State { @override Widget build(BuildContext context) { return BaseView( + onModelReady: (model) => model.getAllProjects(), builder: (_, model, widget) => AppScaffold( isShowAppBar: false, body: SingleChildScrollView( @@ -64,7 +68,7 @@ class _NewEReferralStepThreePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 20, + height: 80, ), Center( child: Texts( @@ -103,8 +107,13 @@ class _NewEReferralStepThreePageState extends State { ImageOptions.showImageOptions(context, (String image) { setState(() { - EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${ medicalReportImages.length +1}.png',base64String: image ); - medicalReportImages.add(eReferralAttachment); + EReferralAttachment eReferralAttachment = + new EReferralAttachment( + fileName: + 'image ${medicalReportImages.length + 1}.png', + base64String: image); + medicalReportImages + .add(eReferralAttachment); }); }); }, @@ -158,15 +167,17 @@ class _NewEReferralStepThreePageState extends State { width: 8, ), Texts( - medicalReportImages[index].fileName, + medicalReportImages[index] + .fileName, ), ], ), InkWell( onTap: () { setState(() { - medicalReportImages - .remove(medicalReportImages[index]); + medicalReportImages.remove( + medicalReportImages[ + index]); }); }, child: Icon( @@ -205,7 +216,7 @@ class _NewEReferralStepThreePageState extends State { ), InkWell( onTap: () => - confirmSelectCityDialog(model.allCities), + confirmSelectHospital(model.allHospitals), child: Container( padding: EdgeInsets.all(12), width: double.infinity, @@ -262,12 +273,12 @@ class _NewEReferralStepThreePageState extends State { ], ), ), - if(isPatientInsured) - SizedBox( - height: 12, - ), + if (isPatientInsured) + SizedBox( + height: 12, + ), Opacity( - opacity: isPatientInsured?1:0, + opacity: isPatientInsured ? 1 : 0, child: Container( padding: EdgeInsets.only(top: 10), decoration: BoxDecoration( @@ -276,16 +287,21 @@ class _NewEReferralStepThreePageState extends State { ), child: Column( children: [ - InkWell( onTap: () { ImageOptions.showImageOptions(context, (String image) { setState(() { + EReferralAttachment + eReferralAttachment = + new EReferralAttachment( + fileName: + 'image ${medicalReportImages.length + 1}.png', + base64String: image); - EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${ medicalReportImages.length +1}.png',base64String: image ); - - insuredPatientImages=[eReferralAttachment]; + insuredPatientImages = [ + eReferralAttachment + ]; }); }); }, @@ -333,8 +349,8 @@ class _NewEReferralStepThreePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( - FontAwesomeIcons.paperclip), + Icon(FontAwesomeIcons + .paperclip), SizedBox( width: 8, ), @@ -346,8 +362,9 @@ class _NewEReferralStepThreePageState extends State { InkWell( onTap: () { setState(() { - insuredPatientImages - .remove(insuredPatientImages[index]); + insuredPatientImages.remove( + insuredPatientImages[ + index]); }); }, child: Icon( @@ -378,50 +395,72 @@ class _NewEReferralStepThreePageState extends State { textColor: Colors.white, label: "Submit", onTap: () async { - this.widget.createEReferralRequestModel.medicalReportAttachment = medicalReportImages; - this.widget.createEReferralRequestModel.insuranceCardAttachment = insuredPatientImages.length !=0?insuredPatientImages[0]:null; - this.widget.createEReferralRequestModel.isInsuredPatient = isPatientInsured; + this + .widget + .createEReferralRequestModel + .medicalReportAttachment = medicalReportImages; + this + .widget + .createEReferralRequestModel + .insuranceCardAttachment = + insuredPatientImages.length != 0 + ? insuredPatientImages[0] + : null; + this.widget.createEReferralRequestModel.isInsuredPatient = + isPatientInsured; // ToDo make the preferred Branch info dynamic - this.widget.createEReferralRequestModel.preferredBranchCode = 15; - this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; - + this.widget.createEReferralRequestModel.preferredBranchCode = + _selectedHospital.iD; + this.widget.createEReferralRequestModel.preferredBranchName = + _selectedHospital.desciption; + this.widget.createEReferralRequestModel.otherRelationship = + ""; - // this.widget.createEReferralRequestModel.fullName= ""; - this.widget.createEReferralRequestModel.otherRelationship= ""; - // this.widget.createEReferralRequestModel.; - // this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; - // this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; - - await model.createEReferral(this.widget.createEReferralRequestModel); + await model + .createEReferral(this.widget.createEReferralRequestModel) + .then((value) { + AlertDialogBox( + context: context, + confirmMessage: + TranslationBase.of(context).ereferralSaveSuccess + + value['ReferralNumber'].toString(), + okText: TranslationBase.of(context).ok, + okFunction: () { + AlertDialogBox.closeAlertDialog(context); + navigateToHome(context); + }).showAlertDialog(context); + }); }, loading: model.state == ViewState.BusyLocal, - disabled: medicalReportImages.length == 0 , + disabled: medicalReportImages.length == 0, ), ))); } - void confirmSelectCityDialog(List cities) { + Future navigateToHome(context) async { + Navigator.of(context).popAndPushNamed(HOME); + } + + void confirmSelectHospital(List projects) { showDialog( context: context, - child: SelectCityDialog( - cities: cities, - selectedCity: _selectedCity, + child: SelectHospitalDialog( + hospitals: projects, + selectedHospital: _selectedHospital, onValueSelected: (value) { setState(() { - _selectedCity = value; + _selectedHospital = value; }); }, ), ); } - String getRelationName() { - if (_selectedCity != null) - return _selectedCity.description; + if (_selectedHospital != null) + return _selectedHospital.desciption; else - return "Select Relationship" /*TranslationBase.of(context).selectHospital*/; + return "Select Hospital*" /*TranslationBase.of(context).selectHospital*/; } - } diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart index 5f85fe12..34616def 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart @@ -71,7 +71,7 @@ class _NewEReferralStepTowPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 30, + height: 80, ), Center( child: Texts( diff --git a/lib/pages/AlHabibMedicalService/E-Referral/dialogs/select_project_dialog.dart b/lib/pages/AlHabibMedicalService/E-Referral/dialogs/select_project_dialog.dart new file mode 100644 index 00000000..3a3cc083 --- /dev/null +++ b/lib/pages/AlHabibMedicalService/E-Referral/dialogs/select_project_dialog.dart @@ -0,0 +1,129 @@ +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_all_projects_response_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class SelectHospitalDialog extends StatefulWidget { + + final List hospitals; + final Function(GetAllProjectsResponseModel) onValueSelected; + GetAllProjectsResponseModel selectedHospital; + + SelectHospitalDialog( + {Key key, this.hospitals, this.onValueSelected, this.selectedHospital}); + + @override + _SelectHospitalDialogState createState() => _SelectHospitalDialogState(); +} + +class _SelectHospitalDialogState extends State { + + @override + void initState() { + super.initState(); + widget.selectedHospital = widget.selectedHospital ?? widget.hospitals[0]; + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + children: [ + Column( + children: [ + Divider(), + ...List.generate( + widget.hospitals.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 2, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + setState(() { + widget.selectedHospital = widget.hospitals[index]; + }); + }, + child: ListTile( + title: Text(widget.hospitals[index].desciption), + leading: Radio( + value: widget.hospitals[index], + groupValue: widget.selectedHospital, + activeColor: Colors.red[800], + onChanged: (value) { + setState(() { + widget.selectedHospital = value; + }); + }, + ), + ), + ), + ) + ], + ), + SizedBox( + height: 5.0, + ), + ], + ), + ), + SizedBox( + height: 5.0, + ), + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Center( + child: Texts( + TranslationBase.of(context).cancel.toUpperCase(), + color: Colors.red, + ), + ), + ), + ), + ), + ), + Container( + width: 1, + height: 30, + color: Colors.grey[500], + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + widget.onValueSelected(widget.selectedHospital); + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts( + TranslationBase.of(context).ok, + fontWeight: FontWeight.w400, + )), + ), + ), + ), + ], + ) + ], + ) + ], + ); + } +} diff --git a/lib/pages/AlHabibMedicalService/E-Referral/e_referral_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/e_referral_page.dart index 9f836860..f50e67fa 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/e_referral_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/e_referral_page.dart @@ -88,13 +88,13 @@ class _EReferralPageState extends State Container( width: MediaQuery.of(context).size.width * 0.37, child: Center( - child: Texts("New Referral"), + child: Texts("New Referral", fontSize: 14.0), ), ), Container( width: MediaQuery.of(context).size.width * 0.37, child: Center( - child: Texts("Search for Referrals"), + child: Texts("Search for Referrals", fontSize: 14.0), ), ), ], diff --git a/lib/pages/medical/smart_watch_health_data/health_data_list.dart b/lib/pages/medical/smart_watch_health_data/health_data_list.dart index 2f9a3e60..763948c0 100644 --- a/lib/pages/medical/smart_watch_health_data/health_data_list.dart +++ b/lib/pages/medical/smart_watch_health_data/health_data_list.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:fit_kit/fit_kit.dart'; import 'package:flutter/material.dart'; class HealthDataList extends StatefulWidget { @@ -8,6 +9,19 @@ class HealthDataList extends StatefulWidget { } class _HealthDataListState extends State { + List dataTypes = List(); + + @override + void initState() { + dataTypes.add(DataType.DISTANCE); + dataTypes.add(DataType.STEP_COUNT); + dataTypes.add(DataType.HEART_RATE); + dataTypes.add(DataType.SLEEP); + dataTypes.add(DataType.ENERGY); + + super.initState(); + } + @override Widget build(BuildContext context) { return AppScaffold( @@ -132,7 +146,7 @@ class _HealthDataListState extends State { width: MediaQuery.of(context).size.width * 0.8, child: Button( onTap: () { -// launch(model.radImageURL); + readAll(); }, label: 'Sync Health Data', backgroundColor: Colors.grey[800], @@ -142,4 +156,26 @@ class _HealthDataListState extends State { ), )); } + + void readLast() async { + final result = await FitKit.readLast(DataType.DISTANCE); + print(result); + print(result); + } + + void readAll() async { + if (await FitKit.requestPermissions(dataTypes)) { + for (DataType type in dataTypes) { + final results = await FitKit.read( + type, + dateFrom: DateTime.now().subtract(Duration(days: 15)), + dateTo: DateTime.now(), + limit: 100, + ); + print(results); + print(results.length); + } + readLast(); + } + } } diff --git a/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart b/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart index eb0c1675..3f07693b 100644 --- a/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart +++ b/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart @@ -31,6 +31,7 @@ class _SmartWatchInstructionsState extends State { return AppScaffold( appBarTitle: "Sync Health Data", isShowAppBar: true, + isShowDecPage: false, body: Container( child: Platform.isIOS ? _getAppleWatchInstructions() @@ -88,6 +89,8 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 1", style: TextStyle( @@ -108,8 +111,12 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 2", + overflow: TextOverflow.clip, + softWrap: true, style: TextStyle( fontSize: 12.0)), ) @@ -135,6 +142,8 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 3", style: TextStyle( @@ -155,6 +164,8 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 4", style: TextStyle( @@ -182,6 +193,8 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 5", style: TextStyle( @@ -202,6 +215,8 @@ class _SmartWatchInstructionsState extends State { width: 70.0, height: 70.0), Container( + margin: EdgeInsets.only(left: 5.0), + width: 105.0, child: Text( "Apple Watch Series 6", style: TextStyle( @@ -427,7 +442,7 @@ class _SmartWatchInstructionsState extends State { width: MediaQuery.of(context).size.width, margin: EdgeInsets.symmetric(horizontal: 5.0), child: Card( - margin: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 8.0), + margin: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 0.0), color: Colors.white.withOpacity(1.0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), @@ -657,7 +672,7 @@ class _SmartWatchInstructionsState extends State { style: TextStyle(fontSize: 17.0)), ), Container( - margin: EdgeInsets.all(15.0), + margin: EdgeInsets.all(12.0), child: ButtonTheme( shape: RoundedRectangleBorder( borderRadius: diff --git a/lib/pages/medical/vital_sign/vital_sign_item.dart b/lib/pages/medical/vital_sign/vital_sign_item.dart index fb44772d..a42e26d5 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item.dart @@ -46,7 +46,7 @@ class VitalSignItem extends StatelessWidget { des, style: TextStyle( fontSize: 1.7 * SizeConfig.textMultiplier, - color: HexColor('#B8382C'), + color: Theme.of(context).textTheme.headline1.color, fontWeight: FontWeight.bold, ), ), @@ -76,11 +76,11 @@ class VitalSignItem extends StatelessWidget { text: TextSpan( style: TextStyle(color: Colors.black), children: [ - TextSpan(text: lastVal), + TextSpan(text: lastVal + " "), TextSpan( text: unit, style: TextStyle( - color: HexColor('#B8382C'), + color: Theme.of(context).textTheme.headline1.color, ), ), ]), diff --git a/lib/theme/theme_value.dart b/lib/theme/theme_value.dart index bc80f47c..aedd0fbf 100644 --- a/lib/theme/theme_value.dart +++ b/lib/theme/theme_value.dart @@ -65,6 +65,7 @@ final blueBackground = Color(0xFFFFFFFF); }, ), hintColor: Colors.grey[400], + accentColor: Color(0xffB8382C), disabledColor: Colors.grey[300], errorColor: Color.fromRGBO(235, 80, 60, 1.0), scaffoldBackgroundColor: Color(0xffEEEEEE), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 845fa869..4e0edcfd 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -890,6 +890,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get descriptionVaccination => localizedValues['description-vaccination'][locale.languageCode]; String get dueDate => localizedValues['due-date'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; + String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; } diff --git a/lib/widgets/bottom_options/BottomSheet.dart b/lib/widgets/bottom_options/BottomSheet.dart index 66ee36c4..f8a99c17 100644 --- a/lib/widgets/bottom_options/BottomSheet.dart +++ b/lib/widgets/bottom_options/BottomSheet.dart @@ -15,7 +15,7 @@ class ImageOptions { return _BottomSheet( children: [ _BottomSheetItem( - title: "Select file souse", + title: "Select file source", ), _BottomSheetItem( title: "Gallery", From 82e23efd327e6e4f3082e6933cbe4e7424d36af6 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 2 Dec 2020 18:06:37 +0300 Subject: [PATCH 32/69] working on ereferral --- .../e_referral_service.dart | 104 +++++++++--------- lib/core/service/client/base_app_client.dart | 1 + .../E-Referral/search_for_referrals_page.dart | 62 ++++++++++- lib/pages/base/base_view.dart | 2 +- lib/pages/login/login.dart | 16 ++- pubspec.yaml | 3 + 6 files changed, 120 insertions(+), 68 deletions(-) diff --git a/lib/core/service/AlHabibMedicalService/e_referral_service.dart b/lib/core/service/AlHabibMedicalService/e_referral_service.dart index 6e8da51b..c951a968 100644 --- a/lib/core/service/AlHabibMedicalService/e_referral_service.dart +++ b/lib/core/service/AlHabibMedicalService/e_referral_service.dart @@ -11,14 +11,18 @@ import 'package:diplomaticquarterapp/core/service/base_service.dart'; class EReferralService extends BaseService { List _relationTypes = List(); + List get relationTypes => _relationTypes; List _allCities = List(); + List get allCities => _allCities; List _allProjects = List(); + List get allProjects => _allProjects; List _allReferral = List(); + List get allReferral => _allReferral; String _activationCode; String _logInTokenID; @@ -46,33 +50,30 @@ class EReferralService extends BaseService { Future getAllCities() async { await baseAppClient.post(GET_ALL_CITIES, onSuccess: (dynamic response, int statusCode) { - _allCities.clear(); - response['ListCities'].forEach((city) { - _allCities - .add(GetAllCitiesResponseModel.fromJson(city)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: {}); + _allCities.clear(); + response['ListCities'].forEach((city) { + _allCities.add(GetAllCitiesResponseModel.fromJson(city)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: {}); } Future getAllProjects() async { await baseAppClient.post(GET_PROJECT, onSuccess: (dynamic response, int statusCode) { - _allProjects.clear(); - response['ListProject'].forEach((city) { - _allProjects - .add(GetAllProjectsResponseModel.fromJson(city)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: {}); + _allProjects.clear(); + response['ListProject'].forEach((city) { + _allProjects.add(GetAllProjectsResponseModel.fromJson(city)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: {}); } Future sendActivationCodeForEReferral( - SendActivationCodeForEReferralRequestModel sendActivationCodeForEReferralRequestModel) async { hasError = false; @@ -81,24 +82,21 @@ class EReferralService extends BaseService { print(response["VerificationCode"]); _activationCode = response["VerificationCode"]; _logInTokenID = response["LogInTokenID"]; - }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, body: sendActivationCodeForEReferralRequestModel.toJson()); } - - Future checkActivationCodeForEReferral( CheckActivationCodeForEReferralResponseModel checkActivationCodeForEReferralRequestModel) async { checkActivationCodeForEReferralRequestModel.isDentalAllowedBackend = false; - checkActivationCodeForEReferralRequestModel.logInTokenID= _logInTokenID; - hasError =false; + checkActivationCodeForEReferralRequestModel.logInTokenID = _logInTokenID; + hasError = false; await baseAppClient.post(CHECK_ACTIVATION_CODE_FOR_E_REFERRAL, onSuccess: (dynamic response, int statusCode) { - _isActivationCodeValid = true; + _isActivationCodeValid = true; }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; @@ -106,40 +104,36 @@ class EReferralService extends BaseService { } Future createEReferral( - CreateEReferralRequestModel createEReferralRequestModel - ) async { - hasError = false; - dynamic localRes; - await baseAppClient.post(CREATE_E_REFERRAL/*'Services/Patients.svc/REST/CreateEReferral'*/, + CreateEReferralRequestModel createEReferralRequestModel) async { + hasError = false; + dynamic localRes; + await baseAppClient.post( + CREATE_E_REFERRAL /*'Services/Patients.svc/REST/CreateEReferral'*/, onSuccess: (dynamic response, int statusCode) { - // TODO Waiting for fix service - localRes = response; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: createEReferralRequestModel.toJson()); - return Future.value(localRes); + // TODO Waiting for fix service + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: createEReferralRequestModel.toJson()); + return Future.value(localRes); } Future getEReferrals( - SearchEReferralRequestModel searchEReferralRequestModel - ) async { + SearchEReferralRequestModel searchEReferralRequestModel) async { hasError = false; - // TODO return this code when the fix the server - // await baseAppClient.post(GET_E_REFERRALS, - // onSuccess: (dynamic response, int statusCode) { - // print("EEEEEE"); - // // TODO Waiting for fix service - // // ToDo change this one when you have data - // _allReferral.clear(); - // // response['ListCities'].forEach((city) { - // // _allReferral - // // .add(SearchEReferralResponseModel.fromJson(city)); - // // }); - // - // }, onFailure: (String error, int statusCode) { - // hasError = true; - // super.error = error; - // }, body: searchEReferralRequestModel.toJson()); + + dynamic localRes; + + await baseAppClient.post(GET_E_REFERRALS, + onSuccess: (dynamic response, int statusCode) { + print("EEEEEE"); + _allReferral.clear(); + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: searchEReferralRequestModel.toJson()); + return Future.value(localRes); } } diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index c96d6ec7..afa3bd05 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -54,6 +54,7 @@ class BaseAppClient { : SETUP_ID : SETUP_ID; } + body['VersionID'] = VERSION_ID; body['Channel'] = CHANNEL; body['LanguageID'] = body.containsKey('LanguageID') diff --git a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart index 0b75705d..e74b6acf 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart @@ -1,9 +1,13 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_criteria_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_request_model.dart'; +import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/e_referral_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/errors/app_embedded_error.dart'; @@ -12,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import '../../../locator.dart'; import 'New_E_Referral/new_e_referral_step_one_page.dart'; import 'dialogs/select_country_ingo_Dialog.dart'; import 'dialogs/select_search_criteria_dialog.dart'; @@ -28,6 +33,7 @@ class _SearchForReferralsPageState extends State { TextEditingController _mobileTextController = TextEditingController(); bool _isSubmitted = false; + AuthenticatedUser authUser; dynamic _selectedCountry = { "name": "Saudi Arabia", @@ -41,6 +47,13 @@ class _SearchForReferralsPageState extends State { SearchCriteriaModel selectedCriteria = SearchCriteriaModel( name: "Identification Number", nameAr: "رقم المحول", value: 1); + @override + void initState() { + authUser = new AuthenticatedUser(); + WidgetsBinding.instance.addPostFrameCallback((_) => getPatientData()); + super.initState(); + } + @override Widget build(BuildContext context) { return BaseView( @@ -123,9 +136,8 @@ class _SearchForReferralsPageState extends State { if ((model.state == ViewState.Idle && model.allReferral.length == 0)) Text("There's No Referral To deliver"), - if (( - model.state == ViewState.ErrorLocal)) - AppEmbeddedError( error:model.error), + if ((model.state == ViewState.ErrorLocal)) + AppEmbeddedError(error: model.error), NetworkBaseView( baseViewModel: model, child: ListView.builder( @@ -186,6 +198,50 @@ class _SearchForReferralsPageState extends State { ))); } + void getEreferrals() { + EReferralService _eReferralService = locator(); + + String mobileNumber; + String zipCode; + + if (authUser.mobileNumber.length > 9) { + mobileNumber = + authUser.mobileNumber.substring(1, authUser.mobileNumber.length); + } else { + mobileNumber = authUser.mobileNumber; + } + + if (authUser.outSA == 0) { + zipCode = "966"; + } else { + zipCode = "971"; + } + + SearchEReferralRequestModel searchEReferralRequestModel = + new SearchEReferralRequestModel( + patientMobileNumber: zipCode + mobileNumber, + identificationNo: authUser.patientIdentificationNo, + referralNumber: 0); + + _eReferralService + .getEReferrals(searchEReferralRequestModel) + .then((response) { + print(response['List_EReferrals']); + }).catchError(() {}); + } + + getPatientData() async { + AppSharedPreferences sharedPref = AppSharedPreferences(); + if (await sharedPref.getObject(USER_PROFILE) != null) { + var data = + AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); + setState(() { + authUser = data; + getEreferrals(); + }); + } + } + void confirmSelectCountryTypeDialog() { showDialog( context: context, diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index 5977e97e..38b70e23 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -63,4 +63,4 @@ class _BaseViewState extends State> { super.dispose(); } -} +} \ No newline at end of file diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 25ad13bb..5a5a8b19 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -20,13 +20,11 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class Login extends StatefulWidget { @override @@ -121,7 +119,9 @@ class _Login extends State { color: Colors.grey, height: 2, ), - SizedBox(height: 10,), + SizedBox( + height: 10, + ), Row( children: [ Expanded( @@ -208,15 +208,13 @@ class _Login extends State { okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () => { - ConfirmDialog.closeAlertDialog(context), + ConfirmDialog.closeAlertDialog(context), Navigator.of(context).pushNamed( REGISTER, ), - }, cancelFunction: () => {ConfirmDialog.closeAlertDialog(context)}); dialog.showAlertDialog(context); - }); // SMSOTP.showLoadingDialog(context, false), } @@ -243,9 +241,9 @@ class _Login extends State { this.authService.checkActivationCode(request, code).then((result) => { sharedPref.remove(FAMILY_FILE), result = CheckActivationCode.fromJson(result), - result.list.isFamily =false, - this.sharedPref.setObject(USER_PROFILE, result.list), - this.sharedPref.setObject(MAIN_USER, result.list), + result.list.isFamily = false, + this.sharedPref.setObject(USER_PROFILE, result.list), + this.sharedPref.setObject(MAIN_USER, result.list), this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID), this.sharedPref.setString(TOKEN, result.authenticationTokenID), authenticatedUserObject.getUser(), diff --git a/pubspec.yaml b/pubspec.yaml index 66e08f5c..ce00b9fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -158,6 +158,9 @@ dependencies: badges: ^1.1.4 + #Smartwatch Health Data Integration + fit_kit: ^1.1.2 + dev_dependencies: flutter_test: sdk: flutter From 5bf63174c9891487ce4a55af3192f7f931cd2830 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Wed, 2 Dec 2020 21:01:00 +0200 Subject: [PATCH 33/69] First step from translations --- lib/config/localized_values.dart | 20 + .../NewCMC/new_cmc_page.dart | 314 +++++++------- .../orders_log_details_page.dart | 100 +++-- .../new_home_health_care_page.dart | 43 +- .../orders_log_details_page.dart | 384 +++++++++--------- lib/uitl/translations_delegate_base.dart | 7 +- pubspec.yaml | 5 +- 7 files changed, 477 insertions(+), 396 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a5b22d8c..f7e6cc64 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1163,5 +1163,25 @@ const Map localizedValues = { "en": "The referral request has been submitted successfully, you will be contacted ASAP to complete the process. Referral request no is ", "ar": " تم إرسال طلب الإحالة بنجاح ، وسيتم الاتصال بك في أسرع وقت ممكن لإكمال العملية. رقم طلب الإحالة" }, + "requestID": { + "en": "Request ID", + "ar": " رقم الطلب" + }, + "OrderStatus": { + "en": "Status", + "ar": "الحاله" + },"pickupDate": { + "en": "Pickup Date", + "ar": "التاريخ" + } + ,"serviceName": { + "en": "Service Name", + "ar": " اسم الخدمة" + } + ,"orderLocation": { + "en": "Location", + "ar": "الموقع" + }, + }; diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart index cedd4018..a73c38bf 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart @@ -3,15 +3,18 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/Comprehens import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_order_detail_by_order_iD_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/Dialog/confirm_cancel_order_dialog.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/StepsWidget.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:provider/provider.dart'; import 'new_cmc_step_one_page.dart'; import 'new_cmc_step_three_page.dart'; @@ -85,6 +88,8 @@ class _NewCMCPageState extends State @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + void showConfirmMessage( CMCViewModel model, GetOrderDetailByOrderIDResponseModel order) { showDialog( @@ -134,183 +139,192 @@ class _NewCMCPageState extends State children: [ widget.model.cmcAllOrderDetail.length != 0 ? FractionallySizedBox( - heightFactor: 0.9, widthFactor: 0.9, - child: Container( - width: double.infinity, - margin: EdgeInsets.only(top: 15), - decoration: BoxDecoration( - border: - Border.all(color: Colors.grey, width: 1), - borderRadius: BorderRadius.circular(12), - color: Colors.white), + child: SingleChildScrollView( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - height: 12, - ), Container( width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + margin: EdgeInsets.only(top: 15), decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - // borderRadius: BorderRadius.circular(12), + border: + Border.all(color: Colors.grey, width: 1), + borderRadius: BorderRadius.circular(12), color: Colors.white), child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts( - "Request ID", - bold: false, - fontSize: 13, - ), SizedBox( - height: 4, + height: 12, ), - Texts( - widget.model.cmcAllOrderDetail[0].iD.toString(), - fontSize: 22, - ), - ], - ), - ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15,right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .requestID, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + widget.model.cmcAllOrderDetail[0].iD.toString(), + fontSize: 22, + ), + ], ), ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Status", - bold: false, - fontSize: 13, - ), - SizedBox( - height: 4, - ), - Texts( - "Pending", - fontSize: 22, + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15,right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .OrderStatus, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + + projectViewModel.isArabic ? widget.model.cmcAllOrderDetail[0] + .descriptionN : widget.model.cmcAllOrderDetail[0].description, + fontSize: 22, + ), + ], + ), ), - ], - ), - ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15,right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).pickupDate, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + DateUtil.getDayMonthYearDateFormatted( + DateUtil.convertStringToDate(widget.model.cmcAllOrderDetail[0].createdOn)), + fontSize: 22, + ), + ], ), ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Pickup Date", - bold: false, - fontSize: 13, + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, + ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).serviceName, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + !projectViewModel.isArabic?widget.model.cmcAllOrderDetail[0].description + .toString() : + widget.model.cmcAllOrderDetail[0] + .descriptionN + .toString(), + fontSize: 22, + ), + ], + ), ), SizedBox( - height: 4, - ), - Texts( - DateUtil.getDayMonthYearDateFormatted( - DateUtil.convertStringToDate( - widget.model.cmcAllOrderDetail[0] - .createdOn)), - fontSize: 22, + height: 12, ), - ], - ), - ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, + Center( + child: Container( + width: MediaQuery + .of(context) + .size + .width * + 0.85, + child: SecondaryButton( + label: TranslationBase.of(context).cancel.toUpperCase(), + onTap: () { + showConfirmMessage(widget.model, + widget.model.cmcAllOrderDetail[0]); + } + , + color: Colors.red[800], + disabled: false, + textColor: Theme + .of(context) + .backgroundColor), ), ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Service Name", - bold: false, - fontSize: 13, - ), SizedBox( - height: 4, - ), - Texts( - widget.model.cmcAllOrderDetail[0].description - .toString() ?? - widget.model.cmcAllOrderDetail[0] - .descriptionN - .toString(), - fontSize: 22, + height: 22, ), ], ), ), SizedBox( - height: 12, - ), - Center( - child: Container( - width: MediaQuery - .of(context) - .size - .width * - 0.85, - child: SecondaryButton( - label: "Cancel".toUpperCase(), - onTap: () { - showConfirmMessage(widget.model, - widget.model.cmcAllOrderDetail[0]); - } - , - color: Colors.red[800], - disabled: false, - textColor: Theme - .of(context) - .backgroundColor), - ), - ), - SizedBox( - height: 12, + height: 22, ), ], ), diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart index 6c915a4c..54f33f2b 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart @@ -2,13 +2,16 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_hhc_all_pres_orders_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'Dialog/confirm_cancel_order_dialog.dart'; @@ -19,6 +22,9 @@ class OrdersLogDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { + + ProjectViewModel projectViewModel = Provider.of(context); + void showConfirmMessage( CMCViewModel model, GetHHCAllPresOrdersResponseModel order) { showDialog( @@ -78,7 +84,7 @@ class OrdersLogDetailsPage extends StatelessWidget { Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -89,11 +95,12 @@ class OrdersLogDetailsPage extends StatelessWidget { // borderRadius: BorderRadius.circular(12), color: Colors.white), child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Request ID", + TranslationBase + .of(context) + .requestID, bold: false, fontSize: 13, ), @@ -110,7 +117,7 @@ class OrdersLogDetailsPage extends StatelessWidget { Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -121,11 +128,12 @@ class OrdersLogDetailsPage extends StatelessWidget { // borderRadius: BorderRadius.circular(12), color: Colors.white), child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Status", + TranslationBase + .of(context) + .OrderStatus, bold: false, fontSize: 13, ), @@ -133,7 +141,9 @@ class OrdersLogDetailsPage extends StatelessWidget { height: 4, ), Texts( - order.description, + + projectViewModel.isArabic ? order + .descriptionN : order.description, fontSize: 22, ), ], @@ -142,7 +152,7 @@ class OrdersLogDetailsPage extends StatelessWidget { Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -153,11 +163,10 @@ class OrdersLogDetailsPage extends StatelessWidget { // borderRadius: BorderRadius.circular(12), color: Colors.white), child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Pickup Date", + TranslationBase.of(context).pickupDate, bold: false, fontSize: 13, ), @@ -166,8 +175,7 @@ class OrdersLogDetailsPage extends StatelessWidget { ), Texts( DateUtil.getDayMonthYearDateFormatted( - DateUtil.convertStringToDate( - order.createdOn)), + DateUtil.convertStringToDate(order.createdOn)), fontSize: 22, ), ], @@ -176,7 +184,7 @@ class OrdersLogDetailsPage extends StatelessWidget { Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -191,7 +199,7 @@ class OrdersLogDetailsPage extends StatelessWidget { CrossAxisAlignment.start, children: [ Texts( - "Location", + TranslationBase.of(context).orderLocation, bold: false, fontSize: 13, ), @@ -199,10 +207,11 @@ class OrdersLogDetailsPage extends StatelessWidget { height: 4, ), Texts( - order.nearestProjectDescription - .toString() ?? - order.nearestProjectDescriptionN - .toString(), + !projectViewModel.isArabic?order. + projectDescription.toString() : + order + .projectDescriptionN + .toString(), fontSize: 22, ), ], @@ -212,32 +221,33 @@ class OrdersLogDetailsPage extends StatelessWidget { height: 12, ), if (order.status == 1 ||order.status == 2 ) - Center( - child: Container( - width: MediaQuery - .of(context) - .size - .width * - 0.85, - child: SecondaryButton( - label: "Cancel".toUpperCase(), - onTap: () { - showConfirmMessage(model, order); - } - , - color: Colors.red[800], - disabled: false, - textColor: Theme - .of(context) - .backgroundColor), - ), + Center( + child: Container( + width: MediaQuery + .of(context) + .size + .width * + 0.85, + child: SecondaryButton( + label: TranslationBase.of(context).cancel.toUpperCase(), + onTap: () { + showConfirmMessage(model, + order); + } + , + color: Colors.red[800], + disabled: false, + textColor: Theme + .of(context) + .backgroundColor), ), + ), SizedBox( - height: 12, - ), - ], - ), - ); + height: 22, + ), + ], + ), + ); }).toList()) ], ), diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_home_health_care_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_home_health_care_page.dart index 87a33c6d..eced9da9 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_home_health_care_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_home_health_care_page.dart @@ -3,16 +3,19 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealth import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/Dialog/confirm_cancel_order_dialog.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_three_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:provider/provider.dart'; import '../StepsWidget.dart'; import 'new_Home_health_care_step_one_page.dart'; @@ -92,6 +95,8 @@ class _NewHomeHealthCarePageState extends State )); } + ProjectViewModel projectViewModel = Provider.of(context); + return Scaffold( body: SafeArea( child: SingleChildScrollView( @@ -99,7 +104,6 @@ class _NewHomeHealthCarePageState extends State height: MediaQuery.of(context).size.height * 0.8, child: Column( children: [ - Container( margin: EdgeInsets.only(left: MediaQuery.of(context).size.width*0.05, right: MediaQuery.of(context).size.width*0.05), child: StepsWidget( @@ -138,7 +142,7 @@ class _NewHomeHealthCarePageState extends State Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -152,7 +156,9 @@ class _NewHomeHealthCarePageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Request ID", + TranslationBase + .of(context) + .requestID, bold: false, fontSize: 13, ), @@ -169,7 +175,7 @@ class _NewHomeHealthCarePageState extends State Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -183,7 +189,9 @@ class _NewHomeHealthCarePageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Status", + TranslationBase + .of(context) + .OrderStatus, bold: false, fontSize: 13, ), @@ -191,7 +199,11 @@ class _NewHomeHealthCarePageState extends State height: 4, ), Texts( - widget.model.pendingOrder.description, + + projectViewModel.isArabic ? widget + .model.pendingOrder + .descriptionN : widget.model + .pendingOrder.description, fontSize: 22, ), ], @@ -200,7 +212,7 @@ class _NewHomeHealthCarePageState extends State Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -214,7 +226,7 @@ class _NewHomeHealthCarePageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - "Pickup Date", + TranslationBase.of(context).pickupDate, bold: false, fontSize: 13, ), @@ -235,7 +247,7 @@ class _NewHomeHealthCarePageState extends State (index) => Container( width: double.infinity, padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), + left: 15, bottom: 15, top: 15,right: 15), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -250,7 +262,9 @@ class _NewHomeHealthCarePageState extends State CrossAxisAlignment.start, children: [ Texts( - "Service Name", + TranslationBase + .of(context) + .serviceName, bold: false, fontSize: 13, ), @@ -258,7 +272,12 @@ class _NewHomeHealthCarePageState extends State height: 4, ), Texts( - widget.model.hhcAllOrderDetail[index] + projectViewModel.isArabic + ? widget.model + .hhcAllOrderDetail[index] + .descriptionN + : widget.model + .hhcAllOrderDetail[index] .description, fontSize: 22, bold: true, @@ -275,7 +294,7 @@ class _NewHomeHealthCarePageState extends State width: MediaQuery.of(context).size.width * 0.85, child: SecondaryButton( - label: "Cancel".toUpperCase(), + label: TranslationBase.of(context).cancel.toUpperCase(), onTap: () { showConfirmMessage(widget.model, widget.model.hhcAllOrderDetail[0]); diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart index 0cfedb41..13297974 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart @@ -2,13 +2,16 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/get_hhc_all_pres_orders_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/update_pres_oreder_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'Dialog/confirm_cancel_order_dialog.dart'; @@ -19,6 +22,8 @@ class OrdersLogDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + void showConfirmMessage( HomeHealthCareViewModel model, GetHHCAllPresOrdersResponseModel order) { showDialog( @@ -29,212 +34,219 @@ class OrdersLogDetailsPage extends StatelessWidget { UpdatePresOrderRequestModel updatePresOrderRequestModel = UpdatePresOrderRequestModel( presOrderID: order.iD, - rejectionReason: "", - presOrderStatus: 4, editedBy: 3); + rejectionReason: "", + presOrderStatus: 4, editedBy: 3); await model.updateHHCPresOrder(updatePresOrderRequestModel); if(model.state == ViewState.ErrorLocal) { - Utils.showErrorToast(model.error); + Utils.showErrorToast(model.error); } else { AppToast.showSuccessToast(message: "Done Successfully"); await model.getHHCAllPresOrders(); - // await model.getHHCAllServices(); + // await model.getHHCAllServices(); } }, )); } return AppScaffold( - isShowAppBar: false, - baseViewModel: model, - body: SingleChildScrollView( - physics: ScrollPhysics(), - child: Container( - margin: EdgeInsets.all(12), - child: Center( - child: FractionallySizedBox( - widthFactor: 0.94, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 50, - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: model.hhcAllPresOrders.map((order) { - return Container( - width: double.infinity, - margin: EdgeInsets.only(top: 15), - decoration: BoxDecoration( - border: - Border.all(color: Colors.grey, width: 1), - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 12, - ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Request ID", - bold: false, - fontSize: 13, - ), - SizedBox( - height: 4, - ), - Texts( - order.iD.toString(), - fontSize: 22, + isShowAppBar: false, + baseViewModel: model, + body: SingleChildScrollView( + physics: ScrollPhysics(), + child: Container( + margin: EdgeInsets.all(12), + child: Center( + child: FractionallySizedBox( + widthFactor: 0.94, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 50, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: model.hhcAllPresOrders.map((order) { + return Container( + width: double.infinity, + margin: EdgeInsets.only(top: 15), + decoration: BoxDecoration( + border: + Border.all(color: Colors.grey, width: 1), + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 12, + ), + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15, right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, ), - ], - ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .requestID, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + order.iD.toString(), + fontSize: 22, + ), + ], ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Status", - bold: false, - fontSize: 13, - ), - SizedBox( - height: 4, - ), - Texts( - order.description, - fontSize: 22, + ), + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15, right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, ), - ], - ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .OrderStatus, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + + projectViewModel.isArabic ? order.descriptionN : order.description, + fontSize: 22, + ), + ], ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Pickup Date", - bold: false, - fontSize: 13, - ), - SizedBox( - height: 4, - ), - Texts( - DateUtil.getDayMonthYearDateFormatted( - DateUtil.convertStringToDate( - order.createdOn)), - fontSize: 22, + ), + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15, right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, ), - ], - ), + ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .pickupDate, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + DateUtil.getDayMonthYearDateFormatted( + DateUtil.convertStringToDate(order.createdOn)), + fontSize: 22, + ), + ], ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 15, top: 15), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - // borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - "Location", - bold: false, - fontSize: 13, - ), - SizedBox( - height: 4, - ), - Texts( - order.nearestProjectDescription - .toString() ?? - order.nearestProjectDescriptionN - .toString(), - fontSize: 22, + ), + + SizedBox( + height: 12, + ), + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 15, top: 15, right: 15), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey, + width: 1.0, ), - ], - ), - ), - SizedBox( - height: 12, - ), - if (order.status == 1 ||order.status == 2 ) - Center( - child: Container( - width: MediaQuery - .of(context) - .size - .width * - 0.85, - child: SecondaryButton( - label: "Cancel".toUpperCase(), - onTap: () { - showConfirmMessage(model, order); - } - , - color: Colors.red[800], - disabled: false, - textColor: Theme - .of(context) - .backgroundColor), ), + // borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).orderLocation, + bold: false, + fontSize: 13, + ), + SizedBox( + height: 4, + ), + Texts( + !projectViewModel.isArabic ?order.nearestProjectDescription + .toString() : + order.nearestProjectDescriptionN + .toString(), + fontSize: 22, + ), + ], + ), + ), + SizedBox( + height: 12, + ), + if (order.status == 1 ||order.status == 2 ) + Center( + child: Container( + width: MediaQuery + .of(context) + .size + .width * + 0.85, + child: SecondaryButton( + label: "Cancel".toUpperCase(), + onTap: () { + showConfirmMessage(model, order); + } + , + color: Colors.red[800], + disabled: false, + textColor: Theme + .of(context) + .backgroundColor), ), - SizedBox( - height: 12, + ), + SizedBox( + height: 12, ), ], ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 48743fcd..4906d5a9 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -898,8 +898,11 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get addedChild => localizedValues['added-child'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; - - + String get requestID => localizedValues['requestID'][locale.languageCode]; + String get OrderStatus => localizedValues['OrderStatus'][locale.languageCode]; + String get pickupDate => localizedValues['pickupDate'][locale.languageCode]; + String get serviceName => localizedValues['serviceName'][locale.languageCode]; + String get orderLocation => localizedValues['orderLocation'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/pubspec.yaml b/pubspec.yaml index 66e08f5c..c1c4b0c0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -143,7 +143,10 @@ dependencies: screen: ^0.0.5 #google maps places google_maps_place_picker: ^1.0.0 - + + #fit_kit + fit_kit: ^1.1.2 + #Dependencies for video call implementation native_device_orientation: ^0.3.0 enum_to_string: ^1.0.9 From 4e5d6a9a00d660ef9fdc2b68ad815a4688ee660a Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 3 Dec 2020 08:54:55 +0200 Subject: [PATCH 34/69] finish pharmacy home page , cart page, orders and payment page, recently viewed , and lakum module almost finished --- assets/images/no_image.png | Bin 0 -> 18755 bytes .../pharmacy_module/ic_payment_option.png | Bin 0 -> 447 bytes .../pharmacy_module/ic_shipping_address.png | Bin 0 -> 383 bytes .../pharmacy_module/ic_shipping_mark.png | Bin 0 -> 782 bytes .../pharmacy_module/ic_shipping_truck.png | Bin 0 -> 503 bytes .../lakum/Account_activation_icon.png | Bin 0 -> 1123 bytes .../lakum/Lakum_transfer_icon.png | Bin 0 -> 1572 bytes .../pharmacy_module/lakum/expired_icon.png | Bin 0 -> 737 bytes .../pharmacy_module/lakum/inactive_cross.png | Bin 0 -> 387 bytes .../lakum/lakum_card_front_bg.png | Bin 0 -> 89083 bytes .../pharmacy_module/lakum/lakum_checkout.png | Bin 0 -> 534 bytes .../lakum/waiting_gained_icon.png | Bin 0 -> 373 bytes .../lakum/will_be_expired_icon.png | Bin 0 -> 648 bytes .../payment/aramex_shipping_logo.png | Bin 0 -> 1385 bytes .../payment/hmg_shipping_logo.png | Bin 0 -> 1821 bytes .../pharmacy_module/payment/installment.png | Bin 0 -> 41513 bytes .../images/pharmacy_module/payment/mada.png | Bin 0 -> 17068 bytes .../pharmacy_module/payment/mastercard.png | Bin 0 -> 59419 bytes .../images/pharmacy_module/payment/sadad.png | Bin 0 -> 23578 bytes .../images/pharmacy_module/payment/visa.png | Bin 0 -> 83030 bytes .../images/pharmacy_module/payment_image.png | Bin 0 -> 4982 bytes lib/config/config.dart | 14 + lib/config/localized_values.dart | 75 + lib/config/shared_pref_kay.dart | 1 + lib/core/model/pharmacies/Addresses.dart | 6 +- lib/core/model/pharmacies/BillingAddress.dart | 84 + lib/core/model/pharmacies/Customer.dart | 106 +- .../pharmacies/LacumAccountInformation.dart | 1926 +++++++++++++++++ .../LakumInquiryInformationObjVersion.dart | 155 ++ .../model/pharmacies/ListUserAgreement.dart | 28 + .../model/pharmacies/PharmacyProduct.dart | 487 ++++- .../pharmacies/PointsAmountPerMonth.dart | 42 + .../model/pharmacies/PointsAmountPerYear.dart | 38 + .../model/pharmacies/PointsAmountPerday.dart | 42 + lib/core/model/pharmacies/PointsDetails.dart | 52 + lib/core/model/pharmacies/ShippingOption.dart | 98 + lib/core/model/pharmacies/ShoppingCart.dart | 115 + .../pharmacies/ShoppingCartResponse.dart | 55 + lib/core/model/pharmacies/Specifications.dart | 36 + .../pharmacies/payment-checkout-data.dart | 21 + lib/core/service/client/base_app_client.dart | 33 +- .../lacum-registration-service.dart | 50 + .../service/parmacyModule/lacum-service.dart | 132 ++ .../parmacyModule/lacum-transfer-service.dart | 57 + .../parmacyModule/order-preview-service.dart | 237 +- .../parmacyModule/parmacy_module_service.dart | 73 +- .../pharmacyModule/OrderPreviewViewModel.dart | 187 ++ .../lacum-registration-viewModel.dart | 58 + .../lacum-trasnfer-viewModel.dart | 42 + .../pharmacyModule/lacum-viewmodel.dart | 111 + .../pharmacy_module_view_model.dart | 27 +- lib/locator.dart | 13 +- lib/models/id-name-pair.dart | 12 + .../screens/address-select-page.dart | 34 + .../pharmacies/screens/cart-order-page.dart | 354 +++ .../screens/cart-order-preview.dart | 815 +++++++ .../screens/lacum-activitaion-vida-page.dart | 100 + .../screens/lacum-registration-page.dart | 236 ++ .../screens/lacum-setting-page.dart | 240 ++ .../screens/lacum-transfer-page.dart | 317 +++ .../pharmacies/screens/lakum-main-page.dart | 554 +++++ .../screens/lakum-points-year-page.dart | 173 ++ .../screens/lakum-terms-conditions-page.dart | 84 + .../screens/order-preview-page.dart | 48 - .../screens/payment-method-select-page.dart | 202 ++ .../screens/pharmacy_module_page.dart | 62 +- lib/pages/pharmacies/widgets/BannerPager.dart | 1 + .../pharmacies/widgets/ProductOrderItem.dart | 238 +- .../widgets/ProductOrderPreviewItem.dart | 111 + .../pharmacies/widgets/ProductTileItem.dart | 19 +- .../widgets/lacum-banner-widget.dart | 289 +++ .../widgets/lakum-point-table-row-widget.dart | 42 + lib/uitl/date_uitl.dart | 5 + lib/uitl/translations_delegate_base.dart | 18 + lib/widgets/buttons/GestureIconButton.dart | 13 +- lib/widgets/buttons/borderedButton.dart | 82 +- lib/widgets/data_display/text.dart | 1 + lib/widgets/dialogs/radio-group-dialog.dart | 101 + lib/widgets/others/app_scaffold_widget.dart | 156 +- pubspec.yaml | 2 + 80 files changed, 8437 insertions(+), 273 deletions(-) create mode 100644 assets/images/no_image.png create mode 100644 assets/images/pharmacy_module/ic_payment_option.png create mode 100644 assets/images/pharmacy_module/ic_shipping_address.png create mode 100644 assets/images/pharmacy_module/ic_shipping_mark.png create mode 100644 assets/images/pharmacy_module/ic_shipping_truck.png create mode 100644 assets/images/pharmacy_module/lakum/Account_activation_icon.png create mode 100644 assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png create mode 100644 assets/images/pharmacy_module/lakum/expired_icon.png create mode 100644 assets/images/pharmacy_module/lakum/inactive_cross.png create mode 100644 assets/images/pharmacy_module/lakum/lakum_card_front_bg.png create mode 100644 assets/images/pharmacy_module/lakum/lakum_checkout.png create mode 100644 assets/images/pharmacy_module/lakum/waiting_gained_icon.png create mode 100644 assets/images/pharmacy_module/lakum/will_be_expired_icon.png create mode 100644 assets/images/pharmacy_module/payment/aramex_shipping_logo.png create mode 100644 assets/images/pharmacy_module/payment/hmg_shipping_logo.png create mode 100644 assets/images/pharmacy_module/payment/installment.png create mode 100644 assets/images/pharmacy_module/payment/mada.png create mode 100644 assets/images/pharmacy_module/payment/mastercard.png create mode 100644 assets/images/pharmacy_module/payment/sadad.png create mode 100644 assets/images/pharmacy_module/payment/visa.png create mode 100644 assets/images/pharmacy_module/payment_image.png create mode 100644 lib/core/model/pharmacies/BillingAddress.dart create mode 100644 lib/core/model/pharmacies/LacumAccountInformation.dart create mode 100644 lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart create mode 100644 lib/core/model/pharmacies/ListUserAgreement.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerMonth.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerYear.dart create mode 100644 lib/core/model/pharmacies/PointsAmountPerday.dart create mode 100644 lib/core/model/pharmacies/PointsDetails.dart create mode 100644 lib/core/model/pharmacies/ShippingOption.dart create mode 100644 lib/core/model/pharmacies/ShoppingCart.dart create mode 100644 lib/core/model/pharmacies/ShoppingCartResponse.dart create mode 100644 lib/core/model/pharmacies/Specifications.dart create mode 100644 lib/core/model/pharmacies/payment-checkout-data.dart create mode 100644 lib/core/service/parmacyModule/lacum-registration-service.dart create mode 100644 lib/core/service/parmacyModule/lacum-service.dart create mode 100644 lib/core/service/parmacyModule/lacum-transfer-service.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart create mode 100644 lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart create mode 100644 lib/models/id-name-pair.dart create mode 100644 lib/pages/pharmacies/screens/address-select-page.dart create mode 100644 lib/pages/pharmacies/screens/cart-order-page.dart create mode 100644 lib/pages/pharmacies/screens/cart-order-preview.dart create mode 100644 lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-registration-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-setting-page.dart create mode 100644 lib/pages/pharmacies/screens/lacum-transfer-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-main-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-points-year-page.dart create mode 100644 lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart delete mode 100644 lib/pages/pharmacies/screens/order-preview-page.dart create mode 100644 lib/pages/pharmacies/screens/payment-method-select-page.dart create mode 100644 lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart create mode 100644 lib/pages/pharmacies/widgets/lacum-banner-widget.dart create mode 100644 lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart create mode 100644 lib/widgets/dialogs/radio-group-dialog.dart diff --git a/assets/images/no_image.png b/assets/images/no_image.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe054721fc8cf7d280d09cd8eaa183df823a383 GIT binary patch literal 18755 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 E6oU9fw7_*MNN7{I&bPYj>`x>Uy{1Sl)| zQyo+qA@FH2eLP589bdg_M$BqdqMDDbewHj=h+P{mOX;-ew!G^-OWx}hM93K$gaI&D zkwJ9U4G})2ESDPQg&l6j z=)0~vmR}HezVP;w-k%NXvC|XHsFUv_h_&WegEAJYEiQ`YU?YR_k>GZ>J*4-PB7li~ z?eJR}A#8AQ%cxlYQ+r_r(LwTFsJbH6e4ukU9?lfv7A)5eC>wLrk9ziNSaZ2SF@Kq` zsue+V5TRDec^H*NpQ@hxB6iQ@qNSuNgk0@gN?=Oas-e!=Ex%o}!VjtLOnk@`6=e%9 zljlVA?mQZ-JPWMJv?@8Yp?^0@=!hJ= z?-o6z!k;3Eb_YiK=D0ui%nh=N8~JYkcV|!Gd$<$*(<8B(s!edDp1Ig3P{tS`RXZj) zcWwNq4FH)It}<-DT&!PO64Dnaja9PXAn_I|sf()CAZVY4#qrDMDu*slux0VMx;`i^ zR7@;z29WE=fBgss_fmd!T?rJKd8n03*+g!#lbC6~=KXzhF84!*WBoSFGEW$vzfdho zRbcNM=&1S>?9M5!D)9mozXm|)RwN)@Mjj#=WAf{!v|m>*-_g#=NzZn!?+tIC?bQSLV557=pOthbWz)h^xXXOKaPkv~`iZX9V zv~^!@R?jQuW3D_ip(Jjc#-4A%Vg){?^!pEh%5=~DynVkzPP{j}rF%SgMg~$Ep5c?^ z?&FXz4I2*aka4CJE&a@f4?Z}FT3j-&l;Kz|c(&;vPF3JbtKD+){qltv5Dcr)!)j&B=(XJ5H`RZg}W-w=V3Ri>_-Ai%ht&p<1f{8lPlh2|m?tfe|ms zqpKO4axtuQjr~^vn#R5Kksx=R&jQRHAyB_qqenZAt4=BNy3ULYR#3tf%DC$T5a z8ea;U$%uL|JRWqHTtZU)_ZE-^eO(B*lI;w86fXyGwjvEUV*hX$z!L1F0e)fuvwpb5 zP$ThGzazj6;)A8U${6FPQ{L~YWAK7ObJ8lMYuAQ&gKnwaVBT^Z6`uyEDP>0rF&XoB z`da>spa!+du&0A8IAVF+Fyb3uguC|oZ7#i(6rKOo4Un6TxuKZcuP9c&2l(jczpK+X zgS1skFnA-RFmP+pR*0ZR;_8M~BEUKN5o+0xbmK;G$dN2eXUBS|0mJpRILKg5)A65@ z(mG%NB6Ga%&!2X|B9JF1;=EcHB~C?M9U%g+zG|py)}3J^(z9nN@~C_Dz@kXC>XaDS zqta+ra6!XGYZ-)S2D`yrJ1-aCEv&4>idP^YLo08Jrqo9;$B4V%Uw$!(6+;Y7!?ypU zCB0Lc_;L3ia$Au;?)bFMDbbDW72VDA87kLiIeHcW{9<0M_P}EQ&&gpe)zO};i--IL zM6+H{2(T{k^#_$h$B)qgGjV^xoLp~EE$J%URSm3PKIC1=`EvhW!e2pDjeY}VeEMe? z>|L<>XXCt(q4CQ4f0QrnqI+faN(0YcMSnI8c;C$4bYps6V4D8%kYiTHUwCXQteUk? zGJ3m)kxtf9RqIVfwmcOm13cpF4_X^tiISMe^Y6$@;GDkuG;cg4Z0wd58$ew9>NG(; zUC?pxn0Ojp$&PF0+MlY&W~Zm;_ohUuO#9*c4z**zqhHR*UTAqjVf*YJgGSnjEj~N?qi6sdpQukx<3N=<~dfO*tT2aBk z82HmX5J!Dl-G%Ob(*iIMN|fEZmeAjhz;+67q1fV&AQN5||6zZ3+p4+oBCWvJY|FnS zt#sHPL*I;GjdO?^c`1ed^s)bx!LzU@MQsa+Dg=X-48C-gqlEPiU z#5zYxl#n6cJuw6WqSyt0b>+v(J!ZP1E6am+61G0gwm=6l`iON3aXEjoYoV&^zKNvF zxXkj-C1I74;m3QW)$F7YZbsm>!HWl4;CBF1mHItCf(M2BhO{e_Y&VTtA7)FE--`Ql zacC7FwusvATy4F9fP2>oJ)1~QdsLB9DZRSbV=j0zKowx=Uds8W0M?C5R*~ZFD%{+; zC4OOE`Bt*R`W<;{#G0xgz|eiieHE6^--A<_Lz-}ji~jSi|KT#GyFZ^y*;Nr8h7Q@C zHT{==I`B}K9Inp=J3zTDkc6MbWyyKH0Eh8s|r8) zsM8g@`Fo>50GT@gNCRK86I0ds3b7G^*!iF04T*xa$@!Xu@MkG0bD$n=hiVJ;lvi9+ z?x==3tL%&FSq~>GUF+Sf1^%Hz+*`y$s8eu0zAIk?imB?JS9YzNHMWSJ3vjPfGqdus zk?M7Vwaoy3Y>{ycKa1(n(G&P47R4U;cep7lcb3z^>d~{P1UZG+1k;8plT_*dSkWY{ zJXgt6^+cT%0{$6i73N`s@)Kmw-b?4nnh&i-RjG3FreZ3~$~LXxF>_L`gFgV~d2k`m zZRd^%D@p``S)=j$cJH=n&`O4Ym8Q~;in#KCcRj{r&)2i_uZussG$_;STufsKpIzUm z)hky^DXrxYk&qh=7br?KF9#xf6-jKu@tZu$m|NOJasJoGfB#kX6}kQY?0Jq}YU!zU zlkM8ieDwTUa6x9l6n|HDRgddk+d@MYp9Su&0d6=ie!1n<@2xXTgOY2#o8*D33^>&T zzc;P>`sA+FlcH0>hL`?@O_)))^)TUTwXfX#N`K)+vva#eXV?DSC3bn9 z*{3VpJNztwr!LIlVLz34?Q+Ok;jForwnj^<7XDak;F-VCvN5YSV&lu#!HFwBX-!Ie zHOI|(dy?t(TWk4``Nk_-C29gaC{{Y_d4x9CF4m71k6pX<{ma50g)@@wyN^6umzpb^ zd-wOPlC{g`{tD1E%T_!j?5FrhIPBmKCCg%$a}O`DUEef3?S+4Z*UZCTqb)vTVy zOcB4x`5d@kJyt_-QrIdFU~Ug~7u(I7{d~QWY_ZHm&TL>xSXba76YT1A`Ag87Z)aq@ zRE6f+92Bb({Kz@`ftuwYryU92CrW30G=$Mx%0Kb=YU1Q{XXiaIHQ3Fpg0$HmEB(;=T~rO zo%)k!GRZm8t25H|woda`&*~P?-5!?Hvv8xyvdRX97+~|Tz;p^nXw*8TMJqXuPK&&I zd?m+n-_@#H#q@lSsK@BaES)l;<3&W)I=`R&Czt(Q&v9I$vf#iB$=x;P>M_bd-NFU) z=DY~$xb-DQT6U}7&e9v(({k-^?F*^bo@*vLXUUaATY+9McU{_JalNZ&$rOvY?_IY} zypUU~B>iah`M1o>re-=V*}yYh^5o8ig&g7Bo@sTiQcAJ#!R3sktl;+hx1YVrIh(Gv zNO6U#iRjfAi~p(370a6mJk!G4;%QgUoeXisElo#OhA#;@6mo6Z`>5H%UCw5E_xVnp z8hUEYt;<}#wkj9g%oOhc{rO?Vg9F|(w4$^UKg}?I{KtDnRJLn!r|)|G#FbUcCi={_ z;(mA!7_097oq>@{w{#r3;-ci8^X`_`_O;qh!gAW9N7M}C6M7QlQ}r>mdKI;Vst0KVv=+W-In literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_payment_option.png b/assets/images/pharmacy_module/ic_payment_option.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3fca8fbdc06239e8d934dd377526a1a3696c69 GIT binary patch literal 447 zcmV;w0YLtVP)m z*bDjvv`uAcqoh$#!8A5$%v%vt2muXwMbt!%(c;WrmLQkh-8?WXXJ_|6bI#0}O#A9W z9|kdieq6*i+{ZJ>S^zq5K7K9$gE)f**6{)JVHa>W{HtYf4{nw+>BC9vVzC673;S{? zkp?y}iK#qZUdHRlViwbQ6tETiX?ZwF2NAFz3h)Hp;>HmGtu!a?wh8XQPn@j)JHRUT z1AMD+T*W5-*09ggaSp}$bcSWT$AgI4u5vs?H?Cj@*K?f16P&65Ei{W^e8ndWWRd!D z=m$FS0vko~?%-7o=%}=7QUR|O;9jYKRaNe$1&mX#8_M<_CnEEe0$lfE+?M+JR|FWz zTYuk{en)_J*gj71KAsngM#*srYuE~VS|>^#k#a0yOqv_;u>z;53^Vb3>}cchf6#kU pyAGEfy?BE?)!J+qFQr-0)IWY5fn|^+0>=OV002ovPDHLkV1l0Fzw!V8 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_address.png b/assets/images/pharmacy_module/ic_shipping_address.png new file mode 100644 index 0000000000000000000000000000000000000000..9566fb30a09d27cad92a94448a0b91c4c902dba6 GIT binary patch literal 383 zcmV-_0f7FAP)*_E}|3y1x?W( z5Q9n!>d?^-sB1K12L~yXR7#gdzrf^@K)f6J9sn~=we<9~oXP_LFPupZO=?rkB|w+>)KPlz4AIran8 zbgdgTYExtv+&bc=L?~ zcxUJp0DKae0x+qg3IGJI+!+BQe)=u|0LW=O2N&9M001y+Xw9l;1pokmsz{^?002PX d(xm_Z{sYbET)o?e#uWen002ovPDHLkV1mBxiTwZo literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_mark.png b/assets/images/pharmacy_module/ic_shipping_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4b272d5a875da77ddc5ad003e40fd05a6b5ebb GIT binary patch literal 782 zcmV+p1M&QcP)eo}K~y-6jg(7B)KL`1zjObu(Xr67qB43(ML0@}#1JJZMI?JcMG~~A zHdeb_7}BE0E-IHrP!VE6nfCNi5Jj106zcSX(zJ|$NzKPN|C#^2r-jZCqhe=u&UerE zJKyROW~h?7{2~ya04TG6;77b6j3L7`E=Afgw{oIMeaZkE*N=lMtcxnuUICu$P9ch*Ewipv1x(1sWM?Ij7>#BjflVoUPtLSY%uKC4q3uc!zA)KJl9EpW$Oka5#aA`b=Br8m z>F>ju`MIiS`FTMEWeDoFOdJVmvR4b~hYHraE5w_g;5mY-G(%>Bl>87tK#|z;eTB>Y zvbS+5h%dU#xc9!_-o&su$8wwIb`r41f@m)z%%j z#Gn!|?lDoPV0=@8M~4D31I$UxNK*=FVTDvvqmCj^!iMI~!0s`}xlOIz<23-1S%~9V z%dHQuzSj)|gAqI4T4`6YvFfIPh(~o1t;~{l}gcv5Tm(3A( zu!0yz3Dg5tEdad+tIrDBkmT^6aU01bD8-R#F)?L1K(Ga&O6N;k$QF}kf zOWV!?I14})11ktf1d!N26mk)f5+FwqhBb}4h^X1p<(0g(bNvAD7s#tA1!~LnG5`Po M07*qoM6N<$g1IDZ9{>OV literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/ic_shipping_truck.png b/assets/images/pharmacy_module/ic_shipping_truck.png new file mode 100644 index 0000000000000000000000000000000000000000..274ae1da9977edf7a306c9d2ff9ef27afd639361 GIT binary patch literal 503 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/expired_icon.png b/assets/images/pharmacy_module/lakum/expired_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9809847738aabdf56096c04e49cf5222b6efa2 GIT binary patch literal 737 zcmV<70v`Q|P)X1^@s6CN-WK00006VoOIv0RI60 z0RN!9r;`8x0+vZcK~zYIrPkkz&si7;@E4{r(~Q(+8H}uQwNh4*3#6KsM9Jv~Cpzdc(+cgN68r;}u9@s-b(FN3$rx%z2Mk z=}xiow>epNW^`5*#mvtjhATPedvGWH9~CLjWLq+4|Km^<(lW$thOWBk>qYZ;aU3S# zL$JJJxVHGZlOb+0QIG)oog*r?Zon{H{;bDmYs^Jn| z<8QI3H==k)C}sJ-TE*ccan7$RZY~+VGjv}U7Ac*=3v9%kD#S!Z_KRjS8u>&~J0}ux z;c4kqevdPJpKN;YMFqVhVxK1z3ENXtD{CO8+{$m`x6vF-Nl_iHkvLDjuR!*VSkU%L z4$g?mYaIi5o8sH5OBCYVO2!LBxp$3$xCl!{CJvNQJ}B2mKLa!H51xwqy(${SIsTyd z+AD+E_yg~;ycWY2gLh}A+Fl@QMKA8drdmidG>O+>)?>Hht0Wu#=4!wO(U%8AikFOq zG>_E=-(UT>kDt@{mN=i;<^CUbsi6stcgp%d z)K03Y9aU95uA*{WP3<_40Y)bv3{*k5EQkSA4Aicrb=KPYtc}gp*w||c3D*)6Z{_9P zE-buVQgXYr^iFB%{g#&Jixxd!vgFm8HLupLeYI}g`-2BRo;vmI-o5Yl@Be!J`tP@I z|Ns9N2s?BH=rZw=AirP+77HtD8(X`{Q>QOkx@`H1m5-l1{qgf(z;xjUKqZVx-tI1j zH*d=p0XY?(E{-7_*G-Q{iZwDYI9wE$bej0Y^I4_OxBZs#e&63Sl^l<>^R;4NVgA2} zL1ITpX(Eg5UzsgCVog&P&Hfc)vuf(Glvms8_Ij6ktrI){KC;wp+0nK)W)qrkb@O1TaS?83{1OR#z BrN#gN literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png b/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..73323a0ebe7b67d06cd87139d848593505e7356f GIT binary patch literal 89083 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

Wzy7IB)>vlWq%Mm{P5ll(n{4qyl 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 Y3%I(5+Q=CKP))P5hE zXvIMhbb|J5|bFmIWm7iv6^v>D>NmAV#kS4i5wS1 zd3v#k6;Z}B%$EaF*b_~z4M)DFdMui17Q3b39M(gddFAhM1Y4LX26Je{T^T5@d$fei zg}0gxZiBz%9|-$z#oz}ze}Q6k3UBpapH&7O7)x+|G`MEqMfLxj$24wh==A0j%hG5* TPksPQ00000NkvXXu0mjfv*MR` literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/lakum/will_be_expired_icon.png b/assets/images/pharmacy_module/lakum/will_be_expired_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f31f622b941fb02f271be7be13ef908fd98c231 GIT binary patch literal 648 zcmV;30(bq1P)pt^Zp8|M$PwyCh%z z(1a-%gdX^SN4SbJ_>}Tljjgzkg?Lqi0fyi(J|jUp?!@wqSWoaCd(b!fjl|d3mf(01 z*m8V~!M4XBFgpfmjP-HY8^7=#x}dcJmf!~_Yv!JR06DAh1 zz^B3#rS0pwU@ETTT@7HC=3rokeHxBs*q4nZZxPaIU5mgXsxJuLk5$zgcjGO( z{U_)^VVkY27GS!tP+AHCe?eREFr#gKOlD|afZM|HQ)}WYRYI?nttX!2L@nng;VUt5mb_Y)FLTt4%n85*)&5;W3rqGA0%coR?7vvxMivWDG_h iyulM(#3|w6D6F3q0jDe6hkfz@00005H^tx#l+>;DFq>Hmk%=g-g2<68ld zC;$Kf2nt9f0huh=u>&F!Apn3t5F(KvG8w{?ojajjyC4@Ah(du}T_Fz-A(1GgP=v0o zLN_@$?jWc?rF}g+4yQJ$qmx5e5L5LV?}gVNXxk%M14QhJAcseC6v4@7)Xg z`@;bNa9|)D6a)tc!!()*07QX-qTpZ=?sU2+Bt#S%Dmrig0RV(bMQAjHPDesRk+3iX z55vQeg9nj_2qZERiHbs^qme_0!~h_sQpMrn;>bvGbhJ1oMttmF24nH`=|$Yno?T2!lclE0&YhE`r^_x~l7pZe zCzC0^az&n%r2s(%lc~teROI9+a&r|01&V9e6xXjSK~R~WuPi7~vRF#|TU4YhE>?k{ z3TH`)sS zJkUOTsI9BhK6<1hk#sm48gwl!y0$hwiKK6C*0;9m+uQYQw!Wi7-_@n>?KQC3hR#ky zU!P%Mz`)@wk;zLqhlY$JBgWBDieu8pAM)OlDCkEh?2o zt+r@17OmEz(^>R-i@{)7TC!@jR=wV8Fj#Rn8m%Ui)oivdFI!R6ieXlZ#cH+M%x2s2 zvJFLT7-q9rYX%l3HH z>0z|M81Kp75>F-x8wnk*yQv))e#i^7^PU!Or+(y*m{eE^QAi zXpB%)=)N<*E0n~_*DyWXWX8Jwk6mehl;pjd_CWS*kBjH@#Wgpy#~QKvILVAt*>Fy5 zeIMi0&GN#Qnj6Z(W><_X-P~R{`qeYqw^=pUb($96;(Kb6X3h8hoTL%w4d=m=x!KHo z!Q+j5+QwMkg$j9I#^vDr3-eWfE;y~`m?jha_%qI*hqlEk-cNJK-@L8+@#0~g`yo)q zE%iO;=V8=!SDB|C@`F7g?TOc7O8outDrGIB+Qvv|GC0?ZOSl70h5KJ*W^_+1SW6w5 zZzi4L%#~d36_0oECzi@912oXOlJ%{e0$6jge*JM4Wof3vjumzLm~l%}OnrLws&X-D zXtXHcDZ8iVd5?&@Jt?Aq^(2JnR-??;Fp3)8-rsQUf!0#uuBOLBk;O#m{z@f1a#! zAO7|1XP;BsM~-c9{UAIOlo6G}+Wa}hlVK}0tUEgJ_!++oiR-pEf8w-nJTS1OX_r@P zo(38i2%!3J;Ca39j&qsbQStozy;F0QPQ9seZN;rjE5tYd-o)l}nCJ|v)@f!wCriLH z*Y>*bo@Wat+I8Zm0WY!z7^`XDC9f!ZZi3%ny5K{plM}^n>vVEA^{NAx;s~&+2^~Kr eHMWr%3<3eH?A_M6pnZ(Dix5VSq_Kk%ul@@o#Uo7s literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/hmg_shipping_logo.png b/assets/images/pharmacy_module/payment/hmg_shipping_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..725b2e5ee5d2da3829d1631aeaad88502d720708 GIT binary patch literal 1821 zcmX}rcT`h%8wc=2aG@MHzLnAnE~pe#1W_@l2$mJ8lucP83Pq)sQG83VD4;TefDlF) zVGr35Mi^nLgpn`<0TPlx*pP%s2HEemJ?H(N&wakn`Q3l+x##>6?Cq?TmA+R3fk4Vo z8w*FEeSqitLkhrLJs7MG0_~I9|Lknp)6+9BFfcwoKKf6_#>RjK=Ku5WIe|a`7BZPk zp-}L6{DT1hz>uJz=V8wyU@xLy{T&k(9rrdSF7_=v{w+KqHW42GE-@iF37(Ran3A0M zKIL8N`{cCLWJFp@I^ul>A~hpDH8UeED-)5GnU2g#&qikEWM}2(AoFsOsN8H+UQRwL zw;&%?RG42}R8Ue}SXxq4R$5$MR#H)3T2WE@p`xtvLwQwYMOEd8>Z%Vl)s?k1RkbzM zb+tA1^|cN4b&U;m=*D_9x}gc(*xc0E(u{6tX=-h0#&7|Y9ymF4BH zR#sM5SJqZn*Vfk70qg4<8|#}J8=IS(TY#;t?d@$Qlc{l@sd<5UTAz9P67#GfaKK~% zSS+o}tRIY6=dQ5MLs*w?ve<04fhpVYHrvRYef19ex)mE@#Wt~K->_lt?ChA`+p%^6 zdWXZ|KwUU@T{*UHoS%Q?ICyg$?*nI?FaKos%a`5V-N5I-*yVD$uxKtU252si$BT;R zy?F;TkI&;LW$;sxd>{gWAU#)*QzSr@0;^!}YlQX9LNrF$)Fy1{5CRd2M4i2&?tW4K z0I-V0V(~CRJU#`qgh-N1&q^c`DSb)GSe7zYq^s*vsZ_SjlCjt_E>Ff6$OL;bnM^Je z%Ee;2Tn>)?=0CuFI2Pt;=XB_BY8oOPm0wV}x(0k9pD#P@PN4vA!4GY%Eo76RekTw} zp#f@P?rekWnt?f|yQt$hMYoUIwNSTdzy#85S606AwKic=xLFnW1(%$NTQ$fhlQ2!ex1h>jlMZMZw<5@+E$dNX80&)< zKGE$bVb?i#efpN%Ny5k{w!319a04Ux61wXY{qiZw8_~``W<2$@y&3ac9jN-;CJ&O} z&~5aG+u1aAx5E8mVxWd$RIi3D%P&wC`s}qytv>P9OKoU`a#WBu)MVBg1>;!K;m{OT z=j`G38-4H}^+wHMuFc2MMs0-q_& z@xf@KWi@l{*@28&e5ZTcnIEdS{lfC#kLi|>M&$}+izBh;)dHVYn6;T#7Z~)YL_=&V zPMljKzzr&=(C1oC?f6I(_8cP)(-X~TPeP^`8(U?9zAoa-ZcSNb+{u7?l-=*w`13cO z;7AEL-^TF9#W1cf%|GPfpB`Rvk`VUD&!;l*#ABxpe5WUtcQHBI3R7#x(M?inB{`(u zw|y0PG1Ih$3;G=czQ7S*?$w!GrOBz6$PV|N9Vrgs0i<%5zrxg$gc;r=8mq^zx!&&8 z+Ugw9Ge%;9u%vlTILQi^!;}7|HxrDY(aw&bCC%C`!)VFoPItzDjw>msBLFq@Sbxsj z#cR%6IveSa*)IIs{GP*vi4)AS%Q18d9fzN`O&n1}W;uUD^{-Qxa2H;SD!5beVp_9r z!!Lg+&^7h~%X>N$)=zmzK6-+sa-j+YD;M}seBwT<@TD)k3}`w!r%IF{q0Zw}w~}Og a=0QTA`%htE1O#xAK~PIOi@G}xV*Up+BSb#{ literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/installment.png b/assets/images/pharmacy_module/payment/installment.png new file mode 100644 index 0000000000000000000000000000000000000000..034497efabd3db47c841d9464472527fb0095539 GIT binary patch literal 41513 zcmeFY_gjEMMK$Ie)(xfO&q<85eO`0_6y%Ty50Rkw3B29YlNRcYNhNg4~JyHWw zLJOgW63QE|?|t3x^TT~S$MXl=`2qIab9Q%jc4l|xvvWphzEvWIn2JA6lD+vJL zhXdakcpIpziCeq5@L2w(;qh~E$F&9kBxU^EEv=nwy_u|R?SZaR&(N(M&zOKVQqS~- z)%n!je)a2isQ{X^pIB=zh+Oc|(aGRe7l+A<0Ah;Uo;3kfrcit+G^2nvabaWM(-@xSEdd&$c$ z$jvVzF2pA;Ai(rrzh}77JZt9?Lpqw%i0s@?hSNvW%}ErrInkHx70Hnr~jFPi@Un| ze|PNa^(pXH@}^Y z0Jo5^fF-w;sErV}ps=u=u)xcg!hBY?|Mv4gwHFlO6A%*+6&2tU5#r}p5R(-UmRFP& z5qv2q|58|1K;YlD%C27Cmaf*e|BemBjs0J3MgFgC#pOJ0Exp}5-?_Ot|EmR>4sPCV zUJh>VOmcF6S6z(hxw@q_(DiR6$KQqe&%EVrJ%PTqHj18ZE=>POS{(R4aPj{pf&a9( z`9CE1A5F#8;AZ0fFGJ#XVpi6|qJqNQRsuFJxh<`QM7YI-t@*h5Y{hIvZ3Kjbt;G1A z@#0wI{i{6xhcf+Jh11Z##s4-9+{1qxm#r(#qC9b?^I;J$9RSD{Q@6q<<=UkGfhj7NCJG??;Umpel|O|Y1Iwmt=PUm)&uq9!gsBbwEo(aQ;Wn86{Bmb3EdFiqs-mm&-=0E@Lf;eoOH@yYfA8P2BPrqI zf6G&}|2x2c$>M)S^uJp4k1G7Hq5bbx@sA?>zwM^#kuO4&&v~!QZZ-KEj7h4*x~D5(y67~UGl-vTxZh3z1-c|o$*}nQXfEw>h#^CnIhi#owoWN z7bjTlST=G6A@bTd$2cI!#uhOLcEL8Hc8=;!)7n9k7n#$thPA61_l(#Xl+65Mf3ru> z_hr+=8|Vvyg880*V!pmgD&%iU4?b&jnKd6Nl+`dXZpl)Ep68I+t|LwSy{3o&oh+Ab zH%A=>5A4(uZzV>MlL*j}Y%UjB;}bLP3f&D2tArpLySiklN!H(S06M>|Qj*Vw!wdtU zHi*V@DLBSI@%?mN6?SHc(MSS~y2)-2)|>F~@2GX?6Q_z{#pozVJtQrc3*eQ4LY`XD z!T`L2Xt;+=8xT%20iuxc{L!~@z59%_y~9iVc-KD* zHS>*5blop)AX?TiZq?8~i}du{lkxsTR#r!YbI<4z*>k?Tb0zEFk8+ENRBy13{1)wb)kP#^stnfhb*|p`*EAy;gkdh02uW>L0Dx46 zxu7zRSG5IyKCY;McT7eQ3s(g_Nt97dANw75z?@0z8zowf z7+<}dyU3pxaIVf$Df3wg(K142| zg+*7GPvsLO<5KX+bna!4W{}i#4Z`*8C$P_006W{!h>c$nlo!}*Oj?c%Jsc)fz9;gE z0!yz=3$PHUT?sE7i0GhAbSsB+aP&}8i~I=v=jl4ZrL->M3ZEFRGOU_P z@SuXP?KFd|Wt`snjRraUyV8;tX?2O`9TuGUG#8R8RbGBn3E)jJ%OLuD5^XcT#T!-a zx!pe68*GVBNWXmfR{P=1!sqwHK*19T9rZ%Zsov@!i1+wSg-h4ZTY!@I;W=~R?|a4> z*JZNj6;J3CA_e>hEP}cN9t9WoPQjE^wW2YYgWfu!+22!r(w~GI7R?PgoKYXK^DyM$)wx4iuUcnZlU3@T_iHC z(dAA0EPCE)h>#d6XNe$unTqq!rnm5g!@UJoV(PaXA1u~3bVQlr&tsP8FiVaP+w0KN zFXv9X3b$t@A+7w9TEGnGz^<&ggB81b`0?hLu z85f}@DoxHU+B$uLfM#n(IE!6!)(PW+lGEj+mE&?IH01Gj8|Zfe2l`TG`TesTWEyR9 zYT11<-VDTg>64m{;m3hGTn8hA9aNlT7gJdD!w!juPv* zHeI!gv?X&51aX)eP1L{dmZcu^Mq!zGhykyFHbvxhS>`npaf!v%YL{2XS3ccVvt}pQ z+WeBbScgxmCdu1sB2@`u5+bo=u2Wmzh08^!7V$s5*nXap6+k*0xbSsDOL}RR?7AG> z-}6`SCwTbxMtdN1T$|d_M3^f_g;2r{4Igknm8T?gm6m~{9Z&$2^{o%*aX+ULb)M5p z7w|udj(h;R%BcM#0gnkqDo5QkyujzIg*k;=5A$GOlmfpI>K5>NR%Z?jb+`>?bT|fS z4~)3-c+H>NGV*E5mEE*;^5l3OkH7ZQY`2% z5&;mrjguykXr-j#-a;awRyvhJqZ_=RbFup}4dVMq3ukrkEVJhjF)7Arh5mavNwMc* z;Fpzuek7~QJkh_*RNV>?dWzj!++8hGG-MANdypAOjf}dt9+6OdRDU2^Ls5r3)M%>x^6CiLV-%89xwRx(B_37e zt{TtL?sm($>*s9v6WH@xor&4o7*`&NQ@WaKTb;*<6B$JtJix2cO?gE66SR8};#j9I zsJNw+v!I|f@DD69CL-`pl`R6T-40m)@OMq=j+mXs0#f$RQyL*+udXz`l%rn=SGp?C zv3jd3(ivPOd>Ud@Fd4emQ-BAEEtSjG?zPpS$=7$k`U9GnqGicjPf9of%4Yi(3Hhr4 z0F|DRVzJ4$vE`D9tIC}*g{<$3X$;hrDGZc~vX)c^DK1rF3Tpf}*+M)!J3k!d;{V21 zZuYqF1k>Fbqv`Zf{1q48+6p}RdHc7ivgJNKrJ<|%iH2VcZTzAAI$P5Ws(t#&B+UTs z7XmwF;V=!}{)-Lw-Tdk0Le>L1v=Alb@fPg9fPXFCnnh=1* zW1|;sP~7oKxL*1sL;W5m0O8OzQg(TpV&mz)t3|1DyX}X)ya@3}HVE=T4Nqs+ABFdG z?-FV(kN;WjqHhx+zkPHUkh^ez{=P*wtzm8ic1TxYznSy&U-M_EGZ^wtW_L#<+k6BH zT{aeFEZqhF0H}aN@YodS5b9zvyJO+tU$hs%<%n;fusipgmP!nagx(hxP2;#Z4Lxjr z0(;S$sb_fK9%>l{J2X_PI6Y702@%LI3+VF@WcL++TI16ZtybPi796 z;+A}21Bdo@e%Se1n^#l)v<5ga7 zZtuUm_~N3117O{(*8L8z^0wH7e@Hjx2;bvIHwoS`TtVw*aL=7OnnfPB@< zk`AxCD;H(RZTxqdA^YV|n_8eI%yMKOZ9lqSY33D%PkbnRVvvqiiRMCxA@d1!1dk~% zt{ojp!B@l5DS5)L2pqaG9hY#ISt#NwVWc-6V6a!TL(8RL=+1Oo3-|ilVea{W9fNfu zWy<$7tB*q>-~TlLxCh!m?q-a3Gvg7tgYcm0NEs4y-ol*jsuTI10InN2k_MP`2bl_# zD9!|iL4Ktttuu84a#?7l7QuWe=xZP2nc(TO)YI?d1!e%iiwVu|Swf^e-xC>iv(u!H zo@2mRlU^wMMzQQZ%?ZK$IW@Ya?+X4cVx-a~9TePvz* z#KOJqqB>}*`^W`bo*YPPMGm0y%coQ7iOqv8f*GggqZ~zM;r_WIpUl&oJe_OhPQkR=b?f%SKlO*l)e8} z6pxwi~urIXew`sYO9Hoa3Oov#L%MK9oktglvcEBG6QS@4g;EXa*f%t#rOF98pp zVG?eCQu9S-=$_>>0PENSZ2bfwwB8!L7(dFkNCW6htka1ysj4}cK1GMYY^Yv`+{100 zRKQCgn!Jso!`q*;W0mNfq9-Oyr2-oTG$f@QALmnvQ*b+)0Y4^fH2bslZQxb}2;~;8 zZzv54G0*OSl4Pjr2I)hS#_N3pK;-+9Iqb?_*fI|vZ0QmQKKB(-e(})z- z<>`fPzEV|BCjY)VwNr~3!ZT;{@=Y`3^c z40Fkpi8k}#5pKKnnIEJVGkaSyu!LOq8^}Xv7g^TR{-_6{^KQ&iSc9r-So`7(FKCor z7ZT%oZ8;O~U;l+@T)Wa&2U0@*dNF+2;rVxSS%l&p;a?QBfQ3mJ1`7D9!N}(7sl>Us zhv0R>pBn(gMwo>I|AIt$IAXLqv?e(}#-aWU_UO%)^Ul5w5v$-$KS z4GB>S zn$et#@2j7~1N8VRasG=+ZAZFtL5Aw;^PaZ9#HqMwG?kD6=Z8KLtH8ZCiYN8&lDW=E z_NEd9))e#LNIK<(O8%0DaD1-Z%XMhurz8LSs76BZ5B&TnKTdx!ra$Mpwc!c3O&{Ao zP_o+Xzb|XUdR>3Ed4Qi!p6x=v){Xn>~^yhYGg+OSCkI^^lhPVT^o z=lBV^hEgw$-lvBT;FD;^f5y#imePDOrhBm4UNG_w--b@Xz#KVImD_a-hgSxrjEG~* zLUoPM^Q`?Rd!&PyT<1Bs591Tz-Ln*w$p&khf&Z@K+3vg;YPkQLi)`>q*5rq*ShF?! zRyJcjG6z9C$KpH_*t=+@QELmlL;%ho=-eHzeqRAQ6SeVI)uR=70t5iqb1C$RIMd35 zr@vy}N^f};ZSEii&kL1E9%iR2eq|pPpXV$>q<}wL*{&?87kJ0 z$D^ajH`_E_g?$ialMG|bRVIs<$I$3{d;8wtuEG$W$vXeOkhhwvOJo z^GNi~%x)SSt3}Ev956G&gacxFf`Vr4BFKM>&zLm_8>q9(mNOr1uS)KL&bd0LRl;O*MyVY9X4<&&f{W#vW3`Ulfr~JaTHX`b zuhd5u2MONtx;ds(%Gwk4G}HPg8e@tnx@dtvPp(oQmk+CVy*q4h@0vSFo`!)>xgYz|(hqUywWfNS$RBR_bT_kHBG-m1 z7d|Ws%=L1R1|Ey;wJ_}d^Qlt!f#q|o-r&Q0l*QZnyMJ;i3EvN4K$G_^T_`QfL@b7S zqymzuT{HKy+ueir)Gc34kf0I}f+(gz$v#ca%W{gn;xo}%0(8~y8Na=p?7)^xN7|EH zwlaL@2cw~j=W0f+=Y}AaK9U!r{;uN%pJhyI#Na|ku; zQiLi2nru*t(+N|X;mdO`{#mvE4B>9-z!A?w(Jc{_WNV7MbfkbY%hHQf1J`~9d?yK$ z92W`Rb`jp)>6FK#Ybg5Rw(~LcW9*;bF){OI{xUm|{c&QKRm(9!pDBR~P0?RZfI+TA z@rQ;ORj9qGJx+$ zm4?DMvm0VUj#Kp6L>@2|x4S3eRC}do<$d;0$b0eVUhhWtVEWA5)&c&{?+M&jdU4T~ z)NAH+xnklx#j{p3>ZbGE9odMifG3w#AG>a}WQFKcUwV$4C^DxR(l6G)FteM~>b3X9 z5t!RquXu&_7hm@^I3cT_0>gtQgQT6cd z{OF!?hkbrE`Xk0M@qVP0A5UPgS!f+&RO=NJhFq?-)(N)VLPL?^%`eDSjqw7XgSf#M zUSk2!#bH*OeGGwBwCqWB=&bu(wH{IZx zN3x-P0g#CU1tG-(if!1H>)1k2j*GRGr3IeJM^;MkDeFkxXqY00%r{G}z4A3x=9vmh z9?nvydGX^)N+; z*avmLI*U#spBZn<%Ioc*knfbDWXxvl9qIpNarscaTv>b@TDVCldWpG5{~f`|K)=5v z?bNe<^9%{@8HJI44`U(>eC#|M1Txol&3sW%ZM6p1DGQa*(|0|zp=?XZkolw+TNPSb zZ#o`gC7gPTlYp6XG!b+cfkiKF9-`T^+GA9?$$9`55+t{MZC{d)MY@}U?mG&0FORyC zRK6>an2{U*A%fb$fuL#98s!z7ita*kbnE!31@0Q{HK#^(rF1-`ux8Uj_up zATFNcbShgsVXHk&Qf97p?gs)}EAWl;{6~eKBYXqo>#}Dg@du*j(OpWl zy_n*;9kLU!vkG~&SbLP26jAv5)X%ITwZMfn)zCwLLvcMP%&EG4CYl@BPuf`pO)%LVj}wX10=lkp!d;z3)BY$Vb;39pzQg{OF=$ z(Zb9n{0QupGhKb{OiS@P$gOe~;wShdw2?o0OtIpv`!yAfQ!D0XBF2L^>Rzv~?>7rS zFvHKr_^6}kyD=T~d-kF$dn!hF)era1OMV$sHaJ0OV(L7(AF_WDwR!m(#IboSg-5~_ zB6!>MV28kIN?OnZq%<+CXfpXkqWg@Yg3oV}JZsrFAg56vb4oa8*`Sth(_HZB_w_h> zWc-!1_)Tkq3hB>8MaXUe5J*L)n+CSs}jHE)U}N%y>jl^ZV(RF zN{zmsA>Db+#K9PYKofaFGer-;r@ppJl_T_JRrP$ojpA3no;7h5>F`y2i6f}+YRGa; zW+WVEB*F`FYmcvc=R2?`$hds=iczjC=8q$93i4(wkt!H*d3M5a`dWgdXlm`8lWtA2 zA)rocbI3+sW{#X~OsduVPXp@W2(H8TV-DjCWIR>is|s>LHgFXjL8EBfPP#ki=ffo> zdC_Z=#1(Bn8%B?;ma4BWR0XT9d*@_w4EopBOhlSVkS$_$r#qjZT^=qvq7_s}HQaLt z0k>Nli_HS}x7m_AMu|e*7T!BYbtA}7`8zc5PfmHHAnw(;X&$mUgPnE>(j(@a3bEBn`Q7UbvIXbv(lV1;MV;*i*Ze zzR3K>d>)PIIoV3`%kh7=Y$}0lm8Cmh%ho6qMfpqqz}g4hMg93guMew)Wz(xhsXc+` zI)4)JoLqwG$JeoN*Gjv^lyEt;oLgvPAy=J)MqT9?)_7=*t+vkC{7^x+)P`ND%qiUp zLja|BONN0`SU{ACAuh2)E-STa2a^^5uKL<2#@^J;*#1Fu>1EVtF~!F$-kfnl73TXv zWcbG?#9?OaskdTx&!BaLXLfwmZC#N=eoMv$yNZLY78q|0u^ejRIxddgnSxJy1gnD* zvrXz3;1o9Qf&Ih6im|iS{y=t)-KB(^7?oRrX;v+!eAId$mRsn4DtpYp6^`;vBxy^n z(Y3TB9HQs>2m4RGbANqo_W$p~(074^tT>Nx3gy zy}0Eo(0IU5)m3_-tq#_bubO7>0BiYb8TMW2sq?h^vMPINEBR8tO)zW1=nVULRgFdR zw$ypri8A81*G=T zDPor}x^~h4Ldjd)yv-Fy$_YevomYC=EVJ#zb1inVUNXck>2#;wSyZtuw*Fu58Cy z7G}Thl=oN+L#pj{eD=t@UP*E0mp}3@GB22y)$hGio{{HfdbjrvxH8(w5#1X2=a&v% zTO;gJlMlJ1`X%@Lel{YKR=*-wUAoqOYUf&UOcBgiZS}S_<{jgEpUGZEFW*ISlys_) z?i;yq=IX%A2P1_kdVQ_P5_8d8ZejKdeJ>b*TeN|?;VGm`ci2!0Tc5B_WfpcW;r597 zF}tqaIbv&?96!4na{PPCDQ|~~^kZ2^8iMRdHHw**Mg^+dLL<&IMAUvS)+io0bmLV- z@<~CfDgte9tu~OLU;pWig)N{|=ST+b!Ei%)Wwya5#t~_ASDGEScQ$Hiis|fh z(qC6>i-__VK(;SEd+k3-S)#pK-J~;_iXh+&B{K*xw1ao|eEZFpJD>5jMU5Zx@M)%g z1h>X+?D{v|IihJ*PQI_=w*lHUj8Nr)He&Zt95ACFWRR_IFiDx3D!1GCjvOTAR=55* zbc5sP8%Wq)tE|3mYNbbZNrLbf=V!=ekFm8Ewe``wyEMH&zbA#-s@@4;&bb?Vx6S(W z3cdmk=F0;MJ2FA~E`FT9mf6(`Uc5WE%ZfFT`h-JV5k}@af+x{l(u|SuhrNC`=%Vv` z%ES|`tTG8pL|22Oeax$SW||Vb>57N%|5%MNe)5&3oHXrck|`9#Ikq}O1LP`wta;qoL4=bzs)vmR8c3vQC-6rSvOiKgD+&&k59 zSCu0!y1d5~s-hdEvgelJn6@AqlKq)G_+>c%eDt9Z>I-B~U0JN>OZe1FnC(=^5}T{) zmztx4K|y6sl|y3mDtml>h!poQ%0jIw(_JG8c)O)p#vVSvEORvrvL0f;_6?=k-O|oh z9TcQ4xWR!)l~qDFtZ{XBXJG0fH=}ChN;92V4V4m%mKI_jRA2C&UP;7zT9pr-HCqI# zw~74h5Z1bi7VcM#_jG#{JCtJXJh1Po>=mE^DB9^SRqmpj-TPB5a|q%0A7J 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment/sadad.png b/assets/images/pharmacy_module/payment/sadad.png new file mode 100644 index 0000000000000000000000000000000000000000..35e0426c4a68703441198afd5e961e7e8ddfa3fb GIT binary patch literal 23578 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 literal 0 HcmV?d00001 diff --git a/assets/images/pharmacy_module/payment_image.png b/assets/images/pharmacy_module/payment_image.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf7a9297a1ed077d17cc8327e4f452017d7d71d GIT binary patch literal 4982 zcmV-+6N&7JP)3osXG2cV_S5 z-uc~A?(Dww5^YMQ(kLh>DDvjbn}ye}Uq@9HZXdN%850v@_R?cESsz&+S)UhBA8t4m zs$*kgk(ZZ;s=RUgsNt-Hn%dp5td5ZNk@b=Fc>(od0&_ui+PJ;cZiTMSkoA%Ek@a~& z^*be`J`+ogwS<7wVIc0319B%$kLQ5uYNcd0X6Ss*n3^j1WC;0t({dwCgjpR35;! zzJS-iP_X|k6gs^|QUmH$??8Rf6v$G_{UgIn?hIL<=cEtEZg%VdY;1sm15wboA7b^5 zaj&sHt~K~Xk{b=1BWmPm%{9pvfOE}&UtSWzAj?_*u>ctsy(CGY)2k>v(T~X|_m2!S zxie&ao}oTzX~4{x0%9dWrfS|1cN@3Tf?1J-b?XY8s!Miw&X9aTqJf%KY zu3V|QFl)N$UWLT{ZnC(~g9i^Vf59U3?$ZywEUb{3nTZ|l9x&@+feuC{LPmY|1@7Mu z6#G5Rd*k@=lTtfkVq#%C{8JdTX^&weMnS2Jk_Xo_-m64!? zTuNOadmPL{I_M$FvN>>^Kz4vYw&CL^!b||oT~CJDQ|L2s;zTrP&_L(8qeqWo#*7(~ z%$_|P+qP{JT&Q+1bNAQ@Bjc_J3k#=7HcgauHt7Zrk6k(&vv==)0j{j9EOESN?>_Xk z9*AgKL-OrpdrY1(?YR!F1d7wd#m7UfR#(ZvRhW7Y1()rRcc2CG_S8ZC!GELR1P!cc z?f>tt;}J0Iz6PyLf5vP_Z+Kpag+bS!p=Z1dPA->3ov_F>SdZF`mPXEK(a}i~n=khl ze;#>bQ|4bm8#5Pit<^A(XZNspc$5h;mU~UKVRoG)w4(t+jP!)0&8;Uv?9aeVxSiJ* zR9GJ#D;0TI`Fb96IXO8!0WHSPNB?$I?vnL+423+rcE2PYu6498#WZj z1_lNa52_8!*ed&M^jNKXulm^qJ$hMU&=6bn8!#BxeQ!wT!owrbtc5-lk&zF_^DYb; zY$NtJY}^dnVI!X#%u-WR;j(ruwo$yMu&}Ud&y?zXgt-mI*3pfS`EzaL9X2RFMQ!hC zdq9AxrO^_EDN?b}#b1Keaj#G$r96O9Z#Su|mB|X|lkonOIloHx^6^bX>+Tzh>vdj+ z$8r9t^+~4jGi+FyAQLcqBxdH{s09?=S_+Bis)q;@17xmfP%fCMSG-l>{@J*BD<;}a zd17DR@bgD(Y+R{w|C_ha!?F){?A(PZ(;O-^o|2N1apmguO6{MpurMrGumCGpuEe=> z=iuh%277yZI668aDk@4R%=lR<+O}-jBFet|?z`#*GX|HrWnc0bbf?4F(z2iKfEzdb zgjKeF!zKZx4@sz34(Z#d}Hqihvx9EeFt5!cZm|dng0K@Fk<;&H=>}RO_tFAT1 znYBXN()XmG_JynQWJPJfH0X=HqRjT|Uo=26azb)S4m^%3(9(FRDEr^6)6zWyLz594 zmLeU0G3|HFbsZcfpk25URr&gmd-6Dt>4I5sJAI8+)}a+b+8YQ-wr^f8m_CO| zNlQzIN);^~XJ==Z@SO9Jo13foUw-*Dj-4nDsbpqqyb(YDo9IDfeLHzI46}TisB-dh z#JTj`46VPs<&qUxafcOiWC~zCxkEWC#WAhwF9GKyQRd;{@%&-NF)xmn z8Jn1jm|02b+ixJ+w(o=!Cr{zzFQ>3<`N~qlFx?L95>f;87WAkt+;u_3d2P5l2Hd;D$Mq*|XoR_YES+CwOx9W$G&@fo_ z8-!lHt;J`$@7xWGKK;dKbneyziWmNUaS?Rdlof+1~vn;zfDc(lvz-vZ^G^ z#!Yq?F#AVMbNIMTghH84uAs&$>psv;GrOfeK&vjRMOlwQnzHz$Ty(J5q!lacHDnt? z!i%jkyEzv{dF@7H;eSVk*K1nfqffqp^{2ZkU7v!_MUloW|1^_p=A~re<8NS=Z{Z%oMNVP_`4q>sn0J+LE>!roz~00_su7%n?^ z?-9^Bcm852%Z$smyYGZy$IkFNb5;vxD}Hx{-NBjg4!(dctNS7)I~C0wjd1qzIdR|h z6n+^&Nwl8`{tPZ(KR+Bid=xg6Fe_=9ef^Cc?7y2S#`e?pPqSvt$^_X*AAMA2%&Z7z zY#0=kty!~%Uq8b5@#7I18u~CMTPTtV3^m>i4Gm#rWF*~h$dDnZU%!5tVV^3wG$SJ; z10FQ9JZhd+*29v%)&|KAjU`E$V}SgSKcw?#y}bp@Zr-|8>@NKJbMZAZKS7SS>*Il$ zlc51$rY0lE02DAxkADcq9L;fBT&2P6en>ol%u)c&(0Bqmna?2$YLbA^?!)&)o%2`Y z(DEU$zWDZ7aV&%q02VgxT0k?TKz~+to`7BJZfo&ziz%qzYJ#Z${(pyy&#BvdQle6&xHQpk--20K4|=#h9-q2$(T^*qXZF^M|N+>h!OF3TCIzd!ZxM=j+a2xG0ir z46_)T0Jy9_#hQOR`#VAHGs)d`Aq%!s7c&t{dz$`f-MV#|Fyll(N=k}On3a^5Uw#>1 ze)*;3jz$w)*=^)F+_Y)aP^(rgbne_)oLjzpxu~zANsALA@4WL4CAepmFJ|`J{q+@+ zsFXVuf>{WWnqy~?k;+PknL0&e3?>Ftru!tx4BohTGuFDgN?BE5U9KLe zsXx1g27o`ce{9<__e>Y{axZBHboL2Hah&6&aqSp}e4KT3ex5WM+e zAKEuZ6T{*G;JEs#1S{t?rQ?A|P6v@Sw_K{j$1@iB&^_kj^;(uNG@SuE2M>JM_%rc2 zESG)5D;H)4CWxbDIMG*qp(JaI0i`0#Om*ij60Y4q%o%TljTlW(ib163uZTEy0*MrB zQe3-^Fq#CTJa!|J>PFbvBPuou*;`v7-P2CEn^_l}$vTNZd~zc4_YFjRB4w-BG=d_Q z0C#8w$^MxBY;eV5bt9klY zFRcW?nhTpT{peiygkMF^b%T&elVZ!o#)zd!@LT)o;-2hk-XoCfx9uokcJYr(7(fX& zE@Nwt-Om}bf57ljqhZ?90x1uTg!1;!*s)_D>t@>8+KS~@kHUswaZ#DGw?ZHdg0`}6#Mocl(H|JwOqK!NrIWzncv{DW*wHVSVh?q zRi($wvQIC22$i42ad1e8u*!~~JgKvOUf=~$KW$~-vaK?TYoz?3FTlqxExWO)3yhIG zqlvJ_1RR%Jiu)8OZ&j*3#uoD>$P~#}Q{AQW13veVKy~(_0_)u_;s?iL6g1Yj{K4S~ zsMYXuG&THD)cO67C>WTo#ycMkDs|r?8TakBN`+Zs&;E#{%vj8!V~E*v01?#h(PWi{ z(F`3y&9;V1&~7qye zZ3pyQx5G7Z6~>JH3L_~%x!7rm1he@R3)s4K8^(+qkMUoB^K=gj4WvRc&mR?aLO4>L zdk|!rq995`{1XH*hFNfMu;eaE^~pud*zt{kP`2j^o%dvTW&g5N)XCT}QIzGJ+a!+D zU5AU~+^hRE$7_dHI-FN;I;RDix9SX_2ctMP$?jo&z3G$?a276P+itT(y*FxE;q5vD z$xXEo$8Ubv7hSB@V%{SYh&rsrGFjF7+PPApNK?? zZ!nzrpZdd`AH|Xko-ynuPlXL-a9SC(CF*;jT?b>4-DK-XtT&^XjF)NfTLNa?%`wDg z_)`t8yr7F(F|tP`+jFHftF9yWa>J%gVz%I*KgZJ^ckR;(ySfE2_bdHj$;($0!1_y| zG3)18oW>{Xiv#zZAZXI=2TdHLivwPxbCu< zVOA8s(vn%tkiKRJ9{8V->T$rIV`bMKUjM-FXyrqUVr`kbrb3+<@ys5Ugv4y9Vl#v= z+@7?lqLbma>mr<1oy7hlmyw;5`6HT66W`6;Z7BCo71L)kCE`p?O+^xb-O#6kncNw&K2<>> localizedValues = { "en": "Delete All Items", "ar": "حذف كافة العناصر" }, + "total": { + "en": "Total", + "ar": "المجموع" + }, + "selectAddress": { + "en": "Select Address", + "ar": "حدد العنوان" + }, + "shippingAddress": { + "en": "SHIPPING ADDRESS", + "ar": "عنوان الشحن" + }, + "changeAddress": { + "en": "Change Address", + "ar": "تغيير العنوان" + }, + "selectPaymentOption": { + "en": "Select Payment Option", + "ar": "حدد خيار الدفع" + }, + "changeMethod": { + "en": "Change Method", + "ar": "تغيير خيار الدفع" + }, + "reviewOrder": { + "en": "Review Order", + "ar": "مراجعة الطلب" + }, + "orderSummary": { + "en": "Order Summary", + "ar": "ملخص الطلب" + }, + "active": { + "en": "ACTIVE", + "ar": "فعال" + }, + "inactive": { + "en": "INACTIVE", + "ar": "غير فعال" + }, + "balance": { + "en": "BALANCE", + "ar": "الحالي" + }, + "gained": { + "en": "GAINED", + "ar": "المكتسب" + }, + "consumed": { + "en": "CONSUMED", + "ar": "المستهلك" + }, + "transferred": { + "en": "TRANSFERRED", + "ar": "المحول" + }, + "checkBeneficiary": { + "en": "CHECK BENEFICIARY", + "ar": "تحقق من المستفيد" + }, + "beneficiaryName": { + "en": "Beneficiary Name", + "ar": "اسم المستفيد" + }, + "accountActivation": { + "en": "Account Activation", + "ar": "تفعيل الحساب" + }, + "acceptLbl": { + "en": "Accept", + "ar": "موافقة" + }, + + + "select-gender": {"en": "Select Gender", "ar": "اختر الجنس"}, "i-am-a": {"en": "I am a ...", "ar": "أنا ..."}, "select-age": {"en": "Select Your Age", "ar": "حدد العمر"}, diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index c5fafe03..a667a9af 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -17,3 +17,4 @@ const IS_GO_TO_PARKING = 'IS_GO_TO_PARKING'; const IS_SEARCH_APPO = 'is-search-appo'; const IS_LIVECARE_APPOINTMENT = 'is_livecare_appointment'; const PHARMACY_LAST_VISITED_PRODUCTS = 'last-visited'; +const PHARMACY_CUSTOMER_ID = 'costumer-id'; diff --git a/lib/core/model/pharmacies/Addresses.dart b/lib/core/model/pharmacies/Addresses.dart index 74d5a591..b00b1a17 100644 --- a/lib/core/model/pharmacies/Addresses.dart +++ b/lib/core/model/pharmacies/Addresses.dart @@ -17,6 +17,7 @@ class Addresses { String createdOnUtc; String province; String latLong; + bool isChecked; Addresses( {this.id, @@ -36,7 +37,8 @@ class Addresses { this.customerAttributes, this.createdOnUtc, this.province, - this.latLong}); + this.latLong, + this.isChecked = false}); Addresses.fromJson(Map json) { id = json['id']; @@ -57,6 +59,7 @@ class Addresses { createdOnUtc = json['created_on_utc']; province = json['province']; latLong = json['lat_long']; + isChecked = json['isChecked']; } Map toJson() { @@ -79,6 +82,7 @@ class Addresses { data['created_on_utc'] = this.createdOnUtc; data['province'] = this.province; data['lat_long'] = this.latLong; + data['isChecked'] = this.isChecked; return data; } diff --git a/lib/core/model/pharmacies/BillingAddress.dart b/lib/core/model/pharmacies/BillingAddress.dart new file mode 100644 index 00000000..765ac54d --- /dev/null +++ b/lib/core/model/pharmacies/BillingAddress.dart @@ -0,0 +1,84 @@ +class BillingAddress { + String id; + String firstName; + String lastName; + String email; + String company; + int countryId; + String country; + String stateProvinceId; + String city; + String address1; + String address2; + String zipPostalCode; + String phoneNumber; + String faxNumber; + String customerAttributes; + String createdOnUtc; + String province; + String latLong; + + BillingAddress( + {this.id, + this.firstName, + this.lastName, + this.email, + this.company, + this.countryId, + this.country, + this.stateProvinceId, + this.city, + this.address1, + this.address2, + this.zipPostalCode, + this.phoneNumber, + this.faxNumber, + this.customerAttributes, + this.createdOnUtc, + this.province, + this.latLong}); + + BillingAddress.fromJson(Map json) { + id = json['id']; + firstName = json['first_name']; + lastName = json['last_name']; + email = json['email']; + company = json['company']; + countryId = json['country_id']; + country = json['country']; + stateProvinceId = json['state_province_id']; + city = json['city']; + address1 = json['address1']; + address2 = json['address2']; + zipPostalCode = json['zip_postal_code']; + phoneNumber = json['phone_number']; + faxNumber = json['fax_number']; + customerAttributes = json['customer_attributes']; + createdOnUtc = json['created_on_utc']; + province = json['province']; + latLong = json['lat_long']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['first_name'] = this.firstName; + data['last_name'] = this.lastName; + data['email'] = this.email; + data['company'] = this.company; + data['country_id'] = this.countryId; + data['country'] = this.country; + data['state_province_id'] = this.stateProvinceId; + data['city'] = this.city; + data['address1'] = this.address1; + data['address2'] = this.address2; + data['zip_postal_code'] = this.zipPostalCode; + data['phone_number'] = this.phoneNumber; + data['fax_number'] = this.faxNumber; + data['customer_attributes'] = this.customerAttributes; + data['created_on_utc'] = this.createdOnUtc; + data['province'] = this.province; + data['lat_long'] = this.latLong; + return data; + } +} diff --git a/lib/core/model/pharmacies/Customer.dart b/lib/core/model/pharmacies/Customer.dart index a5311489..e3defbbe 100644 --- a/lib/core/model/pharmacies/Customer.dart +++ b/lib/core/model/pharmacies/Customer.dart @@ -1,4 +1,10 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/BillingAddress.dart'; + class Customer { + BillingAddress billingAddress; + BillingAddress shippingAddress; + List addresses; String fileNumber; String iqamaNumber; int isOutSa; @@ -8,8 +14,6 @@ class Customer { String phone; String countryCode; String yahalaAccountno; - String billingAddress; - String shippingAddress; String id; String username; String email; @@ -17,50 +21,63 @@ class Customer { String lastName; String languageId; String adminComment; - String isTaxExempt; - String hasShoppingCartItems; - String active; - String deleted; - String isSystemAccount; + bool isTaxExempt; + bool hasShoppingCartItems; + bool active; + bool deleted; + bool isSystemAccount; String systemName; String lastIpAddress; String createdOnUtc; String lastLoginDateUtc; String lastActivityDateUtc; - String registeredInStoreId; + int registeredInStoreId; Customer( - {this.fileNumber, - this.iqamaNumber, - this.isOutSa, - this.patientType, - this.gender, - this.birthDate, - this.phone, - this.countryCode, - this.yahalaAccountno, - this.billingAddress, - this.shippingAddress, - this.id, - this.username, - this.email, - this.firstName, - this.lastName, - this.languageId, - this.adminComment, - this.isTaxExempt, - this.hasShoppingCartItems, - this.active, - this.deleted, - this.isSystemAccount, - this.systemName, - this.lastIpAddress, - this.createdOnUtc, - this.lastLoginDateUtc, - this.lastActivityDateUtc, - this.registeredInStoreId}); + {this.billingAddress, + this.shippingAddress, + this.addresses, + this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId}); Customer.fromJson(Map json) { + billingAddress = json['billing_address'] != null + ? new BillingAddress.fromJson(json['billing_address']) + : null; + shippingAddress = json['shipping_address'] != null + ? new BillingAddress.fromJson(json['shipping_address']) + : null; + if (json['addresses'] != null) { + addresses = new List(); + json['addresses'].forEach((v) { + addresses.add(new Addresses.fromJson(v)); + }); + } fileNumber = json['file_number']; iqamaNumber = json['iqama_number']; isOutSa = json['is_out_sa']; @@ -70,8 +87,6 @@ class Customer { phone = json['phone']; countryCode = json['country_code']; yahalaAccountno = json['yahala_accountno']; - billingAddress = json['billing_address']; - shippingAddress = json['shipping_address']; id = json['id']; username = json['username']; email = json['email']; @@ -94,6 +109,15 @@ class Customer { Map toJson() { final Map data = new Map(); + if (this.billingAddress != null) { + data['billing_address'] = this.billingAddress.toJson(); + } + if (this.shippingAddress != null) { + data['shipping_address'] = this.shippingAddress.toJson(); + } + if (this.addresses != null) { + data['addresses'] = this.addresses.map((v) => v.toJson()).toList(); + } data['file_number'] = this.fileNumber; data['iqama_number'] = this.iqamaNumber; data['is_out_sa'] = this.isOutSa; @@ -103,8 +127,6 @@ class Customer { data['phone'] = this.phone; data['country_code'] = this.countryCode; data['yahala_accountno'] = this.yahalaAccountno; - data['billing_address'] = this.billingAddress; - data['shipping_address'] = this.shippingAddress; data['id'] = this.id; data['username'] = this.username; data['email'] = this.email; @@ -125,4 +147,4 @@ class Customer { data['registered_in_store_id'] = this.registeredInStoreId; return data; } -} \ No newline at end of file +} diff --git a/lib/core/model/pharmacies/LacumAccountInformation.dart b/lib/core/model/pharmacies/LacumAccountInformation.dart new file mode 100644 index 00000000..4f1d0455 --- /dev/null +++ b/lib/core/model/pharmacies/LacumAccountInformation.dart @@ -0,0 +1,1926 @@ +import 'LakumInquiryInformationObjVersion.dart'; + +class LacumAccountInformation { + + String date; + int languageID; + int serviceName; + String time; + String androidLink; + String authenticationTokenID; + String data; + bool dataw; + int dietType; + String errorCode; + String errorEndUserMessage; + String errorEndUserMessageN; + String errorMessage; + int errorType; + int foodCategory; + String iOSLink; + bool isAuthenticated; + int mealOrderStatus; + int mealType; + int messageStatus; + int numberOfResultRecords; + String patientBlodType; + String successMsg; + String successMsgN; + int accountStatus; + String activeArchiveObject; + int activeMedicationCount; + String allMedicationTakenDuringAdmissionList; + int appointmentNo; + String arePatientsOnlineList; + String balanceAmount; + String bloodGroupList; + int cVIUnreadCount; + String checkUserHasAccount; + int complaintNo; + String dischargeList; + int episodeID; + String finalRadiologyList; + String fullName; + String geoFPointsList; + String geoGetPateintInfo; + String getAllDoctorsByProjectAndClinicList; + String getAppointmentNumbersForDoctorList; + String getCheckUpItemsList; + String getCosmeticConferenceForTodayList; + String getDoctorERClinicResult; + String getInvoiceApprovalList; + String getNearestProjectList; + String getPatientAdmissionOrAppoinmentNoList; + String getPatientBloodType; + String getPatientInsuranceCardStatusStatisticsList; + String getSurveyList; + String getTotalRegisteredPatientList; + String getUserDetailsList; + String getCustomerPointInfo; + String hISApprovalList; + String hISInpAdmissionList; + String hISProgNoteAssesmentModelList; + String hMGGetAllOffersList; + bool hasApproval; + bool hasConsultation; + bool hasDental; + bool hasLab; + bool hasPharmacy; + bool hasRad; + String hmgSMSGetByProjectIDAndPatientIDList; + int hoursLeft; + String iNPMGetAllAdmissionList; + String iNPMGetPatientInfoForSickLeaveReportList; + String iNPMHISPatientMedicalStatusUnreadCount; + String iNPMLABGetPatientLabOrdersResultsList; + String iNPMLABGetPatientLabResultsList; + String iNPMLABGetPatientRADReportList; + String iNPMLABGetPatientRadResultsList; + String iNPMRadGetPatientRadOrdersCVIList; + String iNPMRadGetPatientRadOrdersList; + String iNPMRadGetRadMedicalRecordsList; + String iNPGetPrescriptionDischargesList; + String iNPGetPrescriptionReportList; + String identificationNo; + bool isHomeMedicineDeliverySupported; + int isInsertedOrUpdated; + bool isMainAcoountEqualPatienID; + bool isPatientAlreadyAgreed; + bool isPatientCallBackBlackList; + bool isPatientHaveFingerPrint; + bool isPatientOnline; + bool isPatientTokenRemoved; + bool isPaused; + bool isProjectWorkingHours; + String isStoreRateAllowed; + String isStoreRateInserted; + String isStoreRateUpdated; + int labRadUpdatedToRead; + int labReportUnreadNo; + String lakumInquiryInformationObj; + LakumInquiryInformationObjVersion lakumInquiryInformationObjVersion; + String lakumResponseList; + String laserGetBodyPartsByCategoryList; + String laserGetCategoriesList; + String list; + int listCount; + int listCountDeliverd; + int listCountUnDeliverd; + String listDeviceInfo; + String listFamilyAppointments; + String listLabResultsByAppNo; + String listLakumInquiryInformationObj; + String listOpinionGetAllPeriod; + String listOpinionGetAllServices; + String listOpinionGetIsAgreeValue; + String listOpinionGetOpinionLogin; + String listOpinionGetRequestedSerives; + String listOpinionGetShareServicesDetails; + String listOpinionUserTerms; + String listPLO; + String listPLR; + String listPLSR; + String listPRM; + String listPatientFamilyFiles; + String listPatientFileInfo; + String listRAD; + String listRADAPI; + String listActiveGetPrescriptionReportByPatientID; + String listAppointmentsForDentalClinic; + String listBabyInfoResult; + String listCheckInsuranceCoverage; + String listCompanyClass; + String listConsentMedicalReport; + String listDentalAppointments; + String listDeviceTokenIDByAppointmentNo; + String listDischargeDiagnosis; + String listDischargeMedicine; + String listDischargeSummary; + String listDoctorResponse; + String listDoneVaccines; + String listEReferralResult; + String listEReferrals; + String listGetAllPatientsLiveCareAdmin; + String listGetDataForExcel; + String listGetMainCountID; + String listGetPrescriptionReportByPatientID; + String listGetSickLeave; + String listHISInvoice; + String listHISInvoiceProcedures; + String listInpatientInvoices; + String listInsuranceCheckList; + String listInsuranceCompanies; + String listInsuranceCompaniesGroup; + String listInsuranceUpdateDetails; + String listInvoiceApprovalProcedureInfo; + String listIsLastSatisfactionSurveyReviewedModel; + String listLabOrderDetailsModel; + String listMedicalReport; + String listMedicalReportApprovals; + String listMedicalReportStatus; + String listMonthBloodPressureResult; + String listMonthBloodPressureResultAverage; + String listMonthDiabtecPatientResult; + String listMonthDiabtectResultAverage; + String listMonthWeightMeasurementResult; + String listMonthWeightMeasurementResultAverage; + String listOnlinePrescriptionResult; + String listOutPatientInvoices; + String listPHRInvoice; + String listPHRInvoiceItems; + String listPHRPaymentMethods; + String listPateintDetails; + String listPateintInformation; + String listPatientAdmissionInfo; + String listPatientAdvanceBalanceAmount; + String listPatientCallBackLogs; + String listPatientCallBackToUpdateFromICServer; + String listPatientCount; + String listPatientDashboard; + String listPatientERGetAdminClinicsModel; + String listPatientERGetAdminProjectsModel; + String listPatientERGetAllClinicsModel; + String listPatientHISInvoices; + String listPatientICProjects; + String listPatientICProjectsByID; + String listPatientICProjectsTimings; + String listPatientIDByUID; + String listPatientIDForSurveyResult; + String listPatientInfo; + String listPatientInfoForDDScreen; + String listPatientInfoForSickleaveReport; + String listPatientInsuranceCard; + String listPatientInsuranceCardHistory; + String listPatientInsuranceDetails; + String listPatientPHRInvoices; + String listPatientServicePoint; + String listPatientStatusCount; + String listPatientChatRequestMapModel; + String listPatientChatRequestModel; + String listPatientChatRequestVCModel; + String listPaymentMethods; + String listPointServices; + String listPregnancyStagesInfo; + String listProjectAvgERWaitingTime; + String listProjectAvgERWaitingTimeHourly; + String listRadMedicalRecords; + String listRadMedicalRecordsAPI; + String listRadMedicalRecordsCVI; + String listRadMedicalRecordsCVIAPI; + String listRadMedicalRecordsResults; + String listSickLeave; + String listTransaction; + String listVideoConferenceSessions; + String listWeekBloodPressureResult; + String listWeekBloodPressureResultAverage; + String listWeekDiabtecPatientResult; + String listWeekDiabtectResultAverage; + String listWeekWeightMeasurementResult; + String listWeekWeightMeasurementResultAverage; + String listYearBloodPressureResult; + String listYearBloodPressureResultAverage; + String listYearDiabtecPatientResult; + String listYearDiabtecResultAverage; + String listYearWeightMeasurementResult; + String listYearWeightMeasurementResultAverage; + String listEInvoiceForDental; + String listEInvoiceForOnlineCheckIn; + String medGetActivitiesTransactionsStsList; + String medGetAvgMonthTransactionsStsList; + String medGetAvgWeekTransactionsStsList; + String medGetCategoriesList; + String medGetMonthActivitiesTransactionsStsList; + String medGetMonthStepsTransactionsStsList; + String medGetMonthTransactionsStsList; + String medGetPatientLastRecordList; + String medGetSubCategoriesList; + String medGetTransactionsAndActTransactionsResult; + String medGetTransactionsList; + String medGetWeekActivitiesTransactionsStsList; + String medGetWeekStepsTransactionsStsList; + String medGetWeekTransactionsStsList; + String medGetYearActivitiesTransactionsStsList; + String medGetYearSleepTransactionsStsList; + String medGetYearStepsTransactionsStsList; + String medGetYearTransactionsStsList; + String medInsertTransactionsOutputsList; + String medicalRecordImages; + int medicalReportToRead; + int medicalReportUnreadNo; + bool missingIDCardAttachment; + bool missingInsuranceCardAttachment; + bool missingMedicalReportAttachment; + bool missingOtherRelationship; + bool missingPatientContactNo; + bool missingPatientId; + bool missingPatientIdentityNumber; + bool missingPatientName; + bool missingReferralContactNo; + bool missingReferralRelationship; + bool missingReferralRequesterName; + String mobileNumber; + int nationalityNumber; + String onlineCheckInAppointments; + String opinionUserAgreementContent; + bool orderInsert; + String pateintInfoForUpdateList; + String pateintUpatedList; + String patientBirthdayCertificate; + String patientERCMCRequestSummaryByProject; + String patientERCMCRequestWithTotal; + String patientERCMCGetAllServicesList; + String patientERCMCGetTransactionsForOrderList; + String patientERCoordinates; + String patientERCountOrderList; + String patientERCountsForApprovalOffice; + String patientERDeleteOldCurrentDoctorsOutputsList; + String patientERDeliveryGetAllDeliverdOrderList; + String patientERDeliveryGetAllOrderList; + bool patientERDeliveryIsOrderInserted; + bool patientERDeliveryIsOrderUpdated; + bool patientERDeliveryIsPausedChanged; + String patientERDeliveryNextOrder; + int patientERDeliveryOrderInsert; + int patientERDeliveryUpdateOrderStatus; + bool patientERDriverUpdate; + String patientERExacartCheckIsDispenseAccpetableList; + String patientERExacartGetDispenseQuantitiesByOrderIDList; + String patientERExacartGetOrderDetailsByePharmacyOrderNoList; + String patientERExacartGetOrderDetailsList; + String patientERExacartGetTotalDispenseQuantitiesByPresNoList; + bool patientERExacartIsDispenseAdded; + String patientERExacartIsDispenseAddedList; + bool patientERExacartIsOrderCompleted; + String patientERGetAdminByProjectAndRoleList; + String patientERGetAdminProjectsList; + String patientERGetAllDriversList; + String patientERGetAllNeedAproveStatusList; + String patientERGetAllPresOrdersStatusList; + String patientERGetAllProjectsList; + String patientERGetArchiveInformationList; + String patientERGetAskDoctorTotalByDateFilterList; + String patientERGetBookScheduleConfigsList; + String patientERGetClinicAndTimeAndEpisodeForAppointmentList; + String patientERGetClinicAndTimeForDischargeList; + String patientERGetDashboardDataforApporvalSectionForAdminList; + String patientERGetDashboardDataforApporvalSectionList; + String patientERGetDashboardDataforHHCSectionForAdminList; + String patientERGetDashboardDataforHHCSectionList; + String patientERGetDashboardDataforPrescriptionSectionForAdminList; + String patientERGetDashboardDataforPrescriptionSectionList; + String patientERGetDoctorDashboardDataModelList; + String patientERGetDriverLocationList; + String patientERGetInsuranceCardRequestByDateFilterList; + String patientERGetLiveCareSummaryBookedAppoinmentStatusList; + String patientERGetLiveCareSummaryCovidList; + String patientERGetLiveCareSummaryForCMCList; + String patientERGetLiveCareSummaryForHHCList; + String patientERGetLiveCareSummaryForHomeDeliveryList; + String patientERGetLiveCareSummaryForInsuranceCardRequestList; + String patientERGetLiveCareSummaryForNewFilesList; + String patientERGetLiveCareSummaryForOnlinePaymetRequestList; + String patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; + String patientERGetLiveCareSummaryForTrasnportationList; + String patientERGetLiveCareSummaryLiveCareCountsList; + String patientERGetMedicalRequestTotalByDateFilterList; + String patientERGetNearestPendingOrdersList; + String patientERGetNeedAproveHistoryForOrderList; + String patientERGetNeedAprovePendingOrdersList; + String patientERGetNeedAproveStatusStatisticsList; + String patientERGetPatientAllPresOrdersList; + String patientERGetPendingPatientsCountList; + String patientERGetPresOrdersHistoryForAdminList; + String patientERGetPresOrdersHistoryForOrderList; + String patientERGetPresOrdersStatusStatisticsList; + String patientERHHCRequest; + String patientERHHCRequestSummaryByProject; + String patientERHHCRequestWithTotal; + String patientERHHCGetAllServicesList; + String patientERHHCGetTransactionsForOrderList; + String patientERHomeDeliveryCounts; + bool patientERInsertDriver; + String patientERInsertNewCurrentDoctorsOutputsList; + String patientERInsuranceStatusCountList; + bool patientERIsNearestProjectUpdated; + bool patientERIsNeedAproveReturnedToQueue; + bool patientERIsNeedAproveUpdated; + bool patientERIsOrderClientRequestUpdated; + bool patientERIsOrderReturnedToQueue; + bool patientERIsPresOrderInserted; + bool patientERIsPresOrderUpdated; + bool patientERIsProjectUpdated; + String patientERNotCompletedDetails; + String patientERPatientsCountByCallStatus; + String patientERPeakHourCounts; + String patientERPresOrderInfo; + String patientERPrescriptionCounts; + String patientERProjectsContribution; + String patientERRRTGetAllQuestionsList; + String patientERRRTGetAllTransportationMethodList; + String patientERRRTGetPickUpRequestByPresOrderIDList; + String patientERRealRRTGetAllServicesList; + String patientERRealRRTGetOrderDetailsList; + String patientERRealRRTGetTransactionsForOrderList; + bool patientERRealRRTIsTransInserted; + String patientERRequestList; + String patientERTransportationRequestWithTotal; + String patientERealRRTGetServicePriceList; + String patientInfoByAdmissionNoList; + String patientMonitorGetPatientHeartRate; + int patientNotServedCounts; + String patientPrescriptionList; + String patientAllergies; + String patientCheckAppointmentValidationList; + String patientLoginTokenList; + String patientQRLoginInfoList; + String patientSELECTDeviceIMEIbyIMEIList; + String pharmList; + String prefLang; + int radReportUnreadNo; + String radGetPatientRadOrdersForDentalList; + int referralNumber; + String reminderConfigurations; + String requestNo; + int rowCount; + String servicePrivilegeList; + String shareFamilyFileObj; + String status; + int successCode; + String surveyRate; + String symptomCheckerConditionList; + String symptomCheckerGetAllDefaultQuestionsList; + String symptomCheckerGetBodyPartSymptomsList; + String symptomCheckerGetBodyPartsByCodeList; + String symptomCheckerGetBodyPartsList; + String symptomCheckerJsonResponseInString; + int timerTime; + int totalAdvanceBalanceAmount; + int totalPatientsCount; + int totalPendingApprovalCount; + int totalUnUsedCount; + int transactionNo; + int unReadCounts; + bool updateStatus; + String userAgreementContent; + int yahalaAccountNo; + bool check24HourComplaint; + String currency; + String message; + int patientID; + int returnValue; + String returnValueStr; + int statusCode; + + LacumAccountInformation( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.accountStatus, + this.activeArchiveObject, + this.activeMedicationCount, + this.allMedicationTakenDuringAdmissionList, + this.appointmentNo, + this.arePatientsOnlineList, + this.balanceAmount, + this.bloodGroupList, + this.cVIUnreadCount, + this.checkUserHasAccount, + this.complaintNo, + this.dischargeList, + this.episodeID, + this.finalRadiologyList, + this.fullName, + this.geoFPointsList, + this.geoGetPateintInfo, + this.getAllDoctorsByProjectAndClinicList, + this.getAppointmentNumbersForDoctorList, + this.getCheckUpItemsList, + this.getCosmeticConferenceForTodayList, + this.getDoctorERClinicResult, + this.getInvoiceApprovalList, + this.getNearestProjectList, + this.getPatientAdmissionOrAppoinmentNoList, + this.getPatientBloodType, + this.getPatientInsuranceCardStatusStatisticsList, + this.getSurveyList, + this.getTotalRegisteredPatientList, + this.getUserDetailsList, + this.getCustomerPointInfo, + this.hISApprovalList, + this.hISInpAdmissionList, + this.hISProgNoteAssesmentModelList, + this.hMGGetAllOffersList, + this.hasApproval, + this.hasConsultation, + this.hasDental, + this.hasLab, + this.hasPharmacy, + this.hasRad, + this.hmgSMSGetByProjectIDAndPatientIDList, + this.hoursLeft, + this.iNPMGetAllAdmissionList, + this.iNPMGetPatientInfoForSickLeaveReportList, + this.iNPMHISPatientMedicalStatusUnreadCount, + this.iNPMLABGetPatientLabOrdersResultsList, + this.iNPMLABGetPatientLabResultsList, + this.iNPMLABGetPatientRADReportList, + this.iNPMLABGetPatientRadResultsList, + this.iNPMRadGetPatientRadOrdersCVIList, + this.iNPMRadGetPatientRadOrdersList, + this.iNPMRadGetRadMedicalRecordsList, + this.iNPGetPrescriptionDischargesList, + this.iNPGetPrescriptionReportList, + this.identificationNo, + this.isHomeMedicineDeliverySupported, + this.isInsertedOrUpdated, + this.isMainAcoountEqualPatienID, + this.isPatientAlreadyAgreed, + this.isPatientCallBackBlackList, + this.isPatientHaveFingerPrint, + this.isPatientOnline, + this.isPatientTokenRemoved, + this.isPaused, + this.isProjectWorkingHours, + this.isStoreRateAllowed, + this.isStoreRateInserted, + this.isStoreRateUpdated, + this.labRadUpdatedToRead, + this.labReportUnreadNo, + this.lakumInquiryInformationObj, + this.lakumInquiryInformationObjVersion, + this.lakumResponseList, + this.laserGetBodyPartsByCategoryList, + this.laserGetCategoriesList, + this.list, + this.listCount, + this.listCountDeliverd, + this.listCountUnDeliverd, + this.listDeviceInfo, + this.listFamilyAppointments, + this.listLabResultsByAppNo, + this.listLakumInquiryInformationObj, + this.listOpinionGetAllPeriod, + this.listOpinionGetAllServices, + this.listOpinionGetIsAgreeValue, + this.listOpinionGetOpinionLogin, + this.listOpinionGetRequestedSerives, + this.listOpinionGetShareServicesDetails, + this.listOpinionUserTerms, + this.listPLO, + this.listPLR, + this.listPLSR, + this.listPRM, + this.listPatientFamilyFiles, + this.listPatientFileInfo, + this.listRAD, + this.listRADAPI, + this.listActiveGetPrescriptionReportByPatientID, + this.listAppointmentsForDentalClinic, + this.listBabyInfoResult, + this.listCheckInsuranceCoverage, + this.listCompanyClass, + this.listConsentMedicalReport, + this.listDentalAppointments, + this.listDeviceTokenIDByAppointmentNo, + this.listDischargeDiagnosis, + this.listDischargeMedicine, + this.listDischargeSummary, + this.listDoctorResponse, + this.listDoneVaccines, + this.listEReferralResult, + this.listEReferrals, + this.listGetAllPatientsLiveCareAdmin, + this.listGetDataForExcel, + this.listGetMainCountID, + this.listGetPrescriptionReportByPatientID, + this.listGetSickLeave, + this.listHISInvoice, + this.listHISInvoiceProcedures, + this.listInpatientInvoices, + this.listInsuranceCheckList, + this.listInsuranceCompanies, + this.listInsuranceCompaniesGroup, + this.listInsuranceUpdateDetails, + this.listInvoiceApprovalProcedureInfo, + this.listIsLastSatisfactionSurveyReviewedModel, + this.listLabOrderDetailsModel, + this.listMedicalReport, + this.listMedicalReportApprovals, + this.listMedicalReportStatus, + this.listMonthBloodPressureResult, + this.listMonthBloodPressureResultAverage, + this.listMonthDiabtecPatientResult, + this.listMonthDiabtectResultAverage, + this.listMonthWeightMeasurementResult, + this.listMonthWeightMeasurementResultAverage, + this.listOnlinePrescriptionResult, + this.listOutPatientInvoices, + this.listPHRInvoice, + this.listPHRInvoiceItems, + this.listPHRPaymentMethods, + this.listPateintDetails, + this.listPateintInformation, + this.listPatientAdmissionInfo, + this.listPatientAdvanceBalanceAmount, + this.listPatientCallBackLogs, + this.listPatientCallBackToUpdateFromICServer, + this.listPatientCount, + this.listPatientDashboard, + this.listPatientERGetAdminClinicsModel, + this.listPatientERGetAdminProjectsModel, + this.listPatientERGetAllClinicsModel, + this.listPatientHISInvoices, + this.listPatientICProjects, + this.listPatientICProjectsByID, + this.listPatientICProjectsTimings, + this.listPatientIDByUID, + this.listPatientIDForSurveyResult, + this.listPatientInfo, + this.listPatientInfoForDDScreen, + this.listPatientInfoForSickleaveReport, + this.listPatientInsuranceCard, + this.listPatientInsuranceCardHistory, + this.listPatientInsuranceDetails, + this.listPatientPHRInvoices, + this.listPatientServicePoint, + this.listPatientStatusCount, + this.listPatientChatRequestMapModel, + this.listPatientChatRequestModel, + this.listPatientChatRequestVCModel, + this.listPaymentMethods, + this.listPointServices, + this.listPregnancyStagesInfo, + this.listProjectAvgERWaitingTime, + this.listProjectAvgERWaitingTimeHourly, + this.listRadMedicalRecords, + this.listRadMedicalRecordsAPI, + this.listRadMedicalRecordsCVI, + this.listRadMedicalRecordsCVIAPI, + this.listRadMedicalRecordsResults, + this.listSickLeave, + this.listTransaction, + this.listVideoConferenceSessions, + this.listWeekBloodPressureResult, + this.listWeekBloodPressureResultAverage, + this.listWeekDiabtecPatientResult, + this.listWeekDiabtectResultAverage, + this.listWeekWeightMeasurementResult, + this.listWeekWeightMeasurementResultAverage, + this.listYearBloodPressureResult, + this.listYearBloodPressureResultAverage, + this.listYearDiabtecPatientResult, + this.listYearDiabtecResultAverage, + this.listYearWeightMeasurementResult, + this.listYearWeightMeasurementResultAverage, + this.listEInvoiceForDental, + this.listEInvoiceForOnlineCheckIn, + this.medGetActivitiesTransactionsStsList, + this.medGetAvgMonthTransactionsStsList, + this.medGetAvgWeekTransactionsStsList, + this.medGetCategoriesList, + this.medGetMonthActivitiesTransactionsStsList, + this.medGetMonthStepsTransactionsStsList, + this.medGetMonthTransactionsStsList, + this.medGetPatientLastRecordList, + this.medGetSubCategoriesList, + this.medGetTransactionsAndActTransactionsResult, + this.medGetTransactionsList, + this.medGetWeekActivitiesTransactionsStsList, + this.medGetWeekStepsTransactionsStsList, + this.medGetWeekTransactionsStsList, + this.medGetYearActivitiesTransactionsStsList, + this.medGetYearSleepTransactionsStsList, + this.medGetYearStepsTransactionsStsList, + this.medGetYearTransactionsStsList, + this.medInsertTransactionsOutputsList, + this.medicalRecordImages, + this.medicalReportToRead, + this.medicalReportUnreadNo, + this.missingIDCardAttachment, + this.missingInsuranceCardAttachment, + this.missingMedicalReportAttachment, + this.missingOtherRelationship, + this.missingPatientContactNo, + this.missingPatientId, + this.missingPatientIdentityNumber, + this.missingPatientName, + this.missingReferralContactNo, + this.missingReferralRelationship, + this.missingReferralRequesterName, + this.mobileNumber, + this.nationalityNumber, + this.onlineCheckInAppointments, + this.opinionUserAgreementContent, + this.orderInsert, + this.pateintInfoForUpdateList, + this.pateintUpatedList, + this.patientBirthdayCertificate, + this.patientERCMCRequestSummaryByProject, + this.patientERCMCRequestWithTotal, + this.patientERCMCGetAllServicesList, + this.patientERCMCGetTransactionsForOrderList, + this.patientERCoordinates, + this.patientERCountOrderList, + this.patientERCountsForApprovalOffice, + this.patientERDeleteOldCurrentDoctorsOutputsList, + this.patientERDeliveryGetAllDeliverdOrderList, + this.patientERDeliveryGetAllOrderList, + this.patientERDeliveryIsOrderInserted, + this.patientERDeliveryIsOrderUpdated, + this.patientERDeliveryIsPausedChanged, + this.patientERDeliveryNextOrder, + this.patientERDeliveryOrderInsert, + this.patientERDeliveryUpdateOrderStatus, + this.patientERDriverUpdate, + this.patientERExacartCheckIsDispenseAccpetableList, + this.patientERExacartGetDispenseQuantitiesByOrderIDList, + this.patientERExacartGetOrderDetailsByePharmacyOrderNoList, + this.patientERExacartGetOrderDetailsList, + this.patientERExacartGetTotalDispenseQuantitiesByPresNoList, + this.patientERExacartIsDispenseAdded, + this.patientERExacartIsDispenseAddedList, + this.patientERExacartIsOrderCompleted, + this.patientERGetAdminByProjectAndRoleList, + this.patientERGetAdminProjectsList, + this.patientERGetAllDriversList, + this.patientERGetAllNeedAproveStatusList, + this.patientERGetAllPresOrdersStatusList, + this.patientERGetAllProjectsList, + this.patientERGetArchiveInformationList, + this.patientERGetAskDoctorTotalByDateFilterList, + this.patientERGetBookScheduleConfigsList, + this.patientERGetClinicAndTimeAndEpisodeForAppointmentList, + this.patientERGetClinicAndTimeForDischargeList, + this.patientERGetDashboardDataforApporvalSectionForAdminList, + this.patientERGetDashboardDataforApporvalSectionList, + this.patientERGetDashboardDataforHHCSectionForAdminList, + this.patientERGetDashboardDataforHHCSectionList, + this.patientERGetDashboardDataforPrescriptionSectionForAdminList, + this.patientERGetDashboardDataforPrescriptionSectionList, + this.patientERGetDoctorDashboardDataModelList, + this.patientERGetDriverLocationList, + this.patientERGetInsuranceCardRequestByDateFilterList, + this.patientERGetLiveCareSummaryBookedAppoinmentStatusList, + this.patientERGetLiveCareSummaryCovidList, + this.patientERGetLiveCareSummaryForCMCList, + this.patientERGetLiveCareSummaryForHHCList, + this.patientERGetLiveCareSummaryForHomeDeliveryList, + this.patientERGetLiveCareSummaryForInsuranceCardRequestList, + this.patientERGetLiveCareSummaryForNewFilesList, + this.patientERGetLiveCareSummaryForOnlinePaymetRequestList, + this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList, + this.patientERGetLiveCareSummaryForTrasnportationList, + this.patientERGetLiveCareSummaryLiveCareCountsList, + this.patientERGetMedicalRequestTotalByDateFilterList, + this.patientERGetNearestPendingOrdersList, + this.patientERGetNeedAproveHistoryForOrderList, + this.patientERGetNeedAprovePendingOrdersList, + this.patientERGetNeedAproveStatusStatisticsList, + this.patientERGetPatientAllPresOrdersList, + this.patientERGetPendingPatientsCountList, + this.patientERGetPresOrdersHistoryForAdminList, + this.patientERGetPresOrdersHistoryForOrderList, + this.patientERGetPresOrdersStatusStatisticsList, + this.patientERHHCRequest, + this.patientERHHCRequestSummaryByProject, + this.patientERHHCRequestWithTotal, + this.patientERHHCGetAllServicesList, + this.patientERHHCGetTransactionsForOrderList, + this.patientERHomeDeliveryCounts, + this.patientERInsertDriver, + this.patientERInsertNewCurrentDoctorsOutputsList, + this.patientERInsuranceStatusCountList, + this.patientERIsNearestProjectUpdated, + this.patientERIsNeedAproveReturnedToQueue, + this.patientERIsNeedAproveUpdated, + this.patientERIsOrderClientRequestUpdated, + this.patientERIsOrderReturnedToQueue, + this.patientERIsPresOrderInserted, + this.patientERIsPresOrderUpdated, + this.patientERIsProjectUpdated, + this.patientERNotCompletedDetails, + this.patientERPatientsCountByCallStatus, + this.patientERPeakHourCounts, + this.patientERPresOrderInfo, + this.patientERPrescriptionCounts, + this.patientERProjectsContribution, + this.patientERRRTGetAllQuestionsList, + this.patientERRRTGetAllTransportationMethodList, + this.patientERRRTGetPickUpRequestByPresOrderIDList, + this.patientERRealRRTGetAllServicesList, + this.patientERRealRRTGetOrderDetailsList, + this.patientERRealRRTGetTransactionsForOrderList, + this.patientERRealRRTIsTransInserted, + this.patientERRequestList, + this.patientERTransportationRequestWithTotal, + this.patientERealRRTGetServicePriceList, + this.patientInfoByAdmissionNoList, + this.patientMonitorGetPatientHeartRate, + this.patientNotServedCounts, + this.patientPrescriptionList, + this.patientAllergies, + this.patientCheckAppointmentValidationList, + this.patientLoginTokenList, + this.patientQRLoginInfoList, + this.patientSELECTDeviceIMEIbyIMEIList, + this.pharmList, + this.prefLang, + this.radReportUnreadNo, + this.radGetPatientRadOrdersForDentalList, + this.referralNumber, + this.reminderConfigurations, + this.requestNo, + this.rowCount, + this.servicePrivilegeList, + this.shareFamilyFileObj, + this.status, + this.successCode, + this.surveyRate, + this.symptomCheckerConditionList, + this.symptomCheckerGetAllDefaultQuestionsList, + this.symptomCheckerGetBodyPartSymptomsList, + this.symptomCheckerGetBodyPartsByCodeList, + this.symptomCheckerGetBodyPartsList, + this.symptomCheckerJsonResponseInString, + this.timerTime, + this.totalAdvanceBalanceAmount, + this.totalPatientsCount, + this.totalPendingApprovalCount, + this.totalUnUsedCount, + this.transactionNo, + this.unReadCounts, + this.updateStatus, + this.userAgreementContent, + this.yahalaAccountNo, + this.check24HourComplaint, + this.currency, + this.message, + this.patientID, + this.returnValue, + this.returnValueStr, + this.statusCode}); + + LacumAccountInformation.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + accountStatus = json['AccountStatus']; + activeArchiveObject = json['ActiveArchiveObject']; + activeMedicationCount = json['ActiveMedicationCount']; + allMedicationTakenDuringAdmissionList = + json['AllMedicationTakenDuringAdmission_List']; + appointmentNo = json['AppointmentNo']; + arePatientsOnlineList = json['ArePatientsOnlineList']; + balanceAmount = json['BalanceAmount']; + bloodGroupList = json['BloodGroupList']; + cVIUnreadCount = json['CVI_UnreadCount']; + checkUserHasAccount = json['CheckUserHasAccount']; + complaintNo = json['ComplaintNo']; + dischargeList = json['DischargeList']; + episodeID = json['EpisodeID']; + finalRadiologyList = json['FinalRadiologyList']; + fullName = json['FullName']; + geoFPointsList = json['GeoF_PointsList']; + geoGetPateintInfo = json['GeoGetPateintInfo']; + getAllDoctorsByProjectAndClinicList = + json['GetAllDoctorsByProjectAndClinicList']; + getAppointmentNumbersForDoctorList = + json['GetAppointmentNumbersForDoctorList']; + getCheckUpItemsList = json['GetCheckUpItemsList']; + getCosmeticConferenceForTodayList = + json['GetCosmeticConferenceForTodayList']; + getDoctorERClinicResult = json['GetDoctorERClinicResult']; + getInvoiceApprovalList = json['GetInvoiceApprovalList']; + getNearestProjectList = json['GetNearestProjectList']; + getPatientAdmissionOrAppoinmentNoList = + json['GetPatientAdmissionOrAppoinmentNo_List']; + getPatientBloodType = json['GetPatientBloodType']; + getPatientInsuranceCardStatusStatisticsList = + json['GetPatientInsuranceCardStatusStatisticsList']; + getSurveyList = json['GetSurveyList']; + getTotalRegisteredPatientList = json['GetTotalRegisteredPatientList']; + getUserDetailsList = json['GetUserDetailsList']; + getCustomerPointInfo = json['Get_CustomerPointInfo']; + hISApprovalList = json['HIS_Approval_List']; + hISInpAdmissionList = json['HIS_InpAdmission_List']; + hISProgNoteAssesmentModelList = json['HIS_ProgNoteAssesmentModel_List']; + hMGGetAllOffersList = json['HMG_GetAllOffersList']; + hasApproval = json['Has_Approval']; + hasConsultation = json['Has_Consultation']; + hasDental = json['Has_Dental']; + hasLab = json['Has_Lab']; + hasPharmacy = json['Has_Pharmacy']; + hasRad = json['Has_Rad']; + hmgSMSGetByProjectIDAndPatientIDList = + json['Hmg_SMS_Get_By_ProjectID_And_PatientIDList']; + hoursLeft = json['HoursLeft']; + iNPMGetAllAdmissionList = json['INPM_GetAllAdmission_List']; + iNPMGetPatientInfoForSickLeaveReportList = + json['INPM_GetPatientInfoForSickLeaveReport_List']; + iNPMHISPatientMedicalStatusUnreadCount = + json['INPM_HIS_PatientMedicalStatus_UnreadCount']; + iNPMLABGetPatientLabOrdersResultsList = + json['INPM_LAB_GetPatientLabOrdersResults_List']; + iNPMLABGetPatientLabResultsList = + json['INPM_LAB_GetPatientLabResults_List']; + iNPMLABGetPatientRADReportList = json['INPM_LAB_GetPatientRADReport_List']; + iNPMLABGetPatientRadResultsList = + json['INPM_LAB_GetPatientRadResults_List']; + iNPMRadGetPatientRadOrdersCVIList = + json['INPM_Rad_GetPatientRadOrders_CVI_List']; + iNPMRadGetPatientRadOrdersList = json['INPM_Rad_GetPatientRadOrders_List']; + iNPMRadGetRadMedicalRecordsList = + json['INPM_Rad_GetRadMedicalRecords_List']; + iNPGetPrescriptionDischargesList = + json['INP_GetPrescriptionDischarges_List']; + iNPGetPrescriptionReportList = json['INP_GetPrescriptionReport_List']; + identificationNo = json['IdentificationNo']; + isHomeMedicineDeliverySupported = json['IsHomeMedicineDeliverySupported']; + isInsertedOrUpdated = json['IsInsertedOrUpdated']; + isMainAcoountEqualPatienID = json['IsMainAcoountEqualPatienID']; + isPatientAlreadyAgreed = json['IsPatientAlreadyAgreed']; + isPatientCallBackBlackList = json['IsPatientCallBackBlackList']; + isPatientHaveFingerPrint = json['IsPatientHaveFingerPrint']; + isPatientOnline = json['IsPatientOnline']; + isPatientTokenRemoved = json['IsPatientTokenRemoved']; + isPaused = json['IsPaused']; + isProjectWorkingHours = json['IsProjectWorkingHours']; + isStoreRateAllowed = json['IsStoreRateAllowed']; + isStoreRateInserted = json['IsStoreRateInserted']; + isStoreRateUpdated = json['IsStoreRateUpdated']; + labRadUpdatedToRead = json['LabRadUpdatedToRead']; + labReportUnreadNo = json['LabReportUnreadNo']; + lakumInquiryInformationObj = json['LakumInquiryInformationObj']; + lakumInquiryInformationObjVersion = + json['LakumInquiryInformationObjVersion'] != null + ? new LakumInquiryInformationObjVersion.fromJson( + json['LakumInquiryInformationObjVersion']) + : null; + lakumResponseList = json['LakumResponseList']; + laserGetBodyPartsByCategoryList = json['Laser_GetBodyPartsByCategoryList']; + laserGetCategoriesList = json['Laser_GetCategoriesList']; + list = json['List']; + listCount = json['ListCount']; + listCountDeliverd = json['ListCountDeliverd']; + listCountUnDeliverd = json['ListCountUnDeliverd']; + listDeviceInfo = json['ListDeviceInfo']; + listFamilyAppointments = json['ListFamilyAppointments']; + listLabResultsByAppNo = json['ListLabResultsByAppNo']; + listLakumInquiryInformationObj = json['ListLakumInquiryInformationObj']; + listOpinionGetAllPeriod = json['ListOpinion_GetAllPeriod']; + listOpinionGetAllServices = json['ListOpinion_GetAllServices']; + listOpinionGetIsAgreeValue = json['ListOpinion_GetIsAgreeValue']; + listOpinionGetOpinionLogin = json['ListOpinion_GetOpinionLogin']; + listOpinionGetRequestedSerives = json['ListOpinion_GetRequestedSerives']; + listOpinionGetShareServicesDetails = + json['ListOpinion_GetShareServicesDetails']; + listOpinionUserTerms = json['ListOpinion_UserTerms']; + listPLO = json['ListPLO']; + listPLR = json['ListPLR']; + listPLSR = json['ListPLSR']; + listPRM = json['ListPRM']; + listPatientFamilyFiles = json['ListPatientFamilyFiles']; + listPatientFileInfo = json['ListPatientFileInfo']; + listRAD = json['ListRAD']; + listRADAPI = json['ListRADAPI']; + listActiveGetPrescriptionReportByPatientID = + json['List_ActiveGetPrescriptionReportByPatientID']; + listAppointmentsForDentalClinic = json['List_AppointmentsForDentalClinic']; + listBabyInfoResult = json['List_BabyInfoResult']; + listCheckInsuranceCoverage = json['List_CheckInsuranceCoverage']; + listCompanyClass = json['List_CompanyClass']; + listConsentMedicalReport = json['List_ConsentMedicalReport']; + listDentalAppointments = json['List_DentalAppointments']; + listDeviceTokenIDByAppointmentNo = + json['List_DeviceTokenIDByAppointmentNo']; + listDischargeDiagnosis = json['List_DischargeDiagnosis']; + listDischargeMedicine = json['List_DischargeMedicine']; + listDischargeSummary = json['List_DischargeSummary']; + listDoctorResponse = json['List_DoctorResponse']; + listDoneVaccines = json['List_DoneVaccines']; + listEReferralResult = json['List_EReferralResult']; + listEReferrals = json['List_EReferrals']; + listGetAllPatientsLiveCareAdmin = + json['List_GetAllPatients_LiveCare_Admin']; + listGetDataForExcel = json['List_GetDataForExcel']; + listGetMainCountID = json['List_GetMainCountID']; + listGetPrescriptionReportByPatientID = + json['List_GetPrescriptionReportByPatientID']; + listGetSickLeave = json['List_GetSickLeave']; + listHISInvoice = json['List_HISInvoice']; + listHISInvoiceProcedures = json['List_HISInvoiceProcedures']; + listInpatientInvoices = json['List_InpatientInvoices']; + listInsuranceCheckList = json['List_InsuranceCheckList']; + listInsuranceCompanies = json['List_InsuranceCompanies']; + listInsuranceCompaniesGroup = json['List_InsuranceCompaniesGroup']; + listInsuranceUpdateDetails = json['List_InsuranceUpdateDetails']; + listInvoiceApprovalProcedureInfo = + json['List_InvoiceApprovalProcedureInfo']; + listIsLastSatisfactionSurveyReviewedModel = + json['List_IsLastSatisfactionSurveyReviewedModel']; + listLabOrderDetailsModel = json['List_LabOrderDetailsModel']; + listMedicalReport = json['List_MedicalReport']; + listMedicalReportApprovals = json['List_MedicalReportApprovals']; + listMedicalReportStatus = json['List_MedicalReportStatus']; + listMonthBloodPressureResult = json['List_MonthBloodPressureResult']; + listMonthBloodPressureResultAverage = + json['List_MonthBloodPressureResultAverage']; + listMonthDiabtecPatientResult = json['List_MonthDiabtecPatientResult']; + listMonthDiabtectResultAverage = json['List_MonthDiabtectResultAverage']; + listMonthWeightMeasurementResult = + json['List_MonthWeightMeasurementResult']; + listMonthWeightMeasurementResultAverage = + json['List_MonthWeightMeasurementResultAverage']; + listOnlinePrescriptionResult = json['List_OnlinePrescriptionResult']; + listOutPatientInvoices = json['List_OutPatientInvoices']; + listPHRInvoice = json['List_PHRInvoice']; + listPHRInvoiceItems = json['List_PHRInvoiceItems']; + listPHRPaymentMethods = json['List_PHRPaymentMethods']; + listPateintDetails = json['List_PateintDetails']; + listPateintInformation = json['List_PateintInformation']; + listPatientAdmissionInfo = json['List_PatientAdmissionInfo']; + listPatientAdvanceBalanceAmount = json['List_PatientAdvanceBalanceAmount']; + listPatientCallBackLogs = json['List_PatientCallBackLogs']; + listPatientCallBackToUpdateFromICServer = + json['List_PatientCallBackToUpdateFromICServer']; + listPatientCount = json['List_PatientCount']; + listPatientDashboard = json['List_PatientDashboard']; + listPatientERGetAdminClinicsModel = + json['List_PatientER_GetAdminClinicsModel']; + listPatientERGetAdminProjectsModel = + json['List_PatientER_GetAdminProjectsModel']; + listPatientERGetAllClinicsModel = json['List_PatientER_GetAllClinicsModel']; + listPatientHISInvoices = json['List_PatientHISInvoices']; + listPatientICProjects = json['List_PatientICProjects']; + listPatientICProjectsByID = json['List_PatientICProjectsByID']; + listPatientICProjectsTimings = json['List_PatientICProjectsTimings']; + listPatientIDByUID = json['List_PatientIDByUID']; + listPatientIDForSurveyResult = json['List_PatientIDForSurveyResult']; + listPatientInfo = json['List_PatientInfo']; + listPatientInfoForDDScreen = json['List_PatientInfoForDDScreen']; + listPatientInfoForSickleaveReport = + json['List_PatientInfoForSickleaveReport']; + listPatientInsuranceCard = json['List_PatientInsuranceCard']; + listPatientInsuranceCardHistory = json['List_PatientInsuranceCardHistory']; + listPatientInsuranceDetails = json['List_PatientInsuranceDetails']; + listPatientPHRInvoices = json['List_PatientPHRInvoices']; + listPatientServicePoint = json['List_PatientServicePoint']; + listPatientStatusCount = json['List_PatientStatusCount']; + listPatientChatRequestMapModel = json['List_Patient_ChatRequestMapModel']; + listPatientChatRequestModel = json['List_Patient_ChatRequestModel']; + listPatientChatRequestVCModel = json['List_Patient_ChatRequestVCModel']; + listPaymentMethods = json['List_PaymentMethods']; + listPointServices = json['List_PointServices']; + listPregnancyStagesInfo = json['List_PregnancyStagesInfo']; + listProjectAvgERWaitingTime = json['List_ProjectAvgERWaitingTime']; + listProjectAvgERWaitingTimeHourly = + json['List_ProjectAvgERWaitingTimeHourly']; + listRadMedicalRecords = json['List_RadMedicalRecords']; + listRadMedicalRecordsAPI = json['List_RadMedicalRecordsAPI']; + listRadMedicalRecordsCVI = json['List_RadMedicalRecordsCVI']; + listRadMedicalRecordsCVIAPI = json['List_RadMedicalRecordsCVIAPI']; + listRadMedicalRecordsResults = json['List_RadMedicalRecordsResults']; + listSickLeave = json['List_SickLeave']; + listTransaction = json['List_Transaction']; + listVideoConferenceSessions = json['List_VideoConferenceSessions']; + listWeekBloodPressureResult = json['List_WeekBloodPressureResult']; + listWeekBloodPressureResultAverage = + json['List_WeekBloodPressureResultAverage']; + listWeekDiabtecPatientResult = json['List_WeekDiabtecPatientResult']; + listWeekDiabtectResultAverage = json['List_WeekDiabtectResultAverage']; + listWeekWeightMeasurementResult = json['List_WeekWeightMeasurementResult']; + listWeekWeightMeasurementResultAverage = + json['List_WeekWeightMeasurementResultAverage']; + listYearBloodPressureResult = json['List_YearBloodPressureResult']; + listYearBloodPressureResultAverage = + json['List_YearBloodPressureResultAverage']; + listYearDiabtecPatientResult = json['List_YearDiabtecPatientResult']; + listYearDiabtecResultAverage = json['List_YearDiabtecResultAverage']; + listYearWeightMeasurementResult = json['List_YearWeightMeasurementResult']; + listYearWeightMeasurementResultAverage = + json['List_YearWeightMeasurementResultAverage']; + listEInvoiceForDental = json['List_eInvoiceForDental']; + listEInvoiceForOnlineCheckIn = json['List_eInvoiceForOnlineCheckIn']; + medGetActivitiesTransactionsStsList = + json['Med_GetActivitiesTransactionsStsList']; + medGetAvgMonthTransactionsStsList = + json['Med_GetAvgMonthTransactionsStsList']; + medGetAvgWeekTransactionsStsList = + json['Med_GetAvgWeekTransactionsStsList']; + medGetCategoriesList = json['Med_GetCategoriesList']; + medGetMonthActivitiesTransactionsStsList = + json['Med_GetMonthActivitiesTransactionsStsList']; + medGetMonthStepsTransactionsStsList = + json['Med_GetMonthStepsTransactionsStsList']; + medGetMonthTransactionsStsList = json['Med_GetMonthTransactionsStsList']; + medGetPatientLastRecordList = json['Med_GetPatientLastRecordList']; + medGetSubCategoriesList = json['Med_GetSubCategoriesList']; + medGetTransactionsAndActTransactionsResult = + json['Med_GetTransactionsAndActTransactionsResult']; + medGetTransactionsList = json['Med_GetTransactionsList']; + medGetWeekActivitiesTransactionsStsList = + json['Med_GetWeekActivitiesTransactionsStsList']; + medGetWeekStepsTransactionsStsList = + json['Med_GetWeekStepsTransactionsStsList']; + medGetWeekTransactionsStsList = json['Med_GetWeekTransactionsStsList']; + medGetYearActivitiesTransactionsStsList = + json['Med_GetYearActivitiesTransactionsStsList']; + medGetYearSleepTransactionsStsList = + json['Med_GetYearSleepTransactionsStsList']; + medGetYearStepsTransactionsStsList = + json['Med_GetYearStepsTransactionsStsList']; + medGetYearTransactionsStsList = json['Med_GetYearTransactionsStsList']; + medInsertTransactionsOutputsList = + json['Med_InsertTransactionsOutputsList']; + medicalRecordImages = json['MedicalRecordImages']; + medicalReportToRead = json['MedicalReportToRead']; + medicalReportUnreadNo = json['MedicalReportUnreadNo']; + missingIDCardAttachment = json['Missing_IDCardAttachment']; + missingInsuranceCardAttachment = json['Missing_InsuranceCardAttachment']; + missingMedicalReportAttachment = json['Missing_MedicalReportAttachment']; + missingOtherRelationship = json['Missing_OtherRelationship']; + missingPatientContactNo = json['Missing_PatientContactNo']; + missingPatientId = json['Missing_PatientId']; + missingPatientIdentityNumber = json['Missing_PatientIdentityNumber']; + missingPatientName = json['Missing_PatientName']; + missingReferralContactNo = json['Missing_ReferralContactNo']; + missingReferralRelationship = json['Missing_ReferralRelationship']; + missingReferralRequesterName = json['Missing_ReferralRequesterName']; + mobileNumber = json['MobileNumber']; + nationalityNumber = json['NationalityNumber']; + onlineCheckInAppointments = json['OnlineCheckInAppointments']; + opinionUserAgreementContent = json['Opinion_UserAgreementContent']; + orderInsert = json['OrderInsert']; + pateintInfoForUpdateList = json['PateintInfoForUpdateList']; + pateintUpatedList = json['PateintUpatedList']; + patientBirthdayCertificate = json['PatientBirthdayCertificate']; + patientERCMCRequestSummaryByProject = + json['PatientER_CMCRequestSummaryByProject']; + patientERCMCRequestWithTotal = json['PatientER_CMCRequestWithTotal']; + patientERCMCGetAllServicesList = json['PatientER_CMC_GetAllServicesList']; + patientERCMCGetTransactionsForOrderList = + json['PatientER_CMC_GetTransactionsForOrderList']; + patientERCoordinates = json['PatientER_Coordinates']; + patientERCountOrderList = json['PatientER_CountOrderList']; + patientERCountsForApprovalOffice = + json['PatientER_CountsForApprovalOffice']; + patientERDeleteOldCurrentDoctorsOutputsList = + json['PatientER_DeleteOldCurrentDoctorsOutputsList']; + patientERDeliveryGetAllDeliverdOrderList = + json['PatientER_Delivery_GetAllDeliverdOrderList']; + patientERDeliveryGetAllOrderList = + json['PatientER_Delivery_GetAllOrderList']; + patientERDeliveryIsOrderInserted = + json['PatientER_Delivery_IsOrderInserted']; + patientERDeliveryIsOrderUpdated = json['PatientER_Delivery_IsOrderUpdated']; + patientERDeliveryIsPausedChanged = + json['PatientER_Delivery_IsPausedChanged']; + patientERDeliveryNextOrder = json['PatientER_Delivery_NextOrder']; + patientERDeliveryOrderInsert = json['PatientER_Delivery_OrderInsert']; + patientERDeliveryUpdateOrderStatus = + json['PatientER_Delivery_UpdateOrderStatus']; + patientERDriverUpdate = json['PatientER_DriverUpdate']; + patientERExacartCheckIsDispenseAccpetableList = + json['PatientER_Exacart_CheckIsDispenseAccpetableList']; + patientERExacartGetDispenseQuantitiesByOrderIDList = + json['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList']; + patientERExacartGetOrderDetailsByePharmacyOrderNoList = + json['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList']; + patientERExacartGetOrderDetailsList = + json['PatientER_Exacart_GetOrderDetailsList']; + patientERExacartGetTotalDispenseQuantitiesByPresNoList = + json['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList']; + patientERExacartIsDispenseAdded = json['PatientER_Exacart_IsDispenseAdded']; + patientERExacartIsDispenseAddedList = + json['PatientER_Exacart_IsDispenseAddedList']; + patientERExacartIsOrderCompleted = + json['PatientER_Exacart_IsOrderCompleted']; + patientERGetAdminByProjectAndRoleList = + json['PatientER_GetAdminByProjectAndRoleList']; + patientERGetAdminProjectsList = json['PatientER_GetAdminProjectsList']; + patientERGetAllDriversList = json['PatientER_GetAllDriversList']; + patientERGetAllNeedAproveStatusList = + json['PatientER_GetAllNeedAproveStatusList']; + patientERGetAllPresOrdersStatusList = + json['PatientER_GetAllPresOrdersStatusList']; + patientERGetAllProjectsList = json['PatientER_GetAllProjectsList']; + patientERGetArchiveInformationList = + json['PatientER_GetArchiveInformation_List']; + patientERGetAskDoctorTotalByDateFilterList = + json['PatientER_GetAskDoctorTotalByDateFilterList']; + patientERGetBookScheduleConfigsList = + json['PatientER_GetBookScheduleConfigsList']; + patientERGetClinicAndTimeAndEpisodeForAppointmentList = + json['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList']; + patientERGetClinicAndTimeForDischargeList = + json['PatientER_GetClinicAndTimeForDischargeList']; + patientERGetDashboardDataforApporvalSectionForAdminList = + json['PatientER_GetDashboardDataforApporvalSectionForAdminList']; + patientERGetDashboardDataforApporvalSectionList = + json['PatientER_GetDashboardDataforApporvalSectionList']; + patientERGetDashboardDataforHHCSectionForAdminList = + json['PatientER_GetDashboardDataforHHCSectionForAdminList']; + patientERGetDashboardDataforHHCSectionList = + json['PatientER_GetDashboardDataforHHCSectionList']; + patientERGetDashboardDataforPrescriptionSectionForAdminList = + json['PatientER_GetDashboardDataforPrescriptionSectionForAdminList']; + patientERGetDashboardDataforPrescriptionSectionList = + json['PatientER_GetDashboardDataforPrescriptionSectionList']; + patientERGetDoctorDashboardDataModelList = + json['PatientER_GetDoctorDashboardDataModelList']; + patientERGetDriverLocationList = json['PatientER_GetDriverLocationList']; + patientERGetInsuranceCardRequestByDateFilterList = + json['PatientER_GetInsuranceCardRequestByDateFilterList']; + patientERGetLiveCareSummaryBookedAppoinmentStatusList = + json['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList']; + patientERGetLiveCareSummaryCovidList = + json['PatientER_GetLiveCareSummaryCovidList']; + patientERGetLiveCareSummaryForCMCList = + json['PatientER_GetLiveCareSummaryForCMCList']; + patientERGetLiveCareSummaryForHHCList = + json['PatientER_GetLiveCareSummaryForHHCList']; + patientERGetLiveCareSummaryForHomeDeliveryList = + json['PatientER_GetLiveCareSummaryForHomeDeliveryList']; + patientERGetLiveCareSummaryForInsuranceCardRequestList = + json['PatientER_GetLiveCareSummaryForInsuranceCardRequestList']; + patientERGetLiveCareSummaryForNewFilesList = + json['PatientER_GetLiveCareSummaryForNewFilesList']; + patientERGetLiveCareSummaryForOnlinePaymetRequestList = + json['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList']; + patientERGetLiveCareSummaryForOnlinePharmacyOrdersList = + json['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList']; + patientERGetLiveCareSummaryForTrasnportationList = + json['PatientER_GetLiveCareSummaryForTrasnportationList']; + patientERGetLiveCareSummaryLiveCareCountsList = + json['PatientER_GetLiveCareSummaryLiveCareCountsList']; + patientERGetMedicalRequestTotalByDateFilterList = + json['PatientER_GetMedicalRequestTotalByDateFilterList']; + patientERGetNearestPendingOrdersList = + json['PatientER_GetNearestPendingOrdersList']; + patientERGetNeedAproveHistoryForOrderList = + json['PatientER_GetNeedAproveHistoryForOrderList']; + patientERGetNeedAprovePendingOrdersList = + json['PatientER_GetNeedAprovePendingOrdersList']; + patientERGetNeedAproveStatusStatisticsList = + json['PatientER_GetNeedAproveStatusStatisticsList']; + patientERGetPatientAllPresOrdersList = + json['PatientER_GetPatientAllPresOrdersList']; + patientERGetPendingPatientsCountList = + json['PatientER_GetPendingPatientsCountList']; + patientERGetPresOrdersHistoryForAdminList = + json['PatientER_GetPresOrdersHistoryForAdminList']; + patientERGetPresOrdersHistoryForOrderList = + json['PatientER_GetPresOrdersHistoryForOrderList']; + patientERGetPresOrdersStatusStatisticsList = + json['PatientER_GetPresOrdersStatusStatisticsList']; + patientERHHCRequest = json['PatientER_HHCRequest']; + patientERHHCRequestSummaryByProject = + json['PatientER_HHCRequestSummaryByProject']; + patientERHHCRequestWithTotal = json['PatientER_HHCRequestWithTotal']; + patientERHHCGetAllServicesList = json['PatientER_HHC_GetAllServicesList']; + patientERHHCGetTransactionsForOrderList = + json['PatientER_HHC_GetTransactionsForOrderList']; + patientERHomeDeliveryCounts = json['PatientER_HomeDeliveryCounts']; + patientERInsertDriver = json['PatientER_InsertDriver']; + patientERInsertNewCurrentDoctorsOutputsList = + json['PatientER_InsertNewCurrentDoctorsOutputsList']; + patientERInsuranceStatusCountList = + json['PatientER_InsuranceStatusCountList']; + patientERIsNearestProjectUpdated = + json['PatientER_IsNearestProjectUpdated']; + patientERIsNeedAproveReturnedToQueue = + json['PatientER_IsNeedAproveReturnedToQueue']; + patientERIsNeedAproveUpdated = json['PatientER_IsNeedAproveUpdated']; + patientERIsOrderClientRequestUpdated = + json['PatientER_IsOrderClientRequestUpdated']; + patientERIsOrderReturnedToQueue = json['PatientER_IsOrderReturnedToQueue']; + patientERIsPresOrderInserted = json['PatientER_IsPresOrderInserted']; + patientERIsPresOrderUpdated = json['PatientER_IsPresOrderUpdated']; + patientERIsProjectUpdated = json['PatientER_IsProjectUpdated']; + patientERNotCompletedDetails = json['PatientER_NotCompletedDetails']; + patientERPatientsCountByCallStatus = + json['PatientER_PatientsCountByCallStatus']; + patientERPeakHourCounts = json['PatientER_PeakHourCounts']; + patientERPresOrderInfo = json['PatientER_PresOrderInfo']; + patientERPrescriptionCounts = json['PatientER_PrescriptionCounts']; + patientERProjectsContribution = json['PatientER_ProjectsContribution']; + patientERRRTGetAllQuestionsList = json['PatientER_RRT_GetAllQuestionsList']; + patientERRRTGetAllTransportationMethodList = + json['PatientER_RRT_GetAllTransportationMethodList']; + patientERRRTGetPickUpRequestByPresOrderIDList = + json['PatientER_RRT_GetPickUpRequestByPresOrderIDList']; + patientERRealRRTGetAllServicesList = + json['PatientER_RealRRT_GetAllServicesList']; + patientERRealRRTGetOrderDetailsList = + json['PatientER_RealRRT_GetOrderDetailsList']; + patientERRealRRTGetTransactionsForOrderList = + json['PatientER_RealRRT_GetTransactionsForOrderList']; + patientERRealRRTIsTransInserted = json['PatientER_RealRRT_IsTransInserted']; + patientERRequestList = json['PatientER_RequestList']; + patientERTransportationRequestWithTotal = + json['PatientER_TransportationRequestWithTotal']; + patientERealRRTGetServicePriceList = + json['PatientE_RealRRT_GetServicePriceList']; + patientInfoByAdmissionNoList = json['PatientInfoByAdmissionNo_List']; + patientMonitorGetPatientHeartRate = + json['PatientMonitor_GetPatientHeartRate']; + patientNotServedCounts = json['PatientNotServedCounts']; + patientPrescriptionList = json['PatientPrescriptionList']; + patientAllergies = json['Patient_Allergies']; + patientCheckAppointmentValidationList = + json['Patient_CheckAppointmentValidationList']; + patientLoginTokenList = json['Patient_LoginTokenList']; + patientQRLoginInfoList = json['Patient_QRLoginInfoList']; + patientSELECTDeviceIMEIbyIMEIList = + json['Patient_SELECTDeviceIMEIbyIMEIList']; + pharmList = json['PharmList']; + prefLang = json['PrefLang']; + radReportUnreadNo = json['RadReportUnreadNo']; + radGetPatientRadOrdersForDentalList = + json['Rad_GetPatientRadOrdersForDental_List']; + referralNumber = json['ReferralNumber']; + reminderConfigurations = json['ReminderConfigurations']; + requestNo = json['RequestNo']; + rowCount = json['RowCount']; + servicePrivilegeList = json['ServicePrivilegeList']; + shareFamilyFileObj = json['ShareFamilyFileObj']; + status = json['Status']; + successCode = json['SuccessCode']; + surveyRate = json['SurveyRate']; + symptomCheckerConditionList = json['SymptomChecker_ConditionList']; + symptomCheckerGetAllDefaultQuestionsList = + json['SymptomChecker_GetAllDefaultQuestionsList']; + symptomCheckerGetBodyPartSymptomsList = + json['SymptomChecker_GetBodyPartSymptomsList']; + symptomCheckerGetBodyPartsByCodeList = + json['SymptomChecker_GetBodyPartsByCodeList']; + symptomCheckerGetBodyPartsList = json['SymptomChecker_GetBodyPartsList']; + symptomCheckerJsonResponseInString = + json['SymptomChecker_JsonResponseInString']; + timerTime = json['TimerTime']; + totalAdvanceBalanceAmount = json['TotalAdvanceBalanceAmount']; + totalPatientsCount = json['TotalPatientsCount']; + totalPendingApprovalCount = json['TotalPendingApprovalCount']; + totalUnUsedCount = json['TotalUnUsedCount']; + transactionNo = json['TransactionNo']; + unReadCounts = json['UnReadCounts']; + updateStatus = json['UpdateStatus']; + userAgreementContent = json['UserAgreementContent']; + yahalaAccountNo = json['YahalaAccountNo']; + check24HourComplaint = json['check24HourComplaint']; + currency = json['currency']; + message = json['message']; + patientID = json['patientID']; + returnValue = json['returnValue']; + returnValueStr = json['returnValueStr']; + statusCode = json['statusCode']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['AccountStatus'] = this.accountStatus; + data['ActiveArchiveObject'] = this.activeArchiveObject; + data['ActiveMedicationCount'] = this.activeMedicationCount; + data['AllMedicationTakenDuringAdmission_List'] = + this.allMedicationTakenDuringAdmissionList; + data['AppointmentNo'] = this.appointmentNo; + data['ArePatientsOnlineList'] = this.arePatientsOnlineList; + data['BalanceAmount'] = this.balanceAmount; + data['BloodGroupList'] = this.bloodGroupList; + data['CVI_UnreadCount'] = this.cVIUnreadCount; + data['CheckUserHasAccount'] = this.checkUserHasAccount; + data['ComplaintNo'] = this.complaintNo; + data['DischargeList'] = this.dischargeList; + data['EpisodeID'] = this.episodeID; + data['FinalRadiologyList'] = this.finalRadiologyList; + data['FullName'] = this.fullName; + data['GeoF_PointsList'] = this.geoFPointsList; + data['GeoGetPateintInfo'] = this.geoGetPateintInfo; + data['GetAllDoctorsByProjectAndClinicList'] = + this.getAllDoctorsByProjectAndClinicList; + data['GetAppointmentNumbersForDoctorList'] = + this.getAppointmentNumbersForDoctorList; + data['GetCheckUpItemsList'] = this.getCheckUpItemsList; + data['GetCosmeticConferenceForTodayList'] = + this.getCosmeticConferenceForTodayList; + data['GetDoctorERClinicResult'] = this.getDoctorERClinicResult; + data['GetInvoiceApprovalList'] = this.getInvoiceApprovalList; + data['GetNearestProjectList'] = this.getNearestProjectList; + data['GetPatientAdmissionOrAppoinmentNo_List'] = + this.getPatientAdmissionOrAppoinmentNoList; + data['GetPatientBloodType'] = this.getPatientBloodType; + data['GetPatientInsuranceCardStatusStatisticsList'] = + this.getPatientInsuranceCardStatusStatisticsList; + data['GetSurveyList'] = this.getSurveyList; + data['GetTotalRegisteredPatientList'] = this.getTotalRegisteredPatientList; + data['GetUserDetailsList'] = this.getUserDetailsList; + data['Get_CustomerPointInfo'] = this.getCustomerPointInfo; + data['HIS_Approval_List'] = this.hISApprovalList; + data['HIS_InpAdmission_List'] = this.hISInpAdmissionList; + data['HIS_ProgNoteAssesmentModel_List'] = + this.hISProgNoteAssesmentModelList; + data['HMG_GetAllOffersList'] = this.hMGGetAllOffersList; + data['Has_Approval'] = this.hasApproval; + data['Has_Consultation'] = this.hasConsultation; + data['Has_Dental'] = this.hasDental; + data['Has_Lab'] = this.hasLab; + data['Has_Pharmacy'] = this.hasPharmacy; + data['Has_Rad'] = this.hasRad; + data['Hmg_SMS_Get_By_ProjectID_And_PatientIDList'] = + this.hmgSMSGetByProjectIDAndPatientIDList; + data['HoursLeft'] = this.hoursLeft; + data['INPM_GetAllAdmission_List'] = this.iNPMGetAllAdmissionList; + data['INPM_GetPatientInfoForSickLeaveReport_List'] = + this.iNPMGetPatientInfoForSickLeaveReportList; + data['INPM_HIS_PatientMedicalStatus_UnreadCount'] = + this.iNPMHISPatientMedicalStatusUnreadCount; + data['INPM_LAB_GetPatientLabOrdersResults_List'] = + this.iNPMLABGetPatientLabOrdersResultsList; + data['INPM_LAB_GetPatientLabResults_List'] = + this.iNPMLABGetPatientLabResultsList; + data['INPM_LAB_GetPatientRADReport_List'] = + this.iNPMLABGetPatientRADReportList; + data['INPM_LAB_GetPatientRadResults_List'] = + this.iNPMLABGetPatientRadResultsList; + data['INPM_Rad_GetPatientRadOrders_CVI_List'] = + this.iNPMRadGetPatientRadOrdersCVIList; + data['INPM_Rad_GetPatientRadOrders_List'] = + this.iNPMRadGetPatientRadOrdersList; + data['INPM_Rad_GetRadMedicalRecords_List'] = + this.iNPMRadGetRadMedicalRecordsList; + data['INP_GetPrescriptionDischarges_List'] = + this.iNPGetPrescriptionDischargesList; + data['INP_GetPrescriptionReport_List'] = this.iNPGetPrescriptionReportList; + data['IdentificationNo'] = this.identificationNo; + data['IsHomeMedicineDeliverySupported'] = + this.isHomeMedicineDeliverySupported; + data['IsInsertedOrUpdated'] = this.isInsertedOrUpdated; + data['IsMainAcoountEqualPatienID'] = this.isMainAcoountEqualPatienID; + data['IsPatientAlreadyAgreed'] = this.isPatientAlreadyAgreed; + data['IsPatientCallBackBlackList'] = this.isPatientCallBackBlackList; + data['IsPatientHaveFingerPrint'] = this.isPatientHaveFingerPrint; + data['IsPatientOnline'] = this.isPatientOnline; + data['IsPatientTokenRemoved'] = this.isPatientTokenRemoved; + data['IsPaused'] = this.isPaused; + data['IsProjectWorkingHours'] = this.isProjectWorkingHours; + data['IsStoreRateAllowed'] = this.isStoreRateAllowed; + data['IsStoreRateInserted'] = this.isStoreRateInserted; + data['IsStoreRateUpdated'] = this.isStoreRateUpdated; + data['LabRadUpdatedToRead'] = this.labRadUpdatedToRead; + data['LabReportUnreadNo'] = this.labReportUnreadNo; + data['LakumInquiryInformationObj'] = this.lakumInquiryInformationObj; + if (this.lakumInquiryInformationObjVersion != null) { + data['LakumInquiryInformationObjVersion'] = + this.lakumInquiryInformationObjVersion.toJson(); + } + data['LakumResponseList'] = this.lakumResponseList; + data['Laser_GetBodyPartsByCategoryList'] = + this.laserGetBodyPartsByCategoryList; + data['Laser_GetCategoriesList'] = this.laserGetCategoriesList; + data['List'] = this.list; + data['ListCount'] = this.listCount; + data['ListCountDeliverd'] = this.listCountDeliverd; + data['ListCountUnDeliverd'] = this.listCountUnDeliverd; + data['ListDeviceInfo'] = this.listDeviceInfo; + data['ListFamilyAppointments'] = this.listFamilyAppointments; + data['ListLabResultsByAppNo'] = this.listLabResultsByAppNo; + data['ListLakumInquiryInformationObj'] = + this.listLakumInquiryInformationObj; + data['ListOpinion_GetAllPeriod'] = this.listOpinionGetAllPeriod; + data['ListOpinion_GetAllServices'] = this.listOpinionGetAllServices; + data['ListOpinion_GetIsAgreeValue'] = this.listOpinionGetIsAgreeValue; + data['ListOpinion_GetOpinionLogin'] = this.listOpinionGetOpinionLogin; + data['ListOpinion_GetRequestedSerives'] = + this.listOpinionGetRequestedSerives; + data['ListOpinion_GetShareServicesDetails'] = + this.listOpinionGetShareServicesDetails; + data['ListOpinion_UserTerms'] = this.listOpinionUserTerms; + data['ListPLO'] = this.listPLO; + data['ListPLR'] = this.listPLR; + data['ListPLSR'] = this.listPLSR; + data['ListPRM'] = this.listPRM; + data['ListPatientFamilyFiles'] = this.listPatientFamilyFiles; + data['ListPatientFileInfo'] = this.listPatientFileInfo; + data['ListRAD'] = this.listRAD; + data['ListRADAPI'] = this.listRADAPI; + data['List_ActiveGetPrescriptionReportByPatientID'] = + this.listActiveGetPrescriptionReportByPatientID; + data['List_AppointmentsForDentalClinic'] = + this.listAppointmentsForDentalClinic; + data['List_BabyInfoResult'] = this.listBabyInfoResult; + data['List_CheckInsuranceCoverage'] = this.listCheckInsuranceCoverage; + data['List_CompanyClass'] = this.listCompanyClass; + data['List_ConsentMedicalReport'] = this.listConsentMedicalReport; + data['List_DentalAppointments'] = this.listDentalAppointments; + data['List_DeviceTokenIDByAppointmentNo'] = + this.listDeviceTokenIDByAppointmentNo; + data['List_DischargeDiagnosis'] = this.listDischargeDiagnosis; + data['List_DischargeMedicine'] = this.listDischargeMedicine; + data['List_DischargeSummary'] = this.listDischargeSummary; + data['List_DoctorResponse'] = this.listDoctorResponse; + data['List_DoneVaccines'] = this.listDoneVaccines; + data['List_EReferralResult'] = this.listEReferralResult; + data['List_EReferrals'] = this.listEReferrals; + data['List_GetAllPatients_LiveCare_Admin'] = + this.listGetAllPatientsLiveCareAdmin; + data['List_GetDataForExcel'] = this.listGetDataForExcel; + data['List_GetMainCountID'] = this.listGetMainCountID; + data['List_GetPrescriptionReportByPatientID'] = + this.listGetPrescriptionReportByPatientID; + data['List_GetSickLeave'] = this.listGetSickLeave; + data['List_HISInvoice'] = this.listHISInvoice; + data['List_HISInvoiceProcedures'] = this.listHISInvoiceProcedures; + data['List_InpatientInvoices'] = this.listInpatientInvoices; + data['List_InsuranceCheckList'] = this.listInsuranceCheckList; + data['List_InsuranceCompanies'] = this.listInsuranceCompanies; + data['List_InsuranceCompaniesGroup'] = this.listInsuranceCompaniesGroup; + data['List_InsuranceUpdateDetails'] = this.listInsuranceUpdateDetails; + data['List_InvoiceApprovalProcedureInfo'] = + this.listInvoiceApprovalProcedureInfo; + data['List_IsLastSatisfactionSurveyReviewedModel'] = + this.listIsLastSatisfactionSurveyReviewedModel; + data['List_LabOrderDetailsModel'] = this.listLabOrderDetailsModel; + data['List_MedicalReport'] = this.listMedicalReport; + data['List_MedicalReportApprovals'] = this.listMedicalReportApprovals; + data['List_MedicalReportStatus'] = this.listMedicalReportStatus; + data['List_MonthBloodPressureResult'] = this.listMonthBloodPressureResult; + data['List_MonthBloodPressureResultAverage'] = + this.listMonthBloodPressureResultAverage; + data['List_MonthDiabtecPatientResult'] = this.listMonthDiabtecPatientResult; + data['List_MonthDiabtectResultAverage'] = + this.listMonthDiabtectResultAverage; + data['List_MonthWeightMeasurementResult'] = + this.listMonthWeightMeasurementResult; + data['List_MonthWeightMeasurementResultAverage'] = + this.listMonthWeightMeasurementResultAverage; + data['List_OnlinePrescriptionResult'] = this.listOnlinePrescriptionResult; + data['List_OutPatientInvoices'] = this.listOutPatientInvoices; + data['List_PHRInvoice'] = this.listPHRInvoice; + data['List_PHRInvoiceItems'] = this.listPHRInvoiceItems; + data['List_PHRPaymentMethods'] = this.listPHRPaymentMethods; + data['List_PateintDetails'] = this.listPateintDetails; + data['List_PateintInformation'] = this.listPateintInformation; + data['List_PatientAdmissionInfo'] = this.listPatientAdmissionInfo; + data['List_PatientAdvanceBalanceAmount'] = + this.listPatientAdvanceBalanceAmount; + data['List_PatientCallBackLogs'] = this.listPatientCallBackLogs; + data['List_PatientCallBackToUpdateFromICServer'] = + this.listPatientCallBackToUpdateFromICServer; + data['List_PatientCount'] = this.listPatientCount; + data['List_PatientDashboard'] = this.listPatientDashboard; + data['List_PatientER_GetAdminClinicsModel'] = + this.listPatientERGetAdminClinicsModel; + data['List_PatientER_GetAdminProjectsModel'] = + this.listPatientERGetAdminProjectsModel; + data['List_PatientER_GetAllClinicsModel'] = + this.listPatientERGetAllClinicsModel; + data['List_PatientHISInvoices'] = this.listPatientHISInvoices; + data['List_PatientICProjects'] = this.listPatientICProjects; + data['List_PatientICProjectsByID'] = this.listPatientICProjectsByID; + data['List_PatientICProjectsTimings'] = this.listPatientICProjectsTimings; + data['List_PatientIDByUID'] = this.listPatientIDByUID; + data['List_PatientIDForSurveyResult'] = this.listPatientIDForSurveyResult; + data['List_PatientInfo'] = this.listPatientInfo; + data['List_PatientInfoForDDScreen'] = this.listPatientInfoForDDScreen; + data['List_PatientInfoForSickleaveReport'] = + this.listPatientInfoForSickleaveReport; + data['List_PatientInsuranceCard'] = this.listPatientInsuranceCard; + data['List_PatientInsuranceCardHistory'] = + this.listPatientInsuranceCardHistory; + data['List_PatientInsuranceDetails'] = this.listPatientInsuranceDetails; + data['List_PatientPHRInvoices'] = this.listPatientPHRInvoices; + data['List_PatientServicePoint'] = this.listPatientServicePoint; + data['List_PatientStatusCount'] = this.listPatientStatusCount; + data['List_Patient_ChatRequestMapModel'] = + this.listPatientChatRequestMapModel; + data['List_Patient_ChatRequestModel'] = this.listPatientChatRequestModel; + data['List_Patient_ChatRequestVCModel'] = + this.listPatientChatRequestVCModel; + data['List_PaymentMethods'] = this.listPaymentMethods; + data['List_PointServices'] = this.listPointServices; + data['List_PregnancyStagesInfo'] = this.listPregnancyStagesInfo; + data['List_ProjectAvgERWaitingTime'] = this.listProjectAvgERWaitingTime; + data['List_ProjectAvgERWaitingTimeHourly'] = + this.listProjectAvgERWaitingTimeHourly; + data['List_RadMedicalRecords'] = this.listRadMedicalRecords; + data['List_RadMedicalRecordsAPI'] = this.listRadMedicalRecordsAPI; + data['List_RadMedicalRecordsCVI'] = this.listRadMedicalRecordsCVI; + data['List_RadMedicalRecordsCVIAPI'] = this.listRadMedicalRecordsCVIAPI; + data['List_RadMedicalRecordsResults'] = this.listRadMedicalRecordsResults; + data['List_SickLeave'] = this.listSickLeave; + data['List_Transaction'] = this.listTransaction; + data['List_VideoConferenceSessions'] = this.listVideoConferenceSessions; + data['List_WeekBloodPressureResult'] = this.listWeekBloodPressureResult; + data['List_WeekBloodPressureResultAverage'] = + this.listWeekBloodPressureResultAverage; + data['List_WeekDiabtecPatientResult'] = this.listWeekDiabtecPatientResult; + data['List_WeekDiabtectResultAverage'] = this.listWeekDiabtectResultAverage; + data['List_WeekWeightMeasurementResult'] = + this.listWeekWeightMeasurementResult; + data['List_WeekWeightMeasurementResultAverage'] = + this.listWeekWeightMeasurementResultAverage; + data['List_YearBloodPressureResult'] = this.listYearBloodPressureResult; + data['List_YearBloodPressureResultAverage'] = + this.listYearBloodPressureResultAverage; + data['List_YearDiabtecPatientResult'] = this.listYearDiabtecPatientResult; + data['List_YearDiabtecResultAverage'] = this.listYearDiabtecResultAverage; + data['List_YearWeightMeasurementResult'] = + this.listYearWeightMeasurementResult; + data['List_YearWeightMeasurementResultAverage'] = + this.listYearWeightMeasurementResultAverage; + data['List_eInvoiceForDental'] = this.listEInvoiceForDental; + data['List_eInvoiceForOnlineCheckIn'] = this.listEInvoiceForOnlineCheckIn; + data['Med_GetActivitiesTransactionsStsList'] = + this.medGetActivitiesTransactionsStsList; + data['Med_GetAvgMonthTransactionsStsList'] = + this.medGetAvgMonthTransactionsStsList; + data['Med_GetAvgWeekTransactionsStsList'] = + this.medGetAvgWeekTransactionsStsList; + data['Med_GetCategoriesList'] = this.medGetCategoriesList; + data['Med_GetMonthActivitiesTransactionsStsList'] = + this.medGetMonthActivitiesTransactionsStsList; + data['Med_GetMonthStepsTransactionsStsList'] = + this.medGetMonthStepsTransactionsStsList; + data['Med_GetMonthTransactionsStsList'] = + this.medGetMonthTransactionsStsList; + data['Med_GetPatientLastRecordList'] = this.medGetPatientLastRecordList; + data['Med_GetSubCategoriesList'] = this.medGetSubCategoriesList; + data['Med_GetTransactionsAndActTransactionsResult'] = + this.medGetTransactionsAndActTransactionsResult; + data['Med_GetTransactionsList'] = this.medGetTransactionsList; + data['Med_GetWeekActivitiesTransactionsStsList'] = + this.medGetWeekActivitiesTransactionsStsList; + data['Med_GetWeekStepsTransactionsStsList'] = + this.medGetWeekStepsTransactionsStsList; + data['Med_GetWeekTransactionsStsList'] = this.medGetWeekTransactionsStsList; + data['Med_GetYearActivitiesTransactionsStsList'] = + this.medGetYearActivitiesTransactionsStsList; + data['Med_GetYearSleepTransactionsStsList'] = + this.medGetYearSleepTransactionsStsList; + data['Med_GetYearStepsTransactionsStsList'] = + this.medGetYearStepsTransactionsStsList; + data['Med_GetYearTransactionsStsList'] = this.medGetYearTransactionsStsList; + data['Med_InsertTransactionsOutputsList'] = + this.medInsertTransactionsOutputsList; + data['MedicalRecordImages'] = this.medicalRecordImages; + data['MedicalReportToRead'] = this.medicalReportToRead; + data['MedicalReportUnreadNo'] = this.medicalReportUnreadNo; + data['Missing_IDCardAttachment'] = this.missingIDCardAttachment; + data['Missing_InsuranceCardAttachment'] = + this.missingInsuranceCardAttachment; + data['Missing_MedicalReportAttachment'] = + this.missingMedicalReportAttachment; + data['Missing_OtherRelationship'] = this.missingOtherRelationship; + data['Missing_PatientContactNo'] = this.missingPatientContactNo; + data['Missing_PatientId'] = this.missingPatientId; + data['Missing_PatientIdentityNumber'] = this.missingPatientIdentityNumber; + data['Missing_PatientName'] = this.missingPatientName; + data['Missing_ReferralContactNo'] = this.missingReferralContactNo; + data['Missing_ReferralRelationship'] = this.missingReferralRelationship; + data['Missing_ReferralRequesterName'] = this.missingReferralRequesterName; + data['MobileNumber'] = this.mobileNumber; + data['NationalityNumber'] = this.nationalityNumber; + data['OnlineCheckInAppointments'] = this.onlineCheckInAppointments; + data['Opinion_UserAgreementContent'] = this.opinionUserAgreementContent; + data['OrderInsert'] = this.orderInsert; + data['PateintInfoForUpdateList'] = this.pateintInfoForUpdateList; + data['PateintUpatedList'] = this.pateintUpatedList; + data['PatientBirthdayCertificate'] = this.patientBirthdayCertificate; + data['PatientER_CMCRequestSummaryByProject'] = + this.patientERCMCRequestSummaryByProject; + data['PatientER_CMCRequestWithTotal'] = this.patientERCMCRequestWithTotal; + data['PatientER_CMC_GetAllServicesList'] = + this.patientERCMCGetAllServicesList; + data['PatientER_CMC_GetTransactionsForOrderList'] = + this.patientERCMCGetTransactionsForOrderList; + data['PatientER_Coordinates'] = this.patientERCoordinates; + data['PatientER_CountOrderList'] = this.patientERCountOrderList; + data['PatientER_CountsForApprovalOffice'] = + this.patientERCountsForApprovalOffice; + data['PatientER_DeleteOldCurrentDoctorsOutputsList'] = + this.patientERDeleteOldCurrentDoctorsOutputsList; + data['PatientER_Delivery_GetAllDeliverdOrderList'] = + this.patientERDeliveryGetAllDeliverdOrderList; + data['PatientER_Delivery_GetAllOrderList'] = + this.patientERDeliveryGetAllOrderList; + data['PatientER_Delivery_IsOrderInserted'] = + this.patientERDeliveryIsOrderInserted; + data['PatientER_Delivery_IsOrderUpdated'] = + this.patientERDeliveryIsOrderUpdated; + data['PatientER_Delivery_IsPausedChanged'] = + this.patientERDeliveryIsPausedChanged; + data['PatientER_Delivery_NextOrder'] = this.patientERDeliveryNextOrder; + data['PatientER_Delivery_OrderInsert'] = this.patientERDeliveryOrderInsert; + data['PatientER_Delivery_UpdateOrderStatus'] = + this.patientERDeliveryUpdateOrderStatus; + data['PatientER_DriverUpdate'] = this.patientERDriverUpdate; + data['PatientER_Exacart_CheckIsDispenseAccpetableList'] = + this.patientERExacartCheckIsDispenseAccpetableList; + data['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList'] = + this.patientERExacartGetDispenseQuantitiesByOrderIDList; + data['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList'] = + this.patientERExacartGetOrderDetailsByePharmacyOrderNoList; + data['PatientER_Exacart_GetOrderDetailsList'] = + this.patientERExacartGetOrderDetailsList; + data['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList'] = + this.patientERExacartGetTotalDispenseQuantitiesByPresNoList; + data['PatientER_Exacart_IsDispenseAdded'] = + this.patientERExacartIsDispenseAdded; + data['PatientER_Exacart_IsDispenseAddedList'] = + this.patientERExacartIsDispenseAddedList; + data['PatientER_Exacart_IsOrderCompleted'] = + this.patientERExacartIsOrderCompleted; + data['PatientER_GetAdminByProjectAndRoleList'] = + this.patientERGetAdminByProjectAndRoleList; + data['PatientER_GetAdminProjectsList'] = this.patientERGetAdminProjectsList; + data['PatientER_GetAllDriversList'] = this.patientERGetAllDriversList; + data['PatientER_GetAllNeedAproveStatusList'] = + this.patientERGetAllNeedAproveStatusList; + data['PatientER_GetAllPresOrdersStatusList'] = + this.patientERGetAllPresOrdersStatusList; + data['PatientER_GetAllProjectsList'] = this.patientERGetAllProjectsList; + data['PatientER_GetArchiveInformation_List'] = + this.patientERGetArchiveInformationList; + data['PatientER_GetAskDoctorTotalByDateFilterList'] = + this.patientERGetAskDoctorTotalByDateFilterList; + data['PatientER_GetBookScheduleConfigsList'] = + this.patientERGetBookScheduleConfigsList; + data['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList'] = + this.patientERGetClinicAndTimeAndEpisodeForAppointmentList; + data['PatientER_GetClinicAndTimeForDischargeList'] = + this.patientERGetClinicAndTimeForDischargeList; + data['PatientER_GetDashboardDataforApporvalSectionForAdminList'] = + this.patientERGetDashboardDataforApporvalSectionForAdminList; + data['PatientER_GetDashboardDataforApporvalSectionList'] = + this.patientERGetDashboardDataforApporvalSectionList; + data['PatientER_GetDashboardDataforHHCSectionForAdminList'] = + this.patientERGetDashboardDataforHHCSectionForAdminList; + data['PatientER_GetDashboardDataforHHCSectionList'] = + this.patientERGetDashboardDataforHHCSectionList; + data['PatientER_GetDashboardDataforPrescriptionSectionForAdminList'] = + this.patientERGetDashboardDataforPrescriptionSectionForAdminList; + data['PatientER_GetDashboardDataforPrescriptionSectionList'] = + this.patientERGetDashboardDataforPrescriptionSectionList; + data['PatientER_GetDoctorDashboardDataModelList'] = + this.patientERGetDoctorDashboardDataModelList; + data['PatientER_GetDriverLocationList'] = + this.patientERGetDriverLocationList; + data['PatientER_GetInsuranceCardRequestByDateFilterList'] = + this.patientERGetInsuranceCardRequestByDateFilterList; + data['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList'] = + this.patientERGetLiveCareSummaryBookedAppoinmentStatusList; + data['PatientER_GetLiveCareSummaryCovidList'] = + this.patientERGetLiveCareSummaryCovidList; + data['PatientER_GetLiveCareSummaryForCMCList'] = + this.patientERGetLiveCareSummaryForCMCList; + data['PatientER_GetLiveCareSummaryForHHCList'] = + this.patientERGetLiveCareSummaryForHHCList; + data['PatientER_GetLiveCareSummaryForHomeDeliveryList'] = + this.patientERGetLiveCareSummaryForHomeDeliveryList; + data['PatientER_GetLiveCareSummaryForInsuranceCardRequestList'] = + this.patientERGetLiveCareSummaryForInsuranceCardRequestList; + data['PatientER_GetLiveCareSummaryForNewFilesList'] = + this.patientERGetLiveCareSummaryForNewFilesList; + data['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList'] = + this.patientERGetLiveCareSummaryForOnlinePaymetRequestList; + data['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList'] = + this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; + data['PatientER_GetLiveCareSummaryForTrasnportationList'] = + this.patientERGetLiveCareSummaryForTrasnportationList; + data['PatientER_GetLiveCareSummaryLiveCareCountsList'] = + this.patientERGetLiveCareSummaryLiveCareCountsList; + data['PatientER_GetMedicalRequestTotalByDateFilterList'] = + this.patientERGetMedicalRequestTotalByDateFilterList; + data['PatientER_GetNearestPendingOrdersList'] = + this.patientERGetNearestPendingOrdersList; + data['PatientER_GetNeedAproveHistoryForOrderList'] = + this.patientERGetNeedAproveHistoryForOrderList; + data['PatientER_GetNeedAprovePendingOrdersList'] = + this.patientERGetNeedAprovePendingOrdersList; + data['PatientER_GetNeedAproveStatusStatisticsList'] = + this.patientERGetNeedAproveStatusStatisticsList; + data['PatientER_GetPatientAllPresOrdersList'] = + this.patientERGetPatientAllPresOrdersList; + data['PatientER_GetPendingPatientsCountList'] = + this.patientERGetPendingPatientsCountList; + data['PatientER_GetPresOrdersHistoryForAdminList'] = + this.patientERGetPresOrdersHistoryForAdminList; + data['PatientER_GetPresOrdersHistoryForOrderList'] = + this.patientERGetPresOrdersHistoryForOrderList; + data['PatientER_GetPresOrdersStatusStatisticsList'] = + this.patientERGetPresOrdersStatusStatisticsList; + data['PatientER_HHCRequest'] = this.patientERHHCRequest; + data['PatientER_HHCRequestSummaryByProject'] = + this.patientERHHCRequestSummaryByProject; + data['PatientER_HHCRequestWithTotal'] = this.patientERHHCRequestWithTotal; + data['PatientER_HHC_GetAllServicesList'] = + this.patientERHHCGetAllServicesList; + data['PatientER_HHC_GetTransactionsForOrderList'] = + this.patientERHHCGetTransactionsForOrderList; + data['PatientER_HomeDeliveryCounts'] = this.patientERHomeDeliveryCounts; + data['PatientER_InsertDriver'] = this.patientERInsertDriver; + data['PatientER_InsertNewCurrentDoctorsOutputsList'] = + this.patientERInsertNewCurrentDoctorsOutputsList; + data['PatientER_InsuranceStatusCountList'] = + this.patientERInsuranceStatusCountList; + data['PatientER_IsNearestProjectUpdated'] = + this.patientERIsNearestProjectUpdated; + data['PatientER_IsNeedAproveReturnedToQueue'] = + this.patientERIsNeedAproveReturnedToQueue; + data['PatientER_IsNeedAproveUpdated'] = this.patientERIsNeedAproveUpdated; + data['PatientER_IsOrderClientRequestUpdated'] = + this.patientERIsOrderClientRequestUpdated; + data['PatientER_IsOrderReturnedToQueue'] = + this.patientERIsOrderReturnedToQueue; + data['PatientER_IsPresOrderInserted'] = this.patientERIsPresOrderInserted; + data['PatientER_IsPresOrderUpdated'] = this.patientERIsPresOrderUpdated; + data['PatientER_IsProjectUpdated'] = this.patientERIsProjectUpdated; + data['PatientER_NotCompletedDetails'] = this.patientERNotCompletedDetails; + data['PatientER_PatientsCountByCallStatus'] = + this.patientERPatientsCountByCallStatus; + data['PatientER_PeakHourCounts'] = this.patientERPeakHourCounts; + data['PatientER_PresOrderInfo'] = this.patientERPresOrderInfo; + data['PatientER_PrescriptionCounts'] = this.patientERPrescriptionCounts; + data['PatientER_ProjectsContribution'] = this.patientERProjectsContribution; + data['PatientER_RRT_GetAllQuestionsList'] = + this.patientERRRTGetAllQuestionsList; + data['PatientER_RRT_GetAllTransportationMethodList'] = + this.patientERRRTGetAllTransportationMethodList; + data['PatientER_RRT_GetPickUpRequestByPresOrderIDList'] = + this.patientERRRTGetPickUpRequestByPresOrderIDList; + data['PatientER_RealRRT_GetAllServicesList'] = + this.patientERRealRRTGetAllServicesList; + data['PatientER_RealRRT_GetOrderDetailsList'] = + this.patientERRealRRTGetOrderDetailsList; + data['PatientER_RealRRT_GetTransactionsForOrderList'] = + this.patientERRealRRTGetTransactionsForOrderList; + data['PatientER_RealRRT_IsTransInserted'] = + this.patientERRealRRTIsTransInserted; + data['PatientER_RequestList'] = this.patientERRequestList; + data['PatientER_TransportationRequestWithTotal'] = + this.patientERTransportationRequestWithTotal; + data['PatientE_RealRRT_GetServicePriceList'] = + this.patientERealRRTGetServicePriceList; + data['PatientInfoByAdmissionNo_List'] = this.patientInfoByAdmissionNoList; + data['PatientMonitor_GetPatientHeartRate'] = + this.patientMonitorGetPatientHeartRate; + data['PatientNotServedCounts'] = this.patientNotServedCounts; + data['PatientPrescriptionList'] = this.patientPrescriptionList; + data['Patient_Allergies'] = this.patientAllergies; + data['Patient_CheckAppointmentValidationList'] = + this.patientCheckAppointmentValidationList; + data['Patient_LoginTokenList'] = this.patientLoginTokenList; + data['Patient_QRLoginInfoList'] = this.patientQRLoginInfoList; + data['Patient_SELECTDeviceIMEIbyIMEIList'] = + this.patientSELECTDeviceIMEIbyIMEIList; + data['PharmList'] = this.pharmList; + data['PrefLang'] = this.prefLang; + data['RadReportUnreadNo'] = this.radReportUnreadNo; + data['Rad_GetPatientRadOrdersForDental_List'] = + this.radGetPatientRadOrdersForDentalList; + data['ReferralNumber'] = this.referralNumber; + data['ReminderConfigurations'] = this.reminderConfigurations; + data['RequestNo'] = this.requestNo; + data['RowCount'] = this.rowCount; + data['ServicePrivilegeList'] = this.servicePrivilegeList; + data['ShareFamilyFileObj'] = this.shareFamilyFileObj; + data['Status'] = this.status; + data['SuccessCode'] = this.successCode; + data['SurveyRate'] = this.surveyRate; + data['SymptomChecker_ConditionList'] = this.symptomCheckerConditionList; + data['SymptomChecker_GetAllDefaultQuestionsList'] = + this.symptomCheckerGetAllDefaultQuestionsList; + data['SymptomChecker_GetBodyPartSymptomsList'] = + this.symptomCheckerGetBodyPartSymptomsList; + data['SymptomChecker_GetBodyPartsByCodeList'] = + this.symptomCheckerGetBodyPartsByCodeList; + data['SymptomChecker_GetBodyPartsList'] = + this.symptomCheckerGetBodyPartsList; + data['SymptomChecker_JsonResponseInString'] = + this.symptomCheckerJsonResponseInString; + data['TimerTime'] = this.timerTime; + data['TotalAdvanceBalanceAmount'] = this.totalAdvanceBalanceAmount; + data['TotalPatientsCount'] = this.totalPatientsCount; + data['TotalPendingApprovalCount'] = this.totalPendingApprovalCount; + data['TotalUnUsedCount'] = this.totalUnUsedCount; + data['TransactionNo'] = this.transactionNo; + data['UnReadCounts'] = this.unReadCounts; + data['UpdateStatus'] = this.updateStatus; + data['UserAgreementContent'] = this.userAgreementContent; + data['YahalaAccountNo'] = this.yahalaAccountNo; + data['check24HourComplaint'] = this.check24HourComplaint; + data['currency'] = this.currency; + data['message'] = this.message; + data['patientID'] = this.patientID; + data['returnValue'] = this.returnValue; + data['returnValueStr'] = this.returnValueStr; + data['statusCode'] = this.statusCode; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart new file mode 100644 index 00000000..1abfaf7f --- /dev/null +++ b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart @@ -0,0 +1,155 @@ +import 'PointsAmountPerYear.dart'; +import 'PointsDetails.dart'; + +class LakumInquiryInformationObjVersion { + int accountNumber; + String accountStatus; + String barCode; + int consumedPoints; + String consumedPointsAmount; + List consumedPointsAmountPerYear; + List consumedPointsDetails; + String createdDate; + int expiredPoints; + String expiryDate; + int gainedPoints; + List gainedPointsAmountPerYear; + List gainedPointsDetails; + String lakumMessageStatus; + String memberName; + String memberUniversalId; + String mobileNumber; + int pointsBalance; + int pointsBalanceAmount; + int pointsWillBeExpired; + String prefLang; + int statusCode; + int transferPoints; + List transferPointsAmountPerYear; + List transferPointsDetails; + double waitingPoints; + int loyalityAmount; + int loyalityPoints; + int purchaseRate; + + LakumInquiryInformationObjVersion( + {this.accountNumber, + this.accountStatus, + this.barCode, + this.consumedPoints, + this.consumedPointsAmount, + this.consumedPointsAmountPerYear, + this.consumedPointsDetails, + this.createdDate, + this.expiredPoints, + this.expiryDate, + this.gainedPoints, + this.gainedPointsAmountPerYear, + this.gainedPointsDetails, + this.lakumMessageStatus, + this.memberName, + this.memberUniversalId, + this.mobileNumber, + this.pointsBalance, + this.pointsBalanceAmount, + this.pointsWillBeExpired, + this.prefLang, + this.statusCode, + this.transferPoints, + this.transferPointsAmountPerYear, + this.transferPointsDetails, + this.waitingPoints, + this.loyalityAmount, + this.loyalityPoints, + this.purchaseRate}); + + LakumInquiryInformationObjVersion.fromJson(Map json) { + accountNumber = json['AccountNumber']; + accountStatus = json['AccountStatus']; + barCode = json['BarCode']; + consumedPoints = json['ConsumedPoints']; + consumedPointsAmount = json['ConsumedPointsAmount']; + consumedPointsAmountPerYear = json['ConsumedPointsAmountPerYear']; + if (json['ConsumedPointsDetails'] != null) { + consumedPointsDetails = new List(); + json['ConsumedPointsDetails'].forEach((v) { + consumedPointsDetails.add(v); + }); + } + createdDate = json['CreatedDate']; + expiredPoints = json['ExpiredPoints']; + expiryDate = json['ExpiryDate']; + gainedPoints = json['GainedPoints']; + gainedPointsAmountPerYear = json['GainedPointsAmountPerYear']; + if (json['GainedPointsDetails'] != null) { + gainedPointsDetails = new List(); + json['GainedPointsDetails'].forEach((v) { + gainedPointsDetails.add(v); + }); + } + lakumMessageStatus = json['LakumMessageStatus']; + memberName = json['MemberName']; + memberUniversalId = json['MemberUniversalId']; + mobileNumber = json['MobileNumber']; + pointsBalance = json['PointsBalance']; + pointsBalanceAmount = json['PointsBalanceAmount']; + pointsWillBeExpired = json['PointsWillBeExpired']; + prefLang = json['PrefLang']; + statusCode = json['StatusCode']; + transferPoints = json['TransferPoints']; + transferPointsAmountPerYear = json['TransferPointsAmountPerYear']; + if (json['TransferPointsDetails'] != null) { + transferPointsDetails = new List(); + json['TransferPointsDetails'].forEach((v) { + transferPointsDetails.add(v); + }); + } + waitingPoints = json['WaitingPoints']; + loyalityAmount = json['loyalityAmount']; + loyalityPoints = json['loyalityPoints']; + purchaseRate = json['purchaseRate']; + } + + Map toJson() { + final Map data = new Map(); + data['AccountNumber'] = this.accountNumber; + data['AccountStatus'] = this.accountStatus; + data['BarCode'] = this.barCode; + data['ConsumedPoints'] = this.consumedPoints; + data['ConsumedPointsAmount'] = this.consumedPointsAmount; + data['ConsumedPointsAmountPerYear'] = this.consumedPointsAmountPerYear; + if (this.consumedPointsDetails != null) { + data['ConsumedPointsDetails'] = + this.consumedPointsDetails.map((v) => v).toList(); + } + data['CreatedDate'] = this.createdDate; + data['ExpiredPoints'] = this.expiredPoints; + data['ExpiryDate'] = this.expiryDate; + data['GainedPoints'] = this.gainedPoints; + data['GainedPointsAmountPerYear'] = this.gainedPointsAmountPerYear; + if (this.gainedPointsDetails != null) { + data['GainedPointsDetails'] = + this.gainedPointsDetails.map((v) => v).toList(); + } + data['LakumMessageStatus'] = this.lakumMessageStatus; + data['MemberName'] = this.memberName; + data['MemberUniversalId'] = this.memberUniversalId; + data['MobileNumber'] = this.mobileNumber; + data['PointsBalance'] = this.pointsBalance; + data['PointsBalanceAmount'] = this.pointsBalanceAmount; + data['PointsWillBeExpired'] = this.pointsWillBeExpired; + data['PrefLang'] = this.prefLang; + data['StatusCode'] = this.statusCode; + data['TransferPoints'] = this.transferPoints; + data['TransferPointsAmountPerYear'] = this.transferPointsAmountPerYear; + if (this.transferPointsDetails != null) { + data['TransferPointsDetails'] = + this.transferPointsDetails.map((v) => v).toList(); + } + data['WaitingPoints'] = this.waitingPoints; + data['loyalityAmount'] = this.loyalityAmount; + data['loyalityPoints'] = this.loyalityPoints; + data['purchaseRate'] = this.purchaseRate; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/ListUserAgreement.dart b/lib/core/model/pharmacies/ListUserAgreement.dart new file mode 100644 index 00000000..4237e304 --- /dev/null +++ b/lib/core/model/pharmacies/ListUserAgreement.dart @@ -0,0 +1,28 @@ +class ListUserAgreement { + String userAgreementLAKUM; + String userAgreementLAKUMn; + String userAgreementTxt; + String userAgreementTxtn; + + ListUserAgreement( + {this.userAgreementLAKUM, + this.userAgreementLAKUMn, + this.userAgreementTxt, + this.userAgreementTxtn}); + + ListUserAgreement.fromJson(Map json) { + userAgreementLAKUM = json['UserAgreementLAKUM']; + userAgreementLAKUMn = json['UserAgreementLAKUMn']; + userAgreementTxt = json['UserAgreementTxt']; + userAgreementTxtn = json['UserAgreementTxtn']; + } + + Map toJson() { + final Map data = new Map(); + data['UserAgreementLAKUM'] = this.userAgreementLAKUM; + data['UserAgreementLAKUMn'] = this.userAgreementLAKUMn; + data['UserAgreementTxt'] = this.userAgreementTxt; + data['UserAgreementTxtn'] = this.userAgreementTxtn; + return data; + } +} diff --git a/lib/core/model/pharmacies/PharmacyProduct.dart b/lib/core/model/pharmacies/PharmacyProduct.dart index cd461ae5..c472cb4c 100644 --- a/lib/core/model/pharmacies/PharmacyProduct.dart +++ b/lib/core/model/pharmacies/PharmacyProduct.dart @@ -1,149 +1,538 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Specifications.dart'; + import 'PharmacyImageObject.dart'; import 'Reviews.dart'; class PharmacyProduct { String id; + bool visibleIndividually; String name; String namen; String shortDescription; + String shortDescriptionn; String fullDescription; String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + String metaKeywords; + String metaDescription; + String metaTitle; + bool allowCustomerReviews; int approvedRatingSum; + int notApprovedRatingSum; int approvedTotalReviews; + int notApprovedTotalReviews; String sku; bool isRx; + bool prescriptionRequired; String rxMessage; String rxMessagen; + String manufacturerPartNumber; + String gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + int maxNumberOfDownloads; + String downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + int recurringCycleLength; + int recurringTotalCycles; + bool isRental; + int rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + double additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + int manageInventoryMethodId; int stockQuantity; String stockAvailability; String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + int minStockQuantity; + int notifyAdminForQuantityBelow; bool allowBackInStockSubscriptions; int orderMinimumQuantity; int orderMaximumQuantity; + String allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + String preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; double price; double oldPrice; + double productCost; + String specialPrice; + String specialPriceStartDateTimeUtc; + String specialPriceEndDateTimeUtc; + bool customerEntersPrice; + double minimumCustomerEnteredPrice; + double maximumCustomerEnteredPrice; + bool basepriceEnabled; + double basepriceAmount; + double basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; String discountName; String discountNamen; + String discountDescription; + String discountDescriptionn; String discountPercentage; + String currency; + String currencyn; + double weight; + double length; + double width; + double height; + String availableStartDateTimeUtc; + String availableEndDateTimeUtc; int displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + int parentGroupedProductId; + List roleIds; List discountIds; + List storeIds; + List manufacturerIds; List reviews; List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + int vendorId; + String seName; + PharmacyProduct( {this.id, + this.visibleIndividually, this.name, this.namen, this.shortDescription, + this.shortDescriptionn, this.fullDescription, this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, this.approvedRatingSum, + this.notApprovedRatingSum, this.approvedTotalReviews, + this.notApprovedTotalReviews, this.sku, this.isRx, + this.prescriptionRequired, this.rxMessage, this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, this.stockQuantity, this.stockAvailability, this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, this.allowBackInStockSubscriptions, this.orderMinimumQuantity, this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, this.price, this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, this.discountName, this.discountNamen, + this.discountDescription, + this.discountDescriptionn, this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, this.discountIds, + this.storeIds, + this.manufacturerIds, this.reviews, - this.images}); + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); PharmacyProduct.fromJson(Map json) { - try { - id = json['id']; - name = json['name']; - namen = json['namen']; - shortDescription = json['short_description']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - approvedRatingSum = json['approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - price = json['price']; - oldPrice = json['old_price']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountPercentage = json['discount_percentage']; - displayOrder = json['display_order']; - if (json['discount_ids'] != null) { - discountIds = new List(); - json['discount_ids'].forEach((v) { - discountIds.add(v); - }); - } - if (json['reviews'] != null) { - reviews = new List(); - json['reviews'].forEach((v) { - reviews.add(new Reviews.fromJson(v)); - }); - } - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new PharmacyImageObject.fromJson(v)); - }); - } - } catch (e) { - print(e); + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + if (json['role_ids'] != null) { + roleIds = new List(); + json['role_ids'].forEach((v) { + roleIds.add(v); + }); + } + if (json['discount_ids'] != null) { + discountIds = new List(); + json['discount_ids'].forEach((v) { + discountIds.add(v); + }); + } + if (json['store_ids'] != null) { + storeIds = new List(); + json['store_ids'].forEach((v) { + storeIds.add(v); + }); + } + if (json['manufacturer_ids'] != null) { + manufacturerIds = new List(); + json['manufacturer_ids'].forEach((v) { + manufacturerIds.add(v); + }); + } + if (json['reviews'] != null) { + reviews = new List(); + json['reviews'].forEach((v) { + reviews.add(new Reviews.fromJson(v)); + }); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new PharmacyImageObject.fromJson(v)); + }); + } + if (json['attributes'] != null) { + attributes = new List(); + json['attributes'].forEach((v) { + attributes.add(v); + }); + } + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); } + if (json['associated_product_ids'] != null) { + associatedProductIds = new List(); + json['associated_product_ids'].forEach((v) { + associatedProductIds.add(v); + }); + } + if (json['tags'] != null) { + tags = new List(); + json['tags'].forEach((v) { + tags.add(v); + }); + } + vendorId = json['vendor_id']; + seName = json['se_name']; } Map toJson() { final Map data = new Map(); data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; data['name'] = this.name; data['namen'] = this.namen; data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; data['full_description'] = this.fullDescription; data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; data['sku'] = this.sku; data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; data['rx_message'] = this.rxMessage; data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; data['stock_quantity'] = this.stockQuantity; data['stock_availability'] = this.stockAvailability; data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; data['allow_back_in_stock_subscriptions'] = this.allowBackInStockSubscriptions; data['order_minimum_quantity'] = this.orderMinimumQuantity; data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; data['price'] = this.price; data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; data['discount_name'] = this.discountName; data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; data['display_order'] = this.displayOrder; - if (this.discountIds != String) { + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + if (this.roleIds != null) { + data['role_ids'] = this.roleIds.map((v) => v).toList(); + } + if (this.discountIds != null) { data['discount_ids'] = this.discountIds.map((v) => v).toList(); } - if (this.reviews != String) { + if (this.storeIds != null) { + data['store_ids'] = this.storeIds.map((v) => v).toList(); + } + data['manufacturer_ids'] = this.manufacturerIds; + if (this.reviews != null) { data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); } - if (this.images != String) { + if (this.images != null) { data['images'] = this.images.map((v) => v.toJson()).toList(); } + if (this.attributes != null) { + data['attributes'] = this.attributes.map((v) => v).toList(); + } + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + if (this.associatedProductIds != null) { + data['associated_product_ids'] = + this.associatedProductIds.map((v) => v).toList(); + } + if (this.tags != null) { + data['tags'] = this.tags.map((v) => v).toList(); + } + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; return data; } } diff --git a/lib/core/model/pharmacies/PointsAmountPerMonth.dart b/lib/core/model/pharmacies/PointsAmountPerMonth.dart new file mode 100644 index 00000000..71cf3498 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerMonth.dart @@ -0,0 +1,42 @@ +import 'PointsAmountPerday.dart'; + +class PointsAmountPerMonth { + double amountPerMonth; + String month; + int monthNumber; + List pointsAmountPerday; + double pointsPerMonth; + + PointsAmountPerMonth( + {this.amountPerMonth, + this.month, + this.monthNumber, + this.pointsAmountPerday, + this.pointsPerMonth}); + + PointsAmountPerMonth.fromJson(Map json) { + amountPerMonth = json['AmountPerMonth']; + month = json['Month']; + monthNumber = json['MonthNumber']; + if (json['PointsAmountPerday'] != null) { + pointsAmountPerday = new List(); + json['PointsAmountPerday'].forEach((v) { + pointsAmountPerday.add(new PointsAmountPerday.fromJson(v)); + }); + } + pointsPerMonth = json['PointsPerMonth']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerMonth'] = this.amountPerMonth; + data['Month'] = this.month; + data['MonthNumber'] = this.monthNumber; + if (this.pointsAmountPerday != null) { + data['PointsAmountPerday'] = + this.pointsAmountPerday.map((v) => v.toJson()).toList(); + } + data['PointsPerMonth'] = this.pointsPerMonth; + return data; + } +} diff --git a/lib/core/model/pharmacies/PointsAmountPerYear.dart b/lib/core/model/pharmacies/PointsAmountPerYear.dart new file mode 100644 index 00000000..130fbcd4 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerYear.dart @@ -0,0 +1,38 @@ +import 'PointsAmountPerMonth.dart'; + +class PointsAmountPerYear { + double amountPerYear; + List pointsAmountPerMonth; + double pointsPerYear; + int year; + + PointsAmountPerYear( + {this.amountPerYear, + this.pointsAmountPerMonth, + this.pointsPerYear, + this.year}); + + PointsAmountPerYear.fromJson(Map json) { + amountPerYear = json['AmountPerYear']; + if (json['PointsAmountPerMonth'] != null) { + pointsAmountPerMonth = new List(); + json['PointsAmountPerMonth'].forEach((v) { + pointsAmountPerMonth.add(new PointsAmountPerMonth.fromJson(v)); + }); + } + pointsPerYear = json['PointsPerYear']; + year = json['Year']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerYear'] = this.amountPerYear; + if (this.pointsAmountPerMonth != null) { + data['PointsAmountPerMonth'] = + this.pointsAmountPerMonth.map((v) => v.toJson()).toList(); + } + data['PointsPerYear'] = this.pointsPerYear; + data['Year'] = this.year; + return data; + } +} diff --git a/lib/core/model/pharmacies/PointsAmountPerday.dart b/lib/core/model/pharmacies/PointsAmountPerday.dart new file mode 100644 index 00000000..e78e87b7 --- /dev/null +++ b/lib/core/model/pharmacies/PointsAmountPerday.dart @@ -0,0 +1,42 @@ +import 'PointsDetails.dart'; + +class PointsAmountPerday { + double amountPerDay; + String day; + List pointsDetails; + double pointsPerDay; + String transationDate; + + PointsAmountPerday( + {this.amountPerDay, + this.day, + this.pointsDetails, + this.pointsPerDay, + this.transationDate}); + + PointsAmountPerday.fromJson(Map json) { + amountPerDay = json['AmountPerDay']; + day = json['Day']; + if (json['PointsDetails'] != null) { + pointsDetails = new List(); + json['PointsDetails'].forEach((v) { + pointsDetails.add(new PointsDetails.fromJson(v)); + }); + } + pointsPerDay = json['PointsPerDay']; + transationDate = json['TransationDate']; + } + + Map toJson() { + final Map data = new Map(); + data['AmountPerDay'] = this.amountPerDay; + data['Day'] = this.day; + if (this.pointsDetails != null) { + data['PointsDetails'] = + this.pointsDetails.map((v) => v.toJson()).toList(); + } + data['PointsPerDay'] = this.pointsPerDay; + data['TransationDate'] = this.transationDate; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/PointsDetails.dart b/lib/core/model/pharmacies/PointsDetails.dart new file mode 100644 index 00000000..54bbe2d1 --- /dev/null +++ b/lib/core/model/pharmacies/PointsDetails.dart @@ -0,0 +1,52 @@ +class PointsDetails { + int accNumber; + String accountStatus; + double amount; + int lineItemNo; + String operationType; + double points; + double purchasePoints; + int subTransactionType; + String subTransactionTypeDescription; + String transactionDate; + + PointsDetails( + {this.accNumber, + this.accountStatus, + this.amount, + this.lineItemNo, + this.operationType, + this.points, + this.purchasePoints, + this.subTransactionType, + this.subTransactionTypeDescription, + this.transactionDate}); + + PointsDetails.fromJson(Map json) { + accNumber = json['AccNumber']; + accountStatus = json['AccountStatus']; + amount = json['Amount']; + lineItemNo = json['LineItemNo']; + operationType = json['OperationType']; + points = json['Points']; + purchasePoints = json['PurchasePoints']; + subTransactionType = json['SubTransactionType']; + subTransactionTypeDescription = json['SubTransactionTypeDescription']; + transactionDate = json['TransactionDate']; + } + + Map toJson() { + final Map data = new Map(); + data['AccNumber'] = this.accNumber; + data['AccountStatus'] = this.accountStatus; + data['Amount'] = this.amount; + data['LineItemNo'] = this.lineItemNo; + data['OperationType'] = this.operationType; + data['Points'] = this.points; + data['PurchasePoints'] = this.purchasePoints; + data['SubTransactionType'] = this.subTransactionType; + data['SubTransactionTypeDescription'] = this.subTransactionTypeDescription; + data['TransactionDate'] = this.transactionDate; + return data; + } +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/ShippingOption.dart b/lib/core/model/pharmacies/ShippingOption.dart new file mode 100644 index 00000000..309e1f4f --- /dev/null +++ b/lib/core/model/pharmacies/ShippingOption.dart @@ -0,0 +1,98 @@ +class ShippingOption { + String shippingRateComputationMethodSystemName; + double rate; + double rateVat; + double rateVatPercent; + String name; + String namen; + String description; + String descriptionn; + bool allowShippingSunday; + bool allowShippingMonday; + bool allowShippingTuesday; + bool allowShippingWednesday; + bool allowShippingThursday; + bool allowShippingFriday; + bool allowShippingSaturday; + String allowShippingTime1From; + String allowShippingTime1To; + String allowShippingTime2From; + String allowShippingTime2To; + String allowShippingNote; + String allowShippingNoten; + + ShippingOption( + {this.shippingRateComputationMethodSystemName, + this.rate, + this.rateVat, + this.rateVatPercent, + this.name, + this.namen, + this.description, + this.descriptionn, + this.allowShippingSunday, + this.allowShippingMonday, + this.allowShippingTuesday, + this.allowShippingWednesday, + this.allowShippingThursday, + this.allowShippingFriday, + this.allowShippingSaturday, + this.allowShippingTime1From, + this.allowShippingTime1To, + this.allowShippingTime2From, + this.allowShippingTime2To, + this.allowShippingNote, + this.allowShippingNoten}); + + ShippingOption.fromJson(Map json) { + shippingRateComputationMethodSystemName = + json['shipping_rate_computation_method_system_name']; + rate = json['rate']; + rateVat = json['rate_vat']; + rateVatPercent = json['rate_vat_percent']; + name = json['name']; + namen = json['namen']; + description = json['description']; + descriptionn = json['descriptionn']; + allowShippingSunday = json['AllowShippingSunday']; + allowShippingMonday = json['AllowShippingMonday']; + allowShippingTuesday = json['AllowShippingTuesday']; + allowShippingWednesday = json['AllowShippingWednesday']; + allowShippingThursday = json['AllowShippingThursday']; + allowShippingFriday = json['AllowShippingFriday']; + allowShippingSaturday = json['AllowShippingSaturday']; + allowShippingTime1From = json['AllowShippingTime1From']; + allowShippingTime1To = json['AllowShippingTime1To']; + allowShippingTime2From = json['AllowShippingTime2From']; + allowShippingTime2To = json['AllowShippingTime2To']; + allowShippingNote = json['AllowShippingNote']; + allowShippingNoten = json['AllowShippingNoten']; + } + + Map toJson() { + final Map data = new Map(); + data['shipping_rate_computation_method_system_name'] = + this.shippingRateComputationMethodSystemName; + data['rate'] = this.rate; + data['rate_vat'] = this.rateVat; + data['rate_vat_percent'] = this.rateVatPercent; + data['name'] = this.name; + data['namen'] = this.namen; + data['description'] = this.description; + data['descriptionn'] = this.descriptionn; + data['AllowShippingSunday'] = this.allowShippingSunday; + data['AllowShippingMonday'] = this.allowShippingMonday; + data['AllowShippingTuesday'] = this.allowShippingTuesday; + data['AllowShippingWednesday'] = this.allowShippingWednesday; + data['AllowShippingThursday'] = this.allowShippingThursday; + data['AllowShippingFriday'] = this.allowShippingFriday; + data['AllowShippingSaturday'] = this.allowShippingSaturday; + data['AllowShippingTime1From'] = this.allowShippingTime1From; + data['AllowShippingTime1To'] = this.allowShippingTime1To; + data['AllowShippingTime2From'] = this.allowShippingTime2From; + data['AllowShippingTime2To'] = this.allowShippingTime2To; + data['AllowShippingNote'] = this.allowShippingNote; + data['AllowShippingNoten'] = this.allowShippingNoten; + return data; + } +} diff --git a/lib/core/model/pharmacies/ShoppingCart.dart b/lib/core/model/pharmacies/ShoppingCart.dart new file mode 100644 index 00000000..f965203a --- /dev/null +++ b/lib/core/model/pharmacies/ShoppingCart.dart @@ -0,0 +1,115 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Customer.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; + +class ShoppingCart { + int languageId; + String id; + // List productAttributes; + double customerEnteredPrice; + int quantity; + String discountAmountInclTax; + String subtotal; + String subtotalWithVat; + String subtotalVatAmount; + String subtotalVatRate; + String currency; + String currencyn; + String rentalStartDateUtc; + String rentalEndDateUtc; + String createdOnUtc; + String updatedOnUtc; + String shoppingCartType; + int productId; + PharmacyProduct product; + int customerId; + Customer customer; + + ShoppingCart( + {this.languageId, + this.id, + // this.productAttributes, + this.customerEnteredPrice, + this.quantity, + this.discountAmountInclTax, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.currency, + this.currencyn, + this.rentalStartDateUtc, + this.rentalEndDateUtc, + this.createdOnUtc, + this.updatedOnUtc, + this.shoppingCartType, + this.productId, + this.product, + this.customerId, + this.customer}); + + ShoppingCart.fromJson(Map json) { + languageId = json['language_id']; + id = json['id']; + /*if (json['product_attributes'] != null) { + productAttributes = new List(); + json['product_attributes'].forEach((v) { + productAttributes.add(new Null.fromJson(v)); + }); + }*/ + customerEnteredPrice = json['customer_entered_price']; + quantity = json['quantity']; + discountAmountInclTax = json['discount_amount_incl_tax']; + subtotal = json['subtotal']; + subtotalWithVat = json['subtotal_with_vat']; + subtotalVatAmount = json['subtotal_vat_amount']; + subtotalVatRate = json['subtotal_vat_rate']; + currency = json['currency']; + currencyn = json['currencyn']; + rentalStartDateUtc = json['rental_start_date_utc']; + rentalEndDateUtc = json['rental_end_date_utc']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + shoppingCartType = json['shopping_cart_type']; + productId = json['product_id']; + product = json['product'] != null + ? new PharmacyProduct.fromJson(json['product']) + : null; + customerId = json['customer_id']; + customer = json['customer'] != null + ? new Customer.fromJson(json['customer']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['id'] = this.id; + /*if (this.productAttributes != null) { + data['product_attributes'] = + this.productAttributes.map((v) => v.toJson()).toList(); + }*/ + data['customer_entered_price'] = this.customerEnteredPrice; + data['quantity'] = this.quantity; + data['discount_amount_incl_tax'] = this.discountAmountInclTax; + data['subtotal'] = this.subtotal; + data['subtotal_with_vat'] = this.subtotalWithVat; + data['subtotal_vat_amount'] = this.subtotalVatAmount; + data['subtotal_vat_rate'] = this.subtotalVatRate; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['rental_start_date_utc'] = this.rentalStartDateUtc; + data['rental_end_date_utc'] = this.rentalEndDateUtc; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['shopping_cart_type'] = this.shoppingCartType; + data['product_id'] = this.productId; + if (this.product != null) { + data['product'] = this.product.toJson(); + } + data['customer_id'] = this.customerId; + if (this.customer != null) { + data['customer'] = this.customer.toJson(); + } + return data; + } +} diff --git a/lib/core/model/pharmacies/ShoppingCartResponse.dart b/lib/core/model/pharmacies/ShoppingCartResponse.dart new file mode 100644 index 00000000..96b751ae --- /dev/null +++ b/lib/core/model/pharmacies/ShoppingCartResponse.dart @@ -0,0 +1,55 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:flutter/material.dart'; + +class ShoppingCartResponse with ChangeNotifier { + int itemCount; + int quantityCount; + double subtotal; + double subtotalWithVat; + double subtotalVatAmount; + double subtotalVatRate; + List shoppingCarts; + + ShoppingCartResponse( + {this.itemCount, + this.quantityCount, + this.subtotal, + this.subtotalWithVat, + this.subtotalVatAmount, + this.subtotalVatRate, + this.shoppingCarts}); + + void updateShoppingCard() { + notifyListeners(); + } + + ShoppingCartResponse.fromJson(Map json) { + itemCount = json['item_count']; + quantityCount = json['quantity_count']; + subtotal = json['subtotal']; + subtotalWithVat = json['subtotal_with_vat']; + subtotalVatAmount = json['subtotal_vat_amount']; + subtotalVatRate = json['subtotal_vat_rate']; + if (json['shopping_carts'] != null) { + shoppingCarts = new List(); + json['shopping_carts'].forEach((v) { + shoppingCarts.add(new ShoppingCart.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['item_count'] = this.itemCount; + data['quantity_count'] = this.quantityCount; + data['subtotal'] = this.subtotal; + data['subtotal_with_vat'] = this.subtotalWithVat; + data['subtotal_vat_amount'] = this.subtotalVatAmount; + data['subtotal_vat_rate'] = this.subtotalVatRate; + if (this.shoppingCarts != null) { + data['shopping_carts'] = + this.shoppingCarts.map((v) => v.toJson()).toList(); + } + return data; + } +} diff --git a/lib/core/model/pharmacies/Specifications.dart b/lib/core/model/pharmacies/Specifications.dart new file mode 100644 index 00000000..f227de69 --- /dev/null +++ b/lib/core/model/pharmacies/Specifications.dart @@ -0,0 +1,36 @@ +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/pharmacies/payment-checkout-data.dart b/lib/core/model/pharmacies/payment-checkout-data.dart new file mode 100644 index 00000000..dd9e0e54 --- /dev/null +++ b/lib/core/model/pharmacies/payment-checkout-data.dart @@ -0,0 +1,21 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:flutter/material.dart'; + +import 'ShippingOption.dart'; + +class PaymentCheckoutData with ChangeNotifier{ + Addresses address; + PaymentOption paymentOption; + LacumAccountInformation lacumInformation; + bool cartDataVisible; + ShippingOption shippingOption; + int usedLakumPoints; + + PaymentCheckoutData({this.address, this.paymentOption, this.lacumInformation, this.cartDataVisible = false, this.shippingOption, this.usedLakumPoints = 0}); + + void updateData() { + notifyListeners(); + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 696489c6..528266f6 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -111,10 +111,14 @@ class BaseAppClient { } else if (parsed['Result'] == 'OK') { onSuccess(parsed, statusCode); } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); - logout(); + if (parsed != null) { + onSuccess(parsed, statusCode); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); + logout(); + } } } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { @@ -123,9 +127,13 @@ class BaseAppClient { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode); } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); + if (parsed['message'] != null) { + onFailure(parsed['message'] ?? parsed['message'], statusCode); + } else { + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); + } } } } @@ -152,10 +160,13 @@ class BaseAppClient { print("URL : $url"); if (await Utils.checkConnection()) { - final response = await http.get(url.trim(), headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - },); + final response = await http.get( + url.trim(), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + ); final int statusCode = response.statusCode; print("statusCode :$statusCode"); diff --git a/lib/core/service/parmacyModule/lacum-registration-service.dart b/lib/core/service/parmacyModule/lacum-registration-service.dart new file mode 100644 index 00000000..b3e64e69 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-registration-service.dart @@ -0,0 +1,50 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; + +import 'lacum-service.dart'; + +class LacumRegistrationService extends LacumService{ + + ListUserAgreement listUserAgreement; + + Future getLacumAccountInformationById(String patientIdentificationNo) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getUserTermsAndConditionsForEPharmcy() async { + hasError = false; + super.error = ""; + + Map body = Map(); + + try { + await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, + onSuccess: (response, statusCode) async { + listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-service.dart b/lib/core/service/parmacyModule/lacum-service.dart new file mode 100644 index 00000000..31544d56 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-service.dart @@ -0,0 +1,132 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class LacumService extends BaseService{ + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + String successMsg = ''; + + LacumAccountInformation lacumInformation; + LacumAccountInformation lacumGroupInformation; + + Future getLacumAccountInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getLacumGroupInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumGroupInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeAccountActivate() async { + hasError = false; + super.error = ""; + int yahalaAccountNo = lacumInformation.yahalaAccountNo; + + Map body = Map(); + body['CreatedBy'] = 103; + body['YahalaAccountNumber'] = yahalaAccountNo; + + try { + await baseAppClient.post(LACUM_ACCOUNT_ACTIVATE, + onSuccess: (response, statusCode) async { + // lacumInformation = LacumAccountInformation.fromJson(response); + // lacumInformation.yahalaAccountNo = yahalaAccountNo; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeAccountDeactivate() async { + hasError = false; + super.error = ""; + int yahalaAccountNo = lacumInformation.yahalaAccountNo; + + Map body = Map(); + body['CreatedBy'] = 103; + body['YahalaAccountNumber'] = yahalaAccountNo; + + try { + await baseAppClient.post(LACUM_ACCOUNT_DEACTIVATE, + onSuccess: (response, statusCode) async { + // lacumInformation = LacumAccountInformation.fromJson(response); + // lacumInformation.yahalaAccountNo = yahalaAccountNo; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future createLakumAccount(String name, String phone, int accountID, String patientIdentificationID, var prefLang) async { + hasError = false; + super.error = ""; + if(prefLang == null){ + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); + prefLang = languageID == 'ar' ? 1 : 2; + } + + + Map body = Map(); + body['PrefLang'] = prefLang; + body['AccountID'] = accountID; + body['FullName'] = name; + body['MobileNo'] = phone; + body['PatientIdentificationID'] = patientIdentificationID; + body['PatientID'] = user.patientID; + + try { + await baseAppClient.post(CREATE_LAKUM_ACCOUNT, + onSuccess: (response, statusCode) async { + successMsg = LacumAccountInformation.fromJson(response).message; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-transfer-service.dart b/lib/core/service/parmacyModule/lacum-transfer-service.dart new file mode 100644 index 00000000..b15696f9 --- /dev/null +++ b/lib/core/service/parmacyModule/lacum-transfer-service.dart @@ -0,0 +1,57 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; + +import 'lacum-service.dart'; + +class LacumTransferService extends LacumService{ + LacumAccountInformation lacumReceiverInformation; + + Future getLacumGroupDataBuAccountId(String accountId) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = accountId; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumReceiverInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + return null; + }, body: body); + } catch (error) { + throw error; + } + } + + Future transferYaHalaLoyaltyPoints(String points) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['MobileNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; + body['UserName'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; + body['YaHalaSenderAccNumber'] = lacumGroupInformation.lakumInquiryInformationObjVersion.accountNumber; + body['Yahala_IdentificationNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberUniversalId; + body['YaHalaPointsToTransfer'] = points; + body['YaHalaReceiverAccNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.accountNumber; + body['YaHalaReceiverMobileNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.mobileNumber; + body['YaHalaReceiverName'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName; + + try { + await baseAppClient.post(TRANSFER_YAHALA_LOYALITY_POINTS, + onSuccess: (response, statusCode) async { + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/order-preview-service.dart b/lib/core/service/parmacyModule/order-preview-service.dart index 1f3f9ddd..5648ff6d 100644 --- a/lib/core/service/parmacyModule/order-preview-service.dart +++ b/lib/core/service/parmacyModule/order-preview-service.dart @@ -1,29 +1,248 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -class OrderPreviewService extends BaseService{ +class OrderPreviewService extends BaseService { bool isFinished = true; bool hasError = false; String errorMsg = ''; List addresses = List(); + LacumAccountInformation lacumInformation; + LacumAccountInformation lacumGroupInformation; - Future getBannerListList() async { + Future getAddresses() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = {'fields': 'addresses'}; hasError = false; try { - await baseAppClient.get(GET_CUSTOMERS_ADDRESSES, + await baseAppClient.get("$GET_CUSTOMERS_ADDRESSES$customerId", onSuccess: (dynamic response, int statusCode) { - addresses.clear(); - response['customers'][0]['addresses'].forEach((item) { - addresses.add(Addresses.fromJson(item)); - }); + addresses.clear(); + response['customers'][0]['addresses'].forEach((item) { + addresses.add(Addresses.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future getShippingOption(Addresses selectedAddress) async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = Map(); + dynamic localRes; + hasError = false; + try { + await baseAppClient.get("$GET_SHIPPING_OPTIONS$customerId/${selectedAddress.id}", + onSuccess: (dynamic response, int statusCode) { + localRes = response['shipping_option'][0]; }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; - }); + }, queryParams: queryParams); } catch (error) { throw error; } + return Future.value(localRes); + } + + Future getShoppingCart() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + Map queryParams = {'shopping_cart_type': '1'}; + dynamic localRes; + hasError = false; + try { + await baseAppClient.get("$GET_SHOPPING_CART$customerId", + onSuccess: (dynamic response, int statusCode) { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + return Future.value(localRes); + } + + Future changeProductQuantity( + String productId, ShoppingCart product) async { + hasError = false; + super.error = ""; + dynamic localRes; + Map choppingCartObject = Map(); + choppingCartObject['id'] = product.id; + choppingCartObject['quantity'] = product.quantity; + choppingCartObject['shopping_cart_type'] = "1"; + choppingCartObject['product_id'] = product.productId; + choppingCartObject['customer_id'] = product.customerId; + + Map body = Map(); + body["shopping_cart_item"] = choppingCartObject; + + await baseAppClient.post("$GET_SHOPPING_CART$productId", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + + return Future.value(localRes); + } + + Future deleteProduct(String productId) async { + hasError = false; + super.error = ""; + dynamic localRes; + + Map body = Map(); + + await baseAppClient.post("$DELETE_SHOPPING_CART$productId", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + + return Future.value(localRes); + } + + Future deleteShoppingCart() async { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + hasError = false; + super.error = ""; + dynamic localRes; + + await baseAppClient.get("$DELETE_SHOPPING_CART_ALL$customerId/ShoppingCart", + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); + + return Future.value(localRes); + } + + Future getLacumAccountInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + + try { + await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, + onSuccess: (response, statusCode) async { + lacumInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future getLacumGroupInformation() async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['IdentificationNo'] = user.patientIdentificationNo; + body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; + + try { + await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, + onSuccess: (response, statusCode) async { + lacumGroupInformation = LacumAccountInformation.fromJson(response); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + Future makeOrder(PaymentCheckoutData paymentCheckoutData, List shoppingCarts) async { + paymentCheckoutData.address.isChecked = true; + hasError = false; + super.error = ""; + + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + Map orderBody = Map(); + orderBody['rx_attachments'] = ""; + orderBody['customer_language_id'] = languageID == 'ar' ? 1 : 2; + orderBody['billing_address'] = paymentCheckoutData.address; + orderBody['pick_up_in_store'] = false; + orderBody['payment_method_system_name'] = "Payments.PayFort"; + orderBody['shipping_method'] = languageID == 'ar' ? paymentCheckoutData.shippingOption.namen : paymentCheckoutData.shippingOption.name ; + orderBody['shipping_rate_computation_method_system_name'] = paymentCheckoutData.shippingOption.shippingRateComputationMethodSystemName; + orderBody['customer_id'] = customerId; + orderBody['custom_values_xml'] = "PaymentOption:${getPaymentOptionName(paymentCheckoutData.paymentOption)}"; + orderBody['shippingOption'] = paymentCheckoutData.shippingOption; + orderBody['shipping_address'] = paymentCheckoutData.address; + orderBody['lakum_amount'] = paymentCheckoutData.usedLakumPoints; + + List> itemsList = List(); + shoppingCarts.forEach((item) { + Map orderItemsBody = Map(); + orderItemsBody['product_id'] = item.product.id; + orderItemsBody['quantity'] = item.quantity; + itemsList.add(orderItemsBody); + }); + orderBody['order_items'] = itemsList; + + Map body = Map(); + body['order'] = orderBody; + + try { + await baseAppClient.post(ORDER_SHOPPING_CART, + onSuccess: (response, statusCode) async { + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + + String getPaymentOptionName(PaymentOption paymentOption) { + switch (paymentOption.index) { + case 0: + return "MADA"; + break; + case 1: + return "SADAD"; + break; + case 2: + return "VISA"; + break; + case 3: + return "MASTERCARD"; + break; + case 4: + return "INSTALLMENT"; + break; + default: + return ""; + } } -} \ No newline at end of file +} diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart index 8584e140..df1da4d7 100644 --- a/lib/core/service/parmacyModule/parmacy_module_service.dart +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -4,8 +4,10 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; class PharmacyModuleService extends BaseService { + final AppSharedPreferences sharedPref = AppSharedPreferences(); bool isFinished = true; bool hasError = false; String errorMsg = ''; @@ -15,6 +17,56 @@ class PharmacyModuleService extends BaseService { List bestSellerProducts = List(); List lastVisitedProducts = List(); + Future makeVerifyCustomer() async { + var data = await sharedPref.getObject(USER_PROFILE); + Map queryParams = {'FileNumber': data['PatientID'].toString()}; + hasError = false; + try { + await baseAppClient.get(PHARMACY_VERIFY_CUSTOMER, + onSuccess: (dynamic response, int statusCode) { + if (response['UserName'] != null) { + sharedPref.setString(PHARMACY_CUSTOMER_ID, response['CustomerId'].toString()); + print(response); + } else { + createUser(); + } + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + + Future createUser() async { + var data = await sharedPref.getObject(USER_PROFILE); + var languageID = await sharedPref.getString(APP_LANGUAGE); + Map queryParams = { + 'Phone': data['MobileNumber'], + 'Email': data['EmailAddress'], + 'FileNumber': data['PatientID'].toString(), + 'Language': languageID.toString(), + 'Gender': data['Gender'].toString(), + 'FirstName': data['FirstName'], + 'LastName': data['LastName'], + 'LanguageId': languageID.toString(), + 'CountryCode': data['ZipCode'], + }; + hasError = false; + try { + await baseAppClient.get(PHARMACY_CREATE_CUSTOMER, + onSuccess: (dynamic response, int statusCode) { + if (!response['IsRegistered']) {} + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, queryParams: queryParams); + } catch (error) { + throw error; + } + } + Future getBannerListList() async { hasError = false; try { @@ -40,7 +92,10 @@ class PharmacyModuleService extends BaseService { onSuccess: (dynamic response, int statusCode) { manufacturerList.clear(); response['manufacturer'].forEach((item) { - manufacturerList.add(Manufacturer.fromJson(item)); + Manufacturer manufacturer = Manufacturer.fromJson(item); + if(manufacturer.image != null){ + manufacturerList.add(Manufacturer.fromJson(item)); + } }); }, onFailure: (String error, int statusCode) { hasError = true; @@ -81,14 +136,14 @@ class PharmacyModuleService extends BaseService { try { await baseAppClient.get("$GET_PHARMACY_PRODUCTs_BY_IDS$lastVisited", onSuccess: (dynamic response, int statusCode) { - lastVisitedProducts.clear(); - response['products'].forEach((item) { - lastVisitedProducts.add(PharmacyProduct.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); + lastVisitedProducts.clear(); + response['products'].forEach((item) { + lastVisitedProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); } catch (error) { throw error; } diff --git a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart index 00f4819b..06295188 100644 --- a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart @@ -1,3 +1,11 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShippingOption.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/parmacyModule/order-preview-service.dart'; import '../../../locator.dart'; @@ -5,4 +13,183 @@ import '../base_view_model.dart'; class OrderPreviewViewModel extends BaseViewModel { OrderPreviewService _orderService = locator(); + + List get addresses => _orderService.addresses; + LacumAccountInformation get lacumInformation => + _orderService.lacumInformation; + ShoppingCartResponse cartResponse = ShoppingCartResponse(); + PaymentCheckoutData paymentCheckoutData = PaymentCheckoutData(); + double totalAdditionalShippingCharge = 0; + + Future getOrderPreviewData() async { + setState(ViewState.Busy); + await _orderService.getAddresses(); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + getShoppingCart(); + } + } + + getShoppingCart() async { + setState(ViewState.Busy); + await _orderService.getShoppingCart().then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + if (paymentCheckoutData != null) { + paymentCheckoutData.cartDataVisible = true; + } + setState(ViewState.Idle); + } + } + + changeProductQuantity(ShoppingCart product) async { + setState(ViewState.Busy); + await _orderService.changeProductQuantity(product.id, product).then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + deleteProduct(ShoppingCart product) async { + setState(ViewState.Busy); + await _orderService.deleteProduct(product.id).then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + deleteShoppingCart() async { + setState(ViewState.Busy); + await _orderService.deleteShoppingCart().then((res) { + _handleGetShoppingCartResponse(res); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + _handleGetShoppingCartResponse(Map res) { + totalAdditionalShippingCharge = 0; + if (res == null) { + error = "response is null"; + setState(ViewState.Error); + return; + } + print(res); + cartResponse.itemCount = res["item_count"]; + cartResponse.quantityCount = res["quantity_count"]; + cartResponse.subtotal = res["subtotal"]; + cartResponse.subtotalWithVat = res["subtotal_with_vat"]; + cartResponse.subtotalVatAmount = res["subtotal_vat_amount"]; + cartResponse.subtotalVatRate = res["subtotal_vat_rate"]; + cartResponse.shoppingCarts = List(); + res["shopping_carts"].forEach((item) { + ShoppingCart shoppingCart = ShoppingCart.fromJson(item); + cartResponse.shoppingCarts.add(shoppingCart); + totalAdditionalShippingCharge += shoppingCart.product.additionalShippingCharge; + }); + cartResponse.updateShoppingCard(); + } + + String getPaymentOptionImage(PaymentOption paymentOption) { + String assetFile = "assets/images/pharmacy_module/payment/"; + switch (paymentOption.index) { + case 0: + return "${assetFile}mada.png"; + break; + case 1: + return "${assetFile}sadad.png"; + break; + case 2: + return "${assetFile}visa.png"; + break; + case 3: + return "${assetFile}mastercard.png"; + break; + case 4: + return "${assetFile}installment.png"; + break; + default: + return ""; + } + } + + String getPaymentOptionName(PaymentOption paymentOption) { + return _orderService.getPaymentOptionName(paymentOption); + } + + getInformationsByAddress() async { + await getLacumAccountInformation(); + await getShippingOption(); + } + + getLacumAccountInformation() async { + setState(ViewState.Busy); + await _orderService.getLacumAccountInformation(); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + getLacumGroupData(); + } + } + + Future getLacumGroupData() async { + setState(ViewState.Busy); + await _orderService.getLacumGroupInformation(); + paymentCheckoutData.lacumInformation = _orderService.lacumGroupInformation; + paymentCheckoutData.usedLakumPoints = paymentCheckoutData.lacumInformation.lakumInquiryInformationObjVersion.pointsBalanceAmount; + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + getShippingOption() async { + setState(ViewState.Busy); + await _orderService.getShippingOption(paymentCheckoutData.address).then((res) { + paymentCheckoutData.shippingOption = ShippingOption.fromJson(res); + paymentCheckoutData.updateData(); + }); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future makeOrder() async { + setState(ViewState.Busy); + await _orderService.makeOrder(paymentCheckoutData, cartResponse.shoppingCarts); + if (_orderService.hasError) { + error = _orderService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } } + +enum PaymentOption { meda, sadad, visa, mastercard, installments } diff --git a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart new file mode 100644 index 00000000..47315707 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart @@ -0,0 +1,58 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-registration-service.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; + +import '../../../locator.dart'; +import 'lacum-viewmodel.dart'; + +class LacumRegistrationViewModel extends LacumViewModel { + LacumRegistrationService _lacumService = locator(); + + ListUserAgreement get listUserAgreement => _lacumService.listUserAgreement; + + Future checkLacumAccountActivation(String patientIdentificationNo) async { + setState(ViewState.Busy); + await _lacumService.getLacumAccountInformationById(patientIdentificationNo); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + if(_lacumService.lacumInformation.yahalaAccountNo != 0){ + error = "The account has already been activated"; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + } + + Future getUserTermsAndConditionsForEPharmcy() async { + setState(ViewState.Busy); + await _lacumService.getUserTermsAndConditionsForEPharmcy(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future createNewLakumAccount(String name, String phone, String identificationNo, int languageId) async { + setState(ViewState.Busy); + await _lacumService.createLakumAccount(name, phone, 0, identificationNo, languageId); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + +} diff --git a/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart new file mode 100644 index 00000000..cd19a40f --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart @@ -0,0 +1,42 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; + +import '../../../locator.dart'; +import 'lacum-viewmodel.dart'; + +class LacumTranferViewModel extends LacumViewModel { + LacumTransferService _lacumService = locator(); + + LacumAccountInformation get lacumReceiverInformation => + _lacumService.lacumReceiverInformation; + + Future getLacumGroupDataBuAccountId(String accountId) async { + setState(ViewState.Busy); + await _lacumService.getLacumGroupDataBuAccountId(accountId); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future transferYaHalaLoyaltyPoints(String points) async { + setState(ViewState.Busy); + await _lacumService.transferYaHalaLoyaltyPoints(points); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + + setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ + _lacumService.lacumInformation = lacumInformation; + _lacumService.lacumGroupInformation = lacumGroupInformation; + } +} diff --git a/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart b/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart new file mode 100644 index 00000000..ba8d70d9 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart @@ -0,0 +1,111 @@ +import 'dart:typed_data'; + +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-service.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'dart:async'; +import 'dart:convert' as convert; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class LacumViewModel extends BaseViewModel { + LacumService _lacumService = locator(); + + LacumAccountInformation get lacumInformation => + _lacumService.lacumInformation; + + LacumAccountInformation get lacumGroupInformation => + _lacumService.lacumGroupInformation; + + Future getLacumData() async { + await getLacumAccountData(); + getLacumGroupData(); + } + + Future getLacumAccountData() async { + setState(ViewState.Busy); + await _lacumService.getLacumAccountInformation(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future getLacumGroupData() async { + setState(ViewState.Busy); + await _lacumService.getLacumGroupInformation(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + Future makeAccountActivate() async { + setState(ViewState.Busy); + await _lacumService.makeAccountActivate(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Active"; + getLacumAccountData(); + } + } + + Future makeAccountDeactivate() async { + setState(ViewState.Busy); + await _lacumService.makeAccountDeactivate(); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + } else { + lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Cancelled"; + getLacumAccountData(); + } + } + + Future createLakumAccount(String name, String phone) async { + setState(ViewState.Busy); + await _lacumService.createLakumAccount(name, phone, lacumInformation.yahalaAccountNo, lacumInformation.identificationNo, null); + if (_lacumService.hasError) { + error = _lacumService.error; + setState(ViewState.Error); + return 404; + } else { + setState(ViewState.Idle); + return 200; + } + } + + String formatCreatedDateToString() { + DateTime createdDate = DateUtil.convertStringToDate( + lacumGroupInformation.lakumInquiryInformationObjVersion.createdDate); + return DateUtil.getFormattedDate(createdDate, "MMM dd,yyyy"); + } + + Uint8List convertBase64ToBarCodeImage() { + try { + final _byteImage = convert.base64Decode( + lacumGroupInformation.lakumInquiryInformationObjVersion.barCode); + return _byteImage; + } catch (e) { + print(e); + return null; + } + } + + setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ + _lacumService.lacumInformation = lacumInformation; + _lacumService.lacumGroupInformation = lacumGroupInformation; + } + + clearLakumGroupData(){ + _lacumService.lacumGroupInformation = null; + } +} diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart index f8c574f7..f6ed8408 100644 --- a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; @@ -22,12 +23,19 @@ class PharmacyModuleViewModel extends BaseViewModel { Future getPharmacyHomeData() async { setState(ViewState.Busy); - await _pharmacyService.getBannerListList(); + await _pharmacyService.makeVerifyCustomer(); + // here must call getShoppingCard() if (_pharmacyService.hasError) { error = _pharmacyService.error; setState(ViewState.Error); } else { - _getTopManufacturerList(); + await _pharmacyService.getBannerListList(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + _getTopManufacturerList(); + } } } @@ -47,6 +55,7 @@ class PharmacyModuleViewModel extends BaseViewModel { error = _pharmacyService.error; setState(ViewState.Error); } else { + setState(ViewState.Idle); _getBestSellerProducts(); } } @@ -70,4 +79,18 @@ class PharmacyModuleViewModel extends BaseViewModel { setState(ViewState.Idle); } } + + Future checkUserIsActivated() async { + if (authenticatedUserObject.isLogin) { + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + if (customerId != null) { + return true; + } else { + return false; + } + } else { + // go to login page + return false; + } + } } diff --git a/lib/locator.dart b/lib/locator.dart index a7352b47..a12adb3a 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -42,6 +42,9 @@ import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; +import 'core/service/parmacyModule/lacum-registration-service.dart'; +import 'core/service/parmacyModule/lacum-service.dart'; +import 'core/service/parmacyModule/lacum-transfer-service.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -82,6 +85,9 @@ import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; import 'core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; +import 'core/viewModels/pharmacyModule/lacum-viewmodel.dart'; import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; @@ -142,7 +148,9 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); - + locator.registerLazySingleton(() => LacumService()); + locator.registerLazySingleton(() => LacumTransferService()); + locator.registerLazySingleton(() => LacumRegistrationService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -193,5 +201,8 @@ void setupLocator() { locator.registerFactory(() => PharmacyModuleViewModel()); locator.registerFactory(() => OrderPreviewViewModel()); + locator.registerFactory(() => LacumViewModel()); + locator.registerFactory(() => LacumTranferViewModel()); + locator.registerFactory(() => LacumRegistrationViewModel()); } diff --git a/lib/models/id-name-pair.dart b/lib/models/id-name-pair.dart new file mode 100644 index 00000000..00336572 --- /dev/null +++ b/lib/models/id-name-pair.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class IdNamePair with ChangeNotifier{ + var id; + var name; + + IdNamePair(this.id, this.name); + + void updateData() { + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/pages/pharmacies/screens/address-select-page.dart b/lib/pages/pharmacies/screens/address-select-page.dart new file mode 100644 index 00000000..6c39ba3f --- /dev/null +++ b/lib/pages/pharmacies/screens/address-select-page.dart @@ -0,0 +1,34 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class AddressSelectPageTest extends StatelessWidget { + final List addresses; + + AddressSelectPageTest(this.addresses); + + @override + Widget build(BuildContext context) { + return AppScaffold( + title: "test", + isShowAppBar: true, + isShowDecPage: false, + body: Column( + children: [ + Container( + child: RaisedButton( + onPressed: () => {Navigator.pop(context, addresses[0])}, + child: new Text( + "Set address", + style: new TextStyle(color: Colors.white, fontSize: 14), + ), + color: Colors.blueAccent, + disabledColor: Colors.blueAccent, + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart new file mode 100644 index 00000000..2ea9aa7c --- /dev/null +++ b/lib/pages/pharmacies/screens/cart-order-page.dart @@ -0,0 +1,354 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-preview.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderItem.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class CartOrderPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = + AppBarWidget("Shopping Cart", null, true); + final height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + + return BaseView( + onModelReady: (model) => model.getOrderPreviewData(), + builder: (_, model, wi) => ChangeNotifierProvider.value( + value: model.cartResponse, + child: AppScaffold( + title: "Shopping Cart", + isShowAppBar: true, + isShowDecPage: false, + baseViewModel: model, + appBarWidget: appBarWidget, + backgroundColor: Colors.white, + body: !(model.cartResponse.shoppingCarts == null || + model.cartResponse.shoppingCarts.length == 0) + ? Container( + height: height * 0.85, + width: double.infinity, + child: Consumer( + builder: (ctx, cart, _) => Container( + child: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureIconButton( + TranslationBase.of(context).deleteAllItems, + Icon( + Icons.delete_outline_sharp, + color: Colors.grey.shade700, + ), + onTap: () => {model.deleteShoppingCart()}, + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Container( + child: Column( + children: [ + ...List.generate( + cart.shoppingCarts != null + ? cart.shoppingCarts.length + : 0, + (index) => ProductOrderItem( + cart.shoppingCarts[index], () { + print(cart.shoppingCarts[index] + .quantity); + model.changeProductQuantity( + cart.shoppingCarts[index]); + }, + () => model.deleteProduct( + cart.shoppingCarts[index]))) + ], + ), + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 2, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + "Subtotal", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + Texts( + "SAR ${(cart.subtotal).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + "VAT (15%)", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + Texts( + "SAR ${(cart.subtotalVatAmount).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + TranslationBase.of(context).total, + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + Texts( + "SAR ${(cart.subtotal).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Image.asset( + "assets/images/pharmacy_module/payment_image.png", + width: mediaQuery.size.width - 20, + height: 30.0, + fit: BoxFit.scaleDown, + ) + ], + ), + ), + ), + ), + ), + ) + : Container(), + bottomSheet: Container( + height: height * 0.15, + color: Colors.white, + child: OrderBottomWidget(model.addresses, height), + ), + ), + ), + ); + } +} + +class OrderBottomWidget extends StatefulWidget { + final List addresses; + final double height; + + OrderBottomWidget(this.addresses, this.height); + + @override + _OrderBottomWidgetState createState() => _OrderBottomWidgetState(); +} + +class _OrderBottomWidgetState extends State { + bool isAgree = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0), + child: Consumer( + builder: (ctx, cart, _) => !(cart.shoppingCarts == null || + cart.shoppingCarts.length == 0) + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Container( + height: widget.height * 0.070, + color: Color(0xffe6ffe0), + padding: EdgeInsets.symmetric(horizontal: 4), + child: Expanded( + child: Row( + children: [ + InkWell( + onTap: () { + setState(() { + isAgree = !isAgree; + }); + }, + child: Container( + width: 25.0, + height: widget.height * 0.070, + decoration: new BoxDecoration( + color: !isAgree ? Color(0xffeeeeee) : Colors.green, + shape: BoxShape.circle, + ), + child: !isAgree + ? null + : Padding( + padding: const EdgeInsets.all(0.0), + child: Icon( + Icons.check, + color: Colors.white, + size: 25, + ), + ), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 4), + margin: const EdgeInsets.symmetric(vertical: 4), + child: Texts( + "I agree with the terms of service and I adhere to them unconditionally", + fontSize: 13, + color: Colors.grey.shade800, + fontWeight: FontWeight.normal, + ), + ), + ), + Container( + child: Icon( + Icons.info, + size: 25, + color: Color(0xff005aff), + ), + ), + ], + ), + ), + ), + Container( + height: widget.height * 0.065, + margin: EdgeInsets.symmetric(vertical: 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.symmetric( + horizontal: 0, vertical: 4), + child: Row( + children: [ + Texts( + "SAR ${(cart.subtotal).toStringAsFixed(2)}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4), + child: Texts( + "(inclusive VAT)", + fontSize: 8, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Texts( + "${cart.quantityCount} item(s)", + fontSize: 10, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ], + ), + RaisedButton( + onPressed: isAgree + ? () => { + Navigator.push( + context, + FadePage( + page: OrderPreviewPage( + widget.addresses))) + } + : null, + child: new Text( + "CHECK OUT", + style: new TextStyle( + color: isAgree + ? Colors.white + : Colors.grey.shade300, + fontSize: 14), + ), + color: Color(0xff005aff), + disabledColor: Color(0xff005aff), + ), + /* SecondaryButton( + label: "CHECK OUT", + color: Colors.blueAccent, + textColor: Colors.white, + onTap: (() { + Navigator.push( + context, FadePage(page: OrderPreviewPage(widget.addresses))); + }), + disabled: isAgree ? false : true, + )*/ + ], + ), + ) + ], + ) + : Container(), + )); + } +} diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart new file mode 100644 index 00000000..262eed28 --- /dev/null +++ b/lib/pages/pharmacies/screens/cart-order-preview.dart @@ -0,0 +1,815 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/address-select-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/payment-method-select-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderPreviewItem.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter/scheduler.dart'; + +class OrderPreviewPage extends StatelessWidget { + final List addresses; + + OrderPreviewPage(this.addresses); + + @override + Widget build(BuildContext context) { + PreferredSizeWidget appBarWidget = AppBarWidget("Check out", null, true); + final mediaQuery = MediaQuery.of(context); + final height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + + return BaseView( + onModelReady: (model) => model.getShoppingCart(), + builder: (_, model, wi) => ChangeNotifierProvider.value( + value: model.paymentCheckoutData, + child: AppScaffold( + title: "Check out", + isShowAppBar: true, + isShowDecPage: false, + appBarWidget: appBarWidget, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + height: height * 0.90, + child: SingleChildScrollView( + child: Container( + color: Color(0xFFF1F1F1), + child: Column( + children: [ + SelectAddressWidget(model, addresses), + SizedBox( + height: 10, + ), + SelectPaymentOptionWidget(model), + SizedBox( + height: 10, + ), + Consumer( + builder: (ctx, paymentData, _) => + paymentData.lacumInformation != null + ? Container( + child: Column( + children: [ + LakumWidget(model), + SizedBox( + height: 10, + ), + ], + ), + ) + : Container()), + Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).reviewOrder, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ...List.generate( + model.cartResponse.shoppingCarts != null + ? model.cartResponse.shoppingCarts.length + : 0, + (index) => ProductOrderPreviewItem( + model.cartResponse.shoppingCarts[index]), + ), + ], + ), + ), + Container( + width: double.infinity, + padding: EdgeInsets.all(8), + child: model.cartResponse.subtotal != null + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context) + .orderSummary, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + "Subtotal", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + Texts( + "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + "Shipping", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + Texts( + "SAR ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + "VAT (15%)", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + Texts( + "SAR ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts( + TranslationBase.of(context).total, + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + Texts( + "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ], + ), + SizedBox( + height: 10, + ), + ], + ) + : Container(), + ) + ], + ), + ), + ), + ), + bottomSheet: Container( + height: height * 0.10, + color: Colors.white, + child: PaymentBottomWidget(model), + ), + ), + )); + } +} + +class SelectAddressWidget extends StatefulWidget { + final OrderPreviewViewModel model; + final List addresses; + + SelectAddressWidget(this.model, this.addresses); + + @override + _SelectAddressWidgetState createState() => _SelectAddressWidgetState(); +} + +class _SelectAddressWidgetState extends State { + Addresses address; + + _navigateToAddressPage() { + Navigator.push( + context, FadePage(page: AddressSelectPageTest(widget.addresses))) + .then((result) { + address = result; + widget.model.paymentCheckoutData.address = address; + widget.model.getInformationsByAddress(); + /* setState(() { + if (result != null) { + address = result; + widget.model.paymentCheckoutData.address = address; + widget.model.getInformationsByAddress(); + } + })*/ + }); + } + + @override + void initState() { + if (widget.model.paymentCheckoutData.address != null) { + address = widget.model.paymentCheckoutData.address; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (ctx, paymentData, _) => Container( + color: Colors.white, + child: address == null + ? InkWell( + onTap: () => {_navigateToAddressPage()}, + child: Container( + margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/ic_shipping_address.png", + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + Expanded( + child: Container( + padding: + EdgeInsets.symmetric(vertical: 0, horizontal: 6), + child: Texts( + TranslationBase.of(context).selectAddress, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xff0000ff), + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 20, + color: Colors.grey.shade400, + ), + ], + ), + ), + ) + : Container( + child: Container( + margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/ic_shipping_mark.png", + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 0, horizontal: 6), + child: Texts( + TranslationBase.of(context).shippingAddress, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + InkWell( + onTap: () => {_navigateToAddressPage()}, + child: Texts( + TranslationBase.of(context).changeAddress, + fontSize: 12, + fontWeight: FontWeight.normal, + color: Color(0xff0000ff), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Texts( + "${address.firstName} ${address.lastName}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Texts( + "${address.address1} ${address.address2} ${address.address2},, ${address.city}, ${address.country} ${address.zipPostalCode}", + fontSize: 12, + fontWeight: FontWeight.normal, + color: Colors.grey.shade500, + ), + ), + Row( + children: [ + Container( + margin: const EdgeInsets.only(right: 8), + child: Icon( + Icons.phone, + size: 20, + color: Colors.black, + ), + ), + Texts( + "${address.phoneNumber}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ], + ), + Container( + margin: EdgeInsets.symmetric(vertical: 8), + child: SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + ), + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/ic_shipping_truck.png", + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + Container( + padding: EdgeInsets.symmetric( + vertical: 0, horizontal: 6), + child: Texts( + "SHIP BY:", + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + Container( + child: Image.asset( + paymentData.shippingOption + .shippingRateComputationMethodSystemName == + "Shipping.FixedOrByWeight" + ? "assets/images/pharmacy_module/payment/hmg_shipping_logo.png" + : "assets/images/pharmacy_module/payment/aramex_shipping_logo.png", + fit: BoxFit.contain, + ), + margin: EdgeInsets.symmetric(horizontal: 8), + ), + ], + ), + ], + ), + ), + ), // ic_shipping_mark.png + ), + ); + } +} + +class SelectPaymentOptionWidget extends StatefulWidget { + final OrderPreviewViewModel model; + + SelectPaymentOptionWidget(this.model); + + @override + _SelectPaymentOptionWidgetState createState() => + _SelectPaymentOptionWidgetState(); +} + +class _SelectPaymentOptionWidgetState extends State { + PaymentOption paymentOption; + + _navigateToPaymentOption() { + Navigator.push(context, FadePage(page: PaymentMethodSelectPage())) + .then((result) => { + setState(() { + if (result != null) { + paymentOption = result; + widget.model.paymentCheckoutData.paymentOption = + paymentOption; + widget.model.paymentCheckoutData.updateData(); + } + }) + }); + } + + @override + void initState() { + if (widget.model.paymentCheckoutData.paymentOption != null) { + paymentOption = widget.model.paymentCheckoutData.paymentOption; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: paymentOption == null + ? InkWell( + onTap: () => {_navigateToPaymentOption()}, + child: Container( + margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/ic_payment_option.png", + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + Expanded( + child: Container( + padding: + EdgeInsets.symmetric(vertical: 0, horizontal: 6), + child: Texts( + TranslationBase.of(context).selectPaymentOption, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xff0000ff), + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 20, + color: Colors.grey.shade400, + ), + ], + ), + ), + ) + : Container( + margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/ic_payment_option.png", + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 8), + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 0), + decoration: new BoxDecoration( + color: Colors.grey.shade100, + shape: BoxShape.rectangle, + ), + child: Image.asset( + widget.model.getPaymentOptionImage(paymentOption), + width: 30.0, + height: 30.0, + fit: BoxFit.scaleDown, + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 6), + child: Texts( + widget.model.getPaymentOptionName(paymentOption), + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + InkWell( + onTap: () => {_navigateToPaymentOption()}, + child: Texts( + TranslationBase.of(context).changeMethod, + fontSize: 12, + fontWeight: FontWeight.normal, + color: Color(0xff0000ff), + ), + ), + ], + ), + ), + ); + } +} + +class LakumWidget extends StatefulWidget { + final OrderPreviewViewModel model; + + LakumWidget(this.model); + + @override + _LakumWidgetState createState() => _LakumWidgetState(); +} + +class _LakumWidgetState extends State { + TextEditingController _pointsController = new TextEditingController(); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_checkout.png", + width: 30.0, + fit: BoxFit.scaleDown, + ), + Container( + decoration: BoxDecoration(color: Color(0x99ffffff)), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "Lakum Points", + fontSize: 12, + fontWeight: FontWeight.bold, + ), + Texts( + "${widget.model.paymentCheckoutData.lacumInformation.lakumInquiryInformationObjVersion.pointsBalanceAmount}", + fontSize: 12, + fontWeight: FontWeight.normal, + ), + ], + ), + ), + Expanded( + child: Container( + decoration: BoxDecoration(color: Color(0x99ffffff)), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Texts( + "Riyal", + fontSize: 12, + fontWeight: FontWeight.bold, + ), + Container( + margin: EdgeInsets.only(left: 4), + width: 60, + height: 40, + child: TextField( + decoration: InputDecoration( + border: OutlineInputBorder( + borderSide: + BorderSide(color: Colors.black, width: 0.2), + gapPadding: 0, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8)), + ), + disabledBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Colors.black, width: 0.4), + gapPadding: 0, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8)), + ), + ), + controller: _pointsController, + keyboardType: TextInputType.number, + style: TextStyle( + fontSize: 14, + color: widget + .model + .paymentCheckoutData + .lacumInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount > + 0 + ? Colors.black + : Colors.grey, + ), + enabled: widget + .model + .paymentCheckoutData + .lacumInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount == + 0 + ? false + : true, + onChanged: (val) { + var value = int.tryParse(val); + if (value != null && + value <= + widget + .model + .paymentCheckoutData + .lacumInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount) { + widget.model.paymentCheckoutData.usedLakumPoints = + value; + } else { + widget.model.paymentCheckoutData.usedLakumPoints = 0; + } + _pointsController.text = + "${widget.model.paymentCheckoutData.usedLakumPoints}"; + }, + ), + ), + Container( + height: 40, + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), + decoration: new BoxDecoration( + color: Color(0xff3666E0), + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topRight: Radius.circular(6), + bottomRight: Radius.circular(6)), + border: Border.fromBorderSide(BorderSide( + color: Color(0xff3666E0), + width: 0.8, + )), + ), + child: Texts( + "USE", + fontSize: 12, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class PaymentBottomWidget extends StatelessWidget { + final OrderPreviewViewModel model; + + PaymentBottomWidget(this.model); + + @override + Widget build(BuildContext context) { + final scaffold = Scaffold.of(context); + + return Container( + margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0), + child: Consumer( + builder: (ctx, paymentData, _) => paymentData.cartDataVisible + ? Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + margin: + EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Row( + children: [ + Texts( + "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xff929295), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 4), + child: Texts( + "(inclusive VAT)", + fontSize: 8, + color: Color(0xff929295), + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + Texts( + "${model.cartResponse.quantityCount} item(s)", + fontSize: 10, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ], + ), + Container( + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + color: Color(0xff929295), + width: 1, + ), + ), + onPressed: (paymentData.address != null && + paymentData.paymentOption != null) + ? () => { + model.makeOrder().then((_) { + if (model.state != ViewState.Idle) { + SnackBar snackBar = SnackBar( + content: Text( + 'Order has been placed successfully!!')); + scaffold.showSnackBar(snackBar); + } + + // Navigator.pushAndRemoveUntil( + // context, + // MaterialPageRoute( + // builder: (context) => + // PharmacyPage()), + // (Route r) => false); + }) + } + : null, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: new Text( + "PROCEED TO PAY", + style: new TextStyle( + color: (paymentData.address != null && + paymentData.paymentOption != null) + ? Colors.white + : Colors.grey.shade400, + fontWeight: FontWeight.bold, + fontSize: 12), + ), + ), + color: (paymentData.address != null && + paymentData.paymentOption != null) + ? Colors.green + : Color(0xff929295), + disabledColor: (paymentData.address != null && + paymentData.paymentOption != null) + ? Colors.green + : Color(0xff929295), + ), + ), + ], + ), + ) + : Container(), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart new file mode 100644 index 00000000..c42696a9 --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart @@ -0,0 +1,100 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lacum-registration-page.dart'; + +class LakumActivationVidaPage extends StatelessWidget { + TextEditingController _identificationNumberController = + new TextEditingController(); + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Acount Activation", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + margin: EdgeInsets.symmetric(vertical: 16, horizontal: 12), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Texts( + " This service allows you to activate your LAKUM account after registering through the Vida system. ", + fontSize: 14, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: _identificationNumberController, + decoration: new InputDecoration( + hintText: 'Enter Identification Number', + ), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 4), + child: BorderedButton( + TranslationBase.of(context).accountActivation, + backgroundColor: + _identificationNumberController.text != null && + _identificationNumberController.text != "" + ? Color(0xff60686b) + : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: _identificationNumberController.text != null && + _identificationNumberController.text != "" + ? () { + model + .checkLacumAccountActivation( + _identificationNumberController.text) + .then((status) => { + if (status == 200) + { + Navigator.push( + context, + FadePage( + page: LakumRegistrationPage( + _identificationNumberController + .text))) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }) + } + }); + } + : null, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-registration-page.dart b/lib/pages/pharmacies/screens/lacum-registration-page.dart new file mode 100644 index 00000000..53b9705d --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-registration-page.dart @@ -0,0 +1,236 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/models/id-name-pair.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/radio-group-dialog.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lakum-terms-conditions-page.dart'; + +class LakumRegistrationPage extends StatefulWidget { + final String patientIdentificationNo; + + LakumRegistrationPage(this.patientIdentificationNo); + + @override + _LakumRegistrationPageState createState() => _LakumRegistrationPageState(); +} + +class _LakumRegistrationPageState extends State { + final TextEditingController _firstNameController = TextEditingController(); + + final TextEditingController _lastNameController = TextEditingController(); + + final TextEditingController _mobileNumberController = TextEditingController(); + + List languages = List(); + + IdNamePair selectedLanguage; + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + languages.clear(); + languages.add(IdNamePair(1, TranslationBase.of(context).arabic)); + languages.add(IdNamePair(2, TranslationBase.of(context).english)); + + bool canSubmit = _firstNameController.text != null && + _firstNameController.text != "" && + _lastNameController.text != null && + _lastNameController.text != "" && + _mobileNumberController.text != null && + _mobileNumberController.text != "" && + selectedLanguage != null; + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Register Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + height: 150, + width: mediaQuery.size.width, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).firstName, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _firstNameController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).lastName, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _lastNameController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).mobileNumber, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + TextField( + controller: _mobileNumberController, + style: TextStyle( + fontSize: 16, + color: Colors.black, + ), + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context) + .prefferedLanguage, + fontSize: 13, + fontWeight: FontWeight.normal, + color: Color(0xff8a8a8a), + ), + InkWell( + onTap: () { + RadioGroupDialog dialog = + new RadioGroupDialog( + context: context, + title: TranslationBase.of(context) + .prefferedLanguage, + okText: + TranslationBase.of(context) + .confirm, + cancelText: + TranslationBase.of(context) + .cancel_nocaps, + list: languages, + okFunction: (selectedValue) { + setState(() { + selectedLanguage = + selectedValue; + }); + print( + "selectedLanguage = ${selectedValue.name}"); + }, + cancelFunction: () => {}); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + }, + child: TextField( + enabled: false, + decoration: InputDecoration( + suffixIcon: + Icon(Icons.arrow_drop_down), + hintText: selectedLanguage == null + ? "${TranslationBase.of(context).prefferedLanguage}" + : "${selectedLanguage.name}", + hintStyle: TextStyle( + fontSize: 16, + color: Colors.black, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + ), + ], + ), + Container( + color: Colors.green, + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).register, + backgroundColor: canSubmit + ? Color(0xff339933) + : Color(0xff99cc99), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: canSubmit + ? () { + Navigator.push( + context, + FadePage( + page: LakumTermsConditions( + widget + .patientIdentificationNo, + _firstNameController.text, + _lastNameController.text, + _mobileNumberController + .text, + selectedLanguage.id))) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }); + } + : null, + ), + ), + ], + ), + ), + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-setting-page.dart b/lib/pages/pharmacies/screens/lacum-setting-page.dart new file mode 100644 index 00000000..07d14677 --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-setting-page.dart @@ -0,0 +1,240 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class LakumSettingPage extends StatefulWidget { + final LacumAccountInformation lacumInformation; + final LacumAccountInformation lacumGroupInformation; + + LakumSettingPage(this.lacumInformation, this.lacumGroupInformation); + + @override + _LakumSettingPageState createState() => _LakumSettingPageState(); +} + +class _LakumSettingPageState extends State { + bool _lakumAccountActivated = false; + TextEditingController _nameController = new TextEditingController(); + TextEditingController _phoneController = new TextEditingController(); + + @override + void initState() { + _lakumAccountActivated = widget.lacumGroupInformation + .lakumInquiryInformationObjVersion.accountStatus == + "Active"; + super.initState(); + _nameController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; + _phoneController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; + } + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + + return BaseView( + onModelReady: (model) => model.setLakumData( + widget.lacumInformation, widget.lacumGroupInformation), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top, + child: _buildSettingScreen(mediaQuery, model), + ), + ), + ), + ), + ); + } + + _buildSettingScreen(MediaQueryData mediaQuery, LacumViewModel model) { + bool canUpdate = (_nameController.text != "" && + _phoneController.text != "" && + (_nameController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName || + _phoneController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber)); + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: mediaQuery.size.height * 0.15, + color: Colors.grey.shade700, + ), + Column( + children: [ + SizedBox( + height: mediaQuery.size.height * 0.05, + ), + Container( + width: mediaQuery.size.width * 1, + child: LakumBannerWidget(model, mediaQuery, false)), + ], + ) + ], + ), + SizedBox( + height: 20, + ), + SizedBox( + height: 1, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts( + "Activate LAKUM Account", + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + Switch.adaptive( + activeColor: Color.fromRGBO(51, 153, 51, 1), + inactiveThumbColor: Colors.red, + activeTrackColor: Colors.grey, + inactiveTrackColor: Colors.grey, + value: _lakumAccountActivated, + onChanged: (val) { + if (_lakumAccountActivated) { + model.makeAccountDeactivate(); + } else { + model.makeAccountActivate(); + } + setState(() { + _lakumAccountActivated = val; + }); + }, + ), + ], + ), + ), + SizedBox( + height: 30, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).name, + fontSize: 13, + fontWeight: _lakumAccountActivated + ? FontWeight.bold + : FontWeight.normal, + color: Colors.grey.shade400, + ), + _lakumAccountActivated + ? TextField( + controller: _nameController, + enabled: _lakumAccountActivated ? true : false, + style: TextStyle( + fontSize: 16, + color: _lakumAccountActivated + ? Colors.black + : Colors.white38, + ), + ) + : Texts( + _nameController.text, + fontSize: 16, + color: Colors.grey.shade600, + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context).mobileNumber, + fontSize: 13, + fontWeight: _lakumAccountActivated + ? FontWeight.bold + : FontWeight.normal, + color: Colors.grey.shade400, + ), + _lakumAccountActivated + ? TextField( + controller: _phoneController, + enabled: _lakumAccountActivated ? true : false, + keyboardType: TextInputType.phone, + style: TextStyle( + fontSize: 16, + color: _lakumAccountActivated + ? Colors.black + : Colors.white38, + ), + ) + : Texts( + _phoneController.text, + fontSize: 16, + color: Colors.grey.shade600, + ), + ], + ), + ), + ], + ), + Container( + child: Column( + children: [ + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).save, + backgroundColor: + canUpdate ? Color(0xff60686b) : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: canUpdate + ? () { + model.createLakumAccount(_nameController.text, _phoneController.text).then((status) => { + if (status == 200) {Navigator.pop(context, "")} + // back to previous page + }); + } + : null, + ), + ) + ], + ), + ), + ], + ); + } +} diff --git a/lib/pages/pharmacies/screens/lacum-transfer-page.dart b/lib/pages/pharmacies/screens/lacum-transfer-page.dart new file mode 100644 index 00000000..0671f80a --- /dev/null +++ b/lib/pages/pharmacies/screens/lacum-transfer-page.dart @@ -0,0 +1,317 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class LacumTransferPage extends StatefulWidget { + final LacumAccountInformation lacumInformation; + final LacumAccountInformation lacumGroupInformation; + + LacumTransferPage(this.lacumInformation, this.lacumGroupInformation); + + @override + _LacumTransferPageState createState() => _LacumTransferPageState(); +} + +class _LacumTransferPageState extends State { + TextEditingController _beneficieryAccountController = + new TextEditingController(); + TextEditingController _transferPointsController = new TextEditingController(); + + @override + void initState() { + super.initState(); + _beneficieryAccountController.text = ""; + _transferPointsController.text = "0"; + } + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + + return BaseView( + onModelReady: (model) => model.setLakumData( + widget.lacumInformation, widget.lacumGroupInformation), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + appBarWidget: appBarWidget, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: SizedBox( + height: + mediaQuery.size.height - 58 - mediaQuery.padding.top, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Row( + children: [ + Container( + height: 100, + width: mediaQuery.size.width / 2 - 26, + padding: EdgeInsets.only( + top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xff6294ed), + ), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Container( + child: Texts( + "Point Balance", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 8), + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Texts( + "0", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ], + ), + ), + ) + ], + ), + ), + SizedBox( + width: 20, + ), + Container( + height: 100, + width: mediaQuery.size.width / 2 - 26, + padding: EdgeInsets.only( + top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xff339933), + ), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Container( + child: Texts( + "Riyal Balance", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + vertical: 8), + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Texts( + "0", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ], + ), + ), + ) + ], + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 16), + child: TextField( + controller: _beneficieryAccountController, + decoration: new InputDecoration( + hintText: 'Enter Beneficiary Account No.', + ), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 4), + child: BorderedButton( + TranslationBase.of(context).checkBeneficiary, + backgroundColor: + _beneficieryAccountController.text != "" + ? Color(0xff60686b) + : Color(0xffb0b4b5), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: + _beneficieryAccountController.text != "" + ? () { + model.getLacumGroupDataBuAccountId( + _beneficieryAccountController + .text); + } + : null, + ), + ), + (model.lacumReceiverInformation != null && + model.lacumReceiverInformation + .lakumInquiryInformationObjVersion != + null) + ? Container( + margin: EdgeInsets.only(top: 8), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context) + .beneficiaryName, + color: Colors.black, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8), + child: TextField( + enabled: false, + decoration: new InputDecoration( + hintText: + "${model.lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName}", + hintStyle: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + SizedBox( + height: 10, + width: double.infinity, + ), + Texts( + "Point's to Transfer :", + color: Colors.black, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8), + child: TextField( + controller: + _transferPointsController, + decoration: new InputDecoration( + focusColor: Colors.green, + hintStyle: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + )), + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + ), + ], + ), + ) + : Container() + ], + ), + if (model.lacumReceiverInformation != null && + model.lacumReceiverInformation + .lakumInquiryInformationObjVersion != + null) + Container( + margin: EdgeInsets.all(8), + child: BorderedButton( + "LACUM TRANSFER", + backgroundColor: Color(0xff339933), + textColor: Colors.white, + fontSize: 18, + hPadding: 8, + radius: 12, + vPadding: 16, + fontWeight: FontWeight.w600, + handler: () { + model + .transferYaHalaLoyaltyPoints( + _transferPointsController.text) + .then((status) => { + if (status == 200) + {Navigator.pop(context, "")} + // back to previous page + }); + }, + ), + ) + ], + ), + ), + ), + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-main-page.dart b/lib/pages/pharmacies/screens/lakum-main-page.dart new file mode 100644 index 00000000..e694d6fd --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-main-page.dart @@ -0,0 +1,554 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-setting-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-transfer-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-points-year-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +import 'lacum-activitaion-vida-page.dart'; + +class LakumMainPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + onModelReady: (model) => model.getLacumData(), + builder: (_, model, wi) => AppScaffold( + title: "Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + appBarIcons: _buildAppBarICons(context, model), + // preferredSize: mediaQuery.size.height * 0.20, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: (model.lacumGroupInformation != null && + model.lacumGroupInformation + .lakumInquiryInformationObjVersion != + null) + ? Column( + children: [ + Stack( + children: [ + Container( + height: mediaQuery.size.height * 0.15, + color: Colors.grey.shade700, + ), + Column( + children: [ + SizedBox( + height: mediaQuery.size.height * 0.05, + ), + Container( + width: mediaQuery.size.width * 1, + child: LakumBannerWidget( + model, mediaQuery, true)), + ], + ) + ], + ), + SizedBox( + height: 20, + ), + LakumHomeButtons(mediaQuery, model), + SizedBox( + height: 20, + ), + Container( + height: 100, + margin: EdgeInsets.symmetric(horizontal: 16), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + LacumPointsWidget( + mediaQuery, + 1, + TranslationBase.of(context).balance, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalance, + null), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 2, + TranslationBase.of(context).gained, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .pointsBalanceAmount, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .gainedPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .gainedPointsAmountPerYear), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 3, + TranslationBase.of(context).consumed, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmount != + null + ? int.parse(model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmount) + : 0, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .consumedPointsAmountPerYear), + SizedBox( + width: 8, + ), + LacumPointsWidget( + mediaQuery, + 4, + TranslationBase.of(context).transferred, + 0, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .transferPoints, + model + .lacumGroupInformation + .lakumInquiryInformationObjVersion + .transferPointsAmountPerYear), + ], + ), + ), + SizedBox( + height: 20, + ), + SizedBox( + height: 8, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/expired_icon.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Expired", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.expiredPoints} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/waiting_gained_icon.png", + fit: BoxFit.fill, + width: 20, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Waiting gained", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.waitingPoints} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 8), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/will_be_expired_icon.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + Padding( + padding: + EdgeInsets.symmetric(horizontal: 8), + child: Texts( + "Will Be Expired", + fontSize: 14, + ), + ) + ], + ), + Texts( + "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.pointsWillBeExpired} Points", + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ], + ), + ), + SizedBox( + height: 2, + width: double.infinity, + child: Container( + color: Color(0xffefefef), + ), + ), + ], + ) + : Container(), + ), + ), + )); + } +} + +List _buildAppBarICons(BuildContext context, LacumViewModel model) { + return [ + IconButton( + icon: Icon(Icons.settings), + color: Colors.white, + onPressed: () { + Navigator.push( + context, + FadePage( + page: LakumSettingPage( + model.lacumInformation, model.lacumGroupInformation))) + .then((result) => {model.getLacumGroupData()}); + }, + ), + ]; +} + +class LakumHomeButtons extends StatelessWidget { + final MediaQueryData mediaQuery; + final LacumViewModel model; + + LakumHomeButtons(this.mediaQuery, this.model); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () { + print("Account activate click"); + Navigator.push( + context, FadePage(page: LakumActivationVidaPage())) + .then((result) => {model.getLacumGroupData()}); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xffe1e1e1)), + height: mediaQuery.size.height * 0.08, + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/Account_activation_icon.png", + fit: BoxFit.fill, + width: 30, + height: 30, + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Texts( + "Account Activation", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ), + ), + ), + SizedBox( + width: 8, + ), + Expanded( + child: InkWell( + onTap: () { + print("Lacum transfer click"); + Navigator.push( + context, + FadePage( + page: LacumTransferPage(model.lacumInformation, + model.lacumGroupInformation))) + .then((result) => {model.getLacumGroupData()}); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: Color(0xffe1e1e1)), + height: mediaQuery.size.height * 0.08, + child: Row( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png", + fit: BoxFit.fill, + width: 35, + height: 30, + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Texts( + "Lakum Transfer", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ), + ), + ), + ], + ), + ); + } +} + +class LacumPointsWidget extends StatelessWidget { + final MediaQueryData mediaQuery; + final int pointType; // 1. balance, 2. gained, 3. consume, 4. transfer + final String title; + final int riyal; + final int point; + Color titleColor; + final List pointsAmountPerYear; + + LacumPointsWidget(this.mediaQuery, this.pointType, this.title, this.riyal, + this.point, this.pointsAmountPerYear) { + if (pointType == 1) { + titleColor = Color(0xffefefef); + } else if (pointType == 2) { + titleColor = Color(0xff004bcc); + } else if (pointType == 3) { + titleColor = Color(0xff339933); + } else { + titleColor = Color(0xffffa500); + } + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (pointType != 1) { + if (pointsAmountPerYear != null && pointsAmountPerYear.length > 0) { + Navigator.push(context, + FadePage(page: LakumPointsYearPage(pointsAmountPerYear))); + } else { + // show snackBar No Details Points are there + } + } + }, + child: Container( + width: mediaQuery.size.width / 2 - 16, + padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: pointType == 1 ? Color(0xff004bcc) : Color(0xffefefef), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Texts( + title, + fontSize: 14, + fontWeight: FontWeight.bold, + color: titleColor, + ), + ), + if (pointType != 1) + Icon( + Icons.arrow_forward, + color: titleColor, + ) + ], + ), + ], + ), + ), + Expanded( + child: Row( + children: [ + if (pointType != 4) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "RIYAL", + fontSize: 13, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "$riyal", + fontSize: 13, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + ], + ), + ), + if (pointType != 4) + SizedBox( + child: Container( + color: pointType == 1 ? Colors.white : Colors.grey, + ), + width: 1, + ), + Expanded( + child: Container( + margin: EdgeInsets.only(left: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "POINT", + fontSize: 12, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "$point", + fontSize: 12, + fontWeight: FontWeight.bold, + color: pointType == 1 ? Colors.white : Colors.black, + ), + ], + ), + ), + ), + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-points-year-page.dart b/lib/pages/pharmacies/screens/lakum-points-year-page.dart new file mode 100644 index 00000000..7538e287 --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-points-year-page.dart @@ -0,0 +1,173 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class LakumPointsYearPage extends StatefulWidget { + final List pointsAmountPerYear; + int selectedIndexYear = 0; + + LakumPointsYearPage(this.pointsAmountPerYear); + + @override + _LakumPointsYearPageState createState() => _LakumPointsYearPageState(); +} + +class _LakumPointsYearPageState extends State { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Lakum points", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: 100, + margin: EdgeInsets.symmetric(horizontal: 16), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + ...List.generate( + widget.pointsAmountPerYear.length, + (index) => LacumPointsYearWidget( + mediaQuery, + widget.selectedIndexYear == index, + widget.pointsAmountPerYear[index], + () {})), + ], + ), + ), + + ], + ), + ), + ), + ), + ); + } +} + +class LacumPointsYearWidget extends StatelessWidget { + final MediaQueryData mediaQuery; + final bool isSelected; + final PointsAmountPerYear yearPoints; + final Function yearOnTap; + + LacumPointsYearWidget( + this.mediaQuery, this.isSelected, this.yearPoints, this.yearOnTap); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: yearOnTap, + child: Container( + width: mediaQuery.size.width / 2 - 16, + padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: Color(0xffe1e1e1), + width: 0.4, + )), + color: isSelected ? Color(0xff004bcc) : Color(0xffefefef), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Texts( + "YEAR: ${yearPoints.year}", + fontSize: 14, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ), + ], + ), + ], + ), + ), + Expanded( + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(left: 4), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "POINT", + fontSize: 12, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "${yearPoints.pointsPerYear}", + fontSize: 12, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ], + ), + ), + ), + SizedBox( + child: Container( + color: isSelected ? Colors.white : Colors.grey, + ), + width: 1, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "RIYAL", + fontSize: 13, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + SizedBox( + height: 4, + ), + Texts( + "${yearPoints.amountPerYear}", + fontSize: 13, + fontWeight: FontWeight.bold, + color: isSelected ? Colors.white : Colors.black, + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart new file mode 100644 index 00000000..8ca10c50 --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart @@ -0,0 +1,84 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:provider/provider.dart'; + +class LakumTermsConditions extends StatelessWidget { + final String firstName, lastName, mobileNo, identificationNo; + final int languageId; + + LakumTermsConditions(this.identificationNo, this.firstName, this.lastName, + this.mobileNo, this.languageId); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); + double height = mediaQuery.size.height - + appBarWidget.preferredSize.height - + mediaQuery.padding.top; + + return BaseView( + onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), + builder: (_, model, wi) => AppScaffold( + title: "Register Lakum", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + appBarWidget: appBarWidget, + body: Container( + margin: EdgeInsets.all(8), + width: double.infinity, + child: Stack( + children: [ + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (model.listUserAgreement != null && + model.listUserAgreement.userAgreementLAKUM != + null) + Html( + data: projectProvider.isArabic + ? model.listUserAgreement.userAgreementLAKUMn + : model.listUserAgreement.userAgreementLAKUM, + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Container( + height: 50, + margin: EdgeInsets.all(8), + child: BorderedButton( + TranslationBase.of(context).acceptLbl, + backgroundColor: Color(0xff60686b), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: () { + model.createNewLakumAccount("$firstName $lastName", mobileNo, identificationNo, languageId).then((status) => { + if (status == 200) {Navigator.pop(context, "")} + // back to previous page + }); + }, + ), + ), + ), + ], + ), + ), + )); + } +} diff --git a/lib/pages/pharmacies/screens/order-preview-page.dart b/lib/pages/pharmacies/screens/order-preview-page.dart deleted file mode 100644 index d9646fcf..00000000 --- a/lib/pages/pharmacies/screens/order-preview-page.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; - -class OrderPreviewPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return BaseView( - builder: (_, model, wi) => AppScaffold( - title: "Shopping Cart", - isShowAppBar: true, - isShowDecPage: false, - baseViewModel: model, - backgroundColor: Colors.white, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: Container( - margin: EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureIconButton( - TranslationBase.of(context).deleteAllItems, - Icon(Icons.delete_outline_sharp, color: Colors.grey.shade800,), - onTap: () => {}, - ), - const Divider( - color: Colors.grey, - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - - ], - ), - ), - ), - ), - ), - ); - } -} - diff --git a/lib/pages/pharmacies/screens/payment-method-select-page.dart b/lib/pages/pharmacies/screens/payment-method-select-page.dart new file mode 100644 index 00000000..8cdbaf3c --- /dev/null +++ b/lib/pages/pharmacies/screens/payment-method-select-page.dart @@ -0,0 +1,202 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class PaymentMethodSelectPage extends StatefulWidget { + @override + _PaymentMethodSelectPageState createState() => + _PaymentMethodSelectPageState(); +} + +class _PaymentMethodSelectPageState extends State { + PaymentOption selectedPaymentOption; + + @override + Widget build(BuildContext context) { + Size screenSize = MediaQuery.of(context).size; + double cardWidth = screenSize.width / 2 - 32; + + return AppScaffold( + title: "Payment method", + isShowAppBar: true, + isShowDecPage: false, + body: Container( + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Texts( + TranslationBase.of(context).selectPaymentOption, + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), + child: Column( + children: [ + Row( + children: [ + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.meda, + () => { + setState(() { + selectedPaymentOption = PaymentOption.meda; + }) + }), + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.sadad, + () => { + setState(() { + selectedPaymentOption = PaymentOption.sadad; + }) + }), + ], + ), + Row( + children: [ + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.visa, + () => { + setState(() { + selectedPaymentOption = PaymentOption.visa; + }) + }), + PaymentMethodCard( + cardWidth, + selectedPaymentOption, + PaymentOption.mastercard, + () => { + setState(() { + selectedPaymentOption = + PaymentOption.mastercard; + }) + }), + ], + ), + PaymentMethodCard( + (cardWidth * 2 + 32), + selectedPaymentOption, + PaymentOption.installments, + () => { + setState(() { + selectedPaymentOption = + PaymentOption.installments; + }) + }), + ], + ), + ), + ], + ), + ), + bottomSheet: Container( + height: screenSize.height * 0.08, + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: BorderedButton( + TranslationBase.of(context).next, + backgroundColor: Color(0xff5AB154), + textColor: Colors.white, + fontSize: 16, + hPadding: 8, + vPadding: 12, + handler: selectedPaymentOption != null + ? () => {Navigator.pop(context, selectedPaymentOption)} + : null, + ), + ), + ); + } +} + +class PaymentMethodCard extends StatelessWidget { + final double cardWidth; + final PaymentOption selectedPaymentOption; + final PaymentOption paymentOption; + final Function selectMethod; + + PaymentMethodCard(this.cardWidth, this.selectedPaymentOption, + this.paymentOption, this.selectMethod); + + @override + Widget build(BuildContext context) { + bool isSelected = false; + if (selectedPaymentOption != null && + selectedPaymentOption == paymentOption) { + isSelected = true; + } + + return InkWell( + onTap: selectMethod, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 2, vertical: 0), + child: Stack( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), + margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: new BoxDecoration( + color: Colors.grey.shade100, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.fromBorderSide(BorderSide( + color: isSelected ? Color(0xff20BC11) : Colors.grey.shade300, + width: 0.8, + )), + ), + width: cardWidth, + child: Image.asset( + getPaymentOptionImage(paymentOption), + fit: BoxFit.cover, + ), + ), + if (isSelected) + Positioned( + right: 1, + child: Icon( + Icons.check_circle, + color: Color(0xff20BC11), + size: 30, + ), + ), + ], + ), + ), + ); + } + + String getPaymentOptionImage(PaymentOption paymentOption) { + String assetFile = "assets/images/pharmacy_module/payment/"; + switch (paymentOption.index) { + case 0: + return "${assetFile}mada.png"; + break; + case 1: + return "${assetFile}sadad.png"; + break; + case 2: + return "${assetFile}visa.png"; + break; + case 3: + return "${assetFile}mastercard.png"; + break; + case 4: + return "${assetFile}installment.png"; + break; + default: + return ""; + } + } +} diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index f9c6cdeb..a08eae89 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -2,7 +2,8 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/order-preview-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductTileItem.dart'; import 'file:///C:/Users/admin/AndroidStudioProjects/diplomatic-quarter/lib/widgets/buttons/borderedButton.dart'; @@ -13,12 +14,12 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -class PharmacyPage extends StatelessWidget { +import 'lacum-activitaion-vida-page.dart'; +class PharmacyPage extends StatelessWidget { @override Widget build(BuildContext context) { return BaseView( - // onModelReady: (model) => model.getPharmacyHomeData(), onModelReady: (model) => model.getPharmacyHomeData(), builder: (_, model, wi) => AppScaffold( title: "", @@ -33,8 +34,7 @@ class PharmacyPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ BannerPager(model), - GridViewButtons(), - /*BannerPager(model.getBannerImagesUrl()),*/ + GridViewButtons(model), Container( margin: EdgeInsets.fromLTRB(10, 0, 10, 0), child: Row( @@ -48,8 +48,9 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, vPadding: 6, + hPadding: 4, borderColor: Colors.green, - color: Colors.green, + textColor: Colors.green, handler: () {}, ), ], @@ -77,15 +78,18 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, vPadding: 6, + hPadding: 4, borderColor: Colors.green, - color: Colors.green, + textColor: Colors.green, handler: () {}, ), ], ), ), Container( - height: model.lastVisitedProducts.length > 0 ? MediaQuery.of(context).size.height / 4 : 0, + height: model.lastVisitedProducts.length > 0 + ? MediaQuery.of(context).size.height / 4 + 20 + : 0, child: ListView.builder( itemBuilder: (ctx, i) => ProductTileItem(model.lastVisitedProducts[i]), @@ -106,15 +110,16 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, borderColor: Colors.green, - color: Colors.green, + textColor: Colors.green, vPadding: 6, + hPadding: 4, handler: () {}, ), ], ), ), Container( - height: MediaQuery.of(context).size.height / 4, + height: MediaQuery.of(context).size.height / 4 + 20, child: ListView.builder( itemBuilder: (ctx, i) => ProductTileItem(model.bestSellerProduct[i]), @@ -132,6 +137,10 @@ class PharmacyPage extends StatelessWidget { } class GridViewButtons extends StatelessWidget { + final PharmacyModuleViewModel model; + + GridViewButtons(this.model); + @override Widget build(BuildContext context) { final gridHeight = (MediaQuery.of(context).size.width * 0.3) * 1.8; @@ -153,17 +162,25 @@ class GridViewButtons extends StatelessWidget { opacity: 0.8, child: GridViewCard( TranslationBase.of(context).offersAndPromotions, - 'assets/images/pharmacy_module/offer_icon.png', - () { - Navigator.push(context, FadePage(page: OrderPreviewPage())); - }), + 'assets/images/pharmacy_module/offer_icon.png', () { + Navigator.push(context, FadePage(page: CartOrderPage())); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_2.png', opacity: 0, hasColorFilter: false, child: GridViewCard(TranslationBase.of(context).medicationRefill, - 'assets/images/pharmacy_module/medication_icon.png', () {}), + 'assets/images/pharmacy_module/medication_icon.png', () { + model.checkUserIsActivated().then((isActivated) { + if (isActivated) { + Navigator.push(context, FadePage(page: LakumMainPage())); + } else { + Navigator.push( + context, FadePage(page: LakumActivationVidaPage())); + } + }); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_3.png', @@ -219,11 +236,16 @@ class GridViewCard extends StatelessWidget { ), ), ), - Expanded( - child: BorderedButton( - TranslationBase.of(context).viewAll, - handler: handler, - ), + Row( + children: [ + BorderedButton( + TranslationBase.of(context).viewAll, + handler: handler, + tPadding: 0, + bPadding: 0, + ), + Expanded(child: Container()), + ], ), ], ), diff --git a/lib/pages/pharmacies/widgets/BannerPager.dart b/lib/pages/pharmacies/widgets/BannerPager.dart index 989c7557..0f29014d 100644 --- a/lib/pages/pharmacies/widgets/BannerPager.dart +++ b/lib/pages/pharmacies/widgets/BannerPager.dart @@ -26,6 +26,7 @@ class _BannerPagerState extends State { enlargeCenterPage: true, enableInfiniteScroll: false, initialPage: 0, + viewportFraction: 0.8, autoPlay: true, autoPlayInterval: Duration(seconds: 3), autoPlayAnimationDuration: Duration(milliseconds: 800), diff --git a/lib/pages/pharmacies/widgets/ProductOrderItem.dart b/lib/pages/pharmacies/widgets/ProductOrderItem.dart index 81b6068a..92e2c39d 100644 --- a/lib/pages/pharmacies/widgets/ProductOrderItem.dart +++ b/lib/pages/pharmacies/widgets/ProductOrderItem.dart @@ -1,13 +1,239 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductOrderItem extends StatefulWidget { + final ShoppingCart item; + final VoidCallback changeCartItems; + final VoidCallback deleteCartItems; + + ProductOrderItem(this.item, this.changeCartItems, this.deleteCartItems); + + @override + _ProductOrderItemState createState() => _ProductOrderItemState(); +} + +class _ProductOrderItemState extends State { + TextEditingController _quantityController = new TextEditingController(); + String _totalPrice = "0"; + + @override + void initState() { + _quantityController.text = "${widget.item.quantity}"; + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + super.initState(); + } -class ProductOrderItem extends StatelessWidget { @override Widget build(BuildContext context) { - return ListTile( - leading: Icon( - Icons.delete_outline_sharp, - color: Colors.grey.shade800, - ), + ProjectViewModel projectProvider = Provider.of(context); + + return Column( + children: [ + ListTile( + leading: InkWell( + onTap: () => {widget.deleteCartItems()}, + child: Icon( + Icons.delete_outline_sharp, + color: Colors.grey.shade700, + ), + ), + title: Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + (widget.item.product.images != null && widget.item.product.images.length > 0) + ? Image.network( + widget.item.product.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), + Expanded( + child: Container( + margin: + const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + child: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Texts( + projectProvider.isArabic + ? widget.item.product.namen + : widget.item.product.name, + regular: true, + textAlign: TextAlign.justify, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + child: Texts( + "${(widget.item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Row( + children: [ + InkWell( + onTap: () => + {_quantityOnChangeClick(Operation.dec)}, + child: Container( + width: 25, + height: 25, + child: Center( + child: Texts( + "-", + color: Colors.grey.shade400, + )), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, + ), + ), + ), + ), + Container( + margin: + const EdgeInsets.symmetric(horizontal: 4), + width: 25, + height: 25, + color: Colors.grey.shade300, + child: Center( + child: TextField( + cursorColor: Colors.black, + keyboardType: TextInputType.number, + controller: _quantityController, + textAlign: TextAlign.center, + onChanged: (text) { + setState(() { + var value = int.tryParse(text); + if (value == null) { + widget.item.quantity = 0; + } else { + widget.item.quantity = int.parse(text); + } + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + }); + }, + )), + ), + InkWell( + onTap: () => + {_quantityOnChangeClick(Operation.inc)}, + child: Container( + width: 25, + height: 25, + child: Center( + child: Texts( + "+", + color: Colors.grey.shade400, + )), + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, + ), + ), + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + TranslationBase.of(context).total, + color: Colors.grey.shade500, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + Texts( + "$_totalPrice ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", + fontSize: 12, + fontWeight: FontWeight.bold, + ) + ], + ), + ) + ], + ) + ], + ), + ), + ), + ) + ], + ), + ), + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 15, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], ); } + + _quantityOnChangeClick(Operation operation) { + int newValue = 0; + setState(() { + switch (operation) { + case Operation.inc: + { + newValue = widget.item.quantity + 1; + } + break; + + case Operation.dec: + { + newValue = widget.item.quantity - 1; + } + break; + default: + { + //statements; + } + break; + } + if (newValue > 0) { + widget.item.quantity = newValue; + _quantityController.text = "${widget.item.quantity}"; + _totalPrice = + "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; + } + }); + if (newValue > 0) { + widget.changeCartItems(); + } + } + + @override + void dispose() { + // Clean up the controller when the widget is removed from the + // widget tree. + _quantityController.dispose(); + super.dispose(); + } } + +enum Operation { inc, dec } diff --git a/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart b/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart new file mode 100644 index 00000000..d38f437c --- /dev/null +++ b/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart @@ -0,0 +1,111 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ProductOrderPreviewItem extends StatelessWidget { + final ShoppingCart item; + + ProductOrderPreviewItem(this.item); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + return Container( + margin: EdgeInsets.only(top: 16), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + (item.product.images != null && item.product.images.length > 0) + ? Image.network( + item.product.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), + Expanded( + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + child: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: Texts( + projectProvider.isArabic + ? item.product.namen + : item.product.name, + regular: true, + textAlign: TextAlign.justify, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + child: Texts( + "${(item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + margin: const EdgeInsets.only(bottom: 4), + ), + Container( + width: double.infinity, + alignment: Alignment.centerRight, + child: Texts( + TranslationBase.of(context).total, + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 13, + ), + ), + Row( + children: [ + Texts( + "QTY: ${item.quantity}", + color: Colors.grey.shade500, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + Expanded( + child: Container( + alignment: Alignment.centerRight, + child: Texts( + "${(item.product.price * item.quantity).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ) + ], + ), + ], + ), + ), + )), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 0, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart index 62493387..e0a45194 100644 --- a/lib/pages/pharmacies/widgets/ProductTileItem.dart +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -23,6 +23,7 @@ class ProductTileItem extends StatelessWidget { void _saveLastVisitProducts() async { String lastVisited = ""; bool isIdExist = false; + // var data = await sharedPref.getObject(USER_PROFILE) ; // data['PatientID'] if (await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS) != null) { lastVisited = @@ -69,11 +70,17 @@ class ProductTileItem extends StatelessWidget { Container( margin: EdgeInsets.fromLTRB(0, 16, 0, 0), alignment: Alignment.center, - child: Image.network( - item.images[0].src, - fit: BoxFit.cover, - height: 80, - ), + child: (item.images != null && item.images.length > 0) + ? Image.network( + item.images[0].src, + fit: BoxFit.cover, + height: 80, + ) + : Image.asset( + "assets/images/no_image.png", + fit: BoxFit.cover, + height: 80, + ), ), Container( width: item.rxMessage != null @@ -104,7 +111,7 @@ class ProductTileItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - projectProvider.isArabic ? item.name : item.namen, + projectProvider.isArabic ? item.namen : item.name, regular: true, fontSize: 12, fontWeight: FontWeight.w400, diff --git a/lib/pages/pharmacies/widgets/lacum-banner-widget.dart b/lib/pages/pharmacies/widgets/lacum-banner-widget.dart new file mode 100644 index 00000000..14a53e72 --- /dev/null +++ b/lib/pages/pharmacies/widgets/lacum-banner-widget.dart @@ -0,0 +1,289 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/material.dart'; + +class LakumBannerWidget extends StatefulWidget { + final LacumViewModel model; + final MediaQueryData mediaQuery; + final bool isLacumHomePage; + + LakumBannerWidget(this.model, this.mediaQuery, this.isLacumHomePage); + + @override + _LakumBannerWidgetState createState() => _LakumBannerWidgetState(); +} + +class _LakumBannerWidgetState extends State { + int _current = 0; + + @override + Widget build(BuildContext context) { + return Container( + child: Stack( + children: [ + CarouselSlider( + options: CarouselOptions( + enableInfiniteScroll: false, + enlargeCenterPage: false, + viewportFraction: 1.0, + scrollPhysics: widget.isLacumHomePage + ? ScrollPhysics() + : NeverScrollableScrollPhysics(), + initialPage: 0, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }, + ), + items: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + "${widget.model.lacumInformation.yahalaAccountNo}", + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + BorderedButton( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus == "Active" + ? TranslationBase.of(context).active + : TranslationBase.of(context).inactive, + textColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + hasBorder: true, + borderColor: widget.model.lacumInformation + .accountStatus == + 1 + ? Colors.green + : Colors.red, + radius: 16, + rPadding: 16, + icon: widget.model.lacumInformation + .accountStatus == + 1 + ? Icon( + Icons.check_circle, + size: 25, + color: Colors.green, + ) + : Image.asset( + "assets/images/pharmacy_module/lakum/inactive_cross.png", + fit: BoxFit.fill, + width: 25, + height: 25, + ), + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "IDENTIFICATION #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation + .identificationNo, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + "MEMBER SINCE", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.formatCreatedDateToString(), + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + "MOBILE #", + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Texts( + TranslationBase.of(context).language, + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + Texts( + widget.model.lacumInformation.prefLang == + "1" + ? TranslationBase.of(context).lanEnglish + : TranslationBase.of(context).lanArabic, + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black, + ), + ], + ), + ], + ), + ], + ), + ), + ], + ), + ), + widget.isLacumHomePage + ? Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(4), + border: Border.fromBorderSide(BorderSide( + color: Colors.grey, + width: 0.4, + )), + ), + margin: EdgeInsets.symmetric(horizontal: 16), + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: widget.mediaQuery.size.width * 1.0, + height: widget.mediaQuery.size.width * 1.0, + ), + Container( + margin: EdgeInsets.fromLTRB(12, 70, 12, 4), + child: widget.model.convertBase64ToBarCodeImage() != + null + ? Image.memory( + widget.model.convertBase64ToBarCodeImage()) + : Container(), + ), + ], + ), + ) + : Container(), + ], + ), + widget.isLacumHomePage + ? Positioned( + bottom: 1, + left: 1, + right: 1, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: _current == 0 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 0 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + Container( + width: _current == 1 ? 12.0 : 8.0, + height: 4.0, + margin: EdgeInsets.symmetric( + vertical: 0.0, horizontal: 2.0), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: _current == 1 + ? Color(0xff5ab145) + : Color.fromRGBO(0, 0, 0, 0.4), + ), + ), + ], + ), + ), + ) + : Container(), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart new file mode 100644 index 00000000..5ded2e75 --- /dev/null +++ b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class LakumPointTableRowWidget extends StatefulWidget { + final bool isTableTitle; // true : title , false: row + final String tableType; // month, day + final double points; + final double riyal; + final Function onTap; + final int rowIndex; + + LakumPointTableRowWidget( + this.isTableTitle, this.tableType, this.points, this.riyal, this.onTap, this.rowIndex); + + @override + _LakumPointTableRowWidgetState createState() => + _LakumPointTableRowWidgetState(); +} + +class _LakumPointTableRowWidgetState extends State { + @override + Widget build(BuildContext context) { + bool isEven = widget.rowIndex % 2 == 0; + return Container( + child: Column( + children: [ + Row( + children: [ + + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 2, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } +} diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 8ffaf97c..844ccb53 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -234,6 +234,11 @@ class DateUtil { return ""; } + static String getFormattedDate(DateTime dateTime, String formattedString){ + return DateFormat(formattedString) + .format(dateTime); + } + static convertISODateToJsonDate(String isoDate) { return "/Date(" + DateFormat('mm-dd-yyy') diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index c5246e35..536c8abd 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -706,6 +706,24 @@ class TranslationBase { String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; + String get total => localizedValues['total'][locale.languageCode]; + String get selectAddress => localizedValues['selectAddress'][locale.languageCode]; + String get shippingAddress => localizedValues['shippingAddress'][locale.languageCode]; + String get changeAddress => localizedValues['changeAddress'][locale.languageCode]; + String get selectPaymentOption => localizedValues['selectPaymentOption'][locale.languageCode]; + String get changeMethod => localizedValues['changeMethod'][locale.languageCode]; + String get reviewOrder => localizedValues['reviewOrder'][locale.languageCode]; + String get orderSummary => localizedValues['orderSummary'][locale.languageCode]; + String get active => localizedValues['active'][locale.languageCode]; + String get inactive => localizedValues['inactive'][locale.languageCode]; + String get balance => localizedValues['balance'][locale.languageCode]; + String get gained => localizedValues['gained'][locale.languageCode]; + String get consumed => localizedValues['consumed'][locale.languageCode]; + String get transferred => localizedValues['transferred'][locale.languageCode]; + String get checkBeneficiary => localizedValues['checkBeneficiary'][locale.languageCode]; + String get beneficiaryName => localizedValues['beneficiaryName'][locale.languageCode]; + String get accountActivation => localizedValues['accountActivation'][locale.languageCode]; + String get acceptLbl => localizedValues['acceptLbl'][locale.languageCode]; String get termsService => localizedValues['TermsService'][locale.languageCode]; diff --git a/lib/widgets/buttons/GestureIconButton.dart b/lib/widgets/buttons/GestureIconButton.dart index 841d7ea6..62265985 100644 --- a/lib/widgets/buttons/GestureIconButton.dart +++ b/lib/widgets/buttons/GestureIconButton.dart @@ -3,12 +3,12 @@ import 'package:flutter/material.dart'; class GestureIconButton extends StatefulWidget { GestureIconButton( - this.label, - this.icon, { - Key key, - this.onTap, - this.backgroundColor, - }) : super(key: key); + this.label, + this.icon, { + Key key, + this.onTap, + this.backgroundColor, + }) : super(key: key); final String label; final Widget icon; @@ -29,6 +29,7 @@ class _GestureIconButtonState extends State { setState(() => _buttonLongPress = !_buttonLongPress), onLongPressEnd: (_) => setState(() => _buttonLongPress = !_buttonLongPress), + onTap: () => {widget.onTap()}, child: Wrap( children: [ Container( diff --git a/lib/widgets/buttons/borderedButton.dart b/lib/widgets/buttons/borderedButton.dart index 5e05448e..e297a10e 100644 --- a/lib/widgets/buttons/borderedButton.dart +++ b/lib/widgets/buttons/borderedButton.dart @@ -4,55 +4,79 @@ import 'package:flutter/material.dart'; class BorderedButton extends StatelessWidget { final String text; final Function handler; - final Color color; + final Color textColor; final bool hasBorder; final Color borderColor; final Color backgroundColor; final double vPadding; final double hPadding; + final double radius; + final double lPadding; + final double tPadding; + final double rPadding; + final double bPadding; + final double fontSize; + final Widget icon; + final FontWeight fontWeight; BorderedButton( this.text, { this.handler, - this.color, + this.textColor, this.hasBorder = false, this.borderColor, this.backgroundColor, this.vPadding = 0, this.hPadding = 0, + this.radius = 4.0, + this.lPadding = 4.0, + this.tPadding = 0.0, + this.rPadding = 4.0, + this.bPadding = 0.0, + this.fontSize = 0, + this.icon, + this.fontWeight, }); @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4), - child: ButtonTheme( - //adds padding inside the button - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - //limits the touch area to the button area - minWidth: 0, - //wraps child's width - height: 0, - //wraps child's height - child: RaisedButton( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - padding: EdgeInsets.symmetric(horizontal: 12, vertical: vPadding), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4.0), - side: BorderSide(color: hasBorder ? borderColor : Colors.white, width: 0.8),), + return GestureDetector( + onTap: () { + handler(); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, color: backgroundColor ?? Colors.white, - textColor: color ?? Color(0xffc4aa54), - disabledTextColor: color ?? Colors.black, - disabledColor: backgroundColor ?? Colors.white, - onPressed: handler, - child: Text( - text, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: SizeConfig.textMultiplier * 1.6, - fontWeight: FontWeight.normal), + borderRadius: BorderRadius.circular(radius), + border: Border.fromBorderSide(BorderSide( + color: hasBorder ? borderColor : Colors.white, + width: 0.8, + )), + ), + child: Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + icon != null ? icon : Container(), + Container( + padding: (hPadding > 0 || vPadding > 0) + ? EdgeInsets.symmetric( + vertical: vPadding, horizontal: hPadding) + : EdgeInsets.fromLTRB( + lPadding, tPadding, rPadding, bPadding), + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: fontSize == 0 ? SizeConfig.textMultiplier * 1.6 : fontSize, + fontWeight: fontWeight != null ? fontWeight : FontWeight.normal, + color: textColor ?? Color(0xffc4aa54)), + ), + ), + ], ), - ), //your original button + ), ), ); } diff --git a/lib/widgets/data_display/text.dart b/lib/widgets/data_display/text.dart index 215db9ff..b04d2991 100644 --- a/lib/widgets/data_display/text.dart +++ b/lib/widgets/data_display/text.dart @@ -214,6 +214,7 @@ class _TextsState extends State { : TextOverflow.ellipsis) : null, maxLines: widget.maxLines ?? null, + style: widget.style != null ? _getFontStyle().copyWith( fontStyle: widget.italic ? FontStyle.italic : null, diff --git a/lib/widgets/dialogs/radio-group-dialog.dart b/lib/widgets/dialogs/radio-group-dialog.dart new file mode 100644 index 00000000..5eff11bd --- /dev/null +++ b/lib/widgets/dialogs/radio-group-dialog.dart @@ -0,0 +1,101 @@ +import 'package:diplomaticquarterapp/models/id-name-pair.dart'; +import 'package:flutter/material.dart'; + +// AppToast.showErrorToast(message: "Please select Time Slot to continue"); + +class RadioGroupDialog extends StatefulWidget { + + final BuildContext context; + final title; + final List list; + final okText; + final cancelText; + final Function(IdNamePair) okFunction; + final Function cancelFunction; + IdNamePair selectedValue; + + RadioGroupDialog( + {@required this.context, + @required this.title, + @required this.list, + @required this.okText, + @required this.cancelText, + @required this.okFunction, + @required this.cancelFunction}); + + + @override + RadioGroupState createState() => RadioGroupState(); +} + +class RadioGroupState extends State { + + @override + void initState() { + super.initState(); + widget.selectedValue = widget.selectedValue ?? widget.list[0]; + } + + @override + Widget build(BuildContext context) { + return showAlertDialog(context); + } + + showAlertDialog(BuildContext context) { + // set up the buttons + Widget cancelButton = FlatButton( + child: Text(this.widget.cancelText), + onPressed: () { + Navigator.of(context).pop(); + }); + Widget continueButton = + FlatButton(child: Text(this.widget.okText), onPressed: () { + this.widget.okFunction(widget.selectedValue); + Navigator.of(context).pop(); + }); + + // set up the AlertDialog + AlertDialog alert = AlertDialog( + title: Text(widget.title), + content: createDialogGroup(), + actions: [ + cancelButton, + continueButton, + ], + ); + return alert; + } + + static closeAlertDialog(BuildContext context) { + Navigator.of(context).pop(); + } + + Widget createDialogGroup(){ + return Container( + height: MediaQuery.of(context).size.height * 0.3, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + child: Column( + children: + widget.list.map((data) => RadioListTile( + title: Text("${data.name}"), + groupValue: widget.selectedValue.id, + value: data.id, + onChanged: (val) { + setState(() { + widget.selectedValue = data ; + }); + }, + )).toList(), + ), + ), + + ], + ), + ), + ); + } + +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index f6ac453a..913c00fb 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -36,6 +36,9 @@ class AppScaffold extends StatelessWidget { final String description; final bool isShowDecPage; final Color backgroundColor; + final double preferredSize; + final List appBarIcons; + final PreferredSizeWidget appBarWidget; AuthenticatedUserObject authenticatedUserObject = locator(); @@ -52,45 +55,35 @@ class AppScaffold extends StatelessWidget { this.title, this.description, this.isShowDecPage = true, - this.isBottomBar,this.backgroundColor}); + this.isBottomBar, + this.backgroundColor, + this.preferredSize = 0.0, + this.appBarIcons, + this.appBarWidget, + }); @override Widget build(BuildContext context) { AppGlobal.context = context; + PreferredSizeWidget appBar; + + if (this.appBarWidget == null) { + PreferredSizeWidget appBarWidget = + // buildAppBar(context, appBarTitle, appBarIcons, isShowAppBar); + AppBarWidget(appBarTitle, appBarIcons, isShowAppBar); + appBar = preferredSize == 0 + ? appBarWidget + : PreferredSize( + child: appBarWidget, + preferredSize: Size.fromHeight(preferredSize)); + } else { + appBar = this.appBarWidget; + } return Scaffold( - backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(authenticatedUserObject.isLogin - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute(builder: (context) => LandingPage()), - (Route r) => false); - }, - ), - ], - ) - : null, + backgroundColor: + backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: appBar, body: (!authenticatedUserObject.isLogin && isShowDecPage) ? NotAutPage( title: appBarTitle, @@ -110,12 +103,107 @@ class AppScaffold extends StatelessWidget { ); } + /*Widget buildAppBar(BuildContext context, String appBarTitle, + List appBarIcons, bool isShowAppBar) { + return isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(authenticatedUserObject.isLogin + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + (Route r) => false); + }, + ), + if (appBarIcons != null) ...appBarIcons + ], + ) + : null; + }*/ + buildAppLoaderWidget(bool isLoading) { return isLoading ? AppLoaderWidget() : Container(); } buildBodyWidget() { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [body, /*FloatingSearchButton()*/]); + return Stack(children: [ + body, /*FloatingSearchButton()*/ + ]); } } + +class AppBarWidget extends StatelessWidget with PreferredSizeWidget { + final AuthenticatedUserObject authenticatedUserObject = + locator(); + + final String appBarTitle; + final List appBarIcons; + final bool isShowAppBar; + + AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar); + + @override + Widget build(BuildContext context) { + return buildAppBar(context); + } + + Widget buildAppBar(BuildContext context) { + return isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(authenticatedUserObject.isLogin + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + (Route r) => false); + }, + ), + if (appBarIcons != null) ...appBarIcons + ], + ) + : Container( + height: 0, + width: 0, + ); + } + + @override + Size get preferredSize => Size(double.maxFinite, 60); +} diff --git a/pubspec.yaml b/pubspec.yaml index f43d4d93..04c631e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -178,6 +178,8 @@ flutter: - assets/tracker/ - assets/images/AlHabibMedicalService/ - assets/images/pharmacy_module/ + - assets/images/pharmacy_module/payment/ + - assets/images/pharmacy_module/lakum/ fonts: From 951c77feb56a9c3d2d2f514021036a1179f2aab0 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 3 Dec 2020 09:54:44 +0200 Subject: [PATCH 35/69] working on lakum account --- .../screens/lakum-points-year-page.dart | 31 ++++++-- .../widgets/lakum-point-table-row-widget.dart | 76 ++++++++++++++----- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/lib/pages/pharmacies/screens/lakum-points-year-page.dart b/lib/pages/pharmacies/screens/lakum-points-year-page.dart index 7538e287..79d36983 100644 --- a/lib/pages/pharmacies/screens/lakum-points-year-page.dart +++ b/lib/pages/pharmacies/screens/lakum-points-year-page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -41,14 +42,34 @@ class _LakumPointsYearPageState extends State { ...List.generate( widget.pointsAmountPerYear.length, (index) => LacumPointsYearWidget( - mediaQuery, - widget.selectedIndexYear == index, - widget.pointsAmountPerYear[index], - () {})), + mediaQuery, + widget.selectedIndexYear == index, + widget.pointsAmountPerYear[index], () { + setState(() { + widget.selectedIndexYear = index; + }); + })), ], ), ), - + SizedBox( + height: 10, + ), + LakumPointTableRowWidget(true, "MONTH", 0, 0, null, 0), + ...List.generate( + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth.length, + (index) => LakumPointTableRowWidget( + true, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].month, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].pointsPerMonth, + widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index].amountPerMonth, + (){}, + index), + ), ], ), ), diff --git a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart index 5ded2e75..ca465d77 100644 --- a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart +++ b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart @@ -1,15 +1,16 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/material.dart'; class LakumPointTableRowWidget extends StatefulWidget { final bool isTableTitle; // true : title , false: row - final String tableType; // month, day + final String rowTitle; final double points; final double riyal; final Function onTap; final int rowIndex; - LakumPointTableRowWidget( - this.isTableTitle, this.tableType, this.points, this.riyal, this.onTap, this.rowIndex); + LakumPointTableRowWidget(this.isTableTitle, this.rowTitle, this.points, + this.riyal, this.onTap, this.rowIndex); @override _LakumPointTableRowWidgetState createState() => @@ -20,22 +21,59 @@ class _LakumPointTableRowWidgetState extends State { @override Widget build(BuildContext context) { bool isEven = widget.rowIndex % 2 == 0; - return Container( - child: Column( - children: [ - Row( - children: [ - - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 1, - thickness: 2, - indent: 0, - endIndent: 0, - ), - ], + return InkWell( + onTap: widget.onTap, + child: Container( + color: isEven ? Color(0xffefefef) : Colors.white, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + child: Texts( + widget.rowTitle, + fontSize: 14, + fontWeight: widget.isTableTitle + ? FontWeight.bold + : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "POINTS" : widget.points, + fontSize: 14, + fontWeight: widget.isTableTitle + ? FontWeight.bold + : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "RIYAL" : widget.riyal, + fontSize: 14, + fontWeight: widget.isTableTitle + ? FontWeight.bold + : FontWeight.normal, + ), + )), + Expanded( + child: widget.isTableTitle + ? Container() + : Icon(Icons.arrow_forward_ios)), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 2, + indent: 0, + endIndent: 0, + ), + ], + ), ), ); } From 65fbd7af8e03ce1286092451eccb803fc27427bc Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Dec 2020 11:45:52 +0300 Subject: [PATCH 36/69] referral finalised --- lib/config/localized_values.dart | 17 +- .../get_ereferral_response_model.dart | 128 +++++++++++++ .../e_referral_service.dart | 20 ++- .../e_referral_view_model.dart | 10 +- .../E-Referral/referral_details.dart | 100 +++++++++++ .../E-Referral/search_for_referrals_page.dart | 168 +++++++++++++----- lib/uitl/date_uitl.dart | 15 ++ lib/uitl/translations_delegate_base.dart | 5 + 8 files changed, 414 insertions(+), 49 deletions(-) create mode 100644 lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart create mode 100644 lib/pages/AlHabibMedicalService/E-Referral/referral_details.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a5b22d8c..d51376c3 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1163,5 +1163,20 @@ const Map localizedValues = { "en": "The referral request has been submitted successfully, you will be contacted ASAP to complete the process. Referral request no is ", "ar": " تم إرسال طلب الإحالة بنجاح ، وسيتم الاتصال بك في أسرع وقت ممكن لإكمال العملية. رقم طلب الإحالة" }, - + "referralStatus": { + "en": "Referral Status", + "ar": "حالة الإحالة" + }, + "referralDate": { + "en": "Referral Date", + "ar": "تاريخ الإحالة" + }, + "patientName": { + "en": "Patient Name", + "ar": "اسم المريض" + }, + "referralNumber": { + "en": "Referral Number", + "ar": "رقم الإحالة" + } }; diff --git a/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart b/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart new file mode 100644 index 00000000..e873261d --- /dev/null +++ b/lib/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart @@ -0,0 +1,128 @@ +class GetEReferralResponseModel { + dynamic acceptedBrachCode; + dynamic acceptedBranchName; + dynamic acceptedBranchNameAr; + Channel channel; + dynamic identityCardAttachment; + String identityNumber; + dynamic insuranceCardAttachment; + bool isInsuredPatient; + String otherRelationship; + String patientContactNo; + int patientId; + String patientName; + int preferredBranchCode; + String preferredBranchName; + String referralDate; + int referralNumber; + Channel relationshipType; + String requesterContactNo; + String requesterName; + String status; + String statusAr; + + GetEReferralResponseModel( + {this.acceptedBrachCode, + this.acceptedBranchName, + this.acceptedBranchNameAr, + this.channel, + this.identityCardAttachment, + this.identityNumber, + this.insuranceCardAttachment, + this.isInsuredPatient, + this.otherRelationship, + this.patientContactNo, + this.patientId, + this.patientName, + this.preferredBranchCode, + this.preferredBranchName, + this.referralDate, + this.referralNumber, + this.relationshipType, + this.requesterContactNo, + this.requesterName, + this.status, + this.statusAr}); + + GetEReferralResponseModel.fromJson(Map json) { + acceptedBrachCode = json['AcceptedBrachCode']; + acceptedBranchName = json['AcceptedBranchName']; + acceptedBranchNameAr = json['AcceptedBranchNameAr']; + channel = + json['Channel'] != null ? new Channel.fromJson(json['Channel']) : null; + identityCardAttachment = json['IdentityCardAttachment']; + identityNumber = json['IdentityNumber']; + insuranceCardAttachment = json['InsuranceCardAttachment']; + isInsuredPatient = json['IsInsuredPatient']; + otherRelationship = json['OtherRelationship']; + patientContactNo = json['PatientContactNo']; + patientId = json['PatientId']; + patientName = json['PatientName']; + preferredBranchCode = json['PreferredBranchCode']; + preferredBranchName = json['PreferredBranchName']; + referralDate = json['ReferralDate']; + referralNumber = json['ReferralNumber']; + relationshipType = json['RelationshipType'] != null + ? new Channel.fromJson(json['RelationshipType']) + : null; + requesterContactNo = json['RequesterContactNo']; + requesterName = json['RequesterName']; + status = json['Status']; + statusAr = json['StatusAr']; + } + + Map toJson() { + final Map data = new Map(); + data['AcceptedBrachCode'] = this.acceptedBrachCode; + data['AcceptedBranchName'] = this.acceptedBranchName; + data['AcceptedBranchNameAr'] = this.acceptedBranchNameAr; + if (this.channel != null) { + data['Channel'] = this.channel.toJson(); + } + data['IdentityCardAttachment'] = this.identityCardAttachment; + data['IdentityNumber'] = this.identityNumber; + data['InsuranceCardAttachment'] = this.insuranceCardAttachment; + data['IsInsuredPatient'] = this.isInsuredPatient; + data['OtherRelationship'] = this.otherRelationship; + data['PatientContactNo'] = this.patientContactNo; + data['PatientId'] = this.patientId; + data['PatientName'] = this.patientName; + data['PreferredBranchCode'] = this.preferredBranchCode; + data['PreferredBranchName'] = this.preferredBranchName; + data['ReferralDate'] = this.referralDate; + data['ReferralNumber'] = this.referralNumber; + if (this.relationshipType != null) { + data['RelationshipType'] = this.relationshipType.toJson(); + } + data['RequesterContactNo'] = this.requesterContactNo; + data['RequesterName'] = this.requesterName; + data['Status'] = this.status; + data['StatusAr'] = this.statusAr; + return data; + } +} + +class Channel { + int iD; + String text; + String textAr; + String textEn; + + Channel({this.iD, this.text, this.textAr, this.textEn}); + + Channel.fromJson(Map json) { + iD = json['ID']; + text = json['Text']; + textAr = json['Text_Ar']; + textEn = json['Text_En']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['Text'] = this.text; + data['Text_Ar'] = this.textAr; + data['Text_En'] = this.textEn; + return data; + } +} diff --git a/lib/core/service/AlHabibMedicalService/e_referral_service.dart b/lib/core/service/AlHabibMedicalService/e_referral_service.dart index c951a968..3670e965 100644 --- a/lib/core/service/AlHabibMedicalService/e_referral_service.dart +++ b/lib/core/service/AlHabibMedicalService/e_referral_service.dart @@ -122,9 +122,7 @@ class EReferralService extends BaseService { Future getEReferrals( SearchEReferralRequestModel searchEReferralRequestModel) async { hasError = false; - dynamic localRes; - await baseAppClient.post(GET_E_REFERRALS, onSuccess: (dynamic response, int statusCode) { print("EEEEEE"); @@ -136,4 +134,22 @@ class EReferralService extends BaseService { }, body: searchEReferralRequestModel.toJson()); return Future.value(localRes); } + + Future getEReferralsIfLogin(String mobileNo) async { + hasError = false; + dynamic localRes; + Map request = {}; + request['PatientMobileNumber'] = mobileNo; + await baseAppClient.post(GET_E_REFERRALS, + onSuccess: (dynamic response, int statusCode) { + print("EEEEEE"); + _allReferral.clear(); + localRes = response; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: request); + return Future.value(localRes); + } + } diff --git a/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart b/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart index 45adb6d3..047e06f2 100644 --- a/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart +++ b/lib/core/viewModels/all_habib_medical_services/e_referral_view_model.dart @@ -107,14 +107,20 @@ class EReferralViewModel extends BaseViewModel { return Future.value(localRes); } - getEReferrals(SearchEReferralRequestModel searchEReferralRequestModel) async { + Future getEReferrals(SearchEReferralRequestModel searchEReferralRequestModel) async { setState(ViewState.BusyLocal); - await _eReferralService.getEReferrals(searchEReferralRequestModel); + dynamic localRes; + await _eReferralService.getEReferrals(searchEReferralRequestModel).then((response) { + localRes = response; + }); if (_eReferralService.hasError) { error = _eReferralService.error; setState(ViewState.ErrorLocal); } else { setState(ViewState.Idle); } + + return Future.value(localRes); + } } diff --git a/lib/pages/AlHabibMedicalService/E-Referral/referral_details.dart b/lib/pages/AlHabibMedicalService/E-Referral/referral_details.dart new file mode 100644 index 00000000..925d20cd --- /dev/null +++ b/lib/pages/AlHabibMedicalService/E-Referral/referral_details.dart @@ -0,0 +1,100 @@ +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class ReferralDetails extends StatefulWidget { + GetEReferralResponseModel getEReferralResponseModel; + + ReferralDetails({@required this.getEReferralResponseModel}); + + @override + _ReferralDetailsState createState() => _ReferralDetailsState(); +} + +class _ReferralDetailsState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowDecPage: false, + isShowAppBar: true, + appBarTitle: "Referral Details", + body: Container( + margin: EdgeInsets.only(top: 20.0, left: 20.0, right: 20.0), + child: Table( + border: TableBorder.all(color: Colors.grey[600]), + children: [ + TableRow(children: [ + TableCell( + child: _getNormalText( + TranslationBase.of(context).referralStatus)), + TableCell( + child: + _getNormalText(widget.getEReferralResponseModel.status)), + ]), + TableRow(children: [ + TableCell( + child: + _getNormalText(TranslationBase.of(context).patientName)), + TableCell( + child: _getNormalText( + widget.getEReferralResponseModel.patientName)), + ]), + TableRow(children: [ + TableCell( + child: _getNormalText( + TranslationBase.of(context).referralNumber)), + TableCell( + child: _getNormalText(widget + .getEReferralResponseModel.referralNumber + .toString())), + ]), + TableRow(children: [ + TableCell( + child: _getNormalText( + TranslationBase.of(context).referralDate)), + TableCell( + child: _getNormalText(DateUtil.getMonthDayYearDateFormatted( + DateUtil.convertStringToDateNoTimeZone( + widget.getEReferralResponseModel.referralDate)))), + ]), + TableRow(children: [ + TableCell( + child: _getNormalText(TranslationBase.of(context).hospital)), + TableCell( + child: _getNormalText( + widget.getEReferralResponseModel.preferredBranchName)), + ]), + ], + ), + ), + ); + } + + _getNormalText(text) { + return Container( + color: Colors.white, + padding: EdgeInsets.only(top: 12.0, bottom: 12.0), + child: Text(text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14, + fontFamily: 'Open-Sans', + letterSpacing: 0.5, + color: Colors.grey[800])), + ); + } + + _getHeadingText(text) { + return Container( + padding: EdgeInsets.only(bottom: 10.0), + child: Text(text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26.0, + fontFamily: 'Open-Sans', + letterSpacing: 0.5, + color: Colors.white))); + } +} diff --git a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart index e74b6acf..e6aecf2c 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart @@ -1,18 +1,19 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/get_ereferral_response_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_criteria_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/EReferral/search_e_referral_request_model.dart'; import 'package:diplomaticquarterapp/core/service/AlHabibMedicalService/e_referral_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/referral_details.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/errors/app_embedded_error.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -35,6 +36,8 @@ class _SearchForReferralsPageState extends State { bool _isSubmitted = false; AuthenticatedUser authUser; + List allReferrals = List(); + dynamic _selectedCountry = { "name": "Saudi Arabia", "name_ar": "المملكة العربية السعودية", @@ -130,34 +133,93 @@ class _SearchForReferralsPageState extends State { ? "11" : _selectedCountry["code"], ), - SizedBox( - height: 12, - ), - if ((model.state == ViewState.Idle && - model.allReferral.length == 0)) - Text("There's No Referral To deliver"), - if ((model.state == ViewState.ErrorLocal)) - AppEmbeddedError(error: model.error), - NetworkBaseView( - baseViewModel: model, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.vertical, - itemCount: model.allReferral == null - ? 0 - : model.allReferral.length < 3 - ? model.allReferral.length - : 3, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 0.2), - child: Container( - child: Texts("TODO add referral info"), + allReferrals.length != 0 + ? Container( + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.vertical, + physics: ScrollPhysics(), + itemCount: allReferrals.length, + itemBuilder: + (BuildContext context, int index) { + return Container( + child: InkWell( + onTap: () { + navigateToReferralDetails( + allReferrals[index]); + }, + child: Card( + margin: EdgeInsets.only(bottom: 10.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(10), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .status, + style: TextStyle( + fontSize: 16.0))), + Container( + margin: EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .patientName, + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + Container( + margin: EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .preferredBranchName, + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + Container( + margin: EdgeInsets.all(5.0), + child: Text( + DateUtil.getMonthDayYearDateFormatted( + DateUtil.convertStringToDateNoTimeZone( + allReferrals[ + index] + .referralDate)), + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + ], + ), + Container( + margin: EdgeInsets.only( + right: 20.0, left: 20.0), + child: Icon(Icons.arrow_forward, + size: 20.0, + color: Colors.grey[700]), + ), + ], + ), + ), + )); + }, ), - ); - }, - ), - ), + ) + : Container(), + SizedBox( + height: 70.0, + ) ], ), ), @@ -174,8 +236,10 @@ class _SearchForReferralsPageState extends State { onTap: () async { SearchEReferralRequestModel searchEReferralRequestModel = new SearchEReferralRequestModel( - patientMobileNumber: - _selectedCountry['code'] + _mobileTextController.text, + patientMobileNumber: _selectedCountry['code'] + .toString() + .replaceFirst("+", "") + + _mobileTextController.text, ); if (selectedCriteria.value == 1) { searchEReferralRequestModel.identificationNo = @@ -186,9 +250,17 @@ class _SearchForReferralsPageState extends State { int.parse(_searchTextController.text); searchEReferralRequestModel.identificationNo = ''; } - await model.getEReferrals(searchEReferralRequestModel); - setState(() { - _isSubmitted = true; + await model + .getEReferrals(searchEReferralRequestModel) + .then((response) { + print(response['List_EReferrals']); + allReferrals.clear(); + setState(() { + response['List_EReferrals'].forEach((data) { + allReferrals.add(GetEReferralResponseModel.fromJson(data)); + _isSubmitted = true; + }); + }); }); }, loading: model.state == ViewState.BusyLocal, @@ -198,7 +270,7 @@ class _SearchForReferralsPageState extends State { ))); } - void getEreferrals() { + void getEreferralsIsLogin() { EReferralService _eReferralService = locator(); String mobileNumber; @@ -217,16 +289,15 @@ class _SearchForReferralsPageState extends State { zipCode = "971"; } - SearchEReferralRequestModel searchEReferralRequestModel = - new SearchEReferralRequestModel( - patientMobileNumber: zipCode + mobileNumber, - identificationNo: authUser.patientIdentificationNo, - referralNumber: 0); - _eReferralService - .getEReferrals(searchEReferralRequestModel) + .getEReferralsIfLogin(zipCode + mobileNumber) .then((response) { - print(response['List_EReferrals']); + allReferrals.clear(); + setState(() { + response['List_EReferrals'].forEach((data) { + allReferrals.add(GetEReferralResponseModel.fromJson(data)); + }); + }); }).catchError(() {}); } @@ -237,7 +308,7 @@ class _SearchForReferralsPageState extends State { AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); setState(() { authUser = data; - getEreferrals(); + getEreferralsIsLogin(); }); } } @@ -256,6 +327,15 @@ class _SearchForReferralsPageState extends State { ); } + navigateToReferralDetails( + GetEReferralResponseModel getEReferralResponseModel) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ReferralDetails( + getEReferralResponseModel: getEReferralResponseModel))); + } + String getCountryName() { if (_selectedCountry != null) return _selectedCountry["name"]; diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 34c7bf87..0b2b45d9 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -19,6 +19,21 @@ class DateUtil { return DateTime.now(); } + static DateTime convertStringToDateNoTimeZone(String date) { + if (date != null) { + const start = "/Date("; + const end = ")/"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + return DateTime.fromMillisecondsSinceEpoch( + int.parse( + date.substring(startIndex + start.length, endIndex), + ), + ); + } else + return DateTime.now(); + } + static String convertDateToString(DateTime date) { const start = "/Date("; const end = "+0300)/"; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 48743fcd..aa05456c 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -899,6 +899,11 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; + String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; + String get referralDate => localizedValues['referralDate'][locale.languageCode]; + String get patientName => localizedValues['patientName'][locale.languageCode]; + String get referralNumber => localizedValues['referralNumber'][locale.languageCode]; + } From 4f1f7dcefdc317bac2e5b1310f1e7ff75f38dc6e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Dec 2020 13:38:45 +0300 Subject: [PATCH 37/69] ereferral implementation completed --- .../E-Referral/search_for_referrals_page.dart | 130 ++++++++++-------- 1 file changed, 72 insertions(+), 58 deletions(-) diff --git a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart index e6aecf2c..49c5dd60 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/search_for_referrals_page.dart @@ -11,9 +11,11 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -135,6 +137,8 @@ class _SearchForReferralsPageState extends State { ), allReferrals.length != 0 ? Container( + transform: + Matrix4.translationValues(0.0, -40.0, 0.0), child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.vertical, @@ -155,61 +159,68 @@ class _SearchForReferralsPageState extends State { borderRadius: BorderRadius.circular(10), ), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.all(5.0), - child: Text( - allReferrals[index] - .status, - style: TextStyle( - fontSize: 16.0))), - Container( - margin: EdgeInsets.all(5.0), - child: Text( - allReferrals[index] - .patientName, - style: TextStyle( - fontSize: 16.0, - color: Colors - .grey[600]))), - Container( - margin: EdgeInsets.all(5.0), - child: Text( - allReferrals[index] - .preferredBranchName, - style: TextStyle( - fontSize: 16.0, - color: Colors - .grey[600]))), - Container( - margin: EdgeInsets.all(5.0), - child: Text( - DateUtil.getMonthDayYearDateFormatted( - DateUtil.convertStringToDateNoTimeZone( - allReferrals[ - index] - .referralDate)), - style: TextStyle( - fontSize: 16.0, - color: Colors - .grey[600]))), - ], - ), - Container( - margin: EdgeInsets.only( - right: 20.0, left: 20.0), - child: Icon(Icons.arrow_forward, - size: 20.0, - color: Colors.grey[700]), - ), - ], + child: Container( + margin: EdgeInsets.only( + left: 10.0, right: 10.0), + padding: EdgeInsets.all(5.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + margin: + EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .status, + style: TextStyle( + fontSize: 16.0))), + Container( + margin: + EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .patientName, + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + Container( + margin: + EdgeInsets.all(5.0), + child: Text( + allReferrals[index] + .preferredBranchName, + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + Container( + margin: + EdgeInsets.all(5.0), + child: Text( + DateUtil.getMonthDayYearDateFormatted( + DateUtil.convertStringToDateNoTimeZone( + allReferrals[ + index] + .referralDate)), + style: TextStyle( + fontSize: 16.0, + color: Colors + .grey[600]))), + ], + ), + Container( + child: Icon(Icons.arrow_forward, + size: 20.0, + color: Colors.grey[700]), + ), + ], + ), ), ), )); @@ -234,6 +245,7 @@ class _SearchForReferralsPageState extends State { textColor: Colors.white, label: "Search", onTap: () async { + GifLoaderDialogUtils.showMyDialog(context); SearchEReferralRequestModel searchEReferralRequestModel = new SearchEReferralRequestModel( patientMobileNumber: _selectedCountry['code'] @@ -253,11 +265,13 @@ class _SearchForReferralsPageState extends State { await model .getEReferrals(searchEReferralRequestModel) .then((response) { + GifLoaderDialogUtils.hideDialog(context); print(response['List_EReferrals']); allReferrals.clear(); setState(() { response['List_EReferrals'].forEach((data) { - allReferrals.add(GetEReferralResponseModel.fromJson(data)); + allReferrals + .add(GetEReferralResponseModel.fromJson(data)); _isSubmitted = true; }); }); @@ -331,8 +345,8 @@ class _SearchForReferralsPageState extends State { GetEReferralResponseModel getEReferralResponseModel) { Navigator.push( context, - MaterialPageRoute( - builder: (context) => ReferralDetails( + FadePage( + page: ReferralDetails( getEReferralResponseModel: getEReferralResponseModel))); } From ea195ea9bfa1c02a87e82a2850f7edda6d2fa51b Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Thu, 3 Dec 2020 13:13:58 +0200 Subject: [PATCH 38/69] Finish translate CMC HHC --- lib/config/localized_values.dart | 25 +- .../Dialog/confirm_cancel_order_dialog.dart | 4 +- .../NewCMC/cmc_location_page.dart | 3 +- .../NewCMC/new_cmc_page.dart | 4 +- .../NewCMC/new_cmc_step_one_page.dart | 215 ++++++++++-------- .../NewCMC/new_cmc_step_three_page.dart | 82 ++++--- .../NewCMC/new_cmc_step_tow_page.dart | 4 +- .../ComprehensiveMedicalCheckup/cmc_page.dart | 3 +- .../orders_log_details_page.dart | 2 +- .../new_e_referral_step_one_page.dart | 3 +- .../new_e_referral_step_two_page.dart | 3 +- .../Dialog/confirm_cancel_order_dialog.dart | 4 +- .../NewHomeHealthCare/location_page.dart | 3 +- .../new_Home_health_care_step_one_page.dart | 48 ++-- .../new_Home_health_care_step_three_page.dart | 15 +- .../new_Home_health_care_step_tow_page.dart | 7 +- .../new_home_health_care_page.dart | 2 +- .../HomeHealthCare/home_health_care_page.dart | 1 - .../orders_log_details_page.dart | 2 +- .../rate_appointment_doctor.dart | 3 +- lib/uitl/translations_delegate_base.dart | 8 + .../dialogs/select_location_dialog.dart | 2 +- 22 files changed, 257 insertions(+), 186 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index f7e6cc64..6724ae4b 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1170,18 +1170,15 @@ const Map localizedValues = { "OrderStatus": { "en": "Status", "ar": "الحاله" - },"pickupDate": { - "en": "Pickup Date", - "ar": "التاريخ" - } - ,"serviceName": { - "en": "Service Name", - "ar": " اسم الخدمة" - } - ,"orderLocation": { - "en": "Location", - "ar": "الموقع" - }, - - + },"pickupDate": {"en": "Pickup Date", "ar": "التاريخ"}, + "serviceName": {"en": "Service Name", "ar": " اسم الخدمة"}, + "orderLocation": {"en": "Location", "ar": "الموقع"}, + "selectService": {"en": "Select Service", "ar": "حدد الخدمة"}, + "coveredService": {"en": "Covered Service : ", "ar": " الخدمات المغطاة : "}, + "selectAddress": {"en": "Select Address", "ar": "حدد العنوان"}, + "addNewAddress": {"en": "Add New Address", "ar": "أضف عنوان جديد"}, + "selectedService": {"en": "Selected Service : ", "ar": " الخدمات المختارة : "}, + "cancelOrderMsg": {"en": "Are you sure!! want to cancel this order", "ar": "هل أنت واثق!! تريد إلغاء هذا الطلب"}, + "processDoneSuccessfully": {"en": "Process Done Successfully", "ar": "تمت العملية بنجاح"}, + "selectHomeHealthCareServices": {"en": "Select Home Health Care Services", "ar": " حدد خدمات الرعاية الصحية المنزلية"}, }; diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/Dialog/confirm_cancel_order_dialog.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/Dialog/confirm_cancel_order_dialog.dart index 45bf01b7..549f90b8 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/Dialog/confirm_cancel_order_dialog.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/Dialog/confirm_cancel_order_dialog.dart @@ -30,7 +30,7 @@ class _ConfirmCancelOrderDialogState extends State { contentPadding: EdgeInsets.fromLTRB(28.0, 24.0, 28.0, 0.0), title: Center( child: Texts( - "Confirm", + TranslationBase.of(context).confirm, color: Colors.black, ), ), @@ -40,7 +40,7 @@ class _ConfirmCancelOrderDialogState extends State { Divider(), Center( child: Texts( - "Are you sure!! want to cancel this order", + TranslationBase.of(context).cancelOrderMsg , color: Colors.grey, ), ), diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart index ee32bcb6..c584a21e 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/cmc_location_page.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -132,7 +133,7 @@ class _CMCLocationPageState } Navigator.of(context).pop(); }, - label: " Add New Address ", + label: TranslationBase.of(context).addNewAddress, ), ], ), diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart index a73c38bf..ecfe31fb 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_page.dart @@ -49,7 +49,7 @@ class _NewCMCPageState extends State price: widget.model.cmcAllServicesList[0].price, serviceID: widget.model.cmcAllServicesList[0].serviceID.toString(), selectedServiceName: widget.model.cmcAllServicesList[0].description, - selectedServiceNameAR: widget.model.cmcAllServicesList[0].description, + selectedServiceNameAR: widget.model.cmcAllServicesList[0].descriptionN, recordID: 1, totalPrice: widget.model.cmcAllServicesList[0].totalPrice, vAT: widget.model.cmcAllServicesList[0].vAT); @@ -106,7 +106,7 @@ class _NewCMCPageState extends State if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); } else { - AppToast.showSuccessToast(message: "Done Successfully"); + AppToast.showSuccessToast(message:TranslationBase.of(context).processDoneSuccessfully ); await model.getCmcAllPresOrders(); } }, diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart index 7da00dee..b80d125a 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_one_page.dart @@ -2,12 +2,15 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_get_items_request_model.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class NewCMCStepOnePage extends StatefulWidget { final CMCInsertPresOrderRequestModel cMCInsertPresOrderRequestModel; @@ -33,6 +36,8 @@ class _NewCMCStepOnePageState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return AppScaffold( isShowAppBar: false, baseViewModel: widget.model, @@ -52,17 +57,17 @@ class _NewCMCStepOnePageState extends State { height: 20, ), Texts( - "Select Home Health Care Services", + TranslationBase.of(context).selectService, textAlign: TextAlign.center, ), Column( children: - widget.model.cmcAllServicesList.map((service) { + widget.model.cmcAllServicesList.map((service) { return Container( margin: EdgeInsets.only(top: 15), decoration: BoxDecoration( border: - Border.all(color: Colors.grey, width: 1), + Border.all(color: Colors.grey, width: 1), borderRadius: BorderRadius.circular(12), color: Colors.white), child: Column( @@ -74,50 +79,53 @@ class _NewCMCStepOnePageState extends State { activeColor: Colors.red[800], onChanged: (newValue) async { PatientERCMCInsertServicesList - patientERCMCInsertServicesList = - new PatientERCMCInsertServicesList( - price: service.price, - serviceID: service.serviceID - .toString(), - selectedServiceName: - service.description, - selectedServiceNameAR: - service.description, - recordID: 1, - totalPrice: - service.totalPrice, - vAT: service.vAT); + patientERCMCInsertServicesList = + new PatientERCMCInsertServicesList( + price: service.price, + serviceID: service.serviceID + .toString(), + selectedServiceName: + service.description, + selectedServiceNameAR: + service.descriptionN, + recordID: 1, + totalPrice: + service.totalPrice, + vAT: service.vAT); setState(() { widget .cMCInsertPresOrderRequestModel - .patientERCMCInsertServicesList = [ + .patientERCMCInsertServicesList = + [ patientERCMCInsertServicesList ]; }); CMCGetItemsRequestModel - cMCGetItemsRequestModel = - new CMCGetItemsRequestModel( - checkupType: newValue); + cMCGetItemsRequestModel = + new CMCGetItemsRequestModel( + checkupType: newValue); await widget.model.getCheckupItems( cMCGetItemsRequestModel: - cMCGetItemsRequestModel); + cMCGetItemsRequestModel); }, groupValue: widget - .cMCInsertPresOrderRequestModel - .patientERCMCInsertServicesList - .length > - 0 + .cMCInsertPresOrderRequestModel + .patientERCMCInsertServicesList + .length > + 0 ? int.parse(widget - .cMCInsertPresOrderRequestModel - .patientERCMCInsertServicesList[ - 0] - .serviceID) + .cMCInsertPresOrderRequestModel + .patientERCMCInsertServicesList[ + 0] + .serviceID) : 1), Expanded( child: Padding( padding: const EdgeInsets.all(20.0), child: Texts( - service.description, + projectViewModel.isArabic ? service + .descriptionN : service + .description, fontSize: 15, ), ), @@ -139,52 +147,67 @@ class _NewCMCStepOnePageState extends State { color: Colors.white, width: double.infinity, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: widget.model.checkupItems.map((item) { - return Center( - child: FractionallySizedBox( - widthFactor: 1, - child: Container( - margin: EdgeInsets.only(top: 15), - decoration: BoxDecoration(color: Colors.white), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 12, - ), - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 15, bottom: 5, top: 5), - decoration: BoxDecoration( - border: BorderDirectional( - bottom: BorderSide( - style: BorderStyle.solid, - width: 0.5, - color: Colors.grey)), - //borderRadius: , - color: Colors.white), - child: Column( - crossAxisAlignment: + children: [ + Row( + children: [ + Container(margin: EdgeInsets.only( + right: 10, left: 10), child: Texts(TranslationBase.of(context).coveredService, fontWeight: FontWeight.bold,)) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: widget.model.checkupItems.map((item) { + return Center( + child: FractionallySizedBox( + widthFactor: 1, + child: Container( + margin: EdgeInsets.only(top: 15), + decoration: BoxDecoration( + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment + .start, + children: [ + SizedBox( + height: 12, + ), + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 15, bottom: 5, top: 5), + decoration: BoxDecoration( + border: BorderDirectional( + bottom: BorderSide( + style: BorderStyle.solid, + width: 0.5, + color: Colors.grey)), + //borderRadius: , + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - item.itemName, - fontSize: 15, + children: [ + Container(margin: EdgeInsets.only( + right: 10, left: 10), + child: Texts( + item.itemName, + fontSize: 15, fontWeight: FontWeight.bold + ), + ), + ], ), - ], - ), - ), - SizedBox( - height: 12, + ), + SizedBox( + height: 12, + ), + ], ), - ], + ), ), - ), - ), - ); - }).toList()), + ); + }).toList()), + ], + ), ) ], ), @@ -199,40 +222,44 @@ class _NewCMCStepOnePageState extends State { Container( width: MediaQuery.of(context).size.width * 0.9, child: SecondaryButton( - label: "Next", - textColor: Theme.of(context).backgroundColor, + label: TranslationBase + .of(context) + .next, + textColor: Theme + .of(context) + .backgroundColor, color: Colors.grey[800], - onTap: () async { + onTap: () async { if (widget.cMCInsertPresOrderRequestModel - .patientERCMCInsertServicesList.length != - 0 || + .patientERCMCInsertServicesList.length != + 0 || widget.cMCInsertPresOrderRequestModel - .patientERCMCInsertServicesList == + .patientERCMCInsertServicesList == null) { int index = widget.model.cmcAllServicesList.length; PatientERCMCInsertServicesList - patientERCMCInsertServicesList = - new PatientERCMCInsertServicesList( - price: widget - .model.cmcAllServicesList[index - 1].price, - serviceID: widget - .model.cmcAllServicesList[index - 1].serviceID - .toString(), - selectedServiceName: widget.model - .cmcAllServicesList[index - 1].description, - selectedServiceNameAR: widget.model - .cmcAllServicesList[index - 1].description, - recordID: 1, - totalPrice: widget - .model.cmcAllServicesList[index - 1].totalPrice, - vAT: widget.model.cmcAllServicesList[index-1].vAT); + patientERCMCInsertServicesList = + new PatientERCMCInsertServicesList( + price: widget + .model.cmcAllServicesList[index - 1].price, + serviceID: widget + .model.cmcAllServicesList[index - 1].serviceID + .toString(), + selectedServiceName: widget.model + .cmcAllServicesList[index - 1].description, + selectedServiceNameAR: widget.model + .cmcAllServicesList[index - 1].descriptionN, + recordID: 1, + totalPrice: widget + .model.cmcAllServicesList[index - 1].totalPrice, + vAT: widget.model.cmcAllServicesList[index - 1].vAT); widget.cMCInsertPresOrderRequestModel .patientERCMCInsertServicesList = [ patientERCMCInsertServicesList ]; await widget.model.getCustomerInfo(); - if(widget.model.state == ViewState.ErrorLocal){ + if (widget.model.state == ViewState.ErrorLocal) { Utils.showErrorToast(); } else { widget.changePageViewIndex(1); diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart index 893fbfa9..eea9853b 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_three_page.dart @@ -2,15 +2,16 @@ import 'dart:async'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_insert_pres_order_request_model.dart'; -import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:provider/provider.dart'; class NewCMCStepThreePage extends StatefulWidget { final CMCInsertPresOrderRequestModel cmcInsertPresOrderRequestModel; @@ -63,19 +64,23 @@ class _NewCMCStepThreePageState @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( isShowDecPage: false, baseViewModel: widget.model, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( - height: 400, + height: 500, width: double.maxFinite, margin: EdgeInsets.only(left: 12, right: 12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Order Details'), + Texts( + TranslationBase.of(context).orderDetails, + fontWeight: FontWeight.bold, + ), SizedBox( height: 12, ), @@ -87,7 +92,9 @@ class _NewCMCStepThreePageState child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Location :'), + Texts(TranslationBase + .of(context) + .orderLocation + " : ", fontWeight: FontWeight.bold,), SizedBox( height: 12, ), @@ -108,30 +115,40 @@ class _NewCMCStepThreePageState SizedBox( height: 12, ), - Texts('Selected Service :'), + Texts(TranslationBase + .of(context) + .selectedService), ...List.generate( - widget.cmcInsertPresOrderRequestModel.patientERCMCInsertServicesList.length, - (index) => Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - 'Service Name :', - fontSize: 12, - ), - SizedBox( - height: 5, - ), - Texts( - widget - .cmcInsertPresOrderRequestModel.patientERCMCInsertServicesList[index] - .selectedServiceName, - fontSize: 15, - bold: true, + widget.cmcInsertPresOrderRequestModel + .patientERCMCInsertServicesList.length, + (index) => + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase + .of(context) + .serviceName, + fontSize: 12, fontWeight: FontWeight.bold, + ), + SizedBox( + height: 5, + ), + Texts( + projectViewModel.isArabic ? widget + .cmcInsertPresOrderRequestModel + .patientERCMCInsertServicesList[index] + .selectedServiceNameAR : widget + .cmcInsertPresOrderRequestModel + .patientERCMCInsertServicesList[index] + .selectedServiceName, + fontSize: 15, + bold: true, + ), + ], ), - ], - ), - ), + ), ) ], ), @@ -148,15 +165,20 @@ class _NewCMCStepThreePageState Container( width: MediaQuery.of(context).size.width * 0.9, child: SecondaryButton( - label: "Confirm", + label: TranslationBase + .of(context) + .confirm, color: Colors.grey[800], onTap: () async { - await widget.model.insertPresPresOrder(order: widget.cmcInsertPresOrderRequestModel); + await widget.model.insertPresPresOrder( + order: widget.cmcInsertPresOrderRequestModel); if (widget.model.state != ViewState.ErrorLocal) { widget.changePageViewIndex(0); } }, - textColor: Theme.of(context).backgroundColor), + textColor: Theme + .of(context) + .backgroundColor), ), ], ), diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart index c1ec952f..cc8ea8dd 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/NewCMC/new_cmc_step_tow_page.dart @@ -121,7 +121,7 @@ class _NewCMCStepTowPageState ), ); }, - label: " Add New Address ", + label: TranslationBase.of(context).addNewAddress, ), SizedBox(height: 10,), SecondaryButton( @@ -204,6 +204,6 @@ class _NewCMCStepTowPageState if (_selectedAddress != null) return _selectedAddress.address1; else - return "Select Address" /*TranslationBase.of(context).selectHospital*/; + return TranslationBase.of(context).selectAddress; } } diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart index 04d8ea36..06a83cc1 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart @@ -89,7 +89,8 @@ class _CMCPageState extends State Container( width: MediaQuery.of(context).size.width * 0.37, child: Center( - child: Texts("CMC Service"), + child: Texts(TranslationBase.of(context) + .comprehensiveMedicalCheckup), ), ), Container( diff --git a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart index 54f33f2b..ec686e70 100644 --- a/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart +++ b/lib/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/orders_log_details_page.dart @@ -41,7 +41,7 @@ class OrdersLogDetailsPage extends StatelessWidget { if(model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); } else { - AppToast.showSuccessToast(message: "Done Successfully"); + AppToast.showSuccessToast(message:TranslationBase.of(context).processDoneSuccessfully ); await model.getCmcAllPresOrders(); } }, diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart index db549626..e486d9aa 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_one_page.dart @@ -12,6 +12,7 @@ import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_re import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -188,7 +189,7 @@ class _NewEReferralStepOnePageState extends State { padding: EdgeInsets.all(9), child: SecondaryButton( textColor: Colors.white, - label: "Next", + label: TranslationBase.of(context).next, onTap: () async { SendActivationCodeForEReferralRequestModel sendActivationCodeForEReferralRequestModel = diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart index 34616def..1ecd2e07 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_two_page.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/dial import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_options/BottomSheet.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -179,7 +180,7 @@ class _NewEReferralStepTowPageState extends State { padding: EdgeInsets.all(9), child: SecondaryButton( textColor: Colors.white, - label: "Next", + label: TranslationBase.of(context).next, onTap: () async { this.widget.changePageViewIndex(2); this.widget.createEReferralRequestModel.identificationNo = int.parse( _patientIdentificationTextController.text); diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/confirm_cancel_order_dialog.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/confirm_cancel_order_dialog.dart index 17be8edd..bfab0324 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/confirm_cancel_order_dialog.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/Dialog/confirm_cancel_order_dialog.dart @@ -29,7 +29,7 @@ class _ConfirmCancelOrderDialogState extends State { contentPadding: EdgeInsets.fromLTRB(28.0, 24.0, 28.0, 0.0), title: Center( child: Texts( - "Confirm", + TranslationBase.of(context).confirm, color: Colors.black, ), ), @@ -39,7 +39,7 @@ class _ConfirmCancelOrderDialogState extends State { Divider(), Center( child: Texts( - "Are you sure!! want to cancel this order", + TranslationBase.of(context).cancelOrderMsg , color: Colors.grey, ), ), diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart index 8592cb34..d7434b97 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/location_page.dart @@ -5,6 +5,7 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -130,7 +131,7 @@ class _LocationPageState } Navigator.of(context).pop(); }, - label: " Add New Address ", + label: TranslationBase.of(context).addNewAddress, ), ], ), diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart index bc5a4a99..447ba177 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_one_page.dart @@ -2,16 +2,16 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/PatientERHHCInsertServicesList.dart'; import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/HomeHealthCare/patient_er_insert_pres_order_request_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:geolocator/geolocator.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; +import 'package:provider/provider.dart'; class NewHomeHealthCareStepOnePage extends StatefulWidget { final PatientERInsertPresOrderRequestModel @@ -46,6 +46,8 @@ class _NewHomeHealthCareStepOnePageState extends State if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); } else { - AppToast.showSuccessToast(message: "Done Successfully"); + AppToast.showSuccessToast(message:TranslationBase.of(context).processDoneSuccessfully ); await model.getHHCAllPresOrders(); // await model.getHHCAllServices(); } diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart index c249362b..fcdc144a 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart @@ -44,7 +44,6 @@ class _HomeHealthCarePageState extends State isShowAppBar: true, description: TranslationBase.of(context).HHCNotAuthMsg, appBarTitle: TranslationBase.of(context).homeHealthCare, - // appBarTitle: TranslationBase.of(context).homeHealthCare, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart index 13297974..f0ca5fe4 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/orders_log_details_page.dart @@ -40,7 +40,7 @@ class OrdersLogDetailsPage extends StatelessWidget { if(model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); } else { - AppToast.showSuccessToast(message: "Done Successfully"); + AppToast.showSuccessToast(message:TranslationBase.of(context).processDoneSuccessfully ); await model.getHHCAllPresOrders(); // await model.getHHCAllServices(); } diff --git a/lib/pages/rateAppointment/rate_appointment_doctor.dart b/lib/pages/rateAppointment/rate_appointment_doctor.dart index 7a128b10..b79911ef 100644 --- a/lib/pages/rateAppointment/rate_appointment_doctor.dart +++ b/lib/pages/rateAppointment/rate_appointment_doctor.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_clinic.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -204,7 +205,7 @@ class _RateAppointmentDoctorState extends State { ); } }, - label: "Next", + label: TranslationBase.of(context).next, disabled: model.state == ViewState.BusyLocal, loading: model.state == ViewState.BusyLocal, textColor: Theme.of(context).backgroundColor), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 4906d5a9..b1a404c5 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -903,6 +903,14 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get pickupDate => localizedValues['pickupDate'][locale.languageCode]; String get serviceName => localizedValues['serviceName'][locale.languageCode]; String get orderLocation => localizedValues['orderLocation'][locale.languageCode]; + String get selectService => localizedValues['selectService'][locale.languageCode]; + String get coveredService => localizedValues['coveredService'][locale.languageCode]; + String get selectAddress => localizedValues['selectAddress'][locale.languageCode]; + String get addNewAddress => localizedValues['addNewAddress'][locale.languageCode]; + String get selectedService => localizedValues['selectedService'][locale.languageCode]; + String get cancelOrderMsg => localizedValues['cancelOrderMsg'][locale.languageCode]; + String get processDoneSuccessfully => localizedValues['processDoneSuccessfully'][locale.languageCode]; + String get selectHomeHealthCareServices => localizedValues['selectHomeHealthCareServices'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/dialogs/select_location_dialog.dart b/lib/widgets/dialogs/select_location_dialog.dart index 34e37208..ad7e7a42 100644 --- a/lib/widgets/dialogs/select_location_dialog.dart +++ b/lib/widgets/dialogs/select_location_dialog.dart @@ -27,7 +27,7 @@ class _SelectLocationDialogState extends State { @override Widget build(BuildContext context) { return SimpleDialog( - title: Texts("sdsdsd"), + title: Texts(TranslationBase.of(context).selectAddress), children: [ Column( children: [ From d9ffc5d3da4b5770c262dea83b8431f98f96415a Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Thu, 3 Dec 2020 13:19:08 +0200 Subject: [PATCH 39/69] remove duplicated package --- pubspec.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 94e6a8ed..d3c16056 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -144,9 +144,6 @@ dependencies: #google maps places google_maps_place_picker: ^1.0.0 - #fit_kit - fit_kit: ^1.1.2 - #Dependencies for video call implementation native_device_orientation: ^0.3.0 enum_to_string: ^1.0.9 From dc898a799d9019fa26effd4e4accbd6054d3f3fa Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Dec 2020 13:38:42 +0200 Subject: [PATCH 40/69] Add Privileges --- ios/Flutter/.last_build_id | 2 +- lib/config/config.dart | 3 + lib/core/model/privilege/PrivilegeModel.dart | 24 + lib/core/service/privilege_service.dart | 22 + lib/core/viewModels/project_view_model.dart | 59 ++- lib/locator.dart | 5 +- .../all_habib_medical_service_page.dart | 11 +- lib/pages/DrawerPages/family/my-family.dart | 3 + lib/pages/landing/home_page.dart | 4 + lib/pages/login/confirm-login.dart | 2 +- lib/pages/login/login.dart | 1 + lib/pages/medical/eye/ContactLensPage.dart | 4 + lib/pages/medical/medical_profile_page.dart | 487 ++---------------- .../medical/patient_sick_leave_page.dart | 1 + .../prescription_items_page.dart | 4 + .../radiology/radiology_details_page.dart | 69 +-- lib/pages/paymentService/payment_service.dart | 41 ++ lib/pages/vaccine/my_vaccines_screen.dart | 4 + lib/splashPage.dart | 21 +- lib/uitl/utils.dart | 359 +++++++++++++ .../data_display/medical/doctor_card.dart | 2 +- .../medical/laboratory_result_widget.dart | 1 + lib/widgets/drawer/app_drawer_widget.dart | 12 +- 23 files changed, 645 insertions(+), 496 deletions(-) create mode 100644 lib/core/model/privilege/PrivilegeModel.dart create mode 100644 lib/core/service/privilege_service.dart diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index 44c4b26c..6bca0336 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -da98d9f0c1f407e541c636e84847ac81 \ No newline at end of file +f4a819c27119d0f472892c1088ad1ca3 \ No newline at end of file diff --git a/lib/config/config.dart b/lib/config/config.dart index 6203f62a..456fa128 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -237,6 +237,9 @@ const GET_USER_TERMS = '/Services/Patients.svc/REST/GetUserTermsAndConditions'; const UPDATE_HEALTH_TERMS = '/services/Patients.svc/REST/UpdatePateintHealthSummaryReport'; +/// +const GET_PRIVILEGE = 'Services/Patients.svc/REST/Service_Privilege'; + //URL to get medicine and pharmacies list const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; diff --git a/lib/core/model/privilege/PrivilegeModel.dart b/lib/core/model/privilege/PrivilegeModel.dart new file mode 100644 index 00000000..3b629fde --- /dev/null +++ b/lib/core/model/privilege/PrivilegeModel.dart @@ -0,0 +1,24 @@ +class PrivilegeModel { + int iD; + String serviceName; + bool privilege; + dynamic region; + + PrivilegeModel({this.iD, this.serviceName, this.privilege, this.region}); + + PrivilegeModel.fromJson(Map json) { + iD = json['ID']; + serviceName = json['ServiceName']; + privilege = json['Previlege']; + region = json['Region']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceName'] = this.serviceName; + data['Previlege'] = this.privilege; + data['Region'] = this.region; + return data; + } +} diff --git a/lib/core/service/privilege_service.dart b/lib/core/service/privilege_service.dart new file mode 100644 index 00000000..5beef992 --- /dev/null +++ b/lib/core/service/privilege_service.dart @@ -0,0 +1,22 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/privilege/PrivilegeModel.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class PrivilegeService extends BaseService { + + List privilegeModelList = List(); + + Future getPrivilege() async { + Map body = Map(); + body['PatientType'] = 4; + await baseAppClient.post(GET_PRIVILEGE, + onSuccess: (dynamic response, int statusCode) { + response['ServicePrivilegeList'].forEach((item) { + privilegeModelList.add(PrivilegeModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index d2b7cf8b..700ab2a4 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:connectivity/connectivity.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/privilege/PrivilegeModel.dart'; +import 'package:diplomaticquarterapp/core/service/privilege_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; @@ -18,9 +20,7 @@ class ProjectViewModel extends BaseViewModel { bool isError = false; String error = ''; dynamic searchvalue; - bool isLogin - = false; - + bool isLogin = false; dynamic get searchValue => searchvalue; @@ -30,12 +30,18 @@ class ProjectViewModel extends BaseViewModel { bool get isArabic => _isArabic; - // BaseViewModel baseViewModel = locator() + + bool isLoginChild = false; + List privilegeRootUser = List(); + List privilegeChildUser = List(); + + List get privileges => + isLoginChild ? privilegeChildUser : privilegeChildUser; + StreamSubscription subscription; ProjectViewModel() { loadSharedPrefLanguage(); - subscription = Connectivity() .onConnectivityChanged .listen((ConnectivityResult result) { @@ -78,6 +84,49 @@ class ProjectViewModel extends BaseViewModel { notifyListeners(); } + setPrivilegeModelList( + {List privilege}) { + this.isLoginChild = isLoginChild; + privilegeRootUser = privilege; + + notifyListeners(); + } + + setPrivilege({privilegeList, bool isLoginChild = false}) { + List privilege = List(); + + privilegeList['List'][0]['ListPrivilege'].forEach((item) { + privilege.add(PrivilegeModel.fromJson(item)); + }); + + this.isLoginChild = isLoginChild; + if (isLoginChild) + privilegeChildUser = privilege; + else + privilegeRootUser = privilege; + + notifyListeners(); + } + + setIsLoginChild({@required bool isLoginChild}){ + this.isLoginChild = isLoginChild; + notifyListeners(); + } + + bool havePrivilege(int id) { + bool isHavePrivilege = false; + if(isLoginChild) + privilegeChildUser.forEach((element) { + if (element.iD == id) isHavePrivilege = element.privilege; + }); + else{ + privilegeRootUser.forEach((element) { + if (element.iD == id) isHavePrivilege = element.privilege; + }); + } + return isHavePrivilege; + } + @override void dispose() { if (subscription != null) subscription.cancel(); diff --git a/lib/locator.dart b/lib/locator.dart index 6b7bb076..303aaf6b 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -44,6 +44,7 @@ import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/service/notifications_service.dart'; +import 'core/service/privilege_service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -135,13 +136,11 @@ void setupLocator() { locator.registerLazySingleton(() => UserInformationService()); locator.registerLazySingleton(() => CreteNewBabyService()); locator.registerLazySingleton(() => DeleteBabyService()); - locator.registerLazySingleton(() => VaccinationTableService()); locator.registerLazySingleton(() => NotificationService()); - - locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); + locator.registerLazySingleton(() => PrivilegeService()); /// View Model diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index ea699381..f2143b17 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart'; @@ -28,6 +29,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class AllHabibMedicalService extends StatefulWidget { @@ -54,6 +56,7 @@ class _AllHabibMedicalServiceState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).alhabiServices, @@ -146,6 +149,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/booking_icon_active.png', title: TranslationBase.of(context).bookAppo, ), + if(projectViewModel.havePrivilege(58)) ServicesContainer( onTap: () => Navigator.push( context, @@ -222,6 +226,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/family_menu_icon_red.png', title: 'My Family', ), + if(projectViewModel.havePrivilege(35)) ServicesContainer( onTap: () => Navigator.push( context, @@ -242,6 +247,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/upcoming_icon_bottom_bar.png', title: TranslationBase.of(context).todoList, ), + if(projectViewModel.havePrivilege(42)) ServicesContainer( onTap: () => Navigator.push( context, @@ -249,7 +255,8 @@ class _AllHabibMedicalServiceState extends State { ), imageLocation: 'assets/images/new-design/body_icon.png', title: 'Symptom Checker'), - ServicesContainer( + if(projectViewModel.havePrivilege(36)) + ServicesContainer( onTap: () => Navigator.push( context, FadePage(page: BloodDonationPage()), @@ -279,6 +286,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/health_convertor_icon.png', title: 'Health Converter', ), + if(projectViewModel.havePrivilege(38)) ServicesContainer( onTap: () => Navigator.push( context, @@ -289,6 +297,7 @@ class _AllHabibMedicalServiceState extends State { imageLocation: 'assets/images/new-design/water_icon.png', title: 'H2O', ), + if(projectViewModel.havePrivilege(41)) ServicesContainer( onTap: () => Navigator.push( context, diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 0e6d86bf..28c790ae 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; @@ -21,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/routes.dart'; +import 'package:provider/provider.dart'; class MyFamily extends StatefulWidget { final bool isAppbarVisible; @@ -602,6 +604,7 @@ class _MyFamily extends State with TickerProviderStateMixin { loginAfter(result, context) async{ GifLoaderDialogUtils.hideDialog(context); var familyFile = await sharedPref.getObject(FAMILY_FILE); + Provider.of(context, listen: false).setPrivilege(privilegeList: result,isLoginChild: true); result = CheckActivationCode.fromJson(result); this.sharedPref.clear(); this.sharedPref.setObject(FAMILY_FILE, familyFile); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 79f8f7b1..5624182a 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -435,11 +435,13 @@ class _HomePageState extends State { ), ], ), + if(projectViewModel.havePrivilege(64)||projectViewModel.havePrivilege(65)||projectViewModel.havePrivilege(67)) Container( margin: EdgeInsets.only(left: 15, right: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + if(projectViewModel.havePrivilege(64)) DashboardItem( onTap: () { Navigator.push( @@ -478,6 +480,7 @@ class _HomePageState extends State { imageName: 'home_healthcare_service_bg.png', opacity: 0.5, ), + if(projectViewModel.havePrivilege(65)) DashboardItem( onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), @@ -508,6 +511,7 @@ class _HomePageState extends State { height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', ), + if(projectViewModel.havePrivilege(67)) DashboardItem( onTap: (){ Navigator.push( diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 87eaf1ce..32d5ed17 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -514,7 +514,7 @@ class _ConfirmLogin extends State { .then((result) => { if (result is Map) { - + projectViewModel.setPrivilege(privilegeList: result), result = CheckActivationCode.fromJson(result), if (this.registerd_data != null && this.registerd_data.isRegister == true) diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 25ad13bb..d1396d48 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -242,6 +242,7 @@ class _Login extends State { // request.isRegister = false; this.authService.checkActivationCode(request, code).then((result) => { sharedPref.remove(FAMILY_FILE), + projectViewModel.setPrivilege(privilegeList: result), result = CheckActivationCode.fromJson(result), result.list.isFamily =false, this.sharedPref.setObject(USER_PROFILE, result.list), diff --git a/lib/pages/medical/eye/ContactLensPage.dart b/lib/pages/medical/eye/ContactLensPage.dart index 26503c89..373c3c79 100644 --- a/lib/pages/medical/eye/ContactLensPage.dart +++ b/lib/pages/medical/eye/ContactLensPage.dart @@ -1,10 +1,12 @@ import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class ContactLensPage extends StatelessWidget { final ListHISGetContactLensPerscription listHISGetContactLensPerscription; @@ -14,6 +16,7 @@ class ContactLensPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( body: SingleChildScrollView( child: Container( @@ -82,6 +85,7 @@ class ContactLensPage extends StatelessWidget { SizedBox( height: 17, ), + if(projectViewModel.havePrivilege(15)) Container( width: double.infinity, child: SecondaryButton( diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 741f2020..d7c479d6 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -17,6 +17,7 @@ import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/time_line_widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -47,12 +48,15 @@ class MedicalProfilePage extends StatefulWidget { class _MedicalProfilePageState extends State { var authProvider = new AuthProvider(); - + List medical=List(); + ProjectViewModel projectViewModel; @override Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); + projectViewModel = Provider.of(context); var appoCountProvider = Provider.of(context); - return BaseView( + + List myMedicalList = Utils.myMedicalList(projectViewModel: projectViewModel,context: context,count: appoCountProvider.count,isLogin: projectViewModel.isLogin); + return BaseView( onModelReady: (model) => model.getAppointmentHistory(), builder: (_, model, widget) => AppScaffold( isShowDecPage: false, @@ -92,457 +96,30 @@ class _MedicalProfilePageState extends State { ], ), ), + SizedBox(height: 50,), Padding( padding: EdgeInsets.symmetric(vertical: 5.0), - child: Column( - children: [ - if(model.isLogin) - Container( - width: double.infinity, - height: 55, - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: MyAppointments(), - ), - ); - }, - child: authProvider.isLogin - ? Stack(children: [ - MedicalProfileItem( - title: - TranslationBase.of(context) - .myAppointments, - imagePath: - 'my_appointment_icon.png', - subTitle: - TranslationBase.of(context) - .myAppointmentsList, - hasBadge: true, - ), - Positioned( - right: 0.0, - child: Badge( - toAnimate: false, - position: - BadgePosition.topEnd(), - shape: BadgeShape.circle, - badgeColor: Color(0xFF40ACC9) - .withOpacity(1.0), - borderRadius: - BorderRadius.circular(8), - badgeContent: Container( - padding: - EdgeInsets.all(2.0), - child: Text( - appoCountProvider.count - .toString(), - style: TextStyle( - color: Colors.white, - fontSize: 16.0)), - ), - ), - ), - ]) - : MedicalProfileItem( - title: TranslationBase.of(context) - .myAppointments, - imagePath: - 'my_appointment_icon.png', - subTitle: - TranslationBase.of(context) - .myAppointmentsList, - hasBadge: true, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, - FadePage(page: LabsHomePage())), - child: MedicalProfileItem( - title: TranslationBase.of(context).lab, - imagePath: 'lab_result_icon.png', - subTitle: TranslationBase.of(context).labSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, - FadePage(page: RadiologyHomePage())), - child: MedicalProfileItem( - title: TranslationBase.of(context) - .radiology, - imagePath: 'radiology_icon.png', - subTitle: TranslationBase.of(context) - .radiologySubtitle, - ), - ), - ), - ], - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: HomePrescriptionsPage(), - ), - ); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .medicines, - imagePath: 'prescription_icon.png', - subTitle: TranslationBase.of(context) - .medicinesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: VitalSignDetailsScreen(), - ), - ), - child: MedicalProfileItem( - title: TranslationBase.of(context) - .vitalSigns, - imagePath: 'vital_signs.png', - subTitle: TranslationBase.of(context) - .vitalSignsSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, - FadePage(page: ActiveMedicationsPage())), - child: MedicalProfileItem( - title: TranslationBase.of(context) - .myMedical, - imagePath: 'active_medications.png', - subTitle: TranslationBase.of(context) - .myMedicalSubtitle, - ), - ), - ), - ], - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: DoctorHomePage(), - ), - ); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .myDoctor, - imagePath: 'doctor_icon.png', - subTitle: TranslationBase.of(context) - .myDoctorSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: EyeMeasurementsPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).eye, - imagePath: 'eye_measurement_icon.png', - subTitle: TranslationBase.of(context) - .eyeSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: InsuranceCard())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .insurance, - imagePath: 'insurance_card_icon.png', - subTitle: TranslationBase.of(context) - .insuranceSubtitle, - ), - ), - ), - ], - ), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: InsuranceUpdate())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .updateInsurance, - imagePath: 'insurance_update_icon_.png', - subTitle: TranslationBase.of(context) - .updateInsuranceSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: InsuranceApproval())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .insuranceApproval, - imagePath: 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context) - .insuranceApprovalSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap:()=> Navigator.push(context, FadePage(page: AllergiesPage())) , - child: MedicalProfileItem( - title: TranslationBase.of(context).allergies, - imagePath: 'my_allergies_icon.png', - subTitle: TranslationBase.of(context) - .allergiesSubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: MyVaccines())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .myVaccines, - imagePath: 'my_vaccines_icon.png', - subTitle: TranslationBase.of(context) - .myVaccinesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: HomeReportPage())); - }, - child: MedicalProfileItem( - title: - TranslationBase.of(context).medical, - imagePath: 'medical_reports_icon.png', - subTitle: TranslationBase.of(context) - .medicalSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: MonthlyReportsPage())); - }, - child: MedicalProfileItem( - title: - TranslationBase.of(context).monthly, - imagePath: 'monthly_reports_icon.png', - subTitle: TranslationBase.of(context) - .monthlySubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: PatientSickLeavePage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).sick, - imagePath: 'sick_leaves_icons.png', - subTitle: TranslationBase.of(context) - .sickSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: MyBalancePage())); - }, - child: MedicalProfileItem( - title: - TranslationBase.of(context).myBalance, - imagePath: 'check-in.png', - subTitle: TranslationBase.of(context) - .myBalanceSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: MedicalProfileItem( - title: - TranslationBase.of(context).patientCall, - imagePath: 'medical_history_icon.png', - subTitle: TranslationBase.of(context) - .patientCallSubtitle, - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - //TODO - onTap: () { - Navigator.push( - context, FadePage(page: SmartWatchInstructions())); + child: GridView.builder( + shrinkWrap: true, + primary: false, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 2.40), + ), + itemCount: myMedicalList.length, + itemBuilder: (BuildContext context, int index) { + + return myMedicalList[index]; }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .smartWatches, - imagePath: 'smartwatch_icon.png', - subTitle: TranslationBase.of(context) - .smartWatchesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: MyTrackers())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .myTrackers, - imagePath: 'my_tracker_icon.png', - subTitle: TranslationBase.of(context) - .myTrackersSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: (){ - Navigator.push(context, - FadePage(page: AskDoctorHomPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).askYour, - imagePath: 'ask_doctor_icon.png', - subTitle: TranslationBase.of(context) - .askYourSubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - //TODO -// onTap: () { -// Navigator.push( -// context, FadePage(page: DoctorHomePage())); -// }, - child: MedicalProfileItem( - title: - TranslationBase.of(context).internet, - imagePath: 'insurance_card_icon.png', - subTitle: TranslationBase.of(context) - .internetSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( -// onTap: () { -// Navigator.push( -// context, FadePage(page: InsuranceApproval())); -// }, - child: MedicalProfileItem( - title: - TranslationBase.of(context).chatbot, - imagePath: 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context) - .chatbotSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: Container(), - ), - ]), - SizedBox( - height: - MediaQuery.of(context).size.height * 0.12, - ) - ], ), ) ], ), + SizedBox( + height: + MediaQuery.of(context).size.height * 0.12, + ), if (model.user != null && model.isLogin) Positioned( top: 185, @@ -604,4 +181,20 @@ class _MedicalProfilePageState extends State { ), ); } + + fullMedicalData(){ + if(projectViewModel.havePrivilege(5)) + {} + } +} + +class Medical{ + + final String title; + final String imagePath; + final String subTitle; + final Widget page; + + Medical({this.title, this.imagePath, this.subTitle, this.page}); + } diff --git a/lib/pages/medical/patient_sick_leave_page.dart b/lib/pages/medical/patient_sick_leave_page.dart index dcb6eea3..1d09170d 100644 --- a/lib/pages/medical/patient_sick_leave_page.dart +++ b/lib/pages/medical/patient_sick_leave_page.dart @@ -35,6 +35,7 @@ class _PatientSickLeavePageState extends State { subName: model.sickLeaveList[index].projectName, isInOutPatient: model.sickLeaveList[index].isInOutPatient, + onEmailTap: () { model.sendSickLeaveEmail( message: TranslationBase.of(context).emailSentSuccessfully, diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart index 696ea2db..f70810dd 100644 --- a/lib/pages/medical/prescriptions/prescription_items_page.dart +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_details_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -11,6 +12,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class PrescriptionItemsPage extends StatelessWidget { final Prescriptions prescriptions; @@ -19,6 +21,7 @@ class PrescriptionItemsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getPrescriptionReport(prescriptions: prescriptions), @@ -148,6 +151,7 @@ class PrescriptionItemsPage extends StatelessWidget { child: Column( children: [ Divider(), + if(projectViewModel.havePrivilege(13)) Container( width: MediaQuery.of(context).size.width * 0.8, child: Button( diff --git a/lib/pages/medical/radiology/radiology_details_page.dart b/lib/pages/medical/radiology/radiology_details_page.dart index 9f8a0640..f7648aad 100644 --- a/lib/pages/medical/radiology/radiology_details_page.dart +++ b/lib/pages/medical/radiology/radiology_details_page.dart @@ -1,12 +1,14 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/radiology/final_radiology.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/radiology_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class RadiologyDetailsPage extends StatelessWidget { @@ -16,6 +18,7 @@ class RadiologyDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getRadImageURL( projectId: finalRadiology.projectID, @@ -29,40 +32,48 @@ class RadiologyDetailsPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text('${finalRadiology.reportData}',textAlign: TextAlign.center,), + Text( + '${finalRadiology.reportData}', + textAlign: TextAlign.center, + ), ], ), ), - bottomSheet: Container( - width: double.infinity, - height: MediaQuery.of(context).size.height * 0.2, - color: Colors.grey[100], - child: Column( - children: [ - Divider(), - Container( - width: MediaQuery.of(context).size.width * 0.8, - child: Button( - onTap: () { - launch(model.radImageURL); - }, - label: TranslationBase.of(context).openRad, - backgroundColor: Colors.grey[800], - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.8, - child: Button( - onTap: () => model.sendRadReportEmail( - finalRadiology: finalRadiology), - label: TranslationBase.of(context).sendCopyRad, - loading: model.state == ViewState.BusyLocal, - backgroundColor: Theme.of(context).primaryColor, + bottomSheet: (projectViewModel.havePrivilege(9) || + projectViewModel.havePrivilege(8)) + ? Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.2, + color: Colors.grey[100], + child: Column( + children: [ + Divider(), + if (projectViewModel.havePrivilege(9)) + Container( + width: MediaQuery.of(context).size.width * 0.8, + child: Button( + onTap: () { + launch(model.radImageURL); + }, + label: TranslationBase.of(context).openRad, + backgroundColor: Colors.grey[800], + ), + ), + if (projectViewModel.havePrivilege(8)) + Container( + width: MediaQuery.of(context).size.width * 0.8, + child: Button( + onTap: () => model.sendRadReportEmail( + finalRadiology: finalRadiology), + label: TranslationBase.of(context).sendCopyRad, + loading: model.state == ViewState.BusyLocal, + backgroundColor: Theme.of(context).primaryColor, + ), + ) + ], ), ) - ], - ), - )), + : Container()), ); } } diff --git a/lib/pages/paymentService/payment_service.dart b/lib/pages/paymentService/payment_service.dart index c31981f7..a997c40b 100644 --- a/lib/pages/paymentService/payment_service.dart +++ b/lib/pages/paymentService/payment_service.dart @@ -26,6 +26,7 @@ class PaymentService extends StatelessWidget { children: [ Row( children: [ + if(projectViewModel.havePrivilege(33)) Expanded( child: InkWell( onTap: () => Navigator.push( @@ -61,6 +62,45 @@ class PaymentService extends StatelessWidget { ), ), ), + if(!projectViewModel.havePrivilege(33)) + Expanded( + child: InkWell( + onTap: () => Navigator.push( + context, FadePage(page: MyBalancePage())), + child: Container( + margin: EdgeInsets.all(5.0), + padding: EdgeInsets.all(9), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + shape: BoxShape.rectangle), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + 'My Balances', + color: HexColor('#B61422'), + bold: true, + ), + Texts( + TranslationBase.of(context).payment, + fontSize: 14, + fontWeight: FontWeight.normal, + ), + Align( + alignment: projectViewModel.isArabic + ? Alignment.centerRight + : Alignment.centerLeft, + child: Image.asset( + 'assets/images/al-habib_online_payment_service_icon.png', + height: 55, + ), + ), + ], + ), + ), + ), + ), Expanded( child: Container( margin: EdgeInsets.all(5.0), @@ -97,6 +137,7 @@ class PaymentService extends StatelessWidget { ) ], ), + if(!projectViewModel.havePrivilege(33)) Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/pages/vaccine/my_vaccines_screen.dart b/lib/pages/vaccine/my_vaccines_screen.dart index 02d67cac..3e81c41c 100644 --- a/lib/pages/vaccine/my_vaccines_screen.dart +++ b/lib/pages/vaccine/my_vaccines_screen.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; @@ -6,6 +7,7 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:flutter/cupertino.dart'; +import 'package:provider/provider.dart'; import '../base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/core/viewModels/vaccine_view_model.dart'; @@ -22,6 +24,7 @@ class MyVaccines extends StatefulWidget { class _MyVaccinesState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getVaccine(), builder: (BuildContext context, VaccineViewModel model, Widget child) => @@ -171,6 +174,7 @@ class _MyVaccinesState extends State { Navigator.push(context, FadePage(page: MyVaccinesItemPage())), ), ), + if(projectViewModel.havePrivilege(27)) Container( width: double.infinity, // height: 80.0, diff --git a/lib/splashPage.dart b/lib/splashPage.dart index d367d3ec..a40eb0c5 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:diplomaticquarterapp/core/service/privilege_service.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/material.dart'; @@ -20,6 +21,8 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { + PrivilegeService _privilegeService = locator(); + //Provider.of(context, listen: false).isLogin @override void initState() { @@ -28,11 +31,13 @@ class _SplashScreenState extends State { Duration(seconds: 1, milliseconds: 500), () { getUserData().then((value) { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (BuildContext context) => LandingPage(), - ), - ); + loadPrivilege().then((value) { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (BuildContext context) => LandingPage(), + ), + ); + }); }); }, ); @@ -48,6 +53,12 @@ class _SplashScreenState extends State { } } + /// load the Privilege from service + Future loadPrivilege() async { + await _privilegeService.getPrivilege(); + Provider.of(context, listen: false).setPrivilegeModelList(privilege: _privilegeService.privilegeModelList); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 3e1e4892..c92d4e69 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -2,7 +2,33 @@ import 'dart:convert'; import 'dart:core'; import 'dart:typed_data'; +import 'package:badges/badges.dart'; import 'package:connectivity/connectivity.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart'; +import 'package:diplomaticquarterapp/pages/MyAppointments/MyAppointments.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; +import 'package:diplomaticquarterapp/pages/medical/active_medications/ActiveMedicationsPage.dart'; +import 'package:diplomaticquarterapp/pages/medical/allergies_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/ask_doctor/ask_doctor_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/doctor/doctor_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/eye/EyeMeasurementsPage.dart'; +import 'package:diplomaticquarterapp/pages/medical/labs/labs_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers.dart'; +import 'package:diplomaticquarterapp/pages/medical/patient_sick_leave_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/reports/monthly_reports.dart'; +import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/smart_watch_health_data/smart_watch_instructions.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; +import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -160,7 +186,340 @@ class Utils { .hasMatch(email); } + static List myMedicalList({ProjectViewModel projectViewModel, BuildContext context, bool isLogin, count}) { + List medical = List(); + if (projectViewModel.havePrivilege(5)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: MyAppointments(), + ), + ); + }, + child: isLogin + ? Container( + height: 120, + child: Stack(children: [ + MedicalProfileItem( + title: TranslationBase.of(context).myAppointments, + imagePath: 'my_appointment_icon.png', + subTitle: TranslationBase.of(context).myAppointmentsList, + hasBadge: true, + ), + Positioned( + right: 0.0, + child: Badge( + toAnimate: false, + position: BadgePosition.topEnd(), + shape: BadgeShape.circle, + badgeColor: Color(0xFF40ACC9).withOpacity(1.0), + borderRadius: BorderRadius.circular(8), + badgeContent: Container( + padding: EdgeInsets.all(2.0), + child: Text(count.toString(), + style: + TextStyle(color: Colors.white, fontSize: 16.0)), + ), + ), + ), + ]), + ) + : MedicalProfileItem( + title: TranslationBase.of(context).myAppointments, + imagePath: 'my_appointment_icon.png', + subTitle: TranslationBase.of(context).myAppointmentsList, + hasBadge: true, + ), + )); + } + if (projectViewModel.havePrivilege(10)) { + medical.add(InkWell( + onTap: () => Navigator.push(context, FadePage(page: LabsHomePage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).lab, + imagePath: 'lab_result_icon.png', + subTitle: TranslationBase.of(context).labSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(7)) { + medical.add(InkWell( + onTap: () => + Navigator.push(context, FadePage(page: RadiologyHomePage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).radiology, + imagePath: 'radiology_icon.png', + subTitle: TranslationBase.of(context).radiologySubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(12)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: HomePrescriptionsPage(), + ), + ); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).medicines, + imagePath: 'prescription_icon.png', + subTitle: TranslationBase.of(context).medicinesSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(25)) { + medical.add(InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignDetailsScreen(), + ), + ), + child: MedicalProfileItem( + title: TranslationBase.of(context).vitalSigns, + imagePath: 'vital_signs.png', + subTitle: TranslationBase.of(context).vitalSignsSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(48)) { + medical.add(InkWell( + onTap: () => + Navigator.push(context, FadePage(page: ActiveMedicationsPage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).myMedical, + imagePath: 'active_medications.png', + subTitle: TranslationBase.of(context).myMedicalSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(6)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: DoctorHomePage(), + ), + ); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myDoctor, + imagePath: 'doctor_icon.png', + subTitle: TranslationBase.of(context).myDoctorSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(14)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: EyeMeasurementsPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).eye, + imagePath: 'eye_measurement_icon.png', + subTitle: TranslationBase.of(context).eyeSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(22)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceCard())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).insurance, + imagePath: 'insurance_card_icon.png', + subTitle: TranslationBase.of(context).insuranceSubtitle, + ), + )); + } + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceUpdate())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).updateInsurance, + imagePath: 'insurance_update_icon_.png', + subTitle: TranslationBase.of(context).updateInsuranceSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(18)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceApproval())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).insuranceApproval, + imagePath: 'insurance_approvals_icon.png', + subTitle: TranslationBase.of(context).insuranceApprovalSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(23)) { + medical.add(InkWell( + onTap: () => Navigator.push(context, FadePage(page: AllergiesPage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).allergies, + imagePath: 'my_allergies_icon.png', + subTitle: TranslationBase.of(context).allergiesSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(26)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyVaccines())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myVaccines, + imagePath: 'my_vaccines_icon.png', + subTitle: TranslationBase.of(context).myVaccinesSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(20)) + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: HomeReportPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).medical, + imagePath: 'medical_reports_icon.png', + subTitle: TranslationBase.of(context).medicalSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(19)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MonthlyReportsPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).monthly, + imagePath: 'monthly_reports_icon.png', + subTitle: TranslationBase.of(context).monthlySubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(16)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: PatientSickLeavePage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).sick, + imagePath: 'sick_leaves_icons.png', + subTitle: TranslationBase.of(context).sickSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(47)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyBalancePage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myBalance, + imagePath: 'check-in.png', + subTitle: TranslationBase.of(context).myBalanceSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(61)) { + medical.add(MedicalProfileItem( + title: TranslationBase.of(context).patientCall, + imagePath: 'medical_history_icon.png', + subTitle: TranslationBase.of(context).patientCallSubtitle, + )); + } + + if (projectViewModel.havePrivilege(24)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyTrackers())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myTrackers, + imagePath: 'my_tracker_icon.png', + subTitle: TranslationBase.of(context).myTrackersSubtitle, + ), + )); + } + + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: SmartWatchInstructions())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).smartWatches, + imagePath: 'smartwatch_icon.png', + subTitle: TranslationBase.of(context).smartWatchesSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(28)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: AskDoctorHomPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).askYour, + imagePath: 'ask_doctor_icon.png', + subTitle: TranslationBase.of(context).askYourSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(32)) { + medical.add(InkWell( + //TODO +// onTap: () { +// Navigator.push( +// context, FadePage(page: DoctorHomePage())); +// }, + child: MedicalProfileItem( + title: TranslationBase.of(context).internet, + imagePath: 'insurance_card_icon.png', + subTitle: TranslationBase.of(context).internetSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(40)) { + medical.add(InkWell( +// onTap: () { +// Navigator.push( +// context, FadePage(page: InsuranceApproval())); +// }, + child: MedicalProfileItem( + title: TranslationBase.of(context).chatbot, + imagePath: 'insurance_approvals_icon.png', + subTitle: TranslationBase.of(context).chatbotSubtitle, + ), + )); + } + + return medical; + } } + // extension function that use in iterations(list.. etc) to iterate items and get index and item it self extension IndexedIterable on Iterable { Iterable mapIndexed(T Function(E e, int i) f) { diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index 732a8934..3b790b24 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -135,7 +135,7 @@ class DoctorCard extends StatelessWidget { ), ), ), - if (onEmailTap != null) + if (onEmailTap != null && projectViewModel.havePrivilege(17)) InkWell( onTap: onEmailTap, child: Icon( diff --git a/lib/widgets/data_display/medical/laboratory_result_widget.dart b/lib/widgets/data_display/medical/laboratory_result_widget.dart index d16019b6..20c72f1c 100644 --- a/lib/widgets/data_display/medical/laboratory_result_widget.dart +++ b/lib/widgets/data_display/medical/laboratory_result_widget.dart @@ -79,6 +79,7 @@ class _LaboratoryResultWidgetState extends State { ), ), ), + if(projectViewModel.havePrivilege(11)) InkWell( onTap: widget.onTap, child: Container( diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index f9658c02..83b5070e 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -151,10 +151,11 @@ class _AppDrawerState extends State { } }, ), - (user != null && projectProvider.isLogin) + (user != null && projectProvider.isLogin ) ? Column( mainAxisAlignment: MainAxisAlignment.start, children: [ + if(projectProvider.havePrivilege(2)) InkWell( child: DrawerItem( TranslationBase.of(context).family, @@ -170,7 +171,8 @@ class _AppDrawerState extends State { ); }, ), - FutureBuilder( + // if(projectProvider.havePrivilege(2)) + FutureBuilder( future: getFamilyFiles(), // async work builder: (BuildContext context, AsyncSnapshot< @@ -282,7 +284,9 @@ class _AppDrawerState extends State { } }, ), - InkWell( + if(projectProvider.havePrivilege(1)) + + InkWell( child: DrawerItem( TranslationBase.of(context) .notification, @@ -297,6 +301,7 @@ class _AppDrawerState extends State { NotificationsPage())); }, ), + if(projectProvider.havePrivilege(3)) InkWell( child: DrawerItem( TranslationBase.of(context).appsetting, @@ -458,6 +463,7 @@ class _AppDrawerState extends State { loginAfter(result, context) async { Utils.hideProgressDialog(); + Provider.of(context, listen: false).setPrivilege(privilegeList: result,isLoginChild: true); result = CheckActivationCode.fromJson(result); var familyFile = await sharedPref.getObject(FAMILY_FILE); var mainUser = await sharedPref.getObject(MAIN_USER); From 3daef6e53fba4e1e4b9e208c1b6f14677f662905 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Dec 2020 14:25:43 +0200 Subject: [PATCH 41/69] add images info --- ios/Flutter/.last_build_id | 2 +- lib/config/localized_values.dart | 5 ++ lib/core/model/ImagesInfo.dart | 6 +++ .../vital_sign/vital_sign_details_screen.dart | 7 +++ lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/others/app_scaffold_widget.dart | 5 +- lib/widgets/others/not_auh_page.dart | 47 +++++++++++++++---- 7 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 lib/core/model/ImagesInfo.dart diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index 44c4b26c..6bca0336 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -da98d9f0c1f407e541c636e84847ac81 \ No newline at end of file +f4a819c27119d0f472892c1088ad1ca3 \ No newline at end of file diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index b8e9c9c0..a8449e02 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1044,4 +1044,9 @@ const Map localizedValues = { "ar": "إستبيان" }, + "info-signs": { + "en": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", + "ar": "خدمة المؤشرات الحيوية: هذه الخدمة تمكنك من الاطلاع على جميع المؤشرات الحيوية على سبيل المثال (الطول، الوزن، مؤشر كتلة الجسم، معدل نبضات القلب الخ..) التي تمت في مجموعة الحبيب الطبية وكذلك رسوم بيانية على مستوى المؤشر." + }, + }; diff --git a/lib/core/model/ImagesInfo.dart b/lib/core/model/ImagesInfo.dart new file mode 100644 index 00000000..5ab48fb3 --- /dev/null +++ b/lib/core/model/ImagesInfo.dart @@ -0,0 +1,6 @@ +class ImagesInfo { + final String imageAr; + final String imageEn; + + ImagesInfo({this.imageAr, this.imageEn}); +} diff --git a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart index 667620a2..c4273a09 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/patient_lookup.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/vital_sign_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_item.dart'; @@ -17,9 +18,13 @@ class VitalSignDetailsScreen extends StatelessWidget { int appointmentNo; int projectID; VitalSignDetailsScreen({this.appointmentNo, this.projectID}); + List imagesInfo = List(); + @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/ar/1.png')); return BaseView( onModelReady: appointmentNo != null && projectID != null ? (model) => model.getPatientRadOrders( @@ -29,6 +34,8 @@ class VitalSignDetailsScreen extends StatelessWidget { isShowAppBar: true, appBarTitle: TranslationBase.of(context).vitalSigns, baseViewModel: mode, + description: TranslationBase.of(context).infoSigns, + imagesInfo: imagesInfo, body: mode.vitalSignResModelList.length > 0 ? Container( child: ListView( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index ab32218e..670b1a1b 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -867,6 +867,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get openRad => localizedValues['open-rad'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; String get appoSurvey => localizedValues['appoSurvey'][locale.languageCode]; + String get infoSigns => localizedValues['info-signs'][locale.languageCode]; } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index a807b02e..d0372bfc 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; @@ -40,6 +41,7 @@ class AppScaffold extends StatelessWidget { final String image; final bool isShowDecPage; final List infoList; + final List imagesInfo; AuthenticatedUserObject authenticatedUserObject = locator(); @@ -57,7 +59,7 @@ class AppScaffold extends StatelessWidget { this.isShowDecPage = true, this.isBottomBar, this.image, - this.infoList}); + this.infoList, this.imagesInfo}); @override Widget build(BuildContext context) { @@ -125,6 +127,7 @@ class AppScaffold extends StatelessWidget { title: appBarTitle, description: description, infoList: infoList, + imagesInfo: imagesInfo, ) : baseViewModel != null ? NetworkBaseView( diff --git a/lib/widgets/others/not_auh_page.dart b/lib/widgets/others/not_auh_page.dart index d1684125..e3fc1802 100644 --- a/lib/widgets/others/not_auh_page.dart +++ b/lib/widgets/others/not_auh_page.dart @@ -1,4 +1,6 @@ +import 'package:carousel_slider/carousel_slider.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/login/login-type.dart'; import 'package:diplomaticquarterapp/routes.dart'; @@ -12,12 +14,22 @@ import 'package:provider/provider.dart'; import '../../splashPage.dart'; -class NotAutPage extends StatelessWidget { +class NotAutPage extends StatefulWidget { final String title; final String description; final List infoList; + final List imagesInfo; + + NotAutPage({@required this.title, @required this.description, this.infoList, this.imagesInfo}); + + @override + _NotAutPageState createState() => _NotAutPageState(); +} + +class _NotAutPageState extends State { + + int _current = 0; - NotAutPage({@required this.title, @required this.description, this.infoList}); @override Widget build(BuildContext context) { @@ -29,7 +41,7 @@ class NotAutPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - title ?? 'Service', + widget.title ?? 'Service', fontWeight: FontWeight.w800, fontSize: 25, bold: true, @@ -40,17 +52,17 @@ class NotAutPage extends StatelessWidget { height: 12, ), Texts( - description ?? 'Description', + widget.description ?? 'Description', fontWeight: FontWeight.normal, fontSize: 17, ), - if (infoList != null) + if (widget.infoList != null) SizedBox( height: 12, ), - if (infoList != null) + if (widget.infoList != null) ...List.generate( - infoList.length, + widget.infoList.length, (index) => Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -69,7 +81,7 @@ class NotAutPage extends StatelessWidget { ), ), SizedBox(width: 6,), - Expanded(child: Texts('${infoList[index]}')) + Expanded(child: Texts('${widget.infoList[index]}')) ], ), SizedBox(height: 12,), @@ -80,6 +92,7 @@ class NotAutPage extends StatelessWidget { SizedBox( height: 22, ), + if(!projectViewModel.isInternetConnection) Center( child: SizedBox( height: MediaQuery.of(context).size.height * 0.55, @@ -89,6 +102,24 @@ class NotAutPage extends StatelessWidget { : 'assets/images/wifi-EN.png'), ), ), + if(projectViewModel.isInternetConnection && widget.imagesInfo!=null) + CarouselSlider( + items: widget.imagesInfo.map((image) { + return Builder( + builder: (BuildContext context){ + return SizedBox( + width: MediaQuery.of(context).size.width * 0.50, + child: Image.network(projectViewModel.isArabic ? image.imageAr : image.imageEn)); + }, + ); + }).toList(), + options: CarouselOptions( + height: MediaQuery.of(context).size.height * 0.55, + autoPlay: true, + viewportFraction: 1.0, + ), + ), + SizedBox( height: 77, ), From 79c17de0de3828969dc7e6cfc5681a78dcdf1e80 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 3 Dec 2020 16:02:17 +0300 Subject: [PATCH 42/69] ltr issue fixed --- lib/pages/login/login.dart | 5 +++-- lib/pages/login/register.dart | 5 +++-- lib/widgets/mobile-no/mobile_no.dart | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 25ad13bb..a1540ef7 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -93,7 +93,8 @@ class _Login extends State { onNumberChange: (value) => {mobileNo = value, validateForm()}, onCountryChange: (value) => countryCode = value), - Container( + Directionality( + textDirection:TextDirection.ltr,child:Container( child: TextFields( fontWeight: FontWeight.normal, controller: nationalIDorFile, @@ -108,7 +109,7 @@ class _Login extends State { hintText: loginType == 1 ? TranslationBase.of(context).nationalID : TranslationBase.of(context).fileNo, - )) + ))) ], ), ), diff --git a/lib/pages/login/register.dart b/lib/pages/login/register.dart index 042f56fe..9245d6c3 100644 --- a/lib/pages/login/register.dart +++ b/lib/pages/login/register.dart @@ -72,7 +72,8 @@ class _Register extends State { onNumberChange: (value) => {mobileNo = value, validateForm()}, onCountryChange: (value) => countryCode = value), - Container( + Directionality( + textDirection:TextDirection.ltr,child:Container( child: TextFields( controller: nationalIDorFile, onChanged: (value) => validateForm(), @@ -81,7 +82,7 @@ class _Register extends State { padding: EdgeInsets.only( top: 20, bottom: 20, left: 10, right: 10), hintText: TranslationBase.of(context).nationalID, - )), + ))), Row( children: [ Expanded( diff --git a/lib/widgets/mobile-no/mobile_no.dart b/lib/widgets/mobile-no/mobile_no.dart index 2bb12a68..a16f40ce 100644 --- a/lib/widgets/mobile-no/mobile_no.dart +++ b/lib/widgets/mobile-no/mobile_no.dart @@ -89,7 +89,8 @@ class _MobileNo extends State { }).toList())))), ], ), - Container( + Directionality( + textDirection:TextDirection.ltr,child:Container( padding: EdgeInsets.all(5), decoration: BoxDecoration( color: Colors.white, @@ -131,7 +132,7 @@ class _MobileNo extends State { ), ) ]), - ) + )) ])); } } From 7edb0c8009489b39cb081254d9036b6a53c12c43 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Dec 2020 16:42:04 +0300 Subject: [PATCH 43/69] Doctor rating dialog revamped --- lib/config/config.dart | 2 + lib/config/localized_values.dart | 28 ++ lib/core/service/client/base_app_client.dart | 6 +- .../Appointments/DoctorRateDetails.dart | 32 ++ lib/pages/BookAppointment/DoctorProfile.dart | 311 +++++++++++++++++- .../medical/labs/laboratory_result_page.dart | 3 +- .../appointment_services/GetDoctorsList.dart | 66 ++++ lib/uitl/translations_delegate_base.dart | 8 +- 8 files changed, 437 insertions(+), 19 deletions(-) create mode 100644 lib/models/Appointments/DoctorRateDetails.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 55845a3d..cea61bdb 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -15,6 +15,8 @@ const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; const GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; const GET_DOCTOR_PROFILE = 'Services/Doctors.svc/REST/GetDocProfiles'; +const GET_DOCTOR_RATING_NOTES = 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating'; +const GET_DOCTOR_RATING_DETAILS = 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails'; const GET_DOCTOR_RATING = 'Services/Doctors.svc/REST/dr_GetAvgDoctorRating'; ///Prescriptions diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index b8e9c9c0..2ffe8f1b 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1043,5 +1043,33 @@ const Map localizedValues = { "en": "Survey", "ar": "إستبيان" }, + "labResults": { + "en": "Lab Result", + "ar": "نتيجة المختبر" + }, + "doctorRating": { + "en": "Doctor Rating", + "ar": "تقييم الطبيب" + }, + "good": { + "en": "Good", + "ar": "جيد" + }, + "v-good": { + "en": "Very Good", + "ar": "جيد جدا" + }, + "excellent": { + "en": "Excellent", + "ar": "ممتاز" + }, + "average": { + "en": "Average", + "ar": "متوسط" + }, + "below-average": { + "en": "Below Average", + "ar": "أقل من المتوسط" + }, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 60142fc6..e288ccb3 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -54,9 +54,9 @@ class BaseAppClient { : languageID == 'ar' ? 1 : 2 - : languageID == 'ar' - ? 1 - : 2; + : languageID == 'en' + ? 2 + : 1; body['IPAdress'] = IP_ADDRESS; body['generalid'] = GENERAL_ID; diff --git a/lib/models/Appointments/DoctorRateDetails.dart b/lib/models/Appointments/DoctorRateDetails.dart new file mode 100644 index 00000000..b29a5db9 --- /dev/null +++ b/lib/models/Appointments/DoctorRateDetails.dart @@ -0,0 +1,32 @@ +class DoctorRateDetails { + dynamic doctorID; + dynamic projectID; + dynamic clinicID; + dynamic rate; + dynamic patientNumber; + + DoctorRateDetails( + {this.doctorID, + this.projectID, + this.clinicID, + this.rate, + this.patientNumber}); + + DoctorRateDetails.fromJson(Map json) { + doctorID = json['DoctorID']; + projectID = json['ProjectID']; + clinicID = json['ClinicID']; + rate = json['Rate']; + patientNumber = json['PatientNumber']; + } + + Map toJson() { + final Map data = new Map(); + data['DoctorID'] = this.doctorID; + data['ProjectID'] = this.projectID; + data['ClinicID'] = this.clinicID; + data['Rate'] = this.rate; + data['PatientNumber'] = this.patientNumber; + return data; + } +} diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index 6864e6b1..94386465 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -1,11 +1,14 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorRateDetails.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -42,6 +45,8 @@ class _DoctorProfileState extends State AppSharedPreferences sharedPref = AppSharedPreferences(); + List doctorDetailsList = List(); + @override void initState() { _tabController = new TabController( @@ -150,19 +155,26 @@ class _DoctorProfileState extends State emptyIcon: Icons.star, ), ), - Container( - margin: EdgeInsets.only(top: 5.0), - alignment: Alignment.center, - child: Text( - "(" + - widget.doctor.noOfPatientsRate.toString() + - " " + TranslationBase.of(context).reviews + ")", - style: TextStyle( - fontSize: 14.0, - color: Colors.blue[800], - letterSpacing: 1.0, - decoration: TextDecoration.underline, - )), + InkWell( + onTap: () { + getDoctorRatingsDetails(); + }, + child: Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: Text( + "(" + + widget.doctor.noOfPatientsRate.toString() + + " " + + TranslationBase.of(context).reviews + + ")", + style: TextStyle( + fontSize: 14.0, + color: Colors.blue[800], + letterSpacing: 1.0, + decoration: TextDecoration.underline, + )), + ), ), Container( margin: EdgeInsets.only(top: 10.0), @@ -213,6 +225,279 @@ class _DoctorProfileState extends State ); } + getDoctorRatings() { + GifLoaderDialogUtils.showMyDialog(context); + DoctorsListService service = new DoctorsListService(); + service.getDoctorsRating(widget.doctor.doctorID, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); + if (res['MessageStatus'] == 1) { + print(res['NotesDoctorRatingList']); + } else { + AppToast.showErrorToast(message: res['ErrorEndUserMessage']); + } + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); + } + + getDoctorRatingsDetails() { + GifLoaderDialogUtils.showMyDialog(context); + DoctorsListService service = new DoctorsListService(); + service + .getDoctorsRatingDetails(widget.doctor.doctorID, context) + .then((res) { + GifLoaderDialogUtils.hideDialog(context); + if (res['MessageStatus'] == 1) { + doctorDetailsList.clear(); + res['DoctorRatingDetailsList'].forEach((v) { + doctorDetailsList.add(new DoctorRateDetails.fromJson(v)); + }); + showRatingDialog(doctorDetailsList); + } else { + AppToast.showErrorToast(message: res['ErrorEndUserMessage']); + } + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); + } + + void showRatingDialog(List doctorDetailsList) { + showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionBuilder: (context, a1, a2, widget) { + final curvedValue = Curves.easeInOutBack.transform(a1.value) - 1.0; + return Transform( + transform: Matrix4.translationValues(0.0, curvedValue * 200, 0.0), + child: Opacity( + opacity: a1.value, + child: Dialog( + child: Container( + height: 400.0, + width: MediaQuery.of(context).size.width * 0.8, + color: Colors.white, + child: Column( + children: [ + Container( + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + color: Theme.of(context).primaryColor, + margin: EdgeInsets.only(bottom: 5.0), + padding: EdgeInsets.all(10.0), + child: Text(TranslationBase.of(context).doctorRating, + style: TextStyle( + fontSize: 22.0, color: Colors.white))), + Container( + margin: EdgeInsets.only(top: 0.0), + child: Text( + this + .widget + .doctor + .actualDoctorRate + .ceilToDouble() + .toString(), + style: TextStyle( + fontSize: 32.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: RatingBar.readOnly( + initialRating: + this.widget.doctor.actualDoctorRate.toDouble(), + size: 35.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text( + this.widget.doctor.noOfPatientsRate.toString() + + " " + + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 14.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text( + TranslationBase.of(context).excellent, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[0].patientNumber), + height: 6.0, + child: Container( + color: Colors.green[700], + ), + ), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).v_good, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[1].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffB7B723), + ), + ), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).good, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[2].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffEBA727), + ), + ), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).average, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[3].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffEB7227), + ), + ), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text( + TranslationBase.of(context).below_average, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[4].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffE20C0C), + ), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 40.0), child: Divider()), + Container( + margin: EdgeInsets.only(top: 0.0), + child: Align( + alignment: FractionalOffset.bottomCenter, + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + minWidth: MediaQuery.of(context).size.width, + height: 40.0, + child: RaisedButton( + elevation: 0.0, + color: Colors.white, + textColor: Colors.red, + hoverColor: Colors.transparent, + focusColor: Colors.transparent, + highlightColor: Colors.transparent, + disabledColor: new Color(0xFFbcc2c4), + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(TranslationBase.of(context).cancel, + style: TextStyle(fontSize: 18.0)), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + }, + transitionDuration: Duration(milliseconds: 500), + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) {}); + } + + double getRatingWidth(int patientNumber) { + print(patientNumber); + print(this.widget.doctor.noOfPatientsRate); + var width = (patientNumber / this.widget.doctor.noOfPatientsRate) * 100; + print(width); + return width; + } + getPatientData() async { if (await sharedPref.getObject(USER_PROFILE) != null) { var data = diff --git a/lib/pages/medical/labs/laboratory_result_page.dart b/lib/pages/medical/labs/laboratory_result_page.dart index 01cb6725..9b1f5a26 100644 --- a/lib/pages/medical/labs/laboratory_result_page.dart +++ b/lib/pages/medical/labs/laboratory_result_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/laboratory_result_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -21,7 +22,7 @@ class LaboratoryResultPage extends StatelessWidget { orderNo: patientLabOrders.orderNo), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Laboratory result', + appBarTitle: TranslationBase.of(context).labResults, baseViewModel: model, body: Scaffold( body: ListView.builder( diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index 579c0e10..a320cf6b 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -177,6 +177,72 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } + Future getDoctorsRating( + int docID, context) async { + Map request; + var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + Request req = appGlobal.getPublicRequest(); + request = { + "LanguageID": languageID == 'ar' ? 1 : 2, + "IPAdress": "10.20.10.20", + "VersionID": req.VersionID, + "Channel": req.Channel, + "generalid": 'Cs2020@2016\$2958', + "PatientOutSA": authUser.outSA, + "TokenID": "", + "DeviceTypeID": req.DeviceTypeID, + "SessionID": null, + "doctorID": docID, + "PatientID": 0, + "License": true, + "IsRegistered": true, + "isDentalAllowedBackend": false + }; + + dynamic localRes; + + await baseAppClient.post(GET_DOCTOR_RATING_NOTES, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + return Future.value(localRes); + } + + Future getDoctorsRatingDetails( + int docID, context) async { + Map request; + var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + Request req = appGlobal.getPublicRequest(); + request = { + "LanguageID": languageID == 'ar' ? 1 : 2, + "IPAdress": "10.20.10.20", + "VersionID": req.VersionID, + "Channel": req.Channel, + "generalid": 'Cs2020@2016\$2958', + "PatientOutSA": authUser.outSA, + "TokenID": "", + "DeviceTypeID": req.DeviceTypeID, + "SessionID": null, + "DoctorID": docID, + "PatientID": 0, + "License": true, + "IsRegistered": true, + "isDentalAllowedBackend": false + }; + + dynamic localRes; + + await baseAppClient.post(GET_DOCTOR_RATING_DETAILS, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + return Future.value(localRes); + } + Future getDoctorFreeSlots( int docID, int clinicID, int projectID, BuildContext context) async { Map request; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index ab32218e..b94c3953 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -867,8 +867,12 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get openRad => localizedValues['open-rad'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; String get appoSurvey => localizedValues['appoSurvey'][locale.languageCode]; - - + String get labResults => localizedValues['labResults'][locale.languageCode]; + String get doctorRating => localizedValues['doctorRating'][locale.languageCode]; + String get good => localizedValues['good'][locale.languageCode]; + String get v_good => localizedValues['v-good'][locale.languageCode]; + String get excellent => localizedValues['excellent'][locale.languageCode]; + String get below_average => localizedValues['below-average'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From f1a8e09a59a52882d276fcaaa4255366f873520c Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Dec 2020 17:20:34 +0300 Subject: [PATCH 44/69] Added info images description --- lib/config/localized_values.dart | 17 +++++++++- lib/pages/MyAppointments/MyAppointments.dart | 7 ++++ lib/pages/ToDoList/ToDo.dart | 33 ++++++++++++++++--- .../medical/balance/advance_payment_page.dart | 6 ++++ .../medical/balance/my_balance_page.dart | 7 ++++ lib/uitl/translations_delegate_base.dart | 5 ++- 6 files changed, 69 insertions(+), 6 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index d4fb4c19..fc2d6947 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1071,10 +1071,25 @@ const Map localizedValues = { "en": "Below Average", "ar": "أقل من المتوسط" }, - "info-signs": { "en": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", "ar": "خدمة المؤشرات الحيوية: هذه الخدمة تمكنك من الاطلاع على جميع المؤشرات الحيوية على سبيل المثال (الطول، الوزن، مؤشر كتلة الجسم، معدل نبضات القلب الخ..) التي تمت في مجموعة الحبيب الطبية وكذلك رسوم بيانية على مستوى المؤشر." }, + "info-my-appointments": { + "en": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", + "ar": "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:" + }, + "info-advance-payment": { + "en": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", + "ar": "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية." + }, + "info-todo": { + "en": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", + "ar": "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها" + }, + "info-my-balance": { + "en": "This service allows you to check your balance in all branchs", + "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع" + }, }; diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index 95485da5..7b7dc1da 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -40,12 +41,16 @@ class _MyAppointmentsState extends State AuthenticatedUserObject authenticatedUserObject = locator(); + List imagesInfo = List(); + @override void initState() { _tabController = new TabController(length: 3, vsync: this); WidgetsBinding.instance.addPostFrameCallback((_) { if (Provider.of(context, listen: false).isLogin) getPatientAppointmentHistory(); }); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/1.png')); super.initState(); } @@ -54,6 +59,8 @@ class _MyAppointmentsState extends State return AppScaffold( appBarTitle: TranslationBase.of(context).myAppointments, isShowAppBar: true, + imagesInfo: imagesInfo, + description: TranslationBase.of(context).infoMyAppointments, body: Container( child: Column(children: [ TabBar( diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 96835d7b..18da37e8 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; @@ -38,19 +39,29 @@ class _ToDoState extends State { AuthenticatedUserObject authenticatedUserObject = locator(); + List imagesInfo = List(); + @override void initState() { widget.patientShareResponse = new PatientShareResponse(); WidgetsBinding.instance.addPostFrameCallback((_) { - if (authenticatedUserObject.isLogin) getPatientAppointmentHistory(); + if (authenticatedUserObject.isLogin) getPatientData(); }); super.initState(); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/ar/0.png')); } @override Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).todoList, + imagesInfo: imagesInfo, + isShowAppBar: true, + description: TranslationBase.of(context).infoTodo, body: SingleChildScrollView( child: Column( children: [ @@ -426,7 +437,8 @@ class _ToDoState extends State { } getLanguageID() async { - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); setState(() { widget.languageID = languageID; }); @@ -666,8 +678,8 @@ class _ToDoState extends State { DoctorsListService service = new DoctorsListService(); String paymentReference = res['Fort_id'].toString(); service - .createAdvancePayment( - appo, appo.projectID.toString(), res['Amount'], res['Fort_id'], res['PaymentMethod'], context) + .createAdvancePayment(appo, appo.projectID.toString(), res['Amount'], + res['Fort_id'], res['PaymentMethod'], context) .then((res) { GifLoaderDialogUtils.hideDialog(context); print(res['OnlineCheckInAppointments'][0]['AdvanceNumber']); @@ -699,6 +711,19 @@ class _ToDoState extends State { }); } + getPatientData() async { + AppSharedPreferences sharedPref = AppSharedPreferences(); + if (await sharedPref.getObject(USER_PROFILE) != null) { + var data = + AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); + setState(() { + print(data); + authUser = data; + }); + getPatientAppointmentHistory(); + } + } + Future navigateToPaymentMethod( context, PatientShareResponse patientShareResponse, diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 9b255711..9f3cda72 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; @@ -49,10 +50,13 @@ class _AdvancePaymentPageState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); AuthenticatedUser authUser; + List imagesInfo = List(); + @override void initState() { super.initState(); getAuthUser(); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png')); } @override @@ -61,7 +65,9 @@ class _AdvancePaymentPageState extends State { onModelReady: (model) => model.getHospitals(), builder: (_, model, w) => AppScaffold( isShowAppBar: true, + imagesInfo: imagesInfo, appBarTitle: TranslationBase.of(context).advancePayment, + description: TranslationBase.of(context).infoAdvancePayment, body: SingleChildScrollView( physics: ScrollPhysics(), child: Container( diff --git a/lib/pages/medical/balance/my_balance_page.dart b/lib/pages/medical/balance/my_balance_page.dart index 421e2bed..e6bc6352 100644 --- a/lib/pages/medical/balance/my_balance_page.dart +++ b/lib/pages/medical/balance/my_balance_page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -12,14 +13,20 @@ import 'package:hexcolor/hexcolor.dart'; import 'advance_payment_page.dart'; class MyBalancePage extends StatelessWidget { + + List imagesInfo = List(); + @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/ar/0.png')); return BaseView( onModelReady: (model) => model.getPatientAdvanceBalanceAmount(), builder: (_, model, w) => AppScaffold( baseViewModel: model, isShowAppBar: true, appBarTitle: TranslationBase.of(context).myBalances, + imagesInfo: imagesInfo, + description: TranslationBase.of(context).infoMyBalance, body: Container( margin: EdgeInsets.all(12), child: Column( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 6f133ed3..2f959f08 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -874,7 +874,10 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get excellent => localizedValues['excellent'][locale.languageCode]; String get below_average => localizedValues['below-average'][locale.languageCode]; String get infoSigns => localizedValues['info-signs'][locale.languageCode]; - + String get infoMyAppointments => localizedValues['info-my-appointments'][locale.languageCode]; + String get infoAdvancePayment => localizedValues['info-advance-payment'][locale.languageCode]; + String get infoTodo => localizedValues['info-todo'][locale.languageCode]; + String get infoMyBalance => localizedValues['info-my-balance'][locale.languageCode]; } From 35d0d3e4410a180faf756ccffb40a0e79fa1b615 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 3 Dec 2020 16:49:39 +0200 Subject: [PATCH 45/69] finsi lakum points task --- lib/config/localized_values.dart | 15 +- .../LakumInquiryInformationObjVersion.dart | 50 +++- .../model/pharmacies/PointsAmountPerYear.dart | 4 +- lib/core/model/pharmacies/PointsDetails.dart | 27 +- .../service/parmacyModule/lacum-service.dart | 1 + .../lacum-registration-viewModel.dart | 5 +- lib/pages/landing/home_page.dart | 2 +- .../screens/lacum-activitaion-vida-page.dart | 5 +- .../screens/lacum-setting-page.dart | 2 +- .../pharmacies/screens/lakum-main-page.dart | 3 +- .../screens/lakum-points-month-page.dart | 270 ++++++++++++++++++ .../screens/lakum-points-year-page.dart | 17 +- .../pharmacies/widgets/ProductTileItem.dart | 20 +- .../widgets/lakum-point-table-row-widget.dart | 142 +++++---- lib/uitl/translations_delegate_base.dart | 12 +- lib/widgets/others/app_scaffold_widget.dart | 144 ++++------ .../others/points-expandable-notifier.dart | 77 +++++ 17 files changed, 592 insertions(+), 204 deletions(-) create mode 100644 lib/pages/pharmacies/screens/lakum-points-month-page.dart create mode 100644 lib/widgets/others/points-expandable-notifier.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 5cbab003..e60b85a3 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -646,7 +646,6 @@ const Map localizedValues = { "shippingAddresses": {"en": "Shipping Addresses", "ar": "عناوين الشحن"}, "reachUs": {"en": "Reach Us", "ar": "الوصول لنا"}, "ourLocations": {"en": "Our Locations", "ar": "مواقعنا"}, - "changeAddress": {"en": "Change Address", "ar": "تغيير العنوان"}, "edit": {"en": "Edit", "ar": "تعديل"}, "delete": {"en": "Delete", "ar": " حذف"}, "addAddress": {"en": "ADD A NEW ADDRESS", "ar": " اضافة عنوان جديد"}, @@ -671,14 +670,12 @@ const Map localizedValues = { "en": "Your reviews help other to choose better product", "ar": " تقييمك سوف يساعد الأخرين في اختيار المنتج الأفضل" }, - "shippingAddress": {"en": "SHIPPING ADDRESS", "ar": " عنوان الشحن"}, "shippedMethod": {"en": "SHIP BY:", "ar": " الشحن بواسطة:"}, "orderDetail": {"en": "Order Detail", "ar": " تفاصيل الطلب"}, "orderSummary": {"en": "Order Summary", "ar": " تفاصيل المنتج"}, "subtotal": {"en": "Subtotal", "ar": " المجموع"}, "shipping": {"en": "Shipping", "ar": " الشحن"}, "vat": {"en": "VAT (15%)", "ar": "(15%) القيمة المضافة"}, - "total": {"en": "TOTAL", "ar": " المجموع الكلي"}, "sar": {"en": "SAR", "ar": " ر.س "}, "payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "}, "cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "}, @@ -751,10 +748,6 @@ const Map localizedValues = { "en": "SEARCH & SCAN FOR MEDICATION", "ar": "البحث والمسح للأدوية" }, - "shopByBrands": {"en": "Shop By Brands", "ar": "تسوق حسب الماركات"}, - "recentlyViewed": {"en": "Recently Viewed", "ar": "شوهدت مؤخرا"}, - "bestSellers": {"en": "Best Sellers", "ar": "أفضل البائعين"}, - "deleteAllItems": {"en": "Delete All Items", "ar": "حذف كافة العناصر"}, "shopByBrands": { "en": "Shop By Brands", "ar": "تسوق حسب الماركات" @@ -799,10 +792,6 @@ const Map localizedValues = { "en": "Review Order", "ar": "مراجعة الطلب" }, - "orderSummary": { - "en": "Order Summary", - "ar": "ملخص الطلب" - }, "active": { "en": "ACTIVE", "ar": "فعال" @@ -1292,5 +1281,9 @@ const Map localizedValues = { "en": "The referral request has been submitted successfully, you will be contacted ASAP to complete the process. Referral request no is ", "ar": " تم إرسال طلب الإحالة بنجاح ، وسيتم الاتصال بك في أسرع وقت ممكن لإكمال العملية. رقم طلب الإحالة" }, + "Year": {"en": "YEAR", "ar": "السنة"}, + "Month": {"en": "MONTH", "ar": "الشهر"}, + "point": {"en": "POINT", "ar": "النقاط"}, + "riyal": {"en": "RIYAL", "ar": "الريال"}, }; diff --git a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart index 1abfaf7f..809277e1 100644 --- a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart +++ b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart @@ -27,7 +27,7 @@ class LakumInquiryInformationObjVersion { int transferPoints; List transferPointsAmountPerYear; List transferPointsDetails; - double waitingPoints; + int waitingPoints; int loyalityAmount; int loyalityPoints; int purchaseRate; @@ -69,22 +69,32 @@ class LakumInquiryInformationObjVersion { barCode = json['BarCode']; consumedPoints = json['ConsumedPoints']; consumedPointsAmount = json['ConsumedPointsAmount']; - consumedPointsAmountPerYear = json['ConsumedPointsAmountPerYear']; + if (json['ConsumedPointsAmountPerYear'] != null) { + consumedPointsAmountPerYear = new List(); + json['ConsumedPointsAmountPerYear'].forEach((v) { + consumedPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); + }); + } if (json['ConsumedPointsDetails'] != null) { - consumedPointsDetails = new List(); + consumedPointsDetails = new List(); json['ConsumedPointsDetails'].forEach((v) { - consumedPointsDetails.add(v); + consumedPointsDetails.add(PointsDetails.fromJson(v)); }); } createdDate = json['CreatedDate']; expiredPoints = json['ExpiredPoints']; expiryDate = json['ExpiryDate']; gainedPoints = json['GainedPoints']; - gainedPointsAmountPerYear = json['GainedPointsAmountPerYear']; + if (json['GainedPointsAmountPerYear'] != null) { + gainedPointsAmountPerYear = new List(); + json['GainedPointsAmountPerYear'].forEach((v) { + gainedPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); + }); + } if (json['GainedPointsDetails'] != null) { - gainedPointsDetails = new List(); + gainedPointsDetails = new List(); json['GainedPointsDetails'].forEach((v) { - gainedPointsDetails.add(v); + gainedPointsDetails.add(PointsDetails.fromJson(v)); }); } lakumMessageStatus = json['LakumMessageStatus']; @@ -97,11 +107,16 @@ class LakumInquiryInformationObjVersion { prefLang = json['PrefLang']; statusCode = json['StatusCode']; transferPoints = json['TransferPoints']; - transferPointsAmountPerYear = json['TransferPointsAmountPerYear']; + if (json['TransferPointsAmountPerYear'] != null) { + transferPointsAmountPerYear = new List(); + json['TransferPointsAmountPerYear'].forEach((v) { + transferPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); + }); + } if (json['TransferPointsDetails'] != null) { - transferPointsDetails = new List(); + transferPointsDetails = new List(); json['TransferPointsDetails'].forEach((v) { - transferPointsDetails.add(v); + transferPointsDetails.add(PointsDetails.fromJson(v)); }); } waitingPoints = json['WaitingPoints']; @@ -117,7 +132,10 @@ class LakumInquiryInformationObjVersion { data['BarCode'] = this.barCode; data['ConsumedPoints'] = this.consumedPoints; data['ConsumedPointsAmount'] = this.consumedPointsAmount; - data['ConsumedPointsAmountPerYear'] = this.consumedPointsAmountPerYear; + if (this.consumedPointsAmountPerYear != null) { + data['ConsumedPointsAmountPerYear'] = + this.consumedPointsAmountPerYear.map((v) => v).toList(); + } if (this.consumedPointsDetails != null) { data['ConsumedPointsDetails'] = this.consumedPointsDetails.map((v) => v).toList(); @@ -126,7 +144,10 @@ class LakumInquiryInformationObjVersion { data['ExpiredPoints'] = this.expiredPoints; data['ExpiryDate'] = this.expiryDate; data['GainedPoints'] = this.gainedPoints; - data['GainedPointsAmountPerYear'] = this.gainedPointsAmountPerYear; + if (this.gainedPointsAmountPerYear != null) { + data['GainedPointsAmountPerYear'] = + this.gainedPointsAmountPerYear.map((v) => v).toList(); + } if (this.gainedPointsDetails != null) { data['GainedPointsDetails'] = this.gainedPointsDetails.map((v) => v).toList(); @@ -141,7 +162,10 @@ class LakumInquiryInformationObjVersion { data['PrefLang'] = this.prefLang; data['StatusCode'] = this.statusCode; data['TransferPoints'] = this.transferPoints; - data['TransferPointsAmountPerYear'] = this.transferPointsAmountPerYear; + if (this.transferPointsAmountPerYear != null) { + data['TransferPointsAmountPerYear'] = + this.transferPointsAmountPerYear.map((v) => v).toList(); + } if (this.transferPointsDetails != null) { data['TransferPointsDetails'] = this.transferPointsDetails.map((v) => v).toList(); diff --git a/lib/core/model/pharmacies/PointsAmountPerYear.dart b/lib/core/model/pharmacies/PointsAmountPerYear.dart index 130fbcd4..eef74064 100644 --- a/lib/core/model/pharmacies/PointsAmountPerYear.dart +++ b/lib/core/model/pharmacies/PointsAmountPerYear.dart @@ -1,9 +1,9 @@ import 'PointsAmountPerMonth.dart'; class PointsAmountPerYear { - double amountPerYear; + int amountPerYear; List pointsAmountPerMonth; - double pointsPerYear; + int pointsPerYear; int year; PointsAmountPerYear( diff --git a/lib/core/model/pharmacies/PointsDetails.dart b/lib/core/model/pharmacies/PointsDetails.dart index 54bbe2d1..7b342af9 100644 --- a/lib/core/model/pharmacies/PointsDetails.dart +++ b/lib/core/model/pharmacies/PointsDetails.dart @@ -12,15 +12,15 @@ class PointsDetails { PointsDetails( {this.accNumber, - this.accountStatus, - this.amount, - this.lineItemNo, - this.operationType, - this.points, - this.purchasePoints, - this.subTransactionType, - this.subTransactionTypeDescription, - this.transactionDate}); + this.accountStatus, + this.amount, + this.lineItemNo, + this.operationType, + this.points, + this.purchasePoints, + this.subTransactionType, + this.subTransactionTypeDescription, + this.transactionDate}); PointsDetails.fromJson(Map json) { accNumber = json['AccNumber']; @@ -29,7 +29,12 @@ class PointsDetails { lineItemNo = json['LineItemNo']; operationType = json['OperationType']; points = json['Points']; - purchasePoints = json['PurchasePoints']; + var purchasePoints = json['PurchasePoints']; + if(purchasePoints is int){ + this.purchasePoints = (purchasePoints).roundToDouble(); + }else { + this.purchasePoints = purchasePoints; + } subTransactionType = json['SubTransactionType']; subTransactionTypeDescription = json['SubTransactionTypeDescription']; transactionDate = json['TransactionDate']; @@ -49,4 +54,4 @@ class PointsDetails { data['TransactionDate'] = this.transactionDate; return data; } -} \ No newline at end of file +} diff --git a/lib/core/service/parmacyModule/lacum-service.dart b/lib/core/service/parmacyModule/lacum-service.dart index 31544d56..c7117303 100644 --- a/lib/core/service/parmacyModule/lacum-service.dart +++ b/lib/core/service/parmacyModule/lacum-service.dart @@ -39,6 +39,7 @@ class LacumService extends BaseService{ Map body = Map(); body['IdentificationNo'] = user.patientIdentificationNo; body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; + body['IsDetailsRequired'] = true; try { await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, diff --git a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart index 47315707..f8f5ea05 100644 --- a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart +++ b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart @@ -12,21 +12,18 @@ class LacumRegistrationViewModel extends LacumViewModel { ListUserAgreement get listUserAgreement => _lacumService.listUserAgreement; - Future checkLacumAccountActivation(String patientIdentificationNo) async { + Future checkLacumAccountActivation(String patientIdentificationNo) async { setState(ViewState.Busy); await _lacumService.getLacumAccountInformationById(patientIdentificationNo); if (_lacumService.hasError) { error = _lacumService.error; setState(ViewState.Error); - return 404; } else { if(_lacumService.lacumInformation.yahalaAccountNo != 0){ error = "The account has already been activated"; setState(ViewState.Error); - return 404; } else { setState(ViewState.Idle); - return 200; } } } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 5ea91630..90f5e522 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -489,7 +489,7 @@ class _HomePageState extends State { ), DashboardItem( onTap: () => Navigator.push( - context, FadePage(page: OrderPage())), + context, FadePage(page: PharmacyPage())), child: Center( child: Padding( diff --git a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart index c42696a9..fc1270c0 100644 --- a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart +++ b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -71,8 +72,8 @@ class LakumActivationVidaPage extends StatelessWidget { model .checkLacumAccountActivation( _identificationNumberController.text) - .then((status) => { - if (status == 200) + .then((_) => { + if (model.state == ViewState.Idle) { Navigator.push( context, diff --git a/lib/pages/pharmacies/screens/lacum-setting-page.dart b/lib/pages/pharmacies/screens/lacum-setting-page.dart index 07d14677..91e4c965 100644 --- a/lib/pages/pharmacies/screens/lacum-setting-page.dart +++ b/lib/pages/pharmacies/screens/lacum-setting-page.dart @@ -81,7 +81,7 @@ class _LakumSettingPageState extends State { children: [ Container( height: mediaQuery.size.height * 0.15, - color: Colors.grey.shade700, + color: Colors.green, ), Column( children: [ diff --git a/lib/pages/pharmacies/screens/lakum-main-page.dart b/lib/pages/pharmacies/screens/lakum-main-page.dart index e694d6fd..adbb07c2 100644 --- a/lib/pages/pharmacies/screens/lakum-main-page.dart +++ b/lib/pages/pharmacies/screens/lakum-main-page.dart @@ -24,6 +24,7 @@ class LakumMainPage extends StatelessWidget { builder: (_, model, wi) => AppScaffold( title: "Lakum", isShowAppBar: true, + isPharmacy: true, isShowDecPage: false, backgroundColor: Colors.white, baseViewModel: model, @@ -42,7 +43,7 @@ class LakumMainPage extends StatelessWidget { children: [ Container( height: mediaQuery.size.height * 0.15, - color: Colors.grey.shade700, + color: Colors.green, ), Column( children: [ diff --git a/lib/pages/pharmacies/screens/lakum-points-month-page.dart b/lib/pages/pharmacies/screens/lakum-points-month-page.dart new file mode 100644 index 00000000..cdffb07d --- /dev/null +++ b/lib/pages/pharmacies/screens/lakum-points-month-page.dart @@ -0,0 +1,270 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerMonth.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class LakumPointMonthPage extends StatefulWidget { + final PointsAmountPerMonth pointsAmountPerMonth; + final int year; + int expandedItemIndex = -1; + + LakumPointMonthPage(this.pointsAmountPerMonth, this.year); + + @override + _LakumPointsMonthPageState createState() => _LakumPointsMonthPageState(); +} + +class _LakumPointsMonthPageState extends State { + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Lakum points", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + height: mediaQuery.size.height * 0.25, + child: Stack( + children: [ + Image.asset( + "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", + fit: BoxFit.fill, + width: mediaQuery.size.width * 1.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + height: mediaQuery.size.height * 0.06, + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 24), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).month, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.month}, ${widget.year}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Texts( + TranslationBase.of(context).point, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.pointsPerMonth}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + SizedBox( + child: Container( + color: Colors.grey, + ), + width: 1, + ), + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Texts( + TranslationBase.of(context).riyal, + color: Colors.grey.shade600, + fontSize: 16, + ), + Texts( + "${widget.pointsAmountPerMonth.amountPerMonth}", + color: Colors.grey.shade700, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + ), + SizedBox( + height: 10, + ), + LakumPointTableRowWidget(true, "DAY", 0, 0, null, 0), + ...List.generate( + widget.pointsAmountPerMonth.pointsAmountPerday.length, + (index) => LakumPointTableRowWidget( + false, + widget.pointsAmountPerMonth.pointsAmountPerday[index].day, + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .pointsPerDay, + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .amountPerDay, + () { + setState(() { + if (widget.expandedItemIndex == index) { + widget.expandedItemIndex = -1; + } else { + widget.expandedItemIndex = index; + } + }); + }, + index, + expandFlag: widget.expandedItemIndex == index, + collapsed: Column( + children: [ + ...List.generate( + widget.pointsAmountPerMonth.pointsAmountPerday[index] + .pointsDetails.length, + (index) => DayPointsDetailWidget( + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index] + .subTransactionTypeDescription, + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index].purchasePoints, + widget + .pointsAmountPerMonth + .pointsAmountPerday[index] + .pointsDetails[index].amount), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class DayPointsDetailWidget extends StatelessWidget { + final String rowTitle; + final double points; + final double riyal; + + DayPointsDetailWidget(this.rowTitle, this.points, this.riyal); + + @override + Widget build(BuildContext context) { + return Container( + color: Color(0xffe4e4e4), + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 12), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Row( + children: [ + Expanded( + child: Container( + child: Column( + children: [ + Texts( + "TYPE", + fontSize: 12, + fontWeight: FontWeight.bold, + ), + SizedBox( + height: 4, + ), + Texts( + rowTitle, + fontSize: 14, + fontWeight: FontWeight.normal, + ), + ], + crossAxisAlignment: CrossAxisAlignment.start, + ), + )), + Expanded( + child: Container( + child: Texts( + "$points", + fontSize: 14, + fontWeight: FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + "$riyal", + fontSize: 14, + fontWeight: FontWeight.normal, + ), + )), + Expanded(child: Container()), + ], + ), + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } +} diff --git a/lib/pages/pharmacies/screens/lakum-points-year-page.dart b/lib/pages/pharmacies/screens/lakum-points-year-page.dart index 79d36983..f7b6d9e6 100644 --- a/lib/pages/pharmacies/screens/lakum-points-year-page.dart +++ b/lib/pages/pharmacies/screens/lakum-points-year-page.dart @@ -4,8 +4,11 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; +import 'lakum-points-month-page.dart'; + class LakumPointsYearPage extends StatefulWidget { final List pointsAmountPerYear; int selectedIndexYear = 0; @@ -35,7 +38,7 @@ class _LakumPointsYearPageState extends State { children: [ Container( height: 100, - margin: EdgeInsets.symmetric(horizontal: 16), + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: ListView( scrollDirection: Axis.horizontal, children: [ @@ -53,21 +56,25 @@ class _LakumPointsYearPageState extends State { ), ), SizedBox( - height: 10, + height: 0, ), LakumPointTableRowWidget(true, "MONTH", 0, 0, null, 0), ...List.generate( widget.pointsAmountPerYear[widget.selectedIndexYear] .pointsAmountPerMonth.length, (index) => LakumPointTableRowWidget( - true, + false, widget.pointsAmountPerYear[widget.selectedIndexYear] .pointsAmountPerMonth[index].month, widget.pointsAmountPerYear[widget.selectedIndexYear] .pointsAmountPerMonth[index].pointsPerMonth, widget.pointsAmountPerYear[widget.selectedIndexYear] .pointsAmountPerMonth[index].amountPerMonth, - (){}, + (){ + Navigator.push(context, + FadePage(page: LakumPointMonthPage(widget.pointsAmountPerYear[widget.selectedIndexYear] + .pointsAmountPerMonth[index], widget.pointsAmountPerYear[widget.selectedIndexYear].year))); + }, index), ), ], @@ -163,7 +170,7 @@ class LacumPointsYearWidget extends StatelessWidget { ), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Texts( "RIYAL", diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart index e0a45194..2dea5a93 100644 --- a/lib/pages/pharmacies/widgets/ProductTileItem.dart +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -126,19 +126,21 @@ class ProductTileItem extends StatelessWidget { ), Row( children: [ - StarRating( - totalAverage: item.approvedTotalReviews > 0 - ? (item.approvedRatingSum.toDouble() / - item.approvedTotalReviews.toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( + Expanded( + child: StarRating( + totalAverage: item.approvedTotalReviews > 0 + ? (item.approvedRatingSum.toDouble() / + item.approvedTotalReviews.toDouble()) + .toDouble() + : 0, + forceStars: true), + ), + /*Texts( "(${item.approvedTotalReviews})", regular: true, fontSize: 10, fontWeight: FontWeight.w400, - ) + ),*/ ], ), ], diff --git a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart index ca465d77..6e4e2309 100644 --- a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart +++ b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart @@ -1,4 +1,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/points-expandable-notifier.dart'; +import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; class LakumPointTableRowWidget extends StatefulWidget { @@ -8,9 +11,12 @@ class LakumPointTableRowWidget extends StatefulWidget { final double riyal; final Function onTap; final int rowIndex; + final Widget collapsed; + final bool expandFlag; LakumPointTableRowWidget(this.isTableTitle, this.rowTitle, this.points, - this.riyal, this.onTap, this.rowIndex); + this.riyal, this.onTap, this.rowIndex, + {this.collapsed, this.expandFlag = false}); @override _LakumPointTableRowWidgetState createState() => @@ -20,60 +26,90 @@ class LakumPointTableRowWidget extends StatefulWidget { class _LakumPointTableRowWidgetState extends State { @override Widget build(BuildContext context) { - bool isEven = widget.rowIndex % 2 == 0; return InkWell( onTap: widget.onTap, - child: Container( - color: isEven ? Color(0xffefefef) : Colors.white, - child: Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - child: Texts( - widget.rowTitle, - fontSize: 14, - fontWeight: widget.isTableTitle - ? FontWeight.bold - : FontWeight.normal, - ), - )), - Expanded( - child: Container( - child: Texts( - widget.isTableTitle ? "POINTS" : widget.points, - fontSize: 14, - fontWeight: widget.isTableTitle - ? FontWeight.bold - : FontWeight.normal, - ), - )), - Expanded( - child: Container( - child: Texts( - widget.isTableTitle ? "RIYAL" : widget.riyal, - fontSize: 14, - fontWeight: widget.isTableTitle - ? FontWeight.bold - : FontWeight.normal, - ), - )), - Expanded( - child: widget.isTableTitle - ? Container() - : Icon(Icons.arrow_forward_ios)), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 1, - thickness: 2, - indent: 0, - endIndent: 0, - ), - ], - ), + child: Column( + children: [ + Column( + children: [ + widget.collapsed != null + ? PointsExpandableNotifier( + headerWidget: buildPointRowBody(), + // bodyWidget: widget.collapsed != null ? widget.collapsed : null, + bodyWidget: widget.collapsed, + isExpand: widget.expandFlag, + ) + : buildPointRowBody(), + ], + ), + const Divider( + color: Color(0xFFD6D6D6), + height: 1, + thickness: 1, + indent: 0, + endIndent: 0, + ), + ], + ), + ); + } + + Widget buildPointRowBody() { + bool isEven = widget.rowIndex % 2 == 0; + return Container( + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), + color: widget.expandFlag ? Color(0xffe4e4e4) : isEven && !widget.isTableTitle ? Color(0xffefefef) : Colors.white, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + child: Texts( + widget.rowTitle, + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "POINTS" : "${widget.points}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: Container( + child: Texts( + widget.isTableTitle ? "RIYAL" : "${widget.riyal}", + fontSize: 14, + fontWeight: + widget.isTableTitle ? FontWeight.bold : FontWeight.normal, + ), + )), + Expanded( + child: widget.isTableTitle + ? Container() + : Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon( + widget.collapsed == null + ? Icons.keyboard_arrow_right + : widget.expandFlag + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + size: 25, + color: Colors.grey.shade700, + ), + ], + )), + ], + ), + ], ), ); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 48368526..448baf68 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -710,8 +710,6 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get reachUs => localizedValues['reachUs'][locale.languageCode]; String get ourLocations => localizedValues['ourLocations'][locale.languageCode]; - String get changeAddress => - localizedValues['changeAddress'][locale.languageCode]; String get edit => localizedValues['edit'][locale.languageCode]; String get delete => localizedValues['delete'][locale.languageCode]; String get addAddress => localizedValues['addAddress'][locale.languageCode]; @@ -732,13 +730,9 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; localizedValues['reviewShared'][locale.languageCode]; String get reviewComment => localizedValues['reviewComment'][locale.languageCode]; - String get shippingAddress => - localizedValues['shippingAddress'][locale.languageCode]; String get shippedMethod => localizedValues['shippedMethod'][locale.languageCode]; String get orderDetail => localizedValues['orderDetail'][locale.languageCode]; - String get orderSummary => - localizedValues['orderSummary'][locale.languageCode]; String get subtotal => localizedValues['subtotal'][locale.languageCode]; String get shipping => localizedValues['shipping'][locale.languageCode]; String get vat => localizedValues['vat'][locale.languageCode]; @@ -787,7 +781,6 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; - String get total => localizedValues['total'][locale.languageCode]; String get selectAddress => localizedValues['selectAddress'][locale.languageCode]; String get shippingAddress => localizedValues['shippingAddress'][locale.languageCode]; String get changeAddress => localizedValues['changeAddress'][locale.languageCode]; @@ -984,7 +977,10 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get addedChild => localizedValues['added-child'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; - + String get year => localizedValues['Year'][locale.languageCode]; + String get month => localizedValues['Month'][locale.languageCode]; + String get point => localizedValues['point'][locale.languageCode]; + String get riyal => localizedValues['riyal'][locale.languageCode]; } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index b2e264c6..07e76557 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -77,9 +77,14 @@ class AppScaffold extends StatelessWidget { PreferredSizeWidget appBar; if (this.appBarWidget == null) { - PreferredSizeWidget appBarWidget = - // buildAppBar(context, appBarTitle, appBarIcons, isShowAppBar); - AppBarWidget(appBarTitle, appBarIcons, isShowAppBar); + PreferredSizeWidget appBarWidget = AppBarWidget( + appBarTitle, + appBarIcons, + isShowAppBar, + isPharmacy: isPharmacy, + isShowDecPage: isShowDecPage, + image: image, + ); appBar = preferredSize == 0 ? appBarWidget : PreferredSize( @@ -92,71 +97,7 @@ class AppScaffold extends StatelessWidget { return Scaffold( backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: isPharmacy - ? Colors.green - : Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Texts( - authenticatedUserObject.isLogin || !isShowDecPage - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle, - color: Colors.white, - bold: true, - ), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - isPharmacy - ? IconButton( - icon: Icon(Icons.shopping_cart), - color: Colors.white, - onPressed: () { - Navigator.of(context) - .popUntil(ModalRoute.withName('/')); - }) - : Container(), - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.white, - ), - ), - ) - : IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute( - builder: (context) => LandingPage()), - (Route r) => false); - }, - ), - ], - ) - : null, + appBar: appBar, body: (!Provider.of(context, listen: false).isLogin && isShowDecPage) ? NotAutPage( @@ -197,8 +138,12 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { final String appBarTitle; final List appBarIcons; final bool isShowAppBar; + final bool isPharmacy; + final bool isShowDecPage; + final String image; - AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar); + AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar, + {this.isPharmacy = true, this.isShowDecPage = true, this.image}); @override Widget build(BuildContext context) { @@ -209,14 +154,19 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { return isShowAppBar ? AppBar( elevation: 0, - backgroundColor: Theme.of(context).appBarTheme.color, + backgroundColor: + isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, textTheme: TextTheme( headline6: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), ), - title: Text(authenticatedUserObject.isLogin - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle), + title: Texts( + authenticatedUserObject.isLogin || !isShowDecPage + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle, + color: Colors.white, + bold: true, + ), leading: Builder( builder: (BuildContext context) { return ArrowBack(); @@ -224,16 +174,44 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { ), centerTitle: true, actions: [ - IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute(builder: (context) => LandingPage()), - (Route r) => false); - }, - ), + isPharmacy + ? IconButton( + icon: Icon(Icons.shopping_cart), + color: Colors.white, + onPressed: () { + Navigator.of(context) + .popUntil(ModalRoute.withName('/')); + }) + : Container(), + image != null + ? InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: InsuranceUpdate(), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + image, + height: SizeConfig.heightMultiplier * 5, + width: SizeConfig.heightMultiplier * 5, + color: Colors.white, + ), + ), + ) + : IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => LandingPage()), + (Route r) => false); + }, + ), if (appBarIcons != null) ...appBarIcons ], ) diff --git a/lib/widgets/others/points-expandable-notifier.dart b/lib/widgets/others/points-expandable-notifier.dart new file mode 100644 index 00000000..5f969765 --- /dev/null +++ b/lib/widgets/others/points-expandable-notifier.dart @@ -0,0 +1,77 @@ +import 'package:expandable/expandable.dart'; +import 'package:flutter/material.dart'; + +class PointsExpandableNotifier extends StatefulWidget { + final Widget headerWidget; + final Widget bodyWidget; + final Widget collapsed; + final bool isExpand; + bool expandFlag = false; + var controller = new ExpandableController(); + + PointsExpandableNotifier( + {this.headerWidget, this.bodyWidget, this.collapsed, this.isExpand}); + + @override + _PointsExpandableNotifierState createState() => + _PointsExpandableNotifierState(); +} + +class _PointsExpandableNotifierState extends State { + @override + Widget build(BuildContext context) { + setState(() { + if (widget.isExpand == true) { + widget.expandFlag = widget.isExpand; + widget.controller.expanded = true; + } + }); + + return ExpandableNotifier( + child: Padding( + padding: const EdgeInsets.only(left: 0, right: 0), + child: Column( + children: [ + SizedBox( + child: widget.headerWidget, + ), + ScrollOnExpand( + scrollOnExpand: true, + scrollOnCollapse: false, + child: ExpandablePanel( + theme: const ExpandableThemeData( + headerAlignment: ExpandablePanelHeaderAlignment.center, + tapBodyToCollapse: true, + ), + // header: widget.headerWidget, + /* + // setState(() { + // widget.expandFlag = !widget.expandFlag; + // if (widget.expandFlag == true) { + // widget.controller.expanded = true; + // } else { + // widget.controller.expanded = false; + // } + // }); + */ + collapsed: Container(), + expanded: widget.bodyWidget, + builder: (_, collapsed, expanded) { + return Padding( + padding: EdgeInsets.only(left: 0, right: 0, bottom: 0), + child: Expandable( + controller: widget.controller, + collapsed: collapsed, + expanded: expanded, + theme: const ExpandableThemeData(crossFadePoint: 0), + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} From 269f682bd580251702a2db6fdfa953e965caf771 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Dec 2020 16:50:29 +0200 Subject: [PATCH 46/69] Added info images description --- lib/config/localized_values.dart | 133 +++++++++++++++++- .../AlHabibMedicalService/parking_page.dart | 1 + lib/pages/ErService/AmbulanceReq.dart | 19 ++- .../BillAmount.dart | 37 ++--- .../PickupLocation.dart | 35 ++--- .../SelectTransportationMethod.dart | 29 ++-- .../AmbulanceRequestIndexPages/Summary.dart | 13 +- lib/pages/ErService/ErOptions.dart | 2 +- lib/pages/ErService/NearestEr.dart | 5 +- lib/pages/ErService/widgets/StepsWidget.dart | 2 +- lib/pages/ErService/widgets/card_common.dart | 24 +--- .../insurance/insurance_approval_screen.dart | 5 + .../insurance/insurance_card_screen.dart | 7 +- lib/pages/medical/allergies_page.dart | 4 + .../medical/balance/advance_payment_page.dart | 8 +- .../medical/balance/my_balance_page.dart | 7 + .../medical/doctor/doctor_home_page.dart | 5 + lib/pages/medical/labs/labs_home_page.dart | 5 + .../medical/patient_sick_leave_page.dart | 4 + .../prescriptions_home_page.dart | 5 + .../radiology/radiology_home_page.dart | 5 + .../medical/reports/report_home_page.dart | 8 +- lib/uitl/translations_delegate_base.dart | 33 +++++ lib/widgets/others/app_scaffold_widget.dart | 2 +- lib/widgets/others/not_auh_page.dart | 2 +- 25 files changed, 309 insertions(+), 91 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a8449e02..4f6eb569 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1048,5 +1048,136 @@ const Map localizedValues = { "en": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", "ar": "خدمة المؤشرات الحيوية: هذه الخدمة تمكنك من الاطلاع على جميع المؤشرات الحيوية على سبيل المثال (الطول، الوزن، مؤشر كتلة الجسم، معدل نبضات القلب الخ..) التي تمت في مجموعة الحبيب الطبية وكذلك رسوم بيانية على مستوى المؤشر." }, - + "info-advance-payment": { + "en": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", + "ar": "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية." + }, + "info-my-balance": { + "en": "This service allows you to check your balance in all branchs", + "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع" + }, + "er-contant": { + "en": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", + "ar": "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي." + }, + "er": { + "en": "ER", + "ar": "الطوارىء" + }, + "transportation-Service": { + "en": "Ambulance Request", + "ar": "طلب نقل اسعاف" + }, + "info-ambulance": { + "en": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", + "ar": "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى" + }, + "RRT-transport-heading": { + "en": "Select Transportation Method", + "ar": "حدد طريقة النقل" + }, + "sar": { + "en": "SR", + "ar": "ر.س" + }, + "RRT-direction-heading": { + "en": "Select Direction", + "ar": "حدد الاتجاه" + }, + "to-hospital": { + "en": "To Hospital", + "ar": "الى المستشفى" + }, + "from-hospital": { + "en": "From Hospital", + "ar": "من المستشفى" + }, + "one-direc": { + "en": "One Way", + "ar": "ذهاب" + }, + "two-direc": { + "en": "Two Ways", + "ar": "ذهاب وعودة" + }, + "pickup-location": { + "en": "Pickup Location", + "ar": "نقطة الانطلاق" + }, + "pickup-spot": { + "en": "Pickup Spot", + "ar": "نقطة اللقاء" + }, + "inside-home": { + "en": "Inside Home", + "ar": "داخل المنزل" + }, + "have-appo": { + "en": "Do you have an appointment?", + "ar": "هل لديك موعد؟" + }, + "dropoff-location": { + "en": "Dropoff Location", + "ar": "نقطة الوصول" + }, + "select-all": { + "en": "Please select all fields", + "ar": "يرجى تحديد جميع الحقول" + }, + "select-map": { + "en": "Select From Map", + "ar": "حدد من الخريطة" + }, + "no-appointment": { + "en": "You don't have any appointments yet", + "ar": "ليس لديك أي مواعيد حتى الآن" + }, + "patient-share": { + "en": "Amount before tax: ", + "ar": "المبلغ قبل الضريبة:" + }, + "patient-share-tax": { + "en": "Tax amount: ", + "ar": "قيمة الضريبة:" + }, + "patient-share-total": { + "en": "Total amount payable: ", + "ar": "المبلغ الإجمالي المستحق:" + }, + "select-ambulate": { + "en": "Select Ambulate", + "ar": "بحاجة للتنقل بواسطة" + }, + "wheelchair": { + "en": "Wheelchair", + "ar": "كرسي متحرك" + }, + "walker": { + "en": "Walker", + "ar": "مشاية" + }, + "stretcher": { + "en": "Stretcher", + "ar": "نقالة" + }, + "none": { + "en": "None", + "ar": "لا شيء" + }, + "RRT-Summary": { + "en": "Summary", + "ar": "ملخص الطلب" + }, + "bill-amount": { + "en": "Bill Amount", + "ar": "مبلغ الفاتورة" + }, + "transport-method": { + "en": "Transportation Method", + "ar": "طريقة النقل" + }, + "directions": { + "en": "Directions", + "ar": "الاتجاهات" + }, }; diff --git a/lib/pages/AlHabibMedicalService/parking_page.dart b/lib/pages/AlHabibMedicalService/parking_page.dart index 82c390ea..a49a4b20 100644 --- a/lib/pages/AlHabibMedicalService/parking_page.dart +++ b/lib/pages/AlHabibMedicalService/parking_page.dart @@ -18,6 +18,7 @@ class ParkingPage extends StatelessWidget { onModelReady: (model) => model.getIsSaveParking(), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, + isShowDecPage: false, appBarTitle: TranslationBase.of(context).parking, body: SingleChildScrollView( padding: EdgeInsets.all(12), diff --git a/lib/pages/ErService/AmbulanceReq.dart b/lib/pages/ErService/AmbulanceReq.dart index 413d80e6..1690254a 100644 --- a/lib/pages/ErService/AmbulanceReq.dart +++ b/lib/pages/ErService/AmbulanceReq.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; @@ -24,6 +25,7 @@ class AmbulanceReq extends StatefulWidget { class _AmbulanceReqState extends State with SingleTickerProviderStateMixin { TabController _tabController; + List imagesInfo = List(); @override void initState() { @@ -39,11 +41,19 @@ class _AmbulanceReqState extends State @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/Ambulance/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/Ambulance/ar/0.png')); + return BaseView( onModelReady: (model) => model.getAmRequestOrders(), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: "Ambulance Request", + appBarTitle: TranslationBase.of(context).transportationService, + description: TranslationBase.of(context).infoAmbulance, + imagesInfo: imagesInfo, baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, @@ -92,8 +102,7 @@ class _AmbulanceReqState extends State Container( width: MediaQuery.of(context).size.width * 0.40, child: Center( - child: Texts( - "Ambulance Request"), //TranslationBase.of(context).prescriptions + child: Texts(TranslationBase.of(context).transportationService), ), ), Container( @@ -118,8 +127,8 @@ class _AmbulanceReqState extends State controller: _tabController, children: [ AmbulanceRequestIndexPage( - amRequestViewModel: model, - ), + amRequestViewModel: model, + ), OrderLogPage( amRequestViewModel: model, ) diff --git a/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart index cc6af0f2..16945a1e 100644 --- a/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/Ambulate.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; import 'package:diplomaticquarterapp/pages/Blood/new_text_Field.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/cupertino.dart'; @@ -51,7 +52,7 @@ class _BillAmountState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Bill Amount '), + Texts(TranslationBase.of(context).billAmount), SizedBox( height: 10, ), @@ -73,7 +74,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'Amount before tax: ', + TranslationBase.of(context).patientShareB, textAlign: TextAlign.start, color: Colors.black, fontSize: 15, @@ -91,7 +92,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'SR ${widget.patientER.patientERTransportationMethod.price}', + TranslationBase.of(context).sar+' ${widget.patientER.patientERTransportationMethod.price}', color: Colors.black, textAlign: TextAlign.start, fontSize: 15, @@ -108,7 +109,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'Tax amount :', + TranslationBase.of(context).patientShareTax, color: Colors.black, fontSize: 15, textAlign: TextAlign.start, @@ -121,7 +122,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'SR ${widget.patientER.patientERTransportationMethod.vAT}', + TranslationBase.of(context).sar+' ${widget.patientER.patientERTransportationMethod.vAT}', color: Colors.black, fontSize: 15, textAlign: TextAlign.start, @@ -143,7 +144,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'Total amount payable', + TranslationBase.of(context).patientShareTotal, color: Colors.black, fontSize: 15, textAlign: TextAlign.start, @@ -162,7 +163,7 @@ class _BillAmountState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Texts( - 'SR ${widget.patientER.patientERTransportationMethod.totalPrice}', + TranslationBase.of(context).sar+' ${widget.patientER.patientERTransportationMethod.totalPrice}', color: Colors.black, fontSize: 15, textAlign: TextAlign.start, @@ -176,7 +177,7 @@ class _BillAmountState extends State { SizedBox( height: 10, ), - Texts('Select Ambulate',bold: true,), + Texts(TranslationBase.of(context).selectAmbulate,bold: true,), SizedBox(height: 5,), Row( children: [ @@ -196,11 +197,11 @@ class _BillAmountState extends State { color: Colors.white, ), child: ListTile( - title: Text('Wheelchair'), + title: Text(TranslationBase.of(context).wheelchair), leading: Radio( value: Ambulate.Wheelchair, groupValue: _ambulate, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _ambulate = value; @@ -227,11 +228,11 @@ class _BillAmountState extends State { color: Colors.white, ), child: ListTile( - title: Text('Walker'), + title: Text(TranslationBase.of(context).walker), leading: Radio( value: Ambulate.Walker, groupValue: _ambulate, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _ambulate = value; @@ -263,11 +264,11 @@ class _BillAmountState extends State { color: Colors.white, ), child: ListTile( - title: Text('Stretcher'), + title: Text(TranslationBase.of(context).stretcher), leading: Radio( value: Ambulate.Stretcher, groupValue: _ambulate, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _ambulate = value; @@ -294,11 +295,11 @@ class _BillAmountState extends State { color: Colors.white, ), child: ListTile( - title: Text('None'), + title: Text(TranslationBase.of(context).none), leading: Radio( value: Ambulate.None, groupValue: _ambulate, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _ambulate = value; @@ -313,7 +314,7 @@ class _BillAmountState extends State { ), SizedBox(height: 12,), NewTextFields( - hintText: 'Note', + hintText: TranslationBase.of(context).notes, initialValue: note, onChanged: (value){ setState(() { @@ -340,7 +341,7 @@ class _BillAmountState extends State { widget.changeCurrentTab(3); }); }, - label: 'Next', + label: TranslationBase.of(context).next, ), ) ], diff --git a/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart index b99596c8..78574e06 100644 --- a/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart @@ -9,6 +9,7 @@ import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart'; @@ -78,7 +79,7 @@ class _PickupLocationState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Pickup Location'), + Texts(TranslationBase.of(context).pickupLocation), SizedBox( height: 15, ), @@ -110,7 +111,7 @@ class _PickupLocationState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(getSelectFromMapName()), + Texts(getSelectFromMapName(context)), Icon( FontAwesomeIcons.mapMarkerAlt, size: 24, @@ -123,7 +124,7 @@ class _PickupLocationState extends State { SizedBox( height: 12, ), - Texts('Pickup Spot'), + Texts(TranslationBase.of(context).pickupSpot), SizedBox( height: 5, ), @@ -141,7 +142,7 @@ class _PickupLocationState extends State { color: Colors.white, ), child: ListTile( - title: Texts('Inside Home'), + title: Texts(TranslationBase.of(context).insideHome), leading: Checkbox( activeColor: Colors.red[800], value: _isInsideHome, @@ -157,7 +158,7 @@ class _PickupLocationState extends State { SizedBox( height: 12, ), - Texts('Do you have an appointment ?'), + Texts(TranslationBase.of(context).haveAppo), SizedBox( height: 5, ), @@ -182,7 +183,7 @@ class _PickupLocationState extends State { color: Colors.white, ), child: ListTile( - title: Text('Yes'), + title: Text(TranslationBase.of(context).yes), leading: Radio( value: HaveAppointment.YES, groupValue: _haveAppointment, @@ -217,7 +218,7 @@ class _PickupLocationState extends State { color: Colors.white, ), child: ListTile( - title: Text('No'), + title: Text(TranslationBase.of(context).no), leading: Radio( value: HaveAppointment.NO, groupValue: _haveAppointment, @@ -250,7 +251,7 @@ class _PickupLocationState extends State { SizedBox( height: 12, ), - Texts('Drop off Location'), + Texts(TranslationBase.of(context).dropoffLocation), SizedBox( height: 8, ), @@ -270,7 +271,7 @@ class _PickupLocationState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(getHospitalName('Pickup Location')), + Texts(getHospitalName(TranslationBase.of(context).pickupLocation)), Icon( Icons.arrow_drop_down, size: 24, @@ -306,7 +307,7 @@ class _PickupLocationState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(getHospitalName('Pickup Location')), + Texts(getHospitalName(TranslationBase.of(context).pickupLocation)), Icon( Icons.arrow_drop_down, size: 24, @@ -319,7 +320,7 @@ class _PickupLocationState extends State { SizedBox( height: 12, ), - Texts('Drop off Location'), + Texts(TranslationBase.of(context).dropoffLocation), SizedBox( height: 8, ), @@ -351,7 +352,7 @@ class _PickupLocationState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(getSelectFromMapName()), + Texts(getSelectFromMapName(context)), Icon( FontAwesomeIcons.mapMarkerAlt, size: 24, @@ -377,7 +378,7 @@ class _PickupLocationState extends State { onTap: () { if (_result == null || _selectedHospital == null) AppToast.showErrorToast( - message: 'please select all fields'); + message: TranslationBase.of(context).selectAll); else setState(() { widget.patientER.pickupSpot = _isInsideHome ? 1 : 0; @@ -427,7 +428,7 @@ class _PickupLocationState extends State { widget.changeCurrentTab(2); }); }, - label: 'Next', + label: TranslationBase.of(context).next, ), ) ], @@ -455,8 +456,8 @@ class _PickupLocationState extends State { return _selectedHospital == null ? title : _selectedHospital.name; } - String getSelectFromMapName() { - return _result != null ? _result.formattedAddress : 'Select From Map'; + String getSelectFromMapName(BuildContext context) { + return _result != null ? _result.formattedAddress : TranslationBase.of(context).selectMap; } getAppointment() { @@ -494,7 +495,7 @@ class _PickupLocationState extends State { setState(() { _haveAppointment = HaveAppointment.NO; }); - AppToast.showErrorToast(message: 'You don\'t have any appointment'); + AppToast.showErrorToast(message: TranslationBase.of(context).noAppointment); } }).catchError((e) { ProgressDialogUtil.hideProgressDialog(context); diff --git a/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart index 01683b55..952716c8 100644 --- a/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart @@ -5,6 +5,7 @@ import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/model/er/get_all_transportation_method_list_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/cupertino.dart'; @@ -67,7 +68,7 @@ class _SelectTransportationMethodState SizedBox( height: 12, ), - Texts('Select Transportation Method'), + Texts(TranslationBase.of(context).transportHeading), ...List.generate( widget.amRequestViewModel.amRequestModeList.length, (index) => InkWell( @@ -96,7 +97,7 @@ class _SelectTransportationMethodState value: widget .amRequestViewModel.amRequestModeList[index], groupValue: _erTransportationMethod, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _erTransportationMethod = value; @@ -108,7 +109,7 @@ class _SelectTransportationMethodState Expanded( flex: 1, child: Texts( - 'SR ${widget.amRequestViewModel.amRequestModeList[index].price}'), + TranslationBase.of(context).sar+' ${widget.amRequestViewModel.amRequestModeList[index].price}'), ) ], ), @@ -118,7 +119,7 @@ class _SelectTransportationMethodState SizedBox( height: 12, ), - Texts('Select Direction'), + Texts(TranslationBase.of(context).directionHeading), SizedBox( height: 5, ), @@ -144,11 +145,11 @@ class _SelectTransportationMethodState color: Colors.white, ), child: ListTile( - title: Text('To Hospital'), + title: Text(TranslationBase.of(context).toHospital), leading: Radio( value: Direction.ToHospital, groupValue: _direction, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _direction = value; @@ -175,11 +176,11 @@ class _SelectTransportationMethodState color: Colors.white, ), child: ListTile( - title: Text('Form Hospital'), + title: Text(TranslationBase.of(context).fromHospital), leading: Radio( value: Direction.FromHospital, groupValue: _direction, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _direction = value; @@ -200,7 +201,7 @@ class _SelectTransportationMethodState SizedBox( height: 8, ), - Texts('Select Direction'), + Texts(TranslationBase.of(context).directionHeading), SizedBox( height: 5, ), @@ -222,11 +223,11 @@ class _SelectTransportationMethodState color: Colors.white, ), child: ListTile( - title: Text('One Way'), + title: Text(TranslationBase.of(context).oneDirec), leading: Radio( value: Way.OneWay, groupValue: _way, - activeColor: Colors.red[800], + activeColor:Theme.of(context).primaryColor, onChanged: (value) { setState(() { _way = value; @@ -253,11 +254,11 @@ class _SelectTransportationMethodState color: Colors.white, ), child: ListTile( - title: Text('Two Ways'), + title: Text(TranslationBase.of(context).twoDirec), leading: Radio( value: Way.TwoWays, groupValue: _way, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (value) { setState(() { _way = value; @@ -298,7 +299,7 @@ class _SelectTransportationMethodState widget.changeCurrentTab(1); }); }, - label: 'Next', + label: TranslationBase.of(context).next, ), ) ], diff --git a/lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart index 7696dd09..66da39df 100644 --- a/lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/cupertino.dart'; @@ -17,7 +18,7 @@ class Summary extends StatefulWidget { _SummaryState createState() => _SummaryState(); } -//TODO it should be dynamic +//TODO it should be dynamic fix it class _SummaryState extends State

{ @override Widget build(BuildContext context) { @@ -27,7 +28,7 @@ class _SummaryState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Summary'), + Texts(TranslationBase.of(context).RRTSummary), SizedBox(height: 5,), Container( width: double.infinity, @@ -39,11 +40,11 @@ class _SummaryState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Transportation Method',color: Colors.grey,), + Texts(TranslationBase.of(context).transportMethod,color: Colors.grey,), Texts('${widget.patientER.patientERTransportationMethod.title}',bold: true,), SizedBox(height: 8,), - Texts('Direction',color: Colors.grey,), + Texts(TranslationBase.of(context).directions,color: Colors.grey,), Texts('From Hospital',bold: true,), SizedBox(height: 8,), @@ -66,7 +67,7 @@ class _SummaryState extends State { ), ), SizedBox(height: 20,), - Texts('Bill Amount',textAlign: TextAlign.start,), + Texts(TranslationBase.of(context).RRTSummary,textAlign: TextAlign.start,), SizedBox(height: 5,), Container( height: 55, @@ -92,7 +93,7 @@ class _SummaryState extends State { child:SecondaryButton( color: Colors.grey[800], textColor: Colors.white, - label: 'Send', + label: TranslationBase.of(context).send, onTap: () async { await widget.amRequestViewModel.insertERPressOrder(patientER: widget.patientER); diff --git a/lib/pages/ErService/ErOptions.dart b/lib/pages/ErService/ErOptions.dart index 886d47d2..e3438af5 100644 --- a/lib/pages/ErService/ErOptions.dart +++ b/lib/pages/ErService/ErOptions.dart @@ -31,13 +31,13 @@ class _ErOptionsState extends State { Widget build(BuildContext context) { return AppScaffold( isShowAppBar: widget.isAppbar, + isShowDecPage: false, appBarTitle: TranslationBase.of(context).bookAppo, body: Container( margin: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( margin: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0), child: Row( diff --git a/lib/pages/ErService/NearestEr.dart b/lib/pages/ErService/NearestEr.dart index 227cfb3b..1c786954 100644 --- a/lib/pages/ErService/NearestEr.dart +++ b/lib/pages/ErService/NearestEr.dart @@ -27,14 +27,15 @@ class NearestEr extends StatelessWidget { : (model) => model.getProjectAvgERWaitingTimeOrders(), builder: (_, mode, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Nearest ER', + appBarTitle: TranslationBase.of(context).er, + description: TranslationBase.of(context).erContant, baseViewModel: mode, body: mode.ProjectAvgERWaitingTimeModeList.length > 0 ? Container( child: ListView( children: [ Text( - "\nThis service Displays nearest branch\n among all the branches of All Habib \n medical Group based on your current Location", + TranslationBase.of(context).erContant, textAlign: TextAlign.center, style: TextStyle( fontSize: 18.0, diff --git a/lib/pages/ErService/widgets/StepsWidget.dart b/lib/pages/ErService/widgets/StepsWidget.dart index c5864710..40af61d0 100644 --- a/lib/pages/ErService/widgets/StepsWidget.dart +++ b/lib/pages/ErService/widgets/StepsWidget.dart @@ -13,7 +13,7 @@ class StepsWidget extends StatelessWidget { @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - return projectViewModel.isArabic? Stack( + return !projectViewModel.isArabic? Stack( children: [ Container( height: 50, diff --git a/lib/pages/ErService/widgets/card_common.dart b/lib/pages/ErService/widgets/card_common.dart index 35ece966..0796a5bc 100644 --- a/lib/pages/ErService/widgets/card_common.dart +++ b/lib/pages/ErService/widgets/card_common.dart @@ -11,6 +11,7 @@ class CardCommonEr extends StatelessWidget { final text; final subText; final type; + const CardCommonEr( {@required this.image, @required this.text, @@ -22,7 +23,6 @@ class CardCommonEr extends StatelessWidget { return GestureDetector( onTap: () { navigateToSearch(context, this.type); - }, child: Container( margin: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0), @@ -60,24 +60,10 @@ class CardCommonEr extends StatelessWidget { } Future navigateToSearch(context, type) async { -//===Switch case=== - if(type==0) - { - - Navigator.push( - context, - FadePage( - page: AmbulanceReq())); - } - else{ - - Navigator.push( - context, - FadePage( - page: NearestEr())); - + if (type == 0) { + Navigator.push(context, FadePage(page: AmbulanceReq())); + } else { + Navigator.push(context, FadePage(page: NearestEr())); } - - } } diff --git a/lib/pages/insurance/insurance_approval_screen.dart b/lib/pages/insurance/insurance_approval_screen.dart index 3b19e670..b62c2b43 100644 --- a/lib/pages/insurance/insurance_approval_screen.dart +++ b/lib/pages/insurance/insurance_approval_screen.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -18,8 +19,11 @@ class InsuranceApproval extends StatefulWidget { } class _InsuranceApprovalState extends State { + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/1.png')); return BaseView( onModelReady: widget.appointmentNo != null ? (model) => @@ -32,6 +36,7 @@ class _InsuranceApprovalState extends State { appBarTitle: TranslationBase.of(context).approvals, description: TranslationBase.of(context).infoApprovals, infoList: TranslationBase.of(context).infoApprovalPoints, + imagesInfo: imagesInfo, body: SingleChildScrollView( child: Container( margin: EdgeInsets.only( diff --git a/lib/pages/insurance/insurance_card_screen.dart b/lib/pages/insurance/insurance_card_screen.dart index d5fac63f..5f8c6777 100644 --- a/lib/pages/insurance/insurance_card_screen.dart +++ b/lib/pages/insurance/insurance_card_screen.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -19,16 +20,19 @@ import '../base/base_view.dart'; class InsuranceCard extends StatefulWidget { int appointmentNo; + InsuranceCard({this.appointmentNo}); @override _InsuranceCardState createState() => _InsuranceCardState(); } -//TODO fix it class _InsuranceCardState extends State { InsuranceCardService _insuranceCardService = locator(); + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/ar/0.png')); + return BaseView( onModelReady: (model) => model.getInsurance(), builder: (BuildContext context, InsuranceViewModel model, Widget child) => @@ -39,6 +43,7 @@ class _InsuranceCardState extends State { appBarTitle: TranslationBase.of(context).insuranceCards, description: TranslationBase.of(context).infoInsuranceCards, infoList: TranslationBase.of(context).infoInsuranceCardsPoints, + imagesInfo: imagesInfo, body: Container( margin: EdgeInsets.only( left: SizeConfig.screenWidth * 0.004, diff --git a/lib/pages/medical/allergies_page.dart b/lib/pages/medical/allergies_page.dart index 7fe30a8a..459ef0f8 100644 --- a/lib/pages/medical/allergies_page.dart +++ b/lib/pages/medical/allergies_page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/AllergiesViewModel.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -7,8 +8,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class AllergiesPage extends StatelessWidget { + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/alllergies/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/alllergies/ar/0.png')); return BaseView( onModelReady: (model) => model.getAllergies(), builder: (_, model, w) => AppScaffold( @@ -16,6 +19,7 @@ class AllergiesPage extends StatelessWidget { appBarTitle: TranslationBase.of(context).allergies, baseViewModel: model, description: TranslationBase.of(context).infoAllergies, + imagesInfo: imagesInfo, body: ListView.builder( itemCount: model.allergies.length, itemBuilder: (context, index) => Container( diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 9b255711..e2d7c5bb 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; @@ -48,7 +49,7 @@ class _AdvancePaymentPageState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); AuthenticatedUser authUser; - + List imagesInfo = List(); @override void initState() { super.initState(); @@ -57,11 +58,14 @@ class _AdvancePaymentPageState extends State { @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png')); return BaseView( onModelReady: (model) => model.getHospitals(), builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).advancePayment, + description: TranslationBase.of(context).infoAdvancePayment, + imagesInfo: imagesInfo, body: SingleChildScrollView( physics: ScrollPhysics(), child: Container( @@ -207,7 +211,7 @@ class _AdvancePaymentPageState extends State { ), NewTextFields( hintText: TranslationBase.of(context).depositorEmail, - initialValue: model.user.emailAddress, + initialValue: model.user?.emailAddress, onChanged: (value) { email = value; }, diff --git a/lib/pages/medical/balance/my_balance_page.dart b/lib/pages/medical/balance/my_balance_page.dart index 421e2bed..27bb5c3b 100644 --- a/lib/pages/medical/balance/my_balance_page.dart +++ b/lib/pages/medical/balance/my_balance_page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -12,14 +13,20 @@ import 'package:hexcolor/hexcolor.dart'; import 'advance_payment_page.dart'; class MyBalancePage extends StatelessWidget { + List imagesInfo = List(); + @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/ar/0.png')); + return BaseView( onModelReady: (model) => model.getPatientAdvanceBalanceAmount(), builder: (_, model, w) => AppScaffold( baseViewModel: model, isShowAppBar: true, appBarTitle: TranslationBase.of(context).myBalances, + description: TranslationBase.of(context).infoMyBalance, + imagesInfo: imagesInfo, body: Container( margin: EdgeInsets.all(12), child: Column( diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 9687b931..6a03b58b 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_doctor_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; @@ -15,8 +16,11 @@ import 'package:flutter/material.dart'; import 'doctor_profile_page.dart'; class DoctorHomePage extends StatelessWidget { + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/ar/1.png')); return BaseView( onModelReady: (model) => model.getMyDoctor(), builder: (context, MyDoctorViewModel model, widget) => AppScaffold( @@ -25,6 +29,7 @@ class DoctorHomePage extends StatelessWidget { appBarTitle: TranslationBase.of(context).myDoctor, description: TranslationBase.of(context).infoMyDoctor, infoList: TranslationBase.of(context).infoMyDoctorPoints, + imagesInfo: imagesInfo, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: FractionallySizedBox( diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index f459a057..4b412f5b 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -13,8 +14,11 @@ import 'package:flutter/material.dart'; import 'laboratory_result_page.dart'; class LabsHomePage extends StatelessWidget { + List imagesInfo =List(); + @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-lab/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-lab/ar/0.png')); return BaseView( onModelReady: (model) => model.getLabs(), builder: (context, LabsViewModel model, widget) => AppScaffold( @@ -22,6 +26,7 @@ class LabsHomePage extends StatelessWidget { isShowAppBar: true, description: TranslationBase.of(context).infoLab, appBarTitle: TranslationBase.of(context).labOrders, + imagesInfo: imagesInfo, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: FractionallySizedBox( diff --git a/lib/pages/medical/patient_sick_leave_page.dart b/lib/pages/medical/patient_sick_leave_page.dart index dcb6eea3..033295aa 100644 --- a/lib/pages/medical/patient_sick_leave_page.dart +++ b/lib/pages/medical/patient_sick_leave_page.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/patient_sick_leave_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -12,8 +13,10 @@ class PatientSickLeavePage extends StatefulWidget { } class _PatientSickLeavePageState extends State { + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/ar/0.png')); return BaseView( onModelReady: (model) => model.getSickLeave(), builder: (_, model, w) => AppScaffold( @@ -21,6 +24,7 @@ class _PatientSickLeavePageState extends State { appBarTitle: TranslationBase.of(context).sickLeaves, description: TranslationBase.of(context).infoSickLeaves, infoList: TranslationBase.of(context).infoSickLeavePoints, + imagesInfo: imagesInfo, baseViewModel: model, body: Container( margin: EdgeInsets.all(12), diff --git a/lib/pages/medical/prescriptions/prescriptions_home_page.dart b/lib/pages/medical/prescriptions/prescriptions_home_page.dart index dad6fd17..94484340 100644 --- a/lib/pages/medical/prescriptions/prescriptions_home_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_home_page.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history_page.dart'; @@ -18,11 +19,14 @@ class HomePrescriptionsPage extends StatefulWidget { class _HomePrescriptionsPageState extends State with SingleTickerProviderStateMixin { TabController _tabController; + List imagesInfo = List(); @override void initState() { super.initState(); _tabController = TabController(length: 2, vsync: this); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/ar/1.png')); } @override @@ -40,6 +44,7 @@ class _HomePrescriptionsPageState extends State appBarTitle: TranslationBase.of(context).prescriptions, description: TranslationBase.of(context).infoPrescriptions, infoList: TranslationBase.of(context).infoPrescriptionsPoints, + imagesInfo: imagesInfo, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( diff --git a/lib/pages/medical/radiology/radiology_home_page.dart b/lib/pages/medical/radiology/radiology_home_page.dart index 1233a89a..ebc3527d 100644 --- a/lib/pages/medical/radiology/radiology_home_page.dart +++ b/lib/pages/medical/radiology/radiology_home_page.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/radiology_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_details_page.dart'; @@ -12,8 +13,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class RadiologyHomePage extends StatelessWidget { + List imagesInfo = List(); @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/ar/1.png')); return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, widget) => AppScaffold( @@ -21,6 +25,7 @@ class RadiologyHomePage extends StatelessWidget { appBarTitle: TranslationBase.of(context).radiology, baseViewModel: model, description: TranslationBase.of(context).infoRadiology, + imagesInfo: imagesInfo, body: FractionallySizedBox( widthFactor: 1.0, child: ListView( diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 5c6812e2..2bf6d1b8 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart'; @@ -20,6 +21,7 @@ class HomeReportPage extends StatefulWidget { class _HomeReportPageState extends State with SingleTickerProviderStateMixin { TabController _tabController; + List imagesInfo = List(); @override void initState() { @@ -35,6 +37,9 @@ class _HomeReportPageState extends State @override Widget build(BuildContext context) { + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/2.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/2.png')); return BaseView( onModelReady: (model) => model.getReports(), //model.getPrescriptions(), builder: (_, model, widget) => AppScaffold( @@ -42,8 +47,7 @@ class _HomeReportPageState extends State appBarTitle: TranslationBase.of(context).monthReport, description: TranslationBase.of(context).infoMonthReport, baseViewModel: model, - //bottomSheet: Container(), - + imagesInfo: imagesInfo, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 670b1a1b..c0d07e33 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -868,6 +868,39 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; String get appoSurvey => localizedValues['appoSurvey'][locale.languageCode]; String get infoSigns => localizedValues['info-signs'][locale.languageCode]; + String get infoAdvancePayment => localizedValues['info-advance-payment'][locale.languageCode]; + String get infoMyBalance => localizedValues['info-my-balance'][locale.languageCode]; + String get erContant => localizedValues['er-contant'][locale.languageCode]; + String get er => localizedValues['er'][locale.languageCode]; + String get transportationService => localizedValues['transportation-Service'][locale.languageCode]; + String get infoAmbulance => localizedValues['info-ambulance'][locale.languageCode]; + String get transportHeading => localizedValues['RRT-transport-heading'][locale.languageCode]; + String get sar => localizedValues['sar'][locale.languageCode]; + String get directionHeading => localizedValues['RRT-direction-heading'][locale.languageCode]; + String get toHospital => localizedValues['to-hospital'][locale.languageCode]; + String get fromHospital => localizedValues['from-hospital'][locale.languageCode]; + String get oneDirec => localizedValues['one-direc'][locale.languageCode]; + String get twoDirec => localizedValues['two-direc'][locale.languageCode]; + String get pickupLocation => localizedValues['pickup-location'][locale.languageCode]; + String get pickupSpot => localizedValues['pickup-spot'][locale.languageCode]; + String get insideHome => localizedValues['inside-home'][locale.languageCode]; + String get haveAppo => localizedValues['have-appo'][locale.languageCode]; + String get dropoffLocation => localizedValues['dropoff-location'][locale.languageCode]; + String get selectAll => localizedValues['select-all'][locale.languageCode]; + String get selectMap => localizedValues['select-map'][locale.languageCode]; + String get noAppointment => localizedValues['no-appointment'][locale.languageCode]; + String get patientShareB => localizedValues['patient-share'][locale.languageCode]; + String get patientShareTax => localizedValues['patient-share-tax'][locale.languageCode]; + String get patientShareTotal => localizedValues['patient-share-total'][locale.languageCode]; + String get selectAmbulate => localizedValues['select-ambulate'][locale.languageCode]; + String get wheelchair => localizedValues['wheelchair'][locale.languageCode]; + String get walker => localizedValues['walker"'][locale.languageCode]; + String get stretcher => localizedValues['stretcher'][locale.languageCode]; + String get none => localizedValues['none'][locale.languageCode]; + String get RRTSummary => localizedValues['RRT-Summary'][locale.languageCode]; + String get billAmount => localizedValues['bill-amount'][locale.languageCode]; + String get transportMethod => localizedValues['transport-method'][locale.languageCode]; + String get directions => localizedValues['directions'][locale.languageCode]; } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index d0372bfc..99a7ee2d 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -135,7 +135,7 @@ class AppScaffold extends StatelessWidget { baseViewModel: baseViewModel, ) : buildBodyWidget(), - bottomSheet: bottomSheet, + bottomSheet: (Provider.of(context, listen: false).isLogin || !isShowDecPage)?bottomSheet:null, //floatingActionButton: floatingActionButton ?? floatingActionButton, // bottomNavigationBar: // this.isBottomBar == true ? BottomBarSearch() : SizedBox() diff --git a/lib/widgets/others/not_auh_page.dart b/lib/widgets/others/not_auh_page.dart index e3fc1802..3fcb9025 100644 --- a/lib/widgets/others/not_auh_page.dart +++ b/lib/widgets/others/not_auh_page.dart @@ -115,7 +115,7 @@ class _NotAutPageState extends State { }).toList(), options: CarouselOptions( height: MediaQuery.of(context).size.height * 0.55, - autoPlay: true, + autoPlay: widget.imagesInfo.length>1, viewportFraction: 1.0, ), ), From 1c23e28081bed699db4111e9e331b19465a392df Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Dec 2020 16:54:49 +0200 Subject: [PATCH 47/69] fix merge issues --- lib/config/localized_values.dart | 9 +-------- lib/uitl/translations_delegate_base.dart | 2 -- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index b6018e98..50d189a5 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1211,17 +1211,10 @@ const Map localizedValues = { "en": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", "ar": "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:" }, - "info-advance-payment": { - "en": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", - "ar": "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية." - }, "info-todo": { "en": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", "ar": "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها" }, - "info-my-balance": { - "en": "This service allows you to check your balance in all branchs", - "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع" - }, + }; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index e9dd8784..b1477629 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -909,9 +909,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get directions => localizedValues['directions'][locale.languageCode]; String get infoMyAppointments => localizedValues['info-my-appointments'][locale.languageCode]; - String get infoAdvancePayment => localizedValues['info-advance-payment'][locale.languageCode]; String get infoTodo => localizedValues['info-todo'][locale.languageCode]; - String get infoMyBalance => localizedValues['info-my-balance'][locale.languageCode]; } From 81c82394127d4c4edf19e3e11d2059bcc65d75e1 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 3 Dec 2020 19:43:45 +0300 Subject: [PATCH 48/69] bug fixes --- lib/config/localized_values.dart | 5 +- .../weather/weather_view_model.dart | 2 +- .../all_habib_medical_service_page.dart | 4 +- .../health-weather-indicator.dart | 76 ++++++++++++++++++- lib/pages/DrawerPages/family/my-family.dart | 24 +++++- lib/pages/landing/landing_page.dart | 8 +- lib/uitl/location_util.dart | 10 +-- lib/uitl/translations_delegate_base.dart | 1 + 8 files changed, 113 insertions(+), 17 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 50d189a5..cc0e0566 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1215,6 +1215,9 @@ const Map localizedValues = { "en": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", "ar": "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها" }, - + "family-info": { + "en": "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", + "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." + } }; diff --git a/lib/core/viewModels/weather/weather_view_model.dart b/lib/core/viewModels/weather/weather_view_model.dart index 85b019e4..bb201843 100644 --- a/lib/core/viewModels/weather/weather_view_model.dart +++ b/lib/core/viewModels/weather/weather_view_model.dart @@ -13,7 +13,7 @@ class WeatherViewModel extends BaseViewModel { WeatherService _weatherService = locator(); List get weatherIndicatorData => _weatherService.weatherIndicatorData; - getWeatherData({int id, int projectID}) async { + getWeatherData() async { setState(ViewState.Busy); // if (id != null && projectID != null) { diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index 5deac2f2..88d21bf8 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -52,6 +52,8 @@ class _AllHabibMedicalServiceState extends State { void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { getAuthUser(); + locationUtils = + new LocationUtils(isShowConfirmDialog: true, context: context); locationUtils.getCurrentLocation(); }); super.initState(); @@ -272,7 +274,7 @@ class _AllHabibMedicalServiceState extends State { }); } var data = await this.sharedPref.getObject(WEATHER); - weather = data['Temperature'].toString() + '\u2103' ?? '--'; + weather = data !=null ? data['Temperature'].toString() + '\u2103' : '--'; print(data); } } diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart index 98aba205..95cbdde7 100644 --- a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart +++ b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart @@ -1,6 +1,8 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/weather/weather_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -19,13 +21,15 @@ class HealthWeatherIndicator extends StatefulWidget { class _HospitalsPageState extends State { var data; LocationUtils locationUtils; + AppSharedPreferences sharedPref = AppSharedPreferences(); + var weather = '--'; @override void initState() { locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); WidgetsBinding.instance .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); - + getWeather(); super.initState(); } @override @@ -33,14 +37,73 @@ class _HospitalsPageState extends State { ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getWeatherData(), + allowAny:true, builder: (_, mode, widget) => AppScaffold( isShowDecPage: false, appBarTitle: TranslationBase.of(context).healthWeatherIndicators, isShowAppBar: true, - baseViewModel: mode, body: mode.weatherIndicatorData.length>0 ? SingleChildScrollView( child: Column(children: [ + + Container( + margin: EdgeInsets.all(8), + width: double.infinity, + height: 150, + decoration: BoxDecoration( + image: DecorationImage( + image: ExactAssetImage('assets/images/Weather_img.png'), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(8.0)), + + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Row( + children: [ + Expanded( + flex:3, + child: + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + TranslationBase.of(context) + .healthWeatherIndicators, + color: Colors.white, + fontWeight: FontWeight.w600, + ), + AppText( + TranslationBase.of(context).healthTipsBasedOnCurrentWeather, + color: Colors.white, + fontSize: 14, + ), + ], + )), + Expanded( + flex: 2, + child:InkWell( + onTap: (){ + + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/images/Weather_ico.png',width: 60,height: 60,), + AppText(weather, fontSize: 22, color:Colors.white) + ],), + ], + )), + ) + ], + ), + ), + ), Padding(padding: EdgeInsets.all(15), child:AppText( projectViewModel.isArabic ? mode.weatherIndicatorData[0].cityNameN : mode.weatherIndicatorData[0].cityName, fontSize: 24, fontWeight: FontWeight.bold,)), + Padding( padding: EdgeInsets.all(15), child: Column(children: @@ -50,7 +113,14 @@ class _HospitalsPageState extends State { data); }).toList() - ))])) : Container(child:AppText('Loading...'))), + ))])) : Container()), ); } + getWeather() async{ + var data = await this.sharedPref.getObject(WEATHER); + setState(() { + weather = data['Temperature'].toString() + '\u2103' ?? '--'; + }); + + } } diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 6a6e98c4..80de8ecd 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -1,12 +1,13 @@ import 'dart:ui'; import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart'; +import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart' as list; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; @@ -28,7 +29,6 @@ import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:provider/provider.dart'; - class MyFamily extends StatefulWidget { final bool isAppbarVisible; MyFamily({this.isAppbarVisible =true}); @@ -37,6 +37,7 @@ class MyFamily extends StatefulWidget { } class _MyFamily extends State with TickerProviderStateMixin { + List imagesInfo = List(); final familyFileProvider = FamilyFilesProvider(); AppSharedPreferences sharedPref = new AppSharedPreferences(); var userID; @@ -56,12 +57,27 @@ class _MyFamily extends State with TickerProviderStateMixin { } bool expandFlag = false; + Widget build(BuildContext context) { - projectViewModel = Provider.of(context); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/0.png'), + ); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/1.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/1.png'), + ); + projectViewModel = Provider.of(context); return AppScaffold( appBarTitle: TranslationBase.of(context).myFamilyFiles, isShowAppBar: widget.isAppbarVisible, + imagesInfo: imagesInfo, + description: TranslationBase.of(context).familyInfo, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( @@ -648,7 +664,7 @@ class _MyFamily extends State with TickerProviderStateMixin { // Navigator.of(context).pushNamed( // HOME, // ); - result = CheckActivationCode.fromJson(result); + result = list.CheckActivationCode.fromJson(result); var familyFile = await sharedPref.getObject(FAMILY_FILE); var mainUser = await sharedPref.getObject(MAIN_USER); this.sharedPref.clear(); diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 826c8b76..8de82ed1 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -19,6 +19,7 @@ import 'package:diplomaticquarterapp/theme/theme_notifier.dart'; import 'package:diplomaticquarterapp/theme/theme_value.dart'; import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; +import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; @@ -71,7 +72,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { } bool isPageNavigated = false; - + LocationUtils locationUtils; _changeCurrentTab(int tab) { setState(() { currentTab = tab; @@ -138,7 +139,10 @@ class _LandingPageState extends State with WidgetsBindingObserver { pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); - + locationUtils = + new LocationUtils(isShowConfirmDialog: true, context: context); + WidgetsBinding.instance + .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); if (Platform.isIOS) { diff --git a/lib/uitl/location_util.dart b/lib/uitl/location_util.dart index e3012734..1c85d898 100644 --- a/lib/uitl/location_util.dart +++ b/lib/uitl/location_util.dart @@ -15,12 +15,12 @@ class LocationUtils { void getCurrentLocation() async { print("current location"); - isLocationServiceEnabled().then((value) { + Geolocator.isLocationServiceEnabled().then((value) { if (value) { - checkPermission().then((permission) { + Geolocator.checkPermission().then((permission) { if (permission == LocationPermission.always || permission == LocationPermission.whileInUse) { - getLastKnownPosition().then((value) => setLocation(value)); + Geolocator.getLastKnownPosition().then((value) => setLocation(value)); } if (permission == LocationPermission.denied || @@ -48,9 +48,9 @@ class LocationUtils { okFunction: () => { ConfirmDialog.closeAlertDialog(context), if (isPermissionError) - openAppSettings() + Geolocator.openAppSettings() else - openLocationSettings() + Geolocator.openLocationSettings() }, cancelFunction: () => {}); return dialog.showAlertDialog(context); diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index b1477629..2cb521d9 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -910,6 +910,7 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get infoMyAppointments => localizedValues['info-my-appointments'][locale.languageCode]; String get infoTodo => localizedValues['info-todo'][locale.languageCode]; + String get familyInfo => localizedValues['family-info'][locale.languageCode]; } From 64cbae3602a151a94a10abec2c3f8b91cf68b3d2 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Thu, 3 Dec 2020 22:47:30 +0200 Subject: [PATCH 49/69] Search --- lib/config/config.dart | 8 + lib/config/localized_values.dart | 39 +- lib/core/model/pharmacy/brands_model.dart | 24 + lib/core/model/pharmacy/scan_qr_model.dart | 584 ++++++++++++ lib/core/model/search_products_model.dart | 185 ++++ .../service/pharmacy_categorise_service.dart | 74 ++ .../pharmacy_categorise_view_model.dart | 51 ++ lib/pages/final_products_page.dart | 154 ++-- lib/pages/landing/landing_page_pharmcy.dart | 29 +- lib/pages/offers_categorise_page.dart | 1 + lib/pages/parent_categorise_page.dart | 859 ++++++++++++------ lib/pages/pharmacy_categorise.dart | 88 +- lib/pages/search_products_page.dart | 287 ++++++ lib/pages/sub_categorise_page.dart | 842 +++++++++++------ lib/uitl/translations_delegate_base.dart | 29 +- lib/widgets/input/text_field.dart | 12 +- .../pharmacy/bottom_nav_pharmacy_bar.dart | 8 +- pubspec.yaml | 3 +- 18 files changed, 2529 insertions(+), 748 deletions(-) create mode 100644 lib/core/model/pharmacy/brands_model.dart create mode 100644 lib/core/model/pharmacy/scan_qr_model.dart create mode 100644 lib/core/model/search_products_model.dart create mode 100644 lib/pages/search_products_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 1a6a97af..9bc05e27 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -372,6 +372,14 @@ const TIMER_MIN = 10; const GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; +const GET_BRANDS_LIST = + 'epharmacy/api/categoryManufacturer?categoryids=1&fields=id,name,image,namen'; + +const GET_SEARCH_PRODUCTS = + 'epharmacy/api/searchproducts?fields=id,discount_ids,reviews,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&search_key='; + +const SCAN_QR_CODE = 'epharmacy/api/productbysku/6440010010'; + class AppGlobal { static var context; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 77cb1c44..3f2934fe 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -660,38 +660,20 @@ const Map> localizedValues = { "remeberthat": {"en": "Remember that", "ar": "تذكر ذلك:"}, // pharmacy module - "medicationRefill": { - "en": "MEDICATION REFILL", - "ar": "إعادة تعبئة الدواء" - }, + "medicationRefill": {"en": "MEDICATION REFILL", "ar": "إعادة تعبئة الدواء"}, "offersAndPromotions": { "en": "OFFERS & SPECIAL PROMOTIONS", "ar": "العروض والترقيات الخاصة" }, - "myPrescriptions": { - "en": "MY PRESCRIPTIONS", - "ar": "وصفاتي" - }, + "myPrescriptions": {"en": "MY PRESCRIPTIONS", "ar": "وصفاتي"}, "searchAndScanMedication": { "en": "SEARCH & SCAN FOR MEDICATION", "ar": "البحث والمسح للأدوية" }, - "shopByBrands": { - "en": "Shop By Brands", - "ar": "تسوق حسب الماركات" - }, - "recentlyViewed": { - "en": "Recently Viewed", - "ar": "شوهدت مؤخرا" - }, - "bestSellers": { - "en": "Best Sellers", - "ar": "أفضل البائعين" - }, - "deleteAllItems": { - "en": "Delete All Items", - "ar": "حذف كافة العناصر" - }, + "shopByBrands": {"en": "Shop By Brands", "ar": "تسوق حسب الماركات"}, + "recentlyViewed": {"en": "Recently Viewed", "ar": "شوهدت مؤخرا"}, + "bestSellers": {"en": "Best Sellers", "ar": "أفضل البائعين"}, + "deleteAllItems": {"en": "Delete All Items", "ar": "حذف كافة العناصر"}, "select-gender": {"en": "Select Gender", "ar": "اختر الجنس"}, "i-am-a": {"en": "I am a ...", "ar": "أنا ..."}, "select-age": {"en": "Select Your Age", "ar": "حدد العمر"}, @@ -701,4 +683,13 @@ const Map> localizedValues = { "en": "Drag point to change your age", "ar": "اسحب لتغيير عمرك" }, + + "categorise": {"en": "Categories", "ar": "التطبيقات"}, + "wishList": {"en": "WishList", "ar": "الرغبات"}, + "myAccount": {"en": "My Account", "ar": "حسابي"}, + "cart": {"en": "Cart", "ar": "التسوق"}, + "searchProductHere": { + "en": "Search Product here", + "ar": "ابحث في الطلب الخاص بك" + }, }; diff --git a/lib/core/model/pharmacy/brands_model.dart b/lib/core/model/pharmacy/brands_model.dart new file mode 100644 index 00000000..03cd689e --- /dev/null +++ b/lib/core/model/pharmacy/brands_model.dart @@ -0,0 +1,24 @@ +class BrandsModel { + String id; + String name; + String namen; + Null image; + + BrandsModel({this.id, this.name, this.namen, this.image}); + + BrandsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + image = json['image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + data['image'] = this.image; + return data; + } +} diff --git a/lib/core/model/pharmacy/scan_qr_model.dart b/lib/core/model/pharmacy/scan_qr_model.dart new file mode 100644 index 00000000..71e25e8d --- /dev/null +++ b/lib/core/model/pharmacy/scan_qr_model.dart @@ -0,0 +1,584 @@ +class ScanQrModel { + String id; + bool visibleIndividually; + String name; + String namen; + List localizedNames; + String shortDescription; + String shortDescriptionn; + String fullDescription; + String fullDescriptionn; + bool markasNew; + bool showOnHomePage; + dynamic metaKeywords; + dynamic metaDescription; + dynamic metaTitle; + bool allowCustomerReviews; + dynamic approvedRatingSum; + dynamic notApprovedRatingSum; + dynamic approvedTotalReviews; + dynamic notApprovedTotalReviews; + String sku; + bool isRx; + bool prescriptionRequired; + dynamic rxMessage; + dynamic rxMessagen; + dynamic manufacturerPartNumber; + dynamic gtin; + bool isGiftCard; + bool requireOtherProducts; + bool automaticallyAddRequiredProducts; + bool isDownload; + bool unlimitedDownloads; + dynamic maxNumberOfDownloads; + dynamic downloadExpirationDays; + bool hasSampleDownload; + bool hasUserAgreement; + bool isRecurring; + dynamic recurringCycleLength; + dynamic recurringTotalCycles; + bool isRental; + dynamic rentalPriceLength; + bool isShipEnabled; + bool isFreeShipping; + bool shipSeparately; + dynamic additionalShippingCharge; + bool isTaxExempt; + bool isTelecommunicationsOrBroadcastingOrElectronicServices; + bool useMultipleWarehouses; + dynamic manageInventoryMethodId; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool displayStockAvailability; + bool displayStockQuantity; + dynamic minStockQuantity; + dynamic notifyAdminForQuantityBelow; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + dynamic allowedQuantities; + bool allowAddingOnlyExistingAttributeCombinations; + bool disableBuyButton; + bool disableWishlistButton; + bool availableForPreOrder; + dynamic preOrderAvailabilityStartDateTimeUtc; + bool callForPrice; + dynamic price; + dynamic oldPrice; + dynamic productCost; + dynamic specialPrice; + dynamic specialPriceStartDateTimeUtc; + dynamic specialPriceEndDateTimeUtc; + bool customerEntersPrice; + dynamic minimumCustomerEnteredPrice; + dynamic maximumCustomerEnteredPrice; + bool basepriceEnabled; + dynamic basepriceAmount; + dynamic basepriceBaseAmount; + bool hasTierPrices; + bool hasDiscountsApplied; + dynamic discountName; + dynamic discountNamen; + dynamic discountDescription; + dynamic discountDescriptionn; + dynamic discountPercentage; + String currency; + String currencyn; + double weight; + dynamic length; + dynamic width; + dynamic height; + dynamic availableStartDateTimeUtc; + dynamic availableEndDateTimeUtc; + dynamic displayOrder; + bool published; + bool deleted; + String createdOnUtc; + String updatedOnUtc; + String productType; + dynamic parentGroupedProductId; + List roleIds; + List discountIds; + List storeIds; + List manufacturerIds; + List reviews; + List images; + List attributes; + List specifications; + List associatedProductIds; + List tags; + dynamic vendorId; + String seName; + + ScanQrModel( + {this.id, + this.visibleIndividually, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.shortDescriptionn, + this.fullDescription, + this.fullDescriptionn, + this.markasNew, + this.showOnHomePage, + this.metaKeywords, + this.metaDescription, + this.metaTitle, + this.allowCustomerReviews, + this.approvedRatingSum, + this.notApprovedRatingSum, + this.approvedTotalReviews, + this.notApprovedTotalReviews, + this.sku, + this.isRx, + this.prescriptionRequired, + this.rxMessage, + this.rxMessagen, + this.manufacturerPartNumber, + this.gtin, + this.isGiftCard, + this.requireOtherProducts, + this.automaticallyAddRequiredProducts, + this.isDownload, + this.unlimitedDownloads, + this.maxNumberOfDownloads, + this.downloadExpirationDays, + this.hasSampleDownload, + this.hasUserAgreement, + this.isRecurring, + this.recurringCycleLength, + this.recurringTotalCycles, + this.isRental, + this.rentalPriceLength, + this.isShipEnabled, + this.isFreeShipping, + this.shipSeparately, + this.additionalShippingCharge, + this.isTaxExempt, + this.isTelecommunicationsOrBroadcastingOrElectronicServices, + this.useMultipleWarehouses, + this.manageInventoryMethodId, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.displayStockAvailability, + this.displayStockQuantity, + this.minStockQuantity, + this.notifyAdminForQuantityBelow, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.allowedQuantities, + this.allowAddingOnlyExistingAttributeCombinations, + this.disableBuyButton, + this.disableWishlistButton, + this.availableForPreOrder, + this.preOrderAvailabilityStartDateTimeUtc, + this.callForPrice, + this.price, + this.oldPrice, + this.productCost, + this.specialPrice, + this.specialPriceStartDateTimeUtc, + this.specialPriceEndDateTimeUtc, + this.customerEntersPrice, + this.minimumCustomerEnteredPrice, + this.maximumCustomerEnteredPrice, + this.basepriceEnabled, + this.basepriceAmount, + this.basepriceBaseAmount, + this.hasTierPrices, + this.hasDiscountsApplied, + this.discountName, + this.discountNamen, + this.discountDescription, + this.discountDescriptionn, + this.discountPercentage, + this.currency, + this.currencyn, + this.weight, + this.length, + this.width, + this.height, + this.availableStartDateTimeUtc, + this.availableEndDateTimeUtc, + this.displayOrder, + this.published, + this.deleted, + this.createdOnUtc, + this.updatedOnUtc, + this.productType, + this.parentGroupedProductId, + this.roleIds, + this.discountIds, + this.storeIds, + this.manufacturerIds, + this.reviews, + this.images, + this.attributes, + this.specifications, + this.associatedProductIds, + this.tags, + this.vendorId, + this.seName}); + + ScanQrModel.fromJson(Map json) { + id = json['id']; + visibleIndividually = json['visible_individually']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + shortDescriptionn = json['short_descriptionn']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + markasNew = json['markas_new']; + showOnHomePage = json['show_on_home_page']; + metaKeywords = json['meta_keywords']; + metaDescription = json['meta_description']; + metaTitle = json['meta_title']; + allowCustomerReviews = json['allow_customer_reviews']; + approvedRatingSum = json['approved_rating_sum']; + notApprovedRatingSum = json['not_approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + notApprovedTotalReviews = json['not_approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + prescriptionRequired = json['prescription_required']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + manufacturerPartNumber = json['manufacturer_part_number']; + gtin = json['gtin']; + isGiftCard = json['is_gift_card']; + requireOtherProducts = json['require_other_products']; + automaticallyAddRequiredProducts = + json['automatically_add_required_products']; + isDownload = json['is_download']; + unlimitedDownloads = json['unlimited_downloads']; + maxNumberOfDownloads = json['max_number_of_downloads']; + downloadExpirationDays = json['download_expiration_days']; + hasSampleDownload = json['has_sample_download']; + hasUserAgreement = json['has_user_agreement']; + isRecurring = json['is_recurring']; + recurringCycleLength = json['recurring_cycle_length']; + recurringTotalCycles = json['recurring_total_cycles']; + isRental = json['is_rental']; + rentalPriceLength = json['rental_price_length']; + isShipEnabled = json['is_ship_enabled']; + isFreeShipping = json['is_free_shipping']; + shipSeparately = json['ship_separately']; + additionalShippingCharge = json['additional_shipping_charge']; + isTaxExempt = json['is_tax_exempt']; + isTelecommunicationsOrBroadcastingOrElectronicServices = + json['is_telecommunications_or_broadcasting_or_electronic_services']; + useMultipleWarehouses = json['use_multiple_warehouses']; + manageInventoryMethodId = json['manage_inventory_method_id']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + displayStockAvailability = json['display_stock_availability']; + displayStockQuantity = json['display_stock_quantity']; + minStockQuantity = json['min_stock_quantity']; + notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + allowedQuantities = json['allowed_quantities']; + allowAddingOnlyExistingAttributeCombinations = + json['allow_adding_only_existing_attribute_combinations']; + disableBuyButton = json['disable_buy_button']; + disableWishlistButton = json['disable_wishlist_button']; + availableForPreOrder = json['available_for_pre_order']; + preOrderAvailabilityStartDateTimeUtc = + json['pre_order_availability_start_date_time_utc']; + callForPrice = json['call_for_price']; + price = json['price']; + oldPrice = json['old_price']; + productCost = json['product_cost']; + specialPrice = json['special_price']; + specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; + specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; + customerEntersPrice = json['customer_enters_price']; + minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; + maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; + basepriceEnabled = json['baseprice_enabled']; + basepriceAmount = json['baseprice_amount']; + basepriceBaseAmount = json['baseprice_base_amount']; + hasTierPrices = json['has_tier_prices']; + hasDiscountsApplied = json['has_discounts_applied']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountDescription = json['discount_description']; + discountDescriptionn = json['discount_Descriptionn']; + discountPercentage = json['discount_percentage']; + currency = json['currency']; + currencyn = json['currencyn']; + weight = json['weight']; + length = json['length']; + width = json['width']; + height = json['height']; + availableStartDateTimeUtc = json['available_start_date_time_utc']; + availableEndDateTimeUtc = json['available_end_date_time_utc']; + displayOrder = json['display_order']; + published = json['published']; + deleted = json['deleted']; + createdOnUtc = json['created_on_utc']; + updatedOnUtc = json['updated_on_utc']; + productType = json['product_type']; + parentGroupedProductId = json['parent_grouped_product_id']; + if (json['role_ids'] != null) { + roleIds = new List(); + } + if (json['discount_ids'] != null) { + discountIds = new List(); + } + if (json['store_ids'] != null) { + storeIds = new List(); + } + manufacturerIds = json['manufacturer_ids'].cast(); + if (json['reviews'] != null) { + reviews = new List(); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + if (json['attributes'] != null) { + attributes = new List(); + } + if (json['specifications'] != null) { + specifications = new List(); + json['specifications'].forEach((v) { + specifications.add(new Specifications.fromJson(v)); + }); + } + if (json['associated_product_ids'] != null) { + associatedProductIds = new List(); + } + if (json['tags'] != null) { + tags = new List(); + } + vendorId = json['vendor_id']; + seName = json['se_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['visible_individually'] = this.visibleIndividually; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['short_descriptionn'] = this.shortDescriptionn; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['markas_new'] = this.markasNew; + data['show_on_home_page'] = this.showOnHomePage; + data['meta_keywords'] = this.metaKeywords; + data['meta_description'] = this.metaDescription; + data['meta_title'] = this.metaTitle; + data['allow_customer_reviews'] = this.allowCustomerReviews; + data['approved_rating_sum'] = this.approvedRatingSum; + data['not_approved_rating_sum'] = this.notApprovedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['not_approved_total_reviews'] = this.notApprovedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['prescription_required'] = this.prescriptionRequired; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['manufacturer_part_number'] = this.manufacturerPartNumber; + data['gtin'] = this.gtin; + data['is_gift_card'] = this.isGiftCard; + data['require_other_products'] = this.requireOtherProducts; + data['automatically_add_required_products'] = + this.automaticallyAddRequiredProducts; + data['is_download'] = this.isDownload; + data['unlimited_downloads'] = this.unlimitedDownloads; + data['max_number_of_downloads'] = this.maxNumberOfDownloads; + data['download_expiration_days'] = this.downloadExpirationDays; + data['has_sample_download'] = this.hasSampleDownload; + data['has_user_agreement'] = this.hasUserAgreement; + data['is_recurring'] = this.isRecurring; + data['recurring_cycle_length'] = this.recurringCycleLength; + data['recurring_total_cycles'] = this.recurringTotalCycles; + data['is_rental'] = this.isRental; + data['rental_price_length'] = this.rentalPriceLength; + data['is_ship_enabled'] = this.isShipEnabled; + data['is_free_shipping'] = this.isFreeShipping; + data['ship_separately'] = this.shipSeparately; + data['additional_shipping_charge'] = this.additionalShippingCharge; + data['is_tax_exempt'] = this.isTaxExempt; + data['is_telecommunications_or_broadcasting_or_electronic_services'] = + this.isTelecommunicationsOrBroadcastingOrElectronicServices; + data['use_multiple_warehouses'] = this.useMultipleWarehouses; + data['manage_inventory_method_id'] = this.manageInventoryMethodId; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['display_stock_availability'] = this.displayStockAvailability; + data['display_stock_quantity'] = this.displayStockQuantity; + data['min_stock_quantity'] = this.minStockQuantity; + data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['allowed_quantities'] = this.allowedQuantities; + data['allow_adding_only_existing_attribute_combinations'] = + this.allowAddingOnlyExistingAttributeCombinations; + data['disable_buy_button'] = this.disableBuyButton; + data['disable_wishlist_button'] = this.disableWishlistButton; + data['available_for_pre_order'] = this.availableForPreOrder; + data['pre_order_availability_start_date_time_utc'] = + this.preOrderAvailabilityStartDateTimeUtc; + data['call_for_price'] = this.callForPrice; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['product_cost'] = this.productCost; + data['special_price'] = this.specialPrice; + data['special_price_start_date_time_utc'] = + this.specialPriceStartDateTimeUtc; + data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; + data['customer_enters_price'] = this.customerEntersPrice; + data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; + data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; + data['baseprice_enabled'] = this.basepriceEnabled; + data['baseprice_amount'] = this.basepriceAmount; + data['baseprice_base_amount'] = this.basepriceBaseAmount; + data['has_tier_prices'] = this.hasTierPrices; + data['has_discounts_applied'] = this.hasDiscountsApplied; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_description'] = this.discountDescription; + data['discount_Descriptionn'] = this.discountDescriptionn; + data['discount_percentage'] = this.discountPercentage; + data['currency'] = this.currency; + data['currencyn'] = this.currencyn; + data['weight'] = this.weight; + data['length'] = this.length; + data['width'] = this.width; + data['height'] = this.height; + data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; + data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; + data['display_order'] = this.displayOrder; + data['published'] = this.published; + data['deleted'] = this.deleted; + data['created_on_utc'] = this.createdOnUtc; + data['updated_on_utc'] = this.updatedOnUtc; + data['product_type'] = this.productType; + data['parent_grouped_product_id'] = this.parentGroupedProductId; + + data['manufacturer_ids'] = this.manufacturerIds; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + + if (this.specifications != null) { + data['specifications'] = + this.specifications.map((v) => v.toJson()).toList(); + } + + data['vendor_id'] = this.vendorId; + data['se_name'] = this.seName; + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} + +class Specifications { + int id; + int displayOrder; + String defaultValue; + String defaultValuen; + String name; + String nameN; + + Specifications( + {this.id, + this.displayOrder, + this.defaultValue, + this.defaultValuen, + this.name, + this.nameN}); + + Specifications.fromJson(Map json) { + id = json['id']; + displayOrder = json['display_order']; + defaultValue = json['default_value']; + defaultValuen = json['default_valuen']; + name = json['name']; + nameN = json['nameN']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['display_order'] = this.displayOrder; + data['default_value'] = this.defaultValue; + data['default_valuen'] = this.defaultValuen; + data['name'] = this.name; + data['nameN'] = this.nameN; + return data; + } +} diff --git a/lib/core/model/search_products_model.dart b/lib/core/model/search_products_model.dart new file mode 100644 index 00000000..d63fd4b0 --- /dev/null +++ b/lib/core/model/search_products_model.dart @@ -0,0 +1,185 @@ +class SearchProductsModel { + String id; + String name; + String namen; + List localizedNames; + String shortDescription; + String fullDescription; + String fullDescriptionn; + dynamic approvedRatingSum; + dynamic approvedTotalReviews; + String sku; + bool isRx; + dynamic rxMessage; + dynamic rxMessagen; + dynamic stockQuantity; + String stockAvailability; + String stockAvailabilityn; + bool allowBackInStockSubscriptions; + dynamic orderMinimumQuantity; + dynamic orderMaximumQuantity; + double price; + dynamic oldPrice; + dynamic discountName; + dynamic discountNamen; + dynamic discountPercentage; + dynamic displayOrder; + List discountIds; + List reviews; + List images; + + SearchProductsModel( + {this.id, + this.name, + this.namen, + this.localizedNames, + this.shortDescription, + this.fullDescription, + this.fullDescriptionn, + this.approvedRatingSum, + this.approvedTotalReviews, + this.sku, + this.isRx, + this.rxMessage, + this.rxMessagen, + this.stockQuantity, + this.stockAvailability, + this.stockAvailabilityn, + this.allowBackInStockSubscriptions, + this.orderMinimumQuantity, + this.orderMaximumQuantity, + this.price, + this.oldPrice, + this.discountName, + this.discountNamen, + this.discountPercentage, + this.displayOrder, + this.discountIds, + this.reviews, + this.images}); + + SearchProductsModel.fromJson(Map json) { + id = json['id']; + name = json['name']; + namen = json['namen']; + if (json['localized_names'] != null) { + localizedNames = new List(); + json['localized_names'].forEach((v) { + localizedNames.add(new LocalizedNames.fromJson(v)); + }); + } + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new Images.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['namen'] = this.namen; + if (this.localizedNames != null) { + data['localized_names'] = + this.localizedNames.map((v) => v.toJson()).toList(); + } + data['short_description'] = this.shortDescription; + data['full_description'] = this.fullDescription; + data['full_descriptionn'] = this.fullDescriptionn; + data['approved_rating_sum'] = this.approvedRatingSum; + data['approved_total_reviews'] = this.approvedTotalReviews; + data['sku'] = this.sku; + data['is_rx'] = this.isRx; + data['rx_message'] = this.rxMessage; + data['rx_messagen'] = this.rxMessagen; + data['stock_quantity'] = this.stockQuantity; + data['stock_availability'] = this.stockAvailability; + data['stock_availabilityn'] = this.stockAvailabilityn; + data['allow_back_in_stock_subscriptions'] = + this.allowBackInStockSubscriptions; + data['order_minimum_quantity'] = this.orderMinimumQuantity; + data['order_maximum_quantity'] = this.orderMaximumQuantity; + data['price'] = this.price; + data['old_price'] = this.oldPrice; + data['discount_name'] = this.discountName; + data['discount_namen'] = this.discountNamen; + data['discount_percentage'] = this.discountPercentage; + data['display_order'] = this.displayOrder; + + if (this.images != null) { + data['images'] = this.images.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class LocalizedNames { + int languageId; + String localizedName; + + LocalizedNames({this.languageId, this.localizedName}); + + LocalizedNames.fromJson(Map json) { + languageId = json['language_id']; + localizedName = json['localized_name']; + } + + Map toJson() { + final Map data = new Map(); + data['language_id'] = this.languageId; + data['localized_name'] = this.localizedName; + return data; + } +} + +class Images { + int id; + int position; + String src; + String thumb; + String attachment; + + Images({this.id, this.position, this.src, this.thumb, this.attachment}); + + Images.fromJson(Map json) { + id = json['id']; + position = json['position']; + src = json['src']; + thumb = json['thumb']; + attachment = json['attachment']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['position'] = this.position; + data['src'] = this.src; + data['thumb'] = this.thumb; + data['attachment'] = this.attachment; + return data; + } +} diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart index 562a4496..dfb93045 100644 --- a/lib/core/service/pharmacy_categorise_service.dart +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -1,10 +1,13 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; import 'base_service.dart'; @@ -33,6 +36,23 @@ class PharmacyCategoriseService extends BaseService { List _finalProducts = List(); List get finalProducts => _finalProducts; + //service 7 + + List _brandsList = List(); + List get brandsList => _brandsList; + + // service 8 + + List _searchList = List(); + List get searchList => _searchList; + + List _scanList = List(); + List get scanList => _scanList; + + clearSearchList() { + _searchList.clear(); + } + Future getCategorise() async { hasError = false; _categoriseList.clear(); @@ -50,6 +70,60 @@ class PharmacyCategoriseService extends BaseService { ); } + Future scanQr() async { + hasError = false; + _scanList.clear(); + await baseAppClient.get( + SCAN_QR_CODE, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _scanList.add(ScanQrModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future searchProducts({String productName}) async { + hasError = false; + _searchList.clear(); + String endPoint = productName != null + ? GET_SEARCH_PRODUCTS + "$productName" + '&language_id=1' + : GET_SEARCH_PRODUCTS + ""; + await baseAppClient.get( + endPoint, + onSuccess: (dynamic response, int statusCode) { + response['products'].forEach((item) { + _searchList.add(SearchProductsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + + Future getBrands() async { + hasError = false; + _brandsList.clear(); + await baseAppClient.get( + GET_BRANDS_LIST, + onSuccess: (dynamic response, int statusCode) { + response['manufacturer'].forEach((item) { + _brandsList.add(BrandsModel.fromJson(item)); + }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + ); + } + Future getCategoriseParent({String id}) async { hasError = false; _parentCategoriseList.clear(); diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart index 16249206..a2f5b654 100644 --- a/lib/core/viewModels/pharmacy_categorise_view_model.dart +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -1,10 +1,14 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; +import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; + import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -32,6 +36,12 @@ class PharmacyCategoriseViewModel extends BaseViewModel { List get finalProducts => _pharmacyCategoriseService.finalProducts; + List get brandsList => _pharmacyCategoriseService.brandsList; + + List get searchList => + _pharmacyCategoriseService.searchList; + + List get scanList => _pharmacyCategoriseService.scanList; Future getCategorise() async { hasError = false; @@ -45,6 +55,46 @@ class PharmacyCategoriseViewModel extends BaseViewModel { setState(ViewState.Idle); } + Future getBrands() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.getBrands(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future scanQr() async { + hasError = false; + // _insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.scanQr(); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + clearSearchList() { + _pharmacyCategoriseService.clearSearchList(); + } + + Future searchProducts({String productName}) async { + hasError = false; + _pharmacyCategoriseService.clearSearchList(); + setState(ViewState.Busy); + await _pharmacyCategoriseService.searchProducts(productName: productName); + if (_pharmacyCategoriseService.hasError) { + error = _pharmacyCategoriseService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + Future getCategoriseParent({String i}) async { hasError = false; // _insuranceCardService.clearInsuranceCard(); @@ -55,6 +105,7 @@ class PharmacyCategoriseViewModel extends BaseViewModel { setState(ViewState.ErrorLocal); } else await getParentProducts(i: i); + await getBrands(); } Future getParentProducts({String i}) async { diff --git a/lib/pages/final_products_page.dart b/lib/pages/final_products_page.dart index 66b5ee0d..03adee97 100644 --- a/lib/pages/final_products_page.dart +++ b/lib/pages/final_products_page.dart @@ -7,9 +7,16 @@ import 'package:flutter/material.dart'; import 'base/base_view.dart'; -class FinalProductsPage extends StatelessWidget { +class FinalProductsPage extends StatefulWidget { String id; FinalProductsPage({this.id}); + @override + _FinalProductsPageState createState() => _FinalProductsPageState(id: id); +} + +class _FinalProductsPageState extends State { + String id; + _FinalProductsPageState({this.id}); String categoriseName = "Personal Care"; bool styleOne = true; bool styleTwo = false; @@ -32,7 +39,7 @@ class FinalProductsPage extends StatelessWidget { isShowDecPage: false, baseViewModel: model, body: Container( - height: MediaQuery.of(context).size.height * 1.87, + height: MediaQuery.of(context).size.height * 5.87, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -64,23 +71,25 @@ class FinalProductsPage extends StatelessWidget { child: InkWell( child: styleIcon, onTap: () { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); }, ), ), @@ -95,7 +104,7 @@ class FinalProductsPage extends StatelessWidget { styleOne == true ? Expanded( child: Container( - height: MediaQuery.of(context).size.height * 1.90, + height: MediaQuery.of(context).size.height * 3.90, child: GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -302,64 +311,42 @@ class FinalProductsPage extends StatelessWidget { ) : Expanded( child: Container( + height: MediaQuery.of(context).size.height * 5.0, child: ListView.builder( itemCount: model.finalProducts.length, itemBuilder: (BuildContext context, int index) { return Card( - // color: - // model.products[index].discountName != - // null - // ? Color(0xffFFFF00) - // : Colors.white, child: Row( children: [ Stack( children: [ Column( children: [ - if (model.finalProducts[index] - .discountName != - null) - Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - child: Container( - color: Colors.yellow, - height: 25.0, - width: 70.0, - child: Center( - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight - .w900, - ), - ), - ), + Container( + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, ), - transform: - new Matrix4.rotationZ( - 6.15099), ), + ), Container( margin: EdgeInsets.fromLTRB( 0, 0, 0, 0), alignment: Alignment.center, child: Image.network( model.finalProducts[index] - .images[index].thumb, - fit: BoxFit.cover, + .images.isNotEmpty + ? model + .finalProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, height: 80, ), ), @@ -376,7 +363,7 @@ class FinalProductsPage extends StatelessWidget { ? MediaQuery.of(context) .size .width / - 5 + 3.5 : 0, padding: EdgeInsets.all(4), decoration: BoxDecoration( @@ -399,7 +386,7 @@ class FinalProductsPage extends StatelessWidget { regular: true, fontSize: 10, fontWeight: - FontWeight.w400, + FontWeight.w600, ), ), ], @@ -407,48 +394,31 @@ class FinalProductsPage extends StatelessWidget { ], ), Container( + height: 100.0, margin: EdgeInsets.symmetric( horizontal: 6, vertical: 0, ), child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (model.finalProducts[index] - .discountName != - null) - Container( - width: 250.0, - height: 18.5, - decoration: BoxDecoration( - color: Color(0xff5AB145), - ), - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 5.5, - ), - child: Texts( - model - .finalProducts[ - index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 11.4, - ), - ), - ), SizedBox( height: 4.0, ), - Texts( - model.finalProducts[index] - .name, - regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, + Container( + height: 35.0, + width: 250.0, + child: Texts( + model.finalProducts[index] + .name, + regular: true, + fontSize: 13.2, + fontWeight: FontWeight.w500, + maxLines: 2, + ), ), SizedBox( height: 8.0, diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart index 058a42fe..6a687e1a 100644 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -1,7 +1,9 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; +import 'package:diplomaticquarterapp/pages/search_products_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart'; import 'package:flutter/material.dart'; @@ -38,29 +40,36 @@ class _LandingPagePharmacyState extends State { backgroundColor: Color(0xff5AB145), elevation: 0, title: Container( - height: 30, + height: MediaQuery.of(context).size.height * 0.056, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0), + borderRadius: BorderRadius.circular(5.0), color: Colors.white, ), child: InkWell( child: Padding( padding: EdgeInsets.all(8.0), child: Row( + //crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ - Icon(Icons.search, size: 16.0), + Icon(Icons.search, size: 25.0), SizedBox( - width: 5.0, + width: 15.0, ), - Text( - 'Search your Medicine', - style: TextStyle( - fontSize: 13.0, fontWeight: FontWeight.w300), + Texts( + TranslationBase.of(context).searchProductHere, + fontSize: 13, ) ], ), ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SearchProductsPage()), + ); + }, ), ), leading: Builder( @@ -125,7 +134,9 @@ class _LandingPagePharmacyState extends State { ), PharmacyCategorisePage(), OffersCategorisePage(), - ParentCategorisePage(), + Container( + child: Text('text'), + ), Container( child: Center(child: Text('This Is Cart Page')), ), diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart index f81f0588..45ae2696 100644 --- a/lib/pages/offers_categorise_page.dart +++ b/lib/pages/offers_categorise_page.dart @@ -94,6 +94,7 @@ class _OffersCategorisePageState extends State { child: Texts( model.categorise[index].name, fontWeight: FontWeight.w600, + fontSize: 13.8, ), ), ), diff --git a/lib/pages/parent_categorise_page.dart b/lib/pages/parent_categorise_page.dart index ccb33bb2..4acb3b68 100644 --- a/lib/pages/parent_categorise_page.dart +++ b/lib/pages/parent_categorise_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/sub_categorise_page.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; @@ -13,14 +14,22 @@ import 'package:giffy_dialog/giffy_dialog.dart'; import 'base/base_view.dart'; import 'final_products_page.dart'; -class ParentCategorisePage extends StatelessWidget { - final String id; - final String titleName; - +class ParentCategorisePage extends StatefulWidget { + String id; + String titleName; ParentCategorisePage({this.id, this.titleName}); + @override + _ParentCategorisePageState createState() => + _ParentCategorisePageState(id: id, titleName: titleName); +} - String categoriesID; - +class _ParentCategorisePageState extends State { + String id; + String titleName; + _ParentCategorisePageState({this.id, this.titleName}); + Map values = {'huusam': false, 'ali': false, 'noor': false}; + bool checkedBrands = false; + bool checkedCategorise = false; String categoriseName = "Personal Care"; bool styleOne = true; bool styleTwo = false; @@ -31,7 +40,7 @@ class ParentCategorisePage extends StatelessWidget { ); @override Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getCategoriseParent(i: id), builder: (BuildContext context, PharmacyCategoriseViewModel model, @@ -76,49 +85,91 @@ class ParentCategorisePage extends StatelessWidget { height: 160.0, width: double.infinity), ), - if (model.categoriseParent.length >= 8) + if (model.categoriseParent.length > 8) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: InkWell( - child: Container( - child: Texts( - 'View All Categories', - fontWeight: FontWeight.w300, - ), - ), - onTap: () { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: - MediaQuery.of(context).size.height * - 0.9, - color: Colors.white, - child: Center( - child: Column( - mainAxisAlignment: - MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - const Text('Modal BottomSheet'), - ElevatedButton( - child: const Text( - 'Close BottomSheet'), - onPressed: () => - Navigator.pop(context), - ) - ], - ), - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: InkWell( + child: Container( + child: Texts( + 'View All Categories', + fontWeight: FontWeight.w300, + ), + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Container( + height: MediaQuery.of(context) + .size + .height * + 0.89, + color: Colors.white, + child: Center( + child: ListView.builder( + scrollDirection: + Axis.vertical, + itemCount: model + .categoriseParent.length, + itemBuilder: + (BuildContext context, + int index) { + return Container( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Texts(model + .categoriseParent[ + index] + .name), + Divider( + thickness: 0.6, + color: Colors + .black12, + ) + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => + SubCategorisePage( + title: + model.categoriseParent[index].name, + id: model.categoriseParent[index].id, + parentId: + id, + )), + ); + }, + ), + ), + ); + }), + ), + ); + }, ); }, - ); - }, - ), + ), + ), + Icon(Icons.arrow_forward) + ], ), Divider( thickness: 1.0, @@ -170,18 +221,23 @@ class ParentCategorisePage extends StatelessWidget { width: MediaQuery.of(context) .size .width * - 0.17, + 0.197, height: MediaQuery.of(context) .size .height * - 0.10, + 0.08, child: Center( child: Texts( - model.categoriseParent[index] - .name, - fontSize: 14, + projectViewModel.isArabic + ? model + .categoriseParent[index] + .namen + : model + .categoriseParent[index] + .name, + fontSize: 13.4, fontWeight: FontWeight.w600, - maxLines: 2, + maxLines: 3, ), ), ), @@ -220,19 +276,299 @@ class ParentCategorisePage extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: FontWeight.w600, - ), - ], + InkWell( + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: FontWeight.w600, + ), + ], + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return DraggableScrollableSheet( + initialChildSize: 0.95, + maxChildSize: 0.95, + minChildSize: 0.9, + builder: (BuildContext context, + ScrollController scrollController) { + return SingleChildScrollView( + controller: scrollController, + child: Container( + height: MediaQuery.of(context) + .size + .height * + 1.95, + child: Column( + children: [ + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: + FontWeight.w600, + ), + SizedBox( + width: 250.0, + ), + InkWell( + child: Texts( + 'Close', + color: Colors.red, + fontWeight: + FontWeight.w600, + fontSize: 15.0, + ), + onTap: () { + Navigator.pop( + context); + }, + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + Column( + children: [ + ExpansionTile( + title: + Texts('Categorise'), + children: [ + Container( + height: 350, + child: ListView + .builder( + controller: + scrollController, + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .categoriseParent + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .categoriseParent[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedCategorise, + onChanged: + (bool + value) { + setState( + () { + checkedCategorise = + value; + }); + }, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Brands'), + children: [ + Container( + height: 350, + child: ListView + .builder( + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .brandsList + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .brandsList[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedBrands, + onChanged: + (bool + value) { + setState( + () { + checkedBrands = + value; + }); + }, + autofocus: + true, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Price'), + children: [ + Container( + color: Color( + 0xffEEEEEE), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceAround, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Min'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Max'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + ], + ), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + SizedBox( + height: MediaQuery.of( + context) + .size + .height * + 0.4, + ), + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Container( + width: 100, + child: Button( + label: 'Reset', + backgroundColor: + Colors.red, + ), + ), + SizedBox( + width: 30, + ), + Container( + width: 200, + child: Button( + label: 'Apply', + backgroundColor: + Colors + .green, + ), + ), + ], + ), + ), + ], + ), + ], + ), + ), + ); + }); + }, + ); + }, ), Row( children: [ @@ -241,8 +577,8 @@ class ParentCategorisePage extends StatelessWidget { child: VerticalDivider( color: Colors.black45, thickness: 1.0, - //width: 0.3, - // indent: 0.0, +//width: 0.3, +// indent: 0.0, ), ), Padding( @@ -250,23 +586,25 @@ class ParentCategorisePage extends StatelessWidget { child: InkWell( child: styleIcon, onTap: () { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); }, ), ), @@ -522,229 +860,168 @@ class ParentCategorisePage extends StatelessWidget { }, ), ) - : Expanded( - child: Container( - child: ListView.builder( - itemCount: model.parentProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - // color: - // model.products[index].discountName != - // null - // ? Color(0xffFFFF00) - // : Colors.white, - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - if (model - .parentProducts[ - index] - .discountName != - null) - Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - child: Container( - color: - Colors.yellow, - height: 25.0, - width: 70.0, - child: Center( - child: Texts( - 'offer' - .toUpperCase(), - color: - Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight - .w900, - ), - ), - ), - ), - transform: new Matrix4 - .rotationZ(6.15099), + : Container( + height: MediaQuery.of(context).size.height * 5.0, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + itemCount: model.parentProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + Container( + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, ), - Container( - margin: - EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: - Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model + ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model + .parentProducts[ + index] + .images + .isNotEmpty + ? model + .parentProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, + height: 80, + ), + ), + ], + ), + Column( + children: [ + Container( + width: model .parentProducts[ index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), ), - ], - ), - Column( - children: [ - Container( - width: model + child: Texts( + model .parentProducts[ index] .rxMessage != null - ? MediaQuery.of( - context) - .size - .width / - 5 - : 0, - padding: - EdgeInsets.all(4), - decoration: BoxDecoration( - color: - Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular( - 6)), - ), - child: Texts( - model - .parentProducts[ - index] - .rxMessage != - null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model - .parentProducts[index] - .discountName != - null) - Container( - width: 250.0, - height: 18.5, - decoration: BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Padding( - padding: EdgeInsets - .symmetric( - horizontal: 5.5, - ), - child: Texts( - model + ? model .parentProducts[ index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 11.4, - ), - ), - ), - SizedBox( - height: 4.0, - ), - Texts( - model.parentProducts[index] - .name, - regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.parentProducts[index].price}", - bold: true, - fontSize: 14, + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, ), ), - Row( - children: [ - StarRating( - totalAverage: model - .parentProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .parentProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .parentProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.parentProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), ], ), + ], + ), + Container( + height: 100.0, + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, ), - ], - ), - ); - }), - ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 4.0, + ), + Texts( + model.parentProducts[index] + .name, + regular: true, + fontSize: 13.2, + fontWeight: FontWeight.w500, + maxLines: 5, + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.parentProducts[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .parentProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .parentProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .parentProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.parentProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ); + }), ) ], ), diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart index 640251ec..b9954d20 100644 --- a/lib/pages/pharmacy_categorise.dart +++ b/lib/pages/pharmacy_categorise.dart @@ -1,10 +1,16 @@ import 'package:charts_flutter/flutter.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page_pharmcy.dart'; import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; - +import 'package:barcode_scan/platform_wrapper.dart'; +import 'package:provider/provider.dart'; import 'base/base_view.dart'; import 'final_products_page.dart'; @@ -18,6 +24,7 @@ class _PharmacyCategorisePageState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getCategorise(), builder: (BuildContext context, PharmacyCategoriseViewModel model, @@ -50,7 +57,9 @@ class _PharmacyCategorisePageState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Texts( - model.categorise[index].name, + projectViewModel.isArabic + ? model.categorise[index].namen + : model.categorise[index].name, fontWeight: FontWeight.w600, ), ), @@ -77,7 +86,7 @@ class _PharmacyCategorisePageState extends State { ), ), Container( - height: 200, + height: 150, child: Column( children: [ Divider( @@ -102,7 +111,9 @@ class _PharmacyCategorisePageState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Texts( - 'best sellers', + projectViewModel.isArabic + ? 'الاكثر مبيعا' + : 'Best Sellers', fontWeight: FontWeight.w600, ), ), @@ -123,7 +134,9 @@ class _PharmacyCategorisePageState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Texts( - 'Most Viewed', + projectViewModel.isArabic + ? 'الاكثر مشاهدة' + : 'Most Viewed', fontWeight: FontWeight.w600, ), ), @@ -147,7 +160,9 @@ class _PharmacyCategorisePageState extends State { child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Texts( - 'New Proudcts', + projectViewModel.isArabic + ? 'منتجات جديدة' + : 'New Products', fontWeight: FontWeight.w600, ), ), @@ -157,18 +172,27 @@ class _PharmacyCategorisePageState extends State { Expanded( child: Padding( padding: EdgeInsets.all(4.0), - child: Container( - height: 50.0, - width: 55.0, - decoration: BoxDecoration( - color: Colors.purple.shade200.withOpacity(0.34), - borderRadius: BorderRadius.circular(5.0), - ), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - 'Recently Viewed', - fontWeight: FontWeight.w600, + child: InkWell( + onTap: () { + _scanQrAndGetPatient(context, model); + }, + child: Container( + height: 50.0, + width: 55.0, + decoration: BoxDecoration( + color: + Colors.purple.shade200.withOpacity(0.34), + borderRadius: BorderRadius.circular(5.0), + ), + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: 10.0), + child: Texts( + projectViewModel.isArabic + ? 'شوهد مؤخرا' + : 'Recently Viewed', + fontWeight: FontWeight.w600, + ), ), ), ), @@ -183,4 +207,32 @@ class _PharmacyCategorisePageState extends State { ), ); } + + _scanQrAndGetPatient( + BuildContext context, + PharmacyCategoriseViewModel model, + ) async { + /// When give qr we will change this method to get data + /// var result = await BarcodeScanner.scan(); + /// int patientID = get from qr result + var result = await BarcodeScanner.scan(); + if (result.rawContent == "") { + List listOfParams = result.rawContent.split(','); + // ScanQrRequestModel _scanQrRequestModel = ScanQrRequestModel( + // deliveryOrderID: int.parse(listOfParams[0]), groupID: 0); + String patientType = "1"; + await model.scanQr(); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + } else { + AppToast.showSuccessToast(message: model.scanList[0].id); + { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => LandingPagePharmacy()), + ); + } + } + } + } } diff --git a/lib/pages/search_products_page.dart b/lib/pages/search_products_page.dart new file mode 100644 index 00000000..45cafd35 --- /dev/null +++ b/lib/pages/search_products_page.dart @@ -0,0 +1,287 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; +import 'package:flutter/material.dart'; + +import 'base/base_view.dart'; + +class SearchProductsPage extends StatefulWidget { + @override + _SearchProductsPageState createState() => _SearchProductsPageState(); +} + +class _SearchProductsPageState extends State { + final textController = TextEditingController(); + final _formKey = GlobalKey(); + String msg = ''; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.clearSearchList(), + builder: (BuildContext context, PharmacyCategoriseViewModel model, + Widget child) => + PharmacyAppScaffold( + appBarTitle: 'Search', + isBottomBar: false, + isShowAppBar: true, + backgroundColor: Colors.white, + isShowDecPage: false, + //baseViewModel: model, + body: SingleChildScrollView( + child: Container( + height: SizeConfig.screenHeight, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.79, + child: Form( + key: _formKey, + child: TextFields( + autoFocus: true, + hintText: 'Search', + fontSize: 19.0, + prefixIcon: Icon(Icons.search), + inputAction: TextInputAction.search, + onSaved: (value) { + //searchMedicine(model, context); + }, + onSubmit: (value) { + searchMedicine(model, context); + msg = 'No Result Found'; + }, + controller: textController, + validator: (value) { + if (value.isEmpty) { + return 'please Enter Product Name'; + } + return null; + }, + ), + ), + ), + SizedBox( + width: 10.0, + ), + InkWell( + child: Texts( + 'Cancel', + fontSize: 17.0, + fontWeight: FontWeight.w500, + ), + onTap: () { + Navigator.pop(context); + }, + ), + + // child: Container( + // child: Button( + // backgroundColor: Colors.green, + // loading: model.state == ViewState.BusyLocal, + // label: 'Search', + // onTap: () { + // searchMedicine(model, context); + // }), + // width: MediaQuery.of(context).size.width * 0.09, + // ), + ], + ), + ), + Center( + child: NetworkBaseView( + baseViewModel: model, + child: model.searchList.isNotEmpty + ? Container( + height: MediaQuery.of(context).size.height * 0.80, + child: GridView.builder( + //physics: NeverScrollableScrollPhysics(), + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 0.5, + mainAxisSpacing: 2.0, + childAspectRatio: 1.0, + ), + itemCount: model.searchList.length, + itemBuilder: (BuildContext context, int index) { + return Card( + color: model.searchList[index].discountName != + null + ? Color(0xffFFFF00) + : Colors.white, + elevation: 0, + shape: Border( + right: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + left: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + bottom: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + top: BorderSide( + color: Colors.grey.shade300, + width: 1, + ), + ), + margin: EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(110.0), + ), + color: Colors.white, + ), + padding: + EdgeInsets.symmetric(horizontal: 0), + width: + MediaQuery.of(context).size.width / 3, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + 0, 16, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.searchList[index].images + .isNotEmpty + ? model.searchList[index] + .images[0].thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.cover, + height: 80, + ), + ), + Container( + width: model.searchList[index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: BorderRadius.only( + topLeft: + Radius.circular(6)), + ), + child: Texts( + model.searchList[index] + .rxMessage != + null + ? model.searchList[index] + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + Container( + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.searchList[index].name, + regular: true, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + Padding( + padding: const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.searchList[index].price}", + bold: true, + fontSize: 14, + ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .searchList[ + index] + .approvedRatingSum > + 0 + ? (model + .searchList[ + index] + .approvedRatingSum + .toDouble() / + model + .searchList[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.searchList[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: FontWeight.w400, + ) + ], + ), + ], + ), + ), + ], + ), + ), + ); + }, + ), + ) + : Texts(msg), + ), + ) + ], + ), + ), + ), + ), + ); + } + + searchMedicine(PharmacyCategoriseViewModel model, BuildContext context) { + Utils.hideKeyboard(context); + if (_formKey.currentState.validate()) + model.searchProducts(productName: textController.text); + } +} diff --git a/lib/pages/sub_categorise_page.dart b/lib/pages/sub_categorise_page.dart index 039d40e2..45c9fd6c 100644 --- a/lib/pages/sub_categorise_page.dart +++ b/lib/pages/sub_categorise_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; @@ -10,12 +11,24 @@ import 'package:provider/provider.dart'; import 'base/base_view.dart'; import 'final_products_page.dart'; -class SubCategorisePage extends StatelessWidget { - String parentId; +class SubCategorisePage extends StatefulWidget { String id; String title; - SubCategorisePage({this.id, this.title, this.parentId}); + String parentId; + SubCategorisePage({this.id, this.parentId, this.title}); + @override + _SubCategorisePageState createState() => + _SubCategorisePageState(id: id, title: title, parentId: parentId); +} + +class _SubCategorisePageState extends State { + bool checkedBrands = false; + bool checkedCategorise = false; + String id; + String title; + String parentId; + _SubCategorisePageState({this.title, this.parentId, this.id}); String categoriseName = "Personal Care"; bool styleOne = true; bool styleTwo = false; @@ -26,7 +39,6 @@ class SubCategorisePage extends StatelessWidget { ); @override Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); return BaseView( onModelReady: (model) => model.getSubCategorise(i: id), builder: (BuildContext context, PharmacyCategoriseViewModel model, @@ -40,7 +52,7 @@ class SubCategorisePage extends StatelessWidget { baseViewModel: model, body: SingleChildScrollView( child: Container( - height: MediaQuery.of(context).size.height * 2.97, + height: MediaQuery.of(context).size.height * 5.97, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -72,16 +84,82 @@ class SubCategorisePage extends StatelessWidget { height: 160.0, width: double.infinity), ), - if (model.subCategorise.length >= 8) + if (model.subCategorise.length > 8) Column( children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: Container( - child: Texts(model.categoriseParent.length >= 8 - ? 'View All Categories' - : ''), + InkWell( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Texts('View All Categories'), + ), + ), + Icon(Icons.arrow_forward) + ], ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Container( + height: + MediaQuery.of(context).size.height * + 0.89, + color: Colors.white, + child: Center( + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: + model.subCategorise.length, + itemBuilder: (BuildContext context, + int index) { + return Container( + child: Padding( + padding: EdgeInsets.all(8.0), + child: InkWell( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Texts(model + .subCategorise[ + index] + .name), + Divider( + thickness: 0.6, + color: Colors.black12, + ) + ], + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + FinalProductsPage( + id: model + .subCategorise[ + index] + .id, + ), + ), + ); + }, + ), + ), + ); + }), + ), + ); + }, + ); + }, ), Divider( thickness: 1.0, @@ -174,14 +252,297 @@ class SubCategorisePage extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - Icon(Icons.wrap_text), - SizedBox( - width: 10.0, - ), - Texts('Refine'), - ], + InkWell( + child: Row( + children: [ + Icon(Icons.wrap_text), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: FontWeight.w600, + ), + ], + ), + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return DraggableScrollableSheet( + initialChildSize: 0.95, + maxChildSize: 0.95, + minChildSize: 0.9, + builder: (BuildContext context, + ScrollController scrollController) { + return SingleChildScrollView( + controller: scrollController, + child: Container( + height: MediaQuery.of(context) + .size + .height * + 1.95, + child: Column( + children: [ + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + children: [ + Icon( + Icons.wrap_text, + ), + SizedBox( + width: 10.0, + ), + Texts( + 'Refine', + fontWeight: + FontWeight.w600, + ), + SizedBox( + width: 250.0, + ), + InkWell( + child: Texts( + 'Close', + color: Colors.red, + fontWeight: + FontWeight.w600, + fontSize: 15.0, + ), + onTap: () { + Navigator.pop( + context); + }, + ), + ], + ), + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + Column( + children: [ + ExpansionTile( + title: + Texts('Categorise'), + children: [ + Container( + height: 350, + child: ListView + .builder( + controller: + scrollController, + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .categoriseParent + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .categoriseParent[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedCategorise, + onChanged: + (bool + value) { + setState( + () { + checkedCategorise = + value; + }); + }, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Brands'), + children: [ + Container( + height: 350, + child: ListView + .builder( + scrollDirection: + Axis + .vertical, + shrinkWrap: + true, + itemCount: model + .brandsList + .length, + itemBuilder: + (BuildContext + context, + int index) { + return CheckboxListTile( + tristate: + true, + title: Texts(model + .brandsList[index] + .name), + controlAffinity: + ListTileControlAffinity.leading, + value: + checkedBrands, + onChanged: + (bool + value) { + setState( + () { + checkedBrands = + value; + }); + }, + autofocus: + true, + ); + }), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + ExpansionTile( + title: Texts('Price'), + children: [ + Container( + color: Color( + 0xffEEEEEE), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceAround, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Min'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Texts( + 'Max'), + Container( + color: Colors + .white, + width: + 200, + height: + 40, + child: + TextFormField( + decoration: + InputDecoration( + border: + OutlineInputBorder(), + ), + ), + ), + ], + ), + ], + ), + ) + ], + ), + Divider( + thickness: 1.0, + color: Colors.black12, + ), + SizedBox( + height: MediaQuery.of( + context) + .size + .height * + 0.4, + ), + Padding( + padding: + EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceEvenly, + children: [ + Container( + width: 100, + child: Button( + label: 'Reset', + backgroundColor: + Colors.red, + ), + ), + SizedBox( + width: 30, + ), + Container( + width: 200, + child: Button( + label: 'Apply', + backgroundColor: + Colors + .green, + ), + ), + ], + ), + ), + ], + ), + ], + ), + ), + ); + }); + }, + ); + }, ), Row( children: [ @@ -199,23 +560,25 @@ class SubCategorisePage extends StatelessWidget { child: InkWell( child: styleIcon, onTap: () { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } + setState(() { + if (styleOne == true) { + styleOne = false; + styleTwo = true; + styleIcon = Icon( + Icons.auto_awesome_mosaic, + color: Colors.blue, + size: 29.0, + ); + } else { + styleOne = true; + styleTwo = false; + styleIcon = Icon( + Icons.widgets_sharp, + color: Colors.blue, + size: 29.0, + ); + } + }); }, ), ), @@ -230,7 +593,7 @@ class SubCategorisePage extends StatelessWidget { ), styleOne == true ? Container( - height: MediaQuery.of(context).size.height * 1.85, + height: MediaQuery.of(context).size.height * 3.85, child: GridView.builder( physics: NeverScrollableScrollPhysics(), gridDelegate: @@ -292,35 +655,6 @@ class SubCategorisePage extends StatelessWidget { children: [ Stack( children: [ - if (model.subProducts[index] - .discountName != - null) - RotatedBox( - quarterTurns: 4, - child: Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - right: 5.0, - top: 20.0, - bottom: 5.0, - ), - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight.w900, - ), - ), - transform: new Matrix4 - .rotationZ( - 5.837200), - ), - ), Container( margin: EdgeInsets.fromLTRB( 0, 16, 0, 0), @@ -384,29 +718,6 @@ class SubCategorisePage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (model.subProducts[index] - .discountName != - null) - Container( - width: double.infinity, - height: 13.0, - decoration: - BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Center( - child: Texts( - model - .subProducts[ - index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 10.4, - ), - ), - ), Texts( model.subProducts[index] .name, @@ -462,222 +773,167 @@ class SubCategorisePage extends StatelessWidget { }, ), ) - : Expanded( - child: Container( - child: ListView.builder( - itemCount: model.subProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - // color: - // model.products[index].discountName != - // null - // ? Color(0xffFFFF00) - // : Colors.white, - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - if (model.subProducts[index] - .discountName != - null) - Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - child: Container( - color: - Colors.yellow, - height: 25.0, - width: 70.0, - child: Center( - child: Texts( - 'offer' - .toUpperCase(), - color: - Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight - .w900, - ), - ), - ), - ), - transform: new Matrix4 - .rotationZ(6.15099), - ), - Container( - margin: - EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: - Alignment.center, - child: Image.network( - model - .subProducts[index] - .images[index] - .thumb, - fit: BoxFit.cover, - height: 80, + : Container( + height: MediaQuery.of(context).size.height * 5.0, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + itemCount: model.subProducts.length, + itemBuilder: + (BuildContext context, int index) { + return Card( + child: Row( + children: [ + Stack( + children: [ + Column( + children: [ + Container( + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsets.only( + left: 9.0, + top: 8.0, + right: 10.0, ), ), - ], - ), - Column( - children: [ - Container( - width: model - .subProducts[ - index] - .rxMessage != - null - ? MediaQuery.of( - context) - .size - .width / - 5 - : 0, - padding: - EdgeInsets.all(4), - decoration: BoxDecoration( - color: - Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular( - 6)), - ), - child: Texts( - model.subProducts[index] - .rxMessage != - null - ? model - .subProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), + ), + Container( + margin: EdgeInsets.fromLTRB( + 0, 0, 0, 0), + alignment: Alignment.center, + child: Image.network( + model.subProducts[index] + .images.isNotEmpty + ? model + .subProducts[ + index] + .images[0] + .thumb + : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', + fit: BoxFit.contain, + height: 80, ), - ], - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, + ), + ], ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, + Column( children: [ - if (model.subProducts[index] - .discountName != - null) - Container( - width: 250.0, - height: 18.5, - decoration: BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Padding( - padding: EdgeInsets - .symmetric( - horizontal: 5.5, - ), - child: Texts( - model + Container( + width: model + .subProducts[ + index] + .rxMessage != + null + ? MediaQuery.of(context) + .size + .width / + 5 + : 0, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: Color(0xffb23838), + borderRadius: + BorderRadius.only( + topLeft: Radius + .circular(6)), + ), + child: Texts( + model.subProducts[index] + .rxMessage != + null + ? model .subProducts[ index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 11.4, - ), - ), + .rxMessage + : "", + color: Colors.white, + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, ), - SizedBox( - height: 4.0, ), - Texts( - projectProvider.isArabic - ? model - .subProducts[index] - .name - : model - .subProducts[index] - .namen, + ], + ), + ], + ), + Container( + height: 100.0, + margin: EdgeInsets.symmetric( + horizontal: 6, + vertical: 0, + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 4.0, + ), + Container( + height: 35.0, + width: 250.0, + child: Texts( + model.subProducts[index] + .name, regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - SizedBox( - height: 8.0, + fontSize: 13.2, + fontWeight: FontWeight.w500, + maxLines: 2, ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.subProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .subProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .subProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .subProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.subProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], + ), + SizedBox( + height: 8.0, + ), + Padding( + padding: + const EdgeInsets.only( + top: 4, bottom: 4), + child: Texts( + "SAR ${model.subProducts[index].price}", + bold: true, + fontSize: 14, ), - ], - ), + ), + Row( + children: [ + StarRating( + totalAverage: model + .subProducts[ + index] + .approvedRatingSum > + 0 + ? (model + .subProducts[ + index] + .approvedRatingSum + .toDouble() / + model + .parentProducts[ + index] + .approvedRatingSum + .toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( + "(${model.subProducts[index].approvedTotalReviews})", + regular: true, + fontSize: 10, + fontWeight: + FontWeight.w400, + ) + ], + ), + ], ), - ], - ), - ); - }), - ), + ), + ], + ), + ); + }), ) ], ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index c5246e35..e71ff473 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -695,17 +695,25 @@ class TranslationBase { localizedValues['LoginRegister'][locale.languageCode]; String get orderLog => localizedValues['OrderLog'][locale.languageCode]; String get infoLab => localizedValues['info-lab'][locale.languageCode]; - String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; + String get infoRadiology => + localizedValues['info-radiology'][locale.languageCode]; // pharmacy module - String get medicationRefill => localizedValues['medicationRefill'][locale.languageCode]; - String get offersAndPromotions => localizedValues['offersAndPromotions'][locale.languageCode]; - String get myPrescriptions => localizedValues['myPrescriptions'][locale.languageCode]; - String get searchAndScanMedication => localizedValues['searchAndScanMedication'][locale.languageCode]; - String get shopByBrands => localizedValues['shopByBrands'][locale.languageCode]; - String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; + String get medicationRefill => + localizedValues['medicationRefill'][locale.languageCode]; + String get offersAndPromotions => + localizedValues['offersAndPromotions'][locale.languageCode]; + String get myPrescriptions => + localizedValues['myPrescriptions'][locale.languageCode]; + String get searchAndScanMedication => + localizedValues['searchAndScanMedication'][locale.languageCode]; + String get shopByBrands => + localizedValues['shopByBrands'][locale.languageCode]; + String get recentlyViewed => + localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; - String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; + String get deleteAllItems => + localizedValues['deleteAllItems'][locale.languageCode]; String get termsService => localizedValues['TermsService'][locale.languageCode]; @@ -731,6 +739,11 @@ class TranslationBase { String get selectAge => localizedValues['select-age'][locale.languageCode]; String get iAm => localizedValues['i-am'][locale.languageCode]; String get yearOld => localizedValues['years-old'][locale.languageCode]; + String get categorise => localizedValues['categorise'][locale.languageCode]; + String get cart => localizedValues['cart'][locale.languageCode]; + String get wishList => localizedValues['wishList'][locale.languageCode]; + String get searchProductHere => + localizedValues['searchProductHere'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/input/text_field.dart b/lib/widgets/input/text_field.dart index 7cfba5e6..7b732fec 100644 --- a/lib/widgets/input/text_field.dart +++ b/lib/widgets/input/text_field.dart @@ -73,7 +73,7 @@ class TextFields extends StatefulWidget { this.fontSize = 16.0, this.fontWeight = FontWeight.w700, this.autoValidate = false, - this.fillColor, + this.fillColor, this.hintColor}) : super(key: key); @@ -214,7 +214,6 @@ class _TextFieldsState extends State { blurRadius: focus ? 34.0 : 12.0) ]), child: TextFormField( - keyboardAppearance: Theme.of(context).brightness, scrollPhysics: BouncingScrollPhysics(), autovalidate: widget.autoValidate, @@ -253,15 +252,12 @@ class _TextFieldsState extends State { ] : widget.inputFormatters, decoration: InputDecoration( - counterText: "", hintText: widget.hintText, hintStyle: TextStyle( - fontSize: widget.fontSize, - fontWeight: widget.fontWeight, - color: widget.hintColor ?? Theme.of(context).hintColor, - - + fontSize: widget.fontSize, + fontWeight: widget.fontWeight, + color: widget.hintColor ?? Theme.of(context).hintColor, ), contentPadding: widget.padding != null ? widget.padding diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart index 7012b392..d9717c38 100644 --- a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart +++ b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart @@ -61,7 +61,7 @@ class _BottomNavPharmacyBarState extends State { changeIndex: _changeIndex, index: widget.index, currentIndex: 1, - title: 'Categorise', + title: TranslationBase.of(context).categorise, ), // Expanded( // child: SizedBox( @@ -83,7 +83,7 @@ class _BottomNavPharmacyBarState extends State { changeIndex: _changeIndex, index: widget.index, currentIndex: 2, - title: 'Wishlist'), + title: TranslationBase.of(context).wishList), BottomNavPharmacyItem( icon: EvaIcons.person, @@ -91,7 +91,7 @@ class _BottomNavPharmacyBarState extends State { changeIndex: _changeIndex, index: widget.index, currentIndex: 3, - title: 'My Account', + title: TranslationBase.of(context).myAccount, ), BottomNavPharmacyItem( icon: EvaIcons.shoppingCart, @@ -99,7 +99,7 @@ class _BottomNavPharmacyBarState extends State { changeIndex: _changeIndex, index: widget.index, currentIndex: 4, - title: 'Cart') + title: TranslationBase.of(context).cart) ], ), ), diff --git a/pubspec.yaml b/pubspec.yaml index f43d4d93..9747e6a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -82,7 +82,8 @@ dependencies: google_maps_flutter: ^1.0.3 # Qr code Scanner TODO fix it - #barcode_scan: ^3.0.1 + barcode_scanner: ^1.0.1 + barcode_scan: any # Rating Stars rating_bar: ^0.2.0 From d69b3676a49da0cb89085cebc287ac4776d3516a Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 4 Dec 2020 08:50:23 +0300 Subject: [PATCH 50/69] weather indicator in progress --- .../all_habib_medical_service_page.dart | 62 +++++++++---------- pubspec.yaml | 4 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index 88d21bf8..6c03f6ba 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -47,13 +47,13 @@ class _AllHabibMedicalServiceState extends State { AppSharedPreferences sharedPref = AppSharedPreferences(); AuthenticatedUser authUser = new AuthenticatedUser(); LocationUtils locationUtils; - var weather ='--'; + var weather = '--'; @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { getAuthUser(); locationUtils = - new LocationUtils(isShowConfirmDialog: true, context: context); + new LocationUtils(isShowConfirmDialog: true, context: context); locationUtils.getCurrentLocation(); }); super.initState(); @@ -83,15 +83,13 @@ class _AllHabibMedicalServiceState extends State { fit: BoxFit.cover, ), borderRadius: BorderRadius.circular(8.0)), - child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0), child: Row( children: [ Expanded( - flex:3, - child: - Column( + flex: 3, + child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -102,7 +100,8 @@ class _AllHabibMedicalServiceState extends State { fontWeight: FontWeight.w600, ), Texts( - TranslationBase.of(context).healthTipsBasedOnCurrentWeather, + TranslationBase.of(context) + .healthTipsBasedOnCurrentWeather, color: Colors.white, fontSize: 14, ), @@ -110,8 +109,8 @@ class _AllHabibMedicalServiceState extends State { )), Expanded( flex: 2, - child:InkWell( - onTap: (){ + child: InkWell( + onTap: () { Navigator.push( context, FadePage( @@ -125,10 +124,15 @@ class _AllHabibMedicalServiceState extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Image.asset('assets/images/Weather_ico.png',width: 60,height: 60,), - AppText(weather, fontSize: 22, color:Colors.white) - ],), - + Image.asset( + 'assets/images/Weather_ico.png', + width: 60, + height: 60, + ), + AppText(weather, + fontSize: 22, color: Colors.white) + ], + ), Texts( TranslationBase.of(context).moreDetails, color: Colors.white, @@ -147,10 +151,9 @@ class _AllHabibMedicalServiceState extends State { widget.goToMyProfile(); }, imageLocation: - 'assets/images/new-design/my_file_bottom_bar.png', + 'assets/images/new-design/my_file_bottom_bar.png', title: TranslationBase.of(context).myMedicalFile, ), - ServicesContainer( onTap: () => Navigator.push( context, @@ -161,7 +164,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/booking_icon_active.png', + 'assets/images/new-design/booking_icon_active.png', title: TranslationBase.of(context).bookAppo, ), ServicesContainer( @@ -172,10 +175,9 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/al-habib_online_payment_service_icon.png', + 'assets/images/al-habib_online_payment_service_icon.png', title: TranslationBase.of(context).onlinePaymentService, ), - ServicesContainer( onTap: () { Navigator.push( @@ -190,7 +192,6 @@ class _AllHabibMedicalServiceState extends State { imageLocation: 'assets/images/emergency_service_image.png', title: TranslationBase.of(context).emergencyService, ), - ServicesContainer( onTap: () => Navigator.push( context, @@ -199,10 +200,9 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/family_menu_icon_red.png', + 'assets/images/new-design/family_menu_icon_red.png', title: 'My Family', ), - ServicesContainer( onTap: () => Navigator.push( context, @@ -211,10 +211,9 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/upcoming_icon_bottom_bar.png', + 'assets/images/new-design/upcoming_icon_bottom_bar.png', title: TranslationBase.of(context).todoList, ), - ServicesContainer( onTap: () => Navigator.push( context, @@ -223,27 +222,27 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: - 'assets/images/new-design/parking_system_icon.png', + 'assets/images/new-design/parking_system_icon.png', title: TranslationBase.of(context).parking, ), ServicesContainer( onTap: () => launch( "https://hmgwebservices.com/vt_mobile/html/index.html"), imageLocation: - 'assets/images/new-design/virtual_tour_icon.png', + 'assets/images/new-design/virtual_tour_icon.png', title: 'Virtual Tour', ), ServicesContainer( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (BuildContext context) => MyWebView( - title: "HMG News", - selectedUrl: - "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", - ))); + title: "HMG News", + selectedUrl: + "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", + ))); }, imageLocation: - 'assets/images/new-design/twitter_dashboard_icon.png', + 'assets/images/new-design/twitter_dashboard_icon.png', title: 'Latest News', ), ServicesContainer( @@ -265,7 +264,6 @@ class _AllHabibMedicalServiceState extends State { } getAuthUser() async { - if (await this.sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson( await this.sharedPref.getObject(USER_PROFILE)); @@ -274,7 +272,7 @@ class _AllHabibMedicalServiceState extends State { }); } var data = await this.sharedPref.getObject(WEATHER); - weather = data !=null ? data['Temperature'].toString() + '\u2103' : '--'; + weather = data != null ? data['Temperature'].toString() + '\u2103' : '--'; print(data); } } diff --git a/pubspec.yaml b/pubspec.yaml index 4f21803d..a3844b2b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -151,7 +151,9 @@ dependencies: wakelock: ^0.1.4 after_layout: ^1.0.7 twilio_programmable_video: ^0.6.3+1 - flutter_tts: ^1.2.6 + flutter_tts: + git: + url: https://github.com/dlutton/flutter_tts.git vibration: ^1.7.2 speech_to_text: path: speech_to_text From f5b7d35f23b4e0ecdbcf6713116da0a6bc3c7127 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 4 Dec 2020 16:28:14 +0300 Subject: [PATCH 51/69] bug fixes --- lib/config/config.dart | 11 +- lib/config/localized_values.dart | 407 +++++------------- lib/core/service/client/base_app_client.dart | 17 +- .../health-weather-indicator.dart | 153 ++++--- lib/pages/login/confirm-login.dart | 1 - .../authentication/auth_provider.dart | 31 +- lib/widgets/otp/sms-popup.dart | 199 ++++----- pubspec.yaml | 4 +- 8 files changed, 332 insertions(+), 491 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index b8a0efbf..4e2791b1 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,8 +6,7 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; - - // const BASE_URL = 'https://uat.hmgwebservices.com/'; +// const BASE_URL = 'https://uat.hmgwebservices.com/'; const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; @@ -18,8 +17,10 @@ const WEATHER_INDICATOR = 'Services/Weather.svc/REST/GetCityInfo'; const GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; const GET_DOCTOR_PROFILE = 'Services/Doctors.svc/REST/GetDocProfiles'; -const GET_DOCTOR_RATING_NOTES = 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating'; -const GET_DOCTOR_RATING_DETAILS = 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails'; +const GET_DOCTOR_RATING_NOTES = + 'Services/Doctors.svc/REST/dr_GetNotesDoctorRating'; +const GET_DOCTOR_RATING_DETAILS = + 'Services/Doctors.svc/REST/dr_GetDoctorRatingDetails'; const GET_DOCTOR_RATING = 'Services/Doctors.svc/REST/dr_GetAvgDoctorRating'; ///Prescriptions @@ -253,7 +254,7 @@ const PATIENT_TYPE = 1; const PATIENT_TYPE_ID = 1; var DEVICE_TOKEN = ""; var DeviceTypeID = Platform.isIOS ? 1 : 2; -const LANGUAGE_ID = 2; +const LANGUAGE_ID = 1; const GET_PHARMCY_ITEMS = "Services/Lists.svc/REST/GetPharmcyItems_Region"; const GET_PHARMACY_LIST = "Services/Patients.svc/REST/GetPharmcyList"; const GET_PAtIENTS_INSURANCE = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index cc0e0566..e6be280b 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -111,10 +111,7 @@ const Map localizedValues = { 'login': {'en': 'Login', 'ar': 'تسجيل الدخول'}, 'loginregister': {'en': 'Login / Register', 'ar': 'تسجيل الدخول'}, 'poweredBy': {'en': 'Powered By', 'ar': 'مشغل بواسطة'}, - "welcome": { - "en": "Welcome", - "ar": "مرحبا" - }, + "welcome": {"en": "Welcome", "ar": "مرحبا"}, "welcome_text": { "en": "Dr. Sulaiman Al Habib Mobile Application", "ar": "الدكتور سليمان الحبيب لتطبيقات الهاتف المتحرك" @@ -130,12 +127,11 @@ const Map localizedValues = { "ar": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي." }, "registernow": {"en": "Register Now", "ar": "تسجيل الان"}, - "nationalID": { "en": "Enter the Identification Number", - "ar": "أدخل رقم الهوية الوطنية او الاقامة"}, - "national-id": { - "en": "National ID", - "ar": "رقم الهوية" + "nationalID": { + "en": "Enter the Identification Number", + "ar": "أدخل رقم الهوية الوطنية او الاقامة" }, + "national-id": {"en": "National ID", "ar": "رقم الهوية"}, "fileNo": {"en": "File Number", "ar": "رقم الملف"}, "fileno": {"en": "File No", "ar": "رقم الملف"}, "forgotFileNo": {"en": "Forgot file Number?", "ar": "نسيت رقم الملف الطبي؟"}, @@ -191,8 +187,8 @@ const Map localizedValues = { 'ar': 'الرجائ ادخال اسم الدواء' }, "verification_message": { - "en": "Please enter verification code", - "ar": "الرجاء إدخال رمز التحقق" + "en": "Please enter the Verification Code sent to", + "ar": "الرجاء ادخال رمز التحقق الذي تم إرساله إلى" }, "validation_message": { "en": "The verification code expires in", @@ -876,8 +872,14 @@ const Map localizedValues = { "LiveChat": {"en": "Live Chat", "ar": "محادثة مباشرة"}, "Service": {"en": "Service", "ar": "خدمة"}, "HMGServiceLabel": {"en": "HMG Service", 'ar': 'خدمات الحبيب'}, - "HealthWeatherIndicators": {"en": "Health Weather Indicators", 'ar': ' مؤشرات الطقس الصحية '}, - "HealthTipsBasedOnCurrentWeather": {"en": "Health Tips Based On Current Weather", 'ar': ' نصائح صحية على أساس الطقس الحالي '}, + "HealthWeatherIndicators": { + "en": "Health Weather Indicators", + 'ar': ' مؤشرات الطقس الصحية ' + }, + "HealthTipsBasedOnCurrentWeather": { + "en": "Health Tips Based On Current Weather", + 'ar': ' نصائح صحية على أساس الطقس الحالي ' + }, "MoreDetails": {"en": "More details", "ar": " المزيد من التفاصيل "}, "SendCopy": {"en": "Send Copy", "ar": "ارسال نسخة"}, "ResendOrder": {"en": "Resend order & deliver", "ar": "إعادة طلب و توصيل"}, @@ -886,338 +888,161 @@ const Map localizedValues = { "Average": {"en": "Average", "ar": "المعدل"}, "DailyDoses": {"en": "Daily Doses", "ar": "جرعات يومية"}, "Period": {"en": "Period", "ar": "الفترة"}, - "cm": { - "en": "CM", - "ar": "سم" - }, - "kg": { - "en": "kg", - "ar": "كجم" - }, - "mass": { - "en": "Mass", - "ar": "كتلة" - }, - "temp-c": { - "en": "°C", - "ar": "°س" - }, - "bpm": { - "en": "bpm", - "ar": "نبضة" - }, - "respiration-signs": { - "en": "Respiration", - "ar": "تنفس" - }, - "sys-dias": { - "en": "SBP/DBP", - "ar": "إنقباض/إنبساط" - }, - "body": { - "en": "Body \n Mass", - "ar": "كتلة\nالجسم" - }, - "feedback": { - "en": "Feedback", - "ar": "رأيك يهمنا" - }, - "send": { - "en": "Send", - "ar": "أرسل" - }, - "status": { - "en": "Status", - "ar": "الحالة" - }, + "cm": {"en": "CM", "ar": "سم"}, + "kg": {"en": "kg", "ar": "كجم"}, + "mass": {"en": "Mass", "ar": "كتلة"}, + "temp-c": {"en": "°C", "ar": "°س"}, + "bpm": {"en": "bpm", "ar": "نبضة"}, + "respiration-signs": {"en": "Respiration", "ar": "تنفس"}, + "sys-dias": {"en": "SBP/DBP", "ar": "إنقباض/إنبساط"}, + "body": {"en": "Body \n Mass", "ar": "كتلة\nالجسم"}, + "feedback": {"en": "Feedback", "ar": "رأيك يهمنا"}, + "send": {"en": "Send", "ar": "أرسل"}, + "status": {"en": "Status", "ar": "الحالة"}, "like-to-hear": { - "en": "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", - "ar": "يسعدنا سماع ملاحظاتك حول خدمات الرعاية الصحية والخدمات الإلكترونية. يرجى تعبئة الحقول المطلوبة" - }, - "subject": { - "en": "Subject", - "ar": "الموضوع" - }, - "message": { - "en": "Message", - "ar": "رسالة" + "en": + "We would love to hear the feedback, concerns on healthcare services and eServices experience. Please use the below form", + "ar": + "يسعدنا سماع ملاحظاتك حول خدمات الرعاية الصحية والخدمات الإلكترونية. يرجى تعبئة الحقول المطلوبة" }, + "subject": {"en": "Subject", "ar": "الموضوع"}, + "message": {"en": "Message", "ar": "رسالة"}, "empty-subject": { "en": "Please enter the subject", "ar": "يرجى ادخال الموضوع" }, - "empty-message": { - "en": "Please enter message", - "ar": "يرجى ادخال الموضوع" - }, - "select-attachment": { - "en": "Select Attachment", - "ar": "إختر المرفق" - }, - "complain-appo": { - "en": "Complaint for appointment", - "ar": "شكوى على موعد" - }, + "empty-message": {"en": "Please enter message", "ar": "يرجى ادخال الموضوع"}, + "select-attachment": {"en": "Select Attachment", "ar": "إختر المرفق"}, + "complain-appo": {"en": "Complaint for appointment", "ar": "شكوى على موعد"}, "complain-without-appo": { "en": "Complaint without appointment", "ar": "شكوى بدون موعد" }, - "question": { - "en": "Question", - "ar": "سؤال" - }, - "message-type": { - "en": "Message Type", - "ar": "نوع الرسالة" - }, - "compliment": { - "en": "compliment", - "ar": "ثناء" - }, - "suggestion": { - "en": "Suggestion", - "ar": "إقتراح" - }, - "your-feedback": { - "en": "Your feedback was sent", - "ar": "إقتراح" - }, + "question": {"en": "Question", "ar": "سؤال"}, + "message-type": {"en": "Message Type", "ar": "نوع الرسالة"}, + "compliment": {"en": "compliment", "ar": "ثناء"}, + "suggestion": {"en": "Suggestion", "ar": "إقتراح"}, + "your-feedback": {"en": "Your feedback was sent", "ar": "إقتراح"}, "select-part": { "en": "Please select the part that complain about", "ar": "يرجى تحديد الجزء الذي تشكو منه" }, - "number": { - "en": "Number", - "ar": "الرقم" - }, - "not-classified": { - "en": "Not classified", - "ar": "غير محدد" - }, + "number": {"en": "Number", "ar": "الرقم"}, + "not-classified": {"en": "Not classified", "ar": "غير محدد"}, "selectClinic": {"en": "Select Clinic", "ar": " بحث بالعيادة"}, "reviews": {"en": "Reviews", "ar": "تقييمات"}, - "searchItemError": {"en": "Item name should be more than 3 character ", "ar": "يجب أن يكون اسم العنصر أكثر من 3 أحرف"}, + "searchItemError": { + "en": "Item name should be more than 3 character ", + "ar": "يجب أن يكون اسم العنصر أكثر من 3 أحرف" + }, "YouCanFind": {"en": "You Can Find ", "ar": "باستطاعتك العثور على "}, "ItemInSearch": {"en": " Item In Search", "ar": " عنصر في البحث "}, "InvoiceNo": {"en": " Invoice No", "ar": "رقم الفاتورة"}, "SpecialResult": {"en": " Special Result", "ar": "نتيجة خاصة"}, "GeneralResult": {"en": "General Result", "ar": "نتيجة عامة"}, - "show-more-btn": { - "en": "Flow Chart", - "ar": "النتائج التراكمية" - }, + "show-more-btn": {"en": "Flow Chart", "ar": "النتائج التراكمية"}, - "value": { - "en": "Value", - "ar": "القيمة" - }, - "range": { - "en": "Range", - "ar": "المدى" - }, - "out-patient": { - "en": "Out Patient", - "ar": "عيادات خارجية" - }, - "in-patient": { - "en": "In Patient", - "ar": "تنويم" - }, - "report": { - "en": "Radiology Report", - "ar": "تقرير الاشعة" - }, - "open-rad": { - "en": "Open Image", - "ar": "فتح صور الاشعة" - }, - "send-copy": { - "en": "Email the Report", - "ar": "أرسل التقرير" - }, - "appoSurvey": { - "en": "Survey", - "ar": "إستبيان" - }, - "appoSurveySubtitle": { - "en": "Survey", - "ar": "إستبيان" - }, - "labResults": { - "en": "Lab Result", - "ar": "نتيجة المختبر" - }, - "doctorRating": { - "en": "Doctor Rating", - "ar": "تقييم الطبيب" - }, - "good": { - "en": "Good", - "ar": "جيد" - }, - "v-good": { - "en": "Very Good", - "ar": "جيد جدا" - }, - "excellent": { - "en": "Excellent", - "ar": "ممتاز" - }, - "average": { - "en": "Average", - "ar": "متوسط" - }, - "below-average": { - "en": "Below Average", - "ar": "أقل من المتوسط" - }, + "value": {"en": "Value", "ar": "القيمة"}, + "range": {"en": "Range", "ar": "المدى"}, + "out-patient": {"en": "Out Patient", "ar": "عيادات خارجية"}, + "in-patient": {"en": "In Patient", "ar": "تنويم"}, + "report": {"en": "Radiology Report", "ar": "تقرير الاشعة"}, + "open-rad": {"en": "Open Image", "ar": "فتح صور الاشعة"}, + "send-copy": {"en": "Email the Report", "ar": "أرسل التقرير"}, + "appoSurvey": {"en": "Survey", "ar": "إستبيان"}, + "appoSurveySubtitle": {"en": "Survey", "ar": "إستبيان"}, + "labResults": {"en": "Lab Result", "ar": "نتيجة المختبر"}, + "doctorRating": {"en": "Doctor Rating", "ar": "تقييم الطبيب"}, + "good": {"en": "Good", "ar": "جيد"}, + "v-good": {"en": "Very Good", "ar": "جيد جدا"}, + "excellent": {"en": "Excellent", "ar": "ممتاز"}, + "average": {"en": "Average", "ar": "متوسط"}, + "below-average": {"en": "Below Average", "ar": "أقل من المتوسط"}, "info-signs": { - "en": "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", - "ar": "خدمة المؤشرات الحيوية: هذه الخدمة تمكنك من الاطلاع على جميع المؤشرات الحيوية على سبيل المثال (الطول، الوزن، مؤشر كتلة الجسم، معدل نبضات القلب الخ..) التي تمت في مجموعة الحبيب الطبية وكذلك رسوم بيانية على مستوى المؤشر." + "en": + "This service allows you to view all vital signs were performed in the Habib Medical Group, e.x (height, weight, body mass index, heart rate, etc.) as well shows some statistics charts.", + "ar": + "خدمة المؤشرات الحيوية: هذه الخدمة تمكنك من الاطلاع على جميع المؤشرات الحيوية على سبيل المثال (الطول، الوزن، مؤشر كتلة الجسم، معدل نبضات القلب الخ..) التي تمت في مجموعة الحبيب الطبية وكذلك رسوم بيانية على مستوى المؤشر." }, "info-advance-payment": { - "en": "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", - "ar": "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية." + "en": + "This service designed so that you can deposit an amount in advance either in your account or in someone else's account with Al Habib Medical Group.", + "ar": + "تم تصميم هذه الخدمة حتى تتمكن من دفع مبلغ مقدما او تحت الحساب سواء في حسابك او في حساب شخص اخر لدى مجموعة الحبيب الطبية." }, "info-my-balance": { "en": "This service allows you to check your balance in all branchs", "ar": "هذه الخدمه تتيح لك الاطلاع رصيدك في كل الفروع" }, "er-contant": { - "en": "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", - "ar": "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي." - }, - "er": { - "en": "ER", - "ar": "الطوارىء" - }, - "transportation-Service": { - "en": "Ambulance Request", - "ar": "طلب نقل اسعاف" + "en": + "This service displays nearest branch among all the branches of Al Habib Medical Group based on your current location.", + "ar": + "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي." }, + "er": {"en": "ER", "ar": "الطوارىء"}, + "transportation-Service": {"en": "Ambulance Request", "ar": "طلب نقل اسعاف"}, "info-ambulance": { - "en": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", - "ar": "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى" + "en": + "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", + "ar": + "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى" }, "RRT-transport-heading": { "en": "Select Transportation Method", "ar": "حدد طريقة النقل" }, - "sar": { - "en": "SR", - "ar": "ر.س" - }, - "RRT-direction-heading": { - "en": "Select Direction", - "ar": "حدد الاتجاه" - }, - "to-hospital": { - "en": "To Hospital", - "ar": "الى المستشفى" - }, - "from-hospital": { - "en": "From Hospital", - "ar": "من المستشفى" - }, - "one-direc": { - "en": "One Way", - "ar": "ذهاب" - }, - "two-direc": { - "en": "Two Ways", - "ar": "ذهاب وعودة" - }, - "pickup-location": { - "en": "Pickup Location", - "ar": "نقطة الانطلاق" - }, - "pickup-spot": { - "en": "Pickup Spot", - "ar": "نقطة اللقاء" - }, - "inside-home": { - "en": "Inside Home", - "ar": "داخل المنزل" - }, - "have-appo": { - "en": "Do you have an appointment?", - "ar": "هل لديك موعد؟" - }, - "dropoff-location": { - "en": "Dropoff Location", - "ar": "نقطة الوصول" - }, + "sar": {"en": "SR", "ar": "ر.س"}, + "RRT-direction-heading": {"en": "Select Direction", "ar": "حدد الاتجاه"}, + "to-hospital": {"en": "To Hospital", "ar": "الى المستشفى"}, + "from-hospital": {"en": "From Hospital", "ar": "من المستشفى"}, + "one-direc": {"en": "One Way", "ar": "ذهاب"}, + "two-direc": {"en": "Two Ways", "ar": "ذهاب وعودة"}, + "pickup-location": {"en": "Pickup Location", "ar": "نقطة الانطلاق"}, + "pickup-spot": {"en": "Pickup Spot", "ar": "نقطة اللقاء"}, + "inside-home": {"en": "Inside Home", "ar": "داخل المنزل"}, + "have-appo": {"en": "Do you have an appointment?", "ar": "هل لديك موعد؟"}, + "dropoff-location": {"en": "Dropoff Location", "ar": "نقطة الوصول"}, "select-all": { "en": "Please select all fields", "ar": "يرجى تحديد جميع الحقول" }, - "select-map": { - "en": "Select From Map", - "ar": "حدد من الخريطة" - }, + "select-map": {"en": "Select From Map", "ar": "حدد من الخريطة"}, "no-appointment": { "en": "You don't have any appointments yet", "ar": "ليس لديك أي مواعيد حتى الآن" }, - "patient-share": { - "en": "Amount before tax: ", - "ar": "المبلغ قبل الضريبة:" - }, - "patient-share-tax": { - "en": "Tax amount: ", - "ar": "قيمة الضريبة:" - }, + "patient-share": {"en": "Amount before tax: ", "ar": "المبلغ قبل الضريبة:"}, + "patient-share-tax": {"en": "Tax amount: ", "ar": "قيمة الضريبة:"}, "patient-share-total": { "en": "Total amount payable: ", "ar": "المبلغ الإجمالي المستحق:" }, - "select-ambulate": { - "en": "Select Ambulate", - "ar": "بحاجة للتنقل بواسطة" - }, - "wheelchair": { - "en": "Wheelchair", - "ar": "كرسي متحرك" - }, - "walker": { - "en": "Walker", - "ar": "مشاية" - }, - "stretcher": { - "en": "Stretcher", - "ar": "نقالة" - }, - "none": { - "en": "None", - "ar": "لا شيء" - }, - "RRT-Summary": { - "en": "Summary", - "ar": "ملخص الطلب" - }, - "bill-amount": { - "en": "Bill Amount", - "ar": "مبلغ الفاتورة" - }, - "transport-method": { - "en": "Transportation Method", - "ar": "طريقة النقل" - }, - "directions": { - "en": "Directions", - "ar": "الاتجاهات" - }, + "select-ambulate": {"en": "Select Ambulate", "ar": "بحاجة للتنقل بواسطة"}, + "wheelchair": {"en": "Wheelchair", "ar": "كرسي متحرك"}, + "walker": {"en": "Walker", "ar": "مشاية"}, + "stretcher": {"en": "Stretcher", "ar": "نقالة"}, + "none": {"en": "None", "ar": "لا شيء"}, + "RRT-Summary": {"en": "Summary", "ar": "ملخص الطلب"}, + "bill-amount": {"en": "Bill Amount", "ar": "مبلغ الفاتورة"}, + "transport-method": {"en": "Transportation Method", "ar": "طريقة النقل"}, + "directions": {"en": "Directions", "ar": "الاتجاهات"}, "info-my-appointments": { - "en": "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", - "ar": "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:" + "en": + "This service allows you to see all the appointment you have visited in Al Habib Medical Group, and through this service:", + "ar": + "خدمة مواعيدي: هذه الخدمة تمكنك من الاطلاع على جميع المواعيد التي قمت بزيارتهم في مجموعة الحبيب الطبية, كما تستطيع من خلال هذه الخدمة:" }, "info-todo": { - "en": "This service is designed to enable you to have a quick link to the list of tasks that need to be done", - "ar": "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها" + "en": + "This service is designed to enable you to have a quick link to the list of tasks that need to be done", + "ar": + "هذه الخدمة تم تصميمها لتمكنك من الوصول الى رابط سريع لقائمة المهام التي يجب القيام بها" }, "family-info": { - "en": "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", - "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." + "en": + "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", + "ar": + "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." } - }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index e288ccb3..0e940a53 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -36,8 +36,7 @@ class BaseAppClient { try { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); String token = await sharedPref.getString(TOKEN); - var languageID = - await sharedPref.getString(APP_LANGUAGE); + var languageID = await sharedPref.getString(APP_LANGUAGE) ?? 'ar'; var user = await sharedPref.getObject(USER_PROFILE); if (body.containsKey('SetupID')) { body['SetupID'] = body.containsKey('SetupID') @@ -89,7 +88,7 @@ class BaseAppClient { body['PatientTypeID'] = body.containsKey('PatientTypeID') ? body['PatientTypeID'] != null ? body['PatientTypeID'] - :user['PatientType'] != null + : user['PatientType'] != null ? user['PatientType'] : PATIENT_TYPE_ID : PATIENT_TYPE_ID; @@ -140,7 +139,7 @@ class BaseAppClient { parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); } else if (!parsed['IsAuthenticated']) { - // await logout(); + // await logout(); //helpers.showErrorToast('Your session expired Please login agian'); } else { @@ -159,16 +158,18 @@ class BaseAppClient { } } catch (e) { print(e); - onFailure(e.toString(), -1); + onFailure('Failed to connect to the server', -1); + // onFailure(e.toString(), -1); } } logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); await authenticatedUserObject.getUser(); - Provider.of(AppGlobal.context, listen: false).isLogin = false; - _vitalSignService.weightKg =""; - _vitalSignService.heightCm=""; + Provider.of(AppGlobal.context, listen: false).isLogin = + false; + _vitalSignService.weightKg = ""; + _vitalSignService.heightCm = ""; Navigator.of(AppGlobal.context).pushReplacementNamed(HOME); } diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart index 95cbdde7..343c6e3e 100644 --- a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart +++ b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart @@ -11,116 +11,127 @@ import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart' import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; class HealthWeatherIndicator extends StatefulWidget { @override _HospitalsPageState createState() => _HospitalsPageState(); } - class _HospitalsPageState extends State { var data; LocationUtils locationUtils; AppSharedPreferences sharedPref = AppSharedPreferences(); var weather = '--'; - @override + @override void initState() { locationUtils = - new LocationUtils(isShowConfirmDialog: true, context: context); + new LocationUtils(isShowConfirmDialog: true, context: context); WidgetsBinding.instance .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); getWeather(); super.initState(); } + @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getWeatherData(), - allowAny:true, + allowAny: true, builder: (_, mode, widget) => AppScaffold( isShowDecPage: false, appBarTitle: TranslationBase.of(context).healthWeatherIndicators, isShowAppBar: true, - body: mode.weatherIndicatorData.length>0 ? SingleChildScrollView( - child: Column(children: [ - - Container( - margin: EdgeInsets.all(8), - width: double.infinity, - height: 150, - decoration: BoxDecoration( - image: DecorationImage( - image: ExactAssetImage('assets/images/Weather_img.png'), - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.circular(8.0)), - - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Row( - children: [ - Expanded( - flex:3, - child: - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText( - TranslationBase.of(context) - .healthWeatherIndicators, - color: Colors.white, - fontWeight: FontWeight.w600, - ), - AppText( - TranslationBase.of(context).healthTipsBasedOnCurrentWeather, - color: Colors.white, - fontSize: 14, - ), - ], - )), - Expanded( - flex: 2, - child:InkWell( - onTap: (){ - - }, + body: mode.weatherIndicatorData.length > 0 + ? SingleChildScrollView( + child: Column(children: [ + Container( + margin: EdgeInsets.all(8), + width: double.infinity, + height: 150, + decoration: BoxDecoration( + image: DecorationImage( + image: + ExactAssetImage('assets/images/Weather_img.png'), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(8.0)), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Row( + children: [ + Expanded( + flex: 3, child: Column( mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset('assets/images/Weather_ico.png',width: 60,height: 60,), - AppText(weather, fontSize: 22, color:Colors.white) - ],), + AppText( + TranslationBase.of(context) + .healthWeatherIndicators, + color: Colors.white, + fontWeight: FontWeight.w600, + ), + AppText( + TranslationBase.of(context) + .healthTipsBasedOnCurrentWeather, + color: Colors.white, + fontSize: 14, + ), ], )), - ) - ], + Expanded( + flex: 2, + child: InkWell( + onTap: () {}, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/Weather_ico.png', + width: 60, + height: 60, + ), + AppText(weather, + fontSize: 22, color: Colors.white) + ], + ), + ], + )), + ) + ], + ), ), ), - ), - Padding(padding: EdgeInsets.all(15), child:AppText( projectViewModel.isArabic ? mode.weatherIndicatorData[0].cityNameN : mode.weatherIndicatorData[0].cityName, fontSize: 24, fontWeight: FontWeight.bold,)), - - Padding( - padding: EdgeInsets.all(15), - child: Column(children: - mode.weatherIndicatorData - .map((data) { - return WeatherSlider( - data); - }).toList() - - ))])) : Container()), + Padding( + padding: EdgeInsets.all(15), + child: AppText( + projectViewModel.isArabic + ? mode.weatherIndicatorData[0].cityNameN + : mode.weatherIndicatorData[0].cityName, + fontSize: 24, + fontWeight: FontWeight.bold, + )), + Padding( + padding: EdgeInsets.all(15), + child: Column( + children: mode.weatherIndicatorData.map((data) { + return WeatherSlider(data); + }).toList())) + ])) + : Center(child: AppCircularProgressIndicator())), ); } - getWeather() async{ + + getWeather() async { var data = await this.sharedPref.getObject(WEATHER); setState(() { weather = data['Temperature'].toString() + '\u2103' ?? '--'; }); - } } diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index c200fecf..f97c1c42 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -552,7 +552,6 @@ class _ConfirmLogin extends State { } checkIfUserAgreedBefore(CheckActivationCode result) { - print(result); if (result.isNeedUserAgreement == true) { //move to agreement page. } else { diff --git a/lib/services/authentication/auth_provider.dart b/lib/services/authentication/auth_provider.dart index 4dedb37f..59f51bfc 100644 --- a/lib/services/authentication/auth_provider.dart +++ b/lib/services/authentication/auth_provider.dart @@ -50,6 +50,7 @@ const FORGOT_PATIENT_ID = const DASHBOARD = 'Services/Patients.svc/REST/PatientDashboard'; const PROFILE_SETTING = 'Services/Patients.svc/REST/GetPateintInfoForUpdate'; const SAVE_SETTING = 'Services/Patients.svc/REST/UpdatePateintInfo'; + class AuthProvider with ChangeNotifier { bool isLogin = false; bool isLoading = true; @@ -232,7 +233,7 @@ class AuthProvider with ChangeNotifier { neRequest.channel = CHANNEL; neRequest.iPAdress = IP_ADDRESS; neRequest.generalid = GENERAL_ID; - neRequest.languageID = LANGUAGE_ID; + // neRequest.languageID = LANGUAGE_ID; neRequest.deviceTypeID = DeviceTypeID; neRequest.patientOutSA = neRequest.zipCode == '966' ? 0 : 1; neRequest.projectOutSA = neRequest.zipCode == '966' ? false : true; @@ -458,36 +459,36 @@ class AuthProvider with ChangeNotifier { //return Future.value(error); } } - getSettings() async{ + getSettings() async { dynamic localRes; try { await new BaseAppClient().post(PROFILE_SETTING, onSuccess: (dynamic response, int statusCode) { - localRes = response; //CheckActivationCode.fromJson(); - }, onFailure: (String error, int statusCode) { - localRes = error; - return Future.value(error); - // throw error; - }, body: {}); + localRes = response; //CheckActivationCode.fromJson(); + }, onFailure: (String error, int statusCode) { + localRes = error; + return Future.value(error); + // throw error; + }, body: {}); return Future.value(localRes); } catch (error) { throw error; //return Future.value(error); } } - Future saveSettings(request) async{ + Future saveSettings(request) async { dynamic localRes; try { await new BaseAppClient().post(SAVE_SETTING, onSuccess: (dynamic response, int statusCode) { - localRes = response; //CheckActivationCode.fromJson(); - }, onFailure: (String error, int statusCode) { - localRes = error; - return Future.value(error); - // throw error; - }, body: request); + localRes = response; //CheckActivationCode.fromJson(); + }, onFailure: (String error, int statusCode) { + localRes = error; + return Future.value(error); + // throw error; + }, body: request); return Future.value(localRes); } catch (error) { throw error; diff --git a/lib/widgets/otp/sms-popup.dart b/lib/widgets/otp/sms-popup.dart index 39e41a93..02282c7b 100644 --- a/lib/widgets/otp/sms-popup.dart +++ b/lib/widgets/otp/sms-popup.dart @@ -54,7 +54,6 @@ class SMSOTP { String displayTime = ''; displayDialog(BuildContext context) async { - return showDialog( context: context, builder: (context) { @@ -80,7 +79,8 @@ class SMSOTP { height: SizeConfig.realScreenHeight * 0.5, width: SizeConfig.realScreenWidth * 0.8, child: Center( - child: Column( + child: SingleChildScrollView( + child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ type == 1 @@ -101,114 +101,117 @@ class SMSOTP { child: Padding( padding: EdgeInsets.only(top: 20), child: Directionality( - textDirection:TextDirection.ltr, - child:Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( - width: SizeConfig.realScreenWidth * 0.15, - child: TextFormField( - textInputAction: TextInputAction.next, - style: buildTextStyle(), - autofocus: true, - maxLength: 1, - controller: digit1, - textAlign: TextAlign.center, - keyboardType: TextInputType.number, - decoration: buildInputDecoration(context), - onSaved: (val) {}, - validator: validateCodeDigit, - onFieldSubmitted: (_) { - FocusScope.of(context).requestFocus(focusD2); - }, - onChanged: (val) { - if (val.length == 1) { - FocusScope.of(context) - .requestFocus(focusD2); - verifyAccountFormValue['digit1'] = - val.trim(); - checkValue(); - } - }, - ), - ), - Container( - width: SizeConfig.realScreenWidth * 0.15, - child: TextFormField( - focusNode: focusD2, - textInputAction: TextInputAction.next, - maxLength: 1, - controller: digit2, - textAlign: TextAlign.center, - style: buildTextStyle(), - keyboardType: TextInputType.number, - decoration: buildInputDecoration(context), - onSaved: (val) {}, - onFieldSubmitted: (_) { - FocusScope.of(context) - .requestFocus(focusD3); - }, - onChanged: (val) { - if (val.length == 1) { - FocusScope.of(context) - .requestFocus(focusD3); - verifyAccountFormValue['digit2'] = - val.trim(); - checkValue(); - } - }, - validator: validateCodeDigit), - ), - Container( - width: SizeConfig.realScreenWidth * 0.15, - child: TextFormField( - focusNode: focusD3, + textDirection: TextDirection.ltr, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + width: SizeConfig.realScreenWidth * 0.15, + child: TextFormField( textInputAction: TextInputAction.next, + style: buildTextStyle(), + autofocus: true, maxLength: 1, - controller: digit3, + controller: digit1, textAlign: TextAlign.center, - style: buildTextStyle(), keyboardType: TextInputType.number, decoration: buildInputDecoration(context), onSaved: (val) {}, + validator: validateCodeDigit, onFieldSubmitted: (_) { FocusScope.of(context) - .requestFocus(focusD4); + .requestFocus(focusD2); }, onChanged: (val) { if (val.length == 1) { FocusScope.of(context) - .requestFocus(focusD4); - verifyAccountFormValue['digit3'] = + .requestFocus(focusD2); + verifyAccountFormValue['digit1'] = val.trim(); checkValue(); } }, - validator: validateCodeDigit)), - Container( - width: SizeConfig.realScreenWidth * 0.15, - child: TextFormField( - focusNode: focusD4, - maxLength: 1, - textAlign: TextAlign.center, - style: buildTextStyle(), - controller: digit4, - keyboardType: TextInputType.number, - decoration: buildInputDecoration(context), - onFieldSubmitted: (_) { - FocusScope.of(context) - .requestFocus(focusD4); - }, - onChanged: (val) { - if (val.length == 1) { - verifyAccountFormValue['digit4'] = - val.trim(); - checkValue(); - } - }, - validator: validateCodeDigit)), - ], - )), + ), + ), + Container( + width: SizeConfig.realScreenWidth * 0.15, + child: TextFormField( + focusNode: focusD2, + textInputAction: TextInputAction.next, + maxLength: 1, + controller: digit2, + textAlign: TextAlign.center, + style: buildTextStyle(), + keyboardType: TextInputType.number, + decoration: buildInputDecoration(context), + onSaved: (val) {}, + onFieldSubmitted: (_) { + FocusScope.of(context) + .requestFocus(focusD3); + }, + onChanged: (val) { + if (val.length == 1) { + FocusScope.of(context) + .requestFocus(focusD3); + verifyAccountFormValue['digit2'] = + val.trim(); + checkValue(); + } + }, + validator: validateCodeDigit), + ), + Container( + width: SizeConfig.realScreenWidth * 0.15, + child: TextFormField( + focusNode: focusD3, + textInputAction: TextInputAction.next, + maxLength: 1, + controller: digit3, + textAlign: TextAlign.center, + style: buildTextStyle(), + keyboardType: TextInputType.number, + decoration: + buildInputDecoration(context), + onSaved: (val) {}, + onFieldSubmitted: (_) { + FocusScope.of(context) + .requestFocus(focusD4); + }, + onChanged: (val) { + if (val.length == 1) { + FocusScope.of(context) + .requestFocus(focusD4); + verifyAccountFormValue['digit3'] = + val.trim(); + checkValue(); + } + }, + validator: validateCodeDigit)), + Container( + width: SizeConfig.realScreenWidth * 0.15, + child: TextFormField( + focusNode: focusD4, + maxLength: 1, + textAlign: TextAlign.center, + style: buildTextStyle(), + controller: digit4, + keyboardType: TextInputType.number, + decoration: + buildInputDecoration(context), + onFieldSubmitted: (_) { + FocusScope.of(context) + .requestFocus(focusD4); + }, + onChanged: (val) { + if (val.length == 1) { + verifyAccountFormValue['digit4'] = + val.trim(); + checkValue(); + } + }, + validator: validateCodeDigit)), + ], + )), ), ), Padding( @@ -221,7 +224,7 @@ class SMSOTP { textAlign: TextAlign.center, )) ], - )), + ))), ); }), ); @@ -270,9 +273,11 @@ class SMSOTP { checkValue() { //print(verifyAccountFormValue); if (verifyAccountForm.currentState.validate()) { - onSuccess(digit1.text.toString()+digit2.text.toString()+digit3.text.toString()+digit4.text.toString()); + onSuccess(digit1.text.toString() + + digit2.text.toString() + + digit3.text.toString() + + digit4.text.toString()); } - } getSecondsAsDigitalClock(int inputSeconds) { diff --git a/pubspec.yaml b/pubspec.yaml index a3844b2b..5bd52d75 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -151,9 +151,7 @@ dependencies: wakelock: ^0.1.4 after_layout: ^1.0.7 twilio_programmable_video: ^0.6.3+1 - flutter_tts: - git: - url: https://github.com/dlutton/flutter_tts.git + flutter_tts: any vibration: ^1.7.2 speech_to_text: path: speech_to_text From e34a5c3c1347e543b3a6d6c8a60487ee87590326 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 4 Dec 2020 19:55:11 +0300 Subject: [PATCH 52/69] multiple login calls fixed --- lib/pages/login/confirm-login.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index f97c1c42..50cada42 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -261,6 +261,7 @@ class _ConfirmLogin extends State { } authenticateUser(type, isActive) { + GifLoaderDialogUtils.showMyDialog(context); if (type == 2 || type == 3) { fingrePrintBefore = type; } @@ -307,7 +308,6 @@ class _ConfirmLogin extends State { req.logInTokenID = ""; var request = CheckPatientAuthenticationReq.fromJson(req.toJson()); - GifLoaderDialogUtils.showMyDialog(context); sharedPref.setObject(REGISTER_DATA_FOR_REGISTER, request); authService From 8b8207cb0d41d5e7ac6c719aad14f7d0a7705b95 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Fri, 4 Dec 2020 19:17:50 +0200 Subject: [PATCH 53/69] search --- lib/config/config.dart | 5 +++++ lib/pages/pharmacy_categorise.dart | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 9bc05e27..6658f8de 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -124,6 +124,9 @@ const GET_QR_PARKING = 'Services/SWP.svc/REST/GetQRParkingByID'; //URL to get clinic list const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; +const GET_ACTIVE_APPOINTMENTS_LIST_URL = + "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber"; + //URL to get projects list const GET_PROJECTS_LIST = 'Services/Lists.svc/REST/GetProject'; @@ -354,6 +357,7 @@ const GET_ORDER_DETAIL_BY_ID = const GET_CMC_ORDER_DETAIL_BY_ID = "Services/Patients.svc/REST/PatientER_CMC_GetTransactionsForOrder"; const GET_CHECK_UP_ITEMS = "Services/Patients.svc/REST/GetCheckUpItems"; + //Pharmacy const GET_PHARMACY_CATEGORISE = @@ -368,6 +372,7 @@ const GET_SUB_CATEGORISE = const GET_SUB_PRODUCTS = 'epharmacy/api/products?categoryid='; const GET_FINAL_PRODUCTS = 'epharmacy/api/products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId='; + const TIMER_MIN = 10; const GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart index b9954d20..169fb92d 100644 --- a/lib/pages/pharmacy_categorise.dart +++ b/lib/pages/pharmacy_categorise.dart @@ -86,7 +86,7 @@ class _PharmacyCategorisePageState extends State { ), ), Container( - height: 150, + height: 140, child: Column( children: [ Divider( @@ -94,7 +94,7 @@ class _PharmacyCategorisePageState extends State { thickness: 1.0, color: Colors.black12.withOpacity(0.14)), SizedBox( - height: 15.0, + height: 10.0, ), Row( children: [ From 2a91ae787f012df1fcb3ace9634936009b8ee461 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 6 Dec 2020 10:20:37 +0200 Subject: [PATCH 54/69] commit --- lib/pages/pharmacies/screens/lakum-points-month-page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pages/pharmacies/screens/lakum-points-month-page.dart b/lib/pages/pharmacies/screens/lakum-points-month-page.dart index cdffb07d..47270eee 100644 --- a/lib/pages/pharmacies/screens/lakum-points-month-page.dart +++ b/lib/pages/pharmacies/screens/lakum-points-month-page.dart @@ -237,6 +237,7 @@ class DayPointsDetailWidget extends StatelessWidget { ), )), Expanded( + child: Container( child: Texts( "$points", From 709ba2ce97ebe368c90a14b48191311aff26713e Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 6 Dec 2020 12:40:10 +0200 Subject: [PATCH 55/69] create terms-condition in pharmacy order page --- .../terms-condition-service.dart | 33 ++++++++++++ .../tems-condition-viewmodel.dart | 24 +++++++++ lib/locator.dart | 4 ++ .../pharmacies/screens/cart-order-page.dart | 19 +++++-- .../pharmacy-terms-conditions-page.dart | 51 +++++++++++++++++++ 5 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 lib/core/service/parmacyModule/terms-condition-service.dart create mode 100644 lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart create mode 100644 lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart diff --git a/lib/core/service/parmacyModule/terms-condition-service.dart b/lib/core/service/parmacyModule/terms-condition-service.dart new file mode 100644 index 00000000..68fac632 --- /dev/null +++ b/lib/core/service/parmacyModule/terms-condition-service.dart @@ -0,0 +1,33 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; + +import '../base_service.dart'; + +class TermsConditionService extends BaseService{ + bool isFinished = true; + bool hasError = false; + String errorMsg = ''; + String successMsg = ''; + + ListUserAgreement listUserAgreement; + + Future getUserTermsAndConditionsForEPharmcy() async { + hasError = false; + super.error = ""; + + Map body = Map(); + + try { + await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, + onSuccess: (response, statusCode) async { + listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } catch (error) { + throw error; + } + } + +} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart b/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart new file mode 100644 index 00000000..6a5bd476 --- /dev/null +++ b/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart @@ -0,0 +1,24 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/terms-condition-service.dart'; +import 'dart:async'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class TermsConditionViewModel extends BaseViewModel { + TermsConditionService _termsConditionService = locator(); + + ListUserAgreement get listUserAgreement => _termsConditionService.listUserAgreement; + + Future getUserTermsAndConditionsForEPharmcy() async { + setState(ViewState.Busy); + await _termsConditionService.getUserTermsAndConditionsForEPharmcy(); + if (_termsConditionService.hasError) { + error = _termsConditionService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } +} diff --git a/lib/locator.dart b/lib/locator.dart index c89dc37f..5073a935 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -51,6 +51,7 @@ import 'core/service/parmacyModule/lacum-service.dart'; import 'core/service/parmacyModule/lacum-transfer-service.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/service/notifications_service.dart'; +import 'core/service/parmacyModule/terms-condition-service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -95,6 +96,7 @@ import 'core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; import 'core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; import 'core/viewModels/pharmacyModule/lacum-viewmodel.dart'; import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; +import 'core/viewModels/pharmacyModule/tems-condition-viewmodel.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; @@ -158,6 +160,7 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyAddressService()); locator.registerLazySingleton(() => OrderDetailsService()); locator.registerLazySingleton(() => CustomerAddressesService()); + locator.registerLazySingleton(() => TermsConditionService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -190,6 +193,7 @@ void setupLocator() { locator.registerFactory(() => VaccinationTableViewModel()); locator.registerFactory(() => OrderModelViewModel()); locator.registerFactory(() => PharmacyAddressesViewModel()); + locator.registerFactory(() => TermsConditionViewModel()); locator.registerFactory(() => AddNewChildViewModel()); locator.registerFactory(() => H2OViewModel()); diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart index 2ea9aa7c..93b4d060 100644 --- a/lib/pages/pharmacies/screens/cart-order-page.dart +++ b/lib/pages/pharmacies/screens/cart-order-page.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse. import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-preview.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderItem.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; @@ -261,11 +262,19 @@ class _OrderBottomWidgetState extends State { ), ), ), - Container( - child: Icon( - Icons.info, - size: 25, - color: Color(0xff005aff), + InkWell( + onTap: () => { + Navigator.push( + context, + FadePage( + page: PharmacyTermsConditions())) + }, + child: Container( + child: Icon( + Icons.info, + size: 25, + color: Color(0xff005aff), + ), ), ), ], diff --git a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart new file mode 100644 index 00000000..a26994a0 --- /dev/null +++ b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart @@ -0,0 +1,51 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:provider/provider.dart'; + +class PharmacyTermsConditions extends StatelessWidget { + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + + return BaseView( + onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), + builder: (_, model, wi) => AppScaffold( + title: "Terms of service", + isShowAppBar: true, + isShowDecPage: false, + backgroundColor: Colors.white, + baseViewModel: model, + body: Container( + margin: EdgeInsets.all(8), + width: double.infinity, + child: Stack( + children: [ + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (model.listUserAgreement != null && + model.listUserAgreement.userAgreementLAKUM != + null) + Html( + data: projectProvider.isArabic + ? model.listUserAgreement.userAgreementTxtn + : model.listUserAgreement.userAgreementTxt, + ), + ], + ), + ), + ], + ), + ), + )); + } +} From 1f9d592268f6cb445979fac3956d88cc09a6811a Mon Sep 17 00:00:00 2001 From: umasoodch Date: Sun, 6 Dec 2020 14:51:07 +0300 Subject: [PATCH 56/69] removed access key code in pubspec --- pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index fd91bd47..99045180 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -157,7 +157,6 @@ dependencies: path: speech_to_text badges: ^1.1.4 - fit_kit: ^1.1.2 #Smartwatch Health Data Integration fit_kit: ^1.1.2 From 7ee7ef58c4d41bb07c12502bb618d376e2153f0a Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 6 Dec 2020 14:06:59 +0200 Subject: [PATCH 57/69] working on dynamic title on pharmacy --- lib/config/localized_values.dart | 2 ++ lib/pages/pharmacies/screens/cart-order-page.dart | 6 ++++-- lib/pages/pharmacies/screens/cart-order-preview.dart | 2 +- .../pharmacies/screens/pharmacy-terms-conditions-page.dart | 4 ++-- lib/uitl/translations_delegate_base.dart | 2 ++ 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index e60b85a3..7f6eff4e 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1285,5 +1285,7 @@ const Map localizedValues = { "Month": {"en": "MONTH", "ar": "الشهر"}, "point": {"en": "POINT", "ar": "النقاط"}, "riyal": {"en": "RIYAL", "ar": "الريال"}, + "termOfService": {"en": "Terms of service", "ar": "شروط الخدمة"}, + "shoppingCart": {"en": "Shopping Cart", "ar": "عربة التسوق"}, }; diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart index 93b4d060..fe5f64b2 100644 --- a/lib/pages/pharmacies/screens/cart-order-page.dart +++ b/lib/pages/pharmacies/screens/cart-order-page.dart @@ -28,9 +28,10 @@ class CartOrderPage extends StatelessWidget { builder: (_, model, wi) => ChangeNotifierProvider.value( value: model.cartResponse, child: AppScaffold( - title: "Shopping Cart", + title: TranslationBase.of(context).shoppingCart, isShowAppBar: true, isShowDecPage: false, + isPharmacy: true, baseViewModel: model, appBarWidget: appBarWidget, backgroundColor: Colors.white, @@ -178,7 +179,8 @@ class CartOrderPage extends StatelessWidget { ) : Container(), bottomSheet: Container( - height: height * 0.15, + height: !(model.cartResponse.shoppingCarts == null || + model.cartResponse.shoppingCarts.length == 0) ? height * 0.15 : 0, color: Colors.white, child: OrderBottomWidget(model.addresses, height), ), diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart index 262eed28..aed2dbc5 100644 --- a/lib/pages/pharmacies/screens/cart-order-preview.dart +++ b/lib/pages/pharmacies/screens/cart-order-preview.dart @@ -215,7 +215,7 @@ class OrderPreviewPage extends StatelessWidget { ), ), bottomSheet: Container( - height: height * 0.10, + height: model.cartResponse.shoppingCarts != null ? height * 0.10 : 0, color: Colors.white, child: PaymentBottomWidget(model), ), diff --git a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart index a26994a0..90d8bcc2 100644 --- a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart +++ b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart @@ -9,7 +9,6 @@ import 'package:flutter_html/flutter_html.dart'; import 'package:provider/provider.dart'; class PharmacyTermsConditions extends StatelessWidget { - @override Widget build(BuildContext context) { ProjectViewModel projectProvider = Provider.of(context); @@ -17,9 +16,10 @@ class PharmacyTermsConditions extends StatelessWidget { return BaseView( onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), builder: (_, model, wi) => AppScaffold( - title: "Terms of service", + title: TranslationBase.of(context).termOfService, isShowAppBar: true, isShowDecPage: false, + isPharmacy: true, backgroundColor: Colors.white, baseViewModel: model, body: Container( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 448baf68..ec9573a7 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -981,6 +981,8 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get month => localizedValues['Month'][locale.languageCode]; String get point => localizedValues['point'][locale.languageCode]; String get riyal => localizedValues['riyal'][locale.languageCode]; + String get termOfService => localizedValues['termOfService'][locale.languageCode]; + String get shoppingCart => localizedValues['ShoppingCart'][locale.languageCode]; } From 4c9a1862d2b636d57f32da88ac21966a88b7e919 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 6 Dec 2020 15:01:05 +0200 Subject: [PATCH 58/69] make pharmacy home page load data even without login, and some mini changes --- lib/core/service/client/base_app_client.dart | 1 + .../parmacyModule/parmacy_module_service.dart | 3 +- .../pharmacy_module_view_model.dart | 28 +++++++++++++------ .../pharmacies/screens/cart-order-page.dart | 3 +- .../screens/lakum-terms-conditions-page.dart | 2 +- .../pharmacy-terms-conditions-page.dart | 2 +- .../screens/pharmacy_module_page.dart | 1 + lib/uitl/translations_delegate_base.dart | 2 +- 8 files changed, 28 insertions(+), 14 deletions(-) diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 51455148..6a9a6da3 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -268,6 +268,7 @@ class BaseAppClient { logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); + await sharedPref.remove(PHARMACY_CUSTOMER_ID); await authenticatedUserObject.getUser(); Provider.of(AppGlobal.context, listen: false).isLogin = false; diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart index df1da4d7..c3bce324 100644 --- a/lib/core/service/parmacyModule/parmacy_module_service.dart +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -17,8 +17,7 @@ class PharmacyModuleService extends BaseService { List bestSellerProducts = List(); List lastVisitedProducts = List(); - Future makeVerifyCustomer() async { - var data = await sharedPref.getObject(USER_PROFILE); + Future makeVerifyCustomer(dynamic data) async { Map queryParams = {'FileNumber': data['PatientID'].toString()}; hasError = false; try { diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart index f6ed8408..4dfc6a26 100644 --- a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -23,19 +23,31 @@ class PharmacyModuleViewModel extends BaseViewModel { Future getPharmacyHomeData() async { setState(ViewState.Busy); - await _pharmacyService.makeVerifyCustomer(); - // here must call getShoppingCard() - if (_pharmacyService.hasError) { - error = _pharmacyService.error; - setState(ViewState.Error); - } else { - await _pharmacyService.getBannerListList(); + var data = await sharedPref.getObject(USER_PROFILE); + var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); + + if (authenticatedUserObject.isLogin && data != null && customerId == null) { + await _pharmacyService.makeVerifyCustomer(data); + // here must call getShoppingCard() if (_pharmacyService.hasError) { error = _pharmacyService.error; setState(ViewState.Error); } else { - _getTopManufacturerList(); + await getBannerList(); } + } else { + await getBannerList(); + } + } + + Future getBannerList() async { + setState(ViewState.Busy); + await _pharmacyService.getBannerListList(); + if (_pharmacyService.hasError) { + error = _pharmacyService.error; + setState(ViewState.Error); + } else { + _getTopManufacturerList(); } } diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart index fe5f64b2..d8a274d7 100644 --- a/lib/pages/pharmacies/screens/cart-order-page.dart +++ b/lib/pages/pharmacies/screens/cart-order-page.dart @@ -17,8 +17,9 @@ class CartOrderPage extends StatelessWidget { @override Widget build(BuildContext context) { final mediaQuery = MediaQuery.of(context); + PreferredSizeWidget appBarWidget = - AppBarWidget("Shopping Cart", null, true); + AppBarWidget(TranslationBase.of(context).shoppingCart, null, true); final height = mediaQuery.size.height - appBarWidget.preferredSize.height - mediaQuery.padding.top; diff --git a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart index 8ca10c50..30c3bb6e 100644 --- a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart +++ b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart @@ -28,7 +28,7 @@ class LakumTermsConditions extends StatelessWidget { return BaseView( onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), builder: (_, model, wi) => AppScaffold( - title: "Register Lakum", + appBarTitle: "Register Lakum", isShowAppBar: true, isShowDecPage: false, backgroundColor: Colors.white, diff --git a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart index 90d8bcc2..87c1b97c 100644 --- a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart +++ b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart @@ -16,7 +16,7 @@ class PharmacyTermsConditions extends StatelessWidget { return BaseView( onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), builder: (_, model, wi) => AppScaffold( - title: TranslationBase.of(context).termOfService, + appBarTitle: TranslationBase.of(context).termOfService, isShowAppBar: true, isShowDecPage: false, isPharmacy: true, diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 1a8428ae..9155516c 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -21,6 +21,7 @@ class PharmacyPage extends StatelessWidget { Widget build(BuildContext context) { return BaseView( onModelReady: (model) => model.getPharmacyHomeData(), + allowAny: true, builder: (_, model, wi) => AppScaffold( title: "", isShowAppBar: true, diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 662f77e7..6721824d 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1022,7 +1022,7 @@ class TranslationBase { String get point => localizedValues['point'][locale.languageCode]; String get riyal => localizedValues['riyal'][locale.languageCode]; String get termOfService => localizedValues['termOfService'][locale.languageCode]; - String get shoppingCart => localizedValues['ShoppingCart'][locale.languageCode]; + String get shoppingCart => localizedValues['shoppingCart'][locale.languageCode]; String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; From 800565407d40c803d33bc055e21e1bb94d767d41 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Sun, 6 Dec 2020 15:37:19 +0200 Subject: [PATCH 59/69] 12/6 --- lib/config/config.dart | 5 ++--- lib/core/service/pharmacy_categorise_service.dart | 5 +++-- lib/core/viewModels/pharmacy_categorise_view_model.dart | 4 ++-- lib/pages/offers_categorise_page.dart | 2 ++ 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 6658f8de..ee726db4 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -377,13 +377,12 @@ const TIMER_MIN = 10; const GOOGLE_API_KEY = "AIzaSyCmevVlr2Bh-c8W1VUzo8gt8JRY7n5PANw"; -const GET_BRANDS_LIST = - 'epharmacy/api/categoryManufacturer?categoryids=1&fields=id,name,image,namen'; +const GET_BRANDS_LIST = 'epharmacy/api/categoryManufacturer?categoryids='; const GET_SEARCH_PRODUCTS = 'epharmacy/api/searchproducts?fields=id,discount_ids,reviews,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&search_key='; -const SCAN_QR_CODE = 'epharmacy/api/productbysku/6440010010'; +const SCAN_QR_CODE = 'epharmacy/api/productbysku/'; class AppGlobal { static var context; diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart index dfb93045..b55a755d 100644 --- a/lib/core/service/pharmacy_categorise_service.dart +++ b/lib/core/service/pharmacy_categorise_service.dart @@ -70,11 +70,12 @@ class PharmacyCategoriseService extends BaseService { ); } - Future scanQr() async { + Future scanQr({String id}) async { hasError = false; _scanList.clear(); + String endPoint = id != null ? SCAN_QR_CODE + "$id" : SCAN_QR_CODE + ""; await baseAppClient.get( - SCAN_QR_CODE, + endPoint, onSuccess: (dynamic response, int statusCode) { response['products'].forEach((item) { _scanList.add(ScanQrModel.fromJson(item)); diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart index a2f5b654..81179091 100644 --- a/lib/core/viewModels/pharmacy_categorise_view_model.dart +++ b/lib/core/viewModels/pharmacy_categorise_view_model.dart @@ -67,11 +67,11 @@ class PharmacyCategoriseViewModel extends BaseViewModel { setState(ViewState.Idle); } - Future scanQr() async { + Future scanQr({String id}) async { hasError = false; // _insuranceCardService.clearInsuranceCard(); setState(ViewState.Busy); - await _pharmacyCategoriseService.scanQr(); + await _pharmacyCategoriseService.scanQr(id: id); if (_pharmacyCategoriseService.hasError) { error = _pharmacyCategoriseService.error; setState(ViewState.ErrorLocal); diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart index 45ae2696..039193f1 100644 --- a/lib/pages/offers_categorise_page.dart +++ b/lib/pages/offers_categorise_page.dart @@ -33,6 +33,8 @@ class _OffersCategorisePageState extends State { builder: (BuildContext context, OffersCategoriseViewModel model, Widget child) => AppScaffold( + appBarTitle: 'Offers', + isShowAppBar: false, backgroundColor: Colors.white, isShowDecPage: false, baseViewModel: model, From 5dc3c53550171cf0aec7b6a57750c8f64f968ebd Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Sun, 6 Dec 2020 16:40:07 +0200 Subject: [PATCH 60/69] mousa and hussam branch --- lib/config/config.dart | 26 ++++--- lib/locator.dart | 3 - lib/pages/landing/home_page.dart | 3 - lib/pages/landing/landing_page_pharmcy.dart | 70 +++++++++---------- lib/pages/offers_categorise_page.dart | 5 +- .../screens/pharmacy_module_page.dart | 5 +- lib/uitl/translations_delegate_base.dart | 14 ++-- 7 files changed, 64 insertions(+), 62 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index f6c8c9b1..7d9993e8 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -134,8 +134,6 @@ const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; const GET_ACTIVE_APPOINTMENTS_LIST_URL = "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber"; - - //URL to get projects list const GET_PROJECTS_LIST = 'Services/Lists.svc/REST/GetProject'; @@ -372,15 +370,23 @@ const GET_ADDRESS = "epharmacy/api/Customers/272843?fields=addresses"; const GET_SHOPPING_CART = "epharmacy/api/shopping_cart_items/"; const GET_SHIPPING_OPTIONS = "epharmacy/api/get_shipping_option/"; const DELETE_SHOPPING_CART = "epharmacy/api/delete_shopping_cart_items/"; -const DELETE_SHOPPING_CART_ALL = "epharmacy/api/delete_shopping_cart_item_by_customer/"; +const DELETE_SHOPPING_CART_ALL = + "epharmacy/api/delete_shopping_cart_item_by_customer/"; const ORDER_SHOPPING_CART = "epharmacy/api/orders"; -const GET_LACUM_ACCOUNT_INFORMATION = "Services/Patients.svc/REST/GetLakumAccountInformation"; -const GET_LACUM_GROUP_INFORMATION = "Services/Patients.svc/REST/GetlakumInQueryInfoGrouping"; -const LACUM_ACCOUNT_ACTIVATE = "Services/Patients.svc/REST/LakumAccountActivation"; -const LACUM_ACCOUNT_DEACTIVATE = "Services/Patients.svc/REST/LakumAccountDeactivation"; -const CREATE_LAKUM_ACCOUNT = "Services/Patients.svc/REST/PHR_CreateLakumAccount"; -const TRANSFER_YAHALA_LOYALITY_POINTS = "Services/Patients.svc/REST/TransferYaHalaLoyaltyPoints"; -const LAKUM_GET_USER_TERMS_AND_CONDITIONS = "Services/ERP.svc/REST/GetUserTermsAndConditionsForEPharmcy"; +const GET_LACUM_ACCOUNT_INFORMATION = + "Services/Patients.svc/REST/GetLakumAccountInformation"; +const GET_LACUM_GROUP_INFORMATION = + "Services/Patients.svc/REST/GetlakumInQueryInfoGrouping"; +const LACUM_ACCOUNT_ACTIVATE = + "Services/Patients.svc/REST/LakumAccountActivation"; +const LACUM_ACCOUNT_DEACTIVATE = + "Services/Patients.svc/REST/LakumAccountDeactivation"; +const CREATE_LAKUM_ACCOUNT = + "Services/Patients.svc/REST/PHR_CreateLakumAccount"; +const TRANSFER_YAHALA_LOYALITY_POINTS = + "Services/Patients.svc/REST/TransferYaHalaLoyaltyPoints"; +const LAKUM_GET_USER_TERMS_AND_CONDITIONS = + "Services/ERP.svc/REST/GetUserTermsAndConditionsForEPharmcy"; // Home Health Care const HHC_GET_ALL_SERVICES = diff --git a/lib/locator.dart b/lib/locator.dart index b8c574a1..6d2375e7 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -174,7 +174,6 @@ void setupLocator() { locator.registerLazySingleton(() => CustomerAddressesService()); locator.registerLazySingleton(() => TermsConditionService()); - /// View Model locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => PharmacyViewModel()); @@ -208,7 +207,6 @@ void setupLocator() { locator.registerFactory(() => PharmacyAddressesViewModel()); locator.registerFactory(() => TermsConditionViewModel()); - locator.registerFactory(() => AddNewChildViewModel()); locator.registerFactory(() => H2OViewModel()); locator.registerFactory(() => BloodSugarViewMode()); @@ -223,7 +221,6 @@ void setupLocator() { locator.registerFactory(() => CMCViewModel()); locator.registerFactory(() => NotificationViewModel()); - locator.registerFactory(() => PharmacyModuleViewModel()); locator.registerFactory(() => OrderPreviewViewModel()); locator.registerFactory(() => LacumViewModel()); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 49a5c1b6..6c7f0009 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -490,9 +490,6 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( - onTap: () => Navigator.push( - context, FadePage(page: PharmacyPage())), - child: Center( child: Padding( padding: const EdgeInsets.all(15.0), diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart index 6a687e1a..4308e186 100644 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ b/lib/pages/landing/landing_page_pharmcy.dart @@ -1,5 +1,7 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; import 'package:diplomaticquarterapp/pages/search_products_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -95,51 +97,49 @@ class _LandingPagePharmacyState extends State { ], centerTitle: true, ) - : AppBar( - backgroundColor: Color(0xff5AB145), - elevation: 0, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(getText(currentTab).toUpperCase()), - leading: Builder( - builder: (BuildContext context) { - return IconButton( - icon: Icon(Icons.arrow_back), - color: Colors.white, - onPressed: () => Scaffold.of(context).openDrawer(), - ); - }, - ), - actions: [ - // IconButton( - // iconSize: 70, - // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', - // height: 100, width: 100, fit: BoxFit.cover), - // onPressed: () { - // triggerRobot(); - // } //do something, - // ) - ], - centerTitle: true, - ), + : currentTab == 4 + ? null + : AppBar( + backgroundColor: Color(0xff5AB145), + elevation: 0, + textTheme: TextTheme( + headline6: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(getText(currentTab).toUpperCase()), + leading: Builder( + builder: (BuildContext context) { + return IconButton( + icon: Icon(Icons.arrow_back), + color: Colors.white, + onPressed: () => Scaffold.of(context).openDrawer(), + ); + }, + ), + actions: [ + // IconButton( + // iconSize: 70, + // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', + // height: 100, width: 100, fit: BoxFit.cover), + // onPressed: () { + // triggerRobot(); + // } //do something, + // ) + ], + centerTitle: true, + ), extendBody: false, body: PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, children: [ - Container( - child: Text('text'), - ), + PharmacyPage(), PharmacyCategorisePage(), OffersCategorisePage(), Container( child: Text('text'), ), - Container( - child: Center(child: Text('This Is Cart Page')), - ), + CartOrderPage(), ], // Please do not remove the BookingOptions from this array ), bottomNavigationBar: BottomNavPharmacyBar( diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart index 039193f1..782ea018 100644 --- a/lib/pages/offers_categorise_page.dart +++ b/lib/pages/offers_categorise_page.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_mode import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/material.dart'; @@ -32,9 +33,9 @@ class _OffersCategorisePageState extends State { onModelReady: (model) => model.getOffersCategorise(), builder: (BuildContext context, OffersCategoriseViewModel model, Widget child) => - AppScaffold( + PharmacyAppScaffold( appBarTitle: 'Offers', - isShowAppBar: false, + isShowAppBar: true, backgroundColor: Colors.white, isShowDecPage: false, baseViewModel: model, diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 9155516c..32a610f8 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/pages/offers_categorise_page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart'; @@ -24,7 +25,7 @@ class PharmacyPage extends StatelessWidget { allowAny: true, builder: (_, model, wi) => AppScaffold( title: "", - isShowAppBar: true, + isShowAppBar: false, isShowDecPage: false, baseViewModel: model, backgroundColor: Colors.white, @@ -164,7 +165,7 @@ class GridViewButtons extends StatelessWidget { child: GridViewCard( TranslationBase.of(context).offersAndPromotions, 'assets/images/pharmacy_module/offer_icon.png', () { - Navigator.push(context, FadePage(page: CartOrderPage())); + Navigator.push(context, FadePage(page: OffersCategorisePage())); }), ), DashboardItem( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index f3128e09..6339ceb0 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -763,19 +763,17 @@ class TranslationBase { String get orderLog => localizedValues['OrderLog'][locale.languageCode]; // String get infoLab => localizedValues['info-lab'][locale.languageCode]; // String get infoRadiology => - localizedValues['info-radiology'][locale.languageCode]; + String get orderNumber => localizedValues['orderNumber'][locale.languageCode]; String get orderDate => localizedValues['orderDate'][locale.languageCode]; String get itemsNo => localizedValues['itemsNo'][locale.languageCode]; String get noOrder => localizedValues['noOrder'][locale.languageCode]; // pharmacy module - // String get medicationRefill => - localizedValues['medicationRefill'][locale.languageCode]; + String get offersAndPromotions => localizedValues['offersAndPromotions'][locale.languageCode]; - // String get myPrescriptions => - localizedValues['myPrescriptions'][locale.languageCode]; + String get searchAndScanMedication => localizedValues['searchAndScanMedication'][locale.languageCode]; String get shopByBrands => @@ -1029,8 +1027,10 @@ class TranslationBase { String get month => localizedValues['Month'][locale.languageCode]; String get point => localizedValues['point'][locale.languageCode]; String get riyal => localizedValues['riyal'][locale.languageCode]; - String get termOfService => localizedValues['termOfService'][locale.languageCode]; - String get shoppingCart => localizedValues['shoppingCart'][locale.languageCode]; + String get termOfService => + localizedValues['termOfService'][locale.languageCode]; + String get shoppingCart => + localizedValues['shoppingCart'][locale.languageCode]; String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; From dfa1952f4dddbb48e776da2e6a292a9ae879323e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 6 Dec 2020 17:44:39 +0300 Subject: [PATCH 61/69] Implemented countdown timer in ToDo list & removed Smart progress bar from the whole app --- lib/config/localized_values.dart | 32 +- lib/core/viewModels/dashboard_view_model.dart | 26 +- lib/pages/Blood/blood_donation.dart | 1 - lib/pages/Blood/confirm_payment_page.dart | 30 +- lib/pages/Blood/dialogs/ConfirmSMSDialog.dart | 46 +-- lib/pages/BookAppointment/BookConfirm.dart | 27 +- lib/pages/BookAppointment/BookSuccess.dart | 50 +-- lib/pages/BookAppointment/BookingOptions.dart | 9 +- .../BookAppointment/DentalComplaints.dart | 19 +- lib/pages/BookAppointment/DoctorProfile.dart | 386 +++++++++--------- lib/pages/BookAppointment/QRCode.dart | 9 +- lib/pages/BookAppointment/Search.dart | 6 +- lib/pages/BookAppointment/SearchResults.dart | 1 + .../components/SearchByClinic.dart | 4 +- .../components/SearchByDoctor.dart | 4 +- .../BookAppointment/widgets/CardCommon.dart | 15 +- .../widgets/DentalComplaintCard.dart | 21 +- .../BookAppointment/widgets/DoctorView.dart | 1 - .../Covid-DriveThru/Covid-TimeSlots.dart | 43 +- .../covid-drivethru-location.dart | 35 +- lib/pages/MyAppointments/MyAppointments.dart | 34 +- lib/pages/MyAppointments/VisitTicket.dart | 16 +- .../widgets/AppointmentActions.dart | 125 ++++-- .../widgets/PrescriptionReport.dart | 17 +- lib/pages/ToDoList/ToDo.dart | 19 + lib/pages/landing/home_page.dart | 2 +- lib/pages/livecare/livecare_home.dart | 66 ++- .../livecare/widgets/LiveCareHistoryCard.dart | 8 +- .../widgets/LiveCarePendingRequest.dart | 12 +- lib/pages/livecare/widgets/clinic_card.dart | 9 +- lib/pages/livecare/widgets/clinic_list.dart | 137 ++++--- lib/pages/login/login.dart | 51 ++- .../medical/ask_doctor/ask_doctor_page.dart | 3 - .../medical/balance/advance_payment_page.dart | 32 +- .../medical/balance/confirm_payment_page.dart | 7 +- .../smart_watch_instructions.dart | 8 +- lib/uitl/location_util.dart | 4 +- lib/uitl/translations_delegate_base.dart | 8 + .../bottom_navigation/bottom_nav_bar.dart | 50 +-- lib/widgets/drawer/app_drawer_widget.dart | 1 - lib/widgets/others/bottom_bar.dart | 32 +- .../others/floating_button_search.dart | 9 +- pubspec.yaml | 7 +- 43 files changed, 803 insertions(+), 619 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index e6be280b..ce921a7d 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1044,5 +1044,35 @@ const Map localizedValues = { "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." - } + }, + "dental-complains": { + "en": "Symptoms", + "ar": "الأعراض" + }, + "empty-result": { + "en": "There is no search results found", + "ar": "لايوجد نتائج" + }, + + "no-booked-appointment": { + "en": "No booked appointments", + "ar": "لا يوجد مواعيد محجوزة" + }, + "no-confirmed-appointment": { + "en": "No confirmed appointments", + "ar": "لا توجد مواعيد مؤكدة" + }, + "no-arrived-appointment": { + "en": "No arrived appointments", + "ar": "لا يوجد مواعيد" + }, + "upcoming-empty": { + "en": "You do not have any Todo actions yet.", + "ar": "ليس لديك أي إجراءات الآن." + }, + "upcoming-timeLeft": { + "en": "time left for appointment", + "ar": "الوقت المتبقي للموعد" + }, + }; diff --git a/lib/core/viewModels/dashboard_view_model.dart b/lib/core/viewModels/dashboard_view_model.dart index 4cf22b23..e98ca341 100644 --- a/lib/core/viewModels/dashboard_view_model.dart +++ b/lib/core/viewModels/dashboard_view_model.dart @@ -1,14 +1,20 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; + import '../../locator.dart'; class DashboardViewModel extends BaseViewModel { VitalSignService _vitalSignService = locator(); - String get weightKg => _vitalSignService.weightKg; - String get heightCm => _vitalSignService.heightCm; + + String get weightKg => _vitalSignService.weightKg; + + String get heightCm => _vitalSignService.heightCm; String bloadType = ""; + // ToDoCountProviderModel toDoProvider = + // Provider.of(AppGlobal.context); + getPatientRadOrders() async { if (isLogin && _vitalSignService.weightKg.isEmpty) { setState(ViewState.Busy); @@ -17,7 +23,21 @@ class DashboardViewModel extends BaseViewModel { error = _vitalSignService.error; setState(ViewState.Error); } else - setState(ViewState.Idle); + setState(ViewState.Idle); + // getToDoCount(); } } + +// getToDoCount() { +// toDoProvider.setState(0); +// ClinicListService service = new ClinicListService(); +// service.getActiveAppointmentNo(AppGlobal.context).then((res) { +// print(res['AppointmentActiveNumber']); +// if (res['MessageStatus'] == 1) { +// toDoProvider.setState(res['AppointmentActiveNumber']); +// } else {} +// }).catchError((err) { +// print(err); +// }); +// } } diff --git a/lib/pages/Blood/blood_donation.dart b/lib/pages/Blood/blood_donation.dart index 99e5242e..ad1d8785 100644 --- a/lib/pages/Blood/blood_donation.dart +++ b/lib/pages/Blood/blood_donation.dart @@ -27,7 +27,6 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:giffy_dialog/giffy_dialog.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; //import '../../../core/model/my_balance/AdvanceModel.dart'; import 'confirm_payment_page.dart'; diff --git a/lib/pages/Blood/confirm_payment_page.dart b/lib/pages/Blood/confirm_payment_page.dart index 9ad6d68f..75282190 100644 --- a/lib/pages/Blood/confirm_payment_page.dart +++ b/lib/pages/Blood/confirm_payment_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart'; +import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; @@ -10,6 +11,7 @@ import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; @@ -18,7 +20,6 @@ import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'dialogs/ConfirmSMSDialog.dart'; import 'new_text_Field.dart'; @@ -159,16 +160,16 @@ class ConfirmPaymentPage extends StatelessWidget { label: TranslationBase.of(context).confirm.toUpperCase(), disabled: model.state == ViewState.Busy, onTap: () { + GifLoaderDialogUtils.showMyDialog(context); model .sendActivationCodeForAdvancePayment( patientID: int.parse(advanceModel.fileNumber), projectID: advanceModel.hospitalsModel.iD) .then((value) { + GifLoaderDialogUtils.hideDialog(context); if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) showSMSDialog(); - }).showProgressBar( - text: "Loading", - backgroundColor: Colors.blue.withOpacity(0.6)); + }); }, ), ), @@ -248,12 +249,14 @@ class ConfirmPaymentPage extends StatelessWidget { checkPaymentStatus(AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(AppGlobal.context); service .checkPaymentStatus( Utils.getAppointmentTransID( appo.projectID, appo.clinicID, appo.appointmentNo), AppGlobal.context) .then((res) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); print("Printing Payment Status Reponse!!!!"); print(res); String paymentInfo = res['Response_Message']; @@ -263,18 +266,21 @@ class ConfirmPaymentPage extends StatelessWidget { AppToast.showErrorToast(message: res['Response_Message']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } createAdvancePayment(res, AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); String paymentReference = res['Fort_id'].toString(); + GifLoaderDialogUtils.showMyDialog(AppGlobal.context); service .createAdvancePayment(appo, appo.projectID.toString(), res['Amount'], res['Fort_id'], res['PaymentMethod'], AppGlobal.context) .then((res) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); print(res['OnlineCheckInAppointments'][0]['AdvanceNumber']); addAdvancedNumberRequest( res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(), @@ -282,24 +288,28 @@ class ConfirmPaymentPage extends StatelessWidget { appo.appointmentNo.toString(), appo); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } addAdvancedNumberRequest(String advanceNumber, String paymentReference, String appointmentID, AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(AppGlobal.context); service .addAdvancedNumberRequest( advanceNumber, paymentReference, appointmentID, AppGlobal.context) .then((res) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); print(res); navigateToHome(AppGlobal.context); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(AppGlobal.context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Future navigateToHome(context) async { diff --git a/lib/pages/Blood/dialogs/ConfirmSMSDialog.dart b/lib/pages/Blood/dialogs/ConfirmSMSDialog.dart index d165a895..e08d2f28 100644 --- a/lib/pages/Blood/dialogs/ConfirmSMSDialog.dart +++ b/lib/pages/Blood/dialogs/ConfirmSMSDialog.dart @@ -8,13 +8,13 @@ import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobi import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class ConfirmSMSDialog extends StatefulWidget { final String phoneNumber; @@ -112,32 +112,31 @@ class _ConfirmSMSDialogState extends State { height: 40, color: Theme.of(context).primaryColor, child: Stack( - children: [ Center( - child: Texts( - 'SMS', - color: Colors.white, - textAlign: TextAlign.center, - ), - ), - Positioned(child: Container( - child: InkWell( - onTap: () => Navigator.pop(context), - child: Container( - decoration: BoxDecoration( - shape: BoxShape.circle, color: Colors.white), - child: Icon( - Icons.clear, - color: Colors.grey[900], - )), + child: Texts( + 'SMS', + color: Colors.white, + textAlign: TextAlign.center, ), ), - left: projectViewModel.isArabic? 2:0, - right: projectViewModel.isArabic? 0:2, + Positioned( + child: Container( + child: InkWell( + onTap: () => Navigator.pop(context), + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, color: Colors.white), + child: Icon( + Icons.clear, + color: Colors.grey[900], + )), + ), + ), + left: projectViewModel.isArabic ? 2 : 0, + right: projectViewModel.isArabic ? 0 : 2, ) ], - ), ), Image.asset( @@ -334,15 +333,14 @@ class _ConfirmSMSDialogState extends State { } void submit(MyBalanceViewModel model) { + GifLoaderDialogUtils.showMyDialog(context); if (verifyAccountForm.currentState.validate()) { final activationCode = digit1.text + digit2.text + digit3.text + digit4.text; model .checkActivationCodeForAdvancePayment(activationCode: activationCode) - .then((value) {}) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) .then((value) { + GifLoaderDialogUtils.hideDialog(context); Navigator.pop(context, true); }); } diff --git a/lib/pages/BookAppointment/BookConfirm.dart b/lib/pages/BookAppointment/BookConfirm.dart index fa69d913..ed0f5bf1 100644 --- a/lib/pages/BookAppointment/BookConfirm.dart +++ b/lib/pages/BookAppointment/BookConfirm.dart @@ -2,9 +2,11 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart'; +import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; +import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -15,7 +17,6 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:rating_bar/rating_bar.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'BookSuccess.dart'; @@ -38,11 +39,15 @@ class BookConfirm extends StatefulWidget { PatientShareResponse patientShareResponse; AuthenticatedUser authUser; + @override _BookConfirmState createState() => _BookConfirmState(); } class _BookConfirmState extends State { + + ToDoCountProviderModel toDoProvider; + @override void initState() { widget.authUser = new AuthenticatedUser(); @@ -471,9 +476,10 @@ class _BookConfirmState extends State { AppToast.showSuccessToast(message: "Appointment Booked Successfully"); print(res['AppointmentNo']); - Future.delayed(new Duration(milliseconds: 1800), () { + Future.delayed(new Duration(milliseconds: 500), () { getLiveCareAppointmentPatientShare(context, res['AppointmentNo'], docObject.clinicID, docObject.projectID, docObject); + getToDoCount(); }); } else { GifLoaderDialogUtils.hideDialog(context); @@ -499,10 +505,23 @@ class _BookConfirmState extends State { dialog.showAlertDialog(context); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); + } + + getToDoCount() { + toDoProvider.setState(0); + ClinicListService service = new ClinicListService(); + service.getActiveAppointmentNo(context).then((res) { + print(res['AppointmentActiveNumber']); + if (res['MessageStatus'] == 1) { + toDoProvider.setState(res['AppointmentActiveNumber']); + } else {} + }).catchError((err) { + print(err); + }); } getPatientShare(context, String appointmentNo, int clinicID, int projectID, diff --git a/lib/pages/BookAppointment/BookSuccess.dart b/lib/pages/BookAppointment/BookSuccess.dart index 92e6bc9e..70a5b1fb 100644 --- a/lib/pages/BookAppointment/BookSuccess.dart +++ b/lib/pages/BookAppointment/BookSuccess.dart @@ -14,7 +14,6 @@ import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'QRCode.dart'; @@ -349,36 +348,37 @@ class _BookSuccessState extends State { confirmAppointment(AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service .confirmAppointment(appo.appointmentNo, appo.clinicID, appo.projectID, appo.isLiveCareAppointment, context) .then((res) { - if (res['MessageStatus'] == 1) { - AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); - } else { - AppToast.showErrorToast(message: res['ErrorEndUserMessage']); - } - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - if (appo.isLiveCareAppointment) { - insertLiveCareVIDARequest(appo); - } else { - navigateToHome(context); - } - }); + GifLoaderDialogUtils.hideDialog(context); + if (res['MessageStatus'] == 1) { + AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); + if (appo.isLiveCareAppointment) { + insertLiveCareVIDARequest(appo); + } else { + navigateToHome(context); + } + } else { + AppToast.showErrorToast(message: res['ErrorEndUserMessage']); + } + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } insertLiveCareVIDARequest(AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service .insertVIDARequest(appo.appointmentNo, appo.clinicID, appo.projectID, appo.serviceID, appo.doctorID, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); navigateToHome(context); @@ -386,9 +386,10 @@ class _BookSuccessState extends State { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Widget _getPayNowAppo() { @@ -633,6 +634,7 @@ class _BookSuccessState extends State { } getApplePayAPQ(AppoitmentAllHistoryResultList appo) { + GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); service .checkPaymentStatus( @@ -640,6 +642,7 @@ class _BookSuccessState extends State { appo.projectID, appo.clinicID, appo.appointmentNo), context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); print("Printing Payment Status Reponse!!!!"); print(res); String paymentInfo = res['Response_Message']; @@ -649,9 +652,10 @@ class _BookSuccessState extends State { AppToast.showErrorToast(message: res['Response_Message']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } createAdvancePayment(res, AppoitmentAllHistoryResultList appo) { diff --git a/lib/pages/BookAppointment/BookingOptions.dart b/lib/pages/BookAppointment/BookingOptions.dart index 83af454f..b90c3b34 100644 --- a/lib/pages/BookAppointment/BookingOptions.dart +++ b/lib/pages/BookAppointment/BookingOptions.dart @@ -52,11 +52,10 @@ class _BookingOptionsState extends State { children: [ Expanded( child: CardCommon( - image: 'assets/images/new-design/search_by_clinic.png', - text: TranslationBase.of(context).clinic, - subText: TranslationBase.of(context).name, - type: 0, - ), + image: 'assets/images/new-design/search_by_clinic.png', + text: TranslationBase.of(context).clinic, + subText: TranslationBase.of(context).name, + type: 0), ), Expanded( child: CardCommon( diff --git a/lib/pages/BookAppointment/DentalComplaints.dart b/lib/pages/BookAppointment/DentalComplaints.dart index 34a7e1e1..043eaff1 100644 --- a/lib/pages/BookAppointment/DentalComplaints.dart +++ b/lib/pages/BookAppointment/DentalComplaints.dart @@ -2,12 +2,13 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/models/Appointments/DentalChiefComplaintsModel.dart'; import 'package:diplomaticquarterapp/models/Appointments/SearchInfoModel.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DentalComplaintCard.dart'; -import 'package:diplomaticquarterapp/pages/livecare/widgets/clinic_card.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class DentalComplaints extends StatefulWidget { SearchInfo searchInfo; @@ -35,7 +36,8 @@ class _DentalComplaintsState extends State { Widget build(BuildContext context) { return AppScaffold( isShowAppBar: true, - appBarTitle: "Symptoms", + appBarTitle: TranslationBase.of(context).dentalComplaints, + isShowDecPage: false, body: Container( margin: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 0.0), child: ListView.builder( @@ -59,12 +61,14 @@ class _DentalComplaintsState extends State { } getChiefComplaintsList() { + GifLoaderDialogUtils.showMyDialog(context); getLanguageID(); ClinicListService service = new ClinicListService(); service .getChiefComplaintsList( widget.searchInfo.ClinicID, widget.searchInfo.ProjectID, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { print(res['List_DentalChiefComplain']); setState(() { @@ -73,10 +77,13 @@ class _DentalComplaintsState extends State { }); print(complaintsList.length); }); - } else {} + } else { + + } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index 94386465..20e4ae09 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -275,209 +275,214 @@ class _DoctorProfileState extends State child: Opacity( opacity: a1.value, child: Dialog( - child: Container( - height: 400.0, - width: MediaQuery.of(context).size.width * 0.8, - color: Colors.white, - child: Column( - children: [ - Container( - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - color: Theme.of(context).primaryColor, - margin: EdgeInsets.only(bottom: 5.0), - padding: EdgeInsets.all(10.0), - child: Text(TranslationBase.of(context).doctorRating, - style: TextStyle( - fontSize: 22.0, color: Colors.white))), - Container( - margin: EdgeInsets.only(top: 0.0), - child: Text( - this - .widget - .doctor - .actualDoctorRate - .ceilToDouble() - .toString(), - style: TextStyle( - fontSize: 32.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 5.0), - alignment: Alignment.center, - child: RatingBar.readOnly( - initialRating: - this.widget.doctor.actualDoctorRate.toDouble(), - size: 35.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text( - this.widget.doctor.noOfPatientsRate.toString() + - " " + - TranslationBase.of(context).reviews, - style: TextStyle( - fontSize: 14.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Row( - children: [ - Container( - width: 100.0, - margin: EdgeInsets.only( - top: 10.0, left: 15.0, right: 15.0), - child: Text( - TranslationBase.of(context).excellent, - style: TextStyle( - fontSize: 13.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 10.0), - child: SizedBox( - width: getRatingWidth( - doctorDetailsList[0].patientNumber), - height: 6.0, - child: Container( - color: Colors.green[700], - ), - ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + // height: 400.0, + width: MediaQuery.of(context).size.width * 0.8, + color: Colors.white, + child: Column( + children: [ + Container( + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + color: Theme.of(context).primaryColor, + margin: EdgeInsets.only(bottom: 5.0), + padding: EdgeInsets.all(10.0), + child: Text(TranslationBase.of(context).doctorRating, + style: TextStyle( + fontSize: 22.0, color: Colors.white))), + Container( + margin: EdgeInsets.only(top: 0.0), + child: Text( + this + .widget + .doctor + .actualDoctorRate + .ceilToDouble() + .toString(), + style: TextStyle( + fontSize: 32.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: RatingBar.readOnly( + initialRating: + this.widget.doctor.actualDoctorRate.toDouble(), + size: 35.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, ), - ], - ), - ), - Container( - child: Row( - children: [ - Container( - width: 100.0, - margin: EdgeInsets.only( - top: 10.0, left: 15.0, right: 15.0), - child: Text(TranslationBase.of(context).v_good, - style: TextStyle( - fontSize: 13.0, color: Colors.black))), - Container( + ), + Container( margin: EdgeInsets.only(top: 10.0), - child: SizedBox( - width: getRatingWidth( - doctorDetailsList[1].patientNumber), - height: 6.0, - child: Container( - color: Color(0xffB7B723), + child: Text( + this.widget.doctor.noOfPatientsRate.toString() + + " " + + TranslationBase.of(context).reviews, + style: TextStyle( + fontSize: 14.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text( + TranslationBase.of(context).excellent, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[0].patientNumber), + height: 6.0, + child: Container( + color: Colors.green[700], + ), + ), ), - ), + ], ), - ], - ), - ), - Container( - child: Row( - children: [ - Container( - width: 100.0, - margin: EdgeInsets.only( - top: 10.0, left: 15.0, right: 15.0), - child: Text(TranslationBase.of(context).good, - style: TextStyle( - fontSize: 13.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 10.0), - child: SizedBox( - width: getRatingWidth( - doctorDetailsList[2].patientNumber), - height: 6.0, - child: Container( - color: Color(0xffEBA727), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).v_good, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[1].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffB7B723), + ), + ), ), - ), + ], ), - ], - ), - ), - Container( - child: Row( - children: [ - Container( - width: 100.0, - margin: EdgeInsets.only( - top: 10.0, left: 15.0, right: 15.0), - child: Text(TranslationBase.of(context).average, - style: TextStyle( - fontSize: 13.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 10.0), - child: SizedBox( - width: getRatingWidth( - doctorDetailsList[3].patientNumber), - height: 6.0, - child: Container( - color: Color(0xffEB7227), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).good, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[2].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffEBA727), + ), + ), ), - ), + ], ), - ], - ), - ), - Container( - child: Row( - children: [ - Container( - width: 100.0, - margin: EdgeInsets.only( - top: 10.0, left: 15.0, right: 15.0), - child: Text( - TranslationBase.of(context).below_average, - style: TextStyle( - fontSize: 13.0, color: Colors.black))), - Container( - margin: EdgeInsets.only(top: 10.0), - child: SizedBox( - width: getRatingWidth( - doctorDetailsList[4].patientNumber), - height: 6.0, - child: Container( - color: Color(0xffE20C0C), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text(TranslationBase.of(context).average, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[3].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffEB7227), + ), + ), ), - ), + ], ), - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 40.0), child: Divider()), - Container( - margin: EdgeInsets.only(top: 0.0), - child: Align( - alignment: FractionalOffset.bottomCenter, - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + ), + Container( + child: Row( + children: [ + Container( + width: 100.0, + margin: EdgeInsets.only( + top: 10.0, left: 15.0, right: 15.0), + child: Text( + TranslationBase.of(context).below_average, + style: TextStyle( + fontSize: 13.0, color: Colors.black))), + Container( + margin: EdgeInsets.only(top: 10.0), + child: SizedBox( + width: getRatingWidth( + doctorDetailsList[4].patientNumber), + height: 6.0, + child: Container( + color: Color(0xffE20C0C), + ), + ), + ), + ], ), - minWidth: MediaQuery.of(context).size.width, - height: 40.0, - child: RaisedButton( - elevation: 0.0, - color: Colors.white, - textColor: Colors.red, - hoverColor: Colors.transparent, - focusColor: Colors.transparent, - highlightColor: Colors.transparent, - disabledColor: new Color(0xFFbcc2c4), - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text(TranslationBase.of(context).cancel, - style: TextStyle(fontSize: 18.0)), + ), + Container( + margin: EdgeInsets.only(top: 40.0), child: Divider()), + Container( + margin: EdgeInsets.only(top: 0.0), + child: Align( + alignment: FractionalOffset.bottomCenter, + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + minWidth: MediaQuery.of(context).size.width, + height: 40.0, + child: RaisedButton( + elevation: 0.0, + color: Colors.white, + textColor: Colors.red, + hoverColor: Colors.transparent, + focusColor: Colors.transparent, + highlightColor: Colors.transparent, + disabledColor: new Color(0xFFbcc2c4), + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(TranslationBase.of(context).cancel, + style: TextStyle(fontSize: 18.0)), + ), + ), ), ), - ), + ], ), - ], - ), + ), + ], ), ), ), @@ -491,10 +496,7 @@ class _DoctorProfileState extends State } double getRatingWidth(int patientNumber) { - print(patientNumber); - print(this.widget.doctor.noOfPatientsRate); var width = (patientNumber / this.widget.doctor.noOfPatientsRate) * 100; - print(width); return width; } diff --git a/lib/pages/BookAppointment/QRCode.dart b/lib/pages/BookAppointment/QRCode.dart index e92c2348..487d1be7 100644 --- a/lib/pages/BookAppointment/QRCode.dart +++ b/lib/pages/BookAppointment/QRCode.dart @@ -10,11 +10,11 @@ import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsLis import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class QRCode extends StatefulWidget { PatientShareResponse patientShareResponse; @@ -235,6 +235,7 @@ class _QRCodeState extends State { okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () { + GifLoaderDialogUtils.showMyDialog(context); service .sendAppointmentQREmail( widget.authUser.emailAddress, @@ -247,15 +248,15 @@ class _QRCodeState extends State { widget.patientShareResponse.doctorSpeciality), context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res); ConfirmDialog.closeAlertDialog(context); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); ConfirmDialog.closeAlertDialog(context); AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", - backgroundColor: Colors.blue.withOpacity(0.6)); + }); }, cancelFunction: () => {}); dialog.showAlertDialog(context); diff --git a/lib/pages/BookAppointment/Search.dart b/lib/pages/BookAppointment/Search.dart index 095d72a6..44cf46c3 100644 --- a/lib/pages/BookAppointment/Search.dart +++ b/lib/pages/BookAppointment/Search.dart @@ -1,18 +1,16 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByClinic.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByDoctor.dart'; -import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/arrow_back.dart'; -import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; import 'package:flutter/material.dart'; -import 'package:geolocator/geolocator.dart'; class Search extends StatefulWidget { final int type; final List clnicIds; + Search({this.type = 0, this.clnicIds}); + @override _SearchState createState() => _SearchState(); } diff --git a/lib/pages/BookAppointment/SearchResults.dart b/lib/pages/BookAppointment/SearchResults.dart index 055b0c41..72226c2e 100644 --- a/lib/pages/BookAppointment/SearchResults.dart +++ b/lib/pages/BookAppointment/SearchResults.dart @@ -27,6 +27,7 @@ class _SearchResultsState extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).bookAppo, isShowAppBar: true, + isShowDecPage: false, body: Container( margin: EdgeInsets.all(10.0), child: SingleChildScrollView( diff --git a/lib/pages/BookAppointment/components/SearchByClinic.dart b/lib/pages/BookAppointment/components/SearchByClinic.dart index 7943e423..355bb52b 100644 --- a/lib/pages/BookAppointment/components/SearchByClinic.dart +++ b/lib/pages/BookAppointment/components/SearchByClinic.dart @@ -13,7 +13,6 @@ import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class SearchByClinic extends StatefulWidget { final List clnicIds; @@ -137,7 +136,8 @@ class _SearchByClinicState extends State { margin: EdgeInsets.only(top: 15.0), child: DropdownButtonHideUnderline( child: DropdownButton( - hint: new Text("Select Project"), + hint: + new Text(TranslationBase.of(context).selectHospital), value: projectDropdownValue, items: projectsList.map((item) { return new DropdownMenuItem( diff --git a/lib/pages/BookAppointment/components/SearchByDoctor.dart b/lib/pages/BookAppointment/components/SearchByDoctor.dart index 1e1945b5..8d2b9387 100644 --- a/lib/pages/BookAppointment/components/SearchByDoctor.dart +++ b/lib/pages/BookAppointment/components/SearchByDoctor.dart @@ -4,7 +4,6 @@ import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import '../SearchResults.dart'; @@ -129,9 +128,12 @@ class _SearchByDoctorState extends State { navigateToSearchResults( context, doctorsList, _patientDoctorAppointmentListHospital); } else { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); }); } diff --git a/lib/pages/BookAppointment/widgets/CardCommon.dart b/lib/pages/BookAppointment/widgets/CardCommon.dart index e56ba965..6a7e2bdd 100644 --- a/lib/pages/BookAppointment/widgets/CardCommon.dart +++ b/lib/pages/BookAppointment/widgets/CardCommon.dart @@ -1,12 +1,16 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class CardCommon extends StatelessWidget { + var languageID; final image; final text; final subText; final type; - const CardCommon( + + CardCommon( {@required this.image, @required this.text, @required this.subText, @@ -14,6 +18,7 @@ class CardCommon extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return GestureDetector( onTap: () { navigateToSearch(context, this.type); @@ -43,8 +48,12 @@ class CardCommon extends StatelessWidget { color: Colors.black, letterSpacing: 1.0, fontSize: 15.0)), ), Container( - alignment: Alignment.bottomRight, - margin: EdgeInsets.fromLTRB(0.0, 0.0, 10.0, 8.0), + alignment: projectViewModel.isArabic + ? Alignment.bottomLeft + : Alignment.bottomRight, + margin: projectViewModel.isArabic + ? EdgeInsets.fromLTRB(10.0, 0.0, 00.0, 8.0) + : EdgeInsets.fromLTRB(0.0, 0.0, 10.0, 8.0), child: Image.asset(this.image, width: 60.0, height: 60.0), ), ], diff --git a/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart b/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart index 27f37d0a..eb434cad 100644 --- a/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart +++ b/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart @@ -3,8 +3,9 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; // ignore: must_be_immutable class DentalComplaintCard extends StatefulWidget { @@ -69,14 +70,15 @@ class _DentalComplaintCardState extends State { List doctorsList = []; List _patientDoctorAppointmentListHospital = List(); - + GifLoaderDialogUtils.showMyDialog(context); ClinicListService service = new ClinicListService(); service .getChiefComplaintDoctorList(widget.listDentalChiefComplain.iD, widget.listDentalChiefComplain.projectID, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { - print(res['List_DentalDoctorChiefComplaintMapping']); + print(res['ErrorEndUserMessage']); setState(() { doctorsList.clear(); res['List_DentalDoctorChiefComplaintMapping'].forEach((v) { @@ -107,16 +109,21 @@ class _DentalComplaintCardState extends State { patientDoctorAppointment: element)); } }); - navigateToSearchResults( - context, doctorsList, _patientDoctorAppointmentListHospital); + if (doctorsList.length != 0) { + navigateToSearchResults( + context, doctorsList, _patientDoctorAppointmentListHospital); + } else { + AppToast.showErrorToast(message: TranslationBase.of(context).emptyResult); + } }); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Future navigateToSearchResults( diff --git a/lib/pages/BookAppointment/widgets/DoctorView.dart b/lib/pages/BookAppointment/widgets/DoctorView.dart index d419e4af..bd4fb429 100644 --- a/lib/pages/BookAppointment/widgets/DoctorView.dart +++ b/lib/pages/BookAppointment/widgets/DoctorView.dart @@ -6,7 +6,6 @@ import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:flutter/material.dart'; import 'package:rating_bar/rating_bar.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import '../DoctorProfile.dart'; diff --git a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart index 3e58b657..8375e337 100644 --- a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart +++ b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart @@ -9,13 +9,13 @@ import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.da import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:intl/intl.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:table_calendar/table_calendar.dart'; class CovidTimeSlots extends StatefulWidget { @@ -481,6 +481,7 @@ class _CovidTimeSlotsState extends State insertAppointmentCovidTest(context, DoctorList docObject) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); AppoitmentAllHistoryResultList appo; service .insertAppointment( @@ -491,7 +492,7 @@ class _CovidTimeSlotsState extends State CovidTimeSlots.selectedDate, context) .then((res) { - print(res); + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { AppToast.showSuccessToast(message: "Appointment Booked Successfully"); Future.delayed(new Duration(milliseconds: 1800), () { @@ -521,17 +522,19 @@ class _CovidTimeSlotsState extends State dialog.showAlertDialog(context); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } cancelAppointment(DoctorList docObject, AppoitmentAllHistoryResultList appo, BuildContext context) { ConfirmDialog.closeAlertDialog(context); + GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); service.cancelAppointment(appo, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { Future.delayed(new Duration(milliseconds: 1500), () { insertAppointmentCovidTest(context, docObject); @@ -540,28 +543,27 @@ class _CovidTimeSlotsState extends State AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } getPatientShare(context, String appointmentNo, int clinicID, int projectID, DoctorList docObject) { + GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); service .getPatientShare(appointmentNo, clinicID, projectID, context) .then((res) { - print(res); - widget.patientShareResponse = new PatientShareResponse.fromJson(res); - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - navigateToPaymentAlert(); - }); + GifLoaderDialogUtils.hideDialog(context); + widget.patientShareResponse = new PatientShareResponse.fromJson(res); + navigateToPaymentAlert(); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } navigateToPaymentAlert() { @@ -573,8 +575,10 @@ class _CovidTimeSlotsState extends State } getCovidFreeSlots(BuildContext context, int projectID) { + GifLoaderDialogUtils.showMyDialog(context); CovidDriveThruService service = new CovidDriveThruService(); service.getCovidFreeSlots(context, projectID).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res['COVID19_FreeTimeSlots']); if (res['MessageStatus'] == 1) { if (res['COVID19_FreeTimeSlots'].length != 0) { @@ -595,8 +599,9 @@ class _CovidTimeSlotsState extends State AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart index 0563c4bd..245bcbaf 100644 --- a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart +++ b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart @@ -3,11 +3,12 @@ import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCe import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-payment-details.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:maps_launcher/maps_launcher.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class CovidDrivethruLocation extends StatefulWidget { @override @@ -258,37 +259,38 @@ class _CovidDrivethruLocationState extends State { CovidPaymentInfoResponse covidPaymentInfoResponse = new CovidPaymentInfoResponse(); + GifLoaderDialogUtils.showMyDialog(context); + service .getCovidPaymentInformation(context, int.parse(projectID)) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { covidPaymentInfoResponse = CovidPaymentInfoResponse.fromJson( res['COVID19_PatientShare']); - print(covidPaymentInfoResponse.procedureNameField); }); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CovidPaymentDetails( + covidPaymentInfoResponse: covidPaymentInfoResponse, + projectID: int.parse(projectID), + ))); } else {} }) .catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CovidPaymentDetails( - covidPaymentInfoResponse: covidPaymentInfoResponse, - projectID: int.parse(projectID), - ))); }); } getProjectsList(BuildContext context) { CovidDriveThruService service = new CovidDriveThruService(); + GifLoaderDialogUtils.showMyDialog(context); service.getCovidProjectsList(context).then((res) { - print(res); + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { print(res); setState(() { @@ -298,8 +300,9 @@ class _CovidDrivethruLocationState extends State { }); } else {} }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index 7b7dc1da..aa3b72ae 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -47,10 +47,19 @@ class _MyAppointmentsState extends State void initState() { _tabController = new TabController(length: 3, vsync: this); WidgetsBinding.instance.addPostFrameCallback((_) { - if (Provider.of(context, listen: false).isLogin) getPatientAppointmentHistory(); + if (Provider.of(context, listen: false).isLogin) + getPatientAppointmentHistory(); }); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/1.png')); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/0.png')); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/1.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/1.png')); super.initState(); } @@ -108,14 +117,14 @@ class _MyAppointmentsState extends State if (res['MessageStatus'] == 1) { GifLoaderDialogUtils.hideDialog(context); setState(() { + isDataLoaded = true; if (res['AppoimentAllHistoryResultList'].length != 0) { + isDataLoaded = true; res['AppoimentAllHistoryResultList'].forEach((v) { widget.appoList .add(new AppoitmentAllHistoryResultList.fromJson(v)); }); sortAppointmentList(); - openAppointmentsTab(); - isDataLoaded = true; } else {} }); } else { @@ -224,6 +233,7 @@ class _MyAppointmentsState extends State filterName: element.clinicName, patientDoctorAppointment: element)); } + openAppointmentsTab(); }); } @@ -290,7 +300,7 @@ class _MyAppointmentsState extends State "assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: Text("No Booked Appointments", + child: Text(TranslationBase.of(context).noBookedAppo, style: TextStyle( fontSize: 16.0, )), @@ -345,8 +355,7 @@ class _MyAppointmentsState extends State Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: Text( - TranslationBase.of(context).noConfirmedAppointments, + child: Text(TranslationBase.of(context).noConfirmedAppo, style: TextStyle( fontSize: 16.0, )), @@ -400,11 +409,10 @@ class _MyAppointmentsState extends State Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: - Text(TranslationBase.of(context).noArrivedAppointments, - style: TextStyle( - fontSize: 16.0, - )), + child: Text(TranslationBase.of(context).noArrivedAppo, + style: TextStyle( + fontSize: 16.0, + )), ), ], ), diff --git a/lib/pages/MyAppointments/VisitTicket.dart b/lib/pages/MyAppointments/VisitTicket.dart index 54dcf13f..6f1dbdf8 100644 --- a/lib/pages/MyAppointments/VisitTicket.dart +++ b/lib/pages/MyAppointments/VisitTicket.dart @@ -2,11 +2,11 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class VisitTicket extends StatefulWidget { List appoList = []; @@ -48,9 +48,10 @@ class _VisitTicketState extends State { } getPatientAppointmentCurfewHistory(BuildContext context) { - loading(true); DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service.getPatientAppointmentHistory(true, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res['AppoimentAllHistoryResultList']); if (res['MessageStatus'] == 1) { setState(() { @@ -61,20 +62,13 @@ class _VisitTicketState extends State { }); } else {} }); - loading(false); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); - loading(false); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - loading(false); - }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); - } - - loading(bool flag) { - setState(() { - isLoading = flag; }); } } diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index 93069f1e..ce312a8d 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -1,7 +1,9 @@ import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report_enh.dart'; import 'package:diplomaticquarterapp/core/model/radiology/final_radiology.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Appointments/appoDetailsButtons.dart'; +import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/AppointmentType.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/ArrivedButtons.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/AskDocRequestTypeModel.dart'; @@ -17,6 +19,7 @@ import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.d import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_details_page.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; +import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -24,6 +27,7 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class AppointmentActions extends StatefulWidget { @@ -44,16 +48,22 @@ class AppointmentActions extends StatefulWidget { class _AppointmentActionsState extends State { List appoButtonsList = []; + ToDoCountProviderModel toDoProvider; + @override void initState() { + toDoProvider = Provider.of(context); _getAppointmentActionButtons(); super.initState(); } @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); var size = MediaQuery.of(context).size; - final double itemHeight = ((size.height - kToolbarHeight - 24) * 0.455) / 2; + final double itemHeight = projectViewModel.isArabic + ? ((size.height - kToolbarHeight - 24) * 0.47) / 2 + : ((size.height - kToolbarHeight - 24) * 0.4) / 2; final double itemWidth = size.width / 2; return Container( @@ -72,51 +82,62 @@ class _AppointmentActionsState extends State { onTap: () { _handleButtonClicks(e); }, - child: Container( - // height: 100.0, - margin: EdgeInsets.all(7.0), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey[400], - blurRadius: 2.0, - spreadRadius: 0.0) - ], - borderRadius: BorderRadius.circular(10), - color: Colors.white), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Container( - margin: - EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 0.0), - child: Text(e.title, - overflow: TextOverflow.clip, - style: TextStyle( - color: new Color(0xFF40ACC9), - letterSpacing: 1.0, - fontSize: 18.0)), - ), - Container( - margin: - EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0), - child: Text(e.subtitle, - overflow: TextOverflow.clip, - style: TextStyle( - color: Colors.black, - letterSpacing: 1.0, - fontSize: 15.0)), - ), - Container( - alignment: Alignment.bottomRight, - margin: - EdgeInsets.fromLTRB(0.0, 10.0, 10.0, 7.0), - child: Image.asset(e.icon, - width: 40.0, height: 40.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + // height: 100.0, + margin: EdgeInsets.all(7.0), + padding: EdgeInsets.only(bottom: 15.0), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey[400], + blurRadius: 2.0, + spreadRadius: 0.0) + ], + borderRadius: BorderRadius.circular(10), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: + EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 0.0), + child: Text(e.title, + overflow: TextOverflow.clip, + style: TextStyle( + color: new Color(0xFF40ACC9), + letterSpacing: 1.0, + fontSize: 18.0)), + ), + Container( + margin: + EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0), + child: Text(e.subtitle, + overflow: TextOverflow.clip, + style: TextStyle( + color: Colors.black, + letterSpacing: 1.0, + fontSize: 15.0)), + ), + Container( + alignment: projectViewModel.isArabic + ? Alignment.bottomLeft + : Alignment.bottomRight, + margin: projectViewModel.isArabic + ? EdgeInsets.fromLTRB( + 10.0, 7.0, 0.0, 8.0) + : EdgeInsets.fromLTRB( + 0.0, 7.0, 10.0, 8.0), + child: Image.asset(e.icon, + width: 45.0, height: 45.0), + ), + ], ), - ], - ), + ), + ], ), )) .toList(), @@ -357,6 +378,7 @@ class _AppointmentActionsState extends State { GifLoaderDialogUtils.hideDialog(context); print(res); if (res['MessageStatus'] == 1) { + getToDoCount(); AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); Navigator.of(context).pop(); } else { @@ -368,6 +390,19 @@ class _AppointmentActionsState extends State { }); } + getToDoCount() { + toDoProvider.setState(0); + ClinicListService service = new ClinicListService(); + service.getActiveAppointmentNo(context).then((res) { + print(res['AppointmentActiveNumber']); + if (res['MessageStatus'] == 1) { + toDoProvider.setState(res['AppointmentActiveNumber']); + } else {} + }).catchError((err) { + print(err); + }); + } + openAppointmentRadiology() { GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); diff --git a/lib/pages/MyAppointments/widgets/PrescriptionReport.dart b/lib/pages/MyAppointments/widgets/PrescriptionReport.dart index 932211ba..213e28e1 100644 --- a/lib/pages/MyAppointments/widgets/PrescriptionReport.dart +++ b/lib/pages/MyAppointments/widgets/PrescriptionReport.dart @@ -4,7 +4,7 @@ import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResu import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_details_page.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -16,7 +16,10 @@ class PrescriptionReportPage extends StatefulWidget { dynamic listPres; AppoitmentAllHistoryResultList appo; - PrescriptionReportPage({@required this.prescriptionReportEnhList, @required this.listPres, @required this.appo}); + PrescriptionReportPage( + {@required this.prescriptionReportEnhList, + @required this.listPres, + @required this.appo}); @override _PrescriptionReportState createState() => _PrescriptionReportState(); @@ -113,12 +116,18 @@ class _PrescriptionReportState extends State { sendPrescriptionReportEmail() { DoctorsListService service = new DoctorsListService(); - service.sendPrescriptionEmail(widget.appo.appointmentDate, widget.appo.setupID, widget.listPres, context).then((res) { + GifLoaderDialogUtils.showMyDialog(context); + service + .sendPrescriptionEmail(widget.appo.appointmentDate, widget.appo.setupID, + widget.listPres, context) + .then((res) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showSuccessToast(message: 'A copy has been sent to the e-mail'); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); print(err); AppToast.showErrorToast(message: err); - }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } navigateToPrescriptionDetails(PrescriptionReportEnh prescriptionReportEnh) { diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 18da37e8..fb8990b2 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -19,6 +19,8 @@ import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_countdown_timer/current_remaining_time.dart'; +import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:rating_bar/rating_bar.dart'; @@ -208,6 +210,22 @@ class _ToDoState extends State { ), ], ), + Container( + child: CountdownTimer( + endTime: DateTime.now().millisecondsSinceEpoch + + (widget.appoList[index] + .remaniningHoursTocanPay * + 1000) * + 60, + widgetBuilder: (_, CurrentRemainingTime time) { + return Text( + '${time.days}:${time.hours}:${time.min}:${time.sec} ' + TranslationBase.of(context).upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color(0xff40ACC9))); + }, + ), + ), ], ), ), @@ -503,6 +521,7 @@ class _ToDoState extends State { widget.appoList.forEach((element) { print(element.isLiveCareAppointment); print(element.nextAction); + print(element.remaniningHoursTocanPay); }); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index fbdaf906..008887ca 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -191,7 +191,7 @@ class _HomePageState extends State { ) : Container( width: double.infinity, - height: projectViewModel.isArabic ? 180 : 150, + height: projectViewModel.isArabic ? 180 : 160, decoration: BoxDecoration( color: Theme.of(context).primaryColor, shape: BoxShape.rectangle, diff --git a/lib/pages/livecare/livecare_home.dart b/lib/pages/livecare/livecare_home.dart index fc5c4eab..3243b269 100644 --- a/lib/pages/livecare/livecare_home.dart +++ b/lib/pages/livecare/livecare_home.dart @@ -3,12 +3,11 @@ import 'package:diplomaticquarterapp/pages/livecare/widgets/LiveCarePendingReque import 'package:diplomaticquarterapp/pages/livecare/widgets/clinic_list.dart'; import 'package:diplomaticquarterapp/pages/livecare/widgets/livecare_logs.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; - -import 'livecare_type_select.dart'; class LiveCareHome extends StatefulWidget { static bool showFooterButton = true; @@ -93,40 +92,37 @@ class _LiveCareHomeState extends State hasLiveCareRequest = false; }); LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); PatientERVirtualHistoryResponse patientERVirtualHistoryResponse = new PatientERVirtualHistoryResponse(); - service - .getLivecareHistory(context) - .then((res) { - setState(() { - print(res['ErRequestHistoryList'].length); - if (res['ErRequestHistoryList'].length != 0) { - patientERVirtualHistoryResponse = - PatientERVirtualHistoryResponse.fromJson(res); - erRequestHistoryList = - patientERVirtualHistoryResponse.erRequestHistoryList; + service.getLivecareHistory(context).then((res) { + GifLoaderDialogUtils.hideDialog(context); + setState(() { + print(res['ErRequestHistoryList'].length); + if (res['ErRequestHistoryList'].length != 0) { + patientERVirtualHistoryResponse = + PatientERVirtualHistoryResponse.fromJson(res); + erRequestHistoryList = + patientERVirtualHistoryResponse.erRequestHistoryList; - if (patientERVirtualHistoryResponse - .erRequestHistoryList[0].callStatus < - 4) { - pendingERRequestHistoryList = - patientERVirtualHistoryResponse.erRequestHistoryList[0]; - hasLiveCareRequest = true; - } else { - hasLiveCareRequest = false; - } - } - }); - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - setState(() { - isDataLoaded = true; - }); - }); + if (patientERVirtualHistoryResponse + .erRequestHistoryList[0].callStatus < + 4) { + pendingERRequestHistoryList = + patientERVirtualHistoryResponse.erRequestHistoryList[0]; + hasLiveCareRequest = true; + } else { + hasLiveCareRequest = false; + } + } + }); + setState(() { + isDataLoaded = true; + }); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } } diff --git a/lib/pages/livecare/widgets/LiveCareHistoryCard.dart b/lib/pages/livecare/widgets/LiveCareHistoryCard.dart index 25ec8514..e80f79ee 100644 --- a/lib/pages/livecare/widgets/LiveCareHistoryCard.dart +++ b/lib/pages/livecare/widgets/LiveCareHistoryCard.dart @@ -5,11 +5,11 @@ import 'package:diplomaticquarterapp/pages/feedback/feedback_home_page.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class LiveCareHistoryCard extends StatefulWidget { ErRequestHistoryList erRequestHistoryList; @@ -177,6 +177,7 @@ class _LiveCareHistoryCardState extends State { sendInvoiceEmail(context) { ConfirmDialog.closeAlertDialog(context); LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service .sendLiveCareInvoiceEmail( widget.erRequestHistoryList.appointmentNo.toString(), @@ -184,12 +185,13 @@ class _LiveCareHistoryCardState extends State { authUser.emailAddress, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showSuccessToast(message: "LiveCare invoice sent successfully"); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } getAuthenticatedUser() async { diff --git a/lib/pages/livecare/widgets/LiveCarePendingRequest.dart b/lib/pages/livecare/widgets/LiveCarePendingRequest.dart index bfd42e62..7ce39804 100644 --- a/lib/pages/livecare/widgets/LiveCarePendingRequest.dart +++ b/lib/pages/livecare/widgets/LiveCarePendingRequest.dart @@ -3,9 +3,9 @@ import 'package:diplomaticquarterapp/models/FamilyFiles/PatientERVirtualHistoryR import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class LiveCarePendingRequest extends StatefulWidget { ErRequestHistoryList pendingERRequestHistoryList; @@ -149,19 +149,19 @@ class _LiveCarePendingRequestState extends State { cancelLiveCareRequest() { LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service .cancelLiveCareRequest(widget.pendingERRequestHistoryList.vCID, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showSuccessToast( message: "LiveCare request cancelled successfully"); + widget.getLiveCareHistory(); }) .catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - widget.getLiveCareHistory(); }); } } diff --git a/lib/pages/livecare/widgets/clinic_card.dart b/lib/pages/livecare/widgets/clinic_card.dart index 56613034..410b7170 100644 --- a/lib/pages/livecare/widgets/clinic_card.dart +++ b/lib/pages/livecare/widgets/clinic_card.dart @@ -2,8 +2,8 @@ import 'package:diplomaticquarterapp/models/LiveCare/ClinicsServiceTimingsRespon import 'package:diplomaticquarterapp/models/LiveCare/LiveCareClinicsListResponse.dart'; import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'ClinicTimingsDialog.dart'; @@ -90,9 +90,11 @@ class _State extends State { getClinicTimings(PatientERGetClinicsList patientERGetClinicsList) { LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service .getLivecareClinicTiming(patientERGetClinicsList.serviceID, context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { clinicsServiceTimingsResponse = @@ -129,8 +131,9 @@ class _State extends State { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/livecare/widgets/clinic_list.dart b/lib/pages/livecare/widgets/clinic_list.dart index 8ce3b7b0..fc27d92b 100644 --- a/lib/pages/livecare/widgets/clinic_list.dart +++ b/lib/pages/livecare/widgets/clinic_list.dart @@ -17,13 +17,13 @@ import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart' import 'package:diplomaticquarterapp/services/livecare_services/livecare_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class ClinicList extends StatefulWidget { final Function getLiveCareHistory; @@ -79,31 +79,27 @@ class _clinic_listState extends State { void startLiveCare() { bool isError = false; LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); ERAppointmentFeesResponse erAppointmentFeesResponse = new ERAppointmentFeesResponse(); - service - .getERAppointmentFees(selectedClinicID, context) - .then((res) { - if (res['HasAppointment'] == true) { - isError = true; - showLiveCareCancelDialog(res['ErrorEndUserMessage'], res); - } else { - erAppointmentFeesResponse = ERAppointmentFeesResponse.fromJson(res); - isError = false; - } - }) - .catchError((err) { - print(err); - isError = true; - AppToast.showErrorToast(message: err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - if (!isError) - getERAppointmentTime( - erAppointmentFeesResponse.getERAppointmentFeesList); - }); + service.getERAppointmentFees(selectedClinicID, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); + if (res['HasAppointment'] == true) { + isError = true; + showLiveCareCancelDialog(res['ErrorEndUserMessage'], res); + } else { + erAppointmentFeesResponse = ERAppointmentFeesResponse.fromJson(res); + isError = false; + } + if (!isError) + getERAppointmentTime( + erAppointmentFeesResponse.getERAppointmentFeesList); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + print(err); + isError = true; + AppToast.showErrorToast(message: err); + }); } showLiveCareCancelDialog(String msg, res) { @@ -112,8 +108,7 @@ class _clinic_listState extends State { confirmMessage: msg, okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, - okFunction: () => - {cancelAppointment(res)}, + okFunction: () => {cancelAppointment(res)}, cancelFunction: () => {}); dialog.showAlertDialog(context); } @@ -132,38 +127,37 @@ class _clinic_listState extends State { appo.appointmentDate = res['AppointmentDate']; ConfirmDialog.closeAlertDialog(context); + GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); - service - .cancelAppointment(appo, context) - .then((res) { - print(res); - if (res['MessageStatus'] == 1) { - AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); - } else { - AppToast.showErrorToast(message: res['ErrorEndUserMessage']); - } - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - startLiveCare(); - }); + service.cancelAppointment(appo, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); + print(res); + if (res['MessageStatus'] == 1) { + AppToast.showSuccessToast(message: res['ErrorEndUserMessage']); + startLiveCare(); + } else { + AppToast.showErrorToast(message: res['ErrorEndUserMessage']); + } + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } getERAppointmentTime(GetERAppointmentFeesList getERAppointmentFeesList) { LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service.getERAppointmentTime(selectedClinicID, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res); showLiveCarePaymentDialog( getERAppointmentFeesList, res['WatingtimeInteger']); }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); print(err); AppToast.showErrorToast(message: err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } showLiveCarePaymentDialog( @@ -320,12 +314,14 @@ class _clinic_listState extends State { checkPaymentStatus(AppoitmentAllHistoryResultList appo) { DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service .checkPaymentStatus( Utils.getAppointmentTransID( appo.projectID, appo.clinicID, appo.appointmentNo), context) .then((res) { + GifLoaderDialogUtils.hideDialog(context); print("Printing Payment Status Reponse!!!!"); print(res); String paymentInfo = res['Response_Message']; @@ -336,27 +332,27 @@ class _clinic_listState extends State { AppToast.showErrorToast(message: res['Response_Message']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } addNewCallForPatientER(String clientRequestID) { LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service .addNewCallForPatientER(selectedClinicID, clientRequestID, context) .then((res) { - AppToast.showSuccessToast( - message: "New Call has been added successfully"); - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - widget.getLiveCareHistory(); - }); + GifLoaderDialogUtils.hideDialog(context); + AppToast.showSuccessToast( + message: "New Call has been added successfully"); + widget.getLiveCareHistory(); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } getLanguageID() async { @@ -366,7 +362,9 @@ class _clinic_listState extends State { getLiveCareClinicsList() { isDataLoaded = false; LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service.getLivecareClinics(context).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res['PatientER_GetClinicsList'].length); if (res['MessageStatus'] == 1) { setState(() { @@ -384,15 +382,18 @@ class _clinic_listState extends State { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } getLiveCareScheduleClinicsList() { isDataLoaded = false; LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); service.getLiveCareScheduledClinics(context).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res['ClinicsHaveScheduleList'].length); if (res['MessageStatus'] == 1) { setState(() { @@ -411,9 +412,10 @@ class _clinic_listState extends State { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } openLiveCareSelectionDialog() { @@ -605,13 +607,13 @@ class _clinic_listState extends State { void startScheduleLiveCare() { List doctorsList = []; LiveCareService service = new LiveCareService(); + GifLoaderDialogUtils.showMyDialog(context); List _patientDoctorAppointmentListHospital = List(); service .getLiveCareScheduledDoctorList(context, selectedClinicID) .then((res) { - print(res['DoctorByClinicIDList']); - print(res['DoctorByClinicIDList'].length); + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { if (res['DoctorByClinicIDList'].length != 0) { @@ -650,9 +652,10 @@ class _clinic_listState extends State { context, doctorsList, _patientDoctorAppointmentListHospital); } else {} }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Future navigateToSearchResults( diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index a1540ef7..db4ba713 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -20,13 +20,11 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class Login extends StatefulWidget { @override @@ -93,23 +91,24 @@ class _Login extends State { onNumberChange: (value) => {mobileNo = value, validateForm()}, onCountryChange: (value) => countryCode = value), - Directionality( - textDirection:TextDirection.ltr,child:Container( - child: TextFields( - fontWeight: FontWeight.normal, - controller: nationalIDorFile, - onChanged: (value) => {validateForm()}, - prefixIcon: Icon( - loginType == 1 - ? Icons.chrome_reader_mode - : Icons.receipt, - color: Color(0xFF40ACC9)), - padding: EdgeInsets.only( - top: 20, bottom: 20, left: 10, right: 10), - hintText: loginType == 1 - ? TranslationBase.of(context).nationalID - : TranslationBase.of(context).fileNo, - ))) + Directionality( + textDirection: TextDirection.ltr, + child: Container( + child: TextFields( + fontWeight: FontWeight.normal, + controller: nationalIDorFile, + onChanged: (value) => {validateForm()}, + prefixIcon: Icon( + loginType == 1 + ? Icons.chrome_reader_mode + : Icons.receipt, + color: Color(0xFF40ACC9)), + padding: EdgeInsets.only( + top: 20, bottom: 20, left: 10, right: 10), + hintText: loginType == 1 + ? TranslationBase.of(context).nationalID + : TranslationBase.of(context).fileNo, + ))) ], ), ), @@ -122,7 +121,9 @@ class _Login extends State { color: Colors.grey, height: 2, ), - SizedBox(height: 10,), + SizedBox( + height: 10, + ), Row( children: [ Expanded( @@ -209,15 +210,13 @@ class _Login extends State { okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () => { - ConfirmDialog.closeAlertDialog(context), + ConfirmDialog.closeAlertDialog(context), Navigator.of(context).pushNamed( REGISTER, ), - }, cancelFunction: () => {ConfirmDialog.closeAlertDialog(context)}); dialog.showAlertDialog(context); - }); // SMSOTP.showLoadingDialog(context, false), } @@ -244,9 +243,9 @@ class _Login extends State { this.authService.checkActivationCode(request, code).then((result) => { sharedPref.remove(FAMILY_FILE), result = CheckActivationCode.fromJson(result), - result.list.isFamily =false, - this.sharedPref.setObject(USER_PROFILE, result.list), - this.sharedPref.setObject(MAIN_USER, result.list), + result.list.isFamily = false, + this.sharedPref.setObject(USER_PROFILE, result.list), + this.sharedPref.setObject(MAIN_USER, result.list), this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID), this.sharedPref.setString(TOKEN, result.authenticationTokenID), authenticatedUserObject.getUser(), diff --git a/lib/pages/medical/ask_doctor/ask_doctor_page.dart b/lib/pages/medical/ask_doctor/ask_doctor_page.dart index 6beed0dc..e6172b7a 100644 --- a/lib/pages/medical/ask_doctor/ask_doctor_page.dart +++ b/lib/pages/medical/ask_doctor/ask_doctor_page.dart @@ -1,7 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; -import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/ask_doctor/request_type.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; @@ -12,7 +10,6 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rating_bar/rating_bar.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class AskDoctorPage extends StatelessWidget { @override diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 9f3cda72..85a0cc8f 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -11,6 +11,7 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/dialogs/SelectHospitalDialog.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; @@ -19,7 +20,6 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import '../../../core/model/my_balance/AdvanceModel.dart'; import 'confirm_payment_page.dart'; @@ -56,7 +56,11 @@ class _AdvancePaymentPageState extends State { void initState() { super.initState(); getAuthUser(); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png')); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png')); } @override @@ -107,13 +111,13 @@ class _AdvancePaymentPageState extends State { if (beneficiaryType == BeneficiaryType.MyFamilyFiles) InkWell( onTap: () { + GifLoaderDialogUtils.showMyDialog(context); model.getFamilyFiles().then((value) { + GifLoaderDialogUtils.hideDialog(context); confirmSelectFamilyDialog(model .getAllSharedRecordsByStatusResponse .getAllSharedRecordsByStatusList); - }).showProgressBar( - text: "Loading", - backgroundColor: Colors.blue.withOpacity(0.6)); + }); }, child: Container( padding: EdgeInsets.all(12), @@ -145,17 +149,16 @@ class _AdvancePaymentPageState extends State { if (beneficiaryType == BeneficiaryType.OtherAccount) InkWell( onTap: () { - if (_fileTextController.text.isNotEmpty) + if (_fileTextController.text.isNotEmpty) { + GifLoaderDialogUtils.showMyDialog(context); model .getPatientInfoByPatientID( id: _fileTextController.text) .then((value) { + GifLoaderDialogUtils.hideDialog(context); confirmSelectPatientDialog(model.patientInfoList); - }).showProgressBar( - text: "Loading", - backgroundColor: - Colors.blue.withOpacity(0.6)); - else + }); + } else AppToast.showErrorToast( message: 'Please Enter The File Number'); }, @@ -268,10 +271,11 @@ class _AdvancePaymentPageState extends State { advanceModel.amount = amount; advanceModel.mobileNumber = mobileNum; advanceModel.patientName = patientName; - + GifLoaderDialogUtils.showMyDialog(context); model .getPatientInfoByPatientIDAndMobileNumber(advanceModel) .then((value) { + GifLoaderDialogUtils.hideDialog(context); if (model.state != ViewState.Error && model.state != ViewState.ErrorLocal) { Utils.hideKeyboard(context); @@ -295,9 +299,7 @@ class _AdvancePaymentPageState extends State { }, ); } - }).showProgressBar( - text: "Loading", - backgroundColor: Colors.blue.withOpacity(0.6)); + }); }, ), )), diff --git a/lib/pages/medical/balance/confirm_payment_page.dart b/lib/pages/medical/balance/confirm_payment_page.dart index 4954653d..679a16db 100644 --- a/lib/pages/medical/balance/confirm_payment_page.dart +++ b/lib/pages/medical/balance/confirm_payment_page.dart @@ -19,7 +19,6 @@ import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'dialogs/ConfirmSMSDialog.dart'; import 'new_text_Field.dart'; @@ -165,16 +164,16 @@ class ConfirmPaymentPage extends StatelessWidget { label: TranslationBase.of(context).confirm.toUpperCase(), disabled: model.state == ViewState.Busy, onTap: () { + GifLoaderDialogUtils.showMyDialog(context); model .sendActivationCodeForAdvancePayment( patientID: int.parse(advanceModel.fileNumber), projectID: advanceModel.hospitalsModel.iD) .then((value) { + GifLoaderDialogUtils.hideDialog(context); if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) showSMSDialog(); - }).showProgressBar( - text: "Loading", - backgroundColor: Colors.blue.withOpacity(0.6)); + }); }, ), ), diff --git a/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart b/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart index eb0c1675..20217ca9 100644 --- a/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart +++ b/lib/pages/medical/smart_watch_health_data/smart_watch_instructions.dart @@ -3,9 +3,9 @@ import 'dart:io'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:diplomaticquarterapp/pages/medical/smart_watch_health_data/health_data_list.dart'; import 'package:diplomaticquarterapp/services/smartwatch_integration/SmartWatchIntegrationService.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:url_launcher/url_launcher.dart'; class SmartWatchInstructions extends StatefulWidget { @@ -796,7 +796,9 @@ class _SmartWatchInstructionsState extends State { getLastPatientRecord(BuildContext context) { SmartWatchIntegrationService service = new SmartWatchIntegrationService(); + GifLoaderDialogUtils.showMyDialog(context); service.getLastPatientRecord(context).then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { print(res['Med_GetPatientLastRecordList']); setState(() { @@ -807,9 +809,9 @@ class _SmartWatchInstructionsState extends State { }); } else {} }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } _openHealthDataList() { diff --git a/lib/uitl/location_util.dart b/lib/uitl/location_util.dart index 1c85d898..5c2d3a3c 100644 --- a/lib/uitl/location_util.dart +++ b/lib/uitl/location_util.dart @@ -58,8 +58,8 @@ class LocationUtils { void setLocation(Position position) { print(position); - this.sharedPref.setDouble(USER_LAT, position.latitude); - this.sharedPref.setDouble(USER_LONG, position.longitude); + this.sharedPref.setDouble(USER_LAT, position.latitude ?? 0.0); + this.sharedPref.setDouble(USER_LONG, position.longitude ?? 0.0); } void setZeroLocation() { diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2cb521d9..d8db692d 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -911,6 +911,14 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get infoMyAppointments => localizedValues['info-my-appointments'][locale.languageCode]; String get infoTodo => localizedValues['info-todo'][locale.languageCode]; String get familyInfo => localizedValues['family-info'][locale.languageCode]; + String get dentalComplaints => localizedValues['dental-complains'][locale.languageCode]; + String get emptyResult => localizedValues['empty-result'][locale.languageCode]; + + String get noBookedAppo => localizedValues['no-booked-appointment'][locale.languageCode]; + String get noConfirmedAppo => localizedValues['no-confirmed-appointment'][locale.languageCode]; + String get noArrivedAppo => localizedValues['no-arrived-appointment'][locale.languageCode]; + String get upcomingEmpty => localizedValues['upcoming-empty'][locale.languageCode]; + String get upcomingTimeLeft => localizedValues['upcoming-timeLeft'][locale.languageCode]; } diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 21cbebba..1ae7b684 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -10,8 +10,9 @@ import 'bottom_navigation_item.dart'; class BottomNavBar extends StatefulWidget { final ValueChanged changeIndex; - final int index ; - BottomNavBar({Key key, this.changeIndex,this.index}) : super(key: key); + final int index; + + BottomNavBar({Key key, this.changeIndex, this.index}) : super(key: key); @override _BottomNavBarState createState() => _BottomNavBarState(); @@ -52,29 +53,28 @@ class _BottomNavBarState extends State { currentIndex: 1, name: TranslationBase.of(context).medicalProfile, ), - if(widget.index == 0) - Expanded( - child: SizedBox( - height: 50, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox(height: 22), - ], - ), - ), - ), - if(widget.index != 0) - BottomNavigationItem( - icon: EvaIcons.calendar, - activeIcon: EvaIcons.calendar, - changeIndex: _changeIndex, - index: _index, - currentIndex: 2, - name: TranslationBase.of(context).bookAppo, - ), - + if (widget.index == 0) + Expanded( + child: SizedBox( + height: 50, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 22), + ], + ), + ), + ), + if (widget.index != 0) + BottomNavigationItem( + icon: EvaIcons.calendar, + activeIcon: EvaIcons.calendar, + changeIndex: _changeIndex, + index: _index, + currentIndex: 2, + name: TranslationBase.of(context).bookAppo, + ), BottomNavigationItem( icon: DQIcons.family, activeIcon: DQIcons.family, diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index a45cba96..cc77d17d 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -17,7 +17,6 @@ import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../config/size_config.dart'; diff --git a/lib/widgets/others/bottom_bar.dart b/lib/widgets/others/bottom_bar.dart index 4de9efdf..71381a18 100644 --- a/lib/widgets/others/bottom_bar.dart +++ b/lib/widgets/others/bottom_bar.dart @@ -1,53 +1,41 @@ import 'dart:collection'; -import 'dart:convert'; +import 'dart:math'; import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/DoctorProfile.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; import 'package:diplomaticquarterapp/pages/ErService/NearestEr.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/MyAppointments.dart'; +import 'package:diplomaticquarterapp/pages/feedback/feedback_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/medical/doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/labs/labs_home_page.dart'; -import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; -import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/pages/medical/patient_sick_leave_page.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; +import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; -import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_tts/flutter_tts.dart'; -import 'package:hexcolor/hexcolor.dart'; import 'package:permission_handler/permission_handler.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_to_text.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; -import 'dart:math'; -import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; -import 'package:diplomaticquarterapp/routes.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; -import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; -import 'package:diplomaticquarterapp/pages/feedback/feedback_home_page.dart'; class BottomBarSearch extends StatefulWidget { @override @@ -76,6 +64,7 @@ class _SearchBot extends State { bool _isInit = true; TextEditingController searchController = TextEditingController(); + @override void initState() { requestPermissions(); @@ -432,10 +421,12 @@ class _SearchBot extends State { List arr = []; List arrDistance = []; DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service .getDoctorsList(clinicId, projectId, false, context, doctorId: doctorId, doctorName: doctorName) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { if (res['SearchDoctorsByTime_IsVoiceCommandList'] != null && @@ -483,9 +474,10 @@ class _SearchBot extends State { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Future navigateToDoctorProfile(context, docObject, docProfile, diff --git a/lib/widgets/others/floating_button_search.dart b/lib/widgets/others/floating_button_search.dart index 2bfacaea..2d1f9109 100644 --- a/lib/widgets/others/floating_button_search.dart +++ b/lib/widgets/others/floating_button_search.dart @@ -40,6 +40,7 @@ import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; @@ -55,7 +56,6 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/DoctorProfile.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:flutter/cupertino.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:url_launcher/url_launcher.dart'; class FloatingSearchButton extends StatefulWidget { @@ -734,10 +734,12 @@ class _FloatingSearchButton extends State List arr = []; List arrDistance = []; DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); service .getDoctorsList(clinicId, projectId, isNearest, context, doctorId: doctorId, doctorName: doctorName) .then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { if (res['SearchDoctorsByTime_IsVoiceCommandList'] != null && @@ -785,9 +787,10 @@ class _FloatingSearchButton extends State AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } Future navigateToDoctorProfile(context, docObject, docProfile, diff --git a/pubspec.yaml b/pubspec.yaml index 5bd52d75..7941c492 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -106,8 +106,6 @@ dependencies: #Circular progress bar for reverse timer circular_countdown_timer: ^0.0.5 - smart_progress_bar: ^0.1.6 - #Just Audio to play ringing for incoming video call just_audio: ^0.3.4 @@ -138,11 +136,14 @@ dependencies: device_calendar: ^3.1.0 #Handle Geolocation - geolocator: ^6.0.0+1 + geolocator: ^6.1.10 screen: ^0.0.5 #google maps places google_maps_place_picker: ^1.0.0 + + #countdown timer for Upcoming List + flutter_countdown_timer: ^1.4.0 #Dependencies for video call implementation native_device_orientation: ^0.3.0 From 4e2c955b09da41b93c4b15fc2f32350c4f69cd50 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 6 Dec 2020 17:42:44 +0200 Subject: [PATCH 62/69] add missing translation --- ios/Flutter/.last_build_id | 2 +- lib/config/localized_values.dart | 99 ++++++++++++++++++- .../all_habib_medical_service_page.dart | 22 +++-- lib/pages/ContactUs/findus/findus_page.dart | 7 +- .../insurance/insurance_approval_screen.dart | 62 ++++++------ .../medical/balance/my_balance_page.dart | 9 +- .../medical/reports/report_home_page.dart | 12 +-- lib/pages/paymentService/payment_service.dart | 4 +- lib/uitl/translations_delegate_base.dart | 24 +++++ 9 files changed, 179 insertions(+), 62 deletions(-) diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index b5ed87ba..6bca0336 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -a30437b5671472a3d6a8672edcfc504b \ No newline at end of file +f4a819c27119d0f472892c1088ad1ca3 \ No newline at end of file diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index e6be280b..044f5573 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -522,11 +522,11 @@ const Map localizedValues = { "PaymentOnline": {"en": "Service", "ar": "الالكتروني"}, "OnlineCheckIn": {"en": "Online Check-In", "ar": "مدفوعات معلقة"}, "MyBalances": {"en": "My Balances", "ar": "رصيدي"}, - "BalanceAmount": {"en": "Balance Amount", "ar": "رصيدالحساب"}, - "TotalBalance": {"en": "Total Balance", "ar": "الرصيد الكلي"}, + "BalanceAmount": { "en": "Wallet Amount", "ar": "مبلغ المحفظة"}, + "TotalBalance": { "en": "Total Amount", "ar": "المبلغ الإجمالي"}, "CreateAdvancedPayment": { - "en": "Create Advanced Payment", - "ar": "إنشاء دفعة مقدمة" + "en": "Recharge Wallet", + "ar": "إعادة شحن المحفظة" }, "AdvancePayment": {"en": "Advance Payment", "ar": "الدفع مقدما"}, "AdvancePaymentLabel": { @@ -1044,5 +1044,96 @@ const Map localizedValues = { "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." + }, + "covid-test-all-services": { + "en": "Covid-19 Drive-Thru Test", + "ar": "فحص كورونا من داخل السيارة" + }, + "pharmacy": { + "en": "Pharmacy", + "ar": "الصيدلية" + }, + "ereferral": { + "en": "E-Referral", + "ar": "طلب التحويل" + }, + "child-vaccine": { + "en": "Child Vaccines", + "ar": "تطعيمات الأطفال" + }, + "calculators": { + "en": "Health Calculators", + "ar": "الحاسبات الصحية" + }, + "converters": { + "en": "Health Converter", + "ar": "تحويل القياسات" + }, + "h2o": { + "en": "Water Tracker", + "ar": "حساب كمية الماء" + }, + "v-tour": { + "en": "Virtual Tour", + "ar": "جولة إفتراضية" + }, + "hmg-news": { + "en": "HMG News", + "ar": "أخبار المجموعة" + }, + "blood-d": { + "en": "Blood Donation", + "ar": "تبرع بالدم" + }, + "symptomCheckerTitle": { + "en": "Symptom Checker", + "ar": "مدقق الأعراض" + }, + "latest-news": { + "en": "Latest News", + "ar": "أحدث الأخبار" + }, + "our-location": { + "en": "Our Locations", + "ar": "موقعنا" + }, + "pharmacies": { + "en": "Pharmacies", + "ar": "الصيدليات" + }, + "hospitals": { + "en": "Hospitals", + "ar": "المستشفيات" + }, + "wallet": { + "en": "Wallet", + "ar": "محفظة نقود" + }, + "hmg": { + "en": "Al Habib", + "ar": "الحبيب" + }, + + "requested": { + "en": "Requested", + "ar": "مطلوب" + }, + "ready": { + "en": "Ready", + "ar": "جاهز" + }, + "completed": { + "en": "Completed", + "ar": "مكتمل" + }, + "cancelled": { + "en": "Cancelled", + "ar": "ملغى" + }, + + "request-medical-report": { + "en": "Request medical report", + "ar": "طلب تقرير طبي" } + }; diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index 6c03f6ba..316a2437 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -48,6 +48,7 @@ class _AllHabibMedicalServiceState extends State { AuthenticatedUser authUser = new AuthenticatedUser(); LocationUtils locationUtils; var weather = '--'; + @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { @@ -201,7 +202,7 @@ class _AllHabibMedicalServiceState extends State { ), imageLocation: 'assets/images/new-design/family_menu_icon_red.png', - title: 'My Family', + title: TranslationBase.of(context).family, ), ServicesContainer( onTap: () => Navigator.push( @@ -230,20 +231,23 @@ class _AllHabibMedicalServiceState extends State { "https://hmgwebservices.com/vt_mobile/html/index.html"), imageLocation: 'assets/images/new-design/virtual_tour_icon.png', - title: 'Virtual Tour', + title: TranslationBase.of(context).vTour, ), ServicesContainer( onTap: () { - Navigator.of(context).push(MaterialPageRoute( + Navigator.of(context).push( + MaterialPageRoute( builder: (BuildContext context) => MyWebView( - title: "HMG News", - selectedUrl: - "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", - ))); + title: TranslationBase.of(context).hmgNews, + selectedUrl: + "https://twitter.com/hashtag/مجموعة_د_سليمان_الحبيب_الطبية?src=hashtag_click&f=live", + ), + ), + ); }, imageLocation: 'assets/images/new-design/twitter_dashboard_icon.png', - title: 'Latest News', + title: TranslationBase.of(context).latestNews, ), ServicesContainer( onTap: () => Navigator.push( @@ -253,7 +257,7 @@ class _AllHabibMedicalServiceState extends State { ), ), imageLocation: 'assets/images/new-design/find_us_icon.png', - title: 'Find Us', + title: TranslationBase.of(context).findUs, ), ], ), diff --git a/lib/pages/ContactUs/findus/findus_page.dart b/lib/pages/ContactUs/findus/findus_page.dart index 807ac1c7..f920de9f 100644 --- a/lib/pages/ContactUs/findus/findus_page.dart +++ b/lib/pages/ContactUs/findus/findus_page.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/viewModels/contactus/findus_view_model import 'package:diplomaticquarterapp/pages/ContactUs/findus/hospitrals_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/pharmacies_page.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -39,7 +40,7 @@ class _FindUsPageState extends State builder: (_, model, w) => AppScaffold( isShowAppBar: true, isShowDecPage: false, - appBarTitle: 'Locations', + appBarTitle: TranslationBase.of(context).ourLocation, baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, @@ -90,13 +91,13 @@ class _FindUsPageState extends State Container( width: MediaQuery.of(context).size.width * 0.30, child: Center( - child: Texts(' Hospitals '), + child: Texts(TranslationBase.of(context).hospitals), ), ), Container( width: MediaQuery.of(context).size.width * 0.30, child: Center( - child: Texts(' Pharmacies '), + child: Texts(TranslationBase.of(context).pharmacies), ), ), ], diff --git a/lib/pages/insurance/insurance_approval_screen.dart b/lib/pages/insurance/insurance_approval_screen.dart index b62c2b43..d21e06a5 100644 --- a/lib/pages/insurance/insurance_approval_screen.dart +++ b/lib/pages/insurance/insurance_approval_screen.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/rounded_container.dart'; import 'package:flutter/cupertino.dart'; @@ -20,10 +21,19 @@ class InsuranceApproval extends StatefulWidget { class _InsuranceApprovalState extends State { List imagesInfo = List(); + @override Widget build(BuildContext context) { - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/1.png')); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/0.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/0.png')); + imagesInfo.add(ImagesInfo( + imageEn: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/1.png', + imageAr: + 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/1.png')); return BaseView( onModelReady: widget.appointmentNo != null ? (model) => @@ -63,10 +73,10 @@ class _InsuranceApprovalState extends State { ), if (model.insuranceApproval.length > 0) Container( - width: SizeConfig.widthMultiplier * 18.0, - height: SizeConfig.heightMultiplier * 2.8, + width: 60, + height: 35, decoration: BoxDecoration( - color: Color(0xffC5272D), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(19.0)), child: Center( child: Text( @@ -92,29 +102,21 @@ class _InsuranceApprovalState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - model.insuranceApproval[index] - .patientDescription == - "In Patient" + model.insuranceApproval[index].patientDescription == "In Patient" ? Container( decoration: BoxDecoration( - color: Color(0xffB8372C), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular( 16.0)), - width: 95.0, + width: 115.0, padding: EdgeInsets.only(left: 11.5), - child: Text( - model.insuranceApproval[index] - .patientDescription == - null - ? '' - : model - .insuranceApproval[ - index] - .patientDescription, - style: TextStyle( - color: Colors.white), + child: Center( + child: Texts( + TranslationBase.of(context).inPatient, + color: Colors.white, + ), ), ) : Container( @@ -123,20 +125,14 @@ class _InsuranceApprovalState extends State { borderRadius: BorderRadius.circular( 16.0)), - width: 95.0, + width: 115.0, padding: EdgeInsets.only(left: 11.5), - child: Text( - model.insuranceApproval[index] - .patientDescription == - null - ? '' - : model - .insuranceApproval[ - index] - .patientDescription, - style: TextStyle( - color: Colors.white), + child: Center( + child: Texts( + TranslationBase.of(context).outpatient, + color: Colors.white, + ), ), ), Padding( diff --git a/lib/pages/medical/balance/my_balance_page.dart b/lib/pages/medical/balance/my_balance_page.dart index e6bc6352..2fb8c51c 100644 --- a/lib/pages/medical/balance/my_balance_page.dart +++ b/lib/pages/medical/balance/my_balance_page.dart @@ -57,7 +57,7 @@ class MyBalancePage extends StatelessWidget { color: Colors.white, ), Texts( - '${model.totalAdvanceBalanceAmount ?? 0} SAR', + '${model.totalAdvanceBalanceAmount ?? 0} '+ TranslationBase.of(context).sar, color: Colors.white, bold: true, ), @@ -81,12 +81,13 @@ class MyBalancePage extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(model.patientAdvanceBalanceAmountList[index] - .projectDescription), + Texts( - '${model.patientAdvanceBalanceAmountList[index].patientAdvanceBalanceAmount} SAR', + '${model.patientAdvanceBalanceAmountList[index].patientAdvanceBalanceAmount} '+TranslationBase.of(context).sar, bold: true, ), + Texts(model.patientAdvanceBalanceAmountList[index] + .projectDescription), ], ), ), diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 2bf6d1b8..636d4e00 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -86,32 +86,32 @@ class _HomeReportPageState extends State controller: _tabController, indicatorWeight: 5.0, indicatorSize: TabBarIndicatorSize.label, - indicatorColor: Colors.red[800], + indicatorColor: Theme.of(context).primaryColor, labelColor: Theme.of(context).primaryColor, unselectedLabelColor: Colors.grey[800], tabs: [ Container( width: MediaQuery.of(context).size.width * 0.22, child: Center( - child: Texts('Requested'), + child: Texts(TranslationBase.of(context).requested), ), ), Container( width: MediaQuery.of(context).size.width * 0.22, child: Center( - child: Texts('Ready'), + child: Texts(TranslationBase.of(context).ready), ), ), Container( width: MediaQuery.of(context).size.width * 0.22, child: Center( - child: Texts('Completed'), + child: Texts(TranslationBase.of(context).completed), ), ), Container( width: MediaQuery.of(context).size.width * 0.22, child: Center( - child: Texts('Cancelled'), + child: Texts(TranslationBase.of(context).cancelled), ), ), ], @@ -152,7 +152,7 @@ class _HomeReportPageState extends State height: 90, margin: EdgeInsets.all(8.0), child: Button( - label: 'Resend order & deliver', + label: TranslationBase.of(context).requestMedicalReport, backgroundColor: Colors.grey[800], onTap: () => Navigator.push( context, diff --git a/lib/pages/paymentService/payment_service.dart b/lib/pages/paymentService/payment_service.dart index c31981f7..cc2fd7ca 100644 --- a/lib/pages/paymentService/payment_service.dart +++ b/lib/pages/paymentService/payment_service.dart @@ -115,12 +115,12 @@ class PaymentService extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - 'My Balances', + TranslationBase.of(context).hmg, color: HexColor('#B61422'), bold: true, ), Texts( - TranslationBase.of(context).payment, + TranslationBase.of(context).wallet, fontSize: 14, fontWeight: FontWeight.normal, ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2cb521d9..f14c456d 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -912,6 +912,30 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get infoTodo => localizedValues['info-todo'][locale.languageCode]; String get familyInfo => localizedValues['family-info'][locale.languageCode]; + String get covidTestAllServices => localizedValues['covid-test-all-services'][locale.languageCode]; + String get pharmacy => localizedValues['pharmacy'][locale.languageCode]; + String get ereferral => localizedValues['ereferral'][locale.languageCode]; + String get childVaccine => localizedValues['child-vaccine'][locale.languageCode]; + String get calculators => localizedValues['calculators'][locale.languageCode]; + String get converters => localizedValues['converters'][locale.languageCode]; + String get h2o => localizedValues['h2o'][locale.languageCode]; + String get vTour => localizedValues['v-tour'][locale.languageCode]; + String get hmgNews => localizedValues['hmg-news'][locale.languageCode]; + String get bloodD => localizedValues['blood-d'][locale.languageCode]; + String get symptomCheckerTitle => localizedValues['symptomCheckerTitle'][locale.languageCode]; + String get latestNews => localizedValues['latest-news'][locale.languageCode]; + String get ourLocation => localizedValues['our-location'][locale.languageCode]; + String get pharmacies => localizedValues['pharmacies'][locale.languageCode]; + String get hospitals => localizedValues['hospitals'][locale.languageCode]; + String get wallet => localizedValues['wallet'][locale.languageCode]; + String get hmg => localizedValues['hmg'][locale.languageCode]; + String get requested => localizedValues['requested'][locale.languageCode]; + String get ready => localizedValues['ready'][locale.languageCode]; + String get completed => localizedValues['completed'][locale.languageCode]; + String get cancelled => localizedValues['cancelled'][locale.languageCode]; + String get requestMedicalReport => localizedValues['request-medical-report'][locale.languageCode]; + + } class TranslationBaseDelegate extends LocalizationsDelegate { From 47e4b99f11362d16fa6e6c3bc096f6739e92236b Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 6 Dec 2020 17:54:17 +0200 Subject: [PATCH 63/69] fix issues --- lib/config/localized_values.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 5ca00362..2498a679 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1074,8 +1074,6 @@ const Map localizedValues = { "en": "time left for appointment", "ar": "الوقت المتبقي للموعد" }, - - }, "covid-test-all-services": { "en": "Covid-19 Drive-Thru Test", "ar": "فحص كورونا من داخل السيارة" @@ -1165,6 +1163,6 @@ const Map localizedValues = { "request-medical-report": { "en": "Request medical report", "ar": "طلب تقرير طبي" - } + }, }; From 77dcb918c3a1af7db3afd0f01eb65385413204bd Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 7 Dec 2020 07:27:10 +0000 Subject: [PATCH 64/69] Revert "Merge branch 'pharmacy-hussam' into 'master'" This reverts merge request !149 --- android/app/build.gradle | 5 +- assets/images/no_image.png | Bin 18755 -> 0 bytes assets/images/pharmacy/Group 1206.svg | 14 - assets/images/pharmacy/Group 1207.svg | 17 - .../images/pharmacy/aramex_shipping_logo.svg | 14 - assets/images/pharmacy/arrow_right.svg | 6 - assets/images/pharmacy/check_icon.svg | 6 - assets/images/pharmacy/contact_us_icon.svg | 10 - assets/images/pharmacy/credit_card_icon.svg | 6 - assets/images/pharmacy/delete_red_icon.svg | 8 - assets/images/pharmacy/edit_icon.svg | 3 - assets/images/pharmacy/empty_box.svg | 18 - assets/images/pharmacy/hmg_shipping_logo.svg | 17 - assets/images/pharmacy/lakum_icon.svg | 8 - .../pharmacy/medication_refill_icon.svg | 32 - assets/images/pharmacy/mobile_number_icon.svg | 3 - assets/images/pharmacy/my_family_icon.svg | 19 - .../images/pharmacy/my_prescription_icon.svg | 54 - assets/images/pharmacy/orders_icon.svg | 8 - assets/images/pharmacy/our_locations_icon.svg | 10 - assets/images/pharmacy/pill_reminder_icon.svg | 49 - assets/images/pharmacy/quote_end.svg | 8 - assets/images/pharmacy/quote_start.svg | 8 - assets/images/pharmacy/review_icon.svg | 6 - .../pharmacy/shipping_addresses_icon.svg | 6 - assets/images/pharmacy/shipping_mark_icon.svg | 16 - .../images/pharmacy/shipping_truck_icon.svg | 34 - assets/images/pharmacy/success_check_icon.svg | 6 - .../images/pharmacy/success_review_icon.svg | 24 - assets/images/pharmacy/user_icon.svg | 3 - assets/images/pharmacy/wishklist_icon.svg | 3 - assets/images/pharmacy/wishlist_icon.svg | 6 - .../pharmacy_module/ic_payment_option.png | Bin 447 -> 0 bytes .../pharmacy_module/ic_shipping_address.png | Bin 383 -> 0 bytes .../pharmacy_module/ic_shipping_mark.png | Bin 782 -> 0 bytes .../pharmacy_module/ic_shipping_truck.png | Bin 503 -> 0 bytes .../lakum/Account_activation_icon.png | Bin 1123 -> 0 bytes .../lakum/Lakum_transfer_icon.png | Bin 1572 -> 0 bytes .../pharmacy_module/lakum/expired_icon.png | Bin 737 -> 0 bytes .../pharmacy_module/lakum/inactive_cross.png | Bin 387 -> 0 bytes .../lakum/lakum_card_front_bg.png | Bin 89083 -> 0 bytes .../pharmacy_module/lakum/lakum_checkout.png | Bin 534 -> 0 bytes .../lakum/waiting_gained_icon.png | Bin 373 -> 0 bytes .../lakum/will_be_expired_icon.png | Bin 648 -> 0 bytes .../payment/aramex_shipping_logo.png | Bin 1385 -> 0 bytes .../payment/hmg_shipping_logo.png | Bin 1821 -> 0 bytes .../pharmacy_module/payment/installment.png | Bin 41513 -> 0 bytes .../images/pharmacy_module/payment/mada.png | Bin 17068 -> 0 bytes .../pharmacy_module/payment/mastercard.png | Bin 59419 -> 0 bytes .../images/pharmacy_module/payment/sadad.png | Bin 23578 -> 0 bytes .../images/pharmacy_module/payment/visa.png | Bin 83030 -> 0 bytes .../images/pharmacy_module/payment_image.png | Bin 4982 -> 0 bytes lib/config/config.dart | 77 +- lib/config/localized_values.dart | 459 ++-- lib/config/shared_pref_kay.dart | 1 - lib/core/model/pharmacies/Addresses.dart | 6 +- lib/core/model/pharmacies/BillingAddress.dart | 84 - lib/core/model/pharmacies/Customer.dart | 106 +- .../pharmacies/LacumAccountInformation.dart | 1926 ----------------- .../LakumInquiryInformationObjVersion.dart | 179 -- .../model/pharmacies/ListUserAgreement.dart | 28 - .../pharmacies/PharmacyAddressesModel.dart | 170 -- .../model/pharmacies/PharmacyProduct.dart | 487 +---- .../pharmacies/PointsAmountPerMonth.dart | 42 - .../model/pharmacies/PointsAmountPerYear.dart | 38 - .../model/pharmacies/PointsAmountPerday.dart | 42 - lib/core/model/pharmacies/PointsDetails.dart | 57 - lib/core/model/pharmacies/ShippingOption.dart | 98 - lib/core/model/pharmacies/ShoppingCart.dart | 115 - .../pharmacies/ShoppingCartResponse.dart | 55 - lib/core/model/pharmacies/Specifications.dart | 36 - lib/core/model/pharmacies/order_model.dart | 1486 ------------- .../pharmacies/payment-checkout-data.dart | 21 - lib/core/model/pharmacy/brands_model.dart | 24 - .../pharmacy/categorise_parent_model.dart | 75 - .../model/pharmacy/final_products_model.dart | 184 -- .../model/pharmacy/offer_products_model.dart | 579 ----- lib/core/model/pharmacy/offers_model.dart | 175 -- .../model/pharmacy/parent_products_model.dart | 566 ----- .../model/pharmacy/pharmacy_categorise.dart | 103 - lib/core/model/pharmacy/scan_qr_model.dart | 584 ----- .../model/pharmacy/sub_categories_model.dart | 75 - .../model/pharmacy/sub_products_model.dart | 562 ----- lib/core/model/search_products_model.dart | 185 -- lib/core/service/client/base_app_client.dart | 54 +- lib/core/service/offers_service.dart | 56 - .../lacum-registration-service.dart | 50 - .../service/parmacyModule/lacum-service.dart | 133 -- .../parmacyModule/lacum-transfer-service.dart | 57 - .../parmacyModule/order-preview-service.dart | 237 +- .../parmacyModule/parmacy_module_service.dart | 72 +- .../terms-condition-service.dart | 33 - .../service/pharmacy_categorise_service.dart | 225 -- .../offers_Categorise_view_model.dart | 48 - .../pharmacyModule/OrderPreviewViewModel.dart | 187 -- .../PharmacyAddressesViewModel.dart | 24 - .../lacum-registration-viewModel.dart | 55 - .../lacum-trasnfer-viewModel.dart | 42 - .../pharmacyModule/lacum-viewmodel.dart | 111 - .../order_model_view_model.dart | 39 - .../pharmacy_module_view_model.dart | 35 - .../tems-condition-viewmodel.dart | 24 - .../pharmacy_categorise_view_model.dart | 158 -- lib/locator.dart | 45 +- lib/models/id-name-pair.dart | 12 - lib/pages/base/base_view.dart | 6 +- lib/pages/final_products_page.dart | 480 ---- lib/pages/landing/home_page.dart | 523 +++-- lib/pages/landing/landing_page_pharmcy.dart | 162 -- lib/pages/offers_categorise_page.dart | 620 ------ lib/pages/parent_categorise_page.dart | 1032 --------- .../screens/address-select-page.dart | 34 - .../pharmacies/screens/cart-order-page.dart | 366 ---- .../screens/cart-order-preview.dart | 815 ------- .../screens/lacum-activitaion-vida-page.dart | 101 - .../screens/lacum-registration-page.dart | 236 -- .../screens/lacum-setting-page.dart | 240 -- .../screens/lacum-transfer-page.dart | 317 --- .../pharmacies/screens/lakum-main-page.dart | 555 ----- .../screens/lakum-points-month-page.dart | 271 --- .../screens/lakum-points-year-page.dart | 201 -- .../screens/lakum-terms-conditions-page.dart | 84 - .../screens/order-preview-page.dart | 48 + .../screens/payment-method-select-page.dart | 202 -- .../pharmacy-terms-conditions-page.dart | 51 - .../screens/pharmacy_module_page.dart | 66 +- lib/pages/pharmacies/widgets/BannerPager.dart | 1 - .../pharmacies/widgets/ProductOrderItem.dart | 238 +- .../widgets/ProductOrderPreviewItem.dart | 111 - .../pharmacies/widgets/ProductTileItem.dart | 39 +- .../widgets/lacum-banner-widget.dart | 289 --- .../widgets/lakum-point-table-row-widget.dart | 116 - lib/pages/pharmacies/wishlist.dart | 55 - lib/pages/pharmacy/order/Order.dart | 881 -------- lib/pages/pharmacy/order/OrderDetails.dart | 475 ---- lib/pages/pharmacy/order/ProductReview.dart | 312 --- .../pharmacyAddresses/AddAddress.dart | 127 -- .../pharmacyAddresses/PharmacyAddresses.dart | 380 ---- lib/pages/pharmacy/profile/profile.dart | 384 ---- lib/pages/pharmacy_categorise.dart | 238 -- lib/pages/search_products_page.dart | 287 --- lib/pages/sub_categorise_page.dart | 944 -------- .../orderDetails_service.dart | 39 - .../pharmacy_services/order_service.dart | 61 - .../pharmacyAddress_service.dart | 36 - .../pharmacy_services/wishList_service.dart | 39 - lib/uitl/date_uitl.dart | 5 - lib/uitl/translations_delegate_base.dart | 256 +-- lib/widgets/buttons/GestureIconButton.dart | 13 +- lib/widgets/buttons/borderedButton.dart | 82 +- lib/widgets/data_display/text.dart | 1 - lib/widgets/dialogs/radio-group-dialog.dart | 101 - lib/widgets/input/text_field.dart | 12 +- .../others/app_scaffold_pharmacy_widget.dart | 114 - lib/widgets/others/app_scaffold_widget.dart | 183 +- .../others/points-expandable-notifier.dart | 77 - .../pharmacy/bottom_nav_pharmacy_bar.dart | 108 - .../bottom_nav_pharmacy_home_item.dart | 74 - .../pharmacy/bottom_nav_pharmacy_item.dart | 76 - lib/widgets/pharmacy/product_tile.dart | 230 -- pubspec.yaml | 8 +- 161 files changed, 890 insertions(+), 22661 deletions(-) delete mode 100644 assets/images/no_image.png delete mode 100644 assets/images/pharmacy/Group 1206.svg delete mode 100644 assets/images/pharmacy/Group 1207.svg delete mode 100644 assets/images/pharmacy/aramex_shipping_logo.svg delete mode 100644 assets/images/pharmacy/arrow_right.svg delete mode 100644 assets/images/pharmacy/check_icon.svg delete mode 100644 assets/images/pharmacy/contact_us_icon.svg delete mode 100644 assets/images/pharmacy/credit_card_icon.svg delete mode 100644 assets/images/pharmacy/delete_red_icon.svg delete mode 100644 assets/images/pharmacy/edit_icon.svg delete mode 100644 assets/images/pharmacy/empty_box.svg delete mode 100644 assets/images/pharmacy/hmg_shipping_logo.svg delete mode 100644 assets/images/pharmacy/lakum_icon.svg delete mode 100644 assets/images/pharmacy/medication_refill_icon.svg delete mode 100644 assets/images/pharmacy/mobile_number_icon.svg delete mode 100644 assets/images/pharmacy/my_family_icon.svg delete mode 100644 assets/images/pharmacy/my_prescription_icon.svg delete mode 100644 assets/images/pharmacy/orders_icon.svg delete mode 100644 assets/images/pharmacy/our_locations_icon.svg delete mode 100644 assets/images/pharmacy/pill_reminder_icon.svg delete mode 100644 assets/images/pharmacy/quote_end.svg delete mode 100644 assets/images/pharmacy/quote_start.svg delete mode 100644 assets/images/pharmacy/review_icon.svg delete mode 100644 assets/images/pharmacy/shipping_addresses_icon.svg delete mode 100644 assets/images/pharmacy/shipping_mark_icon.svg delete mode 100644 assets/images/pharmacy/shipping_truck_icon.svg delete mode 100644 assets/images/pharmacy/success_check_icon.svg delete mode 100644 assets/images/pharmacy/success_review_icon.svg delete mode 100644 assets/images/pharmacy/user_icon.svg delete mode 100644 assets/images/pharmacy/wishklist_icon.svg delete mode 100644 assets/images/pharmacy/wishlist_icon.svg delete mode 100644 assets/images/pharmacy_module/ic_payment_option.png delete mode 100644 assets/images/pharmacy_module/ic_shipping_address.png delete mode 100644 assets/images/pharmacy_module/ic_shipping_mark.png delete mode 100644 assets/images/pharmacy_module/ic_shipping_truck.png delete mode 100644 assets/images/pharmacy_module/lakum/Account_activation_icon.png delete mode 100644 assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png delete mode 100644 assets/images/pharmacy_module/lakum/expired_icon.png delete mode 100644 assets/images/pharmacy_module/lakum/inactive_cross.png delete mode 100644 assets/images/pharmacy_module/lakum/lakum_card_front_bg.png delete mode 100644 assets/images/pharmacy_module/lakum/lakum_checkout.png delete mode 100644 assets/images/pharmacy_module/lakum/waiting_gained_icon.png delete mode 100644 assets/images/pharmacy_module/lakum/will_be_expired_icon.png delete mode 100644 assets/images/pharmacy_module/payment/aramex_shipping_logo.png delete mode 100644 assets/images/pharmacy_module/payment/hmg_shipping_logo.png delete mode 100644 assets/images/pharmacy_module/payment/installment.png delete mode 100644 assets/images/pharmacy_module/payment/mada.png delete mode 100644 assets/images/pharmacy_module/payment/mastercard.png delete mode 100644 assets/images/pharmacy_module/payment/sadad.png delete mode 100644 assets/images/pharmacy_module/payment/visa.png delete mode 100644 assets/images/pharmacy_module/payment_image.png delete mode 100644 lib/core/model/pharmacies/BillingAddress.dart delete mode 100644 lib/core/model/pharmacies/LacumAccountInformation.dart delete mode 100644 lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart delete mode 100644 lib/core/model/pharmacies/ListUserAgreement.dart delete mode 100644 lib/core/model/pharmacies/PharmacyAddressesModel.dart delete mode 100644 lib/core/model/pharmacies/PointsAmountPerMonth.dart delete mode 100644 lib/core/model/pharmacies/PointsAmountPerYear.dart delete mode 100644 lib/core/model/pharmacies/PointsAmountPerday.dart delete mode 100644 lib/core/model/pharmacies/PointsDetails.dart delete mode 100644 lib/core/model/pharmacies/ShippingOption.dart delete mode 100644 lib/core/model/pharmacies/ShoppingCart.dart delete mode 100644 lib/core/model/pharmacies/ShoppingCartResponse.dart delete mode 100644 lib/core/model/pharmacies/Specifications.dart delete mode 100644 lib/core/model/pharmacies/order_model.dart delete mode 100644 lib/core/model/pharmacies/payment-checkout-data.dart delete mode 100644 lib/core/model/pharmacy/brands_model.dart delete mode 100644 lib/core/model/pharmacy/categorise_parent_model.dart delete mode 100644 lib/core/model/pharmacy/final_products_model.dart delete mode 100644 lib/core/model/pharmacy/offer_products_model.dart delete mode 100644 lib/core/model/pharmacy/offers_model.dart delete mode 100644 lib/core/model/pharmacy/parent_products_model.dart delete mode 100644 lib/core/model/pharmacy/pharmacy_categorise.dart delete mode 100644 lib/core/model/pharmacy/scan_qr_model.dart delete mode 100644 lib/core/model/pharmacy/sub_categories_model.dart delete mode 100644 lib/core/model/pharmacy/sub_products_model.dart delete mode 100644 lib/core/model/search_products_model.dart delete mode 100644 lib/core/service/offers_service.dart delete mode 100644 lib/core/service/parmacyModule/lacum-registration-service.dart delete mode 100644 lib/core/service/parmacyModule/lacum-service.dart delete mode 100644 lib/core/service/parmacyModule/lacum-transfer-service.dart delete mode 100644 lib/core/service/parmacyModule/terms-condition-service.dart delete mode 100644 lib/core/service/pharmacy_categorise_service.dart delete mode 100644 lib/core/viewModels/offers_Categorise_view_model.dart delete mode 100644 lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart delete mode 100644 lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart delete mode 100644 lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart delete mode 100644 lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart delete mode 100644 lib/core/viewModels/pharmacyModule/order_model_view_model.dart delete mode 100644 lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart delete mode 100644 lib/core/viewModels/pharmacy_categorise_view_model.dart delete mode 100644 lib/models/id-name-pair.dart delete mode 100644 lib/pages/final_products_page.dart delete mode 100644 lib/pages/landing/landing_page_pharmcy.dart delete mode 100644 lib/pages/offers_categorise_page.dart delete mode 100644 lib/pages/parent_categorise_page.dart delete mode 100644 lib/pages/pharmacies/screens/address-select-page.dart delete mode 100644 lib/pages/pharmacies/screens/cart-order-page.dart delete mode 100644 lib/pages/pharmacies/screens/cart-order-preview.dart delete mode 100644 lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart delete mode 100644 lib/pages/pharmacies/screens/lacum-registration-page.dart delete mode 100644 lib/pages/pharmacies/screens/lacum-setting-page.dart delete mode 100644 lib/pages/pharmacies/screens/lacum-transfer-page.dart delete mode 100644 lib/pages/pharmacies/screens/lakum-main-page.dart delete mode 100644 lib/pages/pharmacies/screens/lakum-points-month-page.dart delete mode 100644 lib/pages/pharmacies/screens/lakum-points-year-page.dart delete mode 100644 lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart create mode 100644 lib/pages/pharmacies/screens/order-preview-page.dart delete mode 100644 lib/pages/pharmacies/screens/payment-method-select-page.dart delete mode 100644 lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart delete mode 100644 lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart delete mode 100644 lib/pages/pharmacies/widgets/lacum-banner-widget.dart delete mode 100644 lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart delete mode 100644 lib/pages/pharmacies/wishlist.dart delete mode 100644 lib/pages/pharmacy/order/Order.dart delete mode 100644 lib/pages/pharmacy/order/OrderDetails.dart delete mode 100644 lib/pages/pharmacy/order/ProductReview.dart delete mode 100644 lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart delete mode 100644 lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart delete mode 100644 lib/pages/pharmacy/profile/profile.dart delete mode 100644 lib/pages/pharmacy_categorise.dart delete mode 100644 lib/pages/search_products_page.dart delete mode 100644 lib/pages/sub_categorise_page.dart delete mode 100644 lib/services/pharmacy_services/orderDetails_service.dart delete mode 100644 lib/services/pharmacy_services/order_service.dart delete mode 100644 lib/services/pharmacy_services/pharmacyAddress_service.dart delete mode 100644 lib/services/pharmacy_services/wishList_service.dart delete mode 100644 lib/widgets/dialogs/radio-group-dialog.dart delete mode 100644 lib/widgets/others/app_scaffold_pharmacy_widget.dart delete mode 100644 lib/widgets/others/points-expandable-notifier.dart delete mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart delete mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart delete mode 100644 lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart delete mode 100644 lib/widgets/pharmacy/product_tile.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 54ea9373..5d196986 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -81,7 +81,6 @@ dependencies { // Dependency on a remote binary // implementation 'com.example.android:app-magic:12.3' - implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' - - + + } diff --git a/assets/images/no_image.png b/assets/images/no_image.png deleted file mode 100644 index ebe054721fc8cf7d280d09cd8eaa183df823a383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18755 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 E6oU9fw7_*MNN7{I&bPYj>`x>Uy{1Sl)| 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 diff --git a/assets/images/pharmacy/Group 1206.svg b/assets/images/pharmacy/Group 1206.svg deleted file mode 100644 index ef8f7473..00000000 --- a/assets/images/pharmacy/Group 1206.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/Group 1207.svg b/assets/images/pharmacy/Group 1207.svg deleted file mode 100644 index fd2ffd41..00000000 --- a/assets/images/pharmacy/Group 1207.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/aramex_shipping_logo.svg b/assets/images/pharmacy/aramex_shipping_logo.svg deleted file mode 100644 index 30cc03b8..00000000 --- a/assets/images/pharmacy/aramex_shipping_logo.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/arrow_right.svg b/assets/images/pharmacy/arrow_right.svg deleted file mode 100644 index b4243287..00000000 --- a/assets/images/pharmacy/arrow_right.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/check_icon.svg b/assets/images/pharmacy/check_icon.svg deleted file mode 100644 index cfa4f441..00000000 --- a/assets/images/pharmacy/check_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/contact_us_icon.svg b/assets/images/pharmacy/contact_us_icon.svg deleted file mode 100644 index fa591d47..00000000 --- a/assets/images/pharmacy/contact_us_icon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/pharmacy/credit_card_icon.svg b/assets/images/pharmacy/credit_card_icon.svg deleted file mode 100644 index 9ba6c2bf..00000000 --- a/assets/images/pharmacy/credit_card_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/delete_red_icon.svg b/assets/images/pharmacy/delete_red_icon.svg deleted file mode 100644 index 8897a683..00000000 --- a/assets/images/pharmacy/delete_red_icon.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/edit_icon.svg b/assets/images/pharmacy/edit_icon.svg deleted file mode 100644 index df7cca2f..00000000 --- a/assets/images/pharmacy/edit_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/pharmacy/empty_box.svg b/assets/images/pharmacy/empty_box.svg deleted file mode 100644 index 05816608..00000000 --- a/assets/images/pharmacy/empty_box.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/hmg_shipping_logo.svg b/assets/images/pharmacy/hmg_shipping_logo.svg deleted file mode 100644 index 8e9db3d6..00000000 --- a/assets/images/pharmacy/hmg_shipping_logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/assets/images/pharmacy/lakum_icon.svg b/assets/images/pharmacy/lakum_icon.svg deleted file mode 100644 index e2b223de..00000000 --- a/assets/images/pharmacy/lakum_icon.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/medication_refill_icon.svg b/assets/images/pharmacy/medication_refill_icon.svg deleted file mode 100644 index d5951130..00000000 --- a/assets/images/pharmacy/medication_refill_icon.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/mobile_number_icon.svg b/assets/images/pharmacy/mobile_number_icon.svg deleted file mode 100644 index d98aaf29..00000000 --- a/assets/images/pharmacy/mobile_number_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/pharmacy/my_family_icon.svg b/assets/images/pharmacy/my_family_icon.svg deleted file mode 100644 index 838b357e..00000000 --- a/assets/images/pharmacy/my_family_icon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/my_prescription_icon.svg b/assets/images/pharmacy/my_prescription_icon.svg deleted file mode 100644 index bda0e22e..00000000 --- a/assets/images/pharmacy/my_prescription_icon.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/orders_icon.svg b/assets/images/pharmacy/orders_icon.svg deleted file mode 100644 index f09ae19d..00000000 --- a/assets/images/pharmacy/orders_icon.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/our_locations_icon.svg b/assets/images/pharmacy/our_locations_icon.svg deleted file mode 100644 index 2be16631..00000000 --- a/assets/images/pharmacy/our_locations_icon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/pharmacy/pill_reminder_icon.svg b/assets/images/pharmacy/pill_reminder_icon.svg deleted file mode 100644 index f4fb4ddc..00000000 --- a/assets/images/pharmacy/pill_reminder_icon.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/quote_end.svg b/assets/images/pharmacy/quote_end.svg deleted file mode 100644 index 083ff39a..00000000 --- a/assets/images/pharmacy/quote_end.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/quote_start.svg b/assets/images/pharmacy/quote_start.svg deleted file mode 100644 index 74216f14..00000000 --- a/assets/images/pharmacy/quote_start.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/assets/images/pharmacy/review_icon.svg b/assets/images/pharmacy/review_icon.svg deleted file mode 100644 index bb826f21..00000000 --- a/assets/images/pharmacy/review_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/shipping_addresses_icon.svg b/assets/images/pharmacy/shipping_addresses_icon.svg deleted file mode 100644 index ebb8692f..00000000 --- a/assets/images/pharmacy/shipping_addresses_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/shipping_mark_icon.svg b/assets/images/pharmacy/shipping_mark_icon.svg deleted file mode 100644 index 5cf9606b..00000000 --- a/assets/images/pharmacy/shipping_mark_icon.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/shipping_truck_icon.svg b/assets/images/pharmacy/shipping_truck_icon.svg deleted file mode 100644 index 8ffda974..00000000 --- a/assets/images/pharmacy/shipping_truck_icon.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/success_check_icon.svg b/assets/images/pharmacy/success_check_icon.svg deleted file mode 100644 index ed1379b8..00000000 --- a/assets/images/pharmacy/success_check_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy/success_review_icon.svg b/assets/images/pharmacy/success_review_icon.svg deleted file mode 100644 index f6951456..00000000 --- a/assets/images/pharmacy/success_review_icon.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/pharmacy/user_icon.svg b/assets/images/pharmacy/user_icon.svg deleted file mode 100644 index 8e978105..00000000 --- a/assets/images/pharmacy/user_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/pharmacy/wishklist_icon.svg b/assets/images/pharmacy/wishklist_icon.svg deleted file mode 100644 index cd0ce16d..00000000 --- a/assets/images/pharmacy/wishklist_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/pharmacy/wishlist_icon.svg b/assets/images/pharmacy/wishlist_icon.svg deleted file mode 100644 index 910a3ab8..00000000 --- a/assets/images/pharmacy/wishlist_icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/assets/images/pharmacy_module/ic_payment_option.png b/assets/images/pharmacy_module/ic_payment_option.png deleted file mode 100644 index 5f3fca8fbdc06239e8d934dd377526a1a3696c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmV;w0YLtVP)m z*bDjvv`uAcqoh$#!8A5$%v%vt2muXwMbt!%(c;WrmLQkh-8?WXXJ_|6bI#0}O#A9W z9|kdieq6*i+{ZJ>S^zq5K7K9$gE)f**6{)JVHa>W{HtYf4{nw+>BC9vVzC673;S{? zkp?y}iK#qZUdHRlViwbQ6tETiX?ZwF2NAFz3h)Hp;>HmGtu!a?wh8XQPn@j)JHRUT z1AMD+T*W5-*09ggaSp}$bcSWT$AgI4u5vs?H?Cj@*K?f16P&65Ei{W^e8ndWWRd!D z=m$FS0vko~?%-7o=%}=7QUR|O;9jYKRaNe$1&mX#8_M<_CnEEe0$lfE+?M+JR|FWz zTYuk{en)_J*gj71KAsngM#*srYuE~VS|>^#k#a0yOqv_;u>z;53^Vb3>}cchf6#kU pyAGEfy?BE?)!J+qFQr-0)IWY5fn|^+0>=OV002ovPDHLkV1l0Fzw!V8 diff --git a/assets/images/pharmacy_module/ic_shipping_address.png b/assets/images/pharmacy_module/ic_shipping_address.png deleted file mode 100644 index 9566fb30a09d27cad92a94448a0b91c4c902dba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)*_E}|3y1x?W( z5Q9n!>d?^-sB1K12L~yXR7#gdzrf^@K)f6J9sn~=we<9~oXP_LFPupZO=?rkB|w+>)KPlz4AIran8 zbgdgTYExtv+&bc=L?~ zcxUJp0DKae0x+qg3IGJI+!+BQe)=u|0LW=O2N&9M001y+Xw9l;1pokmsz{^?002PX d(xm_Z{sYbET)o?e#uWen002ovPDHLkV1mBxiTwZo diff --git a/assets/images/pharmacy_module/ic_shipping_mark.png b/assets/images/pharmacy_module/ic_shipping_mark.png deleted file mode 100644 index cc4b272d5a875da77ddc5ad003e40fd05a6b5ebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 782 zcmV+p1M&QcP)eo}K~y-6jg(7B)KL`1zjObu(Xr67qB43(ML0@}#1JJZMI?JcMG~~A zHdeb_7}BE0E-IHrP!VE6nfCNi5Jj106zcSX(zJ|$NzKPN|C#^2r-jZCqhe=u&UerE zJKyROW~h?7{2~ya04TG6;77b6j3L7`E=Afgw{oIMeaZkE*N=lMtcxnuUICu$P9ch*Ewipv1x(1sWM?Ij7>#BjflVoUPtLSY%uKC4q3uc!zA)KJl9EpW$Oka5#aA`b=Br8m z>F>ju`MIiS`FTMEWeDoFOdJVmvR4b~hYHraE5w_g;5mY-G(%>Bl>87tK#|z;eTB>Y zvbS+5h%dU#xc9!_-o&su$8wwIb`r41f@m)z%%j z#Gn!|?lDoPV0=@8M~4D31I$UxNK*=FVTDvvqmCj^!iMI~!0s`}xlOIz<23-1S%~9V z%dHQuzSj)|gAqI4T4`6YvFfIPh(~o1t;~{l}gcv5Tm(3A( zu!0yz3Dg5tEdad+tIrDBkmT^6aU01bD8-R#F)?L1K(Ga&O6N;k$QF}kf zOWV!?I14})11ktf1d!N26mk)f5+FwqhBb}4h^X1p<(0g(bNvAD7s#tA1!~LnG5`Po M07*qoM6N<$g1IDZ9{>OV diff --git a/assets/images/pharmacy_module/ic_shipping_truck.png b/assets/images/pharmacy_module/ic_shipping_truck.png deleted file mode 100644 index 274ae1da9977edf7a306c9d2ff9ef27afd639361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503 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 diff --git a/assets/images/pharmacy_module/lakum/expired_icon.png b/assets/images/pharmacy_module/lakum/expired_icon.png deleted file mode 100644 index 9a9809847738aabdf56096c04e49cf5222b6efa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmV<70v`Q|P)X1^@s6CN-WK00006VoOIv0RI60 z0RN!9r;`8x0+vZcK~zYIrPkkz&si7;@E4{r(~Q(+8H}uQwNh4*3#6KsM9Jv~Cpzdc(+cgN68r;}u9@s-b(FN3$rx%z2Mk z=}xiow>epNW^`5*#mvtjhATPedvGWH9~CLjWLq+4|Km^<(lW$thOWBk>qYZ;aU3S# zL$JJJxVHGZlOb+0QIG)oog*r?Zon{H{;bDmYs^Jn| z<8QI3H==k)C}sJ-TE*ccan7$RZY~+VGjv}U7Ac*=3v9%kD#S!Z_KRjS8u>&~J0}ux z;c4kqevdPJpKN;YMFqVhVxK1z3ENXtD{CO8+{$m`x6vF-Nl_iHkvLDjuR!*VSkU%L z4$g?mYaIi5o8sH5OBCYVO2!LBxp$3$xCl!{CJvNQJ}B2mKLa!H51xwqy(${SIsTyd z+AD+E_yg~;ycWY2gLh}A+Fl@QMKA8drdmidG>O+>)?>Hht0Wu#=4!wO(U%8AikFOq zG>_E=-(UT>kDt@{mN=i;<^CUbsi6stcgp%d z)K03Y9aU95uA*{WP3<_40Y)bv3{*k5EQkSA4Aicrb=KPYtc}gp*w||c3D*)6Z{_9P zE-buVQgXYr^iFB%{g#&Jixxd!vgFm8HLupLeYI}g`-2BRo;vmI-o5Yl@Be!J`tP@I z|Ns9N2s?BH=rZw=AirP+77HtD8(X`{Q>QOkx@`H1m5-l1{qgf(z;xjUKqZVx-tI1j zH*d=p0XY?(E{-7_*G-Q{iZwDYI9wE$bej0Y^I4_OxBZs#e&63Sl^l<>^R;4NVgA2} zL1ITpX(Eg5UzsgCVog&P&Hfc)vuf(Glvms8_Ij6ktrI){KC;wp+0nK)W)qrkb@O1TaS?83{1OR#z BrN#gN diff --git a/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png b/assets/images/pharmacy_module/lakum/lakum_card_front_bg.png deleted file mode 100644 index 73323a0ebe7b67d06cd87139d848593505e7356f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89083 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

Wzy7IB)>vlWq%Mm{P5ll(n{4qyl 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 Y3%I(5+Q=CKP))P5hE zXvIMhbb|J5|bFmIWm7iv6^v>D>NmAV#kS4i5wS1 zd3v#k6;Z}B%$EaF*b_~z4M)DFdMui17Q3b39M(gddFAhM1Y4LX26Je{T^T5@d$fei zg}0gxZiBz%9|-$z#oz}ze}Q6k3UBpapH&7O7)x+|G`MEqMfLxj$24wh==A0j%hG5* TPksPQ00000NkvXXu0mjfv*MR` diff --git a/assets/images/pharmacy_module/lakum/will_be_expired_icon.png b/assets/images/pharmacy_module/lakum/will_be_expired_icon.png deleted file mode 100644 index 7f31f622b941fb02f271be7be13ef908fd98c231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 648 zcmV;30(bq1P)pt^Zp8|M$PwyCh%z z(1a-%gdX^SN4SbJ_>}Tljjgzkg?Lqi0fyi(J|jUp?!@wqSWoaCd(b!fjl|d3mf(01 z*m8V~!M4XBFgpfmjP-HY8^7=#x}dcJmf!~_Yv!JR06DAh1 zz^B3#rS0pwU@ETTT@7HC=3rokeHxBs*q4nZZxPaIU5mgXsxJuLk5$zgcjGO( z{U_)^VVkY27GS!tP+AHCe?eREFr#gKOlD|afZM|HQ)}WYRYI?nttX!2L@nng;VUt5mb_Y)FLTt4%n85*)&5;W3rqGA0%coR?7vvxMivWDG_h iyulM(#3|w6D6F3q0jDe6hkfz@00005H^tx#l+>;DFq>Hmk%=g-g2<68ld zC;$Kf2nt9f0huh=u>&F!Apn3t5F(KvG8w{?ojajjyC4@Ah(du}T_Fz-A(1GgP=v0o zLN_@$?jWc?rF}g+4yQJ$qmx5e5L5LV?}gVNXxk%M14QhJAcseC6v4@7)Xg z`@;bNa9|)D6a)tc!!()*07QX-qTpZ=?sU2+Bt#S%Dmrig0RV(bMQAjHPDesRk+3iX z55vQeg9nj_2qZERiHbs^qme_0!~h_sQpMrn;>bvGbhJ1oMttmF24nH`=|$Yno?T2!lclE0&YhE`r^_x~l7pZe zCzC0^az&n%r2s(%lc~teROI9+a&r|01&V9e6xXjSK~R~WuPi7~vRF#|TU4YhE>?k{ z3TH`)sS zJkUOTsI9BhK6<1hk#sm48gwl!y0$hwiKK6C*0;9m+uQYQw!Wi7-_@n>?KQC3hR#ky zU!P%Mz`)@wk;zLqhlY$JBgWBDieu8pAM)OlDCkEh?2o zt+r@17OmEz(^>R-i@{)7TC!@jR=wV8Fj#Rn8m%Ui)oivdFI!R6ieXlZ#cH+M%x2s2 zvJFLT7-q9rYX%l3HH z>0z|M81Kp75>F-x8wnk*yQv))e#i^7^PU!Or+(y*m{eE^QAi zXpB%)=)N<*E0n~_*DyWXWX8Jwk6mehl;pjd_CWS*kBjH@#Wgpy#~QKvILVAt*>Fy5 zeIMi0&GN#Qnj6Z(W><_X-P~R{`qeYqw^=pUb($96;(Kb6X3h8hoTL%w4d=m=x!KHo z!Q+j5+QwMkg$j9I#^vDr3-eWfE;y~`m?jha_%qI*hqlEk-cNJK-@L8+@#0~g`yo)q zE%iO;=V8=!SDB|C@`F7g?TOc7O8outDrGIB+Qvv|GC0?ZOSl70h5KJ*W^_+1SW6w5 zZzi4L%#~d36_0oECzi@912oXOlJ%{e0$6jge*JM4Wof3vjumzLm~l%}OnrLws&X-D zXtXHcDZ8iVd5?&@Jt?Aq^(2JnR-??;Fp3)8-rsQUf!0#uuBOLBk;O#m{z@f1a#! zAO7|1XP;BsM~-c9{UAIOlo6G}+Wa}hlVK}0tUEgJ_!++oiR-pEf8w-nJTS1OX_r@P zo(38i2%!3J;Ca39j&qsbQStozy;F0QPQ9seZN;rjE5tYd-o)l}nCJ|v)@f!wCriLH z*Y>*bo@Wat+I8Zm0WY!z7^`XDC9f!ZZi3%ny5K{plM}^n>vVEA^{NAx;s~&+2^~Kr eHMWr%3<3eH?A_M6pnZ(Dix5VSq_Kk%ul@@o#Uo7s diff --git a/assets/images/pharmacy_module/payment/hmg_shipping_logo.png b/assets/images/pharmacy_module/payment/hmg_shipping_logo.png deleted file mode 100644 index 725b2e5ee5d2da3829d1631aeaad88502d720708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 zcmX}rcT`h%8wc=2aG@MHzLnAnE~pe#1W_@l2$mJ8lucP83Pq)sQG83VD4;TefDlF) zVGr35Mi^nLgpn`<0TPlx*pP%s2HEemJ?H(N&wakn`Q3l+x##>6?Cq?TmA+R3fk4Vo z8w*FEeSqitLkhrLJs7MG0_~I9|Lknp)6+9BFfcwoKKf6_#>RjK=Ku5WIe|a`7BZPk zp-}L6{DT1hz>uJz=V8wyU@xLy{T&k(9rrdSF7_=v{w+KqHW42GE-@iF37(Ran3A0M zKIL8N`{cCLWJFp@I^ul>A~hpDH8UeED-)5GnU2g#&qikEWM}2(AoFsOsN8H+UQRwL zw;&%?RG42}R8Ue}SXxq4R$5$MR#H)3T2WE@p`xtvLwQwYMOEd8>Z%Vl)s?k1RkbzM zb+tA1^|cN4b&U;m=*D_9x}gc(*xc0E(u{6tX=-h0#&7|Y9ymF4BH zR#sM5SJqZn*Vfk70qg4<8|#}J8=IS(TY#;t?d@$Qlc{l@sd<5UTAz9P67#GfaKK~% zSS+o}tRIY6=dQ5MLs*w?ve<04fhpVYHrvRYef19ex)mE@#Wt~K->_lt?ChA`+p%^6 zdWXZ|KwUU@T{*UHoS%Q?ICyg$?*nI?FaKos%a`5V-N5I-*yVD$uxKtU252si$BT;R zy?F;TkI&;LW$;sxd>{gWAU#)*QzSr@0;^!}YlQX9LNrF$)Fy1{5CRd2M4i2&?tW4K z0I-V0V(~CRJU#`qgh-N1&q^c`DSb)GSe7zYq^s*vsZ_SjlCjt_E>Ff6$OL;bnM^Je z%Ee;2Tn>)?=0CuFI2Pt;=XB_BY8oOPm0wV}x(0k9pD#P@PN4vA!4GY%Eo76RekTw} zp#f@P?rekWnt?f|yQt$hMYoUIwNSTdzy#85S606AwKic=xLFnW1(%$NTQ$fhlQ2!ex1h>jlMZMZw<5@+E$dNX80&)< zKGE$bVb?i#efpN%Ny5k{w!319a04Ux61wXY{qiZw8_~``W<2$@y&3ac9jN-;CJ&O} z&~5aG+u1aAx5E8mVxWd$RIi3D%P&wC`s}qytv>P9OKoU`a#WBu)MVBg1>;!K;m{OT z=j`G38-4H}^+wHMuFc2MMs0-q_& z@xf@KWi@l{*@28&e5ZTcnIEdS{lfC#kLi|>M&$}+izBh;)dHVYn6;T#7Z~)YL_=&V zPMljKzzr&=(C1oC?f6I(_8cP)(-X~TPeP^`8(U?9zAoa-ZcSNb+{u7?l-=*w`13cO z;7AEL-^TF9#W1cf%|GPfpB`Rvk`VUD&!;l*#ABxpe5WUtcQHBI3R7#x(M?inB{`(u zw|y0PG1Ih$3;G=czQ7S*?$w!GrOBz6$PV|N9Vrgs0i<%5zrxg$gc;r=8mq^zx!&&8 z+Ugw9Ge%;9u%vlTILQi^!;}7|HxrDY(aw&bCC%C`!)VFoPItzDjw>msBLFq@Sbxsj z#cR%6IveSa*)IIs{GP*vi4)AS%Q18d9fzN`O&n1}W;uUD^{-Qxa2H;SD!5beVp_9r z!!Lg+&^7h~%X>N$)=zmzK6-+sa-j+YD;M}seBwT<@TD)k3}`w!r%IF{q0Zw}w~}Og a=0QTA`%htE1O#xAK~PIOi@G}xV*Up+BSb#{ diff --git a/assets/images/pharmacy_module/payment/installment.png b/assets/images/pharmacy_module/payment/installment.png deleted file mode 100644 index 034497efabd3db47c841d9464472527fb0095539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41513 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%0A7J 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 z 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 diff --git a/assets/images/pharmacy_module/payment/sadad.png b/assets/images/pharmacy_module/payment/sadad.png deleted file mode 100644 index 35e0426c4a68703441198afd5e961e7e8ddfa3fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23578 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 diff --git a/assets/images/pharmacy_module/payment_image.png b/assets/images/pharmacy_module/payment_image.png deleted file mode 100644 index ebf7a9297a1ed077d17cc8327e4f452017d7d71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4982 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 json) { id = json['id']; @@ -59,7 +57,6 @@ class Addresses { createdOnUtc = json['created_on_utc']; province = json['province']; latLong = json['lat_long']; - isChecked = json['isChecked']; } Map toJson() { @@ -82,7 +79,6 @@ class Addresses { data['created_on_utc'] = this.createdOnUtc; data['province'] = this.province; data['lat_long'] = this.latLong; - data['isChecked'] = this.isChecked; return data; } diff --git a/lib/core/model/pharmacies/BillingAddress.dart b/lib/core/model/pharmacies/BillingAddress.dart deleted file mode 100644 index 765ac54d..00000000 --- a/lib/core/model/pharmacies/BillingAddress.dart +++ /dev/null @@ -1,84 +0,0 @@ -class BillingAddress { - String id; - String firstName; - String lastName; - String email; - String company; - int countryId; - String country; - String stateProvinceId; - String city; - String address1; - String address2; - String zipPostalCode; - String phoneNumber; - String faxNumber; - String customerAttributes; - String createdOnUtc; - String province; - String latLong; - - BillingAddress( - {this.id, - this.firstName, - this.lastName, - this.email, - this.company, - this.countryId, - this.country, - this.stateProvinceId, - this.city, - this.address1, - this.address2, - this.zipPostalCode, - this.phoneNumber, - this.faxNumber, - this.customerAttributes, - this.createdOnUtc, - this.province, - this.latLong}); - - BillingAddress.fromJson(Map json) { - id = json['id']; - firstName = json['first_name']; - lastName = json['last_name']; - email = json['email']; - company = json['company']; - countryId = json['country_id']; - country = json['country']; - stateProvinceId = json['state_province_id']; - city = json['city']; - address1 = json['address1']; - address2 = json['address2']; - zipPostalCode = json['zip_postal_code']; - phoneNumber = json['phone_number']; - faxNumber = json['fax_number']; - customerAttributes = json['customer_attributes']; - createdOnUtc = json['created_on_utc']; - province = json['province']; - latLong = json['lat_long']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['first_name'] = this.firstName; - data['last_name'] = this.lastName; - data['email'] = this.email; - data['company'] = this.company; - data['country_id'] = this.countryId; - data['country'] = this.country; - data['state_province_id'] = this.stateProvinceId; - data['city'] = this.city; - data['address1'] = this.address1; - data['address2'] = this.address2; - data['zip_postal_code'] = this.zipPostalCode; - data['phone_number'] = this.phoneNumber; - data['fax_number'] = this.faxNumber; - data['customer_attributes'] = this.customerAttributes; - data['created_on_utc'] = this.createdOnUtc; - data['province'] = this.province; - data['lat_long'] = this.latLong; - return data; - } -} diff --git a/lib/core/model/pharmacies/Customer.dart b/lib/core/model/pharmacies/Customer.dart index e3defbbe..a5311489 100644 --- a/lib/core/model/pharmacies/Customer.dart +++ b/lib/core/model/pharmacies/Customer.dart @@ -1,10 +1,4 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/BillingAddress.dart'; - class Customer { - BillingAddress billingAddress; - BillingAddress shippingAddress; - List addresses; String fileNumber; String iqamaNumber; int isOutSa; @@ -14,6 +8,8 @@ class Customer { String phone; String countryCode; String yahalaAccountno; + String billingAddress; + String shippingAddress; String id; String username; String email; @@ -21,63 +17,50 @@ class Customer { String lastName; String languageId; String adminComment; - bool isTaxExempt; - bool hasShoppingCartItems; - bool active; - bool deleted; - bool isSystemAccount; + String isTaxExempt; + String hasShoppingCartItems; + String active; + String deleted; + String isSystemAccount; String systemName; String lastIpAddress; String createdOnUtc; String lastLoginDateUtc; String lastActivityDateUtc; - int registeredInStoreId; + String registeredInStoreId; Customer( - {this.billingAddress, - this.shippingAddress, - this.addresses, - this.fileNumber, - this.iqamaNumber, - this.isOutSa, - this.patientType, - this.gender, - this.birthDate, - this.phone, - this.countryCode, - this.yahalaAccountno, - this.id, - this.username, - this.email, - this.firstName, - this.lastName, - this.languageId, - this.adminComment, - this.isTaxExempt, - this.hasShoppingCartItems, - this.active, - this.deleted, - this.isSystemAccount, - this.systemName, - this.lastIpAddress, - this.createdOnUtc, - this.lastLoginDateUtc, - this.lastActivityDateUtc, - this.registeredInStoreId}); + {this.fileNumber, + this.iqamaNumber, + this.isOutSa, + this.patientType, + this.gender, + this.birthDate, + this.phone, + this.countryCode, + this.yahalaAccountno, + this.billingAddress, + this.shippingAddress, + this.id, + this.username, + this.email, + this.firstName, + this.lastName, + this.languageId, + this.adminComment, + this.isTaxExempt, + this.hasShoppingCartItems, + this.active, + this.deleted, + this.isSystemAccount, + this.systemName, + this.lastIpAddress, + this.createdOnUtc, + this.lastLoginDateUtc, + this.lastActivityDateUtc, + this.registeredInStoreId}); Customer.fromJson(Map json) { - billingAddress = json['billing_address'] != null - ? new BillingAddress.fromJson(json['billing_address']) - : null; - shippingAddress = json['shipping_address'] != null - ? new BillingAddress.fromJson(json['shipping_address']) - : null; - if (json['addresses'] != null) { - addresses = new List(); - json['addresses'].forEach((v) { - addresses.add(new Addresses.fromJson(v)); - }); - } fileNumber = json['file_number']; iqamaNumber = json['iqama_number']; isOutSa = json['is_out_sa']; @@ -87,6 +70,8 @@ class Customer { phone = json['phone']; countryCode = json['country_code']; yahalaAccountno = json['yahala_accountno']; + billingAddress = json['billing_address']; + shippingAddress = json['shipping_address']; id = json['id']; username = json['username']; email = json['email']; @@ -109,15 +94,6 @@ class Customer { Map toJson() { final Map data = new Map(); - if (this.billingAddress != null) { - data['billing_address'] = this.billingAddress.toJson(); - } - if (this.shippingAddress != null) { - data['shipping_address'] = this.shippingAddress.toJson(); - } - if (this.addresses != null) { - data['addresses'] = this.addresses.map((v) => v.toJson()).toList(); - } data['file_number'] = this.fileNumber; data['iqama_number'] = this.iqamaNumber; data['is_out_sa'] = this.isOutSa; @@ -127,6 +103,8 @@ class Customer { data['phone'] = this.phone; data['country_code'] = this.countryCode; data['yahala_accountno'] = this.yahalaAccountno; + data['billing_address'] = this.billingAddress; + data['shipping_address'] = this.shippingAddress; data['id'] = this.id; data['username'] = this.username; data['email'] = this.email; @@ -147,4 +125,4 @@ class Customer { data['registered_in_store_id'] = this.registeredInStoreId; return data; } -} +} \ No newline at end of file diff --git a/lib/core/model/pharmacies/LacumAccountInformation.dart b/lib/core/model/pharmacies/LacumAccountInformation.dart deleted file mode 100644 index 4f1d0455..00000000 --- a/lib/core/model/pharmacies/LacumAccountInformation.dart +++ /dev/null @@ -1,1926 +0,0 @@ -import 'LakumInquiryInformationObjVersion.dart'; - -class LacumAccountInformation { - - String date; - int languageID; - int serviceName; - String time; - String androidLink; - String authenticationTokenID; - String data; - bool dataw; - int dietType; - String errorCode; - String errorEndUserMessage; - String errorEndUserMessageN; - String errorMessage; - int errorType; - int foodCategory; - String iOSLink; - bool isAuthenticated; - int mealOrderStatus; - int mealType; - int messageStatus; - int numberOfResultRecords; - String patientBlodType; - String successMsg; - String successMsgN; - int accountStatus; - String activeArchiveObject; - int activeMedicationCount; - String allMedicationTakenDuringAdmissionList; - int appointmentNo; - String arePatientsOnlineList; - String balanceAmount; - String bloodGroupList; - int cVIUnreadCount; - String checkUserHasAccount; - int complaintNo; - String dischargeList; - int episodeID; - String finalRadiologyList; - String fullName; - String geoFPointsList; - String geoGetPateintInfo; - String getAllDoctorsByProjectAndClinicList; - String getAppointmentNumbersForDoctorList; - String getCheckUpItemsList; - String getCosmeticConferenceForTodayList; - String getDoctorERClinicResult; - String getInvoiceApprovalList; - String getNearestProjectList; - String getPatientAdmissionOrAppoinmentNoList; - String getPatientBloodType; - String getPatientInsuranceCardStatusStatisticsList; - String getSurveyList; - String getTotalRegisteredPatientList; - String getUserDetailsList; - String getCustomerPointInfo; - String hISApprovalList; - String hISInpAdmissionList; - String hISProgNoteAssesmentModelList; - String hMGGetAllOffersList; - bool hasApproval; - bool hasConsultation; - bool hasDental; - bool hasLab; - bool hasPharmacy; - bool hasRad; - String hmgSMSGetByProjectIDAndPatientIDList; - int hoursLeft; - String iNPMGetAllAdmissionList; - String iNPMGetPatientInfoForSickLeaveReportList; - String iNPMHISPatientMedicalStatusUnreadCount; - String iNPMLABGetPatientLabOrdersResultsList; - String iNPMLABGetPatientLabResultsList; - String iNPMLABGetPatientRADReportList; - String iNPMLABGetPatientRadResultsList; - String iNPMRadGetPatientRadOrdersCVIList; - String iNPMRadGetPatientRadOrdersList; - String iNPMRadGetRadMedicalRecordsList; - String iNPGetPrescriptionDischargesList; - String iNPGetPrescriptionReportList; - String identificationNo; - bool isHomeMedicineDeliverySupported; - int isInsertedOrUpdated; - bool isMainAcoountEqualPatienID; - bool isPatientAlreadyAgreed; - bool isPatientCallBackBlackList; - bool isPatientHaveFingerPrint; - bool isPatientOnline; - bool isPatientTokenRemoved; - bool isPaused; - bool isProjectWorkingHours; - String isStoreRateAllowed; - String isStoreRateInserted; - String isStoreRateUpdated; - int labRadUpdatedToRead; - int labReportUnreadNo; - String lakumInquiryInformationObj; - LakumInquiryInformationObjVersion lakumInquiryInformationObjVersion; - String lakumResponseList; - String laserGetBodyPartsByCategoryList; - String laserGetCategoriesList; - String list; - int listCount; - int listCountDeliverd; - int listCountUnDeliverd; - String listDeviceInfo; - String listFamilyAppointments; - String listLabResultsByAppNo; - String listLakumInquiryInformationObj; - String listOpinionGetAllPeriod; - String listOpinionGetAllServices; - String listOpinionGetIsAgreeValue; - String listOpinionGetOpinionLogin; - String listOpinionGetRequestedSerives; - String listOpinionGetShareServicesDetails; - String listOpinionUserTerms; - String listPLO; - String listPLR; - String listPLSR; - String listPRM; - String listPatientFamilyFiles; - String listPatientFileInfo; - String listRAD; - String listRADAPI; - String listActiveGetPrescriptionReportByPatientID; - String listAppointmentsForDentalClinic; - String listBabyInfoResult; - String listCheckInsuranceCoverage; - String listCompanyClass; - String listConsentMedicalReport; - String listDentalAppointments; - String listDeviceTokenIDByAppointmentNo; - String listDischargeDiagnosis; - String listDischargeMedicine; - String listDischargeSummary; - String listDoctorResponse; - String listDoneVaccines; - String listEReferralResult; - String listEReferrals; - String listGetAllPatientsLiveCareAdmin; - String listGetDataForExcel; - String listGetMainCountID; - String listGetPrescriptionReportByPatientID; - String listGetSickLeave; - String listHISInvoice; - String listHISInvoiceProcedures; - String listInpatientInvoices; - String listInsuranceCheckList; - String listInsuranceCompanies; - String listInsuranceCompaniesGroup; - String listInsuranceUpdateDetails; - String listInvoiceApprovalProcedureInfo; - String listIsLastSatisfactionSurveyReviewedModel; - String listLabOrderDetailsModel; - String listMedicalReport; - String listMedicalReportApprovals; - String listMedicalReportStatus; - String listMonthBloodPressureResult; - String listMonthBloodPressureResultAverage; - String listMonthDiabtecPatientResult; - String listMonthDiabtectResultAverage; - String listMonthWeightMeasurementResult; - String listMonthWeightMeasurementResultAverage; - String listOnlinePrescriptionResult; - String listOutPatientInvoices; - String listPHRInvoice; - String listPHRInvoiceItems; - String listPHRPaymentMethods; - String listPateintDetails; - String listPateintInformation; - String listPatientAdmissionInfo; - String listPatientAdvanceBalanceAmount; - String listPatientCallBackLogs; - String listPatientCallBackToUpdateFromICServer; - String listPatientCount; - String listPatientDashboard; - String listPatientERGetAdminClinicsModel; - String listPatientERGetAdminProjectsModel; - String listPatientERGetAllClinicsModel; - String listPatientHISInvoices; - String listPatientICProjects; - String listPatientICProjectsByID; - String listPatientICProjectsTimings; - String listPatientIDByUID; - String listPatientIDForSurveyResult; - String listPatientInfo; - String listPatientInfoForDDScreen; - String listPatientInfoForSickleaveReport; - String listPatientInsuranceCard; - String listPatientInsuranceCardHistory; - String listPatientInsuranceDetails; - String listPatientPHRInvoices; - String listPatientServicePoint; - String listPatientStatusCount; - String listPatientChatRequestMapModel; - String listPatientChatRequestModel; - String listPatientChatRequestVCModel; - String listPaymentMethods; - String listPointServices; - String listPregnancyStagesInfo; - String listProjectAvgERWaitingTime; - String listProjectAvgERWaitingTimeHourly; - String listRadMedicalRecords; - String listRadMedicalRecordsAPI; - String listRadMedicalRecordsCVI; - String listRadMedicalRecordsCVIAPI; - String listRadMedicalRecordsResults; - String listSickLeave; - String listTransaction; - String listVideoConferenceSessions; - String listWeekBloodPressureResult; - String listWeekBloodPressureResultAverage; - String listWeekDiabtecPatientResult; - String listWeekDiabtectResultAverage; - String listWeekWeightMeasurementResult; - String listWeekWeightMeasurementResultAverage; - String listYearBloodPressureResult; - String listYearBloodPressureResultAverage; - String listYearDiabtecPatientResult; - String listYearDiabtecResultAverage; - String listYearWeightMeasurementResult; - String listYearWeightMeasurementResultAverage; - String listEInvoiceForDental; - String listEInvoiceForOnlineCheckIn; - String medGetActivitiesTransactionsStsList; - String medGetAvgMonthTransactionsStsList; - String medGetAvgWeekTransactionsStsList; - String medGetCategoriesList; - String medGetMonthActivitiesTransactionsStsList; - String medGetMonthStepsTransactionsStsList; - String medGetMonthTransactionsStsList; - String medGetPatientLastRecordList; - String medGetSubCategoriesList; - String medGetTransactionsAndActTransactionsResult; - String medGetTransactionsList; - String medGetWeekActivitiesTransactionsStsList; - String medGetWeekStepsTransactionsStsList; - String medGetWeekTransactionsStsList; - String medGetYearActivitiesTransactionsStsList; - String medGetYearSleepTransactionsStsList; - String medGetYearStepsTransactionsStsList; - String medGetYearTransactionsStsList; - String medInsertTransactionsOutputsList; - String medicalRecordImages; - int medicalReportToRead; - int medicalReportUnreadNo; - bool missingIDCardAttachment; - bool missingInsuranceCardAttachment; - bool missingMedicalReportAttachment; - bool missingOtherRelationship; - bool missingPatientContactNo; - bool missingPatientId; - bool missingPatientIdentityNumber; - bool missingPatientName; - bool missingReferralContactNo; - bool missingReferralRelationship; - bool missingReferralRequesterName; - String mobileNumber; - int nationalityNumber; - String onlineCheckInAppointments; - String opinionUserAgreementContent; - bool orderInsert; - String pateintInfoForUpdateList; - String pateintUpatedList; - String patientBirthdayCertificate; - String patientERCMCRequestSummaryByProject; - String patientERCMCRequestWithTotal; - String patientERCMCGetAllServicesList; - String patientERCMCGetTransactionsForOrderList; - String patientERCoordinates; - String patientERCountOrderList; - String patientERCountsForApprovalOffice; - String patientERDeleteOldCurrentDoctorsOutputsList; - String patientERDeliveryGetAllDeliverdOrderList; - String patientERDeliveryGetAllOrderList; - bool patientERDeliveryIsOrderInserted; - bool patientERDeliveryIsOrderUpdated; - bool patientERDeliveryIsPausedChanged; - String patientERDeliveryNextOrder; - int patientERDeliveryOrderInsert; - int patientERDeliveryUpdateOrderStatus; - bool patientERDriverUpdate; - String patientERExacartCheckIsDispenseAccpetableList; - String patientERExacartGetDispenseQuantitiesByOrderIDList; - String patientERExacartGetOrderDetailsByePharmacyOrderNoList; - String patientERExacartGetOrderDetailsList; - String patientERExacartGetTotalDispenseQuantitiesByPresNoList; - bool patientERExacartIsDispenseAdded; - String patientERExacartIsDispenseAddedList; - bool patientERExacartIsOrderCompleted; - String patientERGetAdminByProjectAndRoleList; - String patientERGetAdminProjectsList; - String patientERGetAllDriversList; - String patientERGetAllNeedAproveStatusList; - String patientERGetAllPresOrdersStatusList; - String patientERGetAllProjectsList; - String patientERGetArchiveInformationList; - String patientERGetAskDoctorTotalByDateFilterList; - String patientERGetBookScheduleConfigsList; - String patientERGetClinicAndTimeAndEpisodeForAppointmentList; - String patientERGetClinicAndTimeForDischargeList; - String patientERGetDashboardDataforApporvalSectionForAdminList; - String patientERGetDashboardDataforApporvalSectionList; - String patientERGetDashboardDataforHHCSectionForAdminList; - String patientERGetDashboardDataforHHCSectionList; - String patientERGetDashboardDataforPrescriptionSectionForAdminList; - String patientERGetDashboardDataforPrescriptionSectionList; - String patientERGetDoctorDashboardDataModelList; - String patientERGetDriverLocationList; - String patientERGetInsuranceCardRequestByDateFilterList; - String patientERGetLiveCareSummaryBookedAppoinmentStatusList; - String patientERGetLiveCareSummaryCovidList; - String patientERGetLiveCareSummaryForCMCList; - String patientERGetLiveCareSummaryForHHCList; - String patientERGetLiveCareSummaryForHomeDeliveryList; - String patientERGetLiveCareSummaryForInsuranceCardRequestList; - String patientERGetLiveCareSummaryForNewFilesList; - String patientERGetLiveCareSummaryForOnlinePaymetRequestList; - String patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; - String patientERGetLiveCareSummaryForTrasnportationList; - String patientERGetLiveCareSummaryLiveCareCountsList; - String patientERGetMedicalRequestTotalByDateFilterList; - String patientERGetNearestPendingOrdersList; - String patientERGetNeedAproveHistoryForOrderList; - String patientERGetNeedAprovePendingOrdersList; - String patientERGetNeedAproveStatusStatisticsList; - String patientERGetPatientAllPresOrdersList; - String patientERGetPendingPatientsCountList; - String patientERGetPresOrdersHistoryForAdminList; - String patientERGetPresOrdersHistoryForOrderList; - String patientERGetPresOrdersStatusStatisticsList; - String patientERHHCRequest; - String patientERHHCRequestSummaryByProject; - String patientERHHCRequestWithTotal; - String patientERHHCGetAllServicesList; - String patientERHHCGetTransactionsForOrderList; - String patientERHomeDeliveryCounts; - bool patientERInsertDriver; - String patientERInsertNewCurrentDoctorsOutputsList; - String patientERInsuranceStatusCountList; - bool patientERIsNearestProjectUpdated; - bool patientERIsNeedAproveReturnedToQueue; - bool patientERIsNeedAproveUpdated; - bool patientERIsOrderClientRequestUpdated; - bool patientERIsOrderReturnedToQueue; - bool patientERIsPresOrderInserted; - bool patientERIsPresOrderUpdated; - bool patientERIsProjectUpdated; - String patientERNotCompletedDetails; - String patientERPatientsCountByCallStatus; - String patientERPeakHourCounts; - String patientERPresOrderInfo; - String patientERPrescriptionCounts; - String patientERProjectsContribution; - String patientERRRTGetAllQuestionsList; - String patientERRRTGetAllTransportationMethodList; - String patientERRRTGetPickUpRequestByPresOrderIDList; - String patientERRealRRTGetAllServicesList; - String patientERRealRRTGetOrderDetailsList; - String patientERRealRRTGetTransactionsForOrderList; - bool patientERRealRRTIsTransInserted; - String patientERRequestList; - String patientERTransportationRequestWithTotal; - String patientERealRRTGetServicePriceList; - String patientInfoByAdmissionNoList; - String patientMonitorGetPatientHeartRate; - int patientNotServedCounts; - String patientPrescriptionList; - String patientAllergies; - String patientCheckAppointmentValidationList; - String patientLoginTokenList; - String patientQRLoginInfoList; - String patientSELECTDeviceIMEIbyIMEIList; - String pharmList; - String prefLang; - int radReportUnreadNo; - String radGetPatientRadOrdersForDentalList; - int referralNumber; - String reminderConfigurations; - String requestNo; - int rowCount; - String servicePrivilegeList; - String shareFamilyFileObj; - String status; - int successCode; - String surveyRate; - String symptomCheckerConditionList; - String symptomCheckerGetAllDefaultQuestionsList; - String symptomCheckerGetBodyPartSymptomsList; - String symptomCheckerGetBodyPartsByCodeList; - String symptomCheckerGetBodyPartsList; - String symptomCheckerJsonResponseInString; - int timerTime; - int totalAdvanceBalanceAmount; - int totalPatientsCount; - int totalPendingApprovalCount; - int totalUnUsedCount; - int transactionNo; - int unReadCounts; - bool updateStatus; - String userAgreementContent; - int yahalaAccountNo; - bool check24HourComplaint; - String currency; - String message; - int patientID; - int returnValue; - String returnValueStr; - int statusCode; - - LacumAccountInformation( - {this.date, - this.languageID, - this.serviceName, - this.time, - this.androidLink, - this.authenticationTokenID, - this.data, - this.dataw, - this.dietType, - this.errorCode, - this.errorEndUserMessage, - this.errorEndUserMessageN, - this.errorMessage, - this.errorType, - this.foodCategory, - this.iOSLink, - this.isAuthenticated, - this.mealOrderStatus, - this.mealType, - this.messageStatus, - this.numberOfResultRecords, - this.patientBlodType, - this.successMsg, - this.successMsgN, - this.accountStatus, - this.activeArchiveObject, - this.activeMedicationCount, - this.allMedicationTakenDuringAdmissionList, - this.appointmentNo, - this.arePatientsOnlineList, - this.balanceAmount, - this.bloodGroupList, - this.cVIUnreadCount, - this.checkUserHasAccount, - this.complaintNo, - this.dischargeList, - this.episodeID, - this.finalRadiologyList, - this.fullName, - this.geoFPointsList, - this.geoGetPateintInfo, - this.getAllDoctorsByProjectAndClinicList, - this.getAppointmentNumbersForDoctorList, - this.getCheckUpItemsList, - this.getCosmeticConferenceForTodayList, - this.getDoctorERClinicResult, - this.getInvoiceApprovalList, - this.getNearestProjectList, - this.getPatientAdmissionOrAppoinmentNoList, - this.getPatientBloodType, - this.getPatientInsuranceCardStatusStatisticsList, - this.getSurveyList, - this.getTotalRegisteredPatientList, - this.getUserDetailsList, - this.getCustomerPointInfo, - this.hISApprovalList, - this.hISInpAdmissionList, - this.hISProgNoteAssesmentModelList, - this.hMGGetAllOffersList, - this.hasApproval, - this.hasConsultation, - this.hasDental, - this.hasLab, - this.hasPharmacy, - this.hasRad, - this.hmgSMSGetByProjectIDAndPatientIDList, - this.hoursLeft, - this.iNPMGetAllAdmissionList, - this.iNPMGetPatientInfoForSickLeaveReportList, - this.iNPMHISPatientMedicalStatusUnreadCount, - this.iNPMLABGetPatientLabOrdersResultsList, - this.iNPMLABGetPatientLabResultsList, - this.iNPMLABGetPatientRADReportList, - this.iNPMLABGetPatientRadResultsList, - this.iNPMRadGetPatientRadOrdersCVIList, - this.iNPMRadGetPatientRadOrdersList, - this.iNPMRadGetRadMedicalRecordsList, - this.iNPGetPrescriptionDischargesList, - this.iNPGetPrescriptionReportList, - this.identificationNo, - this.isHomeMedicineDeliverySupported, - this.isInsertedOrUpdated, - this.isMainAcoountEqualPatienID, - this.isPatientAlreadyAgreed, - this.isPatientCallBackBlackList, - this.isPatientHaveFingerPrint, - this.isPatientOnline, - this.isPatientTokenRemoved, - this.isPaused, - this.isProjectWorkingHours, - this.isStoreRateAllowed, - this.isStoreRateInserted, - this.isStoreRateUpdated, - this.labRadUpdatedToRead, - this.labReportUnreadNo, - this.lakumInquiryInformationObj, - this.lakumInquiryInformationObjVersion, - this.lakumResponseList, - this.laserGetBodyPartsByCategoryList, - this.laserGetCategoriesList, - this.list, - this.listCount, - this.listCountDeliverd, - this.listCountUnDeliverd, - this.listDeviceInfo, - this.listFamilyAppointments, - this.listLabResultsByAppNo, - this.listLakumInquiryInformationObj, - this.listOpinionGetAllPeriod, - this.listOpinionGetAllServices, - this.listOpinionGetIsAgreeValue, - this.listOpinionGetOpinionLogin, - this.listOpinionGetRequestedSerives, - this.listOpinionGetShareServicesDetails, - this.listOpinionUserTerms, - this.listPLO, - this.listPLR, - this.listPLSR, - this.listPRM, - this.listPatientFamilyFiles, - this.listPatientFileInfo, - this.listRAD, - this.listRADAPI, - this.listActiveGetPrescriptionReportByPatientID, - this.listAppointmentsForDentalClinic, - this.listBabyInfoResult, - this.listCheckInsuranceCoverage, - this.listCompanyClass, - this.listConsentMedicalReport, - this.listDentalAppointments, - this.listDeviceTokenIDByAppointmentNo, - this.listDischargeDiagnosis, - this.listDischargeMedicine, - this.listDischargeSummary, - this.listDoctorResponse, - this.listDoneVaccines, - this.listEReferralResult, - this.listEReferrals, - this.listGetAllPatientsLiveCareAdmin, - this.listGetDataForExcel, - this.listGetMainCountID, - this.listGetPrescriptionReportByPatientID, - this.listGetSickLeave, - this.listHISInvoice, - this.listHISInvoiceProcedures, - this.listInpatientInvoices, - this.listInsuranceCheckList, - this.listInsuranceCompanies, - this.listInsuranceCompaniesGroup, - this.listInsuranceUpdateDetails, - this.listInvoiceApprovalProcedureInfo, - this.listIsLastSatisfactionSurveyReviewedModel, - this.listLabOrderDetailsModel, - this.listMedicalReport, - this.listMedicalReportApprovals, - this.listMedicalReportStatus, - this.listMonthBloodPressureResult, - this.listMonthBloodPressureResultAverage, - this.listMonthDiabtecPatientResult, - this.listMonthDiabtectResultAverage, - this.listMonthWeightMeasurementResult, - this.listMonthWeightMeasurementResultAverage, - this.listOnlinePrescriptionResult, - this.listOutPatientInvoices, - this.listPHRInvoice, - this.listPHRInvoiceItems, - this.listPHRPaymentMethods, - this.listPateintDetails, - this.listPateintInformation, - this.listPatientAdmissionInfo, - this.listPatientAdvanceBalanceAmount, - this.listPatientCallBackLogs, - this.listPatientCallBackToUpdateFromICServer, - this.listPatientCount, - this.listPatientDashboard, - this.listPatientERGetAdminClinicsModel, - this.listPatientERGetAdminProjectsModel, - this.listPatientERGetAllClinicsModel, - this.listPatientHISInvoices, - this.listPatientICProjects, - this.listPatientICProjectsByID, - this.listPatientICProjectsTimings, - this.listPatientIDByUID, - this.listPatientIDForSurveyResult, - this.listPatientInfo, - this.listPatientInfoForDDScreen, - this.listPatientInfoForSickleaveReport, - this.listPatientInsuranceCard, - this.listPatientInsuranceCardHistory, - this.listPatientInsuranceDetails, - this.listPatientPHRInvoices, - this.listPatientServicePoint, - this.listPatientStatusCount, - this.listPatientChatRequestMapModel, - this.listPatientChatRequestModel, - this.listPatientChatRequestVCModel, - this.listPaymentMethods, - this.listPointServices, - this.listPregnancyStagesInfo, - this.listProjectAvgERWaitingTime, - this.listProjectAvgERWaitingTimeHourly, - this.listRadMedicalRecords, - this.listRadMedicalRecordsAPI, - this.listRadMedicalRecordsCVI, - this.listRadMedicalRecordsCVIAPI, - this.listRadMedicalRecordsResults, - this.listSickLeave, - this.listTransaction, - this.listVideoConferenceSessions, - this.listWeekBloodPressureResult, - this.listWeekBloodPressureResultAverage, - this.listWeekDiabtecPatientResult, - this.listWeekDiabtectResultAverage, - this.listWeekWeightMeasurementResult, - this.listWeekWeightMeasurementResultAverage, - this.listYearBloodPressureResult, - this.listYearBloodPressureResultAverage, - this.listYearDiabtecPatientResult, - this.listYearDiabtecResultAverage, - this.listYearWeightMeasurementResult, - this.listYearWeightMeasurementResultAverage, - this.listEInvoiceForDental, - this.listEInvoiceForOnlineCheckIn, - this.medGetActivitiesTransactionsStsList, - this.medGetAvgMonthTransactionsStsList, - this.medGetAvgWeekTransactionsStsList, - this.medGetCategoriesList, - this.medGetMonthActivitiesTransactionsStsList, - this.medGetMonthStepsTransactionsStsList, - this.medGetMonthTransactionsStsList, - this.medGetPatientLastRecordList, - this.medGetSubCategoriesList, - this.medGetTransactionsAndActTransactionsResult, - this.medGetTransactionsList, - this.medGetWeekActivitiesTransactionsStsList, - this.medGetWeekStepsTransactionsStsList, - this.medGetWeekTransactionsStsList, - this.medGetYearActivitiesTransactionsStsList, - this.medGetYearSleepTransactionsStsList, - this.medGetYearStepsTransactionsStsList, - this.medGetYearTransactionsStsList, - this.medInsertTransactionsOutputsList, - this.medicalRecordImages, - this.medicalReportToRead, - this.medicalReportUnreadNo, - this.missingIDCardAttachment, - this.missingInsuranceCardAttachment, - this.missingMedicalReportAttachment, - this.missingOtherRelationship, - this.missingPatientContactNo, - this.missingPatientId, - this.missingPatientIdentityNumber, - this.missingPatientName, - this.missingReferralContactNo, - this.missingReferralRelationship, - this.missingReferralRequesterName, - this.mobileNumber, - this.nationalityNumber, - this.onlineCheckInAppointments, - this.opinionUserAgreementContent, - this.orderInsert, - this.pateintInfoForUpdateList, - this.pateintUpatedList, - this.patientBirthdayCertificate, - this.patientERCMCRequestSummaryByProject, - this.patientERCMCRequestWithTotal, - this.patientERCMCGetAllServicesList, - this.patientERCMCGetTransactionsForOrderList, - this.patientERCoordinates, - this.patientERCountOrderList, - this.patientERCountsForApprovalOffice, - this.patientERDeleteOldCurrentDoctorsOutputsList, - this.patientERDeliveryGetAllDeliverdOrderList, - this.patientERDeliveryGetAllOrderList, - this.patientERDeliveryIsOrderInserted, - this.patientERDeliveryIsOrderUpdated, - this.patientERDeliveryIsPausedChanged, - this.patientERDeliveryNextOrder, - this.patientERDeliveryOrderInsert, - this.patientERDeliveryUpdateOrderStatus, - this.patientERDriverUpdate, - this.patientERExacartCheckIsDispenseAccpetableList, - this.patientERExacartGetDispenseQuantitiesByOrderIDList, - this.patientERExacartGetOrderDetailsByePharmacyOrderNoList, - this.patientERExacartGetOrderDetailsList, - this.patientERExacartGetTotalDispenseQuantitiesByPresNoList, - this.patientERExacartIsDispenseAdded, - this.patientERExacartIsDispenseAddedList, - this.patientERExacartIsOrderCompleted, - this.patientERGetAdminByProjectAndRoleList, - this.patientERGetAdminProjectsList, - this.patientERGetAllDriversList, - this.patientERGetAllNeedAproveStatusList, - this.patientERGetAllPresOrdersStatusList, - this.patientERGetAllProjectsList, - this.patientERGetArchiveInformationList, - this.patientERGetAskDoctorTotalByDateFilterList, - this.patientERGetBookScheduleConfigsList, - this.patientERGetClinicAndTimeAndEpisodeForAppointmentList, - this.patientERGetClinicAndTimeForDischargeList, - this.patientERGetDashboardDataforApporvalSectionForAdminList, - this.patientERGetDashboardDataforApporvalSectionList, - this.patientERGetDashboardDataforHHCSectionForAdminList, - this.patientERGetDashboardDataforHHCSectionList, - this.patientERGetDashboardDataforPrescriptionSectionForAdminList, - this.patientERGetDashboardDataforPrescriptionSectionList, - this.patientERGetDoctorDashboardDataModelList, - this.patientERGetDriverLocationList, - this.patientERGetInsuranceCardRequestByDateFilterList, - this.patientERGetLiveCareSummaryBookedAppoinmentStatusList, - this.patientERGetLiveCareSummaryCovidList, - this.patientERGetLiveCareSummaryForCMCList, - this.patientERGetLiveCareSummaryForHHCList, - this.patientERGetLiveCareSummaryForHomeDeliveryList, - this.patientERGetLiveCareSummaryForInsuranceCardRequestList, - this.patientERGetLiveCareSummaryForNewFilesList, - this.patientERGetLiveCareSummaryForOnlinePaymetRequestList, - this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList, - this.patientERGetLiveCareSummaryForTrasnportationList, - this.patientERGetLiveCareSummaryLiveCareCountsList, - this.patientERGetMedicalRequestTotalByDateFilterList, - this.patientERGetNearestPendingOrdersList, - this.patientERGetNeedAproveHistoryForOrderList, - this.patientERGetNeedAprovePendingOrdersList, - this.patientERGetNeedAproveStatusStatisticsList, - this.patientERGetPatientAllPresOrdersList, - this.patientERGetPendingPatientsCountList, - this.patientERGetPresOrdersHistoryForAdminList, - this.patientERGetPresOrdersHistoryForOrderList, - this.patientERGetPresOrdersStatusStatisticsList, - this.patientERHHCRequest, - this.patientERHHCRequestSummaryByProject, - this.patientERHHCRequestWithTotal, - this.patientERHHCGetAllServicesList, - this.patientERHHCGetTransactionsForOrderList, - this.patientERHomeDeliveryCounts, - this.patientERInsertDriver, - this.patientERInsertNewCurrentDoctorsOutputsList, - this.patientERInsuranceStatusCountList, - this.patientERIsNearestProjectUpdated, - this.patientERIsNeedAproveReturnedToQueue, - this.patientERIsNeedAproveUpdated, - this.patientERIsOrderClientRequestUpdated, - this.patientERIsOrderReturnedToQueue, - this.patientERIsPresOrderInserted, - this.patientERIsPresOrderUpdated, - this.patientERIsProjectUpdated, - this.patientERNotCompletedDetails, - this.patientERPatientsCountByCallStatus, - this.patientERPeakHourCounts, - this.patientERPresOrderInfo, - this.patientERPrescriptionCounts, - this.patientERProjectsContribution, - this.patientERRRTGetAllQuestionsList, - this.patientERRRTGetAllTransportationMethodList, - this.patientERRRTGetPickUpRequestByPresOrderIDList, - this.patientERRealRRTGetAllServicesList, - this.patientERRealRRTGetOrderDetailsList, - this.patientERRealRRTGetTransactionsForOrderList, - this.patientERRealRRTIsTransInserted, - this.patientERRequestList, - this.patientERTransportationRequestWithTotal, - this.patientERealRRTGetServicePriceList, - this.patientInfoByAdmissionNoList, - this.patientMonitorGetPatientHeartRate, - this.patientNotServedCounts, - this.patientPrescriptionList, - this.patientAllergies, - this.patientCheckAppointmentValidationList, - this.patientLoginTokenList, - this.patientQRLoginInfoList, - this.patientSELECTDeviceIMEIbyIMEIList, - this.pharmList, - this.prefLang, - this.radReportUnreadNo, - this.radGetPatientRadOrdersForDentalList, - this.referralNumber, - this.reminderConfigurations, - this.requestNo, - this.rowCount, - this.servicePrivilegeList, - this.shareFamilyFileObj, - this.status, - this.successCode, - this.surveyRate, - this.symptomCheckerConditionList, - this.symptomCheckerGetAllDefaultQuestionsList, - this.symptomCheckerGetBodyPartSymptomsList, - this.symptomCheckerGetBodyPartsByCodeList, - this.symptomCheckerGetBodyPartsList, - this.symptomCheckerJsonResponseInString, - this.timerTime, - this.totalAdvanceBalanceAmount, - this.totalPatientsCount, - this.totalPendingApprovalCount, - this.totalUnUsedCount, - this.transactionNo, - this.unReadCounts, - this.updateStatus, - this.userAgreementContent, - this.yahalaAccountNo, - this.check24HourComplaint, - this.currency, - this.message, - this.patientID, - this.returnValue, - this.returnValueStr, - this.statusCode}); - - LacumAccountInformation.fromJson(Map json) { - date = json['Date']; - languageID = json['LanguageID']; - serviceName = json['ServiceName']; - time = json['Time']; - androidLink = json['AndroidLink']; - authenticationTokenID = json['AuthenticationTokenID']; - data = json['Data']; - dataw = json['Dataw']; - dietType = json['DietType']; - errorCode = json['ErrorCode']; - errorEndUserMessage = json['ErrorEndUserMessage']; - errorEndUserMessageN = json['ErrorEndUserMessageN']; - errorMessage = json['ErrorMessage']; - errorType = json['ErrorType']; - foodCategory = json['FoodCategory']; - iOSLink = json['IOSLink']; - isAuthenticated = json['IsAuthenticated']; - mealOrderStatus = json['MealOrderStatus']; - mealType = json['MealType']; - messageStatus = json['MessageStatus']; - numberOfResultRecords = json['NumberOfResultRecords']; - patientBlodType = json['PatientBlodType']; - successMsg = json['SuccessMsg']; - successMsgN = json['SuccessMsgN']; - accountStatus = json['AccountStatus']; - activeArchiveObject = json['ActiveArchiveObject']; - activeMedicationCount = json['ActiveMedicationCount']; - allMedicationTakenDuringAdmissionList = - json['AllMedicationTakenDuringAdmission_List']; - appointmentNo = json['AppointmentNo']; - arePatientsOnlineList = json['ArePatientsOnlineList']; - balanceAmount = json['BalanceAmount']; - bloodGroupList = json['BloodGroupList']; - cVIUnreadCount = json['CVI_UnreadCount']; - checkUserHasAccount = json['CheckUserHasAccount']; - complaintNo = json['ComplaintNo']; - dischargeList = json['DischargeList']; - episodeID = json['EpisodeID']; - finalRadiologyList = json['FinalRadiologyList']; - fullName = json['FullName']; - geoFPointsList = json['GeoF_PointsList']; - geoGetPateintInfo = json['GeoGetPateintInfo']; - getAllDoctorsByProjectAndClinicList = - json['GetAllDoctorsByProjectAndClinicList']; - getAppointmentNumbersForDoctorList = - json['GetAppointmentNumbersForDoctorList']; - getCheckUpItemsList = json['GetCheckUpItemsList']; - getCosmeticConferenceForTodayList = - json['GetCosmeticConferenceForTodayList']; - getDoctorERClinicResult = json['GetDoctorERClinicResult']; - getInvoiceApprovalList = json['GetInvoiceApprovalList']; - getNearestProjectList = json['GetNearestProjectList']; - getPatientAdmissionOrAppoinmentNoList = - json['GetPatientAdmissionOrAppoinmentNo_List']; - getPatientBloodType = json['GetPatientBloodType']; - getPatientInsuranceCardStatusStatisticsList = - json['GetPatientInsuranceCardStatusStatisticsList']; - getSurveyList = json['GetSurveyList']; - getTotalRegisteredPatientList = json['GetTotalRegisteredPatientList']; - getUserDetailsList = json['GetUserDetailsList']; - getCustomerPointInfo = json['Get_CustomerPointInfo']; - hISApprovalList = json['HIS_Approval_List']; - hISInpAdmissionList = json['HIS_InpAdmission_List']; - hISProgNoteAssesmentModelList = json['HIS_ProgNoteAssesmentModel_List']; - hMGGetAllOffersList = json['HMG_GetAllOffersList']; - hasApproval = json['Has_Approval']; - hasConsultation = json['Has_Consultation']; - hasDental = json['Has_Dental']; - hasLab = json['Has_Lab']; - hasPharmacy = json['Has_Pharmacy']; - hasRad = json['Has_Rad']; - hmgSMSGetByProjectIDAndPatientIDList = - json['Hmg_SMS_Get_By_ProjectID_And_PatientIDList']; - hoursLeft = json['HoursLeft']; - iNPMGetAllAdmissionList = json['INPM_GetAllAdmission_List']; - iNPMGetPatientInfoForSickLeaveReportList = - json['INPM_GetPatientInfoForSickLeaveReport_List']; - iNPMHISPatientMedicalStatusUnreadCount = - json['INPM_HIS_PatientMedicalStatus_UnreadCount']; - iNPMLABGetPatientLabOrdersResultsList = - json['INPM_LAB_GetPatientLabOrdersResults_List']; - iNPMLABGetPatientLabResultsList = - json['INPM_LAB_GetPatientLabResults_List']; - iNPMLABGetPatientRADReportList = json['INPM_LAB_GetPatientRADReport_List']; - iNPMLABGetPatientRadResultsList = - json['INPM_LAB_GetPatientRadResults_List']; - iNPMRadGetPatientRadOrdersCVIList = - json['INPM_Rad_GetPatientRadOrders_CVI_List']; - iNPMRadGetPatientRadOrdersList = json['INPM_Rad_GetPatientRadOrders_List']; - iNPMRadGetRadMedicalRecordsList = - json['INPM_Rad_GetRadMedicalRecords_List']; - iNPGetPrescriptionDischargesList = - json['INP_GetPrescriptionDischarges_List']; - iNPGetPrescriptionReportList = json['INP_GetPrescriptionReport_List']; - identificationNo = json['IdentificationNo']; - isHomeMedicineDeliverySupported = json['IsHomeMedicineDeliverySupported']; - isInsertedOrUpdated = json['IsInsertedOrUpdated']; - isMainAcoountEqualPatienID = json['IsMainAcoountEqualPatienID']; - isPatientAlreadyAgreed = json['IsPatientAlreadyAgreed']; - isPatientCallBackBlackList = json['IsPatientCallBackBlackList']; - isPatientHaveFingerPrint = json['IsPatientHaveFingerPrint']; - isPatientOnline = json['IsPatientOnline']; - isPatientTokenRemoved = json['IsPatientTokenRemoved']; - isPaused = json['IsPaused']; - isProjectWorkingHours = json['IsProjectWorkingHours']; - isStoreRateAllowed = json['IsStoreRateAllowed']; - isStoreRateInserted = json['IsStoreRateInserted']; - isStoreRateUpdated = json['IsStoreRateUpdated']; - labRadUpdatedToRead = json['LabRadUpdatedToRead']; - labReportUnreadNo = json['LabReportUnreadNo']; - lakumInquiryInformationObj = json['LakumInquiryInformationObj']; - lakumInquiryInformationObjVersion = - json['LakumInquiryInformationObjVersion'] != null - ? new LakumInquiryInformationObjVersion.fromJson( - json['LakumInquiryInformationObjVersion']) - : null; - lakumResponseList = json['LakumResponseList']; - laserGetBodyPartsByCategoryList = json['Laser_GetBodyPartsByCategoryList']; - laserGetCategoriesList = json['Laser_GetCategoriesList']; - list = json['List']; - listCount = json['ListCount']; - listCountDeliverd = json['ListCountDeliverd']; - listCountUnDeliverd = json['ListCountUnDeliverd']; - listDeviceInfo = json['ListDeviceInfo']; - listFamilyAppointments = json['ListFamilyAppointments']; - listLabResultsByAppNo = json['ListLabResultsByAppNo']; - listLakumInquiryInformationObj = json['ListLakumInquiryInformationObj']; - listOpinionGetAllPeriod = json['ListOpinion_GetAllPeriod']; - listOpinionGetAllServices = json['ListOpinion_GetAllServices']; - listOpinionGetIsAgreeValue = json['ListOpinion_GetIsAgreeValue']; - listOpinionGetOpinionLogin = json['ListOpinion_GetOpinionLogin']; - listOpinionGetRequestedSerives = json['ListOpinion_GetRequestedSerives']; - listOpinionGetShareServicesDetails = - json['ListOpinion_GetShareServicesDetails']; - listOpinionUserTerms = json['ListOpinion_UserTerms']; - listPLO = json['ListPLO']; - listPLR = json['ListPLR']; - listPLSR = json['ListPLSR']; - listPRM = json['ListPRM']; - listPatientFamilyFiles = json['ListPatientFamilyFiles']; - listPatientFileInfo = json['ListPatientFileInfo']; - listRAD = json['ListRAD']; - listRADAPI = json['ListRADAPI']; - listActiveGetPrescriptionReportByPatientID = - json['List_ActiveGetPrescriptionReportByPatientID']; - listAppointmentsForDentalClinic = json['List_AppointmentsForDentalClinic']; - listBabyInfoResult = json['List_BabyInfoResult']; - listCheckInsuranceCoverage = json['List_CheckInsuranceCoverage']; - listCompanyClass = json['List_CompanyClass']; - listConsentMedicalReport = json['List_ConsentMedicalReport']; - listDentalAppointments = json['List_DentalAppointments']; - listDeviceTokenIDByAppointmentNo = - json['List_DeviceTokenIDByAppointmentNo']; - listDischargeDiagnosis = json['List_DischargeDiagnosis']; - listDischargeMedicine = json['List_DischargeMedicine']; - listDischargeSummary = json['List_DischargeSummary']; - listDoctorResponse = json['List_DoctorResponse']; - listDoneVaccines = json['List_DoneVaccines']; - listEReferralResult = json['List_EReferralResult']; - listEReferrals = json['List_EReferrals']; - listGetAllPatientsLiveCareAdmin = - json['List_GetAllPatients_LiveCare_Admin']; - listGetDataForExcel = json['List_GetDataForExcel']; - listGetMainCountID = json['List_GetMainCountID']; - listGetPrescriptionReportByPatientID = - json['List_GetPrescriptionReportByPatientID']; - listGetSickLeave = json['List_GetSickLeave']; - listHISInvoice = json['List_HISInvoice']; - listHISInvoiceProcedures = json['List_HISInvoiceProcedures']; - listInpatientInvoices = json['List_InpatientInvoices']; - listInsuranceCheckList = json['List_InsuranceCheckList']; - listInsuranceCompanies = json['List_InsuranceCompanies']; - listInsuranceCompaniesGroup = json['List_InsuranceCompaniesGroup']; - listInsuranceUpdateDetails = json['List_InsuranceUpdateDetails']; - listInvoiceApprovalProcedureInfo = - json['List_InvoiceApprovalProcedureInfo']; - listIsLastSatisfactionSurveyReviewedModel = - json['List_IsLastSatisfactionSurveyReviewedModel']; - listLabOrderDetailsModel = json['List_LabOrderDetailsModel']; - listMedicalReport = json['List_MedicalReport']; - listMedicalReportApprovals = json['List_MedicalReportApprovals']; - listMedicalReportStatus = json['List_MedicalReportStatus']; - listMonthBloodPressureResult = json['List_MonthBloodPressureResult']; - listMonthBloodPressureResultAverage = - json['List_MonthBloodPressureResultAverage']; - listMonthDiabtecPatientResult = json['List_MonthDiabtecPatientResult']; - listMonthDiabtectResultAverage = json['List_MonthDiabtectResultAverage']; - listMonthWeightMeasurementResult = - json['List_MonthWeightMeasurementResult']; - listMonthWeightMeasurementResultAverage = - json['List_MonthWeightMeasurementResultAverage']; - listOnlinePrescriptionResult = json['List_OnlinePrescriptionResult']; - listOutPatientInvoices = json['List_OutPatientInvoices']; - listPHRInvoice = json['List_PHRInvoice']; - listPHRInvoiceItems = json['List_PHRInvoiceItems']; - listPHRPaymentMethods = json['List_PHRPaymentMethods']; - listPateintDetails = json['List_PateintDetails']; - listPateintInformation = json['List_PateintInformation']; - listPatientAdmissionInfo = json['List_PatientAdmissionInfo']; - listPatientAdvanceBalanceAmount = json['List_PatientAdvanceBalanceAmount']; - listPatientCallBackLogs = json['List_PatientCallBackLogs']; - listPatientCallBackToUpdateFromICServer = - json['List_PatientCallBackToUpdateFromICServer']; - listPatientCount = json['List_PatientCount']; - listPatientDashboard = json['List_PatientDashboard']; - listPatientERGetAdminClinicsModel = - json['List_PatientER_GetAdminClinicsModel']; - listPatientERGetAdminProjectsModel = - json['List_PatientER_GetAdminProjectsModel']; - listPatientERGetAllClinicsModel = json['List_PatientER_GetAllClinicsModel']; - listPatientHISInvoices = json['List_PatientHISInvoices']; - listPatientICProjects = json['List_PatientICProjects']; - listPatientICProjectsByID = json['List_PatientICProjectsByID']; - listPatientICProjectsTimings = json['List_PatientICProjectsTimings']; - listPatientIDByUID = json['List_PatientIDByUID']; - listPatientIDForSurveyResult = json['List_PatientIDForSurveyResult']; - listPatientInfo = json['List_PatientInfo']; - listPatientInfoForDDScreen = json['List_PatientInfoForDDScreen']; - listPatientInfoForSickleaveReport = - json['List_PatientInfoForSickleaveReport']; - listPatientInsuranceCard = json['List_PatientInsuranceCard']; - listPatientInsuranceCardHistory = json['List_PatientInsuranceCardHistory']; - listPatientInsuranceDetails = json['List_PatientInsuranceDetails']; - listPatientPHRInvoices = json['List_PatientPHRInvoices']; - listPatientServicePoint = json['List_PatientServicePoint']; - listPatientStatusCount = json['List_PatientStatusCount']; - listPatientChatRequestMapModel = json['List_Patient_ChatRequestMapModel']; - listPatientChatRequestModel = json['List_Patient_ChatRequestModel']; - listPatientChatRequestVCModel = json['List_Patient_ChatRequestVCModel']; - listPaymentMethods = json['List_PaymentMethods']; - listPointServices = json['List_PointServices']; - listPregnancyStagesInfo = json['List_PregnancyStagesInfo']; - listProjectAvgERWaitingTime = json['List_ProjectAvgERWaitingTime']; - listProjectAvgERWaitingTimeHourly = - json['List_ProjectAvgERWaitingTimeHourly']; - listRadMedicalRecords = json['List_RadMedicalRecords']; - listRadMedicalRecordsAPI = json['List_RadMedicalRecordsAPI']; - listRadMedicalRecordsCVI = json['List_RadMedicalRecordsCVI']; - listRadMedicalRecordsCVIAPI = json['List_RadMedicalRecordsCVIAPI']; - listRadMedicalRecordsResults = json['List_RadMedicalRecordsResults']; - listSickLeave = json['List_SickLeave']; - listTransaction = json['List_Transaction']; - listVideoConferenceSessions = json['List_VideoConferenceSessions']; - listWeekBloodPressureResult = json['List_WeekBloodPressureResult']; - listWeekBloodPressureResultAverage = - json['List_WeekBloodPressureResultAverage']; - listWeekDiabtecPatientResult = json['List_WeekDiabtecPatientResult']; - listWeekDiabtectResultAverage = json['List_WeekDiabtectResultAverage']; - listWeekWeightMeasurementResult = json['List_WeekWeightMeasurementResult']; - listWeekWeightMeasurementResultAverage = - json['List_WeekWeightMeasurementResultAverage']; - listYearBloodPressureResult = json['List_YearBloodPressureResult']; - listYearBloodPressureResultAverage = - json['List_YearBloodPressureResultAverage']; - listYearDiabtecPatientResult = json['List_YearDiabtecPatientResult']; - listYearDiabtecResultAverage = json['List_YearDiabtecResultAverage']; - listYearWeightMeasurementResult = json['List_YearWeightMeasurementResult']; - listYearWeightMeasurementResultAverage = - json['List_YearWeightMeasurementResultAverage']; - listEInvoiceForDental = json['List_eInvoiceForDental']; - listEInvoiceForOnlineCheckIn = json['List_eInvoiceForOnlineCheckIn']; - medGetActivitiesTransactionsStsList = - json['Med_GetActivitiesTransactionsStsList']; - medGetAvgMonthTransactionsStsList = - json['Med_GetAvgMonthTransactionsStsList']; - medGetAvgWeekTransactionsStsList = - json['Med_GetAvgWeekTransactionsStsList']; - medGetCategoriesList = json['Med_GetCategoriesList']; - medGetMonthActivitiesTransactionsStsList = - json['Med_GetMonthActivitiesTransactionsStsList']; - medGetMonthStepsTransactionsStsList = - json['Med_GetMonthStepsTransactionsStsList']; - medGetMonthTransactionsStsList = json['Med_GetMonthTransactionsStsList']; - medGetPatientLastRecordList = json['Med_GetPatientLastRecordList']; - medGetSubCategoriesList = json['Med_GetSubCategoriesList']; - medGetTransactionsAndActTransactionsResult = - json['Med_GetTransactionsAndActTransactionsResult']; - medGetTransactionsList = json['Med_GetTransactionsList']; - medGetWeekActivitiesTransactionsStsList = - json['Med_GetWeekActivitiesTransactionsStsList']; - medGetWeekStepsTransactionsStsList = - json['Med_GetWeekStepsTransactionsStsList']; - medGetWeekTransactionsStsList = json['Med_GetWeekTransactionsStsList']; - medGetYearActivitiesTransactionsStsList = - json['Med_GetYearActivitiesTransactionsStsList']; - medGetYearSleepTransactionsStsList = - json['Med_GetYearSleepTransactionsStsList']; - medGetYearStepsTransactionsStsList = - json['Med_GetYearStepsTransactionsStsList']; - medGetYearTransactionsStsList = json['Med_GetYearTransactionsStsList']; - medInsertTransactionsOutputsList = - json['Med_InsertTransactionsOutputsList']; - medicalRecordImages = json['MedicalRecordImages']; - medicalReportToRead = json['MedicalReportToRead']; - medicalReportUnreadNo = json['MedicalReportUnreadNo']; - missingIDCardAttachment = json['Missing_IDCardAttachment']; - missingInsuranceCardAttachment = json['Missing_InsuranceCardAttachment']; - missingMedicalReportAttachment = json['Missing_MedicalReportAttachment']; - missingOtherRelationship = json['Missing_OtherRelationship']; - missingPatientContactNo = json['Missing_PatientContactNo']; - missingPatientId = json['Missing_PatientId']; - missingPatientIdentityNumber = json['Missing_PatientIdentityNumber']; - missingPatientName = json['Missing_PatientName']; - missingReferralContactNo = json['Missing_ReferralContactNo']; - missingReferralRelationship = json['Missing_ReferralRelationship']; - missingReferralRequesterName = json['Missing_ReferralRequesterName']; - mobileNumber = json['MobileNumber']; - nationalityNumber = json['NationalityNumber']; - onlineCheckInAppointments = json['OnlineCheckInAppointments']; - opinionUserAgreementContent = json['Opinion_UserAgreementContent']; - orderInsert = json['OrderInsert']; - pateintInfoForUpdateList = json['PateintInfoForUpdateList']; - pateintUpatedList = json['PateintUpatedList']; - patientBirthdayCertificate = json['PatientBirthdayCertificate']; - patientERCMCRequestSummaryByProject = - json['PatientER_CMCRequestSummaryByProject']; - patientERCMCRequestWithTotal = json['PatientER_CMCRequestWithTotal']; - patientERCMCGetAllServicesList = json['PatientER_CMC_GetAllServicesList']; - patientERCMCGetTransactionsForOrderList = - json['PatientER_CMC_GetTransactionsForOrderList']; - patientERCoordinates = json['PatientER_Coordinates']; - patientERCountOrderList = json['PatientER_CountOrderList']; - patientERCountsForApprovalOffice = - json['PatientER_CountsForApprovalOffice']; - patientERDeleteOldCurrentDoctorsOutputsList = - json['PatientER_DeleteOldCurrentDoctorsOutputsList']; - patientERDeliveryGetAllDeliverdOrderList = - json['PatientER_Delivery_GetAllDeliverdOrderList']; - patientERDeliveryGetAllOrderList = - json['PatientER_Delivery_GetAllOrderList']; - patientERDeliveryIsOrderInserted = - json['PatientER_Delivery_IsOrderInserted']; - patientERDeliveryIsOrderUpdated = json['PatientER_Delivery_IsOrderUpdated']; - patientERDeliveryIsPausedChanged = - json['PatientER_Delivery_IsPausedChanged']; - patientERDeliveryNextOrder = json['PatientER_Delivery_NextOrder']; - patientERDeliveryOrderInsert = json['PatientER_Delivery_OrderInsert']; - patientERDeliveryUpdateOrderStatus = - json['PatientER_Delivery_UpdateOrderStatus']; - patientERDriverUpdate = json['PatientER_DriverUpdate']; - patientERExacartCheckIsDispenseAccpetableList = - json['PatientER_Exacart_CheckIsDispenseAccpetableList']; - patientERExacartGetDispenseQuantitiesByOrderIDList = - json['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList']; - patientERExacartGetOrderDetailsByePharmacyOrderNoList = - json['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList']; - patientERExacartGetOrderDetailsList = - json['PatientER_Exacart_GetOrderDetailsList']; - patientERExacartGetTotalDispenseQuantitiesByPresNoList = - json['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList']; - patientERExacartIsDispenseAdded = json['PatientER_Exacart_IsDispenseAdded']; - patientERExacartIsDispenseAddedList = - json['PatientER_Exacart_IsDispenseAddedList']; - patientERExacartIsOrderCompleted = - json['PatientER_Exacart_IsOrderCompleted']; - patientERGetAdminByProjectAndRoleList = - json['PatientER_GetAdminByProjectAndRoleList']; - patientERGetAdminProjectsList = json['PatientER_GetAdminProjectsList']; - patientERGetAllDriversList = json['PatientER_GetAllDriversList']; - patientERGetAllNeedAproveStatusList = - json['PatientER_GetAllNeedAproveStatusList']; - patientERGetAllPresOrdersStatusList = - json['PatientER_GetAllPresOrdersStatusList']; - patientERGetAllProjectsList = json['PatientER_GetAllProjectsList']; - patientERGetArchiveInformationList = - json['PatientER_GetArchiveInformation_List']; - patientERGetAskDoctorTotalByDateFilterList = - json['PatientER_GetAskDoctorTotalByDateFilterList']; - patientERGetBookScheduleConfigsList = - json['PatientER_GetBookScheduleConfigsList']; - patientERGetClinicAndTimeAndEpisodeForAppointmentList = - json['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList']; - patientERGetClinicAndTimeForDischargeList = - json['PatientER_GetClinicAndTimeForDischargeList']; - patientERGetDashboardDataforApporvalSectionForAdminList = - json['PatientER_GetDashboardDataforApporvalSectionForAdminList']; - patientERGetDashboardDataforApporvalSectionList = - json['PatientER_GetDashboardDataforApporvalSectionList']; - patientERGetDashboardDataforHHCSectionForAdminList = - json['PatientER_GetDashboardDataforHHCSectionForAdminList']; - patientERGetDashboardDataforHHCSectionList = - json['PatientER_GetDashboardDataforHHCSectionList']; - patientERGetDashboardDataforPrescriptionSectionForAdminList = - json['PatientER_GetDashboardDataforPrescriptionSectionForAdminList']; - patientERGetDashboardDataforPrescriptionSectionList = - json['PatientER_GetDashboardDataforPrescriptionSectionList']; - patientERGetDoctorDashboardDataModelList = - json['PatientER_GetDoctorDashboardDataModelList']; - patientERGetDriverLocationList = json['PatientER_GetDriverLocationList']; - patientERGetInsuranceCardRequestByDateFilterList = - json['PatientER_GetInsuranceCardRequestByDateFilterList']; - patientERGetLiveCareSummaryBookedAppoinmentStatusList = - json['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList']; - patientERGetLiveCareSummaryCovidList = - json['PatientER_GetLiveCareSummaryCovidList']; - patientERGetLiveCareSummaryForCMCList = - json['PatientER_GetLiveCareSummaryForCMCList']; - patientERGetLiveCareSummaryForHHCList = - json['PatientER_GetLiveCareSummaryForHHCList']; - patientERGetLiveCareSummaryForHomeDeliveryList = - json['PatientER_GetLiveCareSummaryForHomeDeliveryList']; - patientERGetLiveCareSummaryForInsuranceCardRequestList = - json['PatientER_GetLiveCareSummaryForInsuranceCardRequestList']; - patientERGetLiveCareSummaryForNewFilesList = - json['PatientER_GetLiveCareSummaryForNewFilesList']; - patientERGetLiveCareSummaryForOnlinePaymetRequestList = - json['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList']; - patientERGetLiveCareSummaryForOnlinePharmacyOrdersList = - json['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList']; - patientERGetLiveCareSummaryForTrasnportationList = - json['PatientER_GetLiveCareSummaryForTrasnportationList']; - patientERGetLiveCareSummaryLiveCareCountsList = - json['PatientER_GetLiveCareSummaryLiveCareCountsList']; - patientERGetMedicalRequestTotalByDateFilterList = - json['PatientER_GetMedicalRequestTotalByDateFilterList']; - patientERGetNearestPendingOrdersList = - json['PatientER_GetNearestPendingOrdersList']; - patientERGetNeedAproveHistoryForOrderList = - json['PatientER_GetNeedAproveHistoryForOrderList']; - patientERGetNeedAprovePendingOrdersList = - json['PatientER_GetNeedAprovePendingOrdersList']; - patientERGetNeedAproveStatusStatisticsList = - json['PatientER_GetNeedAproveStatusStatisticsList']; - patientERGetPatientAllPresOrdersList = - json['PatientER_GetPatientAllPresOrdersList']; - patientERGetPendingPatientsCountList = - json['PatientER_GetPendingPatientsCountList']; - patientERGetPresOrdersHistoryForAdminList = - json['PatientER_GetPresOrdersHistoryForAdminList']; - patientERGetPresOrdersHistoryForOrderList = - json['PatientER_GetPresOrdersHistoryForOrderList']; - patientERGetPresOrdersStatusStatisticsList = - json['PatientER_GetPresOrdersStatusStatisticsList']; - patientERHHCRequest = json['PatientER_HHCRequest']; - patientERHHCRequestSummaryByProject = - json['PatientER_HHCRequestSummaryByProject']; - patientERHHCRequestWithTotal = json['PatientER_HHCRequestWithTotal']; - patientERHHCGetAllServicesList = json['PatientER_HHC_GetAllServicesList']; - patientERHHCGetTransactionsForOrderList = - json['PatientER_HHC_GetTransactionsForOrderList']; - patientERHomeDeliveryCounts = json['PatientER_HomeDeliveryCounts']; - patientERInsertDriver = json['PatientER_InsertDriver']; - patientERInsertNewCurrentDoctorsOutputsList = - json['PatientER_InsertNewCurrentDoctorsOutputsList']; - patientERInsuranceStatusCountList = - json['PatientER_InsuranceStatusCountList']; - patientERIsNearestProjectUpdated = - json['PatientER_IsNearestProjectUpdated']; - patientERIsNeedAproveReturnedToQueue = - json['PatientER_IsNeedAproveReturnedToQueue']; - patientERIsNeedAproveUpdated = json['PatientER_IsNeedAproveUpdated']; - patientERIsOrderClientRequestUpdated = - json['PatientER_IsOrderClientRequestUpdated']; - patientERIsOrderReturnedToQueue = json['PatientER_IsOrderReturnedToQueue']; - patientERIsPresOrderInserted = json['PatientER_IsPresOrderInserted']; - patientERIsPresOrderUpdated = json['PatientER_IsPresOrderUpdated']; - patientERIsProjectUpdated = json['PatientER_IsProjectUpdated']; - patientERNotCompletedDetails = json['PatientER_NotCompletedDetails']; - patientERPatientsCountByCallStatus = - json['PatientER_PatientsCountByCallStatus']; - patientERPeakHourCounts = json['PatientER_PeakHourCounts']; - patientERPresOrderInfo = json['PatientER_PresOrderInfo']; - patientERPrescriptionCounts = json['PatientER_PrescriptionCounts']; - patientERProjectsContribution = json['PatientER_ProjectsContribution']; - patientERRRTGetAllQuestionsList = json['PatientER_RRT_GetAllQuestionsList']; - patientERRRTGetAllTransportationMethodList = - json['PatientER_RRT_GetAllTransportationMethodList']; - patientERRRTGetPickUpRequestByPresOrderIDList = - json['PatientER_RRT_GetPickUpRequestByPresOrderIDList']; - patientERRealRRTGetAllServicesList = - json['PatientER_RealRRT_GetAllServicesList']; - patientERRealRRTGetOrderDetailsList = - json['PatientER_RealRRT_GetOrderDetailsList']; - patientERRealRRTGetTransactionsForOrderList = - json['PatientER_RealRRT_GetTransactionsForOrderList']; - patientERRealRRTIsTransInserted = json['PatientER_RealRRT_IsTransInserted']; - patientERRequestList = json['PatientER_RequestList']; - patientERTransportationRequestWithTotal = - json['PatientER_TransportationRequestWithTotal']; - patientERealRRTGetServicePriceList = - json['PatientE_RealRRT_GetServicePriceList']; - patientInfoByAdmissionNoList = json['PatientInfoByAdmissionNo_List']; - patientMonitorGetPatientHeartRate = - json['PatientMonitor_GetPatientHeartRate']; - patientNotServedCounts = json['PatientNotServedCounts']; - patientPrescriptionList = json['PatientPrescriptionList']; - patientAllergies = json['Patient_Allergies']; - patientCheckAppointmentValidationList = - json['Patient_CheckAppointmentValidationList']; - patientLoginTokenList = json['Patient_LoginTokenList']; - patientQRLoginInfoList = json['Patient_QRLoginInfoList']; - patientSELECTDeviceIMEIbyIMEIList = - json['Patient_SELECTDeviceIMEIbyIMEIList']; - pharmList = json['PharmList']; - prefLang = json['PrefLang']; - radReportUnreadNo = json['RadReportUnreadNo']; - radGetPatientRadOrdersForDentalList = - json['Rad_GetPatientRadOrdersForDental_List']; - referralNumber = json['ReferralNumber']; - reminderConfigurations = json['ReminderConfigurations']; - requestNo = json['RequestNo']; - rowCount = json['RowCount']; - servicePrivilegeList = json['ServicePrivilegeList']; - shareFamilyFileObj = json['ShareFamilyFileObj']; - status = json['Status']; - successCode = json['SuccessCode']; - surveyRate = json['SurveyRate']; - symptomCheckerConditionList = json['SymptomChecker_ConditionList']; - symptomCheckerGetAllDefaultQuestionsList = - json['SymptomChecker_GetAllDefaultQuestionsList']; - symptomCheckerGetBodyPartSymptomsList = - json['SymptomChecker_GetBodyPartSymptomsList']; - symptomCheckerGetBodyPartsByCodeList = - json['SymptomChecker_GetBodyPartsByCodeList']; - symptomCheckerGetBodyPartsList = json['SymptomChecker_GetBodyPartsList']; - symptomCheckerJsonResponseInString = - json['SymptomChecker_JsonResponseInString']; - timerTime = json['TimerTime']; - totalAdvanceBalanceAmount = json['TotalAdvanceBalanceAmount']; - totalPatientsCount = json['TotalPatientsCount']; - totalPendingApprovalCount = json['TotalPendingApprovalCount']; - totalUnUsedCount = json['TotalUnUsedCount']; - transactionNo = json['TransactionNo']; - unReadCounts = json['UnReadCounts']; - updateStatus = json['UpdateStatus']; - userAgreementContent = json['UserAgreementContent']; - yahalaAccountNo = json['YahalaAccountNo']; - check24HourComplaint = json['check24HourComplaint']; - currency = json['currency']; - message = json['message']; - patientID = json['patientID']; - returnValue = json['returnValue']; - returnValueStr = json['returnValueStr']; - statusCode = json['statusCode']; - } - - Map toJson() { - final Map data = new Map(); - data['Date'] = this.date; - data['LanguageID'] = this.languageID; - data['ServiceName'] = this.serviceName; - data['Time'] = this.time; - data['AndroidLink'] = this.androidLink; - data['AuthenticationTokenID'] = this.authenticationTokenID; - data['Data'] = this.data; - data['Dataw'] = this.dataw; - data['DietType'] = this.dietType; - data['ErrorCode'] = this.errorCode; - data['ErrorEndUserMessage'] = this.errorEndUserMessage; - data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; - data['ErrorMessage'] = this.errorMessage; - data['ErrorType'] = this.errorType; - data['FoodCategory'] = this.foodCategory; - data['IOSLink'] = this.iOSLink; - data['IsAuthenticated'] = this.isAuthenticated; - data['MealOrderStatus'] = this.mealOrderStatus; - data['MealType'] = this.mealType; - data['MessageStatus'] = this.messageStatus; - data['NumberOfResultRecords'] = this.numberOfResultRecords; - data['PatientBlodType'] = this.patientBlodType; - data['SuccessMsg'] = this.successMsg; - data['SuccessMsgN'] = this.successMsgN; - data['AccountStatus'] = this.accountStatus; - data['ActiveArchiveObject'] = this.activeArchiveObject; - data['ActiveMedicationCount'] = this.activeMedicationCount; - data['AllMedicationTakenDuringAdmission_List'] = - this.allMedicationTakenDuringAdmissionList; - data['AppointmentNo'] = this.appointmentNo; - data['ArePatientsOnlineList'] = this.arePatientsOnlineList; - data['BalanceAmount'] = this.balanceAmount; - data['BloodGroupList'] = this.bloodGroupList; - data['CVI_UnreadCount'] = this.cVIUnreadCount; - data['CheckUserHasAccount'] = this.checkUserHasAccount; - data['ComplaintNo'] = this.complaintNo; - data['DischargeList'] = this.dischargeList; - data['EpisodeID'] = this.episodeID; - data['FinalRadiologyList'] = this.finalRadiologyList; - data['FullName'] = this.fullName; - data['GeoF_PointsList'] = this.geoFPointsList; - data['GeoGetPateintInfo'] = this.geoGetPateintInfo; - data['GetAllDoctorsByProjectAndClinicList'] = - this.getAllDoctorsByProjectAndClinicList; - data['GetAppointmentNumbersForDoctorList'] = - this.getAppointmentNumbersForDoctorList; - data['GetCheckUpItemsList'] = this.getCheckUpItemsList; - data['GetCosmeticConferenceForTodayList'] = - this.getCosmeticConferenceForTodayList; - data['GetDoctorERClinicResult'] = this.getDoctorERClinicResult; - data['GetInvoiceApprovalList'] = this.getInvoiceApprovalList; - data['GetNearestProjectList'] = this.getNearestProjectList; - data['GetPatientAdmissionOrAppoinmentNo_List'] = - this.getPatientAdmissionOrAppoinmentNoList; - data['GetPatientBloodType'] = this.getPatientBloodType; - data['GetPatientInsuranceCardStatusStatisticsList'] = - this.getPatientInsuranceCardStatusStatisticsList; - data['GetSurveyList'] = this.getSurveyList; - data['GetTotalRegisteredPatientList'] = this.getTotalRegisteredPatientList; - data['GetUserDetailsList'] = this.getUserDetailsList; - data['Get_CustomerPointInfo'] = this.getCustomerPointInfo; - data['HIS_Approval_List'] = this.hISApprovalList; - data['HIS_InpAdmission_List'] = this.hISInpAdmissionList; - data['HIS_ProgNoteAssesmentModel_List'] = - this.hISProgNoteAssesmentModelList; - data['HMG_GetAllOffersList'] = this.hMGGetAllOffersList; - data['Has_Approval'] = this.hasApproval; - data['Has_Consultation'] = this.hasConsultation; - data['Has_Dental'] = this.hasDental; - data['Has_Lab'] = this.hasLab; - data['Has_Pharmacy'] = this.hasPharmacy; - data['Has_Rad'] = this.hasRad; - data['Hmg_SMS_Get_By_ProjectID_And_PatientIDList'] = - this.hmgSMSGetByProjectIDAndPatientIDList; - data['HoursLeft'] = this.hoursLeft; - data['INPM_GetAllAdmission_List'] = this.iNPMGetAllAdmissionList; - data['INPM_GetPatientInfoForSickLeaveReport_List'] = - this.iNPMGetPatientInfoForSickLeaveReportList; - data['INPM_HIS_PatientMedicalStatus_UnreadCount'] = - this.iNPMHISPatientMedicalStatusUnreadCount; - data['INPM_LAB_GetPatientLabOrdersResults_List'] = - this.iNPMLABGetPatientLabOrdersResultsList; - data['INPM_LAB_GetPatientLabResults_List'] = - this.iNPMLABGetPatientLabResultsList; - data['INPM_LAB_GetPatientRADReport_List'] = - this.iNPMLABGetPatientRADReportList; - data['INPM_LAB_GetPatientRadResults_List'] = - this.iNPMLABGetPatientRadResultsList; - data['INPM_Rad_GetPatientRadOrders_CVI_List'] = - this.iNPMRadGetPatientRadOrdersCVIList; - data['INPM_Rad_GetPatientRadOrders_List'] = - this.iNPMRadGetPatientRadOrdersList; - data['INPM_Rad_GetRadMedicalRecords_List'] = - this.iNPMRadGetRadMedicalRecordsList; - data['INP_GetPrescriptionDischarges_List'] = - this.iNPGetPrescriptionDischargesList; - data['INP_GetPrescriptionReport_List'] = this.iNPGetPrescriptionReportList; - data['IdentificationNo'] = this.identificationNo; - data['IsHomeMedicineDeliverySupported'] = - this.isHomeMedicineDeliverySupported; - data['IsInsertedOrUpdated'] = this.isInsertedOrUpdated; - data['IsMainAcoountEqualPatienID'] = this.isMainAcoountEqualPatienID; - data['IsPatientAlreadyAgreed'] = this.isPatientAlreadyAgreed; - data['IsPatientCallBackBlackList'] = this.isPatientCallBackBlackList; - data['IsPatientHaveFingerPrint'] = this.isPatientHaveFingerPrint; - data['IsPatientOnline'] = this.isPatientOnline; - data['IsPatientTokenRemoved'] = this.isPatientTokenRemoved; - data['IsPaused'] = this.isPaused; - data['IsProjectWorkingHours'] = this.isProjectWorkingHours; - data['IsStoreRateAllowed'] = this.isStoreRateAllowed; - data['IsStoreRateInserted'] = this.isStoreRateInserted; - data['IsStoreRateUpdated'] = this.isStoreRateUpdated; - data['LabRadUpdatedToRead'] = this.labRadUpdatedToRead; - data['LabReportUnreadNo'] = this.labReportUnreadNo; - data['LakumInquiryInformationObj'] = this.lakumInquiryInformationObj; - if (this.lakumInquiryInformationObjVersion != null) { - data['LakumInquiryInformationObjVersion'] = - this.lakumInquiryInformationObjVersion.toJson(); - } - data['LakumResponseList'] = this.lakumResponseList; - data['Laser_GetBodyPartsByCategoryList'] = - this.laserGetBodyPartsByCategoryList; - data['Laser_GetCategoriesList'] = this.laserGetCategoriesList; - data['List'] = this.list; - data['ListCount'] = this.listCount; - data['ListCountDeliverd'] = this.listCountDeliverd; - data['ListCountUnDeliverd'] = this.listCountUnDeliverd; - data['ListDeviceInfo'] = this.listDeviceInfo; - data['ListFamilyAppointments'] = this.listFamilyAppointments; - data['ListLabResultsByAppNo'] = this.listLabResultsByAppNo; - data['ListLakumInquiryInformationObj'] = - this.listLakumInquiryInformationObj; - data['ListOpinion_GetAllPeriod'] = this.listOpinionGetAllPeriod; - data['ListOpinion_GetAllServices'] = this.listOpinionGetAllServices; - data['ListOpinion_GetIsAgreeValue'] = this.listOpinionGetIsAgreeValue; - data['ListOpinion_GetOpinionLogin'] = this.listOpinionGetOpinionLogin; - data['ListOpinion_GetRequestedSerives'] = - this.listOpinionGetRequestedSerives; - data['ListOpinion_GetShareServicesDetails'] = - this.listOpinionGetShareServicesDetails; - data['ListOpinion_UserTerms'] = this.listOpinionUserTerms; - data['ListPLO'] = this.listPLO; - data['ListPLR'] = this.listPLR; - data['ListPLSR'] = this.listPLSR; - data['ListPRM'] = this.listPRM; - data['ListPatientFamilyFiles'] = this.listPatientFamilyFiles; - data['ListPatientFileInfo'] = this.listPatientFileInfo; - data['ListRAD'] = this.listRAD; - data['ListRADAPI'] = this.listRADAPI; - data['List_ActiveGetPrescriptionReportByPatientID'] = - this.listActiveGetPrescriptionReportByPatientID; - data['List_AppointmentsForDentalClinic'] = - this.listAppointmentsForDentalClinic; - data['List_BabyInfoResult'] = this.listBabyInfoResult; - data['List_CheckInsuranceCoverage'] = this.listCheckInsuranceCoverage; - data['List_CompanyClass'] = this.listCompanyClass; - data['List_ConsentMedicalReport'] = this.listConsentMedicalReport; - data['List_DentalAppointments'] = this.listDentalAppointments; - data['List_DeviceTokenIDByAppointmentNo'] = - this.listDeviceTokenIDByAppointmentNo; - data['List_DischargeDiagnosis'] = this.listDischargeDiagnosis; - data['List_DischargeMedicine'] = this.listDischargeMedicine; - data['List_DischargeSummary'] = this.listDischargeSummary; - data['List_DoctorResponse'] = this.listDoctorResponse; - data['List_DoneVaccines'] = this.listDoneVaccines; - data['List_EReferralResult'] = this.listEReferralResult; - data['List_EReferrals'] = this.listEReferrals; - data['List_GetAllPatients_LiveCare_Admin'] = - this.listGetAllPatientsLiveCareAdmin; - data['List_GetDataForExcel'] = this.listGetDataForExcel; - data['List_GetMainCountID'] = this.listGetMainCountID; - data['List_GetPrescriptionReportByPatientID'] = - this.listGetPrescriptionReportByPatientID; - data['List_GetSickLeave'] = this.listGetSickLeave; - data['List_HISInvoice'] = this.listHISInvoice; - data['List_HISInvoiceProcedures'] = this.listHISInvoiceProcedures; - data['List_InpatientInvoices'] = this.listInpatientInvoices; - data['List_InsuranceCheckList'] = this.listInsuranceCheckList; - data['List_InsuranceCompanies'] = this.listInsuranceCompanies; - data['List_InsuranceCompaniesGroup'] = this.listInsuranceCompaniesGroup; - data['List_InsuranceUpdateDetails'] = this.listInsuranceUpdateDetails; - data['List_InvoiceApprovalProcedureInfo'] = - this.listInvoiceApprovalProcedureInfo; - data['List_IsLastSatisfactionSurveyReviewedModel'] = - this.listIsLastSatisfactionSurveyReviewedModel; - data['List_LabOrderDetailsModel'] = this.listLabOrderDetailsModel; - data['List_MedicalReport'] = this.listMedicalReport; - data['List_MedicalReportApprovals'] = this.listMedicalReportApprovals; - data['List_MedicalReportStatus'] = this.listMedicalReportStatus; - data['List_MonthBloodPressureResult'] = this.listMonthBloodPressureResult; - data['List_MonthBloodPressureResultAverage'] = - this.listMonthBloodPressureResultAverage; - data['List_MonthDiabtecPatientResult'] = this.listMonthDiabtecPatientResult; - data['List_MonthDiabtectResultAverage'] = - this.listMonthDiabtectResultAverage; - data['List_MonthWeightMeasurementResult'] = - this.listMonthWeightMeasurementResult; - data['List_MonthWeightMeasurementResultAverage'] = - this.listMonthWeightMeasurementResultAverage; - data['List_OnlinePrescriptionResult'] = this.listOnlinePrescriptionResult; - data['List_OutPatientInvoices'] = this.listOutPatientInvoices; - data['List_PHRInvoice'] = this.listPHRInvoice; - data['List_PHRInvoiceItems'] = this.listPHRInvoiceItems; - data['List_PHRPaymentMethods'] = this.listPHRPaymentMethods; - data['List_PateintDetails'] = this.listPateintDetails; - data['List_PateintInformation'] = this.listPateintInformation; - data['List_PatientAdmissionInfo'] = this.listPatientAdmissionInfo; - data['List_PatientAdvanceBalanceAmount'] = - this.listPatientAdvanceBalanceAmount; - data['List_PatientCallBackLogs'] = this.listPatientCallBackLogs; - data['List_PatientCallBackToUpdateFromICServer'] = - this.listPatientCallBackToUpdateFromICServer; - data['List_PatientCount'] = this.listPatientCount; - data['List_PatientDashboard'] = this.listPatientDashboard; - data['List_PatientER_GetAdminClinicsModel'] = - this.listPatientERGetAdminClinicsModel; - data['List_PatientER_GetAdminProjectsModel'] = - this.listPatientERGetAdminProjectsModel; - data['List_PatientER_GetAllClinicsModel'] = - this.listPatientERGetAllClinicsModel; - data['List_PatientHISInvoices'] = this.listPatientHISInvoices; - data['List_PatientICProjects'] = this.listPatientICProjects; - data['List_PatientICProjectsByID'] = this.listPatientICProjectsByID; - data['List_PatientICProjectsTimings'] = this.listPatientICProjectsTimings; - data['List_PatientIDByUID'] = this.listPatientIDByUID; - data['List_PatientIDForSurveyResult'] = this.listPatientIDForSurveyResult; - data['List_PatientInfo'] = this.listPatientInfo; - data['List_PatientInfoForDDScreen'] = this.listPatientInfoForDDScreen; - data['List_PatientInfoForSickleaveReport'] = - this.listPatientInfoForSickleaveReport; - data['List_PatientInsuranceCard'] = this.listPatientInsuranceCard; - data['List_PatientInsuranceCardHistory'] = - this.listPatientInsuranceCardHistory; - data['List_PatientInsuranceDetails'] = this.listPatientInsuranceDetails; - data['List_PatientPHRInvoices'] = this.listPatientPHRInvoices; - data['List_PatientServicePoint'] = this.listPatientServicePoint; - data['List_PatientStatusCount'] = this.listPatientStatusCount; - data['List_Patient_ChatRequestMapModel'] = - this.listPatientChatRequestMapModel; - data['List_Patient_ChatRequestModel'] = this.listPatientChatRequestModel; - data['List_Patient_ChatRequestVCModel'] = - this.listPatientChatRequestVCModel; - data['List_PaymentMethods'] = this.listPaymentMethods; - data['List_PointServices'] = this.listPointServices; - data['List_PregnancyStagesInfo'] = this.listPregnancyStagesInfo; - data['List_ProjectAvgERWaitingTime'] = this.listProjectAvgERWaitingTime; - data['List_ProjectAvgERWaitingTimeHourly'] = - this.listProjectAvgERWaitingTimeHourly; - data['List_RadMedicalRecords'] = this.listRadMedicalRecords; - data['List_RadMedicalRecordsAPI'] = this.listRadMedicalRecordsAPI; - data['List_RadMedicalRecordsCVI'] = this.listRadMedicalRecordsCVI; - data['List_RadMedicalRecordsCVIAPI'] = this.listRadMedicalRecordsCVIAPI; - data['List_RadMedicalRecordsResults'] = this.listRadMedicalRecordsResults; - data['List_SickLeave'] = this.listSickLeave; - data['List_Transaction'] = this.listTransaction; - data['List_VideoConferenceSessions'] = this.listVideoConferenceSessions; - data['List_WeekBloodPressureResult'] = this.listWeekBloodPressureResult; - data['List_WeekBloodPressureResultAverage'] = - this.listWeekBloodPressureResultAverage; - data['List_WeekDiabtecPatientResult'] = this.listWeekDiabtecPatientResult; - data['List_WeekDiabtectResultAverage'] = this.listWeekDiabtectResultAverage; - data['List_WeekWeightMeasurementResult'] = - this.listWeekWeightMeasurementResult; - data['List_WeekWeightMeasurementResultAverage'] = - this.listWeekWeightMeasurementResultAverage; - data['List_YearBloodPressureResult'] = this.listYearBloodPressureResult; - data['List_YearBloodPressureResultAverage'] = - this.listYearBloodPressureResultAverage; - data['List_YearDiabtecPatientResult'] = this.listYearDiabtecPatientResult; - data['List_YearDiabtecResultAverage'] = this.listYearDiabtecResultAverage; - data['List_YearWeightMeasurementResult'] = - this.listYearWeightMeasurementResult; - data['List_YearWeightMeasurementResultAverage'] = - this.listYearWeightMeasurementResultAverage; - data['List_eInvoiceForDental'] = this.listEInvoiceForDental; - data['List_eInvoiceForOnlineCheckIn'] = this.listEInvoiceForOnlineCheckIn; - data['Med_GetActivitiesTransactionsStsList'] = - this.medGetActivitiesTransactionsStsList; - data['Med_GetAvgMonthTransactionsStsList'] = - this.medGetAvgMonthTransactionsStsList; - data['Med_GetAvgWeekTransactionsStsList'] = - this.medGetAvgWeekTransactionsStsList; - data['Med_GetCategoriesList'] = this.medGetCategoriesList; - data['Med_GetMonthActivitiesTransactionsStsList'] = - this.medGetMonthActivitiesTransactionsStsList; - data['Med_GetMonthStepsTransactionsStsList'] = - this.medGetMonthStepsTransactionsStsList; - data['Med_GetMonthTransactionsStsList'] = - this.medGetMonthTransactionsStsList; - data['Med_GetPatientLastRecordList'] = this.medGetPatientLastRecordList; - data['Med_GetSubCategoriesList'] = this.medGetSubCategoriesList; - data['Med_GetTransactionsAndActTransactionsResult'] = - this.medGetTransactionsAndActTransactionsResult; - data['Med_GetTransactionsList'] = this.medGetTransactionsList; - data['Med_GetWeekActivitiesTransactionsStsList'] = - this.medGetWeekActivitiesTransactionsStsList; - data['Med_GetWeekStepsTransactionsStsList'] = - this.medGetWeekStepsTransactionsStsList; - data['Med_GetWeekTransactionsStsList'] = this.medGetWeekTransactionsStsList; - data['Med_GetYearActivitiesTransactionsStsList'] = - this.medGetYearActivitiesTransactionsStsList; - data['Med_GetYearSleepTransactionsStsList'] = - this.medGetYearSleepTransactionsStsList; - data['Med_GetYearStepsTransactionsStsList'] = - this.medGetYearStepsTransactionsStsList; - data['Med_GetYearTransactionsStsList'] = this.medGetYearTransactionsStsList; - data['Med_InsertTransactionsOutputsList'] = - this.medInsertTransactionsOutputsList; - data['MedicalRecordImages'] = this.medicalRecordImages; - data['MedicalReportToRead'] = this.medicalReportToRead; - data['MedicalReportUnreadNo'] = this.medicalReportUnreadNo; - data['Missing_IDCardAttachment'] = this.missingIDCardAttachment; - data['Missing_InsuranceCardAttachment'] = - this.missingInsuranceCardAttachment; - data['Missing_MedicalReportAttachment'] = - this.missingMedicalReportAttachment; - data['Missing_OtherRelationship'] = this.missingOtherRelationship; - data['Missing_PatientContactNo'] = this.missingPatientContactNo; - data['Missing_PatientId'] = this.missingPatientId; - data['Missing_PatientIdentityNumber'] = this.missingPatientIdentityNumber; - data['Missing_PatientName'] = this.missingPatientName; - data['Missing_ReferralContactNo'] = this.missingReferralContactNo; - data['Missing_ReferralRelationship'] = this.missingReferralRelationship; - data['Missing_ReferralRequesterName'] = this.missingReferralRequesterName; - data['MobileNumber'] = this.mobileNumber; - data['NationalityNumber'] = this.nationalityNumber; - data['OnlineCheckInAppointments'] = this.onlineCheckInAppointments; - data['Opinion_UserAgreementContent'] = this.opinionUserAgreementContent; - data['OrderInsert'] = this.orderInsert; - data['PateintInfoForUpdateList'] = this.pateintInfoForUpdateList; - data['PateintUpatedList'] = this.pateintUpatedList; - data['PatientBirthdayCertificate'] = this.patientBirthdayCertificate; - data['PatientER_CMCRequestSummaryByProject'] = - this.patientERCMCRequestSummaryByProject; - data['PatientER_CMCRequestWithTotal'] = this.patientERCMCRequestWithTotal; - data['PatientER_CMC_GetAllServicesList'] = - this.patientERCMCGetAllServicesList; - data['PatientER_CMC_GetTransactionsForOrderList'] = - this.patientERCMCGetTransactionsForOrderList; - data['PatientER_Coordinates'] = this.patientERCoordinates; - data['PatientER_CountOrderList'] = this.patientERCountOrderList; - data['PatientER_CountsForApprovalOffice'] = - this.patientERCountsForApprovalOffice; - data['PatientER_DeleteOldCurrentDoctorsOutputsList'] = - this.patientERDeleteOldCurrentDoctorsOutputsList; - data['PatientER_Delivery_GetAllDeliverdOrderList'] = - this.patientERDeliveryGetAllDeliverdOrderList; - data['PatientER_Delivery_GetAllOrderList'] = - this.patientERDeliveryGetAllOrderList; - data['PatientER_Delivery_IsOrderInserted'] = - this.patientERDeliveryIsOrderInserted; - data['PatientER_Delivery_IsOrderUpdated'] = - this.patientERDeliveryIsOrderUpdated; - data['PatientER_Delivery_IsPausedChanged'] = - this.patientERDeliveryIsPausedChanged; - data['PatientER_Delivery_NextOrder'] = this.patientERDeliveryNextOrder; - data['PatientER_Delivery_OrderInsert'] = this.patientERDeliveryOrderInsert; - data['PatientER_Delivery_UpdateOrderStatus'] = - this.patientERDeliveryUpdateOrderStatus; - data['PatientER_DriverUpdate'] = this.patientERDriverUpdate; - data['PatientER_Exacart_CheckIsDispenseAccpetableList'] = - this.patientERExacartCheckIsDispenseAccpetableList; - data['PatientER_Exacart_GetDispenseQuantitiesByOrderIDList'] = - this.patientERExacartGetDispenseQuantitiesByOrderIDList; - data['PatientER_Exacart_GetOrderDetailsByePharmacyOrderNoList'] = - this.patientERExacartGetOrderDetailsByePharmacyOrderNoList; - data['PatientER_Exacart_GetOrderDetailsList'] = - this.patientERExacartGetOrderDetailsList; - data['PatientER_Exacart_GetTotalDispenseQuantitiesByPresNoList'] = - this.patientERExacartGetTotalDispenseQuantitiesByPresNoList; - data['PatientER_Exacart_IsDispenseAdded'] = - this.patientERExacartIsDispenseAdded; - data['PatientER_Exacart_IsDispenseAddedList'] = - this.patientERExacartIsDispenseAddedList; - data['PatientER_Exacart_IsOrderCompleted'] = - this.patientERExacartIsOrderCompleted; - data['PatientER_GetAdminByProjectAndRoleList'] = - this.patientERGetAdminByProjectAndRoleList; - data['PatientER_GetAdminProjectsList'] = this.patientERGetAdminProjectsList; - data['PatientER_GetAllDriversList'] = this.patientERGetAllDriversList; - data['PatientER_GetAllNeedAproveStatusList'] = - this.patientERGetAllNeedAproveStatusList; - data['PatientER_GetAllPresOrdersStatusList'] = - this.patientERGetAllPresOrdersStatusList; - data['PatientER_GetAllProjectsList'] = this.patientERGetAllProjectsList; - data['PatientER_GetArchiveInformation_List'] = - this.patientERGetArchiveInformationList; - data['PatientER_GetAskDoctorTotalByDateFilterList'] = - this.patientERGetAskDoctorTotalByDateFilterList; - data['PatientER_GetBookScheduleConfigsList'] = - this.patientERGetBookScheduleConfigsList; - data['PatientER_GetClinicAndTimeAndEpisodeForAppointmentList'] = - this.patientERGetClinicAndTimeAndEpisodeForAppointmentList; - data['PatientER_GetClinicAndTimeForDischargeList'] = - this.patientERGetClinicAndTimeForDischargeList; - data['PatientER_GetDashboardDataforApporvalSectionForAdminList'] = - this.patientERGetDashboardDataforApporvalSectionForAdminList; - data['PatientER_GetDashboardDataforApporvalSectionList'] = - this.patientERGetDashboardDataforApporvalSectionList; - data['PatientER_GetDashboardDataforHHCSectionForAdminList'] = - this.patientERGetDashboardDataforHHCSectionForAdminList; - data['PatientER_GetDashboardDataforHHCSectionList'] = - this.patientERGetDashboardDataforHHCSectionList; - data['PatientER_GetDashboardDataforPrescriptionSectionForAdminList'] = - this.patientERGetDashboardDataforPrescriptionSectionForAdminList; - data['PatientER_GetDashboardDataforPrescriptionSectionList'] = - this.patientERGetDashboardDataforPrescriptionSectionList; - data['PatientER_GetDoctorDashboardDataModelList'] = - this.patientERGetDoctorDashboardDataModelList; - data['PatientER_GetDriverLocationList'] = - this.patientERGetDriverLocationList; - data['PatientER_GetInsuranceCardRequestByDateFilterList'] = - this.patientERGetInsuranceCardRequestByDateFilterList; - data['PatientER_GetLiveCareSummaryBookedAppoinmentStatusList'] = - this.patientERGetLiveCareSummaryBookedAppoinmentStatusList; - data['PatientER_GetLiveCareSummaryCovidList'] = - this.patientERGetLiveCareSummaryCovidList; - data['PatientER_GetLiveCareSummaryForCMCList'] = - this.patientERGetLiveCareSummaryForCMCList; - data['PatientER_GetLiveCareSummaryForHHCList'] = - this.patientERGetLiveCareSummaryForHHCList; - data['PatientER_GetLiveCareSummaryForHomeDeliveryList'] = - this.patientERGetLiveCareSummaryForHomeDeliveryList; - data['PatientER_GetLiveCareSummaryForInsuranceCardRequestList'] = - this.patientERGetLiveCareSummaryForInsuranceCardRequestList; - data['PatientER_GetLiveCareSummaryForNewFilesList'] = - this.patientERGetLiveCareSummaryForNewFilesList; - data['PatientER_GetLiveCareSummaryForOnlinePaymetRequestList'] = - this.patientERGetLiveCareSummaryForOnlinePaymetRequestList; - data['PatientER_GetLiveCareSummaryForOnlinePharmacyOrdersList'] = - this.patientERGetLiveCareSummaryForOnlinePharmacyOrdersList; - data['PatientER_GetLiveCareSummaryForTrasnportationList'] = - this.patientERGetLiveCareSummaryForTrasnportationList; - data['PatientER_GetLiveCareSummaryLiveCareCountsList'] = - this.patientERGetLiveCareSummaryLiveCareCountsList; - data['PatientER_GetMedicalRequestTotalByDateFilterList'] = - this.patientERGetMedicalRequestTotalByDateFilterList; - data['PatientER_GetNearestPendingOrdersList'] = - this.patientERGetNearestPendingOrdersList; - data['PatientER_GetNeedAproveHistoryForOrderList'] = - this.patientERGetNeedAproveHistoryForOrderList; - data['PatientER_GetNeedAprovePendingOrdersList'] = - this.patientERGetNeedAprovePendingOrdersList; - data['PatientER_GetNeedAproveStatusStatisticsList'] = - this.patientERGetNeedAproveStatusStatisticsList; - data['PatientER_GetPatientAllPresOrdersList'] = - this.patientERGetPatientAllPresOrdersList; - data['PatientER_GetPendingPatientsCountList'] = - this.patientERGetPendingPatientsCountList; - data['PatientER_GetPresOrdersHistoryForAdminList'] = - this.patientERGetPresOrdersHistoryForAdminList; - data['PatientER_GetPresOrdersHistoryForOrderList'] = - this.patientERGetPresOrdersHistoryForOrderList; - data['PatientER_GetPresOrdersStatusStatisticsList'] = - this.patientERGetPresOrdersStatusStatisticsList; - data['PatientER_HHCRequest'] = this.patientERHHCRequest; - data['PatientER_HHCRequestSummaryByProject'] = - this.patientERHHCRequestSummaryByProject; - data['PatientER_HHCRequestWithTotal'] = this.patientERHHCRequestWithTotal; - data['PatientER_HHC_GetAllServicesList'] = - this.patientERHHCGetAllServicesList; - data['PatientER_HHC_GetTransactionsForOrderList'] = - this.patientERHHCGetTransactionsForOrderList; - data['PatientER_HomeDeliveryCounts'] = this.patientERHomeDeliveryCounts; - data['PatientER_InsertDriver'] = this.patientERInsertDriver; - data['PatientER_InsertNewCurrentDoctorsOutputsList'] = - this.patientERInsertNewCurrentDoctorsOutputsList; - data['PatientER_InsuranceStatusCountList'] = - this.patientERInsuranceStatusCountList; - data['PatientER_IsNearestProjectUpdated'] = - this.patientERIsNearestProjectUpdated; - data['PatientER_IsNeedAproveReturnedToQueue'] = - this.patientERIsNeedAproveReturnedToQueue; - data['PatientER_IsNeedAproveUpdated'] = this.patientERIsNeedAproveUpdated; - data['PatientER_IsOrderClientRequestUpdated'] = - this.patientERIsOrderClientRequestUpdated; - data['PatientER_IsOrderReturnedToQueue'] = - this.patientERIsOrderReturnedToQueue; - data['PatientER_IsPresOrderInserted'] = this.patientERIsPresOrderInserted; - data['PatientER_IsPresOrderUpdated'] = this.patientERIsPresOrderUpdated; - data['PatientER_IsProjectUpdated'] = this.patientERIsProjectUpdated; - data['PatientER_NotCompletedDetails'] = this.patientERNotCompletedDetails; - data['PatientER_PatientsCountByCallStatus'] = - this.patientERPatientsCountByCallStatus; - data['PatientER_PeakHourCounts'] = this.patientERPeakHourCounts; - data['PatientER_PresOrderInfo'] = this.patientERPresOrderInfo; - data['PatientER_PrescriptionCounts'] = this.patientERPrescriptionCounts; - data['PatientER_ProjectsContribution'] = this.patientERProjectsContribution; - data['PatientER_RRT_GetAllQuestionsList'] = - this.patientERRRTGetAllQuestionsList; - data['PatientER_RRT_GetAllTransportationMethodList'] = - this.patientERRRTGetAllTransportationMethodList; - data['PatientER_RRT_GetPickUpRequestByPresOrderIDList'] = - this.patientERRRTGetPickUpRequestByPresOrderIDList; - data['PatientER_RealRRT_GetAllServicesList'] = - this.patientERRealRRTGetAllServicesList; - data['PatientER_RealRRT_GetOrderDetailsList'] = - this.patientERRealRRTGetOrderDetailsList; - data['PatientER_RealRRT_GetTransactionsForOrderList'] = - this.patientERRealRRTGetTransactionsForOrderList; - data['PatientER_RealRRT_IsTransInserted'] = - this.patientERRealRRTIsTransInserted; - data['PatientER_RequestList'] = this.patientERRequestList; - data['PatientER_TransportationRequestWithTotal'] = - this.patientERTransportationRequestWithTotal; - data['PatientE_RealRRT_GetServicePriceList'] = - this.patientERealRRTGetServicePriceList; - data['PatientInfoByAdmissionNo_List'] = this.patientInfoByAdmissionNoList; - data['PatientMonitor_GetPatientHeartRate'] = - this.patientMonitorGetPatientHeartRate; - data['PatientNotServedCounts'] = this.patientNotServedCounts; - data['PatientPrescriptionList'] = this.patientPrescriptionList; - data['Patient_Allergies'] = this.patientAllergies; - data['Patient_CheckAppointmentValidationList'] = - this.patientCheckAppointmentValidationList; - data['Patient_LoginTokenList'] = this.patientLoginTokenList; - data['Patient_QRLoginInfoList'] = this.patientQRLoginInfoList; - data['Patient_SELECTDeviceIMEIbyIMEIList'] = - this.patientSELECTDeviceIMEIbyIMEIList; - data['PharmList'] = this.pharmList; - data['PrefLang'] = this.prefLang; - data['RadReportUnreadNo'] = this.radReportUnreadNo; - data['Rad_GetPatientRadOrdersForDental_List'] = - this.radGetPatientRadOrdersForDentalList; - data['ReferralNumber'] = this.referralNumber; - data['ReminderConfigurations'] = this.reminderConfigurations; - data['RequestNo'] = this.requestNo; - data['RowCount'] = this.rowCount; - data['ServicePrivilegeList'] = this.servicePrivilegeList; - data['ShareFamilyFileObj'] = this.shareFamilyFileObj; - data['Status'] = this.status; - data['SuccessCode'] = this.successCode; - data['SurveyRate'] = this.surveyRate; - data['SymptomChecker_ConditionList'] = this.symptomCheckerConditionList; - data['SymptomChecker_GetAllDefaultQuestionsList'] = - this.symptomCheckerGetAllDefaultQuestionsList; - data['SymptomChecker_GetBodyPartSymptomsList'] = - this.symptomCheckerGetBodyPartSymptomsList; - data['SymptomChecker_GetBodyPartsByCodeList'] = - this.symptomCheckerGetBodyPartsByCodeList; - data['SymptomChecker_GetBodyPartsList'] = - this.symptomCheckerGetBodyPartsList; - data['SymptomChecker_JsonResponseInString'] = - this.symptomCheckerJsonResponseInString; - data['TimerTime'] = this.timerTime; - data['TotalAdvanceBalanceAmount'] = this.totalAdvanceBalanceAmount; - data['TotalPatientsCount'] = this.totalPatientsCount; - data['TotalPendingApprovalCount'] = this.totalPendingApprovalCount; - data['TotalUnUsedCount'] = this.totalUnUsedCount; - data['TransactionNo'] = this.transactionNo; - data['UnReadCounts'] = this.unReadCounts; - data['UpdateStatus'] = this.updateStatus; - data['UserAgreementContent'] = this.userAgreementContent; - data['YahalaAccountNo'] = this.yahalaAccountNo; - data['check24HourComplaint'] = this.check24HourComplaint; - data['currency'] = this.currency; - data['message'] = this.message; - data['patientID'] = this.patientID; - data['returnValue'] = this.returnValue; - data['returnValueStr'] = this.returnValueStr; - data['statusCode'] = this.statusCode; - return data; - } -} \ No newline at end of file diff --git a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart b/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart deleted file mode 100644 index 809277e1..00000000 --- a/lib/core/model/pharmacies/LakumInquiryInformationObjVersion.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'PointsAmountPerYear.dart'; -import 'PointsDetails.dart'; - -class LakumInquiryInformationObjVersion { - int accountNumber; - String accountStatus; - String barCode; - int consumedPoints; - String consumedPointsAmount; - List consumedPointsAmountPerYear; - List consumedPointsDetails; - String createdDate; - int expiredPoints; - String expiryDate; - int gainedPoints; - List gainedPointsAmountPerYear; - List gainedPointsDetails; - String lakumMessageStatus; - String memberName; - String memberUniversalId; - String mobileNumber; - int pointsBalance; - int pointsBalanceAmount; - int pointsWillBeExpired; - String prefLang; - int statusCode; - int transferPoints; - List transferPointsAmountPerYear; - List transferPointsDetails; - int waitingPoints; - int loyalityAmount; - int loyalityPoints; - int purchaseRate; - - LakumInquiryInformationObjVersion( - {this.accountNumber, - this.accountStatus, - this.barCode, - this.consumedPoints, - this.consumedPointsAmount, - this.consumedPointsAmountPerYear, - this.consumedPointsDetails, - this.createdDate, - this.expiredPoints, - this.expiryDate, - this.gainedPoints, - this.gainedPointsAmountPerYear, - this.gainedPointsDetails, - this.lakumMessageStatus, - this.memberName, - this.memberUniversalId, - this.mobileNumber, - this.pointsBalance, - this.pointsBalanceAmount, - this.pointsWillBeExpired, - this.prefLang, - this.statusCode, - this.transferPoints, - this.transferPointsAmountPerYear, - this.transferPointsDetails, - this.waitingPoints, - this.loyalityAmount, - this.loyalityPoints, - this.purchaseRate}); - - LakumInquiryInformationObjVersion.fromJson(Map json) { - accountNumber = json['AccountNumber']; - accountStatus = json['AccountStatus']; - barCode = json['BarCode']; - consumedPoints = json['ConsumedPoints']; - consumedPointsAmount = json['ConsumedPointsAmount']; - if (json['ConsumedPointsAmountPerYear'] != null) { - consumedPointsAmountPerYear = new List(); - json['ConsumedPointsAmountPerYear'].forEach((v) { - consumedPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); - }); - } - if (json['ConsumedPointsDetails'] != null) { - consumedPointsDetails = new List(); - json['ConsumedPointsDetails'].forEach((v) { - consumedPointsDetails.add(PointsDetails.fromJson(v)); - }); - } - createdDate = json['CreatedDate']; - expiredPoints = json['ExpiredPoints']; - expiryDate = json['ExpiryDate']; - gainedPoints = json['GainedPoints']; - if (json['GainedPointsAmountPerYear'] != null) { - gainedPointsAmountPerYear = new List(); - json['GainedPointsAmountPerYear'].forEach((v) { - gainedPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); - }); - } - if (json['GainedPointsDetails'] != null) { - gainedPointsDetails = new List(); - json['GainedPointsDetails'].forEach((v) { - gainedPointsDetails.add(PointsDetails.fromJson(v)); - }); - } - lakumMessageStatus = json['LakumMessageStatus']; - memberName = json['MemberName']; - memberUniversalId = json['MemberUniversalId']; - mobileNumber = json['MobileNumber']; - pointsBalance = json['PointsBalance']; - pointsBalanceAmount = json['PointsBalanceAmount']; - pointsWillBeExpired = json['PointsWillBeExpired']; - prefLang = json['PrefLang']; - statusCode = json['StatusCode']; - transferPoints = json['TransferPoints']; - if (json['TransferPointsAmountPerYear'] != null) { - transferPointsAmountPerYear = new List(); - json['TransferPointsAmountPerYear'].forEach((v) { - transferPointsAmountPerYear.add(PointsAmountPerYear.fromJson(v)); - }); - } - if (json['TransferPointsDetails'] != null) { - transferPointsDetails = new List(); - json['TransferPointsDetails'].forEach((v) { - transferPointsDetails.add(PointsDetails.fromJson(v)); - }); - } - waitingPoints = json['WaitingPoints']; - loyalityAmount = json['loyalityAmount']; - loyalityPoints = json['loyalityPoints']; - purchaseRate = json['purchaseRate']; - } - - Map toJson() { - final Map data = new Map(); - data['AccountNumber'] = this.accountNumber; - data['AccountStatus'] = this.accountStatus; - data['BarCode'] = this.barCode; - data['ConsumedPoints'] = this.consumedPoints; - data['ConsumedPointsAmount'] = this.consumedPointsAmount; - if (this.consumedPointsAmountPerYear != null) { - data['ConsumedPointsAmountPerYear'] = - this.consumedPointsAmountPerYear.map((v) => v).toList(); - } - if (this.consumedPointsDetails != null) { - data['ConsumedPointsDetails'] = - this.consumedPointsDetails.map((v) => v).toList(); - } - data['CreatedDate'] = this.createdDate; - data['ExpiredPoints'] = this.expiredPoints; - data['ExpiryDate'] = this.expiryDate; - data['GainedPoints'] = this.gainedPoints; - if (this.gainedPointsAmountPerYear != null) { - data['GainedPointsAmountPerYear'] = - this.gainedPointsAmountPerYear.map((v) => v).toList(); - } - if (this.gainedPointsDetails != null) { - data['GainedPointsDetails'] = - this.gainedPointsDetails.map((v) => v).toList(); - } - data['LakumMessageStatus'] = this.lakumMessageStatus; - data['MemberName'] = this.memberName; - data['MemberUniversalId'] = this.memberUniversalId; - data['MobileNumber'] = this.mobileNumber; - data['PointsBalance'] = this.pointsBalance; - data['PointsBalanceAmount'] = this.pointsBalanceAmount; - data['PointsWillBeExpired'] = this.pointsWillBeExpired; - data['PrefLang'] = this.prefLang; - data['StatusCode'] = this.statusCode; - data['TransferPoints'] = this.transferPoints; - if (this.transferPointsAmountPerYear != null) { - data['TransferPointsAmountPerYear'] = - this.transferPointsAmountPerYear.map((v) => v).toList(); - } - if (this.transferPointsDetails != null) { - data['TransferPointsDetails'] = - this.transferPointsDetails.map((v) => v).toList(); - } - data['WaitingPoints'] = this.waitingPoints; - data['loyalityAmount'] = this.loyalityAmount; - data['loyalityPoints'] = this.loyalityPoints; - data['purchaseRate'] = this.purchaseRate; - return data; - } -} \ No newline at end of file diff --git a/lib/core/model/pharmacies/ListUserAgreement.dart b/lib/core/model/pharmacies/ListUserAgreement.dart deleted file mode 100644 index 4237e304..00000000 --- a/lib/core/model/pharmacies/ListUserAgreement.dart +++ /dev/null @@ -1,28 +0,0 @@ -class ListUserAgreement { - String userAgreementLAKUM; - String userAgreementLAKUMn; - String userAgreementTxt; - String userAgreementTxtn; - - ListUserAgreement( - {this.userAgreementLAKUM, - this.userAgreementLAKUMn, - this.userAgreementTxt, - this.userAgreementTxtn}); - - ListUserAgreement.fromJson(Map json) { - userAgreementLAKUM = json['UserAgreementLAKUM']; - userAgreementLAKUMn = json['UserAgreementLAKUMn']; - userAgreementTxt = json['UserAgreementTxt']; - userAgreementTxtn = json['UserAgreementTxtn']; - } - - Map toJson() { - final Map data = new Map(); - data['UserAgreementLAKUM'] = this.userAgreementLAKUM; - data['UserAgreementLAKUMn'] = this.userAgreementLAKUMn; - data['UserAgreementTxt'] = this.userAgreementTxt; - data['UserAgreementTxtn'] = this.userAgreementTxtn; - return data; - } -} diff --git a/lib/core/model/pharmacies/PharmacyAddressesModel.dart b/lib/core/model/pharmacies/PharmacyAddressesModel.dart deleted file mode 100644 index db9c20ae..00000000 --- a/lib/core/model/pharmacies/PharmacyAddressesModel.dart +++ /dev/null @@ -1,170 +0,0 @@ - -import 'dart:convert'; - -PharmacyAddressesModel pharmacyAddressesModelFromJson(String str) => PharmacyAddressesModel.fromJson(json.decode(str)); - -String pharmacyAddressesModelToJson(PharmacyAddressesModel data) => json.encode(data.toJson()); - -class PharmacyAddressesModel { - PharmacyAddressesModel({ - this.customers, - }); - - List customers; - - factory PharmacyAddressesModel.fromJson(Map json) => PharmacyAddressesModel( - customers: List.from(json["customers"].map((x) => Customer.fromJson(x))), - ); - - Map toJson() => { - "customers": List.from(customers.map((x) => x.toJson())), - }; -} - -class Customer { - Customer({ - this.addresses, - }); - - List

addresses; - - factory Customer.fromJson(Map json) => Customer( - addresses: List
.from(json["addresses"].map((x) => Address.fromJson(x))), - ); - - Map toJson() => { - "addresses": List.from(addresses.map((x) => x.toJson())), - }; -} - -class Address { - Address({ - this.id, - this.firstName, - this.lastName, - this.email, - this.company, - this.countryId, - this.country, - this.stateProvinceId, - this.city, - this.address1, - this.address2, - this.zipPostalCode, - this.phoneNumber, - this.faxNumber, - this.customerAttributes, - this.createdOnUtc, - this.province, - this.latLong, - }); - - String id; - FirstName firstName; - LastName lastName; - Email email; - dynamic company; - int countryId; - Country country; - dynamic stateProvinceId; - City city; - String address1; - String address2; - String zipPostalCode; - String phoneNumber; - dynamic faxNumber; - String customerAttributes; - DateTime createdOnUtc; - dynamic province; - String latLong; - - factory Address.fromJson(Map json) => Address( - id: json["id"], - firstName: firstNameValues.map[json["first_name"]], - lastName: lastNameValues.map[json["last_name"]], - email: emailValues.map[json["email"]], - company: json["company"], - countryId: json["country_id"], - country: countryValues.map[json["country"]], - stateProvinceId: json["state_province_id"], - city: cityValues.map[json["city"]], - address1: json["address1"], - address2: json["address2"], - zipPostalCode: json["zip_postal_code"], - phoneNumber: json["phone_number"], - faxNumber: json["fax_number"], - customerAttributes: json["customer_attributes"], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - province: json["province"], - latLong: json["lat_long"], - ); - - Map toJson() => { - "id": id, - "first_name": firstNameValues.reverse[firstName], - "last_name": lastNameValues.reverse[lastName], - "email": emailValues.reverse[email], - "company": company, - "country_id": countryId, - "country": countryValues.reverse[country], - "state_province_id": stateProvinceId, - "city": cityValues.reverse[city], - "address1": address1, - "address2": address2, - "zip_postal_code": zipPostalCode, - "phone_number": phoneNumber, - "fax_number": faxNumber, - "customer_attributes": customerAttributes, - "created_on_utc": createdOnUtc.toIso8601String(), - "province": province, - "lat_long": latLong, - }; -} - -enum City { RIYADH, AL_OYUN } - -final cityValues = EnumValues({ - "Al Oyun": City.AL_OYUN, - "Riyadh": City.RIYADH -}); - -enum Country { SAUDI_ARABIA } - -final countryValues = EnumValues({ - "Saudi Arabia": Country.SAUDI_ARABIA -}); - -enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM } - -final emailValues = EnumValues({ - "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM, - "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM -}); - -enum FirstName { TAMER, TAMER_FANASHEH } - -final firstNameValues = EnumValues({ - "TAMER": FirstName.TAMER, - "TAMER FANASHEH": FirstName.TAMER_FANASHEH -}); - -enum LastName { FANASHEH, MUSA } - -final lastNameValues = EnumValues({ - "FANASHEH": LastName.FANASHEH, - "MUSA": LastName.MUSA -}); - -class EnumValues { - Map map; - Map reverseMap; - - EnumValues(this.map); - - Map get reverse { - if (reverseMap == null) { - reverseMap = map.map((k, v) => new MapEntry(v, k)); - } - return reverseMap; - } -} diff --git a/lib/core/model/pharmacies/PharmacyProduct.dart b/lib/core/model/pharmacies/PharmacyProduct.dart index c472cb4c..cd461ae5 100644 --- a/lib/core/model/pharmacies/PharmacyProduct.dart +++ b/lib/core/model/pharmacies/PharmacyProduct.dart @@ -1,538 +1,149 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Specifications.dart'; - import 'PharmacyImageObject.dart'; import 'Reviews.dart'; class PharmacyProduct { String id; - bool visibleIndividually; String name; String namen; String shortDescription; - String shortDescriptionn; String fullDescription; String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - String metaKeywords; - String metaDescription; - String metaTitle; - bool allowCustomerReviews; int approvedRatingSum; - int notApprovedRatingSum; int approvedTotalReviews; - int notApprovedTotalReviews; String sku; bool isRx; - bool prescriptionRequired; String rxMessage; String rxMessagen; - String manufacturerPartNumber; - String gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; - int maxNumberOfDownloads; - String downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; - int recurringCycleLength; - int recurringTotalCycles; - bool isRental; - int rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; - double additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; - int manageInventoryMethodId; int stockQuantity; String stockAvailability; String stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; - int minStockQuantity; - int notifyAdminForQuantityBelow; bool allowBackInStockSubscriptions; int orderMinimumQuantity; int orderMaximumQuantity; - String allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; - String preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; double price; double oldPrice; - double productCost; - String specialPrice; - String specialPriceStartDateTimeUtc; - String specialPriceEndDateTimeUtc; - bool customerEntersPrice; - double minimumCustomerEnteredPrice; - double maximumCustomerEnteredPrice; - bool basepriceEnabled; - double basepriceAmount; - double basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; String discountName; String discountNamen; - String discountDescription; - String discountDescriptionn; String discountPercentage; - String currency; - String currencyn; - double weight; - double length; - double width; - double height; - String availableStartDateTimeUtc; - String availableEndDateTimeUtc; int displayOrder; - bool published; - bool deleted; - String createdOnUtc; - String updatedOnUtc; - String productType; - int parentGroupedProductId; - List roleIds; List discountIds; - List storeIds; - List manufacturerIds; List reviews; List images; - List attributes; - List specifications; - List associatedProductIds; - List tags; - int vendorId; - String seName; - PharmacyProduct( {this.id, - this.visibleIndividually, this.name, this.namen, this.shortDescription, - this.shortDescriptionn, this.fullDescription, this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, this.approvedRatingSum, - this.notApprovedRatingSum, this.approvedTotalReviews, - this.notApprovedTotalReviews, this.sku, this.isRx, - this.prescriptionRequired, this.rxMessage, this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, this.stockQuantity, this.stockAvailability, this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, this.allowBackInStockSubscriptions, this.orderMinimumQuantity, this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, this.price, this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, this.discountName, this.discountNamen, - this.discountDescription, - this.discountDescriptionn, this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, this.discountIds, - this.storeIds, - this.manufacturerIds, this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName}); + this.images}); PharmacyProduct.fromJson(Map json) { - id = json['id']; - visibleIndividually = json['visible_individually']; - name = json['name']; - namen = json['namen']; - shortDescription = json['short_description']; - shortDescriptionn = json['short_descriptionn']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - markasNew = json['markas_new']; - showOnHomePage = json['show_on_home_page']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - allowCustomerReviews = json['allow_customer_reviews']; - approvedRatingSum = json['approved_rating_sum']; - notApprovedRatingSum = json['not_approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - notApprovedTotalReviews = json['not_approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - prescriptionRequired = json['prescription_required']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - manufacturerPartNumber = json['manufacturer_part_number']; - gtin = json['gtin']; - isGiftCard = json['is_gift_card']; - requireOtherProducts = json['require_other_products']; - automaticallyAddRequiredProducts = - json['automatically_add_required_products']; - isDownload = json['is_download']; - unlimitedDownloads = json['unlimited_downloads']; - maxNumberOfDownloads = json['max_number_of_downloads']; - downloadExpirationDays = json['download_expiration_days']; - hasSampleDownload = json['has_sample_download']; - hasUserAgreement = json['has_user_agreement']; - isRecurring = json['is_recurring']; - recurringCycleLength = json['recurring_cycle_length']; - recurringTotalCycles = json['recurring_total_cycles']; - isRental = json['is_rental']; - rentalPriceLength = json['rental_price_length']; - isShipEnabled = json['is_ship_enabled']; - isFreeShipping = json['is_free_shipping']; - shipSeparately = json['ship_separately']; - additionalShippingCharge = json['additional_shipping_charge']; - isTaxExempt = json['is_tax_exempt']; - isTelecommunicationsOrBroadcastingOrElectronicServices = - json['is_telecommunications_or_broadcasting_or_electronic_services']; - useMultipleWarehouses = json['use_multiple_warehouses']; - manageInventoryMethodId = json['manage_inventory_method_id']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - displayStockAvailability = json['display_stock_availability']; - displayStockQuantity = json['display_stock_quantity']; - minStockQuantity = json['min_stock_quantity']; - notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - allowedQuantities = json['allowed_quantities']; - allowAddingOnlyExistingAttributeCombinations = - json['allow_adding_only_existing_attribute_combinations']; - disableBuyButton = json['disable_buy_button']; - disableWishlistButton = json['disable_wishlist_button']; - availableForPreOrder = json['available_for_pre_order']; - preOrderAvailabilityStartDateTimeUtc = - json['pre_order_availability_start_date_time_utc']; - callForPrice = json['call_for_price']; - price = json['price']; - oldPrice = json['old_price']; - productCost = json['product_cost']; - specialPrice = json['special_price']; - specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; - specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; - customerEntersPrice = json['customer_enters_price']; - minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; - maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; - basepriceEnabled = json['baseprice_enabled']; - basepriceAmount = json['baseprice_amount']; - basepriceBaseAmount = json['baseprice_base_amount']; - hasTierPrices = json['has_tier_prices']; - hasDiscountsApplied = json['has_discounts_applied']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountDescription = json['discount_description']; - discountDescriptionn = json['discount_Descriptionn']; - discountPercentage = json['discount_percentage']; - currency = json['currency']; - currencyn = json['currencyn']; - weight = json['weight']; - length = json['length']; - width = json['width']; - height = json['height']; - availableStartDateTimeUtc = json['available_start_date_time_utc']; - availableEndDateTimeUtc = json['available_end_date_time_utc']; - displayOrder = json['display_order']; - published = json['published']; - deleted = json['deleted']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - productType = json['product_type']; - parentGroupedProductId = json['parent_grouped_product_id']; - if (json['role_ids'] != null) { - roleIds = new List(); - json['role_ids'].forEach((v) { - roleIds.add(v); - }); - } - if (json['discount_ids'] != null) { - discountIds = new List(); - json['discount_ids'].forEach((v) { - discountIds.add(v); - }); - } - if (json['store_ids'] != null) { - storeIds = new List(); - json['store_ids'].forEach((v) { - storeIds.add(v); - }); - } - if (json['manufacturer_ids'] != null) { - manufacturerIds = new List(); - json['manufacturer_ids'].forEach((v) { - manufacturerIds.add(v); - }); - } - if (json['reviews'] != null) { - reviews = new List(); - json['reviews'].forEach((v) { - reviews.add(new Reviews.fromJson(v)); - }); - } - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new PharmacyImageObject.fromJson(v)); - }); - } - if (json['attributes'] != null) { - attributes = new List(); - json['attributes'].forEach((v) { - attributes.add(v); - }); - } - if (json['specifications'] != null) { - specifications = new List(); - json['specifications'].forEach((v) { - specifications.add(new Specifications.fromJson(v)); - }); + try { + id = json['id']; + name = json['name']; + namen = json['namen']; + shortDescription = json['short_description']; + fullDescription = json['full_description']; + fullDescriptionn = json['full_descriptionn']; + approvedRatingSum = json['approved_rating_sum']; + approvedTotalReviews = json['approved_total_reviews']; + sku = json['sku']; + isRx = json['is_rx']; + rxMessage = json['rx_message']; + rxMessagen = json['rx_messagen']; + stockQuantity = json['stock_quantity']; + stockAvailability = json['stock_availability']; + stockAvailabilityn = json['stock_availabilityn']; + allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; + orderMinimumQuantity = json['order_minimum_quantity']; + orderMaximumQuantity = json['order_maximum_quantity']; + price = json['price']; + oldPrice = json['old_price']; + discountName = json['discount_name']; + discountNamen = json['discount_namen']; + discountPercentage = json['discount_percentage']; + displayOrder = json['display_order']; + if (json['discount_ids'] != null) { + discountIds = new List(); + json['discount_ids'].forEach((v) { + discountIds.add(v); + }); + } + if (json['reviews'] != null) { + reviews = new List(); + json['reviews'].forEach((v) { + reviews.add(new Reviews.fromJson(v)); + }); + } + if (json['images'] != null) { + images = new List(); + json['images'].forEach((v) { + images.add(new PharmacyImageObject.fromJson(v)); + }); + } + } catch (e) { + print(e); } - if (json['associated_product_ids'] != null) { - associatedProductIds = new List(); - json['associated_product_ids'].forEach((v) { - associatedProductIds.add(v); - }); - } - if (json['tags'] != null) { - tags = new List(); - json['tags'].forEach((v) { - tags.add(v); - }); - } - vendorId = json['vendor_id']; - seName = json['se_name']; } Map toJson() { final Map data = new Map(); data['id'] = this.id; - data['visible_individually'] = this.visibleIndividually; data['name'] = this.name; data['namen'] = this.namen; data['short_description'] = this.shortDescription; - data['short_descriptionn'] = this.shortDescriptionn; data['full_description'] = this.fullDescription; data['full_descriptionn'] = this.fullDescriptionn; - data['markas_new'] = this.markasNew; - data['show_on_home_page'] = this.showOnHomePage; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['allow_customer_reviews'] = this.allowCustomerReviews; data['approved_rating_sum'] = this.approvedRatingSum; - data['not_approved_rating_sum'] = this.notApprovedRatingSum; data['approved_total_reviews'] = this.approvedTotalReviews; - data['not_approved_total_reviews'] = this.notApprovedTotalReviews; data['sku'] = this.sku; data['is_rx'] = this.isRx; - data['prescription_required'] = this.prescriptionRequired; data['rx_message'] = this.rxMessage; data['rx_messagen'] = this.rxMessagen; - data['manufacturer_part_number'] = this.manufacturerPartNumber; - data['gtin'] = this.gtin; - data['is_gift_card'] = this.isGiftCard; - data['require_other_products'] = this.requireOtherProducts; - data['automatically_add_required_products'] = - this.automaticallyAddRequiredProducts; - data['is_download'] = this.isDownload; - data['unlimited_downloads'] = this.unlimitedDownloads; - data['max_number_of_downloads'] = this.maxNumberOfDownloads; - data['download_expiration_days'] = this.downloadExpirationDays; - data['has_sample_download'] = this.hasSampleDownload; - data['has_user_agreement'] = this.hasUserAgreement; - data['is_recurring'] = this.isRecurring; - data['recurring_cycle_length'] = this.recurringCycleLength; - data['recurring_total_cycles'] = this.recurringTotalCycles; - data['is_rental'] = this.isRental; - data['rental_price_length'] = this.rentalPriceLength; - data['is_ship_enabled'] = this.isShipEnabled; - data['is_free_shipping'] = this.isFreeShipping; - data['ship_separately'] = this.shipSeparately; - data['additional_shipping_charge'] = this.additionalShippingCharge; - data['is_tax_exempt'] = this.isTaxExempt; - data['is_telecommunications_or_broadcasting_or_electronic_services'] = - this.isTelecommunicationsOrBroadcastingOrElectronicServices; - data['use_multiple_warehouses'] = this.useMultipleWarehouses; - data['manage_inventory_method_id'] = this.manageInventoryMethodId; data['stock_quantity'] = this.stockQuantity; data['stock_availability'] = this.stockAvailability; data['stock_availabilityn'] = this.stockAvailabilityn; - data['display_stock_availability'] = this.displayStockAvailability; - data['display_stock_quantity'] = this.displayStockQuantity; - data['min_stock_quantity'] = this.minStockQuantity; - data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; data['allow_back_in_stock_subscriptions'] = this.allowBackInStockSubscriptions; data['order_minimum_quantity'] = this.orderMinimumQuantity; data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['allowed_quantities'] = this.allowedQuantities; - data['allow_adding_only_existing_attribute_combinations'] = - this.allowAddingOnlyExistingAttributeCombinations; - data['disable_buy_button'] = this.disableBuyButton; - data['disable_wishlist_button'] = this.disableWishlistButton; - data['available_for_pre_order'] = this.availableForPreOrder; - data['pre_order_availability_start_date_time_utc'] = - this.preOrderAvailabilityStartDateTimeUtc; - data['call_for_price'] = this.callForPrice; data['price'] = this.price; data['old_price'] = this.oldPrice; - data['product_cost'] = this.productCost; - data['special_price'] = this.specialPrice; - data['special_price_start_date_time_utc'] = - this.specialPriceStartDateTimeUtc; - data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; - data['customer_enters_price'] = this.customerEntersPrice; - data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; - data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; - data['baseprice_enabled'] = this.basepriceEnabled; - data['baseprice_amount'] = this.basepriceAmount; - data['baseprice_base_amount'] = this.basepriceBaseAmount; - data['has_tier_prices'] = this.hasTierPrices; - data['has_discounts_applied'] = this.hasDiscountsApplied; data['discount_name'] = this.discountName; data['discount_namen'] = this.discountNamen; - data['discount_description'] = this.discountDescription; - data['discount_Descriptionn'] = this.discountDescriptionn; data['discount_percentage'] = this.discountPercentage; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['weight'] = this.weight; - data['length'] = this.length; - data['width'] = this.width; - data['height'] = this.height; - data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; - data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; data['display_order'] = this.displayOrder; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['product_type'] = this.productType; - data['parent_grouped_product_id'] = this.parentGroupedProductId; - if (this.roleIds != null) { - data['role_ids'] = this.roleIds.map((v) => v).toList(); - } - if (this.discountIds != null) { + if (this.discountIds != String) { data['discount_ids'] = this.discountIds.map((v) => v).toList(); } - if (this.storeIds != null) { - data['store_ids'] = this.storeIds.map((v) => v).toList(); - } - data['manufacturer_ids'] = this.manufacturerIds; - if (this.reviews != null) { + if (this.reviews != String) { data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); } - if (this.images != null) { + if (this.images != String) { data['images'] = this.images.map((v) => v.toJson()).toList(); } - if (this.attributes != null) { - data['attributes'] = this.attributes.map((v) => v).toList(); - } - if (this.specifications != null) { - data['specifications'] = - this.specifications.map((v) => v.toJson()).toList(); - } - if (this.associatedProductIds != null) { - data['associated_product_ids'] = - this.associatedProductIds.map((v) => v).toList(); - } - if (this.tags != null) { - data['tags'] = this.tags.map((v) => v).toList(); - } - data['vendor_id'] = this.vendorId; - data['se_name'] = this.seName; return data; } } diff --git a/lib/core/model/pharmacies/PointsAmountPerMonth.dart b/lib/core/model/pharmacies/PointsAmountPerMonth.dart deleted file mode 100644 index 71cf3498..00000000 --- a/lib/core/model/pharmacies/PointsAmountPerMonth.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'PointsAmountPerday.dart'; - -class PointsAmountPerMonth { - double amountPerMonth; - String month; - int monthNumber; - List pointsAmountPerday; - double pointsPerMonth; - - PointsAmountPerMonth( - {this.amountPerMonth, - this.month, - this.monthNumber, - this.pointsAmountPerday, - this.pointsPerMonth}); - - PointsAmountPerMonth.fromJson(Map json) { - amountPerMonth = json['AmountPerMonth']; - month = json['Month']; - monthNumber = json['MonthNumber']; - if (json['PointsAmountPerday'] != null) { - pointsAmountPerday = new List(); - json['PointsAmountPerday'].forEach((v) { - pointsAmountPerday.add(new PointsAmountPerday.fromJson(v)); - }); - } - pointsPerMonth = json['PointsPerMonth']; - } - - Map toJson() { - final Map data = new Map(); - data['AmountPerMonth'] = this.amountPerMonth; - data['Month'] = this.month; - data['MonthNumber'] = this.monthNumber; - if (this.pointsAmountPerday != null) { - data['PointsAmountPerday'] = - this.pointsAmountPerday.map((v) => v.toJson()).toList(); - } - data['PointsPerMonth'] = this.pointsPerMonth; - return data; - } -} diff --git a/lib/core/model/pharmacies/PointsAmountPerYear.dart b/lib/core/model/pharmacies/PointsAmountPerYear.dart deleted file mode 100644 index eef74064..00000000 --- a/lib/core/model/pharmacies/PointsAmountPerYear.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'PointsAmountPerMonth.dart'; - -class PointsAmountPerYear { - int amountPerYear; - List pointsAmountPerMonth; - int pointsPerYear; - int year; - - PointsAmountPerYear( - {this.amountPerYear, - this.pointsAmountPerMonth, - this.pointsPerYear, - this.year}); - - PointsAmountPerYear.fromJson(Map json) { - amountPerYear = json['AmountPerYear']; - if (json['PointsAmountPerMonth'] != null) { - pointsAmountPerMonth = new List(); - json['PointsAmountPerMonth'].forEach((v) { - pointsAmountPerMonth.add(new PointsAmountPerMonth.fromJson(v)); - }); - } - pointsPerYear = json['PointsPerYear']; - year = json['Year']; - } - - Map toJson() { - final Map data = new Map(); - data['AmountPerYear'] = this.amountPerYear; - if (this.pointsAmountPerMonth != null) { - data['PointsAmountPerMonth'] = - this.pointsAmountPerMonth.map((v) => v.toJson()).toList(); - } - data['PointsPerYear'] = this.pointsPerYear; - data['Year'] = this.year; - return data; - } -} diff --git a/lib/core/model/pharmacies/PointsAmountPerday.dart b/lib/core/model/pharmacies/PointsAmountPerday.dart deleted file mode 100644 index e78e87b7..00000000 --- a/lib/core/model/pharmacies/PointsAmountPerday.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'PointsDetails.dart'; - -class PointsAmountPerday { - double amountPerDay; - String day; - List pointsDetails; - double pointsPerDay; - String transationDate; - - PointsAmountPerday( - {this.amountPerDay, - this.day, - this.pointsDetails, - this.pointsPerDay, - this.transationDate}); - - PointsAmountPerday.fromJson(Map json) { - amountPerDay = json['AmountPerDay']; - day = json['Day']; - if (json['PointsDetails'] != null) { - pointsDetails = new List(); - json['PointsDetails'].forEach((v) { - pointsDetails.add(new PointsDetails.fromJson(v)); - }); - } - pointsPerDay = json['PointsPerDay']; - transationDate = json['TransationDate']; - } - - Map toJson() { - final Map data = new Map(); - data['AmountPerDay'] = this.amountPerDay; - data['Day'] = this.day; - if (this.pointsDetails != null) { - data['PointsDetails'] = - this.pointsDetails.map((v) => v.toJson()).toList(); - } - data['PointsPerDay'] = this.pointsPerDay; - data['TransationDate'] = this.transationDate; - return data; - } -} \ No newline at end of file diff --git a/lib/core/model/pharmacies/PointsDetails.dart b/lib/core/model/pharmacies/PointsDetails.dart deleted file mode 100644 index 7b342af9..00000000 --- a/lib/core/model/pharmacies/PointsDetails.dart +++ /dev/null @@ -1,57 +0,0 @@ -class PointsDetails { - int accNumber; - String accountStatus; - double amount; - int lineItemNo; - String operationType; - double points; - double purchasePoints; - int subTransactionType; - String subTransactionTypeDescription; - String transactionDate; - - PointsDetails( - {this.accNumber, - this.accountStatus, - this.amount, - this.lineItemNo, - this.operationType, - this.points, - this.purchasePoints, - this.subTransactionType, - this.subTransactionTypeDescription, - this.transactionDate}); - - PointsDetails.fromJson(Map json) { - accNumber = json['AccNumber']; - accountStatus = json['AccountStatus']; - amount = json['Amount']; - lineItemNo = json['LineItemNo']; - operationType = json['OperationType']; - points = json['Points']; - var purchasePoints = json['PurchasePoints']; - if(purchasePoints is int){ - this.purchasePoints = (purchasePoints).roundToDouble(); - }else { - this.purchasePoints = purchasePoints; - } - subTransactionType = json['SubTransactionType']; - subTransactionTypeDescription = json['SubTransactionTypeDescription']; - transactionDate = json['TransactionDate']; - } - - Map toJson() { - final Map data = new Map(); - data['AccNumber'] = this.accNumber; - data['AccountStatus'] = this.accountStatus; - data['Amount'] = this.amount; - data['LineItemNo'] = this.lineItemNo; - data['OperationType'] = this.operationType; - data['Points'] = this.points; - data['PurchasePoints'] = this.purchasePoints; - data['SubTransactionType'] = this.subTransactionType; - data['SubTransactionTypeDescription'] = this.subTransactionTypeDescription; - data['TransactionDate'] = this.transactionDate; - return data; - } -} diff --git a/lib/core/model/pharmacies/ShippingOption.dart b/lib/core/model/pharmacies/ShippingOption.dart deleted file mode 100644 index 309e1f4f..00000000 --- a/lib/core/model/pharmacies/ShippingOption.dart +++ /dev/null @@ -1,98 +0,0 @@ -class ShippingOption { - String shippingRateComputationMethodSystemName; - double rate; - double rateVat; - double rateVatPercent; - String name; - String namen; - String description; - String descriptionn; - bool allowShippingSunday; - bool allowShippingMonday; - bool allowShippingTuesday; - bool allowShippingWednesday; - bool allowShippingThursday; - bool allowShippingFriday; - bool allowShippingSaturday; - String allowShippingTime1From; - String allowShippingTime1To; - String allowShippingTime2From; - String allowShippingTime2To; - String allowShippingNote; - String allowShippingNoten; - - ShippingOption( - {this.shippingRateComputationMethodSystemName, - this.rate, - this.rateVat, - this.rateVatPercent, - this.name, - this.namen, - this.description, - this.descriptionn, - this.allowShippingSunday, - this.allowShippingMonday, - this.allowShippingTuesday, - this.allowShippingWednesday, - this.allowShippingThursday, - this.allowShippingFriday, - this.allowShippingSaturday, - this.allowShippingTime1From, - this.allowShippingTime1To, - this.allowShippingTime2From, - this.allowShippingTime2To, - this.allowShippingNote, - this.allowShippingNoten}); - - ShippingOption.fromJson(Map json) { - shippingRateComputationMethodSystemName = - json['shipping_rate_computation_method_system_name']; - rate = json['rate']; - rateVat = json['rate_vat']; - rateVatPercent = json['rate_vat_percent']; - name = json['name']; - namen = json['namen']; - description = json['description']; - descriptionn = json['descriptionn']; - allowShippingSunday = json['AllowShippingSunday']; - allowShippingMonday = json['AllowShippingMonday']; - allowShippingTuesday = json['AllowShippingTuesday']; - allowShippingWednesday = json['AllowShippingWednesday']; - allowShippingThursday = json['AllowShippingThursday']; - allowShippingFriday = json['AllowShippingFriday']; - allowShippingSaturday = json['AllowShippingSaturday']; - allowShippingTime1From = json['AllowShippingTime1From']; - allowShippingTime1To = json['AllowShippingTime1To']; - allowShippingTime2From = json['AllowShippingTime2From']; - allowShippingTime2To = json['AllowShippingTime2To']; - allowShippingNote = json['AllowShippingNote']; - allowShippingNoten = json['AllowShippingNoten']; - } - - Map toJson() { - final Map data = new Map(); - data['shipping_rate_computation_method_system_name'] = - this.shippingRateComputationMethodSystemName; - data['rate'] = this.rate; - data['rate_vat'] = this.rateVat; - data['rate_vat_percent'] = this.rateVatPercent; - data['name'] = this.name; - data['namen'] = this.namen; - data['description'] = this.description; - data['descriptionn'] = this.descriptionn; - data['AllowShippingSunday'] = this.allowShippingSunday; - data['AllowShippingMonday'] = this.allowShippingMonday; - data['AllowShippingTuesday'] = this.allowShippingTuesday; - data['AllowShippingWednesday'] = this.allowShippingWednesday; - data['AllowShippingThursday'] = this.allowShippingThursday; - data['AllowShippingFriday'] = this.allowShippingFriday; - data['AllowShippingSaturday'] = this.allowShippingSaturday; - data['AllowShippingTime1From'] = this.allowShippingTime1From; - data['AllowShippingTime1To'] = this.allowShippingTime1To; - data['AllowShippingTime2From'] = this.allowShippingTime2From; - data['AllowShippingTime2To'] = this.allowShippingTime2To; - data['AllowShippingNote'] = this.allowShippingNote; - data['AllowShippingNoten'] = this.allowShippingNoten; - return data; - } -} diff --git a/lib/core/model/pharmacies/ShoppingCart.dart b/lib/core/model/pharmacies/ShoppingCart.dart deleted file mode 100644 index f965203a..00000000 --- a/lib/core/model/pharmacies/ShoppingCart.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Customer.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; - -class ShoppingCart { - int languageId; - String id; - // List productAttributes; - double customerEnteredPrice; - int quantity; - String discountAmountInclTax; - String subtotal; - String subtotalWithVat; - String subtotalVatAmount; - String subtotalVatRate; - String currency; - String currencyn; - String rentalStartDateUtc; - String rentalEndDateUtc; - String createdOnUtc; - String updatedOnUtc; - String shoppingCartType; - int productId; - PharmacyProduct product; - int customerId; - Customer customer; - - ShoppingCart( - {this.languageId, - this.id, - // this.productAttributes, - this.customerEnteredPrice, - this.quantity, - this.discountAmountInclTax, - this.subtotal, - this.subtotalWithVat, - this.subtotalVatAmount, - this.subtotalVatRate, - this.currency, - this.currencyn, - this.rentalStartDateUtc, - this.rentalEndDateUtc, - this.createdOnUtc, - this.updatedOnUtc, - this.shoppingCartType, - this.productId, - this.product, - this.customerId, - this.customer}); - - ShoppingCart.fromJson(Map json) { - languageId = json['language_id']; - id = json['id']; - /*if (json['product_attributes'] != null) { - productAttributes = new List(); - json['product_attributes'].forEach((v) { - productAttributes.add(new Null.fromJson(v)); - }); - }*/ - customerEnteredPrice = json['customer_entered_price']; - quantity = json['quantity']; - discountAmountInclTax = json['discount_amount_incl_tax']; - subtotal = json['subtotal']; - subtotalWithVat = json['subtotal_with_vat']; - subtotalVatAmount = json['subtotal_vat_amount']; - subtotalVatRate = json['subtotal_vat_rate']; - currency = json['currency']; - currencyn = json['currencyn']; - rentalStartDateUtc = json['rental_start_date_utc']; - rentalEndDateUtc = json['rental_end_date_utc']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - shoppingCartType = json['shopping_cart_type']; - productId = json['product_id']; - product = json['product'] != null - ? new PharmacyProduct.fromJson(json['product']) - : null; - customerId = json['customer_id']; - customer = json['customer'] != null - ? new Customer.fromJson(json['customer']) - : null; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['id'] = this.id; - /*if (this.productAttributes != null) { - data['product_attributes'] = - this.productAttributes.map((v) => v.toJson()).toList(); - }*/ - data['customer_entered_price'] = this.customerEnteredPrice; - data['quantity'] = this.quantity; - data['discount_amount_incl_tax'] = this.discountAmountInclTax; - data['subtotal'] = this.subtotal; - data['subtotal_with_vat'] = this.subtotalWithVat; - data['subtotal_vat_amount'] = this.subtotalVatAmount; - data['subtotal_vat_rate'] = this.subtotalVatRate; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['rental_start_date_utc'] = this.rentalStartDateUtc; - data['rental_end_date_utc'] = this.rentalEndDateUtc; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['shopping_cart_type'] = this.shoppingCartType; - data['product_id'] = this.productId; - if (this.product != null) { - data['product'] = this.product.toJson(); - } - data['customer_id'] = this.customerId; - if (this.customer != null) { - data['customer'] = this.customer.toJson(); - } - return data; - } -} diff --git a/lib/core/model/pharmacies/ShoppingCartResponse.dart b/lib/core/model/pharmacies/ShoppingCartResponse.dart deleted file mode 100644 index 96b751ae..00000000 --- a/lib/core/model/pharmacies/ShoppingCartResponse.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; -import 'package:flutter/material.dart'; - -class ShoppingCartResponse with ChangeNotifier { - int itemCount; - int quantityCount; - double subtotal; - double subtotalWithVat; - double subtotalVatAmount; - double subtotalVatRate; - List shoppingCarts; - - ShoppingCartResponse( - {this.itemCount, - this.quantityCount, - this.subtotal, - this.subtotalWithVat, - this.subtotalVatAmount, - this.subtotalVatRate, - this.shoppingCarts}); - - void updateShoppingCard() { - notifyListeners(); - } - - ShoppingCartResponse.fromJson(Map json) { - itemCount = json['item_count']; - quantityCount = json['quantity_count']; - subtotal = json['subtotal']; - subtotalWithVat = json['subtotal_with_vat']; - subtotalVatAmount = json['subtotal_vat_amount']; - subtotalVatRate = json['subtotal_vat_rate']; - if (json['shopping_carts'] != null) { - shoppingCarts = new List(); - json['shopping_carts'].forEach((v) { - shoppingCarts.add(new ShoppingCart.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['item_count'] = this.itemCount; - data['quantity_count'] = this.quantityCount; - data['subtotal'] = this.subtotal; - data['subtotal_with_vat'] = this.subtotalWithVat; - data['subtotal_vat_amount'] = this.subtotalVatAmount; - data['subtotal_vat_rate'] = this.subtotalVatRate; - if (this.shoppingCarts != null) { - data['shopping_carts'] = - this.shoppingCarts.map((v) => v.toJson()).toList(); - } - return data; - } -} diff --git a/lib/core/model/pharmacies/Specifications.dart b/lib/core/model/pharmacies/Specifications.dart deleted file mode 100644 index f227de69..00000000 --- a/lib/core/model/pharmacies/Specifications.dart +++ /dev/null @@ -1,36 +0,0 @@ -class Specifications { - int id; - int displayOrder; - String defaultValue; - String defaultValuen; - String name; - String nameN; - - Specifications( - {this.id, - this.displayOrder, - this.defaultValue, - this.defaultValuen, - this.name, - this.nameN}); - - Specifications.fromJson(Map json) { - id = json['id']; - displayOrder = json['display_order']; - defaultValue = json['default_value']; - defaultValuen = json['default_valuen']; - name = json['name']; - nameN = json['nameN']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['display_order'] = this.displayOrder; - data['default_value'] = this.defaultValue; - data['default_valuen'] = this.defaultValuen; - data['name'] = this.name; - data['nameN'] = this.nameN; - return data; - } -} diff --git a/lib/core/model/pharmacies/order_model.dart b/lib/core/model/pharmacies/order_model.dart deleted file mode 100644 index a82b8716..00000000 --- a/lib/core/model/pharmacies/order_model.dart +++ /dev/null @@ -1,1486 +0,0 @@ - -import 'dart:convert'; - -List orderModelFromJson(String str) => List.from(json.decode(str).map((x) => OrderModel.fromJson(x))); - -String orderModelToJson(List data) => json.encode(List.from(data.map((x) => x.toJson()))); - -class OrderModel { - OrderModel({ - this.id, - this.storeId, - this.orderGuid, - this.pickUpInStore, - this.paymentMethodSystemName, - this.paymentName, - this.paymentNamen, - this.customerCurrencyCode, - this.currencyRate, - this.customerTaxDisplayTypeId, - this.vatNumber, - this.orderSubtotalInclTax, - this.orderSubtotalExclTax, - this.orderSubTotalDiscountInclTax, - this.orderSubTotalDiscountExclTax, - this.orderShippingInclTax, - this.orderShippingExclTax, - this.paymentMethodAdditionalFeeInclTax, - this.paymentMethodAdditionalFeeExclTax, - this.taxRates, - this.orderTax, - this.orderDiscount, - this.orderTotal, - this.refundedAmount, - this.rewardPointsWereAdded, - this.rxAttachments, - this.checkoutAttributeDescription, - this.customerLanguageId, - this.affiliateId, - this.customerIp, - this.authorizationTransactionId, - this.authorizationTransactionCode, - this.authorizationTransactionResult, - this.captureTransactionId, - this.captureTransactionResult, - this.subscriptionTransactionId, - this.paidDateUtc, - this.shippingMethod, - this.shippingRateComputationMethodSystemName, - this.customValuesXml, - this.deleted, - this.createdOnUtc, - this.customer, - this.customerId, - this.billingAddress, - this.shippingAddress, - this.orderItems, - this.orderStatusId, - this.orderStatus, - this.orderStatusn, - this.paymentStatusId, - this.paymentStatus, - this.paymentStatusn, - this.shippingStatus, - this.shippingStatusn, - this.customerTaxDisplayType, - this.canCancel, - this.canRefund, - this.lakumAmount, - this.preferDeliveryDate, - this.preferDeliveryTime, - this.preferDeliveryTimen, - }); - - String id; - dynamic storeId; - String orderGuid; - bool pickUpInStore; - PaymentMethodSystemName paymentMethodSystemName; - PaymentName paymentName; - PaymentName paymentNamen; - CustomerCurrencyCode customerCurrencyCode; - dynamic currencyRate; - dynamic customerTaxDisplayTypeId; - dynamic vatNumber; - double orderSubtotalInclTax; - double orderSubtotalExclTax; - dynamic orderSubTotalDiscountInclTax; - dynamic orderSubTotalDiscountExclTax; - double orderShippingInclTax; - dynamic orderShippingExclTax; - dynamic paymentMethodAdditionalFeeInclTax; - dynamic paymentMethodAdditionalFeeExclTax; - String taxRates; - double orderTax; - dynamic orderDiscount; - double orderTotal; - dynamic refundedAmount; - dynamic rewardPointsWereAdded; - String rxAttachments; - CheckoutAttributeDescription checkoutAttributeDescription; - dynamic customerLanguageId; - dynamic affiliateId; - CustomerIp customerIp; - String authorizationTransactionId; - dynamic authorizationTransactionCode; - dynamic authorizationTransactionResult; - dynamic captureTransactionId; - dynamic captureTransactionResult; - dynamic subscriptionTransactionId; - DateTime paidDateUtc; - ShippingMethod shippingMethod; - ShippingRateComputationMethodSystemName shippingRateComputationMethodSystemName; - String customValuesXml; - bool deleted; - DateTime createdOnUtc; - OrderModelCustomer customer; - dynamic customerId; - IngAddress billingAddress; - IngAddress shippingAddress; - List orderItems; - dynamic orderStatusId; - OrderStatus orderStatus; - OrderStatusn orderStatusn; - dynamic paymentStatusId; - PaymentStatus paymentStatus; - PaymentStatusn paymentStatusn; - ShippingStatus shippingStatus; - ShippingStatusn shippingStatusn; - CustomerTaxDisplayType customerTaxDisplayType; - bool canCancel; - bool canRefund; - dynamic lakumAmount; - DateTime preferDeliveryDate; - PreferDeliveryTime preferDeliveryTime; - PreferDeliveryTimen preferDeliveryTimen; - - factory OrderModel.fromJson(Map json) => OrderModel( - id: json["id"], - storeId: json["store_id"], - orderGuid: json["order_guid"], - pickUpInStore: json["pick_up_in_store"], - paymentMethodSystemName: paymentMethodSystemNameValues.map[json["payment_method_system_name"]], - paymentName: paymentNameValues.map[json["payment_name"]], - paymentNamen: paymentNameValues.map[json["payment_namen"]], - customerCurrencyCode: customerCurrencyCodeValues.map[json["customer_currency_code"]], - currencyRate: json["currency_rate"], - customerTaxDisplayTypeId: json["customer_tax_display_type_id"], - vatNumber: json["vat_number"], - orderSubtotalInclTax: json["order_subtotal_incl_tax"].toDouble(), - orderSubtotalExclTax: json["order_subtotal_excl_tax"].toDouble(), - orderSubTotalDiscountInclTax: json["order_sub_total_discount_incl_tax"], - orderSubTotalDiscountExclTax: json["order_sub_total_discount_excl_tax"], - orderShippingInclTax: json["order_shipping_incl_tax"].toDouble(), - orderShippingExclTax: json["order_shipping_excl_tax"], - paymentMethodAdditionalFeeInclTax: json["payment_method_additional_fee_incl_tax"], - paymentMethodAdditionalFeeExclTax: json["payment_method_additional_fee_excl_tax"], - taxRates: json["tax_rates"], - orderTax: json["order_tax"].toDouble(), - orderDiscount: json["order_discount"], - orderTotal: json["order_total"].toDouble(), - refundedAmount: json["refunded_amount"], - rewardPointsWereAdded: json["reward_points_were_added"], - rxAttachments: json["rx_attachments"] == null ? null : json["rx_attachments"], - checkoutAttributeDescription: checkoutAttributeDescriptionValues.map[json["checkout_attribute_description"]], - customerLanguageId: json["customer_language_id"], - affiliateId: json["affiliate_id"], - customerIp: customerIpValues.map[json["customer_ip"]], - authorizationTransactionId: json["authorization_transaction_id"] == null ? null : json["authorization_transaction_id"], - authorizationTransactionCode: json["authorization_transaction_code"], - authorizationTransactionResult: json["authorization_transaction_result"], - captureTransactionId: json["capture_transaction_id"], - captureTransactionResult: json["capture_transaction_result"], - subscriptionTransactionId: json["subscription_transaction_id"], - paidDateUtc: json["paid_date_utc"] == null ? null : DateTime.parse(json["paid_date_utc"]), - shippingMethod: shippingMethodValues.map[json["shipping_method"]], - shippingRateComputationMethodSystemName: shippingRateComputationMethodSystemNameValues.map[json["shipping_rate_computation_method_system_name"]], - customValuesXml: json["custom_values_xml"], - deleted: json["deleted"], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - customer: OrderModelCustomer.fromJson(json["customer"]), - customerId: json["customer_id"], - billingAddress: IngAddress.fromJson(json["billing_address"]), - shippingAddress: IngAddress.fromJson(json["shipping_address"]), - orderItems: List.from(json["order_items"].map((x) => OrderItem.fromJson(x))), - orderStatusId: json["order_status_id"], - orderStatus: orderStatusValues.map[json["order_status"]], - orderStatusn: orderStatusnValues.map[json["order_statusn"]], - paymentStatusId: json["payment_status_id"], - paymentStatus: paymentStatusValues.map[json["payment_status"]], - paymentStatusn: paymentStatusnValues.map[json["payment_statusn"]], - shippingStatus: shippingStatusValues.map[json["shipping_status"]], - shippingStatusn: shippingStatusnValues.map[json["shipping_statusn"]], - customerTaxDisplayType: customerTaxDisplayTypeValues.map[json["customer_tax_display_type"]], - canCancel: json["can_cancel"], - canRefund: json["can_refund"], - lakumAmount: json["lakum_amount"], - preferDeliveryDate: json["prefer_delivery_date"] == null ? null : DateTime.parse(json["prefer_delivery_date"]), - preferDeliveryTime: json["prefer_delivery_time"] == null ? null : preferDeliveryTimeValues.map[json["prefer_delivery_time"]], - preferDeliveryTimen: json["prefer_delivery_timen"] == null ? null : preferDeliveryTimenValues.map[json["prefer_delivery_timen"]], - ); - - Map toJson() => { - "id": id, - "store_id": storeId, - "order_guid": orderGuid, - "pick_up_in_store": pickUpInStore, - "payment_method_system_name": paymentMethodSystemNameValues.reverse[paymentMethodSystemName], - "payment_name": paymentNameValues.reverse[paymentName], - "payment_namen": paymentNameValues.reverse[paymentNamen], - "customer_currency_code": customerCurrencyCodeValues.reverse[customerCurrencyCode], - "currency_rate": currencyRate, - "customer_tax_display_type_id": customerTaxDisplayTypeId, - "vat_number": vatNumber, - "order_subtotal_incl_tax": orderSubtotalInclTax, - "order_subtotal_excl_tax": orderSubtotalExclTax, - "order_sub_total_discount_incl_tax": orderSubTotalDiscountInclTax, - "order_sub_total_discount_excl_tax": orderSubTotalDiscountExclTax, - "order_shipping_incl_tax": orderShippingInclTax, - "order_shipping_excl_tax": orderShippingExclTax, - "payment_method_additional_fee_incl_tax": paymentMethodAdditionalFeeInclTax, - "payment_method_additional_fee_excl_tax": paymentMethodAdditionalFeeExclTax, - "tax_rates": taxRates, - "order_tax": orderTax, - "order_discount": orderDiscount, - "order_total": orderTotal, - "refunded_amount": refundedAmount, - "reward_points_were_added": rewardPointsWereAdded, - "rx_attachments": rxAttachments == null ? null : rxAttachments, - "checkout_attribute_description": checkoutAttributeDescriptionValues.reverse[checkoutAttributeDescription], - "customer_language_id": customerLanguageId, - "affiliate_id": affiliateId, - "customer_ip": customerIpValues.reverse[customerIp], - "authorization_transaction_id": authorizationTransactionId == null ? null : authorizationTransactionId, - "authorization_transaction_code": authorizationTransactionCode, - "authorization_transaction_result": authorizationTransactionResult, - "capture_transaction_id": captureTransactionId, - "capture_transaction_result": captureTransactionResult, - "subscription_transaction_id": subscriptionTransactionId, - "paid_date_utc": paidDateUtc == null ? null : paidDateUtc.toIso8601String(), - "shipping_method": shippingMethodValues.reverse[shippingMethod], - "shipping_rate_computation_method_system_name": shippingRateComputationMethodSystemNameValues.reverse[shippingRateComputationMethodSystemName], - "custom_values_xml": customValuesXml, - "deleted": deleted, - "created_on_utc": createdOnUtc.toIso8601String(), - "customer": customer.toJson(), - "customer_id": customerId, - "billing_address": billingAddress.toJson(), - "shipping_address": shippingAddress.toJson(), - "order_items": List.from(orderItems.map((x) => x.toJson())), - "order_status_id": orderStatusId, - "order_status": orderStatusValues.reverse[orderStatus], - "order_statusn": orderStatusnValues.reverse[orderStatusn], - "payment_status_id": paymentStatusId, - "payment_status": paymentStatusValues.reverse[paymentStatus], - "payment_statusn": paymentStatusnValues.reverse[paymentStatusn], - "shipping_status": shippingStatusValues.reverse[shippingStatus], - "shipping_statusn": shippingStatusnValues.reverse[shippingStatusn], - "customer_tax_display_type": customerTaxDisplayTypeValues.reverse[customerTaxDisplayType], - "can_cancel": canCancel, - "can_refund": canRefund, - "lakum_amount": lakumAmount, - "prefer_delivery_date": preferDeliveryDate == null ? null : "${preferDeliveryDate.year.toString().padLeft(4, '0')}-${preferDeliveryDate.month.toString().padLeft(2, '0')}-${preferDeliveryDate.day.toString().padLeft(2, '0')}", - "prefer_delivery_time": preferDeliveryTime == null ? null : preferDeliveryTimeValues.reverse[preferDeliveryTime], - "prefer_delivery_timen": preferDeliveryTimen == null ? null : preferDeliveryTimenValues.reverse[preferDeliveryTimen], - }; -} - -class IngAddress { - IngAddress({ - this.id, - this.firstName, - this.lastName, - this.email, - this.company, - this.countryId, - this.country, - this.stateProvinceId, - this.city, - this.address1, - this.address2, - this.zipPostalCode, - this.phoneNumber, - this.faxNumber, - this.customerAttributes, - this.createdOnUtc, - this.province, - this.latLong, - }); - - String id; - FirstName firstName; - LastName lastName; - BillingAddressEmail email; - dynamic company; - dynamic countryId; - Country country; - dynamic stateProvinceId; - City city; - Address1 address1; - Address2 address2; - String zipPostalCode; - String phoneNumber; - dynamic faxNumber; - String customerAttributes; - DateTime createdOnUtc; - dynamic province; - LatLong latLong; - - factory IngAddress.fromJson(Map json) => IngAddress( - id: json["id"], - firstName: firstNameValues.map[json["first_name"]], - lastName: lastNameValues.map[json["last_name"]], - email: billingAddressEmailValues.map[json["email"]], - company: json["company"], - countryId: json["country_id"], - country: countryValues.map[json["country"]], - stateProvinceId: json["state_province_id"], - city: cityValues.map[json["city"]], - address1: address1Values.map[json["address1"]], - address2: address2Values.map[json["address2"]], - zipPostalCode: json["zip_postal_code"], - phoneNumber: json["phone_number"], - faxNumber: json["fax_number"], - customerAttributes: json["customer_attributes"], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - province: json["province"], - latLong: latLongValues.map[json["lat_long"]], - ); - - Map toJson() => { - "id": id, - "first_name": firstNameValues.reverse[firstName], - "last_name": lastNameValues.reverse[lastName], - "email": billingAddressEmailValues.reverse[email], - "company": company, - "country_id": countryId, - "country": countryValues.reverse[country], - "state_province_id": stateProvinceId, - "city": cityValues.reverse[city], - "address1": address1Values.reverse[address1], - "address2": address2Values.reverse[address2], - "zip_postal_code": zipPostalCode, - "phone_number": phoneNumber, - "fax_number": faxNumber, - "customer_attributes": customerAttributes, - "created_on_utc": createdOnUtc.toIso8601String(), - "province": province, - "lat_long": latLongValues.reverse[latLong], - }; -} - -enum Address1 { THE_7960_MOSAB_IBN_UMAIR_STREET_AL_RIYADH, THE_6500_AL_AMEEN_ABDULLAH_AL_ALI_AL_NAEEM_STREET_AL_RIYADH, THE_6603_IBRAHIM_IBN_AL_HAMASI_AR_RIYAD, THE_9626_SALAH_AD_DIN_AL_AYYUBI_ROAD_AL_RIYADH, THE_3075_PRINCE_MANSUR_BIN_ABDULAZIZ_STREET_AL_RIYADH, THE_40, THE_7801_AL_IHSA_AL_RIYADH } - -final address1Values = EnumValues({ - "3075, Prince Mansur Bin Abdulaziz Street, Al Riyadh, ": Address1.THE_3075_PRINCE_MANSUR_BIN_ABDULAZIZ_STREET_AL_RIYADH, - "40,": Address1.THE_40, - "6500, Al Ameen Abdullah Al Ali Al Naeem Street, Al Riyadh, ": Address1.THE_6500_AL_AMEEN_ABDULLAH_AL_ALI_AL_NAEEM_STREET_AL_RIYADH, - "6603, Ibrahim Ibn Al Hamasi, Ar-Riyad, ": Address1.THE_6603_IBRAHIM_IBN_AL_HAMASI_AR_RIYAD, - "7801, Al Ihsa, Al Riyadh, ": Address1.THE_7801_AL_IHSA_AL_RIYADH, - "7960, Mosab Ibn Umair Street, Al Riyadh, ": Address1.THE_7960_MOSAB_IBN_UMAIR_STREET_AL_RIYADH, - "9626, Salah Ad Din Al Ayyubi Road, Al Riyadh, ": Address1.THE_9626_SALAH_AD_DIN_AL_AYYUBI_ROAD_AL_RIYADH -}); - -enum Address2 { AL_MALAZ_RIYADH_PROVINCE_3460, AL_MALAZ_RIYADH_PROVINCE_2817, AR_RAHMANIYYAH_RIYADH_PROVINCE_3816, AL_MALAZ_RIYADH_PROVINCE_3815, AL_WIZARAT_RIYADH_PROVINCE_7039, EASTERN_PROVINCE, AL_MALAZ_RIYADH_PROVINCE_3084 } - -final address2Values = EnumValues({ - "Al Malaz, Riyadh Province, 2817, ": Address2.AL_MALAZ_RIYADH_PROVINCE_2817, - "Al Malaz, Riyadh Province, 3084, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3084, - "Al Malaz, Riyadh Province, 3460, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3460, - "Al Malaz, Riyadh Province, 3815, ": Address2.AL_MALAZ_RIYADH_PROVINCE_3815, - "Al Wizarat, Riyadh Province, 7039, ": Address2.AL_WIZARAT_RIYADH_PROVINCE_7039, - "Ar Rahmaniyyah, Riyadh Province, 3816, ": Address2.AR_RAHMANIYYAH_RIYADH_PROVINCE_3816, - "Eastern Province,": Address2.EASTERN_PROVINCE -}); - -enum City { RIYADH, DAMMAM } - -final cityValues = EnumValues({ - "Dammam": City.DAMMAM, - "Riyadh": City.RIYADH -}); - -enum Country { SAUDI_ARABIA } - -final countryValues = EnumValues({ - "Saudi Arabia": Country.SAUDI_ARABIA -}); - -enum BillingAddressEmail { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM, TAMER_FANASHEH_DRSULAIMANALHABIB_COM } - -final billingAddressEmailValues = EnumValues({ - "Tamer.dasdasdas@gmail.com": BillingAddressEmail.TAMER_DASDASDAS_GMAIL_COM, - "tamer.fanasheh@drsulaimanalhabib.com": BillingAddressEmail.TAMER_FANASHEH_DRSULAIMANALHABIB_COM, - "Tamer.fanasheh@gmail.com": BillingAddressEmail.TAMER_FANASHEH_GMAIL_COM -}); - -enum FirstName { TAMER, TAMER_FANASHEH, FIRST_NAME_TAMER } - -final firstNameValues = EnumValues({ - "tamer": FirstName.FIRST_NAME_TAMER, - "TAMER": FirstName.TAMER, - "TAMER FANASHEH": FirstName.TAMER_FANASHEH -}); - -enum LastName { FANASHEH, MUSA, LAST_NAME_FANASHEH } - -final lastNameValues = EnumValues({ - "FANASHEH": LastName.FANASHEH, - "Fanasheh": LastName.LAST_NAME_FANASHEH, - "MUSA": LastName.MUSA -}); - -enum LatLong { THE_246784385694919524674091019299842, THE_24664749106968054673501121876645, THE_2470993657522702246664724647270134, THE_246626170308533764673348444086107, THE_24664875225999005467347443322574, THE_24674331807435784671024726818286, THE_263430228396836664991113909164471, THE_246767400793488074673774399406786, THE_24665374673515 } - -final latLongValues = EnumValues({ - "24.662617030853376,46.73348444086107": LatLong.THE_246626170308533764673348444086107, - "24.66474910696805,46.73501121876645": LatLong.THE_24664749106968054673501121876645, - "24.664875225999005,46.7347443322574": LatLong.THE_24664875225999005467347443322574, - "24.66537,46.73515": LatLong.THE_24665374673515, - "24.67433180743578,46.71024726818286": LatLong.THE_24674331807435784671024726818286, - "24.676740079348807,46.73774399406786": LatLong.THE_246767400793488074673774399406786, - "24.678438569491952,46.74091019299842": LatLong.THE_246784385694919524674091019299842, - "24.709936575227022,46.664724647270134": LatLong.THE_2470993657522702246664724647270134, - "26.343022839683666, 49.91113909164471": LatLong.THE_263430228396836664991113909164471 -}); - -enum CheckoutAttributeDescription { EMPTY, CHECKOUT_ATTRIBUTE_DESCRIPTION } - -final checkoutAttributeDescriptionValues = EnumValues({ - "ارفاق وصفة: ": CheckoutAttributeDescription.CHECKOUT_ATTRIBUTE_DESCRIPTION, - "": CheckoutAttributeDescription.EMPTY -}); - -class OrderModelCustomer { - OrderModelCustomer({ - this.id, - this.username, - this.email, - this.firstName, - this.lastName, - this.languageId, - this.adminComment, - this.isTaxExempt, - this.hasShoppingCartItems, - this.active, - this.deleted, - this.isSystemAccount, - this.systemName, - this.lastIpAddress, - this.createdOnUtc, - this.lastLoginDateUtc, - this.lastActivityDateUtc, - this.registeredInStoreId, - this.roleIds, - }); - - String id; - Username username; - BillingAddressEmail email; - FirstName firstName; - LastName lastName; - String languageId; - dynamic adminComment; - bool isTaxExempt; - bool hasShoppingCartItems; - bool active; - bool deleted; - bool isSystemAccount; - dynamic systemName; - LastIpAddress lastIpAddress; - DateTime createdOnUtc; - DateTime lastLoginDateUtc; - DateTime lastActivityDateUtc; - dynamic registeredInStoreId; - List roleIds; - - factory OrderModelCustomer.fromJson(Map json) => OrderModelCustomer( - id: json["id"], - username: usernameValues.map[json["username"]], - email: billingAddressEmailValues.map[json["email"]], - firstName: firstNameValues.map[json["first_name"]], - lastName: lastNameValues.map[json["last_name"]], - languageId: json["language_id"], - adminComment: json["admin_comment"], - isTaxExempt: json["is_tax_exempt"], - hasShoppingCartItems: json["has_shopping_cart_items"], - active: json["active"], - deleted: json["deleted"], - isSystemAccount: json["is_system_account"], - systemName: json["system_name"], - lastIpAddress: lastIpAddressValues.map[json["last_ip_address"]], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]), - lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]), - registeredInStoreId: json["registered_in_store_id"], - roleIds: List.from(json["role_ids"].map((x) => x)), - ); - - Map toJson() => { - "id": id, - "username": usernameValues.reverse[username], - "email": billingAddressEmailValues.reverse[email], - "first_name": firstNameValues.reverse[firstName], - "last_name": lastNameValues.reverse[lastName], - "language_id": languageId, - "admin_comment": adminComment, - "is_tax_exempt": isTaxExempt, - "has_shopping_cart_items": hasShoppingCartItems, - "active": active, - "deleted": deleted, - "is_system_account": isSystemAccount, - "system_name": systemName, - "last_ip_address": lastIpAddressValues.reverse[lastIpAddress], - "created_on_utc": createdOnUtc.toIso8601String(), - "last_login_date_utc": lastLoginDateUtc.toIso8601String(), - "last_activity_date_utc": lastActivityDateUtc.toIso8601String(), - "registered_in_store_id": registeredInStoreId, - "role_ids": List.from(roleIds.map((x) => x)), - }; -} - -enum LastIpAddress { THE_1050220126 } - -final lastIpAddressValues = EnumValues({ - "10.50.220.126": LastIpAddress.THE_1050220126 -}); - -enum Username { TAMERF } - -final usernameValues = EnumValues({ - "tamerf": Username.TAMERF -}); - -enum CustomerCurrencyCode { SAR } - -final customerCurrencyCodeValues = EnumValues({ - "SAR": CustomerCurrencyCode.SAR -}); - -enum CustomerIp { THE_105010210, THE_127001, THE_1020200101, THE_102020041, THE_10501028, THE_102020033, THE_1020200170, THE_102020011 } - -final customerIpValues = EnumValues({ - "10.20.200.101": CustomerIp.THE_1020200101, - "10.20.200.11": CustomerIp.THE_102020011, - "10.20.200.170": CustomerIp.THE_1020200170, - "10.20.200.33": CustomerIp.THE_102020033, - "10.20.200.41": CustomerIp.THE_102020041, - "10.50.102.10": CustomerIp.THE_105010210, - "10.50.102.8": CustomerIp.THE_10501028, - "127.0.0.1": CustomerIp.THE_127001 -}); - -enum CustomerTaxDisplayType { EXCLUDING_TAX } - -final customerTaxDisplayTypeValues = EnumValues({ - "ExcludingTax": CustomerTaxDisplayType.EXCLUDING_TAX -}); - -class OrderItem { - OrderItem({ - this.quantity, - this.unitPriceInclTax, - this.unitPriceExclTax, - this.priceInclTax, - this.priceExclTax, - this.discountAmountInclTax, - this.discountAmountExclTax, - this.originalProductCost, - this.attributeDescription, - this.downloadCount, - this.isDownloadActivated, - this.licenseDownloadId, - this.itemWeight, - this.rentalStartDateUtc, - this.rentalEndDateUtc, - this.product, - this.productId, - }); - - dynamic quantity; - double unitPriceInclTax; - double unitPriceExclTax; - double priceInclTax; - double priceExclTax; - double discountAmountInclTax; - double discountAmountExclTax; - double originalProductCost; - String attributeDescription; - dynamic downloadCount; - bool isDownloadActivated; - dynamic licenseDownloadId; - double itemWeight; - dynamic rentalStartDateUtc; - dynamic rentalEndDateUtc; - Product product; - dynamic productId; - - factory OrderItem.fromJson(Map json) => OrderItem( - quantity: json["quantity"], - unitPriceInclTax: json["unit_price_incl_tax"].toDouble(), - unitPriceExclTax: json["unit_price_excl_tax"].toDouble(), - priceInclTax: json["price_incl_tax"].toDouble(), - priceExclTax: json["price_excl_tax"].toDouble(), - discountAmountInclTax: json["discount_amount_incl_tax"].toDouble(), - discountAmountExclTax: json["discount_amount_excl_tax"].toDouble(), - originalProductCost: json["original_product_cost"].toDouble(), - attributeDescription: json["attribute_description"], - downloadCount: json["download_count"], - isDownloadActivated: json["isDownload_activated"], - licenseDownloadId: json["license_download_id"], - itemWeight: json["item_weight"].toDouble(), - rentalStartDateUtc: json["rental_start_date_utc"], - rentalEndDateUtc: json["rental_end_date_utc"], - product: Product.fromJson(json["product"]), - productId: json["product_id"], - ); - - Map toJson() => { - "quantity": quantity, - "unit_price_incl_tax": unitPriceInclTax, - "unit_price_excl_tax": unitPriceExclTax, - "price_incl_tax": priceInclTax, - "price_excl_tax": priceExclTax, - "discount_amount_incl_tax": discountAmountInclTax, - "discount_amount_excl_tax": discountAmountExclTax, - "original_product_cost": originalProductCost, - "attribute_description": attributeDescription, - "download_count": downloadCount, - "isDownload_activated": isDownloadActivated, - "license_download_id": licenseDownloadId, - "item_weight": itemWeight, - "rental_start_date_utc": rentalStartDateUtc, - "rental_end_date_utc": rentalEndDateUtc, - "product": product.toJson(), - "product_id": productId, - }; -} - -class Product { - Product({ - this.id, - this.visibleIndividually, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.shortDescriptionn, - this.fullDescription, - this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, - this.approvedRatingSum, - this.notApprovedRatingSum, - this.approvedTotalReviews, - this.notApprovedTotalReviews, - this.sku, - this.isRx, - this.prescriptionRequired, - this.rxMessage, - this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, - this.price, - this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, - this.discountName, - this.discountNamen, - this.discountDescription, - this.discountDescriptionn, - this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, - this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, - this.discountIds, - this.storeIds, - this.manufacturerIds, - this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName, - }); - - String id; - bool visibleIndividually; - String name; - String namen; - dynamic localizedNames; - String shortDescription; - String shortDescriptionn; - String fullDescription; - String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - String metaKeywords; - String metaDescription; - String metaTitle; - bool allowCustomerReviews; - dynamic approvedRatingSum; - dynamic notApprovedRatingSum; - dynamic approvedTotalReviews; - dynamic notApprovedTotalReviews; - String sku; - bool isRx; - bool prescriptionRequired; - dynamic rxMessage; - dynamic rxMessagen; - dynamic manufacturerPartNumber; - dynamic gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; - dynamic maxNumberOfDownloads; - dynamic downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; - dynamic recurringCycleLength; - dynamic recurringTotalCycles; - bool isRental; - dynamic rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; - dynamic additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; - dynamic manageInventoryMethodId; - dynamic stockQuantity; - dynamic stockAvailability; - dynamic stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; - dynamic minStockQuantity; - dynamic notifyAdminForQuantityBelow; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; - dynamic preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; - double price; - dynamic oldPrice; - double productCost; - dynamic specialPrice; - dynamic specialPriceStartDateTimeUtc; - dynamic specialPriceEndDateTimeUtc; - bool customerEntersPrice; - dynamic minimumCustomerEnteredPrice; - dynamic maximumCustomerEnteredPrice; - bool basepriceEnabled; - dynamic basepriceAmount; - dynamic basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; - dynamic discountName; - dynamic discountNamen; - dynamic discountDescription; - dynamic discountDescriptionn; - dynamic discountPercentage; - dynamic currency; - dynamic currencyn; - double weight; - dynamic length; - dynamic width; - dynamic height; - dynamic availableStartDateTimeUtc; - dynamic availableEndDateTimeUtc; - dynamic displayOrder; - bool published; - bool deleted; - DateTime createdOnUtc; - DateTime updatedOnUtc; - ProductType productType; - dynamic parentGroupedProductId; - dynamic roleIds; - dynamic discountIds; - dynamic storeIds; - dynamic manufacturerIds; - List reviews; - List images; - dynamic attributes; - dynamic specifications; - dynamic associatedProductIds; - List tags; - dynamic vendorId; - String seName; - - factory Product.fromJson(Map json) => Product( - id: json["id"], - visibleIndividually: json["visible_individually"], - name: json["name"], - namen: json["namen"], - localizedNames: json["localized_names"], - shortDescription: json["short_description"] == null ? null : json["short_description"], - shortDescriptionn: json["short_descriptionn"] == null ? null : json["short_descriptionn"], - fullDescription: json["full_description"], - fullDescriptionn: json["full_descriptionn"], - markasNew: json["markas_new"], - showOnHomePage: json["show_on_home_page"], - metaKeywords: json["meta_keywords"] == null ? null : json["meta_keywords"], - metaDescription: json["meta_description"] == null ? null : json["meta_description"], - metaTitle: json["meta_title"] == null ? null : json["meta_title"], - allowCustomerReviews: json["allow_customer_reviews"], - approvedRatingSum: json["approved_rating_sum"], - notApprovedRatingSum: json["not_approved_rating_sum"], - approvedTotalReviews: json["approved_total_reviews"], - notApprovedTotalReviews: json["not_approved_total_reviews"], - sku: json["sku"], - isRx: json["is_rx"], - prescriptionRequired: json["prescription_required"], - rxMessage: json["rx_message"], - rxMessagen: json["rx_messagen"], - manufacturerPartNumber: json["manufacturer_part_number"], - gtin: json["gtin"], - isGiftCard: json["is_gift_card"], - requireOtherProducts: json["require_other_products"], - automaticallyAddRequiredProducts: json["automatically_add_required_products"], - isDownload: json["is_download"], - unlimitedDownloads: json["unlimited_downloads"], - maxNumberOfDownloads: json["max_number_of_downloads"], - downloadExpirationDays: json["download_expiration_days"], - hasSampleDownload: json["has_sample_download"], - hasUserAgreement: json["has_user_agreement"], - isRecurring: json["is_recurring"], - recurringCycleLength: json["recurring_cycle_length"], - recurringTotalCycles: json["recurring_total_cycles"], - isRental: json["is_rental"], - rentalPriceLength: json["rental_price_length"], - isShipEnabled: json["is_ship_enabled"], - isFreeShipping: json["is_free_shipping"], - shipSeparately: json["ship_separately"], - additionalShippingCharge: json["additional_shipping_charge"], - isTaxExempt: json["is_tax_exempt"], - isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"], - useMultipleWarehouses: json["use_multiple_warehouses"], - manageInventoryMethodId: json["manage_inventory_method_id"], - stockQuantity: json["stock_quantity"], - stockAvailability: json["stock_availability"], - stockAvailabilityn: json["stock_availabilityn"], - displayStockAvailability: json["display_stock_availability"], - displayStockQuantity: json["display_stock_quantity"], - minStockQuantity: json["min_stock_quantity"], - notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"], - allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"], - orderMinimumQuantity: json["order_minimum_quantity"], - orderMaximumQuantity: json["order_maximum_quantity"], - allowedQuantities: json["allowed_quantities"], - allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"], - disableBuyButton: json["disable_buy_button"], - disableWishlistButton: json["disable_wishlist_button"], - availableForPreOrder: json["available_for_pre_order"], - preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"], - callForPrice: json["call_for_price"], - price: json["price"].toDouble(), - oldPrice: json["old_price"], - productCost: json["product_cost"].toDouble(), - specialPrice: json["special_price"], - specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"], - specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"], - customerEntersPrice: json["customer_enters_price"], - minimumCustomerEnteredPrice: json["minimum_customer_entered_price"], - maximumCustomerEnteredPrice: json["maximum_customer_entered_price"], - basepriceEnabled: json["baseprice_enabled"], - basepriceAmount: json["baseprice_amount"], - basepriceBaseAmount: json["baseprice_base_amount"], - hasTierPrices: json["has_tier_prices"], - hasDiscountsApplied: json["has_discounts_applied"], - discountName: json["discount_name"], - discountNamen: json["discount_namen"], - discountDescription: json["discount_description"], - discountDescriptionn: json["discount_Descriptionn"], - discountPercentage: json["discount_percentage"], - currency: json["currency"], - currencyn: json["currencyn"], - weight: json["weight"].toDouble(), - length: json["length"], - width: json["width"], - height: json["height"], - availableStartDateTimeUtc: json["available_start_date_time_utc"], - availableEndDateTimeUtc: json["available_end_date_time_utc"], - displayOrder: json["display_order"], - published: json["published"], - deleted: json["deleted"], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - updatedOnUtc: DateTime.parse(json["updated_on_utc"]), - productType: productTypeValues.map[json["product_type"]], - parentGroupedProductId: json["parent_grouped_product_id"], - roleIds: json["role_ids"], - discountIds: json["discount_ids"], - storeIds: json["store_ids"], - manufacturerIds: json["manufacturer_ids"], - reviews: List.from(json["reviews"].map((x) => Review.fromJson(x))), - images: List.from(json["images"].map((x) => Image.fromJson(x))), - attributes: json["attributes"], - specifications: json["specifications"], - associatedProductIds: json["associated_product_ids"], - tags: List.from(json["tags"].map((x) => x)), - vendorId: json["vendor_id"], - seName: json["se_name"], - ); - - Map toJson() => { - "id": id, - "visible_individually": visibleIndividually, - "name": name, - "namen": namen, - "localized_names": localizedNames, - "short_description": shortDescription == null ? null : shortDescription, - "short_descriptionn": shortDescriptionn == null ? null : shortDescriptionn, - "full_description": fullDescription, - "full_descriptionn": fullDescriptionn, - "markas_new": markasNew, - "show_on_home_page": showOnHomePage, - "meta_keywords": metaKeywords == null ? null : metaKeywords, - "meta_description": metaDescription == null ? null : metaDescription, - "meta_title": metaTitle == null ? null : metaTitle, - "allow_customer_reviews": allowCustomerReviews, - "approved_rating_sum": approvedRatingSum, - "not_approved_rating_sum": notApprovedRatingSum, - "approved_total_reviews": approvedTotalReviews, - "not_approved_total_reviews": notApprovedTotalReviews, - "sku": sku, - "is_rx": isRx, - "prescription_required": prescriptionRequired, - "rx_message": rxMessage, - "rx_messagen": rxMessagen, - "manufacturer_part_number": manufacturerPartNumber, - "gtin": gtin, - "is_gift_card": isGiftCard, - "require_other_products": requireOtherProducts, - "automatically_add_required_products": automaticallyAddRequiredProducts, - "is_download": isDownload, - "unlimited_downloads": unlimitedDownloads, - "max_number_of_downloads": maxNumberOfDownloads, - "download_expiration_days": downloadExpirationDays, - "has_sample_download": hasSampleDownload, - "has_user_agreement": hasUserAgreement, - "is_recurring": isRecurring, - "recurring_cycle_length": recurringCycleLength, - "recurring_total_cycles": recurringTotalCycles, - "is_rental": isRental, - "rental_price_length": rentalPriceLength, - "is_ship_enabled": isShipEnabled, - "is_free_shipping": isFreeShipping, - "ship_separately": shipSeparately, - "additional_shipping_charge": additionalShippingCharge, - "is_tax_exempt": isTaxExempt, - "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices, - "use_multiple_warehouses": useMultipleWarehouses, - "manage_inventory_method_id": manageInventoryMethodId, - "stock_quantity": stockQuantity, - "stock_availability": stockAvailability, - "stock_availabilityn": stockAvailabilityn, - "display_stock_availability": displayStockAvailability, - "display_stock_quantity": displayStockQuantity, - "min_stock_quantity": minStockQuantity, - "notify_admin_for_quantity_below": notifyAdminForQuantityBelow, - "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions, - "order_minimum_quantity": orderMinimumQuantity, - "order_maximum_quantity": orderMaximumQuantity, - "allowed_quantities": allowedQuantities, - "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations, - "disable_buy_button": disableBuyButton, - "disable_wishlist_button": disableWishlistButton, - "available_for_pre_order": availableForPreOrder, - "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc, - "call_for_price": callForPrice, - "price": price, - "old_price": oldPrice, - "product_cost": productCost, - "special_price": specialPrice, - "special_price_start_date_time_utc": specialPriceStartDateTimeUtc, - "special_price_end_date_time_utc": specialPriceEndDateTimeUtc, - "customer_enters_price": customerEntersPrice, - "minimum_customer_entered_price": minimumCustomerEnteredPrice, - "maximum_customer_entered_price": maximumCustomerEnteredPrice, - "baseprice_enabled": basepriceEnabled, - "baseprice_amount": basepriceAmount, - "baseprice_base_amount": basepriceBaseAmount, - "has_tier_prices": hasTierPrices, - "has_discounts_applied": hasDiscountsApplied, - "discount_name": discountName, - "discount_namen": discountNamen, - "discount_description": discountDescription, - "discount_Descriptionn": discountDescriptionn, - "discount_percentage": discountPercentage, - "currency": currency, - "currencyn": currencyn, - "weight": weight, - "length": length, - "width": width, - "height": height, - "available_start_date_time_utc": availableStartDateTimeUtc, - "available_end_date_time_utc": availableEndDateTimeUtc, - "display_order": displayOrder, - "published": published, - "deleted": deleted, - "created_on_utc": createdOnUtc.toIso8601String(), - "updated_on_utc": updatedOnUtc.toIso8601String(), - "product_type": productTypeValues.reverse[productType], - "parent_grouped_product_id": parentGroupedProductId, - "role_ids": roleIds, - "discount_ids": discountIds, - "store_ids": storeIds, - "manufacturer_ids": manufacturerIds, - "reviews": List.from(reviews.map((x) => x.toJson())), - "images": List.from(images.map((x) => x.toJson())), - "attributes": attributes, - "specifications": specifications, - "associated_product_ids": associatedProductIds, - "tags": List.from(tags.map((x) => x)), - "vendor_id": vendorId, - "se_name": seName, - }; -} - -class Image { - Image({ - this.id, - this.position, - this.src, - this.thumb, - this.attachment, - }); - - dynamic id; - dynamic position; - String src; - String thumb; - String attachment; - - factory Image.fromJson(Map json) => Image( - id: json["id"], - position: json["position"], - src: json["src"], - thumb: json["thumb"], - attachment: json["attachment"], - ); - - Map toJson() => { - "id": id, - "position": position, - "src": src, - "thumb": thumb, - "attachment": attachment, - }; -} - -enum ProductType { SIMPLE_PRODUCT } - -final productTypeValues = EnumValues({ - "SimpleProduct": ProductType.SIMPLE_PRODUCT -}); - -class Review { - Review({ - this.id, - this.position, - this.reviewId, - this.customerId, - this.productId, - this.storeId, - this.isApproved, - this.title, - this.reviewText, - this.replyText, - this.rating, - this.helpfulYesTotal, - this.helpfulNoTotal, - this.createdOnUtc, - this.customer, - this.product, - }); - - dynamic id; - dynamic position; - dynamic reviewId; - dynamic customerId; - dynamic productId; - dynamic storeId; - bool isApproved; - Title title; - ReviewText reviewText; - dynamic replyText; - dynamic rating; - dynamic helpfulYesTotal; - dynamic helpfulNoTotal; - DateTime createdOnUtc; - ReviewCustomer customer; - dynamic product; - - factory Review.fromJson(Map json) => Review( - id: json["id"], - position: json["position"], - reviewId: json["review_id"], - customerId: json["customer_id"], - productId: json["product_id"], - storeId: json["store_id"], - isApproved: json["is_approved"], - title: titleValues.map[json["title"]], - reviewText: reviewTextValues.map[json["review_text"]], - replyText: json["reply_text"], - rating: json["rating"], - helpfulYesTotal: json["helpful_yes_total"], - helpfulNoTotal: json["helpful_no_total"], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - customer: ReviewCustomer.fromJson(json["customer"]), - product: json["product"], - ); - - Map toJson() => { - "id": id, - "position": position, - "review_id": reviewId, - "customer_id": customerId, - "product_id": productId, - "store_id": storeId, - "is_approved": isApproved, - "title": titleValues.reverse[title], - "review_text": reviewTextValues.reverse[reviewText], - "reply_text": replyText, - "rating": rating, - "helpful_yes_total": helpfulYesTotal, - "helpful_no_total": helpfulNoTotal, - "created_on_utc": createdOnUtc.toIso8601String(), - "customer": customer.toJson(), - "product": product, - }; -} - -class ReviewCustomer { - ReviewCustomer({ - this.fileNumber, - this.iqamaNumber, - this.isOutSa, - this.patientType, - this.gender, - this.birthDate, - this.phone, - this.countryCode, - this.yahalaAccountno, - this.billingAddress, - this.shippingAddress, - this.addresses, - this.id, - this.username, - this.email, - this.firstName, - this.lastName, - this.languageId, - this.adminComment, - this.isTaxExempt, - this.hasShoppingCartItems, - this.active, - this.deleted, - this.isSystemAccount, - this.systemName, - this.lastIpAddress, - this.createdOnUtc, - this.lastLoginDateUtc, - this.lastActivityDateUtc, - this.registeredInStoreId, - this.roleIds, - }); - - dynamic fileNumber; - dynamic iqamaNumber; - dynamic isOutSa; - dynamic patientType; - dynamic gender; - DateTime birthDate; - dynamic phone; - dynamic countryCode; - dynamic yahalaAccountno; - dynamic billingAddress; - dynamic shippingAddress; - List addresses; - String id; - String username; - PurpleEmail email; - dynamic firstName; - dynamic lastName; - dynamic languageId; - dynamic adminComment; - dynamic isTaxExempt; - dynamic hasShoppingCartItems; - dynamic active; - dynamic deleted; - dynamic isSystemAccount; - dynamic systemName; - dynamic lastIpAddress; - dynamic createdOnUtc; - dynamic lastLoginDateUtc; - dynamic lastActivityDateUtc; - dynamic registeredInStoreId; - List roleIds; - - factory ReviewCustomer.fromJson(Map json) => ReviewCustomer( - fileNumber: json["file_number"], - iqamaNumber: json["iqama_number"], - isOutSa: json["is_out_sa"], - patientType: json["patient_type"], - gender: json["gender"], - birthDate: DateTime.parse(json["birth_date"]), - phone: json["phone"], - countryCode: json["country_code"], - yahalaAccountno: json["yahala_accountno"], - billingAddress: json["billing_address"], - shippingAddress: json["shipping_address"], - addresses: List.from(json["addresses"].map((x) => x)), - id: json["id"], - username: json["username"], - email: purpleEmailValues.map[json["email"]], - firstName: json["first_name"], - lastName: json["last_name"], - languageId: json["language_id"], - adminComment: json["admin_comment"], - isTaxExempt: json["is_tax_exempt"], - hasShoppingCartItems: json["has_shopping_cart_items"], - active: json["active"], - deleted: json["deleted"], - isSystemAccount: json["is_system_account"], - systemName: json["system_name"], - lastIpAddress: json["last_ip_address"], - createdOnUtc: json["created_on_utc"], - lastLoginDateUtc: json["last_login_date_utc"], - lastActivityDateUtc: json["last_activity_date_utc"], - registeredInStoreId: json["registered_in_store_id"], - roleIds: List.from(json["role_ids"].map((x) => x)), - ); - - Map toJson() => { - "file_number": fileNumber, - "iqama_number": iqamaNumber, - "is_out_sa": isOutSa, - "patient_type": patientType, - "gender": gender, - "birth_date": birthDate.toIso8601String(), - "phone": phone, - "country_code": countryCode, - "yahala_accountno": yahalaAccountno, - "billing_address": billingAddress, - "shipping_address": shippingAddress, - "addresses": List.from(addresses.map((x) => x)), - "id": id, - "username": username, - "email": purpleEmailValues.reverse[email], - "first_name": firstName, - "last_name": lastName, - "language_id": languageId, - "admin_comment": adminComment, - "is_tax_exempt": isTaxExempt, - "has_shopping_cart_items": hasShoppingCartItems, - "active": active, - "deleted": deleted, - "is_system_account": isSystemAccount, - "system_name": systemName, - "last_ip_address": lastIpAddress, - "created_on_utc": createdOnUtc, - "last_login_date_utc": lastLoginDateUtc, - "last_activity_date_utc": lastActivityDateUtc, - "registered_in_store_id": registeredInStoreId, - "role_ids": List.from(roleIds.map((x) => x)), - }; -} - -enum PurpleEmail { STEVE_GATES_NOP_COMMERCE_COM, TAMER_FANASHEH_DRSULAIMANALHABIB_COM, ASIF_RAZA_DRSULAIMANALHABIB_COM, ABOSAMI_YMAIL_COM } - -final purpleEmailValues = EnumValues({ - "abosami@ymail.com": PurpleEmail.ABOSAMI_YMAIL_COM, - "asif.raza@drsulaimanalhabib.com": PurpleEmail.ASIF_RAZA_DRSULAIMANALHABIB_COM, - "steve_gates@nopCommerce.com": PurpleEmail.STEVE_GATES_NOP_COMMERCE_COM, - "tamer.fanasheh@drsulaimanalhabib.com": PurpleEmail.TAMER_FANASHEH_DRSULAIMANALHABIB_COM -}); - -enum ReviewText { GOOD, NICE_PRICE, GREAT, REVIEW_TEXT_GOOD, GG, ENAD_TEST_REVIEW_001, ENAD, ENADDD, ENAD_TEST_0001, PURPLE_GOOD, EMPTY } - -final reviewTextValues = EnumValues({ - "افضل علاج للزكام": ReviewText.EMPTY, - "ENAD ": ReviewText.ENAD, - "enaddd": ReviewText.ENADDD, - "ENAD TEST 0001": ReviewText.ENAD_TEST_0001, - "Enad Test Review 001": ReviewText.ENAD_TEST_REVIEW_001, - "gg": ReviewText.GG, - "good ": ReviewText.GOOD, - "great": ReviewText.GREAT, - "nice price": ReviewText.NICE_PRICE, - "Good": ReviewText.PURPLE_GOOD, - "good": ReviewText.REVIEW_TEXT_GOOD -}); - -enum Title { EMPTY, GOOD, TITLE } - -final titleValues = EnumValues({ - "": Title.EMPTY, - "Good": Title.GOOD, - "ممتاز": Title.TITLE -}); - -enum OrderStatus { ORDER_SUBMITTED, PENDING, ORDER_IN_PROGRESS, ORDER_COMPLETED, CANCELLED, PROCESSING, ORDER_REFUNDED, COMPLETE } - -final orderStatusValues = EnumValues({ - "Cancelled": OrderStatus.CANCELLED, - "Complete": OrderStatus.COMPLETE, - "OrderCompleted": OrderStatus.ORDER_COMPLETED, - "OrderInProgress": OrderStatus.ORDER_IN_PROGRESS, - "OrderRefunded": OrderStatus.ORDER_REFUNDED, - "OrderSubmitted": OrderStatus.ORDER_SUBMITTED, - "Pending": OrderStatus.PENDING, - "Processing": OrderStatus.PROCESSING -}); - -enum OrderStatusn { ORDER_SUBMITTED, EMPTY, ORDER_IN_PROGRESS, ORDER_COMPLETED, ORDER_STATUSN, PURPLE, FLUFFY, TENTACLED } - -final orderStatusnValues = EnumValues({ - "معلقة": OrderStatusn.EMPTY, - "تم ارجاع مبلغ الطلبية المدفوع للعميل": OrderStatusn.FLUFFY, - "Order Completed": OrderStatusn.ORDER_COMPLETED, - "Order In Progress": OrderStatusn.ORDER_IN_PROGRESS, - "ملغي": OrderStatusn.ORDER_STATUSN, - "Order Submitted": OrderStatusn.ORDER_SUBMITTED, - "قيد التنفيذ": OrderStatusn.PURPLE, - "مكتمل": OrderStatusn.TENTACLED -}); - -enum PaymentMethodSystemName { PAYMENTS_PAY_FORT, PAYMENTS_CASH_ON_DELIVERY } - -final paymentMethodSystemNameValues = EnumValues({ - "Payments.CashOnDelivery": PaymentMethodSystemName.PAYMENTS_CASH_ON_DELIVERY, - "Payments.PayFort": PaymentMethodSystemName.PAYMENTS_PAY_FORT -}); - -enum PaymentName { CREDIT_DEBIT_CARD_PAYFORT, CASH_ON_DELIVERY_COD } - -final paymentNameValues = EnumValues({ - "Cash On Delivery (COD)": PaymentName.CASH_ON_DELIVERY_COD, - "Credit / Debit Card Payfort": PaymentName.CREDIT_DEBIT_CARD_PAYFORT -}); - -enum PaymentStatus { PAID, PENDING } - -final paymentStatusValues = EnumValues({ - "Paid": PaymentStatus.PAID, - "Pending": PaymentStatus.PENDING -}); - -enum PaymentStatusn { EMPTY, PAYMENT_STATUSN } - -final paymentStatusnValues = EnumValues({ - "تم الدفع": PaymentStatusn.EMPTY, - "قيد الإنتظار": PaymentStatusn.PAYMENT_STATUSN -}); - -enum PreferDeliveryTime { THE_1000_AM_330_PM, THE_530_PM_730_PM } - -final preferDeliveryTimeValues = EnumValues({ - "10:00 AM - 3:30 PM": PreferDeliveryTime.THE_1000_AM_330_PM, - "5:30 PM - 7:30 PM": PreferDeliveryTime.THE_530_PM_730_PM -}); - -enum PreferDeliveryTimen { THE_1000330, THE_530730 } - -final preferDeliveryTimenValues = EnumValues({ - "10:00 ص - 3:30 م": PreferDeliveryTimen.THE_1000330, - "5:30 م - 7:30 م": PreferDeliveryTimen.THE_530730 -}); - -enum ShippingMethod { EMPTY, FIXED_PRICE } - -final shippingMethodValues = EnumValues({ - "سعر ثابت ": ShippingMethod.EMPTY, - "Fixed Price": ShippingMethod.FIXED_PRICE -}); - -enum ShippingRateComputationMethodSystemName { SHIPPING_FIXED_OR_BY_WEIGHT } - -final shippingRateComputationMethodSystemNameValues = EnumValues({ - "Shipping.FixedOrByWeight": ShippingRateComputationMethodSystemName.SHIPPING_FIXED_OR_BY_WEIGHT -}); - -enum ShippingStatus { NOT_YET_SHIPPED } - -final shippingStatusValues = EnumValues({ - "NotYetShipped": ShippingStatus.NOT_YET_SHIPPED -}); - -enum ShippingStatusn { EMPTY } - -final shippingStatusnValues = EnumValues({ - "لم يتم شحنها بعد": ShippingStatusn.EMPTY -}); - -class EnumValues { - Map map; - Map reverseMap; - - EnumValues(this.map); - - Map get reverse { - if (reverseMap == null) { - reverseMap = map.map((k, v) => new MapEntry(v, k)); - } - return reverseMap; - } -} - - - diff --git a/lib/core/model/pharmacies/payment-checkout-data.dart b/lib/core/model/pharmacies/payment-checkout-data.dart deleted file mode 100644 index dd9e0e54..00000000 --- a/lib/core/model/pharmacies/payment-checkout-data.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:flutter/material.dart'; - -import 'ShippingOption.dart'; - -class PaymentCheckoutData with ChangeNotifier{ - Addresses address; - PaymentOption paymentOption; - LacumAccountInformation lacumInformation; - bool cartDataVisible; - ShippingOption shippingOption; - int usedLakumPoints; - - PaymentCheckoutData({this.address, this.paymentOption, this.lacumInformation, this.cartDataVisible = false, this.shippingOption, this.usedLakumPoints = 0}); - - void updateData() { - notifyListeners(); - } -} diff --git a/lib/core/model/pharmacy/brands_model.dart b/lib/core/model/pharmacy/brands_model.dart deleted file mode 100644 index 03cd689e..00000000 --- a/lib/core/model/pharmacy/brands_model.dart +++ /dev/null @@ -1,24 +0,0 @@ -class BrandsModel { - String id; - String name; - String namen; - Null image; - - BrandsModel({this.id, this.name, this.namen, this.image}); - - BrandsModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - namen = json['namen']; - image = json['image']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - data['image'] = this.image; - return data; - } -} diff --git a/lib/core/model/pharmacy/categorise_parent_model.dart b/lib/core/model/pharmacy/categorise_parent_model.dart deleted file mode 100644 index 82c5b55f..00000000 --- a/lib/core/model/pharmacy/categorise_parent_model.dart +++ /dev/null @@ -1,75 +0,0 @@ -class CategoriseParentModel { - String id; - String name; - String namen; - List localizedNames; - dynamic description; - int parentCategoryId; - int displayOrder; - dynamic image; - bool isLeaf; - - CategoriseParentModel( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.description, - this.parentCategoryId, - this.displayOrder, - this.image, - this.isLeaf}); - - CategoriseParentModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - description = json['description']; - parentCategoryId = json['parent_category_id']; - displayOrder = json['display_order']; - image = json['image']; - isLeaf = json['is_leaf']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['description'] = this.description; - data['parent_category_id'] = this.parentCategoryId; - data['display_order'] = this.displayOrder; - data['image'] = this.image; - data['is_leaf'] = this.isLeaf; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} diff --git a/lib/core/model/pharmacy/final_products_model.dart b/lib/core/model/pharmacy/final_products_model.dart deleted file mode 100644 index 52ab1d2d..00000000 --- a/lib/core/model/pharmacy/final_products_model.dart +++ /dev/null @@ -1,184 +0,0 @@ -class FinalProductsModel { - String id; - String name; - String namen; - List localizedNames; - String shortDescription; - String fullDescription; - String fullDescriptionn; - dynamic approvedRatingSum; - dynamic approvedTotalReviews; - String sku; - bool isRx; - dynamic rxMessage; - dynamic rxMessagen; - dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic price; - dynamic oldPrice; - dynamic discountName; - dynamic discountNamen; - dynamic discountPercentage; - dynamic displayOrder; - List discountIds; - List reviews; - List images; - - FinalProductsModel( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.fullDescription, - this.fullDescriptionn, - this.approvedRatingSum, - this.approvedTotalReviews, - this.sku, - this.isRx, - this.rxMessage, - this.rxMessagen, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.price, - this.oldPrice, - this.discountName, - this.discountNamen, - this.discountPercentage, - this.displayOrder, - this.discountIds, - this.reviews, - this.images}); - - FinalProductsModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - approvedRatingSum = json['approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - price = json['price']; - oldPrice = json['old_price']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountPercentage = json['discount_percentage']; - displayOrder = json['display_order']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['approved_rating_sum'] = this.approvedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_percentage'] = this.discountPercentage; - data['display_order'] = this.displayOrder; - - if (this.images != null) { - data['images'] = this.images.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} diff --git a/lib/core/model/pharmacy/offer_products_model.dart b/lib/core/model/pharmacy/offer_products_model.dart deleted file mode 100644 index f41b731b..00000000 --- a/lib/core/model/pharmacy/offer_products_model.dart +++ /dev/null @@ -1,579 +0,0 @@ -class OfferProductsModel { - String id; - bool visibleIndividually; - String name; - String namen; - List localizedNames; - String shortDescription; - String shortDescriptionn; - String fullDescription; - String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - dynamic metaKeywords; - dynamic metaDescription; - dynamic metaTitle; - bool allowCustomerReviews; - dynamic approvedRatingSum; - dynamic notApprovedRatingSum; - dynamic approvedTotalReviews; - dynamic notApprovedTotalReviews; - String sku; - bool isRx; - bool prescriptionRequired; - dynamic rxMessage; - dynamic rxMessagen; - dynamic manufacturerPartNumber; - dynamic gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; - dynamic maxNumberOfDownloads; - dynamic downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; - dynamic recurringCycleLength; - dynamic recurringTotalCycles; - bool isRental; - dynamic rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; - dynamic additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; - dynamic manageInventoryMethodId; - dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; - dynamic minStockQuantity; - dynamic notifyAdminForQuantityBelow; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; - dynamic preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; - dynamic price; - dynamic oldPrice; - dynamic productCost; - dynamic specialPrice; - dynamic specialPriceStartDateTimeUtc; - dynamic specialPriceEndDateTimeUtc; - bool customerEntersPrice; - dynamic minimumCustomerEnteredPrice; - dynamic maximumCustomerEnteredPrice; - bool basepriceEnabled; - dynamic basepriceAmount; - dynamic basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; - String discountName; - String discountNamen; - String discountDescription; - String discountDescriptionn; - dynamic discountPercentage; - String currency; - String currencyn; - dynamic weight; - dynamic length; - dynamic width; - dynamic height; - dynamic availableStartDateTimeUtc; - dynamic availableEndDateTimeUtc; - dynamic displayOrder; - bool published; - bool deleted; - String createdOnUtc; - String updatedOnUtc; - String productType; - dynamic parentGroupedProductId; - List roleIds; - List discountIds; - List storeIds; - List manufacturerIds; - List reviews; - List images; - List attributes; - List specifications; - List associatedProductIds; - List tags; - dynamic vendorId; - String seName; - - OfferProductsModel( - {this.id, - this.visibleIndividually, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.shortDescriptionn, - this.fullDescription, - this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, - this.approvedRatingSum, - this.notApprovedRatingSum, - this.approvedTotalReviews, - this.notApprovedTotalReviews, - this.sku, - this.isRx, - this.prescriptionRequired, - this.rxMessage, - this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, - this.price, - this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, - this.discountName, - this.discountNamen, - this.discountDescription, - this.discountDescriptionn, - this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, - this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, - this.discountIds, - this.storeIds, - this.manufacturerIds, - this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName}); - - OfferProductsModel.fromJson(Map json) { - id = json['id']; - visibleIndividually = json['visible_individually']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - shortDescriptionn = json['short_descriptionn']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - markasNew = json['markas_new']; - showOnHomePage = json['show_on_home_page']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - allowCustomerReviews = json['allow_customer_reviews']; - approvedRatingSum = json['approved_rating_sum']; - notApprovedRatingSum = json['not_approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - notApprovedTotalReviews = json['not_approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - prescriptionRequired = json['prescription_required']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - manufacturerPartNumber = json['manufacturer_part_number']; - gtin = json['gtin']; - isGiftCard = json['is_gift_card']; - requireOtherProducts = json['require_other_products']; - automaticallyAddRequiredProducts = - json['automatically_add_required_products']; - isDownload = json['is_download']; - unlimitedDownloads = json['unlimited_downloads']; - maxNumberOfDownloads = json['max_number_of_downloads']; - downloadExpirationDays = json['download_expiration_days']; - hasSampleDownload = json['has_sample_download']; - hasUserAgreement = json['has_user_agreement']; - isRecurring = json['is_recurring']; - recurringCycleLength = json['recurring_cycle_length']; - recurringTotalCycles = json['recurring_total_cycles']; - isRental = json['is_rental']; - rentalPriceLength = json['rental_price_length']; - isShipEnabled = json['is_ship_enabled']; - isFreeShipping = json['is_free_shipping']; - shipSeparately = json['ship_separately']; - additionalShippingCharge = json['additional_shipping_charge']; - isTaxExempt = json['is_tax_exempt']; - isTelecommunicationsOrBroadcastingOrElectronicServices = - json['is_telecommunications_or_broadcasting_or_electronic_services']; - useMultipleWarehouses = json['use_multiple_warehouses']; - manageInventoryMethodId = json['manage_inventory_method_id']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - displayStockAvailability = json['display_stock_availability']; - displayStockQuantity = json['display_stock_quantity']; - minStockQuantity = json['min_stock_quantity']; - notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - allowedQuantities = json['allowed_quantities']; - allowAddingOnlyExistingAttributeCombinations = - json['allow_adding_only_existing_attribute_combinations']; - disableBuyButton = json['disable_buy_button']; - disableWishlistButton = json['disable_wishlist_button']; - availableForPreOrder = json['available_for_pre_order']; - preOrderAvailabilityStartDateTimeUtc = - json['pre_order_availability_start_date_time_utc']; - callForPrice = json['call_for_price']; - price = json['price']; - oldPrice = json['old_price']; - productCost = json['product_cost']; - specialPrice = json['special_price']; - specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; - specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; - customerEntersPrice = json['customer_enters_price']; - minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; - maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; - basepriceEnabled = json['baseprice_enabled']; - basepriceAmount = json['baseprice_amount']; - basepriceBaseAmount = json['baseprice_base_amount']; - hasTierPrices = json['has_tier_prices']; - hasDiscountsApplied = json['has_discounts_applied']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountDescription = json['discount_description']; - discountDescriptionn = json['discount_Descriptionn']; - discountPercentage = json['discount_percentage']; - currency = json['currency']; - currencyn = json['currencyn']; - weight = json['weight']; - length = json['length']; - width = json['width']; - height = json['height']; - availableStartDateTimeUtc = json['available_start_date_time_utc']; - availableEndDateTimeUtc = json['available_end_date_time_utc']; - displayOrder = json['display_order']; - published = json['published']; - deleted = json['deleted']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - productType = json['product_type']; - parentGroupedProductId = json['parent_grouped_product_id']; - - discountIds = json['discount_ids'].cast(); - - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - - vendorId = json['vendor_id']; - seName = json['se_name']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['visible_individually'] = this.visibleIndividually; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['short_descriptionn'] = this.shortDescriptionn; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['markas_new'] = this.markasNew; - data['show_on_home_page'] = this.showOnHomePage; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['allow_customer_reviews'] = this.allowCustomerReviews; - data['approved_rating_sum'] = this.approvedRatingSum; - data['not_approved_rating_sum'] = this.notApprovedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['not_approved_total_reviews'] = this.notApprovedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['prescription_required'] = this.prescriptionRequired; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['manufacturer_part_number'] = this.manufacturerPartNumber; - data['gtin'] = this.gtin; - data['is_gift_card'] = this.isGiftCard; - data['require_other_products'] = this.requireOtherProducts; - data['automatically_add_required_products'] = - this.automaticallyAddRequiredProducts; - data['is_download'] = this.isDownload; - data['unlimited_downloads'] = this.unlimitedDownloads; - data['max_number_of_downloads'] = this.maxNumberOfDownloads; - data['download_expiration_days'] = this.downloadExpirationDays; - data['has_sample_download'] = this.hasSampleDownload; - data['has_user_agreement'] = this.hasUserAgreement; - data['is_recurring'] = this.isRecurring; - data['recurring_cycle_length'] = this.recurringCycleLength; - data['recurring_total_cycles'] = this.recurringTotalCycles; - data['is_rental'] = this.isRental; - data['rental_price_length'] = this.rentalPriceLength; - data['is_ship_enabled'] = this.isShipEnabled; - data['is_free_shipping'] = this.isFreeShipping; - data['ship_separately'] = this.shipSeparately; - data['additional_shipping_charge'] = this.additionalShippingCharge; - data['is_tax_exempt'] = this.isTaxExempt; - data['is_telecommunications_or_broadcasting_or_electronic_services'] = - this.isTelecommunicationsOrBroadcastingOrElectronicServices; - data['use_multiple_warehouses'] = this.useMultipleWarehouses; - data['manage_inventory_method_id'] = this.manageInventoryMethodId; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['display_stock_availability'] = this.displayStockAvailability; - data['display_stock_quantity'] = this.displayStockQuantity; - data['min_stock_quantity'] = this.minStockQuantity; - data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['allowed_quantities'] = this.allowedQuantities; - data['allow_adding_only_existing_attribute_combinations'] = - this.allowAddingOnlyExistingAttributeCombinations; - data['disable_buy_button'] = this.disableBuyButton; - data['disable_wishlist_button'] = this.disableWishlistButton; - data['available_for_pre_order'] = this.availableForPreOrder; - data['pre_order_availability_start_date_time_utc'] = - this.preOrderAvailabilityStartDateTimeUtc; - data['call_for_price'] = this.callForPrice; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['product_cost'] = this.productCost; - data['special_price'] = this.specialPrice; - data['special_price_start_date_time_utc'] = - this.specialPriceStartDateTimeUtc; - data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; - data['customer_enters_price'] = this.customerEntersPrice; - data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; - data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; - data['baseprice_enabled'] = this.basepriceEnabled; - data['baseprice_amount'] = this.basepriceAmount; - data['baseprice_base_amount'] = this.basepriceBaseAmount; - data['has_tier_prices'] = this.hasTierPrices; - data['has_discounts_applied'] = this.hasDiscountsApplied; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_description'] = this.discountDescription; - data['discount_Descriptionn'] = this.discountDescriptionn; - data['discount_percentage'] = this.discountPercentage; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['weight'] = this.weight; - data['length'] = this.length; - data['width'] = this.width; - data['height'] = this.height; - data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; - data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; - data['display_order'] = this.displayOrder; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['product_type'] = this.productType; - data['parent_grouped_product_id'] = this.parentGroupedProductId; - if (this.roleIds != null) { - data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); - } - data['discount_ids'] = this.discountIds; - if (this.storeIds != null) { - data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); - } - if (this.manufacturerIds != null) { - data['manufacturer_ids'] = - this.manufacturerIds.map((v) => v.toJson()).toList(); - } - if (this.reviews != null) { - data['reviews'] = this.reviews.map((v) => v.toJson()).toList(); - } - if (this.images != null) { - data['images'] = this.images.map((v) => v.toJson()).toList(); - } - if (this.attributes != null) { - data['attributes'] = this.attributes.map((v) => v.toJson()).toList(); - } - if (this.specifications != null) { - data['specifications'] = - this.specifications.map((v) => v.toJson()).toList(); - } - if (this.associatedProductIds != null) { - data['associated_product_ids'] = - this.associatedProductIds.map((v) => v.toJson()).toList(); - } - if (this.tags != null) { - data['tags'] = this.tags.map((v) => v.toJson()).toList(); - } - data['vendor_id'] = this.vendorId; - data['se_name'] = this.seName; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} - -class Specifications { - int id; - int displayOrder; - String defaultValue; - String defaultValuen; - String name; - String nameN; - - Specifications( - {this.id, - this.displayOrder, - this.defaultValue, - this.defaultValuen, - this.name, - this.nameN}); - - Specifications.fromJson(Map json) { - id = json['id']; - displayOrder = json['display_order']; - defaultValue = json['default_value']; - defaultValuen = json['default_valuen']; - name = json['name']; - nameN = json['nameN']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['display_order'] = this.displayOrder; - data['default_value'] = this.defaultValue; - data['default_valuen'] = this.defaultValuen; - data['name'] = this.name; - data['nameN'] = this.nameN; - return data; - } -} diff --git a/lib/core/model/pharmacy/offers_model.dart b/lib/core/model/pharmacy/offers_model.dart deleted file mode 100644 index 3add1d3d..00000000 --- a/lib/core/model/pharmacy/offers_model.dart +++ /dev/null @@ -1,175 +0,0 @@ -class OffersModel { - String id; - String name; - String namen; - List localizedNames; - Null description; - int categoryTemplateId; - String metaKeywords; - String metaDescription; - String metaTitle; - int parentCategoryId; - int pageSize; - String pageSizeOptions; - Null priceRanges; - bool showOnHomePage; - bool includeInTopMenu; - Null hasDiscountsApplied; - bool published; - bool deleted; - int displayOrder; - String createdOnUtc; - String updatedOnUtc; - List roleIds; - List discountIds; - List storeIds; - Image image; - String seName; - bool isLeaf; - - OffersModel( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.description, - this.categoryTemplateId, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.parentCategoryId, - this.pageSize, - this.pageSizeOptions, - this.priceRanges, - this.showOnHomePage, - this.includeInTopMenu, - this.hasDiscountsApplied, - this.published, - this.deleted, - this.displayOrder, - this.createdOnUtc, - this.updatedOnUtc, - this.roleIds, - this.discountIds, - this.storeIds, - this.image, - this.seName, - this.isLeaf}); - - OffersModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - description = json['description']; - categoryTemplateId = json['category_template_id']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - parentCategoryId = json['parent_category_id']; - pageSize = json['page_size']; - pageSizeOptions = json['page_size_options']; - priceRanges = json['price_ranges']; - showOnHomePage = json['show_on_home_page']; - includeInTopMenu = json['include_in_top_menu']; - hasDiscountsApplied = json['has_discounts_applied']; - published = json['published']; - deleted = json['deleted']; - displayOrder = json['display_order']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - - image = json['image'] != null ? new Image.fromJson(json['image']) : null; - seName = json['se_name']; - isLeaf = json['is_leaf']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['description'] = this.description; - data['category_template_id'] = this.categoryTemplateId; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['parent_category_id'] = this.parentCategoryId; - data['page_size'] = this.pageSize; - data['page_size_options'] = this.pageSizeOptions; - data['price_ranges'] = this.priceRanges; - data['show_on_home_page'] = this.showOnHomePage; - data['include_in_top_menu'] = this.includeInTopMenu; - data['has_discounts_applied'] = this.hasDiscountsApplied; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['display_order'] = this.displayOrder; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - if (this.roleIds != null) { - data['role_ids'] = this.roleIds.map((v) => v.toJson()).toList(); - } - if (this.discountIds != null) { - data['discount_ids'] = this.discountIds.map((v) => v.toJson()).toList(); - } - if (this.storeIds != null) { - data['store_ids'] = this.storeIds.map((v) => v.toJson()).toList(); - } - if (this.image != null) { - data['image'] = this.image.toJson(); - } - data['se_name'] = this.seName; - data['is_leaf'] = this.isLeaf; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Image { - String src; - Null thumb; - Null attachment; - - Image({this.src, this.thumb, this.attachment}); - - Image.fromJson(Map json) { - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} diff --git a/lib/core/model/pharmacy/parent_products_model.dart b/lib/core/model/pharmacy/parent_products_model.dart deleted file mode 100644 index e962c290..00000000 --- a/lib/core/model/pharmacy/parent_products_model.dart +++ /dev/null @@ -1,566 +0,0 @@ -class ParentProductsModel { - dynamic id; - dynamic visibleIndividually; - dynamic name; - dynamic namen; - List localizedNames; - dynamic shortDescription; - dynamic shortDescriptionn; - dynamic fullDescription; - dynamic fullDescriptionn; - dynamic markasNew; - dynamic showOnHomePage; - dynamic metaKeywords; - dynamic metaDescription; - dynamic metaTitle; - dynamic allowCustomerReviews; - dynamic approvedRatingSum; - dynamic notApprovedRatingSum; - dynamic approvedTotalReviews; - dynamic notApprovedTotalReviews; - dynamic sku; - dynamic isRx; - dynamic prescriptionRequired; - dynamic rxMessage; - dynamic rxMessagen; - dynamic manufacturerPartNumber; - dynamic gtin; - dynamic isGiftCard; - dynamic requireOtherProducts; - dynamic automaticallyAddRequiredProducts; - dynamic isDownload; - dynamic unlimitedDownloads; - dynamic maxNumberOfDownloads; - dynamic downloadExpirationDays; - dynamic hasSampleDownload; - dynamic hasUserAgreement; - dynamic isRecurring; - dynamic recurringCycleLength; - dynamic recurringTotalCycles; - dynamic isRental; - dynamic rentalPriceLength; - dynamic isShipEnabled; - dynamic isFreeShipping; - dynamic shipSeparately; - dynamic additionalShippingCharge; - dynamic isTaxExempt; - dynamic isTelecommunicationsOrBroadcastingOrElectronicServices; - dynamic useMultipleWarehouses; - dynamic manageInventoryMethodId; - dynamic stockQuantity; - dynamic stockAvailability; - dynamic stockAvailabilityn; - dynamic displayStockAvailability; - dynamic displayStockQuantity; - dynamic minStockQuantity; - dynamic notifyAdminForQuantityBelow; - dynamic allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic allowedQuantities; - dynamic allowAddingOnlyExistingAttributeCombinations; - dynamic disableBuyButton; - dynamic disableWishlistButton; - dynamic availableForPreOrder; - dynamic preOrderAvailabilityStartDateTimeUtc; - dynamic callForPrice; - dynamic price; - dynamic oldPrice; - dynamic productCost; - dynamic specialPrice; - dynamic specialPriceStartDateTimeUtc; - dynamic specialPriceEndDateTimeUtc; - dynamic customerEntersPrice; - dynamic minimumCustomerEnteredPrice; - dynamic maximumCustomerEnteredPrice; - dynamic basepriceEnabled; - dynamic basepriceAmount; - dynamic basepriceBaseAmount; - dynamic hasTierPrices; - dynamic hasDiscountsApplied; - dynamic discountName; - dynamic discountNamen; - dynamic discountDescription; - dynamic discountDescriptionn; - dynamic discountPercentage; - dynamic currency; - dynamic currencyn; - dynamic weight; - dynamic length; - dynamic width; - dynamic height; - dynamic availableStartDateTimeUtc; - dynamic availableEndDateTimeUtc; - dynamic displayOrder; - dynamic published; - dynamic deleted; - dynamic createdOnUtc; - dynamic updatedOnUtc; - dynamic productType; - dynamic parentGroupedProductId; - List roleIds; - List discountIds; - List storeIds; - List manufacturerIds; - List reviews; - List images; - List attributes; - List specifications; - List associatedProductIds; - List tags; - dynamic vendorId; - String seName; - - ParentProductsModel( - {this.id, - this.visibleIndividually, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.shortDescriptionn, - this.fullDescription, - this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, - this.approvedRatingSum, - this.notApprovedRatingSum, - this.approvedTotalReviews, - this.notApprovedTotalReviews, - this.sku, - this.isRx, - this.prescriptionRequired, - this.rxMessage, - this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, - this.price, - this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, - this.discountName, - this.discountNamen, - this.discountDescription, - this.discountDescriptionn, - this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, - this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, - this.discountIds, - this.storeIds, - this.manufacturerIds, - this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName}); - - ParentProductsModel.fromJson(Map json) { - id = json['id']; - visibleIndividually = json['visible_individually']; - name = json['name']; - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - shortDescriptionn = json['short_descriptionn']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - markasNew = json['markas_new']; - showOnHomePage = json['show_on_home_page']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - allowCustomerReviews = json['allow_customer_reviews']; - approvedRatingSum = json['approved_rating_sum']; - notApprovedRatingSum = json['not_approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - notApprovedTotalReviews = json['not_approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - prescriptionRequired = json['prescription_required']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - manufacturerPartNumber = json['manufacturer_part_number']; - gtin = json['gtin']; - isGiftCard = json['is_gift_card']; - requireOtherProducts = json['require_other_products']; - automaticallyAddRequiredProducts = - json['automatically_add_required_products']; - isDownload = json['is_download']; - unlimitedDownloads = json['unlimited_downloads']; - maxNumberOfDownloads = json['max_number_of_downloads']; - downloadExpirationDays = json['download_expiration_days']; - hasSampleDownload = json['has_sample_download']; - hasUserAgreement = json['has_user_agreement']; - isRecurring = json['is_recurring']; - recurringCycleLength = json['recurring_cycle_length']; - recurringTotalCycles = json['recurring_total_cycles']; - isRental = json['is_rental']; - rentalPriceLength = json['rental_price_length']; - isShipEnabled = json['is_ship_enabled']; - isFreeShipping = json['is_free_shipping']; - shipSeparately = json['ship_separately']; - additionalShippingCharge = json['additional_shipping_charge']; - isTaxExempt = json['is_tax_exempt']; - isTelecommunicationsOrBroadcastingOrElectronicServices = - json['is_telecommunications_or_broadcasting_or_electronic_services']; - useMultipleWarehouses = json['use_multiple_warehouses']; - manageInventoryMethodId = json['manage_inventory_method_id']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - displayStockAvailability = json['display_stock_availability']; - displayStockQuantity = json['display_stock_quantity']; - minStockQuantity = json['min_stock_quantity']; - notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - allowedQuantities = json['allowed_quantities']; - allowAddingOnlyExistingAttributeCombinations = - json['allow_adding_only_existing_attribute_combinations']; - disableBuyButton = json['disable_buy_button']; - disableWishlistButton = json['disable_wishlist_button']; - availableForPreOrder = json['available_for_pre_order']; - preOrderAvailabilityStartDateTimeUtc = - json['pre_order_availability_start_date_time_utc']; - callForPrice = json['call_for_price']; - price = json['price']; - oldPrice = json['old_price']; - productCost = json['product_cost']; - specialPrice = json['special_price']; - specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; - specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; - customerEntersPrice = json['customer_enters_price']; - minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; - maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; - basepriceEnabled = json['baseprice_enabled']; - basepriceAmount = json['baseprice_amount']; - basepriceBaseAmount = json['baseprice_base_amount']; - hasTierPrices = json['has_tier_prices']; - hasDiscountsApplied = json['has_discounts_applied']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountDescription = json['discount_description']; - discountDescriptionn = json['discount_Descriptionn']; - discountPercentage = json['discount_percentage']; - currency = json['currency']; - currencyn = json['currencyn']; - weight = json['weight']; - length = json['length']; - width = json['width']; - height = json['height']; - availableStartDateTimeUtc = json['available_start_date_time_utc']; - availableEndDateTimeUtc = json['available_end_date_time_utc']; - displayOrder = json['display_order']; - published = json['published']; - deleted = json['deleted']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - productType = json['product_type']; - parentGroupedProductId = json['parent_grouped_product_id']; - - manufacturerIds = json['manufacturer_ids'].cast(); - - if (json['specifications'] != null) { - specifications = new List(); - json['specifications'].forEach((v) { - specifications.add(new Specifications.fromJson(v)); - }); - } - - vendorId = json['vendor_id']; - seName = json['se_name']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['visible_individually'] = this.visibleIndividually; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['short_descriptionn'] = this.shortDescriptionn; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['markas_new'] = this.markasNew; - data['show_on_home_page'] = this.showOnHomePage; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['allow_customer_reviews'] = this.allowCustomerReviews; - data['approved_rating_sum'] = this.approvedRatingSum; - data['not_approved_rating_sum'] = this.notApprovedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['not_approved_total_reviews'] = this.notApprovedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['prescription_required'] = this.prescriptionRequired; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['manufacturer_part_number'] = this.manufacturerPartNumber; - data['gtin'] = this.gtin; - data['is_gift_card'] = this.isGiftCard; - data['require_other_products'] = this.requireOtherProducts; - data['automatically_add_required_products'] = - this.automaticallyAddRequiredProducts; - data['is_download'] = this.isDownload; - data['unlimited_downloads'] = this.unlimitedDownloads; - data['max_number_of_downloads'] = this.maxNumberOfDownloads; - data['download_expiration_days'] = this.downloadExpirationDays; - data['has_sample_download'] = this.hasSampleDownload; - data['has_user_agreement'] = this.hasUserAgreement; - data['is_recurring'] = this.isRecurring; - data['recurring_cycle_length'] = this.recurringCycleLength; - data['recurring_total_cycles'] = this.recurringTotalCycles; - data['is_rental'] = this.isRental; - data['rental_price_length'] = this.rentalPriceLength; - data['is_ship_enabled'] = this.isShipEnabled; - data['is_free_shipping'] = this.isFreeShipping; - data['ship_separately'] = this.shipSeparately; - data['additional_shipping_charge'] = this.additionalShippingCharge; - data['is_tax_exempt'] = this.isTaxExempt; - data['is_telecommunications_or_broadcasting_or_electronic_services'] = - this.isTelecommunicationsOrBroadcastingOrElectronicServices; - data['use_multiple_warehouses'] = this.useMultipleWarehouses; - data['manage_inventory_method_id'] = this.manageInventoryMethodId; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['display_stock_availability'] = this.displayStockAvailability; - data['display_stock_quantity'] = this.displayStockQuantity; - data['min_stock_quantity'] = this.minStockQuantity; - data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['allowed_quantities'] = this.allowedQuantities; - data['allow_adding_only_existing_attribute_combinations'] = - this.allowAddingOnlyExistingAttributeCombinations; - data['disable_buy_button'] = this.disableBuyButton; - data['disable_wishlist_button'] = this.disableWishlistButton; - data['available_for_pre_order'] = this.availableForPreOrder; - data['pre_order_availability_start_date_time_utc'] = - this.preOrderAvailabilityStartDateTimeUtc; - data['call_for_price'] = this.callForPrice; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['product_cost'] = this.productCost; - data['special_price'] = this.specialPrice; - data['special_price_start_date_time_utc'] = - this.specialPriceStartDateTimeUtc; - data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; - data['customer_enters_price'] = this.customerEntersPrice; - data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; - data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; - data['baseprice_enabled'] = this.basepriceEnabled; - data['baseprice_amount'] = this.basepriceAmount; - data['baseprice_base_amount'] = this.basepriceBaseAmount; - data['has_tier_prices'] = this.hasTierPrices; - data['has_discounts_applied'] = this.hasDiscountsApplied; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_description'] = this.discountDescription; - data['discount_Descriptionn'] = this.discountDescriptionn; - data['discount_percentage'] = this.discountPercentage; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['weight'] = this.weight; - data['length'] = this.length; - data['width'] = this.width; - data['height'] = this.height; - data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; - data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; - data['display_order'] = this.displayOrder; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['product_type'] = this.productType; - data['parent_grouped_product_id'] = this.parentGroupedProductId; - - data['manufacturer_ids'] = this.manufacturerIds; - - if (this.images != null) { - data['images'] = this.images.map((v) => v.toJson()).toList(); - } - - if (this.specifications != null) { - data['specifications'] = - this.specifications.map((v) => v.toJson()).toList(); - } - - data['vendor_id'] = this.vendorId; - data['se_name'] = this.seName; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} - -class Specifications { - int id; - int displayOrder; - String defaultValue; - String defaultValuen; - String name; - String nameN; - - Specifications( - {this.id, - this.displayOrder, - this.defaultValue, - this.defaultValuen, - this.name, - this.nameN}); - - Specifications.fromJson(Map json) { - id = json['id']; - displayOrder = json['display_order']; - defaultValue = json['default_value']; - defaultValuen = json['default_valuen']; - name = json['name']; - nameN = json['nameN']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['display_order'] = this.displayOrder; - data['default_value'] = this.defaultValue; - data['default_valuen'] = this.defaultValuen; - data['name'] = this.name; - data['nameN'] = this.nameN; - return data; - } -} diff --git a/lib/core/model/pharmacy/pharmacy_categorise.dart b/lib/core/model/pharmacy/pharmacy_categorise.dart deleted file mode 100644 index 33ac26f1..00000000 --- a/lib/core/model/pharmacy/pharmacy_categorise.dart +++ /dev/null @@ -1,103 +0,0 @@ -class PharmacyCategorise { - dynamic id; - String name; - dynamic namen; - List localizedNames; - dynamic description; - dynamic parentCategoryId; - dynamic displayOrder; - dynamic image; - dynamic isLeaf; - - PharmacyCategorise( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.description, - this.parentCategoryId, - this.displayOrder, - this.image, - this.isLeaf}); - - PharmacyCategorise.fromJson(Map json) { - try { - id = json['id']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - description = json['description']; - parentCategoryId = json['parent_category_id']; - displayOrder = json['display_order']; - image = json['image'] != null ? new Image.fromJson(json['image']) : null; - isLeaf = json['is_leaf']; - } catch (e) { - print(e); - } - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['description'] = this.description; - data['parent_category_id'] = this.parentCategoryId; - data['display_order'] = this.displayOrder; - if (this.image != null) { - data['image'] = this.image.toJson(); - } - data['is_leaf'] = this.isLeaf; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Image { - String src; - Null thumb; - Null attachment; - - Image({this.src, this.thumb, this.attachment}); - - Image.fromJson(Map json) { - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} diff --git a/lib/core/model/pharmacy/scan_qr_model.dart b/lib/core/model/pharmacy/scan_qr_model.dart deleted file mode 100644 index 71e25e8d..00000000 --- a/lib/core/model/pharmacy/scan_qr_model.dart +++ /dev/null @@ -1,584 +0,0 @@ -class ScanQrModel { - String id; - bool visibleIndividually; - String name; - String namen; - List localizedNames; - String shortDescription; - String shortDescriptionn; - String fullDescription; - String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - dynamic metaKeywords; - dynamic metaDescription; - dynamic metaTitle; - bool allowCustomerReviews; - dynamic approvedRatingSum; - dynamic notApprovedRatingSum; - dynamic approvedTotalReviews; - dynamic notApprovedTotalReviews; - String sku; - bool isRx; - bool prescriptionRequired; - dynamic rxMessage; - dynamic rxMessagen; - dynamic manufacturerPartNumber; - dynamic gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; - dynamic maxNumberOfDownloads; - dynamic downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; - dynamic recurringCycleLength; - dynamic recurringTotalCycles; - bool isRental; - dynamic rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; - dynamic additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; - dynamic manageInventoryMethodId; - dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; - dynamic minStockQuantity; - dynamic notifyAdminForQuantityBelow; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; - dynamic preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; - dynamic price; - dynamic oldPrice; - dynamic productCost; - dynamic specialPrice; - dynamic specialPriceStartDateTimeUtc; - dynamic specialPriceEndDateTimeUtc; - bool customerEntersPrice; - dynamic minimumCustomerEnteredPrice; - dynamic maximumCustomerEnteredPrice; - bool basepriceEnabled; - dynamic basepriceAmount; - dynamic basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; - dynamic discountName; - dynamic discountNamen; - dynamic discountDescription; - dynamic discountDescriptionn; - dynamic discountPercentage; - String currency; - String currencyn; - double weight; - dynamic length; - dynamic width; - dynamic height; - dynamic availableStartDateTimeUtc; - dynamic availableEndDateTimeUtc; - dynamic displayOrder; - bool published; - bool deleted; - String createdOnUtc; - String updatedOnUtc; - String productType; - dynamic parentGroupedProductId; - List roleIds; - List discountIds; - List storeIds; - List manufacturerIds; - List reviews; - List images; - List attributes; - List specifications; - List associatedProductIds; - List tags; - dynamic vendorId; - String seName; - - ScanQrModel( - {this.id, - this.visibleIndividually, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.shortDescriptionn, - this.fullDescription, - this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, - this.approvedRatingSum, - this.notApprovedRatingSum, - this.approvedTotalReviews, - this.notApprovedTotalReviews, - this.sku, - this.isRx, - this.prescriptionRequired, - this.rxMessage, - this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, - this.price, - this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, - this.discountName, - this.discountNamen, - this.discountDescription, - this.discountDescriptionn, - this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, - this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, - this.discountIds, - this.storeIds, - this.manufacturerIds, - this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName}); - - ScanQrModel.fromJson(Map json) { - id = json['id']; - visibleIndividually = json['visible_individually']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - shortDescriptionn = json['short_descriptionn']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - markasNew = json['markas_new']; - showOnHomePage = json['show_on_home_page']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - allowCustomerReviews = json['allow_customer_reviews']; - approvedRatingSum = json['approved_rating_sum']; - notApprovedRatingSum = json['not_approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - notApprovedTotalReviews = json['not_approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - prescriptionRequired = json['prescription_required']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - manufacturerPartNumber = json['manufacturer_part_number']; - gtin = json['gtin']; - isGiftCard = json['is_gift_card']; - requireOtherProducts = json['require_other_products']; - automaticallyAddRequiredProducts = - json['automatically_add_required_products']; - isDownload = json['is_download']; - unlimitedDownloads = json['unlimited_downloads']; - maxNumberOfDownloads = json['max_number_of_downloads']; - downloadExpirationDays = json['download_expiration_days']; - hasSampleDownload = json['has_sample_download']; - hasUserAgreement = json['has_user_agreement']; - isRecurring = json['is_recurring']; - recurringCycleLength = json['recurring_cycle_length']; - recurringTotalCycles = json['recurring_total_cycles']; - isRental = json['is_rental']; - rentalPriceLength = json['rental_price_length']; - isShipEnabled = json['is_ship_enabled']; - isFreeShipping = json['is_free_shipping']; - shipSeparately = json['ship_separately']; - additionalShippingCharge = json['additional_shipping_charge']; - isTaxExempt = json['is_tax_exempt']; - isTelecommunicationsOrBroadcastingOrElectronicServices = - json['is_telecommunications_or_broadcasting_or_electronic_services']; - useMultipleWarehouses = json['use_multiple_warehouses']; - manageInventoryMethodId = json['manage_inventory_method_id']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - displayStockAvailability = json['display_stock_availability']; - displayStockQuantity = json['display_stock_quantity']; - minStockQuantity = json['min_stock_quantity']; - notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - allowedQuantities = json['allowed_quantities']; - allowAddingOnlyExistingAttributeCombinations = - json['allow_adding_only_existing_attribute_combinations']; - disableBuyButton = json['disable_buy_button']; - disableWishlistButton = json['disable_wishlist_button']; - availableForPreOrder = json['available_for_pre_order']; - preOrderAvailabilityStartDateTimeUtc = - json['pre_order_availability_start_date_time_utc']; - callForPrice = json['call_for_price']; - price = json['price']; - oldPrice = json['old_price']; - productCost = json['product_cost']; - specialPrice = json['special_price']; - specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; - specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; - customerEntersPrice = json['customer_enters_price']; - minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; - maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; - basepriceEnabled = json['baseprice_enabled']; - basepriceAmount = json['baseprice_amount']; - basepriceBaseAmount = json['baseprice_base_amount']; - hasTierPrices = json['has_tier_prices']; - hasDiscountsApplied = json['has_discounts_applied']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountDescription = json['discount_description']; - discountDescriptionn = json['discount_Descriptionn']; - discountPercentage = json['discount_percentage']; - currency = json['currency']; - currencyn = json['currencyn']; - weight = json['weight']; - length = json['length']; - width = json['width']; - height = json['height']; - availableStartDateTimeUtc = json['available_start_date_time_utc']; - availableEndDateTimeUtc = json['available_end_date_time_utc']; - displayOrder = json['display_order']; - published = json['published']; - deleted = json['deleted']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - productType = json['product_type']; - parentGroupedProductId = json['parent_grouped_product_id']; - if (json['role_ids'] != null) { - roleIds = new List(); - } - if (json['discount_ids'] != null) { - discountIds = new List(); - } - if (json['store_ids'] != null) { - storeIds = new List(); - } - manufacturerIds = json['manufacturer_ids'].cast(); - if (json['reviews'] != null) { - reviews = new List(); - } - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - if (json['attributes'] != null) { - attributes = new List(); - } - if (json['specifications'] != null) { - specifications = new List(); - json['specifications'].forEach((v) { - specifications.add(new Specifications.fromJson(v)); - }); - } - if (json['associated_product_ids'] != null) { - associatedProductIds = new List(); - } - if (json['tags'] != null) { - tags = new List(); - } - vendorId = json['vendor_id']; - seName = json['se_name']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['visible_individually'] = this.visibleIndividually; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['short_descriptionn'] = this.shortDescriptionn; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['markas_new'] = this.markasNew; - data['show_on_home_page'] = this.showOnHomePage; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['allow_customer_reviews'] = this.allowCustomerReviews; - data['approved_rating_sum'] = this.approvedRatingSum; - data['not_approved_rating_sum'] = this.notApprovedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['not_approved_total_reviews'] = this.notApprovedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['prescription_required'] = this.prescriptionRequired; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['manufacturer_part_number'] = this.manufacturerPartNumber; - data['gtin'] = this.gtin; - data['is_gift_card'] = this.isGiftCard; - data['require_other_products'] = this.requireOtherProducts; - data['automatically_add_required_products'] = - this.automaticallyAddRequiredProducts; - data['is_download'] = this.isDownload; - data['unlimited_downloads'] = this.unlimitedDownloads; - data['max_number_of_downloads'] = this.maxNumberOfDownloads; - data['download_expiration_days'] = this.downloadExpirationDays; - data['has_sample_download'] = this.hasSampleDownload; - data['has_user_agreement'] = this.hasUserAgreement; - data['is_recurring'] = this.isRecurring; - data['recurring_cycle_length'] = this.recurringCycleLength; - data['recurring_total_cycles'] = this.recurringTotalCycles; - data['is_rental'] = this.isRental; - data['rental_price_length'] = this.rentalPriceLength; - data['is_ship_enabled'] = this.isShipEnabled; - data['is_free_shipping'] = this.isFreeShipping; - data['ship_separately'] = this.shipSeparately; - data['additional_shipping_charge'] = this.additionalShippingCharge; - data['is_tax_exempt'] = this.isTaxExempt; - data['is_telecommunications_or_broadcasting_or_electronic_services'] = - this.isTelecommunicationsOrBroadcastingOrElectronicServices; - data['use_multiple_warehouses'] = this.useMultipleWarehouses; - data['manage_inventory_method_id'] = this.manageInventoryMethodId; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['display_stock_availability'] = this.displayStockAvailability; - data['display_stock_quantity'] = this.displayStockQuantity; - data['min_stock_quantity'] = this.minStockQuantity; - data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['allowed_quantities'] = this.allowedQuantities; - data['allow_adding_only_existing_attribute_combinations'] = - this.allowAddingOnlyExistingAttributeCombinations; - data['disable_buy_button'] = this.disableBuyButton; - data['disable_wishlist_button'] = this.disableWishlistButton; - data['available_for_pre_order'] = this.availableForPreOrder; - data['pre_order_availability_start_date_time_utc'] = - this.preOrderAvailabilityStartDateTimeUtc; - data['call_for_price'] = this.callForPrice; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['product_cost'] = this.productCost; - data['special_price'] = this.specialPrice; - data['special_price_start_date_time_utc'] = - this.specialPriceStartDateTimeUtc; - data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; - data['customer_enters_price'] = this.customerEntersPrice; - data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; - data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; - data['baseprice_enabled'] = this.basepriceEnabled; - data['baseprice_amount'] = this.basepriceAmount; - data['baseprice_base_amount'] = this.basepriceBaseAmount; - data['has_tier_prices'] = this.hasTierPrices; - data['has_discounts_applied'] = this.hasDiscountsApplied; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_description'] = this.discountDescription; - data['discount_Descriptionn'] = this.discountDescriptionn; - data['discount_percentage'] = this.discountPercentage; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['weight'] = this.weight; - data['length'] = this.length; - data['width'] = this.width; - data['height'] = this.height; - data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; - data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; - data['display_order'] = this.displayOrder; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['product_type'] = this.productType; - data['parent_grouped_product_id'] = this.parentGroupedProductId; - - data['manufacturer_ids'] = this.manufacturerIds; - - if (this.images != null) { - data['images'] = this.images.map((v) => v.toJson()).toList(); - } - - if (this.specifications != null) { - data['specifications'] = - this.specifications.map((v) => v.toJson()).toList(); - } - - data['vendor_id'] = this.vendorId; - data['se_name'] = this.seName; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} - -class Specifications { - int id; - int displayOrder; - String defaultValue; - String defaultValuen; - String name; - String nameN; - - Specifications( - {this.id, - this.displayOrder, - this.defaultValue, - this.defaultValuen, - this.name, - this.nameN}); - - Specifications.fromJson(Map json) { - id = json['id']; - displayOrder = json['display_order']; - defaultValue = json['default_value']; - defaultValuen = json['default_valuen']; - name = json['name']; - nameN = json['nameN']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['display_order'] = this.displayOrder; - data['default_value'] = this.defaultValue; - data['default_valuen'] = this.defaultValuen; - data['name'] = this.name; - data['nameN'] = this.nameN; - return data; - } -} diff --git a/lib/core/model/pharmacy/sub_categories_model.dart b/lib/core/model/pharmacy/sub_categories_model.dart deleted file mode 100644 index 916ec023..00000000 --- a/lib/core/model/pharmacy/sub_categories_model.dart +++ /dev/null @@ -1,75 +0,0 @@ -class SubCategoriesModel { - String id; - String name; - String namen; - List localizedNames; - String description; - int parentCategoryId; - int displayOrder; - dynamic image; - bool isLeaf; - - SubCategoriesModel( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.description, - this.parentCategoryId, - this.displayOrder, - this.image, - this.isLeaf}); - - SubCategoriesModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - description = json['description']; - parentCategoryId = json['parent_category_id']; - displayOrder = json['display_order']; - image = json['image']; - isLeaf = json['is_leaf']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['description'] = this.description; - data['parent_category_id'] = this.parentCategoryId; - data['display_order'] = this.displayOrder; - data['image'] = this.image; - data['is_leaf'] = this.isLeaf; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} diff --git a/lib/core/model/pharmacy/sub_products_model.dart b/lib/core/model/pharmacy/sub_products_model.dart deleted file mode 100644 index 6e8964c9..00000000 --- a/lib/core/model/pharmacy/sub_products_model.dart +++ /dev/null @@ -1,562 +0,0 @@ -class SubProductsModel { - String id; - bool visibleIndividually; - String name; - String namen; - List localizedNames; - String shortDescription; - String shortDescriptionn; - String fullDescription; - String fullDescriptionn; - bool markasNew; - bool showOnHomePage; - dynamic metaKeywords; - dynamic metaDescription; - dynamic metaTitle; - bool allowCustomerReviews; - dynamic approvedRatingSum; - dynamic notApprovedRatingSum; - dynamic approvedTotalReviews; - dynamic notApprovedTotalReviews; - String sku; - bool isRx; - bool prescriptionRequired; - dynamic rxMessage; - dynamic rxMessagen; - dynamic manufacturerPartNumber; - dynamic gtin; - bool isGiftCard; - bool requireOtherProducts; - bool automaticallyAddRequiredProducts; - bool isDownload; - bool unlimitedDownloads; - dynamic maxNumberOfDownloads; - dynamic downloadExpirationDays; - bool hasSampleDownload; - bool hasUserAgreement; - bool isRecurring; - dynamic recurringCycleLength; - dynamic recurringTotalCycles; - bool isRental; - dynamic rentalPriceLength; - bool isShipEnabled; - bool isFreeShipping; - bool shipSeparately; - dynamic additionalShippingCharge; - bool isTaxExempt; - bool isTelecommunicationsOrBroadcastingOrElectronicServices; - bool useMultipleWarehouses; - dynamic manageInventoryMethodId; - dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool displayStockAvailability; - bool displayStockQuantity; - dynamic minStockQuantity; - dynamic notifyAdminForQuantityBelow; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - dynamic allowedQuantities; - bool allowAddingOnlyExistingAttributeCombinations; - bool disableBuyButton; - bool disableWishlistButton; - bool availableForPreOrder; - dynamic preOrderAvailabilityStartDateTimeUtc; - bool callForPrice; - dynamic price; - dynamic oldPrice; - dynamic productCost; - dynamic specialPrice; - dynamic specialPriceStartDateTimeUtc; - dynamic specialPriceEndDateTimeUtc; - bool customerEntersPrice; - dynamic minimumCustomerEnteredPrice; - dynamic maximumCustomerEnteredPrice; - bool basepriceEnabled; - dynamic basepriceAmount; - dynamic basepriceBaseAmount; - bool hasTierPrices; - bool hasDiscountsApplied; - dynamic discountName; - dynamic discountNamen; - dynamic discountDescription; - dynamic discountDescriptionn; - dynamic discountPercentage; - String currency; - String currencyn; - double weight; - dynamic length; - dynamic width; - dynamic height; - dynamic availableStartDateTimeUtc; - dynamic availableEndDateTimeUtc; - dynamic displayOrder; - bool published; - bool deleted; - String createdOnUtc; - String updatedOnUtc; - String productType; - dynamic parentGroupedProductId; - List roleIds; - List discountIds; - List storeIds; - List manufacturerIds; - List reviews; - List images; - List attributes; - List specifications; - List associatedProductIds; - List tags; - dynamic vendorId; - String seName; - - SubProductsModel( - {this.id, - this.visibleIndividually, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.shortDescriptionn, - this.fullDescription, - this.fullDescriptionn, - this.markasNew, - this.showOnHomePage, - this.metaKeywords, - this.metaDescription, - this.metaTitle, - this.allowCustomerReviews, - this.approvedRatingSum, - this.notApprovedRatingSum, - this.approvedTotalReviews, - this.notApprovedTotalReviews, - this.sku, - this.isRx, - this.prescriptionRequired, - this.rxMessage, - this.rxMessagen, - this.manufacturerPartNumber, - this.gtin, - this.isGiftCard, - this.requireOtherProducts, - this.automaticallyAddRequiredProducts, - this.isDownload, - this.unlimitedDownloads, - this.maxNumberOfDownloads, - this.downloadExpirationDays, - this.hasSampleDownload, - this.hasUserAgreement, - this.isRecurring, - this.recurringCycleLength, - this.recurringTotalCycles, - this.isRental, - this.rentalPriceLength, - this.isShipEnabled, - this.isFreeShipping, - this.shipSeparately, - this.additionalShippingCharge, - this.isTaxExempt, - this.isTelecommunicationsOrBroadcastingOrElectronicServices, - this.useMultipleWarehouses, - this.manageInventoryMethodId, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.displayStockAvailability, - this.displayStockQuantity, - this.minStockQuantity, - this.notifyAdminForQuantityBelow, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.allowedQuantities, - this.allowAddingOnlyExistingAttributeCombinations, - this.disableBuyButton, - this.disableWishlistButton, - this.availableForPreOrder, - this.preOrderAvailabilityStartDateTimeUtc, - this.callForPrice, - this.price, - this.oldPrice, - this.productCost, - this.specialPrice, - this.specialPriceStartDateTimeUtc, - this.specialPriceEndDateTimeUtc, - this.customerEntersPrice, - this.minimumCustomerEnteredPrice, - this.maximumCustomerEnteredPrice, - this.basepriceEnabled, - this.basepriceAmount, - this.basepriceBaseAmount, - this.hasTierPrices, - this.hasDiscountsApplied, - this.discountName, - this.discountNamen, - this.discountDescription, - this.discountDescriptionn, - this.discountPercentage, - this.currency, - this.currencyn, - this.weight, - this.length, - this.width, - this.height, - this.availableStartDateTimeUtc, - this.availableEndDateTimeUtc, - this.displayOrder, - this.published, - this.deleted, - this.createdOnUtc, - this.updatedOnUtc, - this.productType, - this.parentGroupedProductId, - this.roleIds, - this.discountIds, - this.storeIds, - this.manufacturerIds, - this.reviews, - this.images, - this.attributes, - this.specifications, - this.associatedProductIds, - this.tags, - this.vendorId, - this.seName}); - - SubProductsModel.fromJson(Map json) { - id = json['id']; - visibleIndividually = json['visible_individually']; - name = json['name']; - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - shortDescriptionn = json['short_descriptionn']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - markasNew = json['markas_new']; - showOnHomePage = json['show_on_home_page']; - metaKeywords = json['meta_keywords']; - metaDescription = json['meta_description']; - metaTitle = json['meta_title']; - allowCustomerReviews = json['allow_customer_reviews']; - approvedRatingSum = json['approved_rating_sum']; - notApprovedRatingSum = json['not_approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - notApprovedTotalReviews = json['not_approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - prescriptionRequired = json['prescription_required']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - manufacturerPartNumber = json['manufacturer_part_number']; - gtin = json['gtin']; - isGiftCard = json['is_gift_card']; - requireOtherProducts = json['require_other_products']; - automaticallyAddRequiredProducts = - json['automatically_add_required_products']; - isDownload = json['is_download']; - unlimitedDownloads = json['unlimited_downloads']; - maxNumberOfDownloads = json['max_number_of_downloads']; - downloadExpirationDays = json['download_expiration_days']; - hasSampleDownload = json['has_sample_download']; - hasUserAgreement = json['has_user_agreement']; - isRecurring = json['is_recurring']; - recurringCycleLength = json['recurring_cycle_length']; - recurringTotalCycles = json['recurring_total_cycles']; - isRental = json['is_rental']; - rentalPriceLength = json['rental_price_length']; - isShipEnabled = json['is_ship_enabled']; - isFreeShipping = json['is_free_shipping']; - shipSeparately = json['ship_separately']; - additionalShippingCharge = json['additional_shipping_charge']; - isTaxExempt = json['is_tax_exempt']; - isTelecommunicationsOrBroadcastingOrElectronicServices = - json['is_telecommunications_or_broadcasting_or_electronic_services']; - useMultipleWarehouses = json['use_multiple_warehouses']; - manageInventoryMethodId = json['manage_inventory_method_id']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - displayStockAvailability = json['display_stock_availability']; - displayStockQuantity = json['display_stock_quantity']; - minStockQuantity = json['min_stock_quantity']; - notifyAdminForQuantityBelow = json['notify_admin_for_quantity_below']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - allowedQuantities = json['allowed_quantities']; - allowAddingOnlyExistingAttributeCombinations = - json['allow_adding_only_existing_attribute_combinations']; - disableBuyButton = json['disable_buy_button']; - disableWishlistButton = json['disable_wishlist_button']; - availableForPreOrder = json['available_for_pre_order']; - preOrderAvailabilityStartDateTimeUtc = - json['pre_order_availability_start_date_time_utc']; - callForPrice = json['call_for_price']; - price = json['price']; - oldPrice = json['old_price']; - productCost = json['product_cost']; - specialPrice = json['special_price']; - specialPriceStartDateTimeUtc = json['special_price_start_date_time_utc']; - specialPriceEndDateTimeUtc = json['special_price_end_date_time_utc']; - customerEntersPrice = json['customer_enters_price']; - minimumCustomerEnteredPrice = json['minimum_customer_entered_price']; - maximumCustomerEnteredPrice = json['maximum_customer_entered_price']; - basepriceEnabled = json['baseprice_enabled']; - basepriceAmount = json['baseprice_amount']; - basepriceBaseAmount = json['baseprice_base_amount']; - hasTierPrices = json['has_tier_prices']; - hasDiscountsApplied = json['has_discounts_applied']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountDescription = json['discount_description']; - discountDescriptionn = json['discount_Descriptionn']; - discountPercentage = json['discount_percentage']; - currency = json['currency']; - currencyn = json['currencyn']; - weight = json['weight']; - length = json['length']; - width = json['width']; - height = json['height']; - availableStartDateTimeUtc = json['available_start_date_time_utc']; - availableEndDateTimeUtc = json['available_end_date_time_utc']; - displayOrder = json['display_order']; - published = json['published']; - deleted = json['deleted']; - createdOnUtc = json['created_on_utc']; - updatedOnUtc = json['updated_on_utc']; - productType = json['product_type']; - parentGroupedProductId = json['parent_grouped_product_id']; - - manufacturerIds = json['manufacturer_ids'].cast(); - - if (json['specifications'] != null) { - specifications = new List(); - json['specifications'].forEach((v) { - specifications.add(new Specifications.fromJson(v)); - }); - } - - vendorId = json['vendor_id']; - seName = json['se_name']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['visible_individually'] = this.visibleIndividually; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['short_descriptionn'] = this.shortDescriptionn; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['markas_new'] = this.markasNew; - data['show_on_home_page'] = this.showOnHomePage; - data['meta_keywords'] = this.metaKeywords; - data['meta_description'] = this.metaDescription; - data['meta_title'] = this.metaTitle; - data['allow_customer_reviews'] = this.allowCustomerReviews; - data['approved_rating_sum'] = this.approvedRatingSum; - data['not_approved_rating_sum'] = this.notApprovedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['not_approved_total_reviews'] = this.notApprovedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['prescription_required'] = this.prescriptionRequired; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['manufacturer_part_number'] = this.manufacturerPartNumber; - data['gtin'] = this.gtin; - data['is_gift_card'] = this.isGiftCard; - data['require_other_products'] = this.requireOtherProducts; - data['automatically_add_required_products'] = - this.automaticallyAddRequiredProducts; - data['is_download'] = this.isDownload; - data['unlimited_downloads'] = this.unlimitedDownloads; - data['max_number_of_downloads'] = this.maxNumberOfDownloads; - data['download_expiration_days'] = this.downloadExpirationDays; - data['has_sample_download'] = this.hasSampleDownload; - data['has_user_agreement'] = this.hasUserAgreement; - data['is_recurring'] = this.isRecurring; - data['recurring_cycle_length'] = this.recurringCycleLength; - data['recurring_total_cycles'] = this.recurringTotalCycles; - data['is_rental'] = this.isRental; - data['rental_price_length'] = this.rentalPriceLength; - data['is_ship_enabled'] = this.isShipEnabled; - data['is_free_shipping'] = this.isFreeShipping; - data['ship_separately'] = this.shipSeparately; - data['additional_shipping_charge'] = this.additionalShippingCharge; - data['is_tax_exempt'] = this.isTaxExempt; - data['is_telecommunications_or_broadcasting_or_electronic_services'] = - this.isTelecommunicationsOrBroadcastingOrElectronicServices; - data['use_multiple_warehouses'] = this.useMultipleWarehouses; - data['manage_inventory_method_id'] = this.manageInventoryMethodId; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['display_stock_availability'] = this.displayStockAvailability; - data['display_stock_quantity'] = this.displayStockQuantity; - data['min_stock_quantity'] = this.minStockQuantity; - data['notify_admin_for_quantity_below'] = this.notifyAdminForQuantityBelow; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['allowed_quantities'] = this.allowedQuantities; - data['allow_adding_only_existing_attribute_combinations'] = - this.allowAddingOnlyExistingAttributeCombinations; - data['disable_buy_button'] = this.disableBuyButton; - data['disable_wishlist_button'] = this.disableWishlistButton; - data['available_for_pre_order'] = this.availableForPreOrder; - data['pre_order_availability_start_date_time_utc'] = - this.preOrderAvailabilityStartDateTimeUtc; - data['call_for_price'] = this.callForPrice; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['product_cost'] = this.productCost; - data['special_price'] = this.specialPrice; - data['special_price_start_date_time_utc'] = - this.specialPriceStartDateTimeUtc; - data['special_price_end_date_time_utc'] = this.specialPriceEndDateTimeUtc; - data['customer_enters_price'] = this.customerEntersPrice; - data['minimum_customer_entered_price'] = this.minimumCustomerEnteredPrice; - data['maximum_customer_entered_price'] = this.maximumCustomerEnteredPrice; - data['baseprice_enabled'] = this.basepriceEnabled; - data['baseprice_amount'] = this.basepriceAmount; - data['baseprice_base_amount'] = this.basepriceBaseAmount; - data['has_tier_prices'] = this.hasTierPrices; - data['has_discounts_applied'] = this.hasDiscountsApplied; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_description'] = this.discountDescription; - data['discount_Descriptionn'] = this.discountDescriptionn; - data['discount_percentage'] = this.discountPercentage; - data['currency'] = this.currency; - data['currencyn'] = this.currencyn; - data['weight'] = this.weight; - data['length'] = this.length; - data['width'] = this.width; - data['height'] = this.height; - data['available_start_date_time_utc'] = this.availableStartDateTimeUtc; - data['available_end_date_time_utc'] = this.availableEndDateTimeUtc; - data['display_order'] = this.displayOrder; - data['published'] = this.published; - data['deleted'] = this.deleted; - data['created_on_utc'] = this.createdOnUtc; - data['updated_on_utc'] = this.updatedOnUtc; - data['product_type'] = this.productType; - data['parent_grouped_product_id'] = this.parentGroupedProductId; - - data['manufacturer_ids'] = this.manufacturerIds; - - if (this.specifications != null) { - data['specifications'] = - this.specifications.map((v) => v.toJson()).toList(); - } - - data['vendor_id'] = this.vendorId; - data['se_name'] = this.seName; - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} - -class Specifications { - int id; - int displayOrder; - String defaultValue; - String defaultValuen; - String name; - String nameN; - - Specifications( - {this.id, - this.displayOrder, - this.defaultValue, - this.defaultValuen, - this.name, - this.nameN}); - - Specifications.fromJson(Map json) { - id = json['id']; - displayOrder = json['display_order']; - defaultValue = json['default_value']; - defaultValuen = json['default_valuen']; - name = json['name']; - nameN = json['nameN']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['display_order'] = this.displayOrder; - data['default_value'] = this.defaultValue; - data['default_valuen'] = this.defaultValuen; - data['name'] = this.name; - data['nameN'] = this.nameN; - return data; - } -} diff --git a/lib/core/model/search_products_model.dart b/lib/core/model/search_products_model.dart deleted file mode 100644 index d63fd4b0..00000000 --- a/lib/core/model/search_products_model.dart +++ /dev/null @@ -1,185 +0,0 @@ -class SearchProductsModel { - String id; - String name; - String namen; - List localizedNames; - String shortDescription; - String fullDescription; - String fullDescriptionn; - dynamic approvedRatingSum; - dynamic approvedTotalReviews; - String sku; - bool isRx; - dynamic rxMessage; - dynamic rxMessagen; - dynamic stockQuantity; - String stockAvailability; - String stockAvailabilityn; - bool allowBackInStockSubscriptions; - dynamic orderMinimumQuantity; - dynamic orderMaximumQuantity; - double price; - dynamic oldPrice; - dynamic discountName; - dynamic discountNamen; - dynamic discountPercentage; - dynamic displayOrder; - List discountIds; - List reviews; - List images; - - SearchProductsModel( - {this.id, - this.name, - this.namen, - this.localizedNames, - this.shortDescription, - this.fullDescription, - this.fullDescriptionn, - this.approvedRatingSum, - this.approvedTotalReviews, - this.sku, - this.isRx, - this.rxMessage, - this.rxMessagen, - this.stockQuantity, - this.stockAvailability, - this.stockAvailabilityn, - this.allowBackInStockSubscriptions, - this.orderMinimumQuantity, - this.orderMaximumQuantity, - this.price, - this.oldPrice, - this.discountName, - this.discountNamen, - this.discountPercentage, - this.displayOrder, - this.discountIds, - this.reviews, - this.images}); - - SearchProductsModel.fromJson(Map json) { - id = json['id']; - name = json['name']; - namen = json['namen']; - if (json['localized_names'] != null) { - localizedNames = new List(); - json['localized_names'].forEach((v) { - localizedNames.add(new LocalizedNames.fromJson(v)); - }); - } - shortDescription = json['short_description']; - fullDescription = json['full_description']; - fullDescriptionn = json['full_descriptionn']; - approvedRatingSum = json['approved_rating_sum']; - approvedTotalReviews = json['approved_total_reviews']; - sku = json['sku']; - isRx = json['is_rx']; - rxMessage = json['rx_message']; - rxMessagen = json['rx_messagen']; - stockQuantity = json['stock_quantity']; - stockAvailability = json['stock_availability']; - stockAvailabilityn = json['stock_availabilityn']; - allowBackInStockSubscriptions = json['allow_back_in_stock_subscriptions']; - orderMinimumQuantity = json['order_minimum_quantity']; - orderMaximumQuantity = json['order_maximum_quantity']; - price = json['price']; - oldPrice = json['old_price']; - discountName = json['discount_name']; - discountNamen = json['discount_namen']; - discountPercentage = json['discount_percentage']; - displayOrder = json['display_order']; - - if (json['images'] != null) { - images = new List(); - json['images'].forEach((v) { - images.add(new Images.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['namen'] = this.namen; - if (this.localizedNames != null) { - data['localized_names'] = - this.localizedNames.map((v) => v.toJson()).toList(); - } - data['short_description'] = this.shortDescription; - data['full_description'] = this.fullDescription; - data['full_descriptionn'] = this.fullDescriptionn; - data['approved_rating_sum'] = this.approvedRatingSum; - data['approved_total_reviews'] = this.approvedTotalReviews; - data['sku'] = this.sku; - data['is_rx'] = this.isRx; - data['rx_message'] = this.rxMessage; - data['rx_messagen'] = this.rxMessagen; - data['stock_quantity'] = this.stockQuantity; - data['stock_availability'] = this.stockAvailability; - data['stock_availabilityn'] = this.stockAvailabilityn; - data['allow_back_in_stock_subscriptions'] = - this.allowBackInStockSubscriptions; - data['order_minimum_quantity'] = this.orderMinimumQuantity; - data['order_maximum_quantity'] = this.orderMaximumQuantity; - data['price'] = this.price; - data['old_price'] = this.oldPrice; - data['discount_name'] = this.discountName; - data['discount_namen'] = this.discountNamen; - data['discount_percentage'] = this.discountPercentage; - data['display_order'] = this.displayOrder; - - if (this.images != null) { - data['images'] = this.images.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class LocalizedNames { - int languageId; - String localizedName; - - LocalizedNames({this.languageId, this.localizedName}); - - LocalizedNames.fromJson(Map json) { - languageId = json['language_id']; - localizedName = json['localized_name']; - } - - Map toJson() { - final Map data = new Map(); - data['language_id'] = this.languageId; - data['localized_name'] = this.localizedName; - return data; - } -} - -class Images { - int id; - int position; - String src; - String thumb; - String attachment; - - Images({this.id, this.position, this.src, this.thumb, this.attachment}); - - Images.fromJson(Map json) { - id = json['id']; - position = json['position']; - src = json['src']; - thumb = json['thumb']; - attachment = json['attachment']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['position'] = this.position; - data['src'] = this.src; - data['thumb'] = this.thumb; - data['attachment'] = this.attachment; - return data; - } -} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 6a9a6da3..afa3bd05 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -147,14 +147,9 @@ class BaseAppClient { } else if (parsed['Result'] == 'OK') { onSuccess(parsed, statusCode); } else { - if (parsed != null) { - onSuccess(parsed, statusCode); - } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); - logout(); - } + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); } } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { @@ -167,13 +162,9 @@ class BaseAppClient { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode); } else { - if (parsed['message'] != null) { - onFailure(parsed['message'] ?? parsed['message'], statusCode); - } else { - onFailure( - parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], - statusCode); - } + onFailure( + parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); } } } @@ -234,41 +225,8 @@ class BaseAppClient { } } - getPharmacy(String endPoint, - {Function(dynamic response, int statusCode) onSuccess, - Function(String error, int statusCode) onFailure, - bool isAllowAny = false, - Map queryParams}) async { - String url = PHARMACY_BASE_URL + endPoint; - if (queryParams != null) { - String queryString = Uri(queryParameters: queryParams).query; - url += '?' + queryString; - } - - print("URL : $url"); - - if (await Utils.checkConnection()) { - final response = await http.get(url.trim(), headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }); - final int statusCode = response.statusCode; - print("statusCode :$statusCode"); - - if (statusCode < 200 || statusCode >= 400 || json == null) { - onFailure('Error While Fetching data', statusCode); - } else { - var parsed = json.decode(response.body.toString()); - onSuccess(parsed, statusCode); - } - } else { - onFailure('Please Check The Internet Connection', -1); - } - } - logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); - await sharedPref.remove(PHARMACY_CUSTOMER_ID); await authenticatedUserObject.getUser(); Provider.of(AppGlobal.context, listen: false).isLogin = false; diff --git a/lib/core/service/offers_service.dart b/lib/core/service/offers_service.dart deleted file mode 100644 index 2247c833..00000000 --- a/lib/core/service/offers_service.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; - -import 'base_service.dart'; - -class OffersCategoriseService extends BaseService { - List _offersList = List(); - List get offersList => _offersList; - List _offerProducts = List(); - List get offersProducts => _offerProducts; - - clearCategorise() { - _offerProducts.clear(); - } - - // clearCategorise2() { - // _offersList.clear(); - // } - - Future getOffersCategorise() async { - hasError = false; - _offersList.clear(); - await baseAppClient.get( - GET_OFFERS_CATEGORISE, - onSuccess: (dynamic response, int statusCode) { - response['categories'].forEach((item) { - _offersList.add(OffersModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getOffersProducts({String id}) async { - hasError = false; - _offerProducts.clear(); - String endPoint = - id != null ? GET_OFFERS_PRODUCTS + "$id" : GET_OFFERS_PRODUCTS + "1"; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _offerProducts.add(OfferProductsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } -} diff --git a/lib/core/service/parmacyModule/lacum-registration-service.dart b/lib/core/service/parmacyModule/lacum-registration-service.dart deleted file mode 100644 index b3e64e69..00000000 --- a/lib/core/service/parmacyModule/lacum-registration-service.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; - -import 'lacum-service.dart'; - -class LacumRegistrationService extends LacumService{ - - ListUserAgreement listUserAgreement; - - Future getLacumAccountInformationById(String patientIdentificationNo) async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = patientIdentificationNo; - - try { - await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, - onSuccess: (response, statusCode) async { - lacumInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future getUserTermsAndConditionsForEPharmcy() async { - hasError = false; - super.error = ""; - - Map body = Map(); - - try { - await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, - onSuccess: (response, statusCode) async { - listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - -} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-service.dart b/lib/core/service/parmacyModule/lacum-service.dart deleted file mode 100644 index c7117303..00000000 --- a/lib/core/service/parmacyModule/lacum-service.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/service/base_service.dart'; - -class LacumService extends BaseService{ - bool isFinished = true; - bool hasError = false; - String errorMsg = ''; - String successMsg = ''; - - LacumAccountInformation lacumInformation; - LacumAccountInformation lacumGroupInformation; - - Future getLacumAccountInformation() async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = user.patientIdentificationNo; - - try { - await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, - onSuccess: (response, statusCode) async { - lacumInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future getLacumGroupInformation() async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = user.patientIdentificationNo; - body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; - body['IsDetailsRequired'] = true; - - try { - await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, - onSuccess: (response, statusCode) async { - lacumGroupInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future makeAccountActivate() async { - hasError = false; - super.error = ""; - int yahalaAccountNo = lacumInformation.yahalaAccountNo; - - Map body = Map(); - body['CreatedBy'] = 103; - body['YahalaAccountNumber'] = yahalaAccountNo; - - try { - await baseAppClient.post(LACUM_ACCOUNT_ACTIVATE, - onSuccess: (response, statusCode) async { - // lacumInformation = LacumAccountInformation.fromJson(response); - // lacumInformation.yahalaAccountNo = yahalaAccountNo; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future makeAccountDeactivate() async { - hasError = false; - super.error = ""; - int yahalaAccountNo = lacumInformation.yahalaAccountNo; - - Map body = Map(); - body['CreatedBy'] = 103; - body['YahalaAccountNumber'] = yahalaAccountNo; - - try { - await baseAppClient.post(LACUM_ACCOUNT_DEACTIVATE, - onSuccess: (response, statusCode) async { - // lacumInformation = LacumAccountInformation.fromJson(response); - // lacumInformation.yahalaAccountNo = yahalaAccountNo; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future createLakumAccount(String name, String phone, int accountID, String patientIdentificationID, var prefLang) async { - hasError = false; - super.error = ""; - if(prefLang == null){ - var languageID = - await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); - prefLang = languageID == 'ar' ? 1 : 2; - } - - - Map body = Map(); - body['PrefLang'] = prefLang; - body['AccountID'] = accountID; - body['FullName'] = name; - body['MobileNo'] = phone; - body['PatientIdentificationID'] = patientIdentificationID; - body['PatientID'] = user.patientID; - - try { - await baseAppClient.post(CREATE_LAKUM_ACCOUNT, - onSuccess: (response, statusCode) async { - successMsg = LacumAccountInformation.fromJson(response).message; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } -} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/lacum-transfer-service.dart b/lib/core/service/parmacyModule/lacum-transfer-service.dart deleted file mode 100644 index b15696f9..00000000 --- a/lib/core/service/parmacyModule/lacum-transfer-service.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; - -import 'lacum-service.dart'; - -class LacumTransferService extends LacumService{ - LacumAccountInformation lacumReceiverInformation; - - Future getLacumGroupDataBuAccountId(String accountId) async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = user.patientIdentificationNo; - body['AccountNumber'] = accountId; - - try { - await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, - onSuccess: (response, statusCode) async { - lacumReceiverInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - return null; - }, body: body); - } catch (error) { - throw error; - } - } - - Future transferYaHalaLoyaltyPoints(String points) async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['MobileNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; - body['UserName'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; - body['YaHalaSenderAccNumber'] = lacumGroupInformation.lakumInquiryInformationObjVersion.accountNumber; - body['Yahala_IdentificationNo'] = lacumGroupInformation.lakumInquiryInformationObjVersion.memberUniversalId; - body['YaHalaPointsToTransfer'] = points; - body['YaHalaReceiverAccNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.accountNumber; - body['YaHalaReceiverMobileNumber'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.mobileNumber; - body['YaHalaReceiverName'] = lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName; - - try { - await baseAppClient.post(TRANSFER_YAHALA_LOYALITY_POINTS, - onSuccess: (response, statusCode) async { - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - -} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/order-preview-service.dart b/lib/core/service/parmacyModule/order-preview-service.dart index 5648ff6d..1f3f9ddd 100644 --- a/lib/core/service/parmacyModule/order-preview-service.dart +++ b/lib/core/service/parmacyModule/order-preview-service.dart @@ -1,248 +1,29 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -class OrderPreviewService extends BaseService { +class OrderPreviewService extends BaseService{ bool isFinished = true; bool hasError = false; String errorMsg = ''; List addresses = List(); - LacumAccountInformation lacumInformation; - LacumAccountInformation lacumGroupInformation; - Future getAddresses() async { - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - Map queryParams = {'fields': 'addresses'}; + Future getBannerListList() async { hasError = false; try { - await baseAppClient.get("$GET_CUSTOMERS_ADDRESSES$customerId", + await baseAppClient.get(GET_CUSTOMERS_ADDRESSES, onSuccess: (dynamic response, int statusCode) { - addresses.clear(); - response['customers'][0]['addresses'].forEach((item) { - addresses.add(Addresses.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams); - } catch (error) { - throw error; - } - } - - Future getShippingOption(Addresses selectedAddress) async { - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - Map queryParams = Map(); - dynamic localRes; - hasError = false; - try { - await baseAppClient.get("$GET_SHIPPING_OPTIONS$customerId/${selectedAddress.id}", - onSuccess: (dynamic response, int statusCode) { - localRes = response['shipping_option'][0]; + addresses.clear(); + response['customers'][0]['addresses'].forEach((item) { + addresses.add(Addresses.fromJson(item)); + }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; - }, queryParams: queryParams); + }); } catch (error) { throw error; } - return Future.value(localRes); - } - - Future getShoppingCart() async { - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - Map queryParams = {'shopping_cart_type': '1'}; - dynamic localRes; - hasError = false; - try { - await baseAppClient.get("$GET_SHOPPING_CART$customerId", - onSuccess: (dynamic response, int statusCode) { - localRes = response; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams); - } catch (error) { - throw error; - } - return Future.value(localRes); - } - - Future changeProductQuantity( - String productId, ShoppingCart product) async { - hasError = false; - super.error = ""; - dynamic localRes; - Map choppingCartObject = Map(); - choppingCartObject['id'] = product.id; - choppingCartObject['quantity'] = product.quantity; - choppingCartObject['shopping_cart_type'] = "1"; - choppingCartObject['product_id'] = product.productId; - choppingCartObject['customer_id'] = product.customerId; - - Map body = Map(); - body["shopping_cart_item"] = choppingCartObject; - - await baseAppClient.post("$GET_SHOPPING_CART$productId", - onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - - return Future.value(localRes); - } - - Future deleteProduct(String productId) async { - hasError = false; - super.error = ""; - dynamic localRes; - - Map body = Map(); - - await baseAppClient.post("$DELETE_SHOPPING_CART$productId", - onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - - return Future.value(localRes); - } - - Future deleteShoppingCart() async { - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - - hasError = false; - super.error = ""; - dynamic localRes; - - await baseAppClient.get("$DELETE_SHOPPING_CART_ALL$customerId/ShoppingCart", - onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); - - return Future.value(localRes); - } - - Future getLacumAccountInformation() async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = user.patientIdentificationNo; - - try { - await baseAppClient.post(GET_LACUM_ACCOUNT_INFORMATION, - onSuccess: (response, statusCode) async { - lacumInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future getLacumGroupInformation() async { - hasError = false; - super.error = ""; - - Map body = Map(); - body['IdentificationNo'] = user.patientIdentificationNo; - body['AccountNumber'] = "${lacumInformation.yahalaAccountNo}"; - - try { - await baseAppClient.post(GET_LACUM_GROUP_INFORMATION, - onSuccess: (response, statusCode) async { - lacumGroupInformation = LacumAccountInformation.fromJson(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - Future makeOrder(PaymentCheckoutData paymentCheckoutData, List shoppingCarts) async { - paymentCheckoutData.address.isChecked = true; - hasError = false; - super.error = ""; - - var languageID = - await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - - Map orderBody = Map(); - orderBody['rx_attachments'] = ""; - orderBody['customer_language_id'] = languageID == 'ar' ? 1 : 2; - orderBody['billing_address'] = paymentCheckoutData.address; - orderBody['pick_up_in_store'] = false; - orderBody['payment_method_system_name'] = "Payments.PayFort"; - orderBody['shipping_method'] = languageID == 'ar' ? paymentCheckoutData.shippingOption.namen : paymentCheckoutData.shippingOption.name ; - orderBody['shipping_rate_computation_method_system_name'] = paymentCheckoutData.shippingOption.shippingRateComputationMethodSystemName; - orderBody['customer_id'] = customerId; - orderBody['custom_values_xml'] = "PaymentOption:${getPaymentOptionName(paymentCheckoutData.paymentOption)}"; - orderBody['shippingOption'] = paymentCheckoutData.shippingOption; - orderBody['shipping_address'] = paymentCheckoutData.address; - orderBody['lakum_amount'] = paymentCheckoutData.usedLakumPoints; - - List> itemsList = List(); - shoppingCarts.forEach((item) { - Map orderItemsBody = Map(); - orderItemsBody['product_id'] = item.product.id; - orderItemsBody['quantity'] = item.quantity; - itemsList.add(orderItemsBody); - }); - orderBody['order_items'] = itemsList; - - Map body = Map(); - body['order'] = orderBody; - - try { - await baseAppClient.post(ORDER_SHOPPING_CART, - onSuccess: (response, statusCode) async { - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - - String getPaymentOptionName(PaymentOption paymentOption) { - switch (paymentOption.index) { - case 0: - return "MADA"; - break; - case 1: - return "SADAD"; - break; - case 2: - return "VISA"; - break; - case 3: - return "MASTERCARD"; - break; - case 4: - return "INSTALLMENT"; - break; - default: - return ""; - } } -} +} \ No newline at end of file diff --git a/lib/core/service/parmacyModule/parmacy_module_service.dart b/lib/core/service/parmacyModule/parmacy_module_service.dart index c3bce324..8584e140 100644 --- a/lib/core/service/parmacyModule/parmacy_module_service.dart +++ b/lib/core/service/parmacyModule/parmacy_module_service.dart @@ -4,10 +4,8 @@ import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyProduct.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; class PharmacyModuleService extends BaseService { - final AppSharedPreferences sharedPref = AppSharedPreferences(); bool isFinished = true; bool hasError = false; String errorMsg = ''; @@ -17,55 +15,6 @@ class PharmacyModuleService extends BaseService { List bestSellerProducts = List(); List lastVisitedProducts = List(); - Future makeVerifyCustomer(dynamic data) async { - Map queryParams = {'FileNumber': data['PatientID'].toString()}; - hasError = false; - try { - await baseAppClient.get(PHARMACY_VERIFY_CUSTOMER, - onSuccess: (dynamic response, int statusCode) { - if (response['UserName'] != null) { - sharedPref.setString(PHARMACY_CUSTOMER_ID, response['CustomerId'].toString()); - print(response); - } else { - createUser(); - } - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams); - } catch (error) { - throw error; - } - } - - Future createUser() async { - var data = await sharedPref.getObject(USER_PROFILE); - var languageID = await sharedPref.getString(APP_LANGUAGE); - Map queryParams = { - 'Phone': data['MobileNumber'], - 'Email': data['EmailAddress'], - 'FileNumber': data['PatientID'].toString(), - 'Language': languageID.toString(), - 'Gender': data['Gender'].toString(), - 'FirstName': data['FirstName'], - 'LastName': data['LastName'], - 'LanguageId': languageID.toString(), - 'CountryCode': data['ZipCode'], - }; - hasError = false; - try { - await baseAppClient.get(PHARMACY_CREATE_CUSTOMER, - onSuccess: (dynamic response, int statusCode) { - if (!response['IsRegistered']) {} - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, queryParams: queryParams); - } catch (error) { - throw error; - } - } - Future getBannerListList() async { hasError = false; try { @@ -91,10 +40,7 @@ class PharmacyModuleService extends BaseService { onSuccess: (dynamic response, int statusCode) { manufacturerList.clear(); response['manufacturer'].forEach((item) { - Manufacturer manufacturer = Manufacturer.fromJson(item); - if(manufacturer.image != null){ - manufacturerList.add(Manufacturer.fromJson(item)); - } + manufacturerList.add(Manufacturer.fromJson(item)); }); }, onFailure: (String error, int statusCode) { hasError = true; @@ -135,14 +81,14 @@ class PharmacyModuleService extends BaseService { try { await baseAppClient.get("$GET_PHARMACY_PRODUCTs_BY_IDS$lastVisited", onSuccess: (dynamic response, int statusCode) { - lastVisitedProducts.clear(); - response['products'].forEach((item) { - lastVisitedProducts.add(PharmacyProduct.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); + lastVisitedProducts.clear(); + response['products'].forEach((item) { + lastVisitedProducts.add(PharmacyProduct.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }); } catch (error) { throw error; } diff --git a/lib/core/service/parmacyModule/terms-condition-service.dart b/lib/core/service/parmacyModule/terms-condition-service.dart deleted file mode 100644 index 68fac632..00000000 --- a/lib/core/service/parmacyModule/terms-condition-service.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; - -import '../base_service.dart'; - -class TermsConditionService extends BaseService{ - bool isFinished = true; - bool hasError = false; - String errorMsg = ''; - String successMsg = ''; - - ListUserAgreement listUserAgreement; - - Future getUserTermsAndConditionsForEPharmcy() async { - hasError = false; - super.error = ""; - - Map body = Map(); - - try { - await baseAppClient.post(LAKUM_GET_USER_TERMS_AND_CONDITIONS, - onSuccess: (response, statusCode) async { - listUserAgreement = ListUserAgreement.fromJson(response['ListUserAgreement'][0]); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, body: body); - } catch (error) { - throw error; - } - } - -} \ No newline at end of file diff --git a/lib/core/service/pharmacy_categorise_service.dart b/lib/core/service/pharmacy_categorise_service.dart deleted file mode 100644 index b55a755d..00000000 --- a/lib/core/service/pharmacy_categorise_service.dart +++ /dev/null @@ -1,225 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; - -import 'base_service.dart'; - -class PharmacyCategoriseService extends BaseService { - //service one - List _categoriseList = List(); - List get categoriseList => _categoriseList; - - //service two - List _parentCategoriseList = List(); - List get parentCategoriseList => _parentCategoriseList; - - //service three - List _parentProductsList = List(); - List get parentProductsList => _parentProductsList; - - //service four - List _subCategoriseList = List(); - List get subCategoriseList => _subCategoriseList; - - //service five - List _subProductsList = List(); - List get subProductsList => _subProductsList; - - //service six - List _finalProducts = List(); - List get finalProducts => _finalProducts; - - //service 7 - - List _brandsList = List(); - List get brandsList => _brandsList; - - // service 8 - - List _searchList = List(); - List get searchList => _searchList; - - List _scanList = List(); - List get scanList => _scanList; - - clearSearchList() { - _searchList.clear(); - } - - Future getCategorise() async { - hasError = false; - _categoriseList.clear(); - await baseAppClient.get( - GET_PHARMACY_CATEGORISE, - onSuccess: (dynamic response, int statusCode) { - response['categories'].forEach((item) { - _categoriseList.add(PharmacyCategorise.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future scanQr({String id}) async { - hasError = false; - _scanList.clear(); - String endPoint = id != null ? SCAN_QR_CODE + "$id" : SCAN_QR_CODE + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _scanList.add(ScanQrModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future searchProducts({String productName}) async { - hasError = false; - _searchList.clear(); - String endPoint = productName != null - ? GET_SEARCH_PRODUCTS + "$productName" + '&language_id=1' - : GET_SEARCH_PRODUCTS + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _searchList.add(SearchProductsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getBrands() async { - hasError = false; - _brandsList.clear(); - await baseAppClient.get( - GET_BRANDS_LIST, - onSuccess: (dynamic response, int statusCode) { - response['manufacturer'].forEach((item) { - _brandsList.add(BrandsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getCategoriseParent({String id}) async { - hasError = false; - _parentCategoriseList.clear(); - String endPoint = - id != null ? GET_CATEGORISE_PARENT + "$id" : GET_CATEGORISE_PARENT + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['categories'].forEach((item) { - _parentCategoriseList.add(CategoriseParentModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getParentProducts({String id}) async { - hasError = false; - _parentProductsList.clear(); - String endPoint = id != null - ? GET_PARENT_PRODUCTS + "$id" + '&page=1&limit=50' - : GET_PARENT_PRODUCTS + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _parentProductsList.add(ParentProductsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getSubCategorise({String id}) async { - hasError = false; - _subCategoriseList.clear(); - - String endPoint = - id != null ? GET_SUB_CATEGORISE + "$id" : GET_SUB_CATEGORISE + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['categories'].forEach((item) { - _subCategoriseList.add(SubCategoriesModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getSubProducts({String id}) async { - hasError = false; - _subProductsList.clear(); - String endPoint = id != null - ? GET_SUB_PRODUCTS + "$id" + '&page=1&limit=50' - : GET_SUB_PRODUCTS + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _subProductsList.add(SubProductsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } - - Future getFinalProducts({String id}) async { - hasError = false; - _finalProducts.clear(); - String endPoint = - id != null ? GET_FINAL_PRODUCTS + "$id" : GET_FINAL_PRODUCTS + ""; - await baseAppClient.get( - endPoint, - onSuccess: (dynamic response, int statusCode) { - response['products'].forEach((item) { - _finalProducts.add(FinalProductsModel.fromJson(item)); - }); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); - } -} diff --git a/lib/core/viewModels/offers_Categorise_view_model.dart b/lib/core/viewModels/offers_Categorise_view_model.dart deleted file mode 100644 index b63dd553..00000000 --- a/lib/core/viewModels/offers_Categorise_view_model.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/offer_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/offers_model.dart'; -import 'package:diplomaticquarterapp/core/service/offers_service.dart'; -import 'package:diplomaticquarterapp/locator.dart'; - -import 'base_view_model.dart'; - -class OffersCategoriseViewModel extends BaseViewModel { - bool hasError = false; - - OffersCategoriseService _offersCategoriseService = - locator(); - List get categorise => _offersCategoriseService.offersList; - - List get products => - _offersCategoriseService.offersProducts; - - Future getOffersCategorise() async { - hasError = false; - _offersCategoriseService.clearCategorise(); - setState(ViewState.Busy); - await _offersCategoriseService.getOffersCategorise(); - if (_offersCategoriseService.hasError) { - error = _offersCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - await getOffersProducts(); - } - - Future getOffersProducts({String i}) async { - hasError = false; - - setState(ViewState.Busy); - await _offersCategoriseService.getOffersProducts(id: i); - if (_offersCategoriseService.hasError) { - error = _offersCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } -} -// await _offersCategoriseService.getOffersProducts(); -// if (_offersCategoriseService.hasError) { -// error = _offersCategoriseService.error; -// setState(ViewState.ErrorLocal); -// } else -// setState(ViewState.Idle); diff --git a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart index 06295188..00f4819b 100644 --- a/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart +++ b/lib/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart @@ -1,11 +1,3 @@ -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ShippingOption.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; import 'package:diplomaticquarterapp/core/service/parmacyModule/order-preview-service.dart'; import '../../../locator.dart'; @@ -13,183 +5,4 @@ import '../base_view_model.dart'; class OrderPreviewViewModel extends BaseViewModel { OrderPreviewService _orderService = locator(); - - List get addresses => _orderService.addresses; - LacumAccountInformation get lacumInformation => - _orderService.lacumInformation; - ShoppingCartResponse cartResponse = ShoppingCartResponse(); - PaymentCheckoutData paymentCheckoutData = PaymentCheckoutData(); - double totalAdditionalShippingCharge = 0; - - Future getOrderPreviewData() async { - setState(ViewState.Busy); - await _orderService.getAddresses(); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - getShoppingCart(); - } - } - - getShoppingCart() async { - setState(ViewState.Busy); - await _orderService.getShoppingCart().then((res) { - _handleGetShoppingCartResponse(res); - }); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - if (paymentCheckoutData != null) { - paymentCheckoutData.cartDataVisible = true; - } - setState(ViewState.Idle); - } - } - - changeProductQuantity(ShoppingCart product) async { - setState(ViewState.Busy); - await _orderService.changeProductQuantity(product.id, product).then((res) { - _handleGetShoppingCartResponse(res); - }); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - deleteProduct(ShoppingCart product) async { - setState(ViewState.Busy); - await _orderService.deleteProduct(product.id).then((res) { - _handleGetShoppingCartResponse(res); - }); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - deleteShoppingCart() async { - setState(ViewState.Busy); - await _orderService.deleteShoppingCart().then((res) { - _handleGetShoppingCartResponse(res); - }); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - _handleGetShoppingCartResponse(Map res) { - totalAdditionalShippingCharge = 0; - if (res == null) { - error = "response is null"; - setState(ViewState.Error); - return; - } - print(res); - cartResponse.itemCount = res["item_count"]; - cartResponse.quantityCount = res["quantity_count"]; - cartResponse.subtotal = res["subtotal"]; - cartResponse.subtotalWithVat = res["subtotal_with_vat"]; - cartResponse.subtotalVatAmount = res["subtotal_vat_amount"]; - cartResponse.subtotalVatRate = res["subtotal_vat_rate"]; - cartResponse.shoppingCarts = List(); - res["shopping_carts"].forEach((item) { - ShoppingCart shoppingCart = ShoppingCart.fromJson(item); - cartResponse.shoppingCarts.add(shoppingCart); - totalAdditionalShippingCharge += shoppingCart.product.additionalShippingCharge; - }); - cartResponse.updateShoppingCard(); - } - - String getPaymentOptionImage(PaymentOption paymentOption) { - String assetFile = "assets/images/pharmacy_module/payment/"; - switch (paymentOption.index) { - case 0: - return "${assetFile}mada.png"; - break; - case 1: - return "${assetFile}sadad.png"; - break; - case 2: - return "${assetFile}visa.png"; - break; - case 3: - return "${assetFile}mastercard.png"; - break; - case 4: - return "${assetFile}installment.png"; - break; - default: - return ""; - } - } - - String getPaymentOptionName(PaymentOption paymentOption) { - return _orderService.getPaymentOptionName(paymentOption); - } - - getInformationsByAddress() async { - await getLacumAccountInformation(); - await getShippingOption(); - } - - getLacumAccountInformation() async { - setState(ViewState.Busy); - await _orderService.getLacumAccountInformation(); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - getLacumGroupData(); - } - } - - Future getLacumGroupData() async { - setState(ViewState.Busy); - await _orderService.getLacumGroupInformation(); - paymentCheckoutData.lacumInformation = _orderService.lacumGroupInformation; - paymentCheckoutData.usedLakumPoints = paymentCheckoutData.lacumInformation.lakumInquiryInformationObjVersion.pointsBalanceAmount; - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - getShippingOption() async { - setState(ViewState.Busy); - await _orderService.getShippingOption(paymentCheckoutData.address).then((res) { - paymentCheckoutData.shippingOption = ShippingOption.fromJson(res); - paymentCheckoutData.updateData(); - }); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - Future makeOrder() async { - setState(ViewState.Busy); - await _orderService.makeOrder(paymentCheckoutData, cartResponse.shoppingCarts); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } } - -enum PaymentOption { meda, sadad, visa, mastercard, installments } diff --git a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart b/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart deleted file mode 100644 index 75a178fa..00000000 --- a/lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart +++ /dev/null @@ -1,24 +0,0 @@ - -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; -import '../../../locator.dart'; -import '../base_view_model.dart'; - -class PharmacyAddressesViewModel extends BaseViewModel { - PharmacyAddressService _PharmacyAddressService = locator(); - - List get address => _PharmacyAddressService.address; - - - Future getAddress() async { - setState(ViewState.Busy); - await _PharmacyAddressService.getAddress(); - if (_PharmacyAddressService.hasError) { - error = _PharmacyAddressService.error; - setState(ViewState.Error); - } else { - - } - } -} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart deleted file mode 100644 index f8f5ea05..00000000 --- a/lib/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; -import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-registration-service.dart'; -import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; - -import '../../../locator.dart'; -import 'lacum-viewmodel.dart'; - -class LacumRegistrationViewModel extends LacumViewModel { - LacumRegistrationService _lacumService = locator(); - - ListUserAgreement get listUserAgreement => _lacumService.listUserAgreement; - - Future checkLacumAccountActivation(String patientIdentificationNo) async { - setState(ViewState.Busy); - await _lacumService.getLacumAccountInformationById(patientIdentificationNo); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - if(_lacumService.lacumInformation.yahalaAccountNo != 0){ - error = "The account has already been activated"; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - } - - Future getUserTermsAndConditionsForEPharmcy() async { - setState(ViewState.Busy); - await _lacumService.getUserTermsAndConditionsForEPharmcy(); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - Future createNewLakumAccount(String name, String phone, String identificationNo, int languageId) async { - setState(ViewState.Busy); - await _lacumService.createLakumAccount(name, phone, 0, identificationNo, languageId); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - return 404; - } else { - setState(ViewState.Idle); - return 200; - } - } - -} diff --git a/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart b/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart deleted file mode 100644 index cd19a40f..00000000 --- a/lib/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-transfer-service.dart'; - -import '../../../locator.dart'; -import 'lacum-viewmodel.dart'; - -class LacumTranferViewModel extends LacumViewModel { - LacumTransferService _lacumService = locator(); - - LacumAccountInformation get lacumReceiverInformation => - _lacumService.lacumReceiverInformation; - - Future getLacumGroupDataBuAccountId(String accountId) async { - setState(ViewState.Busy); - await _lacumService.getLacumGroupDataBuAccountId(accountId); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - Future transferYaHalaLoyaltyPoints(String points) async { - setState(ViewState.Busy); - await _lacumService.transferYaHalaLoyaltyPoints(points); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - return 404; - } else { - setState(ViewState.Idle); - return 200; - } - } - - setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ - _lacumService.lacumInformation = lacumInformation; - _lacumService.lacumGroupInformation = lacumGroupInformation; - } -} diff --git a/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart b/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart deleted file mode 100644 index ba8d70d9..00000000 --- a/lib/core/viewModels/pharmacyModule/lacum-viewmodel.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'dart:typed_data'; - -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/service/parmacyModule/lacum-service.dart'; -import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; -import 'dart:async'; -import 'dart:convert' as convert; - -import '../../../locator.dart'; -import '../base_view_model.dart'; - -class LacumViewModel extends BaseViewModel { - LacumService _lacumService = locator(); - - LacumAccountInformation get lacumInformation => - _lacumService.lacumInformation; - - LacumAccountInformation get lacumGroupInformation => - _lacumService.lacumGroupInformation; - - Future getLacumData() async { - await getLacumAccountData(); - getLacumGroupData(); - } - - Future getLacumAccountData() async { - setState(ViewState.Busy); - await _lacumService.getLacumAccountInformation(); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - Future getLacumGroupData() async { - setState(ViewState.Busy); - await _lacumService.getLacumGroupInformation(); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } - - Future makeAccountActivate() async { - setState(ViewState.Busy); - await _lacumService.makeAccountActivate(); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Active"; - getLacumAccountData(); - } - } - - Future makeAccountDeactivate() async { - setState(ViewState.Busy); - await _lacumService.makeAccountDeactivate(); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - } else { - lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus = "Cancelled"; - getLacumAccountData(); - } - } - - Future createLakumAccount(String name, String phone) async { - setState(ViewState.Busy); - await _lacumService.createLakumAccount(name, phone, lacumInformation.yahalaAccountNo, lacumInformation.identificationNo, null); - if (_lacumService.hasError) { - error = _lacumService.error; - setState(ViewState.Error); - return 404; - } else { - setState(ViewState.Idle); - return 200; - } - } - - String formatCreatedDateToString() { - DateTime createdDate = DateUtil.convertStringToDate( - lacumGroupInformation.lakumInquiryInformationObjVersion.createdDate); - return DateUtil.getFormattedDate(createdDate, "MMM dd,yyyy"); - } - - Uint8List convertBase64ToBarCodeImage() { - try { - final _byteImage = convert.base64Decode( - lacumGroupInformation.lakumInquiryInformationObjVersion.barCode); - return _byteImage; - } catch (e) { - print(e); - return null; - } - } - - setLakumData(LacumAccountInformation lacumInformation, LacumAccountInformation lacumGroupInformation){ - _lacumService.lacumInformation = lacumInformation; - _lacumService.lacumGroupInformation = lacumGroupInformation; - } - - clearLakumGroupData(){ - _lacumService.lacumGroupInformation = null; - } -} diff --git a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart b/lib/core/viewModels/pharmacyModule/order_model_view_model.dart deleted file mode 100644 index beb62a53..00000000 --- a/lib/core/viewModels/pharmacyModule/order_model_view_model.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; -import '../../../locator.dart'; -import '../base_view_model.dart'; - -class OrderModelViewModel extends BaseViewModel { - OrderService _orderService = locator(); - List get order => _orderService.orderList; - - OrderDetailsService _orderDetailsService = locator(); - List get orderDetails => _orderDetailsService.orderDetails; - - - - - Future getOrder(id, pageId) async { - setState(ViewState.Busy); - await _orderService.getOrder(id,pageId); - if (_orderService.hasError) { - error = _orderService.error; - setState(ViewState.Error); - } else { - - } - } - - Future getOrderDetails(orderId) async { - setState(ViewState.Busy); - await _orderDetailsService.getOrderDetails(orderId); - if (_orderDetailsService.hasError) { - error = _orderDetailsService.error; - setState(ViewState.Error); - } else { - - } - } -} \ No newline at end of file diff --git a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart index 4dfc6a26..f8c574f7 100644 --- a/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart +++ b/lib/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart @@ -1,4 +1,3 @@ -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Manufacturer.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; @@ -22,25 +21,6 @@ class PharmacyModuleViewModel extends BaseViewModel { _pharmacyService.lastVisitedProducts; Future getPharmacyHomeData() async { - setState(ViewState.Busy); - var data = await sharedPref.getObject(USER_PROFILE); - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - - if (authenticatedUserObject.isLogin && data != null && customerId == null) { - await _pharmacyService.makeVerifyCustomer(data); - // here must call getShoppingCard() - if (_pharmacyService.hasError) { - error = _pharmacyService.error; - setState(ViewState.Error); - } else { - await getBannerList(); - } - } else { - await getBannerList(); - } - } - - Future getBannerList() async { setState(ViewState.Busy); await _pharmacyService.getBannerListList(); if (_pharmacyService.hasError) { @@ -67,7 +47,6 @@ class PharmacyModuleViewModel extends BaseViewModel { error = _pharmacyService.error; setState(ViewState.Error); } else { - setState(ViewState.Idle); _getBestSellerProducts(); } } @@ -91,18 +70,4 @@ class PharmacyModuleViewModel extends BaseViewModel { setState(ViewState.Idle); } } - - Future checkUserIsActivated() async { - if (authenticatedUserObject.isLogin) { - var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); - if (customerId != null) { - return true; - } else { - return false; - } - } else { - // go to login page - return false; - } - } } diff --git a/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart b/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart deleted file mode 100644 index 6a5bd476..00000000 --- a/lib/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ListUserAgreement.dart'; -import 'package:diplomaticquarterapp/core/service/parmacyModule/terms-condition-service.dart'; -import 'dart:async'; - -import '../../../locator.dart'; -import '../base_view_model.dart'; - -class TermsConditionViewModel extends BaseViewModel { - TermsConditionService _termsConditionService = locator(); - - ListUserAgreement get listUserAgreement => _termsConditionService.listUserAgreement; - - Future getUserTermsAndConditionsForEPharmcy() async { - setState(ViewState.Busy); - await _termsConditionService.getUserTermsAndConditionsForEPharmcy(); - if (_termsConditionService.hasError) { - error = _termsConditionService.error; - setState(ViewState.Error); - } else { - setState(ViewState.Idle); - } - } -} diff --git a/lib/core/viewModels/pharmacy_categorise_view_model.dart b/lib/core/viewModels/pharmacy_categorise_view_model.dart deleted file mode 100644 index 81179091..00000000 --- a/lib/core/viewModels/pharmacy_categorise_view_model.dart +++ /dev/null @@ -1,158 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/brands_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/categorise_parent_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/final_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/parent_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/pharmacy_categorise.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/scan_qr_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/sub_categories_model.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacy/sub_products_model.dart'; -import 'package:diplomaticquarterapp/core/model/search_products_model.dart'; - -import 'package:diplomaticquarterapp/core/service/pharmacy_categorise_service.dart'; -import 'package:diplomaticquarterapp/locator.dart'; - -import 'base_view_model.dart'; - -class PharmacyCategoriseViewModel extends BaseViewModel { - bool hasError = false; - PharmacyCategoriseService _pharmacyCategoriseService = - locator(); - - List get categorise => - _pharmacyCategoriseService.categoriseList; - - List get categoriseParent => - _pharmacyCategoriseService.parentCategoriseList; - - List get parentProducts => - _pharmacyCategoriseService.parentProductsList; - - List get subCategorise => - _pharmacyCategoriseService.subCategoriseList; - - List get subProducts => - _pharmacyCategoriseService.subProductsList; - - List get finalProducts => - _pharmacyCategoriseService.finalProducts; - List get brandsList => _pharmacyCategoriseService.brandsList; - - List get searchList => - _pharmacyCategoriseService.searchList; - - List get scanList => _pharmacyCategoriseService.scanList; - - Future getCategorise() async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getCategorise(); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - Future getBrands() async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getBrands(); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - Future scanQr({String id}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.scanQr(id: id); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - clearSearchList() { - _pharmacyCategoriseService.clearSearchList(); - } - - Future searchProducts({String productName}) async { - hasError = false; - _pharmacyCategoriseService.clearSearchList(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.searchProducts(productName: productName); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - Future getCategoriseParent({String i}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getCategoriseParent(id: i); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - await getParentProducts(i: i); - await getBrands(); - } - - Future getParentProducts({String i}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getParentProducts(id: i); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - Future getSubCategorise({String i}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getSubCategorise(id: i); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - getSubProducts(i: i); - } - - Future getSubProducts({String i}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getSubProducts(id: i); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } - - Future getFinalProducts({String i}) async { - hasError = false; - // _insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _pharmacyCategoriseService.getFinalProducts(id: i); - if (_pharmacyCategoriseService.hasError) { - error = _pharmacyCategoriseService.error; - setState(ViewState.ErrorLocal); - } else - setState(ViewState.Idle); - } -} diff --git a/lib/locator.dart b/lib/locator.dart index 6d2375e7..d02d647f 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -4,9 +4,6 @@ import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/H2O_v import 'package:diplomaticquarterapp/core/viewModels/child_vaccines/user_information_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/home_health_care_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:get_it/get_it.dart'; @@ -46,17 +43,11 @@ import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; -import 'core/service/parmacyModule/lacum-registration-service.dart'; -import 'core/service/parmacyModule/lacum-service.dart'; -import 'core/service/parmacyModule/lacum-transfer-service.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/service/notifications_service.dart'; -import 'core/service/parmacyModule/terms-condition-service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; -import 'core/service/offers_service.dart'; -import 'core/service/pharmacy_categorise_service.dart'; import 'core/viewModels/all_habib_medical_services/e_referral_view_model.dart'; import 'core/viewModels/appointment_rate_view_model.dart'; import 'core/viewModels/blooddonation/blood_details_view_model.dart'; @@ -89,23 +80,15 @@ import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/medical/reports_view_model.dart'; import 'core/viewModels/medical/weight_pressure_view_model.dart'; import 'core/viewModels/notifications_view_model.dart'; -import 'core/viewModels/offers_Categorise_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; import 'core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; -import 'core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; -import 'core/viewModels/pharmacyModule/lacum-viewmodel.dart'; import 'core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; -import 'core/viewModels/pharmacyModule/tems-condition-viewmodel.dart'; -import 'core/viewModels/pharmacy_categorise_view_model.dart'; import 'core/viewModels/qr_view_model.dart'; import 'core/viewModels/vaccine_view_model.dart'; import 'core/service/vaccine_service.dart'; -import 'services/pharmacy_services/orderDetails_service.dart'; -import 'services/pharmacy_services/pharmacyAddress_service.dart'; GetIt locator = GetIt.instance; @@ -135,7 +118,6 @@ void setupLocator() { locator.registerLazySingleton(() => EReferralService()); locator.registerLazySingleton(() => HomeHealthCareService()); locator.registerLazySingleton(() => CMCService()); - locator.registerLazySingleton(() => PatientSickLeaveService()); locator.registerLazySingleton(() => MyBalanceService()); locator.registerLazySingleton(() => BloodSugarService()); @@ -148,31 +130,18 @@ void setupLocator() { locator.registerLazySingleton(() => FindusService()); locator.registerLazySingleton(() => LiveChatService()); locator.registerLazySingleton(() => H2OService()); - locator.registerLazySingleton(() => BloodDonationService()); locator.registerLazySingleton(() => BloodDetailsService()); locator.registerLazySingleton(() => ChildVaccinesService()); locator.registerLazySingleton(() => UserInformationService()); locator.registerLazySingleton(() => CreteNewBabyService()); locator.registerLazySingleton(() => DeleteBabyService()); - locator.registerLazySingleton(() => VaccinationTableService()); - - //pharmacy - locator.registerLazySingleton(() => PharmacyCategoriseService()); - locator.registerLazySingleton(() => OffersCategoriseService()); - locator.registerLazySingleton(() => NotificationService()); locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService()); - locator.registerLazySingleton(() => LacumService()); - locator.registerLazySingleton(() => LacumTransferService()); - locator.registerLazySingleton(() => LacumRegistrationService()); - locator.registerLazySingleton(() => OrderService()); - locator.registerLazySingleton(() => PharmacyAddressService()); - locator.registerLazySingleton(() => OrderDetailsService()); locator.registerLazySingleton(() => CustomerAddressesService()); - locator.registerLazySingleton(() => TermsConditionService()); + /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -203,10 +172,6 @@ void setupLocator() { locator.registerFactory(() => ChildVaccinesViewModel()); locator.registerFactory(() => UserInformationViewModel()); locator.registerFactory(() => VaccinationTableViewModel()); - locator.registerFactory(() => OrderModelViewModel()); - locator.registerFactory(() => PharmacyAddressesViewModel()); - locator.registerFactory(() => TermsConditionViewModel()); - locator.registerFactory(() => AddNewChildViewModel()); locator.registerFactory(() => H2OViewModel()); locator.registerFactory(() => BloodSugarViewMode()); @@ -221,13 +186,9 @@ void setupLocator() { locator.registerFactory(() => CMCViewModel()); locator.registerFactory(() => NotificationViewModel()); + + locator.registerFactory(() => PharmacyModuleViewModel()); locator.registerFactory(() => OrderPreviewViewModel()); - locator.registerFactory(() => LacumViewModel()); - locator.registerFactory(() => LacumTranferViewModel()); - locator.registerFactory(() => LacumRegistrationViewModel()); - //pharmacy - locator.registerFactory(() => PharmacyCategoriseViewModel()); - locator.registerFactory(() => OffersCategoriseViewModel()); } diff --git a/lib/models/id-name-pair.dart b/lib/models/id-name-pair.dart deleted file mode 100644 index 00336572..00000000 --- a/lib/models/id-name-pair.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/material.dart'; - -class IdNamePair with ChangeNotifier{ - var id; - var name; - - IdNamePair(this.id, this.name); - - void updateData() { - notifyListeners(); - } -} \ No newline at end of file diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index 80fe1b41..38b70e23 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -33,10 +33,10 @@ class _BaseViewState extends State> { @override void initState() { - if (widget.allowAny && widget.onModelReady != null) { + if(widget.allowAny && widget.onModelReady != null){ widget.onModelReady(model); - } else if (widget.onModelReady != null && - Provider.of(context, listen: false).isLogin) { + } + else if (widget.onModelReady != null && Provider.of(context, listen: false).isLogin) { widget.onModelReady(model); } super.initState(); diff --git a/lib/pages/final_products_page.dart b/lib/pages/final_products_page.dart deleted file mode 100644 index 03adee97..00000000 --- a/lib/pages/final_products_page.dart +++ /dev/null @@ -1,480 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; -import 'package:flutter/material.dart'; - -import 'base/base_view.dart'; - -class FinalProductsPage extends StatefulWidget { - String id; - FinalProductsPage({this.id}); - @override - _FinalProductsPageState createState() => _FinalProductsPageState(id: id); -} - -class _FinalProductsPageState extends State { - String id; - _FinalProductsPageState({this.id}); - String categoriseName = "Personal Care"; - bool styleOne = true; - bool styleTwo = false; - Icon styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - @override - Widget build(BuildContext context) { - return BaseView( - onModelReady: (model) => model.getFinalProducts(i: id), - builder: (BuildContext context, PharmacyCategoriseViewModel model, - Widget child) => - PharmacyAppScaffold( - appBarTitle: 'Products', - isBottomBar: false, - isShowAppBar: true, - backgroundColor: Colors.white, - isShowDecPage: false, - baseViewModel: model, - body: Container( - height: MediaQuery.of(context).size.height * 5.87, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ -//Expanded widget heree if nassery - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Texts( - 'Products', - fontWeight: FontWeight.w600, - ), - ), - Row( - children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 1.0, - //width: 0.3, - // indent: 0.0, - ), - ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - setState(() { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }); - }, - ), - ), - ], - ), - ], - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Expanded( - child: Container( - height: MediaQuery.of(context).size.height * 3.90, - child: GridView.builder( - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 1.0, - ), - itemCount: model.finalProducts.length, - itemBuilder: (BuildContext context, int index) { - return NetworkBaseView( - baseViewModel: model, - child: Card( - color: model.finalProducts[index] - .discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: EdgeInsets.symmetric( - horizontal: 0), - width: MediaQuery.of(context) - .size - .width / - 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.finalProducts[index] - .images.isNotEmpty - ? model - .finalProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: model - .finalProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 2.8 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.finalProducts[index] - .rxMessage != - null - ? model - .finalProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w600, - ), - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model - .finalProducts[ - index] - .discountName != - null) - Container( - width: double.infinity, - height: 13.0, - decoration: - BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Center( - child: Texts( - model - .finalProducts[ - index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 10.4, - ), - ), - ), - Texts( - model.finalProducts[index] - .name, - regular: true, - fontSize: 12, - fontWeight: - FontWeight.w400, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, - bottom: 4), - child: Texts( - "SAR ${model.finalProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .finalProducts[ - index] - .approvedRatingSum > - 0 - ? (model.finalProducts[index].approvedRatingSum - .toDouble() / - model - .finalProducts[index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.finalProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ), - )); - }, - ), - ), - ) - : Expanded( - child: Container( - height: MediaQuery.of(context).size.height * 5.0, - child: ListView.builder( - itemCount: model.finalProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - Container( - decoration: BoxDecoration(), - child: Padding( - padding: EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.finalProducts[index] - .images.isNotEmpty - ? model - .finalProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.contain, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model - .finalProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 3.5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.finalProducts[index] - .rxMessage != - null - ? model - .finalProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w600, - ), - ), - ], - ), - ], - ), - Container( - height: 100.0, - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox( - height: 4.0, - ), - Container( - height: 35.0, - width: 250.0, - child: Texts( - model.finalProducts[index] - .name, - regular: true, - fontSize: 13.2, - fontWeight: FontWeight.w500, - maxLines: 2, - ), - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.finalProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .finalProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .finalProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .finalProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.finalProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ); - }), - ), - ) - ], - ), - ), - )); - } -} diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 6c7f0009..fb2cc108 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -11,13 +11,6 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/wishlist.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -29,8 +22,6 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; -import 'landing_page_pharmcy.dart'; - class HomePage extends StatefulWidget { final Function goToMyProfile; @@ -75,7 +66,7 @@ class _HomePageState extends State { right: 5, child: Container( width: - MediaQuery.of(context).size.width * 0.8, + MediaQuery.of(context).size.width * 0.8, child: Row( children: [ Expanded( @@ -90,7 +81,7 @@ class _HomePageState extends State { fit: BoxFit.fill, ), color: - Colors.white.withOpacity(0.3), + Colors.white.withOpacity(0.3), borderRadius: BorderRadius.all( Radius.circular(5))), child: Container( @@ -101,15 +92,13 @@ class _HomePageState extends State { style: TextStyle( color: Colors.white, fontWeight: - FontWeight.bold, + FontWeight.bold, fontSize: 18.0)), Row( children: [ Container( margin: EdgeInsets.only( - top: 15.0, - left: 3.5, - right: 3.5), + top: 15.0, left: 3.5, right: 3.5), child: SvgPicture.asset( 'assets/images/new-design/covid-19-car.svg', width: 45.0, @@ -126,34 +115,34 @@ class _HomePageState extends State { color: Colors .white, fontWeight: - FontWeight - .bold, + FontWeight + .bold, fontSize: - 16.0)), + 16.0)), ButtonTheme( shape: - RoundedRectangleBorder( + RoundedRectangleBorder( borderRadius: - BorderRadius - .circular( - 5.0), + BorderRadius + .circular( + 5.0), ), minWidth: MediaQuery.of( - context) - .size - .width * + context) + .size + .width * 0.15, height: 25.0, child: RaisedButton( color: Colors .red[800], textColor: - Colors.white, + Colors.white, disabledTextColor: - Colors.white, + Colors.white, disabledColor: - new Color( - 0xFFbcc2c4), + new Color( + 0xFFbcc2c4), onPressed: () { navigateToCovidDriveThru(); }, @@ -161,7 +150,7 @@ class _HomePageState extends State { "BOOK NOW", style: TextStyle( fontSize: - 12.0)), + 12.0)), ), ), ], @@ -209,240 +198,240 @@ class _HomePageState extends State { top: 155, left: MediaQuery.of(context).size.width * (MediaQuery.of(context).orientation == - Orientation.landscape + Orientation.landscape ? 0.02 : 0.03), right: MediaQuery.of(context).size.width * (MediaQuery.of(context).orientation == - Orientation.landscape + Orientation.landscape ? 0.02 : 0.03), child: (!model.isLogin && projectViewModel.user == null) ? Container( - width: double.infinity, - height: 125, - decoration: BoxDecoration( - color: HexColor('#A59E9E'), - shape: BoxShape.rectangle, - border: Border.all( - color: Colors.transparent, width: 0.5), - borderRadius: - BorderRadius.all(Radius.circular(9)), - image: DecorationImage( - image: ExactAssetImage( - 'assets/images/bg_graphic.png'), - fit: BoxFit.cover)), - child: Container( - margin: EdgeInsets.all(5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 8, - ), - Texts( - TranslationBase.of(context).myMedicalFile, - color: Colors.black87, - bold: true, - fontSize: 23, - ), - SizedBox( - height: 5, + width: double.infinity, + height: 125, + decoration: BoxDecoration( + color: HexColor('#A59E9E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, width: 0.5), + borderRadius: + BorderRadius.all(Radius.circular(9)), + image: DecorationImage( + image: ExactAssetImage( + 'assets/images/bg_graphic.png'), + fit: BoxFit.cover)), + child: Container( + margin: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of(context).myMedicalFile, + color: Colors.black87, + bold: true, + fontSize: 23, + ), + SizedBox( + height: 5, + ), + Texts( + TranslationBase.of(context) + .myMedicalFileSubTitle, + color: Colors.black, + fontSize: 16, + ), + Align( + alignment: projectViewModel.isArabic + ? Alignment.bottomRight + : Alignment.bottomLeft, + child: InkWell( + onTap: () { + widget.goToMyProfile(); + }, + child: Container( + margin: EdgeInsets.all(2), + width: 90, + height: 30, + decoration: BoxDecoration( + color: HexColor('#D81A2E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, + width: 0.5), + borderRadius: BorderRadius.all( + Radius.circular(9)), ), - Texts( - TranslationBase.of(context) - .myMedicalFileSubTitle, - color: Colors.black, - fontSize: 16, + child: Center( + child: Texts( + TranslationBase.of(context) + .viewMore, + color: Colors.white, + fontSize: 12, + ), ), - Align( - alignment: projectViewModel.isArabic - ? Alignment.bottomRight - : Alignment.bottomLeft, - child: InkWell( - onTap: () { - widget.goToMyProfile(); - }, - child: Container( - margin: EdgeInsets.all(2), - width: 90, - height: 30, - decoration: BoxDecoration( - color: HexColor('#D81A2E'), - shape: BoxShape.rectangle, - border: Border.all( - color: Colors.transparent, - width: 0.5), - borderRadius: BorderRadius.all( - Radius.circular(9)), + ), + ), + ) + ], + ), + ), + ) + : Container( + width: double.infinity, + height: 130, + decoration: BoxDecoration( + color: HexColor('#A59E9E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, width: 0.5), + borderRadius: + BorderRadius.all(Radius.circular(9)), + image: DecorationImage( + image: ExactAssetImage( + 'assets/images/bg_graphic.png'), + fit: BoxFit.cover), + ), + child: Container( + margin: EdgeInsets.all(5), + child: Column( + children: [ + Row( + children: [ + if (model.user != null) + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 8, ), - child: Center( - child: Texts( - TranslationBase.of(context) - .viewMore, - color: Colors.white, - fontSize: 12, - ), + Texts( + model.user.firstName + + " " + + model.user.lastName, + color: Colors.grey[100], + bold: true, + fontSize: 15, + ), + Texts( + '${model.user.patientID}', + color: Colors.white, + fontSize: 14, ), + SizedBox( + height: 5, + ), + Texts( + '${DateUtil.getMonthDayYearDateFormatted(model.user.dateofBirthDataTime)} ,${model.user.genderDescription} ${model.user.ageDesc}', + color: Colors.grey[100], + fontWeight: FontWeight.normal, + fontSize: 14, + ), + ], + ), + ), + InkWell( + onTap: () { + widget.goToMyProfile(); + }, + child: Container( + margin: EdgeInsets.all(2), + width: 90, + height: 30, + decoration: BoxDecoration( + color: HexColor('#D81A2E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, + width: 0.5), + borderRadius: BorderRadius.all( + Radius.circular(5), ), ), - ) - ], - ), - ), - ) - : Container( - width: double.infinity, - height: 130, - decoration: BoxDecoration( - color: HexColor('#A59E9E'), - shape: BoxShape.rectangle, - border: Border.all( - color: Colors.transparent, width: 0.5), - borderRadius: - BorderRadius.all(Radius.circular(9)), - image: DecorationImage( - image: ExactAssetImage( - 'assets/images/bg_graphic.png'), - fit: BoxFit.cover), + child: Center( + child: Texts( + TranslationBase.of(context) + .viewMore, + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], ), - child: Container( - margin: EdgeInsets.all(5), - child: Column( - children: [ - Row( + Row( + //crossAxisAlignment: CrossAxisAlignment.center, + //mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - if (model.user != null) - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox( - height: 8, - ), - Texts( - model.user.firstName + - " " + - model.user.lastName, - color: Colors.grey[100], - bold: true, - fontSize: 15, - ), - Texts( - '${model.user.patientID}', - color: Colors.white, - fontSize: 14, - ), - SizedBox( - height: 5, - ), - Texts( - '${DateUtil.getMonthDayYearDateFormatted(model.user.dateofBirthDataTime)} ,${model.user.genderDescription} ${model.user.ageDesc}', - color: Colors.grey[100], - fontWeight: FontWeight.normal, - fontSize: 14, - ), - ], - ), - ), - InkWell( - onTap: () { - widget.goToMyProfile(); - }, - child: Container( - margin: EdgeInsets.all(2), - width: 90, - height: 30, - decoration: BoxDecoration( - color: HexColor('#D81A2E'), - shape: BoxShape.rectangle, - border: Border.all( - color: Colors.transparent, - width: 0.5), - borderRadius: BorderRadius.all( - Radius.circular(5), - ), - ), - child: Center( - child: Texts( - TranslationBase.of(context) - .viewMore, - color: Colors.white, - fontSize: 12, - ), - ), - ), + Image.asset( + 'assets/images/height_icon.png', + width: 35, + height: 40, + ), + Texts( + "${model.heightCm}", + color: Colors.white, ) ], ), - Row( - //crossAxisAlignment: CrossAxisAlignment.center, - //mainAxisAlignment: MainAxisAlignment.spaceAround, + ), + SizedBox( + width: 3, + ), + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/height_icon.png', - width: 35, - height: 40, - ), - Texts( - "${model.heightCm}", - color: Colors.white, - ) - ], - ), - ), - SizedBox( - width: 3, - ), - Expanded( - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/weight_icon.png', - width: 25, - height: 40, - ), - Texts( - '${model.weightKg}', - color: Colors.white, - ) - ], - ), - ), - SizedBox( - width: 3, + Image.asset( + 'assets/images/weight_icon.png', + width: 25, + height: 40, ), - Expanded( - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/blood_icon.png', - width: 35, - height: 40, - ), - Texts( - '${model.bloadType}', - color: Colors.white, - ) - ], - ), + Texts( + '${model.weightKg}', + color: Colors.white, + ) + ], + ), + ), + SizedBox( + width: 3, + ), + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'assets/images/blood_icon.png', + width: 35, + height: 40, ), + Texts( + '${model.bloadType}', + color: Colors.white, + ) ], - ) - ], - ), - ), - ), + ), + ), + ], + ) + ], + ), + ), + ), ), ], ), @@ -490,6 +479,8 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( + onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), + child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -516,13 +507,9 @@ class _HomePageState extends State { ), height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', - onTap: () => Navigator.push( - context, - FadePage(page: LandingPagePharmacy()), - ), ), DashboardItem( - onTap: () { + onTap: (){ Navigator.push( context, FadePage( @@ -643,8 +630,8 @@ class _HomePageState extends State { context, FadePage( page: ErOptions( - isAppbar: true, - ))), + isAppbar: true, + ))), child: Center( child: Padding( padding: const EdgeInsets.all(15.0), @@ -772,7 +759,7 @@ class _HomePageState extends State { ), ), SizedBox( - height: 80, + height: 120, ) ], ), @@ -791,15 +778,15 @@ class _HomePageState extends State { class DashboardItem extends StatelessWidget { const DashboardItem( {this.hasBorder = false, - this.imageName, - @required this.child, - this.onTap, - Key key, - this.width, - this.height, - this.color, - this.opacity = 0.4, - this.hasColorFilter = true}) + this.imageName, + @required this.child, + this.onTap, + Key key, + this.width, + this.height, + this.color, + this.opacity = 0.4, + this.hasColorFilter = true}) : super(key: key); final bool hasBorder; final String imageName; @@ -820,13 +807,13 @@ class DashboardItem extends StatelessWidget { height: height != null ? height : MediaQuery.of(context).orientation == Orientation.portrait - ? MediaQuery.of(context).size.height * 0.19 - : MediaQuery.of(context).size.height * 0.35, + ? MediaQuery.of(context).size.height * 0.19 + : MediaQuery.of(context).size.height * 0.35, decoration: BoxDecoration( color: !hasBorder ? color != null - ? color - : HexColor('#050705').withOpacity(opacity) + ? color + : HexColor('#050705').withOpacity(opacity) : Colors.white, borderRadius: BorderRadius.circular(6.0), border: hasBorder @@ -834,13 +821,11 @@ class DashboardItem extends StatelessWidget { : Border.all(width: 0.0, color: Colors.transparent), image: imageName != null ? DecorationImage( - image: ExactAssetImage('assets/images/$imageName'), - fit: BoxFit.cover, - colorFilter: hasColorFilter - ? new ColorFilter.mode( - Colors.black.withOpacity(0.2), BlendMode.dstIn) - : null, - ) + image: ExactAssetImage('assets/images/$imageName'), + fit: BoxFit.cover, + colorFilter: hasColorFilter ? new ColorFilter.mode( + Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, + ) : null, ), child: Center( diff --git a/lib/pages/landing/landing_page_pharmcy.dart b/lib/pages/landing/landing_page_pharmcy.dart deleted file mode 100644 index 4308e186..00000000 --- a/lib/pages/landing/landing_page_pharmcy.dart +++ /dev/null @@ -1,162 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy_categorise.dart'; -import 'package:diplomaticquarterapp/pages/search_products_page.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; -import 'package:diplomaticquarterapp/widgets/pharmacy/bottom_nav_pharmacy_bar.dart'; -import 'package:flutter/material.dart'; - -import '../offers_categorise_page.dart'; - -class LandingPagePharmacy extends StatefulWidget { - @override - _LandingPagePharmacyState createState() => _LandingPagePharmacyState(); -} - -class _LandingPagePharmacyState extends State { - int currentTab = 0; - PageController pageController; - ProjectViewModel projectProvider; - - _changeCurrentTab(int tab) { - setState(() { - currentTab = tab; - pageController.jumpToPage(tab); - }); - } - - void initState() { - super.initState(); - pageController = PageController(keepPage: true); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: currentTab == 0 || currentTab == 1 - ? AppBar( - backgroundColor: Color(0xff5AB145), - elevation: 0, - title: Container( - height: MediaQuery.of(context).size.height * 0.056, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.0), - color: Colors.white, - ), - child: InkWell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Row( - //crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Icon(Icons.search, size: 25.0), - SizedBox( - width: 15.0, - ), - Texts( - TranslationBase.of(context).searchProductHere, - fontSize: 13, - ) - ], - ), - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => SearchProductsPage()), - ); - }, - ), - ), - leading: Builder( - builder: (BuildContext context) { - return Container( - height: 2.0, - width: 10.0, - child: Image.asset( - 'assets/images/pharmacy_logo.png', - ), - ); - }, - ), - actions: [ - // IconButton( - // iconSize: 70, - // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', - // height: 100, width: 100, fit: BoxFit.cover), - // onPressed: () { - // triggerRobot(); - // } //do something, - // ) - ], - centerTitle: true, - ) - : currentTab == 4 - ? null - : AppBar( - backgroundColor: Color(0xff5AB145), - elevation: 0, - textTheme: TextTheme( - headline6: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(getText(currentTab).toUpperCase()), - leading: Builder( - builder: (BuildContext context) { - return IconButton( - icon: Icon(Icons.arrow_back), - color: Colors.white, - onPressed: () => Scaffold.of(context).openDrawer(), - ); - }, - ), - actions: [ - // IconButton( - // iconSize: 70, - // icon: SvgPicture.asset('assets/images/svg/robort_svg.svg', - // height: 100, width: 100, fit: BoxFit.cover), - // onPressed: () { - // triggerRobot(); - // } //do something, - // ) - ], - centerTitle: true, - ), - extendBody: false, - body: PageView( - physics: NeverScrollableScrollPhysics(), - controller: pageController, - children: [ - PharmacyPage(), - PharmacyCategorisePage(), - OffersCategorisePage(), - Container( - child: Text('text'), - ), - CartOrderPage(), - ], // Please do not remove the BookingOptions from this array - ), - bottomNavigationBar: BottomNavPharmacyBar( - changeIndex: _changeCurrentTab, - index: currentTab, - ), - ); - } - - getText(currentTab) { - switch (currentTab) { - case 2: - return 'Wishlist'; - case 3: - return 'My Account'; - case 4: - return 'Shopping Cart'; - } - } -} diff --git a/lib/pages/offers_categorise_page.dart b/lib/pages/offers_categorise_page.dart deleted file mode 100644 index 782ea018..00000000 --- a/lib/pages/offers_categorise_page.dart +++ /dev/null @@ -1,620 +0,0 @@ -import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/core/viewModels/offers_Categorise_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -import 'base/base_view.dart'; - -class OffersCategorisePage extends StatefulWidget { - @override - _OffersCategorisePageState createState() => _OffersCategorisePageState(); -} - -class _OffersCategorisePageState extends State { - String categoriseName = "Personal Care"; - bool styleOne = true; - bool styleTwo = false; - Icon styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - return BaseView( - onModelReady: (model) => model.getOffersCategorise(), - builder: (BuildContext context, OffersCategoriseViewModel model, - Widget child) => - PharmacyAppScaffold( - appBarTitle: 'Offers', - isShowAppBar: true, - backgroundColor: Colors.white, - isShowDecPage: false, - baseViewModel: model, - body: Container( - //height: MediaQuery.of(context).size.height * 0.57, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: Container( - child: Texts( - 'Categories', - fontWeight: FontWeight.w800, - ), - ), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - //Expanded widget heree if nassery - Container( - height: MediaQuery.of(context).size.height * 0.20, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.categorise.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - InkWell( - child: Column( - children: [ - Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Icon( - Icons.apps_sharp, - size: 32.0, - ), - ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.2, - height: MediaQuery.of(context) - .size - .height * - 0.09, - child: Center( - child: Texts( - model.categorise[index].name, - fontWeight: FontWeight.w600, - fontSize: 13.8, - ), - ), - ), - ], - ), - onTap: () { - model.getOffersProducts( - i: model.categorise[index].id); - String ids = model.categorise[index].id; - - categoriseName = - model.categorise[index].name; - }), - ], - ), - ); - }), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Texts( - categoriseName, - fontWeight: FontWeight.w800, - ), - ), - Row( - children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 0.7, - //width: 0.3, - // indent: 0.0, - ), - ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - setState(() { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }); - }, - ), - ), - ], - ), - ], - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Expanded( - child: Container( - height: MediaQuery.of(context).size.height * 0.50, - child: GridView.builder( - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 0.85, - ), - itemCount: model.products.length, - itemBuilder: (BuildContext context, int index) { - return NetworkBaseView( - baseViewModel: model, - child: Card( - color: model.products[index] - .discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - height: 250.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: EdgeInsets.symmetric( - horizontal: 0), - width: MediaQuery.of(context) - .size - .width / - 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Stack( - children: [ - if (model.products[index] - .discountName != - null) - RotatedBox( - quarterTurns: 4, - child: Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - right: 5.0, - top: 20.0, - bottom: 5.0, - ), - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight.w900, - ), - ), - transform: new Matrix4 - .rotationZ( - 5.837200), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.products[index] - .images.isNotEmpty - ? model - .products[index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: model.products[index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.products[index] - .rxMessage != - null - ? model - .products[index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model.products[index] - .discountName != - null) - Container( - width: double.infinity, - height: 22.0, - decoration: - BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Center( - child: Texts( - model - .products[index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 12.0, - fontWeight: - FontWeight.w700, - ), - ), - ), - Texts( - model - .products[index].name, - regular: true, - fontSize: 12.58, - fontWeight: - FontWeight.w600, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, - bottom: 4), - child: Texts( - "SAR ${model.products[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .products[ - index] - .approvedRatingSum > - 0 - ? (model.products[index].approvedRatingSum - .toDouble() / - model - .products[index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.products[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ), - )); - }, - ), - ), - ) - : Expanded( - child: Container( - child: ListView.builder( - itemCount: model.products.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - // color: - // model.products[index].discountName != - // null - // ? Color(0xffFFFF00) - // : Colors.white, - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - if (model.products[index] - .discountName != - null) - Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - child: Container( - color: Colors.yellow, - height: 25.0, - width: 70.0, - child: Center( - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight - .w900, - ), - ), - ), - ), - transform: - new Matrix4.rotationZ( - 6.15099), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.products[index] - .images.isNotEmpty - ? model - .products[index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model.products[index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.products[index] - .rxMessage != - null - ? model - .products[index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model.products[index] - .discountName != - null) - Container( - width: 250.0, - height: 22.5, - decoration: BoxDecoration( - color: Color(0xff5AB145), - ), - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 5.5, - ), - child: Texts( - model.products[index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 12.0, - fontWeight: - FontWeight.w700, - ), - ), - ), - SizedBox( - height: 4.0, - ), - Texts( - model.products[index].name, - regular: true, - fontSize: 14.0, - fontWeight: FontWeight.w600, - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.products[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .products[ - index] - .approvedRatingSum > - 0 - ? (model - .products[ - index] - .approvedRatingSum - .toDouble() / - model - .products[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.products[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w500, - ) - ], - ), - ], - ), - ), - ], - ), - ); - }), - ), - ) - ], - ), - ), - )); - } -} diff --git a/lib/pages/parent_categorise_page.dart b/lib/pages/parent_categorise_page.dart deleted file mode 100644 index 4acb3b68..00000000 --- a/lib/pages/parent_categorise_page.dart +++ /dev/null @@ -1,1032 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/sub_categorise_page.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:giffy_dialog/giffy_dialog.dart'; - -import 'base/base_view.dart'; -import 'final_products_page.dart'; - -class ParentCategorisePage extends StatefulWidget { - String id; - String titleName; - ParentCategorisePage({this.id, this.titleName}); - @override - _ParentCategorisePageState createState() => - _ParentCategorisePageState(id: id, titleName: titleName); -} - -class _ParentCategorisePageState extends State { - String id; - String titleName; - _ParentCategorisePageState({this.id, this.titleName}); - Map values = {'huusam': false, 'ali': false, 'noor': false}; - bool checkedBrands = false; - bool checkedCategorise = false; - String categoriseName = "Personal Care"; - bool styleOne = true; - bool styleTwo = false; - Icon styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - @override - Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); - return BaseView( - onModelReady: (model) => model.getCategoriseParent(i: id), - builder: (BuildContext context, PharmacyCategoriseViewModel model, - Widget child) => - PharmacyAppScaffold( - appBarTitle: titleName, - isBottomBar: false, - isShowAppBar: true, - backgroundColor: Colors.white, - isShowDecPage: false, - baseViewModel: model, - body: SingleChildScrollView( - child: Container( - height: MediaQuery.of(context).size.height * 5.90, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Image.network( - id == '1' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' - : id == '2' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' - : id == '3' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' - : id == '4' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' - : id == '5' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' - : id == '6' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' - : id == '7' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' - : id == '8' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' - : id == '9' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' - : id == '10' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' - : '', - fit: BoxFit.fill, - height: 160.0, - width: double.infinity), - ), - if (model.categoriseParent.length > 8) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: InkWell( - child: Container( - child: Texts( - 'View All Categories', - fontWeight: FontWeight.w300, - ), - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return Container( - height: MediaQuery.of(context) - .size - .height * - 0.89, - color: Colors.white, - child: Center( - child: ListView.builder( - scrollDirection: - Axis.vertical, - itemCount: model - .categoriseParent.length, - itemBuilder: - (BuildContext context, - int index) { - return Container( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Texts(model - .categoriseParent[ - index] - .name), - Divider( - thickness: 0.6, - color: Colors - .black12, - ) - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: - (context) => - SubCategorisePage( - title: - model.categoriseParent[index].name, - id: model.categoriseParent[index].id, - parentId: - id, - )), - ); - }, - ), - ), - ); - }), - ), - ); - }, - ); - }, - ), - ), - Icon(Icons.arrow_forward) - ], - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - ], - ), - -//Expanded widget heree if nassery - Padding( - padding: EdgeInsets.only(top: 35.0), - child: Container( - height: MediaQuery.of(context).size.height * 0.2, - child: Center( - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.categoriseParent.length > 8 - ? 8 - : model.categoriseParent.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: 13.0), - child: Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Center( - child: Icon( - Icons.apps_sharp, - size: 32.0, - ), - ), - ), - ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.197, - height: MediaQuery.of(context) - .size - .height * - 0.08, - child: Center( - child: Texts( - projectViewModel.isArabic - ? model - .categoriseParent[index] - .namen - : model - .categoriseParent[index] - .name, - fontSize: 13.4, - fontWeight: FontWeight.w600, - maxLines: 3, - ), - ), - ), - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SubCategorisePage( - title: model - .categoriseParent[index] - .name, - id: model - .categoriseParent[index] - .id, - parentId: id, - )), - ); - print(id); - }, - ), - ); - }), - ), - ), - ), - - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - InkWell( - child: Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: FontWeight.w600, - ), - ], - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return DraggableScrollableSheet( - initialChildSize: 0.95, - maxChildSize: 0.95, - minChildSize: 0.9, - builder: (BuildContext context, - ScrollController scrollController) { - return SingleChildScrollView( - controller: scrollController, - child: Container( - height: MediaQuery.of(context) - .size - .height * - 1.95, - child: Column( - children: [ - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: - FontWeight.w600, - ), - SizedBox( - width: 250.0, - ), - InkWell( - child: Texts( - 'Close', - color: Colors.red, - fontWeight: - FontWeight.w600, - fontSize: 15.0, - ), - onTap: () { - Navigator.pop( - context); - }, - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - Column( - children: [ - ExpansionTile( - title: - Texts('Categorise'), - children: [ - Container( - height: 350, - child: ListView - .builder( - controller: - scrollController, - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .categoriseParent - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: - true, - title: Texts(model - .categoriseParent[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedCategorise, - onChanged: - (bool - value) { - setState( - () { - checkedCategorise = - value; - }); - }, - ); - }), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - ExpansionTile( - title: Texts('Brands'), - children: [ - Container( - height: 350, - child: ListView - .builder( - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .brandsList - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: - true, - title: Texts(model - .brandsList[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedBrands, - onChanged: - (bool - value) { - setState( - () { - checkedBrands = - value; - }); - }, - autofocus: - true, - ); - }), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - ExpansionTile( - title: Texts('Price'), - children: [ - Container( - color: Color( - 0xffEEEEEE), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceAround, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Texts( - 'Min'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), - ), - ), - ), - ], - ), - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Texts( - 'Max'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), - ), - ), - ), - ], - ), - ], - ), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - SizedBox( - height: MediaQuery.of( - context) - .size - .height * - 0.4, - ), - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceEvenly, - children: [ - Container( - width: 100, - child: Button( - label: 'Reset', - backgroundColor: - Colors.red, - ), - ), - SizedBox( - width: 30, - ), - Container( - width: 200, - child: Button( - label: 'Apply', - backgroundColor: - Colors - .green, - ), - ), - ], - ), - ), - ], - ), - ], - ), - ), - ); - }); - }, - ); - }, - ), - Row( - children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 1.0, -//width: 0.3, -// indent: 0.0, - ), - ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - setState(() { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }); - }, - ), - ), - ], - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Container( - height: MediaQuery.of(context).size.height * 4.89, - child: GridView.builder( - physics: NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 0.9, - ), - itemCount: model.parentProducts.length, - itemBuilder: (BuildContext context, int index) { - return NetworkBaseView( - baseViewModel: model, - child: Card( - color: model.parentProducts[index] - .discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: EdgeInsets.symmetric( - horizontal: 0), - width: MediaQuery.of(context) - .size - .width / - 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Stack( - children: [ - if (model - .parentProducts[index] - .discountName != - null) - RotatedBox( - quarterTurns: 4, - child: Container( - decoration: - BoxDecoration(), - child: Padding( - padding: - EdgeInsets.only( - right: 5.0, - top: 20.0, - bottom: 5.0, - ), - child: Texts( - 'offer' - .toUpperCase(), - color: Colors.red, - fontSize: 13.0, - fontWeight: - FontWeight.w900, - ), - ), - transform: new Matrix4 - .rotationZ( - 5.837200), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model - .parentProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: model - .parentProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model - .parentProducts[ - index] - .rxMessage != - null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - if (model - .parentProducts[ - index] - .discountName != - null) - Container( - width: double.infinity, - height: 13.0, - decoration: - BoxDecoration( - color: - Color(0xff5AB145), - ), - child: Center( - child: Texts( - model - .parentProducts[ - index] - .discountName, - regular: true, - color: Colors.white, - fontSize: 10.4, - ), - ), - ), - Texts( - model - .parentProducts[index] - .name, - regular: true, - fontSize: 12, - fontWeight: - FontWeight.w700, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, - bottom: 4), - child: Texts( - "SAR ${model.parentProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .parentProducts[ - index] - .approvedRatingSum > - 0 - ? (model.parentProducts[index].approvedRatingSum - .toDouble() / - model - .parentProducts[index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.parentProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ), - )); - }, - ), - ) - : Container( - height: MediaQuery.of(context).size.height * 5.0, - child: ListView.builder( - physics: NeverScrollableScrollPhysics(), - itemCount: model.parentProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - Container( - decoration: BoxDecoration(), - child: Padding( - padding: EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model - .parentProducts[ - index] - .images - .isNotEmpty - ? model - .parentProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.contain, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model - .parentProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model - .parentProducts[ - index] - .rxMessage != - null - ? model - .parentProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - height: 100.0, - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox( - height: 4.0, - ), - Texts( - model.parentProducts[index] - .name, - regular: true, - fontSize: 13.2, - fontWeight: FontWeight.w500, - maxLines: 5, - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.parentProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .parentProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .parentProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .parentProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.parentProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ); - }), - ) - ], - ), - ), - ), - )); - } -} diff --git a/lib/pages/pharmacies/screens/address-select-page.dart b/lib/pages/pharmacies/screens/address-select-page.dart deleted file mode 100644 index 6c39ba3f..00000000 --- a/lib/pages/pharmacies/screens/address-select-page.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; - -class AddressSelectPageTest extends StatelessWidget { - final List addresses; - - AddressSelectPageTest(this.addresses); - - @override - Widget build(BuildContext context) { - return AppScaffold( - title: "test", - isShowAppBar: true, - isShowDecPage: false, - body: Column( - children: [ - Container( - child: RaisedButton( - onPressed: () => {Navigator.pop(context, addresses[0])}, - child: new Text( - "Set address", - style: new TextStyle(color: Colors.white, fontSize: 14), - ), - color: Colors.blueAccent, - disabledColor: Colors.blueAccent, - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/cart-order-page.dart b/lib/pages/pharmacies/screens/cart-order-page.dart deleted file mode 100644 index d8a274d7..00000000 --- a/lib/pages/pharmacies/screens/cart-order-page.dart +++ /dev/null @@ -1,366 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCartResponse.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-preview.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderItem.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class CartOrderPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - PreferredSizeWidget appBarWidget = - AppBarWidget(TranslationBase.of(context).shoppingCart, null, true); - final height = mediaQuery.size.height - - appBarWidget.preferredSize.height - - mediaQuery.padding.top; - - return BaseView( - onModelReady: (model) => model.getOrderPreviewData(), - builder: (_, model, wi) => ChangeNotifierProvider.value( - value: model.cartResponse, - child: AppScaffold( - title: TranslationBase.of(context).shoppingCart, - isShowAppBar: true, - isShowDecPage: false, - isPharmacy: true, - baseViewModel: model, - appBarWidget: appBarWidget, - backgroundColor: Colors.white, - body: !(model.cartResponse.shoppingCarts == null || - model.cartResponse.shoppingCarts.length == 0) - ? Container( - height: height * 0.85, - width: double.infinity, - child: Consumer( - builder: (ctx, cart, _) => Container( - child: SingleChildScrollView( - child: Container( - margin: EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureIconButton( - TranslationBase.of(context).deleteAllItems, - Icon( - Icons.delete_outline_sharp, - color: Colors.grey.shade700, - ), - onTap: () => {model.deleteShoppingCart()}, - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Container( - child: Column( - children: [ - ...List.generate( - cart.shoppingCarts != null - ? cart.shoppingCarts.length - : 0, - (index) => ProductOrderItem( - cart.shoppingCarts[index], () { - print(cart.shoppingCarts[index] - .quantity); - model.changeProductQuantity( - cart.shoppingCarts[index]); - }, - () => model.deleteProduct( - cart.shoppingCarts[index]))) - ], - ), - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 2, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - "Subtotal", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - "VAT (15%)", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - Texts( - "SAR ${(cart.subtotalVatAmount).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - TranslationBase.of(context).total, - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Image.asset( - "assets/images/pharmacy_module/payment_image.png", - width: mediaQuery.size.width - 20, - height: 30.0, - fit: BoxFit.scaleDown, - ) - ], - ), - ), - ), - ), - ), - ) - : Container(), - bottomSheet: Container( - height: !(model.cartResponse.shoppingCarts == null || - model.cartResponse.shoppingCarts.length == 0) ? height * 0.15 : 0, - color: Colors.white, - child: OrderBottomWidget(model.addresses, height), - ), - ), - ), - ); - } -} - -class OrderBottomWidget extends StatefulWidget { - final List addresses; - final double height; - - OrderBottomWidget(this.addresses, this.height); - - @override - _OrderBottomWidgetState createState() => _OrderBottomWidgetState(); -} - -class _OrderBottomWidgetState extends State { - bool isAgree = false; - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0), - child: Consumer( - builder: (ctx, cart, _) => !(cart.shoppingCarts == null || - cart.shoppingCarts.length == 0) - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Divider( - color: Color(0xFFD6D6D6), - height: 1, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Container( - height: widget.height * 0.070, - color: Color(0xffe6ffe0), - padding: EdgeInsets.symmetric(horizontal: 4), - child: Expanded( - child: Row( - children: [ - InkWell( - onTap: () { - setState(() { - isAgree = !isAgree; - }); - }, - child: Container( - width: 25.0, - height: widget.height * 0.070, - decoration: new BoxDecoration( - color: !isAgree ? Color(0xffeeeeee) : Colors.green, - shape: BoxShape.circle, - ), - child: !isAgree - ? null - : Padding( - padding: const EdgeInsets.all(0.0), - child: Icon( - Icons.check, - color: Colors.white, - size: 25, - ), - ), - ), - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric(horizontal: 4), - margin: const EdgeInsets.symmetric(vertical: 4), - child: Texts( - "I agree with the terms of service and I adhere to them unconditionally", - fontSize: 13, - color: Colors.grey.shade800, - fontWeight: FontWeight.normal, - ), - ), - ), - InkWell( - onTap: () => { - Navigator.push( - context, - FadePage( - page: PharmacyTermsConditions())) - }, - child: Container( - child: Icon( - Icons.info, - size: 25, - color: Color(0xff005aff), - ), - ), - ), - ], - ), - ), - ), - Container( - height: widget.height * 0.065, - margin: EdgeInsets.symmetric(vertical: 2), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.symmetric( - horizontal: 0, vertical: 4), - child: Row( - children: [ - Texts( - "SAR ${(cart.subtotal).toStringAsFixed(2)}", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 4), - child: Texts( - "(inclusive VAT)", - fontSize: 8, - color: Colors.grey, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Texts( - "${cart.quantityCount} item(s)", - fontSize: 10, - color: Colors.grey, - fontWeight: FontWeight.bold, - ), - ], - ), - RaisedButton( - onPressed: isAgree - ? () => { - Navigator.push( - context, - FadePage( - page: OrderPreviewPage( - widget.addresses))) - } - : null, - child: new Text( - "CHECK OUT", - style: new TextStyle( - color: isAgree - ? Colors.white - : Colors.grey.shade300, - fontSize: 14), - ), - color: Color(0xff005aff), - disabledColor: Color(0xff005aff), - ), - /* SecondaryButton( - label: "CHECK OUT", - color: Colors.blueAccent, - textColor: Colors.white, - onTap: (() { - Navigator.push( - context, FadePage(page: OrderPreviewPage(widget.addresses))); - }), - disabled: isAgree ? false : true, - )*/ - ], - ), - ) - ], - ) - : Container(), - )); - } -} diff --git a/lib/pages/pharmacies/screens/cart-order-preview.dart b/lib/pages/pharmacies/screens/cart-order-preview.dart deleted file mode 100644 index aed2dbc5..00000000 --- a/lib/pages/pharmacies/screens/cart-order-preview.dart +++ /dev/null @@ -1,815 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/payment-checkout-data.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/address-select-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/payment-method-select-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductOrderPreviewItem.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:flutter/scheduler.dart'; - -class OrderPreviewPage extends StatelessWidget { - final List addresses; - - OrderPreviewPage(this.addresses); - - @override - Widget build(BuildContext context) { - PreferredSizeWidget appBarWidget = AppBarWidget("Check out", null, true); - final mediaQuery = MediaQuery.of(context); - final height = mediaQuery.size.height - - appBarWidget.preferredSize.height - - mediaQuery.padding.top; - - return BaseView( - onModelReady: (model) => model.getShoppingCart(), - builder: (_, model, wi) => ChangeNotifierProvider.value( - value: model.paymentCheckoutData, - child: AppScaffold( - title: "Check out", - isShowAppBar: true, - isShowDecPage: false, - appBarWidget: appBarWidget, - backgroundColor: Colors.white, - baseViewModel: model, - body: Container( - height: height * 0.90, - child: SingleChildScrollView( - child: Container( - color: Color(0xFFF1F1F1), - child: Column( - children: [ - SelectAddressWidget(model, addresses), - SizedBox( - height: 10, - ), - SelectPaymentOptionWidget(model), - SizedBox( - height: 10, - ), - Consumer( - builder: (ctx, paymentData, _) => - paymentData.lacumInformation != null - ? Container( - child: Column( - children: [ - LakumWidget(model), - SizedBox( - height: 10, - ), - ], - ), - ) - : Container()), - Container( - color: Colors.white, - width: double.infinity, - padding: EdgeInsets.all(8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context).reviewOrder, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ...List.generate( - model.cartResponse.shoppingCarts != null - ? model.cartResponse.shoppingCarts.length - : 0, - (index) => ProductOrderPreviewItem( - model.cartResponse.shoppingCarts[index]), - ), - ], - ), - ), - Container( - width: double.infinity, - padding: EdgeInsets.all(8), - child: model.cartResponse.subtotal != null - ? Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context) - .orderSummary, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - SizedBox( - height: 20, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - "Subtotal", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - "Shipping", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - Texts( - "SAR ${(model.totalAdditionalShippingCharge).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - "VAT (15%)", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - Texts( - "SAR ${(model.cartResponse.subtotalVatAmount).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - TranslationBase.of(context).total, - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ], - ), - SizedBox( - height: 10, - ), - ], - ) - : Container(), - ) - ], - ), - ), - ), - ), - bottomSheet: Container( - height: model.cartResponse.shoppingCarts != null ? height * 0.10 : 0, - color: Colors.white, - child: PaymentBottomWidget(model), - ), - ), - )); - } -} - -class SelectAddressWidget extends StatefulWidget { - final OrderPreviewViewModel model; - final List addresses; - - SelectAddressWidget(this.model, this.addresses); - - @override - _SelectAddressWidgetState createState() => _SelectAddressWidgetState(); -} - -class _SelectAddressWidgetState extends State { - Addresses address; - - _navigateToAddressPage() { - Navigator.push( - context, FadePage(page: AddressSelectPageTest(widget.addresses))) - .then((result) { - address = result; - widget.model.paymentCheckoutData.address = address; - widget.model.getInformationsByAddress(); - /* setState(() { - if (result != null) { - address = result; - widget.model.paymentCheckoutData.address = address; - widget.model.getInformationsByAddress(); - } - })*/ - }); - } - - @override - void initState() { - if (widget.model.paymentCheckoutData.address != null) { - address = widget.model.paymentCheckoutData.address; - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Consumer( - builder: (ctx, paymentData, _) => Container( - color: Colors.white, - child: address == null - ? InkWell( - onTap: () => {_navigateToAddressPage()}, - child: Container( - margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/ic_shipping_address.png", - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - Expanded( - child: Container( - padding: - EdgeInsets.symmetric(vertical: 0, horizontal: 6), - child: Texts( - TranslationBase.of(context).selectAddress, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Color(0xff0000ff), - ), - ), - ), - Icon( - Icons.arrow_forward_ios, - size: 20, - color: Colors.grey.shade400, - ), - ], - ), - ), - ) - : Container( - child: Container( - margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/ic_shipping_mark.png", - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric( - vertical: 0, horizontal: 6), - child: Texts( - TranslationBase.of(context).shippingAddress, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - ), - InkWell( - onTap: () => {_navigateToAddressPage()}, - child: Texts( - TranslationBase.of(context).changeAddress, - fontSize: 12, - fontWeight: FontWeight.normal, - color: Color(0xff0000ff), - ), - ), - ], - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Texts( - "${address.firstName} ${address.lastName}", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Texts( - "${address.address1} ${address.address2} ${address.address2},, ${address.city}, ${address.country} ${address.zipPostalCode}", - fontSize: 12, - fontWeight: FontWeight.normal, - color: Colors.grey.shade500, - ), - ), - Row( - children: [ - Container( - margin: const EdgeInsets.only(right: 8), - child: Icon( - Icons.phone, - size: 20, - color: Colors.black, - ), - ), - Texts( - "${address.phoneNumber}", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.grey, - ), - ], - ), - Container( - margin: EdgeInsets.symmetric(vertical: 8), - child: SizedBox( - height: 2, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - ), - Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/ic_shipping_truck.png", - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - Container( - padding: EdgeInsets.symmetric( - vertical: 0, horizontal: 6), - child: Texts( - "SHIP BY:", - fontSize: 12, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - Container( - child: Image.asset( - paymentData.shippingOption - .shippingRateComputationMethodSystemName == - "Shipping.FixedOrByWeight" - ? "assets/images/pharmacy_module/payment/hmg_shipping_logo.png" - : "assets/images/pharmacy_module/payment/aramex_shipping_logo.png", - fit: BoxFit.contain, - ), - margin: EdgeInsets.symmetric(horizontal: 8), - ), - ], - ), - ], - ), - ), - ), // ic_shipping_mark.png - ), - ); - } -} - -class SelectPaymentOptionWidget extends StatefulWidget { - final OrderPreviewViewModel model; - - SelectPaymentOptionWidget(this.model); - - @override - _SelectPaymentOptionWidgetState createState() => - _SelectPaymentOptionWidgetState(); -} - -class _SelectPaymentOptionWidgetState extends State { - PaymentOption paymentOption; - - _navigateToPaymentOption() { - Navigator.push(context, FadePage(page: PaymentMethodSelectPage())) - .then((result) => { - setState(() { - if (result != null) { - paymentOption = result; - widget.model.paymentCheckoutData.paymentOption = - paymentOption; - widget.model.paymentCheckoutData.updateData(); - } - }) - }); - } - - @override - void initState() { - if (widget.model.paymentCheckoutData.paymentOption != null) { - paymentOption = widget.model.paymentCheckoutData.paymentOption; - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - child: paymentOption == null - ? InkWell( - onTap: () => {_navigateToPaymentOption()}, - child: Container( - margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/ic_payment_option.png", - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - Expanded( - child: Container( - padding: - EdgeInsets.symmetric(vertical: 0, horizontal: 6), - child: Texts( - TranslationBase.of(context).selectPaymentOption, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Color(0xff0000ff), - ), - ), - ), - Icon( - Icons.arrow_forward_ios, - size: 20, - color: Colors.grey.shade400, - ), - ], - ), - ), - ) - : Container( - margin: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/ic_payment_option.png", - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 8), - padding: EdgeInsets.symmetric(horizontal: 4, vertical: 0), - decoration: new BoxDecoration( - color: Colors.grey.shade100, - shape: BoxShape.rectangle, - ), - child: Image.asset( - widget.model.getPaymentOptionImage(paymentOption), - width: 30.0, - height: 30.0, - fit: BoxFit.scaleDown, - ), - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 6), - child: Texts( - widget.model.getPaymentOptionName(paymentOption), - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - ), - InkWell( - onTap: () => {_navigateToPaymentOption()}, - child: Texts( - TranslationBase.of(context).changeMethod, - fontSize: 12, - fontWeight: FontWeight.normal, - color: Color(0xff0000ff), - ), - ), - ], - ), - ), - ); - } -} - -class LakumWidget extends StatefulWidget { - final OrderPreviewViewModel model; - - LakumWidget(this.model); - - @override - _LakumWidgetState createState() => _LakumWidgetState(); -} - -class _LakumWidgetState extends State { - TextEditingController _pointsController = new TextEditingController(); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/lakum_checkout.png", - width: 30.0, - fit: BoxFit.scaleDown, - ), - Container( - decoration: BoxDecoration(color: Color(0x99ffffff)), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "Lakum Points", - fontSize: 12, - fontWeight: FontWeight.bold, - ), - Texts( - "${widget.model.paymentCheckoutData.lacumInformation.lakumInquiryInformationObjVersion.pointsBalanceAmount}", - fontSize: 12, - fontWeight: FontWeight.normal, - ), - ], - ), - ), - Expanded( - child: Container( - decoration: BoxDecoration(color: Color(0x99ffffff)), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Texts( - "Riyal", - fontSize: 12, - fontWeight: FontWeight.bold, - ), - Container( - margin: EdgeInsets.only(left: 4), - width: 60, - height: 40, - child: TextField( - decoration: InputDecoration( - border: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.black, width: 0.2), - gapPadding: 0, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8)), - ), - disabledBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.black, width: 0.4), - gapPadding: 0, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8)), - ), - ), - controller: _pointsController, - keyboardType: TextInputType.number, - style: TextStyle( - fontSize: 14, - color: widget - .model - .paymentCheckoutData - .lacumInformation - .lakumInquiryInformationObjVersion - .pointsBalanceAmount > - 0 - ? Colors.black - : Colors.grey, - ), - enabled: widget - .model - .paymentCheckoutData - .lacumInformation - .lakumInquiryInformationObjVersion - .pointsBalanceAmount == - 0 - ? false - : true, - onChanged: (val) { - var value = int.tryParse(val); - if (value != null && - value <= - widget - .model - .paymentCheckoutData - .lacumInformation - .lakumInquiryInformationObjVersion - .pointsBalanceAmount) { - widget.model.paymentCheckoutData.usedLakumPoints = - value; - } else { - widget.model.paymentCheckoutData.usedLakumPoints = 0; - } - _pointsController.text = - "${widget.model.paymentCheckoutData.usedLakumPoints}"; - }, - ), - ), - Container( - height: 40, - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), - decoration: new BoxDecoration( - color: Color(0xff3666E0), - shape: BoxShape.rectangle, - borderRadius: BorderRadius.only( - topRight: Radius.circular(6), - bottomRight: Radius.circular(6)), - border: Border.fromBorderSide(BorderSide( - color: Color(0xff3666E0), - width: 0.8, - )), - ), - child: Texts( - "USE", - fontSize: 12, - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} - -class PaymentBottomWidget extends StatelessWidget { - final OrderPreviewViewModel model; - - PaymentBottomWidget(this.model); - - @override - Widget build(BuildContext context) { - final scaffold = Scaffold.of(context); - - return Container( - margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0), - child: Consumer( - builder: (ctx, paymentData, _) => paymentData.cartDataVisible - ? Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: - EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Row( - children: [ - Texts( - "SAR ${(model.cartResponse.subtotal).toStringAsFixed(2)}", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Color(0xff929295), - ), - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 4), - child: Texts( - "(inclusive VAT)", - fontSize: 8, - color: Color(0xff929295), - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ), - Texts( - "${model.cartResponse.quantityCount} item(s)", - fontSize: 10, - color: Colors.grey, - fontWeight: FontWeight.bold, - ), - ], - ), - Container( - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide( - color: Color(0xff929295), - width: 1, - ), - ), - onPressed: (paymentData.address != null && - paymentData.paymentOption != null) - ? () => { - model.makeOrder().then((_) { - if (model.state != ViewState.Idle) { - SnackBar snackBar = SnackBar( - content: Text( - 'Order has been placed successfully!!')); - scaffold.showSnackBar(snackBar); - } - - // Navigator.pushAndRemoveUntil( - // context, - // MaterialPageRoute( - // builder: (context) => - // PharmacyPage()), - // (Route r) => false); - }) - } - : null, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 16), - child: new Text( - "PROCEED TO PAY", - style: new TextStyle( - color: (paymentData.address != null && - paymentData.paymentOption != null) - ? Colors.white - : Colors.grey.shade400, - fontWeight: FontWeight.bold, - fontSize: 12), - ), - ), - color: (paymentData.address != null && - paymentData.paymentOption != null) - ? Colors.green - : Color(0xff929295), - disabledColor: (paymentData.address != null && - paymentData.paymentOption != null) - ? Colors.green - : Color(0xff929295), - ), - ), - ], - ), - ) - : Container(), - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart b/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart deleted file mode 100644 index fc1270c0..00000000 --- a/lib/pages/pharmacies/screens/lacum-activitaion-vida-page.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; - -import 'lacum-registration-page.dart'; - -class LakumActivationVidaPage extends StatelessWidget { - TextEditingController _identificationNumberController = - new TextEditingController(); - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - return BaseView( - builder: (_, model, wi) => AppScaffold( - title: "Acount Activation", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - baseViewModel: model, - body: Container( - margin: EdgeInsets.symmetric(vertical: 16, horizontal: 12), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Texts( - " This service allows you to activate your LAKUM account after registering through the Vida system. ", - fontSize: 14, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: _identificationNumberController, - decoration: new InputDecoration( - hintText: 'Enter Identification Number', - ), - style: TextStyle( - fontSize: 16, - color: Colors.grey.shade700, - ), - ), - ), - ], - ), - Container( - margin: EdgeInsets.only(top: 4), - child: BorderedButton( - TranslationBase.of(context).accountActivation, - backgroundColor: - _identificationNumberController.text != null && - _identificationNumberController.text != "" - ? Color(0xff60686b) - : Color(0xffb0b4b5), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: _identificationNumberController.text != null && - _identificationNumberController.text != "" - ? () { - model - .checkLacumAccountActivation( - _identificationNumberController.text) - .then((_) => { - if (model.state == ViewState.Idle) - { - Navigator.push( - context, - FadePage( - page: LakumRegistrationPage( - _identificationNumberController - .text))) - .then((status) => { - if (status == 200) - {Navigator.pop(context, "")} - // back to previous page - }) - } - }); - } - : null, - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/lacum-registration-page.dart b/lib/pages/pharmacies/screens/lacum-registration-page.dart deleted file mode 100644 index 53b9705d..00000000 --- a/lib/pages/pharmacies/screens/lacum-registration-page.dart +++ /dev/null @@ -1,236 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; -import 'package:diplomaticquarterapp/models/id-name-pair.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/dialogs/radio-group-dialog.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; - -import 'lakum-terms-conditions-page.dart'; - -class LakumRegistrationPage extends StatefulWidget { - final String patientIdentificationNo; - - LakumRegistrationPage(this.patientIdentificationNo); - - @override - _LakumRegistrationPageState createState() => _LakumRegistrationPageState(); -} - -class _LakumRegistrationPageState extends State { - final TextEditingController _firstNameController = TextEditingController(); - - final TextEditingController _lastNameController = TextEditingController(); - - final TextEditingController _mobileNumberController = TextEditingController(); - - List languages = List(); - - IdNamePair selectedLanguage; - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); - languages.clear(); - languages.add(IdNamePair(1, TranslationBase.of(context).arabic)); - languages.add(IdNamePair(2, TranslationBase.of(context).english)); - - bool canSubmit = _firstNameController.text != null && - _firstNameController.text != "" && - _lastNameController.text != null && - _lastNameController.text != "" && - _mobileNumberController.text != null && - _mobileNumberController.text != "" && - selectedLanguage != null; - - return BaseView( - builder: (_, model, wi) => AppScaffold( - title: "Register Lakum", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - appBarWidget: appBarWidget, - baseViewModel: model, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: SizedBox( - height: mediaQuery.size.height - - appBarWidget.preferredSize.height - - mediaQuery.padding.top, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - Column( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", - fit: BoxFit.fill, - height: 150, - width: mediaQuery.size.width, - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context).firstName, - fontSize: 13, - fontWeight: FontWeight.normal, - color: Color(0xff8a8a8a), - ), - TextField( - controller: _firstNameController, - style: TextStyle( - fontSize: 16, - color: Colors.black, - ), - ), - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context).lastName, - fontSize: 13, - fontWeight: FontWeight.normal, - color: Color(0xff8a8a8a), - ), - TextField( - controller: _lastNameController, - style: TextStyle( - fontSize: 16, - color: Colors.black, - ), - ), - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context).mobileNumber, - fontSize: 13, - fontWeight: FontWeight.normal, - color: Color(0xff8a8a8a), - ), - TextField( - controller: _mobileNumberController, - style: TextStyle( - fontSize: 16, - color: Colors.black, - ), - ), - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context) - .prefferedLanguage, - fontSize: 13, - fontWeight: FontWeight.normal, - color: Color(0xff8a8a8a), - ), - InkWell( - onTap: () { - RadioGroupDialog dialog = - new RadioGroupDialog( - context: context, - title: TranslationBase.of(context) - .prefferedLanguage, - okText: - TranslationBase.of(context) - .confirm, - cancelText: - TranslationBase.of(context) - .cancel_nocaps, - list: languages, - okFunction: (selectedValue) { - setState(() { - selectedLanguage = - selectedValue; - }); - print( - "selectedLanguage = ${selectedValue.name}"); - }, - cancelFunction: () => {}); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - }, - child: TextField( - enabled: false, - decoration: InputDecoration( - suffixIcon: - Icon(Icons.arrow_drop_down), - hintText: selectedLanguage == null - ? "${TranslationBase.of(context).prefferedLanguage}" - : "${selectedLanguage.name}", - hintStyle: TextStyle( - fontSize: 16, - color: Colors.black, - )), - style: TextStyle( - fontSize: 16, - color: Colors.grey.shade700, - ), - ), - ), - ], - ), - ), - ], - ), - Container( - color: Colors.green, - margin: EdgeInsets.all(8), - child: BorderedButton( - TranslationBase.of(context).register, - backgroundColor: canSubmit - ? Color(0xff339933) - : Color(0xff99cc99), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: canSubmit - ? () { - Navigator.push( - context, - FadePage( - page: LakumTermsConditions( - widget - .patientIdentificationNo, - _firstNameController.text, - _lastNameController.text, - _mobileNumberController - .text, - selectedLanguage.id))) - .then((status) => { - if (status == 200) - {Navigator.pop(context, "")} - // back to previous page - }); - } - : null, - ), - ), - ], - ), - ), - ), - ), - )); - } -} diff --git a/lib/pages/pharmacies/screens/lacum-setting-page.dart b/lib/pages/pharmacies/screens/lacum-setting-page.dart deleted file mode 100644 index 91e4c965..00000000 --- a/lib/pages/pharmacies/screens/lacum-setting-page.dart +++ /dev/null @@ -1,240 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; - -class LakumSettingPage extends StatefulWidget { - final LacumAccountInformation lacumInformation; - final LacumAccountInformation lacumGroupInformation; - - LakumSettingPage(this.lacumInformation, this.lacumGroupInformation); - - @override - _LakumSettingPageState createState() => _LakumSettingPageState(); -} - -class _LakumSettingPageState extends State { - bool _lakumAccountActivated = false; - TextEditingController _nameController = new TextEditingController(); - TextEditingController _phoneController = new TextEditingController(); - - @override - void initState() { - _lakumAccountActivated = widget.lacumGroupInformation - .lakumInquiryInformationObjVersion.accountStatus == - "Active"; - super.initState(); - _nameController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName; - _phoneController.text = widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber; - } - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); - - return BaseView( - onModelReady: (model) => model.setLakumData( - widget.lacumInformation, widget.lacumGroupInformation), - builder: (_, model, wi) => AppScaffold( - title: "Lakum", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - appBarWidget: appBarWidget, - baseViewModel: model, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: SizedBox( - height: mediaQuery.size.height - - appBarWidget.preferredSize.height - - mediaQuery.padding.top, - child: _buildSettingScreen(mediaQuery, model), - ), - ), - ), - ), - ); - } - - _buildSettingScreen(MediaQueryData mediaQuery, LacumViewModel model) { - bool canUpdate = (_nameController.text != "" && - _phoneController.text != "" && - (_nameController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName || - _phoneController.text != widget.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber)); - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - height: mediaQuery.size.height * 0.15, - color: Colors.green, - ), - Column( - children: [ - SizedBox( - height: mediaQuery.size.height * 0.05, - ), - Container( - width: mediaQuery.size.width * 1, - child: LakumBannerWidget(model, mediaQuery, false)), - ], - ) - ], - ), - SizedBox( - height: 20, - ), - SizedBox( - height: 1, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts( - "Activate LAKUM Account", - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - Switch.adaptive( - activeColor: Color.fromRGBO(51, 153, 51, 1), - inactiveThumbColor: Colors.red, - activeTrackColor: Colors.grey, - inactiveTrackColor: Colors.grey, - value: _lakumAccountActivated, - onChanged: (val) { - if (_lakumAccountActivated) { - model.makeAccountDeactivate(); - } else { - model.makeAccountActivate(); - } - setState(() { - _lakumAccountActivated = val; - }); - }, - ), - ], - ), - ), - SizedBox( - height: 30, - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context).name, - fontSize: 13, - fontWeight: _lakumAccountActivated - ? FontWeight.bold - : FontWeight.normal, - color: Colors.grey.shade400, - ), - _lakumAccountActivated - ? TextField( - controller: _nameController, - enabled: _lakumAccountActivated ? true : false, - style: TextStyle( - fontSize: 16, - color: _lakumAccountActivated - ? Colors.black - : Colors.white38, - ), - ) - : Texts( - _nameController.text, - fontSize: 16, - color: Colors.grey.shade600, - ), - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context).mobileNumber, - fontSize: 13, - fontWeight: _lakumAccountActivated - ? FontWeight.bold - : FontWeight.normal, - color: Colors.grey.shade400, - ), - _lakumAccountActivated - ? TextField( - controller: _phoneController, - enabled: _lakumAccountActivated ? true : false, - keyboardType: TextInputType.phone, - style: TextStyle( - fontSize: 16, - color: _lakumAccountActivated - ? Colors.black - : Colors.white38, - ), - ) - : Texts( - _phoneController.text, - fontSize: 16, - color: Colors.grey.shade600, - ), - ], - ), - ), - ], - ), - Container( - child: Column( - children: [ - SizedBox( - height: 2, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - Container( - margin: EdgeInsets.all(8), - child: BorderedButton( - TranslationBase.of(context).save, - backgroundColor: - canUpdate ? Color(0xff60686b) : Color(0xffb0b4b5), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: canUpdate - ? () { - model.createLakumAccount(_nameController.text, _phoneController.text).then((status) => { - if (status == 200) {Navigator.pop(context, "")} - // back to previous page - }); - } - : null, - ), - ) - ], - ), - ), - ], - ); - } -} diff --git a/lib/pages/pharmacies/screens/lacum-transfer-page.dart b/lib/pages/pharmacies/screens/lacum-transfer-page.dart deleted file mode 100644 index 0671f80a..00000000 --- a/lib/pages/pharmacies/screens/lacum-transfer-page.dart +++ /dev/null @@ -1,317 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/LacumAccountInformation.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-trasnfer-viewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; - -class LacumTransferPage extends StatefulWidget { - final LacumAccountInformation lacumInformation; - final LacumAccountInformation lacumGroupInformation; - - LacumTransferPage(this.lacumInformation, this.lacumGroupInformation); - - @override - _LacumTransferPageState createState() => _LacumTransferPageState(); -} - -class _LacumTransferPageState extends State { - TextEditingController _beneficieryAccountController = - new TextEditingController(); - TextEditingController _transferPointsController = new TextEditingController(); - - @override - void initState() { - super.initState(); - _beneficieryAccountController.text = ""; - _transferPointsController.text = "0"; - } - - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); - - return BaseView( - onModelReady: (model) => model.setLakumData( - widget.lacumInformation, widget.lacumGroupInformation), - builder: (_, model, wi) => AppScaffold( - title: "Lakum", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - appBarWidget: appBarWidget, - baseViewModel: model, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: SizedBox( - height: - mediaQuery.size.height - 58 - mediaQuery.padding.top, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Row( - children: [ - Container( - height: 100, - width: mediaQuery.size.width / 2 - 26, - padding: EdgeInsets.only( - top: 12, left: 8, right: 8, bottom: 4), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: Color(0xff6294ed), - ), - child: Row( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Column( - children: [ - Container( - child: Texts( - "Point Balance", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ], - ), - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric( - vertical: 8), - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Texts( - "0", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ], - ), - ), - ) - ], - ), - ), - SizedBox( - width: 20, - ), - Container( - height: 100, - width: mediaQuery.size.width / 2 - 26, - padding: EdgeInsets.only( - top: 12, left: 8, right: 8, bottom: 4), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: Color(0xff339933), - ), - child: Row( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Column( - children: [ - Container( - child: Texts( - "Riyal Balance", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ], - ), - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric( - vertical: 8), - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Texts( - "0", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ], - ), - ), - ) - ], - ), - ), - ], - ), - Container( - margin: EdgeInsets.only(top: 16), - child: TextField( - controller: _beneficieryAccountController, - decoration: new InputDecoration( - hintText: 'Enter Beneficiary Account No.', - ), - style: TextStyle( - fontSize: 16, - color: Colors.grey.shade700, - ), - ), - ), - Container( - margin: EdgeInsets.only(top: 4), - child: BorderedButton( - TranslationBase.of(context).checkBeneficiary, - backgroundColor: - _beneficieryAccountController.text != "" - ? Color(0xff60686b) - : Color(0xffb0b4b5), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: - _beneficieryAccountController.text != "" - ? () { - model.getLacumGroupDataBuAccountId( - _beneficieryAccountController - .text); - } - : null, - ), - ), - (model.lacumReceiverInformation != null && - model.lacumReceiverInformation - .lakumInquiryInformationObjVersion != - null) - ? Container( - margin: EdgeInsets.only(top: 8), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context) - .beneficiaryName, - color: Colors.black, - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8), - child: TextField( - enabled: false, - decoration: new InputDecoration( - hintText: - "${model.lacumReceiverInformation.lakumInquiryInformationObjVersion.memberName}", - hintStyle: TextStyle( - fontSize: 16, - color: Colors.grey.shade600, - )), - style: TextStyle( - fontSize: 16, - color: Colors.grey.shade700, - ), - ), - ), - SizedBox( - height: 10, - width: double.infinity, - ), - Texts( - "Point's to Transfer :", - color: Colors.black, - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8), - child: TextField( - controller: - _transferPointsController, - decoration: new InputDecoration( - focusColor: Colors.green, - hintStyle: TextStyle( - fontSize: 16, - color: Colors.grey.shade600, - )), - style: TextStyle( - fontSize: 16, - color: Colors.grey.shade700, - ), - ), - ), - ], - ), - ) - : Container() - ], - ), - if (model.lacumReceiverInformation != null && - model.lacumReceiverInformation - .lakumInquiryInformationObjVersion != - null) - Container( - margin: EdgeInsets.all(8), - child: BorderedButton( - "LACUM TRANSFER", - backgroundColor: Color(0xff339933), - textColor: Colors.white, - fontSize: 18, - hPadding: 8, - radius: 12, - vPadding: 16, - fontWeight: FontWeight.w600, - handler: () { - model - .transferYaHalaLoyaltyPoints( - _transferPointsController.text) - .then((status) => { - if (status == 200) - {Navigator.pop(context, "")} - // back to previous page - }); - }, - ), - ) - ], - ), - ), - ), - ), - ), - )); - } -} diff --git a/lib/pages/pharmacies/screens/lakum-main-page.dart b/lib/pages/pharmacies/screens/lakum-main-page.dart deleted file mode 100644 index adbb07c2..00000000 --- a/lib/pages/pharmacies/screens/lakum-main-page.dart +++ /dev/null @@ -1,555 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-setting-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/lacum-transfer-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-points-year-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lacum-banner-widget.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; - -import 'lacum-activitaion-vida-page.dart'; - -class LakumMainPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - return BaseView( - onModelReady: (model) => model.getLacumData(), - builder: (_, model, wi) => AppScaffold( - title: "Lakum", - isShowAppBar: true, - isPharmacy: true, - isShowDecPage: false, - backgroundColor: Colors.white, - baseViewModel: model, - appBarIcons: _buildAppBarICons(context, model), - // preferredSize: mediaQuery.size.height * 0.20, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: (model.lacumGroupInformation != null && - model.lacumGroupInformation - .lakumInquiryInformationObjVersion != - null) - ? Column( - children: [ - Stack( - children: [ - Container( - height: mediaQuery.size.height * 0.15, - color: Colors.green, - ), - Column( - children: [ - SizedBox( - height: mediaQuery.size.height * 0.05, - ), - Container( - width: mediaQuery.size.width * 1, - child: LakumBannerWidget( - model, mediaQuery, true)), - ], - ) - ], - ), - SizedBox( - height: 20, - ), - LakumHomeButtons(mediaQuery, model), - SizedBox( - height: 20, - ), - Container( - height: 100, - margin: EdgeInsets.symmetric(horizontal: 16), - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - LacumPointsWidget( - mediaQuery, - 1, - TranslationBase.of(context).balance, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .pointsBalanceAmount, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .pointsBalance, - null), - SizedBox( - width: 8, - ), - LacumPointsWidget( - mediaQuery, - 2, - TranslationBase.of(context).gained, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .pointsBalanceAmount, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .gainedPoints, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .gainedPointsAmountPerYear), - SizedBox( - width: 8, - ), - LacumPointsWidget( - mediaQuery, - 3, - TranslationBase.of(context).consumed, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .consumedPointsAmount != - null - ? int.parse(model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .consumedPointsAmount) - : 0, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .consumedPoints, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .consumedPointsAmountPerYear), - SizedBox( - width: 8, - ), - LacumPointsWidget( - mediaQuery, - 4, - TranslationBase.of(context).transferred, - 0, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .transferPoints, - model - .lacumGroupInformation - .lakumInquiryInformationObjVersion - .transferPointsAmountPerYear), - ], - ), - ), - SizedBox( - height: 20, - ), - SizedBox( - height: 8, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - Container( - margin: EdgeInsets.symmetric( - vertical: 16, horizontal: 8), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/expired_icon.png", - fit: BoxFit.fill, - width: 25, - height: 25, - ), - Padding( - padding: - EdgeInsets.symmetric(horizontal: 8), - child: Texts( - "Expired", - fontSize: 14, - ), - ) - ], - ), - Texts( - "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.expiredPoints} Points", - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ], - ), - ), - SizedBox( - height: 2, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - Container( - margin: EdgeInsets.symmetric( - vertical: 16, horizontal: 8), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/waiting_gained_icon.png", - fit: BoxFit.fill, - width: 20, - height: 25, - ), - Padding( - padding: - EdgeInsets.symmetric(horizontal: 8), - child: Texts( - "Waiting gained", - fontSize: 14, - ), - ) - ], - ), - Texts( - "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.waitingPoints} Points", - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ], - ), - ), - SizedBox( - height: 2, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - Container( - margin: EdgeInsets.symmetric( - vertical: 16, horizontal: 8), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/will_be_expired_icon.png", - fit: BoxFit.fill, - width: 25, - height: 25, - ), - Padding( - padding: - EdgeInsets.symmetric(horizontal: 8), - child: Texts( - "Will Be Expired", - fontSize: 14, - ), - ) - ], - ), - Texts( - "${model.lacumGroupInformation.lakumInquiryInformationObjVersion.pointsWillBeExpired} Points", - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ], - ), - ), - SizedBox( - height: 2, - width: double.infinity, - child: Container( - color: Color(0xffefefef), - ), - ), - ], - ) - : Container(), - ), - ), - )); - } -} - -List _buildAppBarICons(BuildContext context, LacumViewModel model) { - return [ - IconButton( - icon: Icon(Icons.settings), - color: Colors.white, - onPressed: () { - Navigator.push( - context, - FadePage( - page: LakumSettingPage( - model.lacumInformation, model.lacumGroupInformation))) - .then((result) => {model.getLacumGroupData()}); - }, - ), - ]; -} - -class LakumHomeButtons extends StatelessWidget { - final MediaQueryData mediaQuery; - final LacumViewModel model; - - LakumHomeButtons(this.mediaQuery, this.model); - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.symmetric(horizontal: 16), - child: Row( - children: [ - Expanded( - child: InkWell( - onTap: () { - print("Account activate click"); - Navigator.push( - context, FadePage(page: LakumActivationVidaPage())) - .then((result) => {model.getLacumGroupData()}); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: Color(0xffe1e1e1)), - height: mediaQuery.size.height * 0.08, - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/Account_activation_icon.png", - fit: BoxFit.fill, - width: 30, - height: 30, - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Texts( - "Account Activation", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - ) - ], - ), - ), - ), - ), - SizedBox( - width: 8, - ), - Expanded( - child: InkWell( - onTap: () { - print("Lacum transfer click"); - Navigator.push( - context, - FadePage( - page: LacumTransferPage(model.lacumInformation, - model.lacumGroupInformation))) - .then((result) => {model.getLacumGroupData()}); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: Color(0xffe1e1e1)), - height: mediaQuery.size.height * 0.08, - child: Row( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/Lakum_transfer_icon.png", - fit: BoxFit.fill, - width: 35, - height: 30, - ), - Expanded( - child: Container( - padding: EdgeInsets.symmetric(horizontal: 16), - child: Texts( - "Lakum Transfer", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - ) - ], - ), - ), - ), - ), - ], - ), - ); - } -} - -class LacumPointsWidget extends StatelessWidget { - final MediaQueryData mediaQuery; - final int pointType; // 1. balance, 2. gained, 3. consume, 4. transfer - final String title; - final int riyal; - final int point; - Color titleColor; - final List pointsAmountPerYear; - - LacumPointsWidget(this.mediaQuery, this.pointType, this.title, this.riyal, - this.point, this.pointsAmountPerYear) { - if (pointType == 1) { - titleColor = Color(0xffefefef); - } else if (pointType == 2) { - titleColor = Color(0xff004bcc); - } else if (pointType == 3) { - titleColor = Color(0xff339933); - } else { - titleColor = Color(0xffffa500); - } - } - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: () { - if (pointType != 1) { - if (pointsAmountPerYear != null && pointsAmountPerYear.length > 0) { - Navigator.push(context, - FadePage(page: LakumPointsYearPage(pointsAmountPerYear))); - } else { - // show snackBar No Details Points are there - } - } - }, - child: Container( - width: mediaQuery.size.width / 2 - 16, - padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: pointType == 1 ? Color(0xff004bcc) : Color(0xffefefef), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Texts( - title, - fontSize: 14, - fontWeight: FontWeight.bold, - color: titleColor, - ), - ), - if (pointType != 1) - Icon( - Icons.arrow_forward, - color: titleColor, - ) - ], - ), - ], - ), - ), - Expanded( - child: Row( - children: [ - if (pointType != 4) - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "RIYAL", - fontSize: 13, - fontWeight: FontWeight.bold, - color: pointType == 1 ? Colors.white : Colors.black, - ), - SizedBox( - height: 4, - ), - Texts( - "$riyal", - fontSize: 13, - fontWeight: FontWeight.bold, - color: pointType == 1 ? Colors.white : Colors.black, - ), - ], - ), - ), - if (pointType != 4) - SizedBox( - child: Container( - color: pointType == 1 ? Colors.white : Colors.grey, - ), - width: 1, - ), - Expanded( - child: Container( - margin: EdgeInsets.only(left: 4), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "POINT", - fontSize: 12, - fontWeight: FontWeight.bold, - color: pointType == 1 ? Colors.white : Colors.black, - ), - SizedBox( - height: 4, - ), - Texts( - "$point", - fontSize: 12, - fontWeight: FontWeight.bold, - color: pointType == 1 ? Colors.white : Colors.black, - ), - ], - ), - ), - ), - ], - ), - ) - ], - ), - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/lakum-points-month-page.dart b/lib/pages/pharmacies/screens/lakum-points-month-page.dart deleted file mode 100644 index 47270eee..00000000 --- a/lib/pages/pharmacies/screens/lakum-points-month-page.dart +++ /dev/null @@ -1,271 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerMonth.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class LakumPointMonthPage extends StatefulWidget { - final PointsAmountPerMonth pointsAmountPerMonth; - final int year; - int expandedItemIndex = -1; - - LakumPointMonthPage(this.pointsAmountPerMonth, this.year); - - @override - _LakumPointsMonthPageState createState() => _LakumPointsMonthPageState(); -} - -class _LakumPointsMonthPageState extends State { - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - return BaseView( - builder: (_, model, wi) => AppScaffold( - title: "Lakum points", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - baseViewModel: model, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - height: mediaQuery.size.height * 0.25, - child: Stack( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", - fit: BoxFit.fill, - width: mediaQuery.size.width * 1.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Container( - height: mediaQuery.size.height * 0.06, - margin: EdgeInsets.symmetric( - vertical: 16, horizontal: 24), - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context).month, - color: Colors.grey.shade600, - fontSize: 16, - ), - Texts( - "${widget.pointsAmountPerMonth.month}, ${widget.year}", - color: Colors.grey.shade700, - fontWeight: FontWeight.bold, - fontSize: 16, - ), - ], - ), - ), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Texts( - TranslationBase.of(context).point, - color: Colors.grey.shade600, - fontSize: 16, - ), - Texts( - "${widget.pointsAmountPerMonth.pointsPerMonth}", - color: Colors.grey.shade700, - fontWeight: FontWeight.bold, - fontSize: 16, - ), - ], - ), - ), - SizedBox( - child: Container( - color: Colors.grey, - ), - width: 1, - ), - Expanded( - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Texts( - TranslationBase.of(context).riyal, - color: Colors.grey.shade600, - fontSize: 16, - ), - Texts( - "${widget.pointsAmountPerMonth.amountPerMonth}", - color: Colors.grey.shade700, - fontWeight: FontWeight.bold, - fontSize: 16, - ), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ], - ), - ), - SizedBox( - height: 10, - ), - LakumPointTableRowWidget(true, "DAY", 0, 0, null, 0), - ...List.generate( - widget.pointsAmountPerMonth.pointsAmountPerday.length, - (index) => LakumPointTableRowWidget( - false, - widget.pointsAmountPerMonth.pointsAmountPerday[index].day, - widget.pointsAmountPerMonth.pointsAmountPerday[index] - .pointsPerDay, - widget.pointsAmountPerMonth.pointsAmountPerday[index] - .amountPerDay, - () { - setState(() { - if (widget.expandedItemIndex == index) { - widget.expandedItemIndex = -1; - } else { - widget.expandedItemIndex = index; - } - }); - }, - index, - expandFlag: widget.expandedItemIndex == index, - collapsed: Column( - children: [ - ...List.generate( - widget.pointsAmountPerMonth.pointsAmountPerday[index] - .pointsDetails.length, - (index) => DayPointsDetailWidget( - widget - .pointsAmountPerMonth - .pointsAmountPerday[index] - .pointsDetails[index] - .subTransactionTypeDescription, - widget - .pointsAmountPerMonth - .pointsAmountPerday[index] - .pointsDetails[index].purchasePoints, - widget - .pointsAmountPerMonth - .pointsAmountPerday[index] - .pointsDetails[index].amount), - ), - ], - ), - ), - ), - ], - ), - ), - ), - ), - ); - } -} - -class DayPointsDetailWidget extends StatelessWidget { - final String rowTitle; - final double points; - final double riyal; - - DayPointsDetailWidget(this.rowTitle, this.points, this.riyal); - - @override - Widget build(BuildContext context) { - return Container( - color: Color(0xffe4e4e4), - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 12), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Row( - children: [ - Expanded( - child: Container( - child: Column( - children: [ - Texts( - "TYPE", - fontSize: 12, - fontWeight: FontWeight.bold, - ), - SizedBox( - height: 4, - ), - Texts( - rowTitle, - fontSize: 14, - fontWeight: FontWeight.normal, - ), - ], - crossAxisAlignment: CrossAxisAlignment.start, - ), - )), - Expanded( - - child: Container( - child: Texts( - "$points", - fontSize: 14, - fontWeight: FontWeight.normal, - ), - )), - Expanded( - child: Container( - child: Texts( - "$riyal", - fontSize: 14, - fontWeight: FontWeight.normal, - ), - )), - Expanded(child: Container()), - ], - ), - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 1, - thickness: 1, - indent: 0, - endIndent: 0, - ), - ], - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/lakum-points-year-page.dart b/lib/pages/pharmacies/screens/lakum-points-year-page.dart deleted file mode 100644 index f7b6d9e6..00000000 --- a/lib/pages/pharmacies/screens/lakum-points-year-page.dart +++ /dev/null @@ -1,201 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/PointsAmountPerYear.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/widgets/lakum-point-table-row-widget.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:flutter/material.dart'; - -import 'lakum-points-month-page.dart'; - -class LakumPointsYearPage extends StatefulWidget { - final List pointsAmountPerYear; - int selectedIndexYear = 0; - - LakumPointsYearPage(this.pointsAmountPerYear); - - @override - _LakumPointsYearPageState createState() => _LakumPointsYearPageState(); -} - -class _LakumPointsYearPageState extends State { - @override - Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - - return BaseView( - builder: (_, model, wi) => AppScaffold( - title: "Lakum points", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - baseViewModel: model, - body: Container( - width: double.infinity, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - height: 100, - margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16), - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - ...List.generate( - widget.pointsAmountPerYear.length, - (index) => LacumPointsYearWidget( - mediaQuery, - widget.selectedIndexYear == index, - widget.pointsAmountPerYear[index], () { - setState(() { - widget.selectedIndexYear = index; - }); - })), - ], - ), - ), - SizedBox( - height: 0, - ), - LakumPointTableRowWidget(true, "MONTH", 0, 0, null, 0), - ...List.generate( - widget.pointsAmountPerYear[widget.selectedIndexYear] - .pointsAmountPerMonth.length, - (index) => LakumPointTableRowWidget( - false, - widget.pointsAmountPerYear[widget.selectedIndexYear] - .pointsAmountPerMonth[index].month, - widget.pointsAmountPerYear[widget.selectedIndexYear] - .pointsAmountPerMonth[index].pointsPerMonth, - widget.pointsAmountPerYear[widget.selectedIndexYear] - .pointsAmountPerMonth[index].amountPerMonth, - (){ - Navigator.push(context, - FadePage(page: LakumPointMonthPage(widget.pointsAmountPerYear[widget.selectedIndexYear] - .pointsAmountPerMonth[index], widget.pointsAmountPerYear[widget.selectedIndexYear].year))); - }, - index), - ), - ], - ), - ), - ), - ), - ); - } -} - -class LacumPointsYearWidget extends StatelessWidget { - final MediaQueryData mediaQuery; - final bool isSelected; - final PointsAmountPerYear yearPoints; - final Function yearOnTap; - - LacumPointsYearWidget( - this.mediaQuery, this.isSelected, this.yearPoints, this.yearOnTap); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: yearOnTap, - child: Container( - width: mediaQuery.size.width / 2 - 16, - padding: EdgeInsets.only(top: 12, left: 8, right: 8, bottom: 4), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: Color(0xffe1e1e1), - width: 0.4, - )), - color: isSelected ? Color(0xff004bcc) : Color(0xffefefef), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Texts( - "YEAR: ${yearPoints.year}", - fontSize: 14, - fontWeight: FontWeight.bold, - color: isSelected ? Colors.white : Colors.black, - ), - ), - ], - ), - ], - ), - ), - Expanded( - child: Row( - children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(left: 4), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "POINT", - fontSize: 12, - fontWeight: FontWeight.bold, - color: isSelected ? Colors.white : Colors.black, - ), - SizedBox( - height: 4, - ), - Texts( - "${yearPoints.pointsPerYear}", - fontSize: 12, - fontWeight: FontWeight.bold, - color: isSelected ? Colors.white : Colors.black, - ), - ], - ), - ), - ), - SizedBox( - child: Container( - color: isSelected ? Colors.white : Colors.grey, - ), - width: 1, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Texts( - "RIYAL", - fontSize: 13, - fontWeight: FontWeight.bold, - color: isSelected ? Colors.white : Colors.black, - ), - SizedBox( - height: 4, - ), - Texts( - "${yearPoints.amountPerYear}", - fontSize: 13, - fontWeight: FontWeight.bold, - color: isSelected ? Colors.white : Colors.black, - ), - ], - ), - ), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart b/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart deleted file mode 100644 index 30c3bb6e..00000000 --- a/lib/pages/pharmacies/screens/lakum-terms-conditions-page.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-registration-viewModel.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_html/flutter_html.dart'; -import 'package:provider/provider.dart'; - -class LakumTermsConditions extends StatelessWidget { - final String firstName, lastName, mobileNo, identificationNo; - final int languageId; - - LakumTermsConditions(this.identificationNo, this.firstName, this.lastName, - this.mobileNo, this.languageId); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - - final mediaQuery = MediaQuery.of(context); - PreferredSizeWidget appBarWidget = AppBarWidget("Lakum", null, true); - double height = mediaQuery.size.height - - appBarWidget.preferredSize.height - - mediaQuery.padding.top; - - return BaseView( - onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), - builder: (_, model, wi) => AppScaffold( - appBarTitle: "Register Lakum", - isShowAppBar: true, - isShowDecPage: false, - backgroundColor: Colors.white, - baseViewModel: model, - appBarWidget: appBarWidget, - body: Container( - margin: EdgeInsets.all(8), - width: double.infinity, - child: Stack( - children: [ - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (model.listUserAgreement != null && - model.listUserAgreement.userAgreementLAKUM != - null) - Html( - data: projectProvider.isArabic - ? model.listUserAgreement.userAgreementLAKUMn - : model.listUserAgreement.userAgreementLAKUM, - ), - ], - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - height: 50, - margin: EdgeInsets.all(8), - child: BorderedButton( - TranslationBase.of(context).acceptLbl, - backgroundColor: Color(0xff60686b), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: () { - model.createNewLakumAccount("$firstName $lastName", mobileNo, identificationNo, languageId).then((status) => { - if (status == 200) {Navigator.pop(context, "")} - // back to previous page - }); - }, - ), - ), - ), - ], - ), - ), - )); - } -} diff --git a/lib/pages/pharmacies/screens/order-preview-page.dart b/lib/pages/pharmacies/screens/order-preview-page.dart new file mode 100644 index 00000000..d9646fcf --- /dev/null +++ b/lib/pages/pharmacies/screens/order-preview-page.dart @@ -0,0 +1,48 @@ +import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/GestureIconButton.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class OrderPreviewPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + builder: (_, model, wi) => AppScaffold( + title: "Shopping Cart", + isShowAppBar: true, + isShowDecPage: false, + baseViewModel: model, + backgroundColor: Colors.white, + body: Container( + width: double.infinity, + child: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureIconButton( + TranslationBase.of(context).deleteAllItems, + Icon(Icons.delete_outline_sharp, color: Colors.grey.shade800,), + onTap: () => {}, + ), + const Divider( + color: Colors.grey, + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + + ], + ), + ), + ), + ), + ), + ); + } +} + diff --git a/lib/pages/pharmacies/screens/payment-method-select-page.dart b/lib/pages/pharmacies/screens/payment-method-select-page.dart deleted file mode 100644 index 8cdbaf3c..00000000 --- a/lib/pages/pharmacies/screens/payment-method-select-page.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/OrderPreviewViewModel.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; - -class PaymentMethodSelectPage extends StatefulWidget { - @override - _PaymentMethodSelectPageState createState() => - _PaymentMethodSelectPageState(); -} - -class _PaymentMethodSelectPageState extends State { - PaymentOption selectedPaymentOption; - - @override - Widget build(BuildContext context) { - Size screenSize = MediaQuery.of(context).size; - double cardWidth = screenSize.width / 2 - 32; - - return AppScaffold( - title: "Payment method", - isShowAppBar: true, - isShowDecPage: false, - body: Container( - width: double.infinity, - margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Texts( - TranslationBase.of(context).selectPaymentOption, - fontSize: 20, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 0, vertical: 16), - child: Column( - children: [ - Row( - children: [ - PaymentMethodCard( - cardWidth, - selectedPaymentOption, - PaymentOption.meda, - () => { - setState(() { - selectedPaymentOption = PaymentOption.meda; - }) - }), - PaymentMethodCard( - cardWidth, - selectedPaymentOption, - PaymentOption.sadad, - () => { - setState(() { - selectedPaymentOption = PaymentOption.sadad; - }) - }), - ], - ), - Row( - children: [ - PaymentMethodCard( - cardWidth, - selectedPaymentOption, - PaymentOption.visa, - () => { - setState(() { - selectedPaymentOption = PaymentOption.visa; - }) - }), - PaymentMethodCard( - cardWidth, - selectedPaymentOption, - PaymentOption.mastercard, - () => { - setState(() { - selectedPaymentOption = - PaymentOption.mastercard; - }) - }), - ], - ), - PaymentMethodCard( - (cardWidth * 2 + 32), - selectedPaymentOption, - PaymentOption.installments, - () => { - setState(() { - selectedPaymentOption = - PaymentOption.installments; - }) - }), - ], - ), - ), - ], - ), - ), - bottomSheet: Container( - height: screenSize.height * 0.08, - margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: BorderedButton( - TranslationBase.of(context).next, - backgroundColor: Color(0xff5AB154), - textColor: Colors.white, - fontSize: 16, - hPadding: 8, - vPadding: 12, - handler: selectedPaymentOption != null - ? () => {Navigator.pop(context, selectedPaymentOption)} - : null, - ), - ), - ); - } -} - -class PaymentMethodCard extends StatelessWidget { - final double cardWidth; - final PaymentOption selectedPaymentOption; - final PaymentOption paymentOption; - final Function selectMethod; - - PaymentMethodCard(this.cardWidth, this.selectedPaymentOption, - this.paymentOption, this.selectMethod); - - @override - Widget build(BuildContext context) { - bool isSelected = false; - if (selectedPaymentOption != null && - selectedPaymentOption == paymentOption) { - isSelected = true; - } - - return InkWell( - onTap: selectMethod, - child: Container( - margin: EdgeInsets.symmetric(horizontal: 2, vertical: 0), - child: Stack( - children: [ - Container( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8), - margin: EdgeInsets.symmetric(horizontal: 14, vertical: 8), - decoration: new BoxDecoration( - color: Colors.grey.shade100, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.fromBorderSide(BorderSide( - color: isSelected ? Color(0xff20BC11) : Colors.grey.shade300, - width: 0.8, - )), - ), - width: cardWidth, - child: Image.asset( - getPaymentOptionImage(paymentOption), - fit: BoxFit.cover, - ), - ), - if (isSelected) - Positioned( - right: 1, - child: Icon( - Icons.check_circle, - color: Color(0xff20BC11), - size: 30, - ), - ), - ], - ), - ), - ); - } - - String getPaymentOptionImage(PaymentOption paymentOption) { - String assetFile = "assets/images/pharmacy_module/payment/"; - switch (paymentOption.index) { - case 0: - return "${assetFile}mada.png"; - break; - case 1: - return "${assetFile}sadad.png"; - break; - case 2: - return "${assetFile}visa.png"; - break; - case 3: - return "${assetFile}mastercard.png"; - break; - case 4: - return "${assetFile}installment.png"; - break; - default: - return ""; - } - } -} diff --git a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart b/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart deleted file mode 100644 index 87c1b97c..00000000 --- a/lib/pages/pharmacies/screens/pharmacy-terms-conditions-page.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/tems-condition-viewmodel.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_html/flutter_html.dart'; -import 'package:provider/provider.dart'; - -class PharmacyTermsConditions extends StatelessWidget { - @override - Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - - return BaseView( - onModelReady: (model) => model.getUserTermsAndConditionsForEPharmcy(), - builder: (_, model, wi) => AppScaffold( - appBarTitle: TranslationBase.of(context).termOfService, - isShowAppBar: true, - isShowDecPage: false, - isPharmacy: true, - backgroundColor: Colors.white, - baseViewModel: model, - body: Container( - margin: EdgeInsets.all(8), - width: double.infinity, - child: Stack( - children: [ - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (model.listUserAgreement != null && - model.listUserAgreement.userAgreementLAKUM != - null) - Html( - data: projectProvider.isArabic - ? model.listUserAgreement.userAgreementTxtn - : model.listUserAgreement.userAgreementTxt, - ), - ], - ), - ), - ], - ), - ), - )); - } -} diff --git a/lib/pages/pharmacies/screens/pharmacy_module_page.dart b/lib/pages/pharmacies/screens/pharmacy_module_page.dart index 32a610f8..2ae2be65 100644 --- a/lib/pages/pharmacies/screens/pharmacy_module_page.dart +++ b/lib/pages/pharmacies/screens/pharmacy_module_page.dart @@ -2,9 +2,7 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; -import 'package:diplomaticquarterapp/pages/offers_categorise_page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/cart-order-page.dart'; -import 'package:diplomaticquarterapp/pages/pharmacies/screens/lakum-main-page.dart'; +import 'package:diplomaticquarterapp/pages/pharmacies/screens/order-preview-page.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/BannerPager.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/ProductTileItem.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/widgets/manufacturerItem.dart'; @@ -15,17 +13,16 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'lacum-activitaion-vida-page.dart'; - class PharmacyPage extends StatelessWidget { + @override Widget build(BuildContext context) { return BaseView( + // onModelReady: (model) => model.getPharmacyHomeData(), onModelReady: (model) => model.getPharmacyHomeData(), - allowAny: true, builder: (_, model, wi) => AppScaffold( title: "", - isShowAppBar: false, + isShowAppBar: true, isShowDecPage: false, baseViewModel: model, backgroundColor: Colors.white, @@ -36,7 +33,8 @@ class PharmacyPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ BannerPager(model), - GridViewButtons(model), + GridViewButtons(), + /*BannerPager(model.getBannerImagesUrl()),*/ Container( margin: EdgeInsets.fromLTRB(10, 0, 10, 0), child: Row( @@ -50,9 +48,8 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, vPadding: 6, - hPadding: 4, borderColor: Colors.green, - textColor: Colors.green, + color: Colors.green, handler: () {}, ), ], @@ -80,18 +77,15 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, vPadding: 6, - hPadding: 4, borderColor: Colors.green, - textColor: Colors.green, + color: Colors.green, handler: () {}, ), ], ), ), Container( - height: model.lastVisitedProducts.length > 0 - ? MediaQuery.of(context).size.height / 4 + 20 - : 0, + height: model.lastVisitedProducts.length > 0 ? MediaQuery.of(context).size.height / 4 : 0, child: ListView.builder( itemBuilder: (ctx, i) => ProductTileItem(model.lastVisitedProducts[i]), @@ -112,16 +106,15 @@ class PharmacyPage extends StatelessWidget { TranslationBase.of(context).viewAll, hasBorder: true, borderColor: Colors.green, - textColor: Colors.green, + color: Colors.green, vPadding: 6, - hPadding: 4, handler: () {}, ), ], ), ), Container( - height: MediaQuery.of(context).size.height / 4 + 20, + height: MediaQuery.of(context).size.height / 4, child: ListView.builder( itemBuilder: (ctx, i) => ProductTileItem(model.bestSellerProduct[i]), @@ -139,10 +132,6 @@ class PharmacyPage extends StatelessWidget { } class GridViewButtons extends StatelessWidget { - final PharmacyModuleViewModel model; - - GridViewButtons(this.model); - @override Widget build(BuildContext context) { final gridHeight = (MediaQuery.of(context).size.width * 0.3) * 1.8; @@ -164,25 +153,17 @@ class GridViewButtons extends StatelessWidget { opacity: 0.8, child: GridViewCard( TranslationBase.of(context).offersAndPromotions, - 'assets/images/pharmacy_module/offer_icon.png', () { - Navigator.push(context, FadePage(page: OffersCategorisePage())); - }), + 'assets/images/pharmacy_module/offer_icon.png', + () { + Navigator.push(context, FadePage(page: OrderPreviewPage())); + }), ), DashboardItem( imageName: 'pharmacy_module/bg_2.png', opacity: 0, hasColorFilter: false, child: GridViewCard(TranslationBase.of(context).medicationRefill, - 'assets/images/pharmacy_module/medication_icon.png', () { - model.checkUserIsActivated().then((isActivated) { - if (isActivated) { - Navigator.push(context, FadePage(page: LakumMainPage())); - } else { - Navigator.push( - context, FadePage(page: LakumActivationVidaPage())); - } - }); - }), + 'assets/images/pharmacy_module/medication_icon.png', () {}), ), DashboardItem( imageName: 'pharmacy_module/bg_3.png', @@ -238,16 +219,11 @@ class GridViewCard extends StatelessWidget { ), ), ), - Row( - children: [ - BorderedButton( - TranslationBase.of(context).viewAll, - handler: handler, - tPadding: 0, - bPadding: 0, - ), - Expanded(child: Container()), - ], + Expanded( + child: BorderedButton( + TranslationBase.of(context).viewAll, + handler: handler, + ), ), ], ), diff --git a/lib/pages/pharmacies/widgets/BannerPager.dart b/lib/pages/pharmacies/widgets/BannerPager.dart index 0f29014d..989c7557 100644 --- a/lib/pages/pharmacies/widgets/BannerPager.dart +++ b/lib/pages/pharmacies/widgets/BannerPager.dart @@ -26,7 +26,6 @@ class _BannerPagerState extends State { enlargeCenterPage: true, enableInfiniteScroll: false, initialPage: 0, - viewportFraction: 0.8, autoPlay: true, autoPlayInterval: Duration(seconds: 3), autoPlayAnimationDuration: Duration(milliseconds: 800), diff --git a/lib/pages/pharmacies/widgets/ProductOrderItem.dart b/lib/pages/pharmacies/widgets/ProductOrderItem.dart index 92e2c39d..81b6068a 100644 --- a/lib/pages/pharmacies/widgets/ProductOrderItem.dart +++ b/lib/pages/pharmacies/widgets/ProductOrderItem.dart @@ -1,239 +1,13 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ProductOrderItem extends StatefulWidget { - final ShoppingCart item; - final VoidCallback changeCartItems; - final VoidCallback deleteCartItems; - - ProductOrderItem(this.item, this.changeCartItems, this.deleteCartItems); - - @override - _ProductOrderItemState createState() => _ProductOrderItemState(); -} - -class _ProductOrderItemState extends State { - TextEditingController _quantityController = new TextEditingController(); - String _totalPrice = "0"; - - @override - void initState() { - _quantityController.text = "${widget.item.quantity}"; - _totalPrice = - "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; - super.initState(); - } +class ProductOrderItem extends StatelessWidget { @override Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - - return Column( - children: [ - ListTile( - leading: InkWell( - onTap: () => {widget.deleteCartItems()}, - child: Icon( - Icons.delete_outline_sharp, - color: Colors.grey.shade700, - ), - ), - title: Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - (widget.item.product.images != null && widget.item.product.images.length > 0) - ? Image.network( - widget.item.product.images[0].src, - fit: BoxFit.cover, - height: 80, - ) - : Image.asset( - "assets/images/no_image.png", - fit: BoxFit.cover, - height: 80, - ), - Expanded( - child: Container( - margin: - const EdgeInsets.symmetric(vertical: 8, horizontal: 8), - child: Container( - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Texts( - projectProvider.isArabic - ? widget.item.product.namen - : widget.item.product.name, - regular: true, - textAlign: TextAlign.justify, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - margin: const EdgeInsets.only(bottom: 4), - ), - Container( - child: Texts( - "${(widget.item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - margin: const EdgeInsets.only(bottom: 4), - ), - Row( - children: [ - InkWell( - onTap: () => - {_quantityOnChangeClick(Operation.dec)}, - child: Container( - width: 25, - height: 25, - child: Center( - child: Texts( - "-", - color: Colors.grey.shade400, - )), - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.shade400, - width: 1.0, - ), - ), - ), - ), - Container( - margin: - const EdgeInsets.symmetric(horizontal: 4), - width: 25, - height: 25, - color: Colors.grey.shade300, - child: Center( - child: TextField( - cursorColor: Colors.black, - keyboardType: TextInputType.number, - controller: _quantityController, - textAlign: TextAlign.center, - onChanged: (text) { - setState(() { - var value = int.tryParse(text); - if (value == null) { - widget.item.quantity = 0; - } else { - widget.item.quantity = int.parse(text); - } - _totalPrice = - "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; - }); - }, - )), - ), - InkWell( - onTap: () => - {_quantityOnChangeClick(Operation.inc)}, - child: Container( - width: 25, - height: 25, - child: Center( - child: Texts( - "+", - color: Colors.grey.shade400, - )), - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.shade400, - width: 1.0, - ), - ), - ), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Texts( - TranslationBase.of(context).total, - color: Colors.grey.shade500, - fontWeight: FontWeight.bold, - fontSize: 12, - ), - Texts( - "$_totalPrice ${projectProvider.isArabic ? widget.item.currencyn : widget.item.currency}", - fontSize: 12, - fontWeight: FontWeight.bold, - ) - ], - ), - ) - ], - ) - ], - ), - ), - ), - ) - ], - ), - ), - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 15, - thickness: 1, - indent: 0, - endIndent: 0, - ), - ], + return ListTile( + leading: Icon( + Icons.delete_outline_sharp, + color: Colors.grey.shade800, + ), ); } - - _quantityOnChangeClick(Operation operation) { - int newValue = 0; - setState(() { - switch (operation) { - case Operation.inc: - { - newValue = widget.item.quantity + 1; - } - break; - - case Operation.dec: - { - newValue = widget.item.quantity - 1; - } - break; - default: - { - //statements; - } - break; - } - if (newValue > 0) { - widget.item.quantity = newValue; - _quantityController.text = "${widget.item.quantity}"; - _totalPrice = - "${(widget.item.product.price * widget.item.quantity).toStringAsFixed(2)}"; - } - }); - if (newValue > 0) { - widget.changeCartItems(); - } - } - - @override - void dispose() { - // Clean up the controller when the widget is removed from the - // widget tree. - _quantityController.dispose(); - super.dispose(); - } } - -enum Operation { inc, dec } diff --git a/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart b/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart deleted file mode 100644 index d38f437c..00000000 --- a/lib/pages/pharmacies/widgets/ProductOrderPreviewItem.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'package:diplomaticquarterapp/core/model/pharmacies/ShoppingCart.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ProductOrderPreviewItem extends StatelessWidget { - final ShoppingCart item; - - ProductOrderPreviewItem(this.item); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectProvider = Provider.of(context); - - return Container( - margin: EdgeInsets.only(top: 16), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - (item.product.images != null && item.product.images.length > 0) - ? Image.network( - item.product.images[0].src, - fit: BoxFit.cover, - height: 80, - ) - : Image.asset( - "assets/images/no_image.png", - fit: BoxFit.cover, - height: 80, - ), - Expanded( - child: Container( - margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), - child: Container( - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Texts( - projectProvider.isArabic - ? item.product.namen - : item.product.name, - regular: true, - textAlign: TextAlign.justify, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - margin: const EdgeInsets.only(bottom: 4), - ), - Container( - child: Texts( - "${(item.product.price).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - margin: const EdgeInsets.only(bottom: 4), - ), - Container( - width: double.infinity, - alignment: Alignment.centerRight, - child: Texts( - TranslationBase.of(context).total, - color: Colors.grey.shade700, - fontWeight: FontWeight.bold, - fontSize: 13, - ), - ), - Row( - children: [ - Texts( - "QTY: ${item.quantity}", - color: Colors.grey.shade500, - fontWeight: FontWeight.bold, - fontSize: 12, - ), - Expanded( - child: Container( - alignment: Alignment.centerRight, - child: Texts( - "${(item.product.price * item.quantity).toStringAsFixed(2)} ${projectProvider.isArabic ? item.currencyn : item.currency}", - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - ) - ], - ), - ], - ), - ), - )), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 0, - thickness: 1, - indent: 0, - endIndent: 0, - ), - ], - ), - ); - } -} diff --git a/lib/pages/pharmacies/widgets/ProductTileItem.dart b/lib/pages/pharmacies/widgets/ProductTileItem.dart index 2dea5a93..62493387 100644 --- a/lib/pages/pharmacies/widgets/ProductTileItem.dart +++ b/lib/pages/pharmacies/widgets/ProductTileItem.dart @@ -23,7 +23,6 @@ class ProductTileItem extends StatelessWidget { void _saveLastVisitProducts() async { String lastVisited = ""; bool isIdExist = false; - // var data = await sharedPref.getObject(USER_PROFILE) ; // data['PatientID'] if (await this.sharedPref.getString(PHARMACY_LAST_VISITED_PRODUCTS) != null) { lastVisited = @@ -70,17 +69,11 @@ class ProductTileItem extends StatelessWidget { Container( margin: EdgeInsets.fromLTRB(0, 16, 0, 0), alignment: Alignment.center, - child: (item.images != null && item.images.length > 0) - ? Image.network( - item.images[0].src, - fit: BoxFit.cover, - height: 80, - ) - : Image.asset( - "assets/images/no_image.png", - fit: BoxFit.cover, - height: 80, - ), + child: Image.network( + item.images[0].src, + fit: BoxFit.cover, + height: 80, + ), ), Container( width: item.rxMessage != null @@ -111,7 +104,7 @@ class ProductTileItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - projectProvider.isArabic ? item.namen : item.name, + projectProvider.isArabic ? item.name : item.namen, regular: true, fontSize: 12, fontWeight: FontWeight.w400, @@ -126,21 +119,19 @@ class ProductTileItem extends StatelessWidget { ), Row( children: [ - Expanded( - child: StarRating( - totalAverage: item.approvedTotalReviews > 0 - ? (item.approvedRatingSum.toDouble() / - item.approvedTotalReviews.toDouble()) - .toDouble() - : 0, - forceStars: true), - ), - /*Texts( + StarRating( + totalAverage: item.approvedTotalReviews > 0 + ? (item.approvedRatingSum.toDouble() / + item.approvedTotalReviews.toDouble()) + .toDouble() + : 0, + forceStars: true), + Texts( "(${item.approvedTotalReviews})", regular: true, fontSize: 10, fontWeight: FontWeight.w400, - ),*/ + ) ], ), ], diff --git a/lib/pages/pharmacies/widgets/lacum-banner-widget.dart b/lib/pages/pharmacies/widgets/lacum-banner-widget.dart deleted file mode 100644 index 14a53e72..00000000 --- a/lib/pages/pharmacies/widgets/lacum-banner-widget.dart +++ /dev/null @@ -1,289 +0,0 @@ -import 'package:carousel_slider/carousel_slider.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/lacum-viewmodel.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/borderedButton.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:flutter/material.dart'; - -class LakumBannerWidget extends StatefulWidget { - final LacumViewModel model; - final MediaQueryData mediaQuery; - final bool isLacumHomePage; - - LakumBannerWidget(this.model, this.mediaQuery, this.isLacumHomePage); - - @override - _LakumBannerWidgetState createState() => _LakumBannerWidgetState(); -} - -class _LakumBannerWidgetState extends State { - int _current = 0; - - @override - Widget build(BuildContext context) { - return Container( - child: Stack( - children: [ - CarouselSlider( - options: CarouselOptions( - enableInfiniteScroll: false, - enlargeCenterPage: false, - viewportFraction: 1.0, - scrollPhysics: widget.isLacumHomePage - ? ScrollPhysics() - : NeverScrollableScrollPhysics(), - initialPage: 0, - onPageChanged: (index, reason) { - setState(() { - _current = index; - }); - }, - ), - items: [ - Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(4), - border: Border.fromBorderSide(BorderSide( - color: Colors.grey, - width: 0.4, - )), - ), - margin: EdgeInsets.symmetric(horizontal: 16), - child: Stack( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", - fit: BoxFit.fill, - width: widget.mediaQuery.size.width * 1.0, - height: widget.mediaQuery.size.width * 1.0, - ), - Container( - margin: EdgeInsets.fromLTRB(12, 70, 12, 4), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.memberName, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - Texts( - "${widget.model.lacumInformation.yahalaAccountNo}", - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ], - ), - BorderedButton( - widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.accountStatus == "Active" - ? TranslationBase.of(context).active - : TranslationBase.of(context).inactive, - textColor: widget.model.lacumInformation - .accountStatus == - 1 - ? Colors.green - : Colors.red, - hasBorder: true, - borderColor: widget.model.lacumInformation - .accountStatus == - 1 - ? Colors.green - : Colors.red, - radius: 16, - rPadding: 16, - icon: widget.model.lacumInformation - .accountStatus == - 1 - ? Icon( - Icons.check_circle, - size: 25, - color: Colors.green, - ) - : Image.asset( - "assets/images/pharmacy_module/lakum/inactive_cross.png", - fit: BoxFit.fill, - width: 25, - height: 25, - ), - ), - ], - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "IDENTIFICATION #", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - Texts( - widget.model.lacumInformation - .identificationNo, - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Texts( - "MEMBER SINCE", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - Texts( - widget.model.formatCreatedDateToString(), - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ], - ), - ], - ), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - "MOBILE #", - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - Texts( - widget.model.lacumGroupInformation.lakumInquiryInformationObjVersion.mobileNumber, - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Texts( - TranslationBase.of(context).language, - fontSize: 14, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - Texts( - widget.model.lacumInformation.prefLang == - "1" - ? TranslationBase.of(context).lanEnglish - : TranslationBase.of(context).lanArabic, - fontSize: 16, - fontWeight: FontWeight.normal, - color: Colors.black, - ), - ], - ), - ], - ), - ], - ), - ), - ], - ), - ), - widget.isLacumHomePage - ? Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(4), - border: Border.fromBorderSide(BorderSide( - color: Colors.grey, - width: 0.4, - )), - ), - margin: EdgeInsets.symmetric(horizontal: 16), - child: Stack( - children: [ - Image.asset( - "assets/images/pharmacy_module/lakum/lakum_card_front_bg.png", - fit: BoxFit.fill, - width: widget.mediaQuery.size.width * 1.0, - height: widget.mediaQuery.size.width * 1.0, - ), - Container( - margin: EdgeInsets.fromLTRB(12, 70, 12, 4), - child: widget.model.convertBase64ToBarCodeImage() != - null - ? Image.memory( - widget.model.convertBase64ToBarCodeImage()) - : Container(), - ), - ], - ), - ) - : Container(), - ], - ), - widget.isLacumHomePage - ? Positioned( - bottom: 1, - left: 1, - right: 1, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: _current == 0 ? 12.0 : 8.0, - height: 4.0, - margin: EdgeInsets.symmetric( - vertical: 0.0, horizontal: 2.0), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: _current == 0 - ? Color(0xff5ab145) - : Color.fromRGBO(0, 0, 0, 0.4), - ), - ), - Container( - width: _current == 1 ? 12.0 : 8.0, - height: 4.0, - margin: EdgeInsets.symmetric( - vertical: 0.0, horizontal: 2.0), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: _current == 1 - ? Color(0xff5ab145) - : Color.fromRGBO(0, 0, 0, 0.4), - ), - ), - ], - ), - ), - ) - : Container(), - ], - ), - ); - } -} \ No newline at end of file diff --git a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart b/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart deleted file mode 100644 index 6e4e2309..00000000 --- a/lib/pages/pharmacies/widgets/lakum-point-table-row-widget.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; -import 'package:diplomaticquarterapp/widgets/others/points-expandable-notifier.dart'; -import 'package:expandable/expandable.dart'; -import 'package:flutter/material.dart'; - -class LakumPointTableRowWidget extends StatefulWidget { - final bool isTableTitle; // true : title , false: row - final String rowTitle; - final double points; - final double riyal; - final Function onTap; - final int rowIndex; - final Widget collapsed; - final bool expandFlag; - - LakumPointTableRowWidget(this.isTableTitle, this.rowTitle, this.points, - this.riyal, this.onTap, this.rowIndex, - {this.collapsed, this.expandFlag = false}); - - @override - _LakumPointTableRowWidgetState createState() => - _LakumPointTableRowWidgetState(); -} - -class _LakumPointTableRowWidgetState extends State { - @override - Widget build(BuildContext context) { - return InkWell( - onTap: widget.onTap, - child: Column( - children: [ - Column( - children: [ - widget.collapsed != null - ? PointsExpandableNotifier( - headerWidget: buildPointRowBody(), - // bodyWidget: widget.collapsed != null ? widget.collapsed : null, - bodyWidget: widget.collapsed, - isExpand: widget.expandFlag, - ) - : buildPointRowBody(), - ], - ), - const Divider( - color: Color(0xFFD6D6D6), - height: 1, - thickness: 1, - indent: 0, - endIndent: 0, - ), - ], - ), - ); - } - - Widget buildPointRowBody() { - bool isEven = widget.rowIndex % 2 == 0; - return Container( - padding: EdgeInsets.symmetric(vertical: 12, horizontal: 12), - color: widget.expandFlag ? Color(0xffe4e4e4) : isEven && !widget.isTableTitle ? Color(0xffefefef) : Colors.white, - child: Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - child: Texts( - widget.rowTitle, - fontSize: 14, - fontWeight: - widget.isTableTitle ? FontWeight.bold : FontWeight.normal, - ), - )), - Expanded( - child: Container( - child: Texts( - widget.isTableTitle ? "POINTS" : "${widget.points}", - fontSize: 14, - fontWeight: - widget.isTableTitle ? FontWeight.bold : FontWeight.normal, - ), - )), - Expanded( - child: Container( - child: Texts( - widget.isTableTitle ? "RIYAL" : "${widget.riyal}", - fontSize: 14, - fontWeight: - widget.isTableTitle ? FontWeight.bold : FontWeight.normal, - ), - )), - Expanded( - child: widget.isTableTitle - ? Container() - : Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Icon( - widget.collapsed == null - ? Icons.keyboard_arrow_right - : widget.expandFlag - ? Icons.keyboard_arrow_up - : Icons.keyboard_arrow_down, - size: 25, - color: Colors.grey.shade700, - ), - ], - )), - ], - ), - ], - ), - ); - } -} diff --git a/lib/pages/pharmacies/wishlist.dart b/lib/pages/pharmacies/wishlist.dart deleted file mode 100644 index 8fa7352d..00000000 --- a/lib/pages/pharmacies/wishlist.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/wishList_service.dart'; -import 'package:diplomaticquarterapp/widgets/pharmacy/product_tile.dart'; - - -void main() => runApp(WishlistPage()); - -class WishlistPage extends StatefulWidget { - - @override - _WishlistPageState createState() => _WishlistPageState(); -} - -class _WishlistPageState extends State { - - @override - void initState(){ - WidgetsBinding.instance.addPostFrameCallback((_) => getWishListItems()); - } - - Widget build(BuildContext context) { - return AppScaffold( - appBarTitle: 'Wishlist page', - isShowAppBar: true, - isPharmacy: true, - body: Container( -// child: productTile(), - child: ListView.builder( - itemCount: 3, - itemBuilder: (BuildContext context, int index) { - return Column( - children: [ - Container( - child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00,), - ), - Divider(height: 1, color: Colors.grey) - ], - ); - }), - ), - ); - } -} - -getWishListItems() { - - print("getWishListItems"); - WishListService service = new WishListService(); - service.getWishlist(AppGlobal.context).then((res) { - print(res); - }); - -} diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart deleted file mode 100644 index 17849c47..00000000 --- a/lib/pages/pharmacy/order/Order.dart +++ /dev/null @@ -1,881 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/order/OrderDetails.dart'; - -class OrderPage extends StatefulWidget { - -// orderList({this.customerId, this.pageId}); - - @override - _OrderPageState createState() => _OrderPageState(); -} - -class _OrderPageState extends State with SingleTickerProviderStateMixin{ - String customerId=""; - String page_id=""; - - List delivered = [] ; - List processing = []; - List cancelled = []; - List pending = []; - TabController _tabController; - AppSharedPreferences sharedPref = AppSharedPreferences(); - - @override - void initState() { -// WidgetsBinding.instance.addPostFrameCallback((_) => getOrder()); - - super.initState(); - _tabController = new TabController(length: 4, vsync: this,); - } - - @override - Widget build(BuildContext context) { - return BaseView( - onModelReady: (model) => model.getOrder(customerId, page_id), - builder: (_,model, wi )=> AppScaffold( - appBarTitle:(TranslationBase.of(context).order), -// backgroundColor: Colors.green , -// centerTitle: true, -// title: Text(TranslationBase.of(context).order, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, - isShowAppBar: true, - isPharmacy:true , - body: Container( - child: Column( - children: [ - TabBar( - tabs: [ - Tab(text: TranslationBase.of(context).delivered), -// Tab(text: model.order.length.toString()), - Tab(text: TranslationBase.of(context).processing), - Tab(text: TranslationBase.of(context).pending), - Tab(text: TranslationBase.of(context).cancelled), - ], - controller: _tabController, - ), - Divider( - color: Colors.grey[350], - height: 10, - thickness: 6, - indent: 0, - endIndent: 0, - ), - Expanded( - child: new TabBarView( - physics: NeverScrollableScrollPhysics(), - children: [ - getDeliveredOrder(model), - getProcessingOrder(model), - getPendingOrder(model), - getCancelledOrder(model), - ], - controller: _tabController, - ), - ), - ], - ), - ), - ), - ); - } - - Widget getDeliveredOrder(OrderModelViewModel model){ - return Container( - width: MediaQuery.of(context).size.width, - child: model.order.length != 0 && model.order[0].orderStatusId == 30 - ? SingleChildScrollView( - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 2 , - itemBuilder: (context, index){ - return Container( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderNumber, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - child: Text(model.order[0].id.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderDate, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - child: Text(model.order[0].createdOnUtc.toString(), - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.all(8.0), - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); - }, - child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', - height: 20, - width: 20,), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.blue[700], - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.blue[700], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), -// TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - child: Column( -// crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - child: Text('12', - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).itemsNo, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - ], - ), - ); - } - ) - ], - ), - ) - : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/pharmacy/empty_box.svg'), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text(TranslationBase.of(context).noOrder, - style: TextStyle( - fontSize: 16.0, - )), - ), - ], - ), - ), - ), - ); - } - - Widget getProcessingOrder(OrderModelViewModel model){ - return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 20 - ? SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all(8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderNumber, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - child: Text(model.order[0].id.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderDate, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - child: Text(model.order[0].createdOnUtc.toString(), - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.all(8), - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); - }, - child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', - height: 20, - width: 20,), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.green, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), -// TranslationBase.of(context).processing, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - child: Column( -// crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - child: Text('12', - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).itemsNo, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - ], - ), - ) - : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/pharmacy/empty_box.svg'), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text(TranslationBase.of(context).noOrder, - style: TextStyle( - fontSize: 16.0, - )), - ), - ], - ), - ), - ), - ); - } - - Widget getPendingOrder(OrderModelViewModel model){ - return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 10 - ? SingleChildScrollView( - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 2 , - itemBuilder: (context, index){ - return Container( - child: SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all(8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderNumber, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - child: Text(model.order[0].id.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderDate, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - child: Text(model.order[0].createdOnUtc.toString(), - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.all( 8.0), - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); - }, - child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', - height: 20, - width: 20,), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child:Container( - margin: EdgeInsets.all(8.0), - padding: EdgeInsets.only(left: 13.0, right: 13.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange[300], - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.orange[300], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), ), - Container( - margin: EdgeInsets.all(8.0), - child: Column( -// crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - child: Text('12', - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).itemsNo, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - ], - ), - ), - - ); - } - ) - ], - ), - ) - : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/pharmacy/empty_box.svg'), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text(TranslationBase.of(context).noOrder, - style: TextStyle( - fontSize: 16.0, - )), - ), - ], - ), - ), - ), - - ); - } - - Widget getCancelledOrder(OrderModelViewModel model){ - return Container( - child: model.order.length != 0 && model.order[0].orderStatusId == 40 - ? SingleChildScrollView( - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 2 , - itemBuilder: (context, index){ - return Container( - child: SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all( 8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderNumber, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - child: Text(model.order[0].id.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5), - child: Text(TranslationBase.of(context).orderDate, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - child: Text(model.order[0].createdOnUtc.toString(), - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.all(8.0), - child: InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => OrderDetailsPage())); - }, - child: SvgPicture.asset( - 'assets/images/pharmacy/arrow_right.svg', - height: 20, - width: 20,), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child:Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - padding: EdgeInsets.only(left: 10.0, right: 10.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.red[900], - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.red[900], - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - model.order[0].orderStatus.toString(), - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), ), - Container( - margin: EdgeInsets.only(left: 8, right: 8, top: 1, bottom: 8), - child: Column( -// crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text(model.order[0].orderTotal.toString(), - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - child: Text('12', - style: TextStyle(fontSize: 14.0, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text(TranslationBase.of(context).itemsNo, - style: TextStyle(fontSize: 14.0, - ), - ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - ], - ), - ), - - ); - } - ) - ], - ), - ) - : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/pharmacy/empty_box.svg'), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text(TranslationBase.of(context).noOrder, - style: TextStyle( - fontSize: 16.0, - )), - ), - ], - ), - ), - ), - ); - } -} - - - - -// filterOrders() { -// for () { -// if (order.order_status_id === 30 || order.order_status_id === 997 || order.order_status_id === 994) { // complete -// this.delivered.push(order); -// } else if (order.order_status_id === 40 || order.order_status_id === 200 || order.order_status_id === 996) { // cancelled & order refunded -// this.cancelled.push(order); -// } else if (order.order_status_id === 10) { // Pending -// this.pending.push(order); -// } else if (order.order_status_id === 20 || order.order_status_id === 995 || order.order_status_id === 998 || order.order_status_id === 999) { // Processing -// this.processing.push(order); -// } else { // Processing & other all other status -// this.other.push(order); -// } -// } -//} - - - diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart deleted file mode 100644 index d406e7f5..00000000 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ /dev/null @@ -1,475 +0,0 @@ - -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/orderDetails_service.dart'; - - - -class OrderDetailsPage extends StatefulWidget { - - @override - _OrderDetailsPageState createState() => _OrderDetailsPageState(); -} - -class _OrderDetailsPageState extends State { - AppSharedPreferences sharedPref = AppSharedPreferences(); - String customerId=""; - String page_id=""; - String orderId="3516"; - @override - void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) => getOrderDetails()); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return BaseView( - onModelReady:(model) => model.getOrderDetails(orderId), - builder: (_,model, wi )=> AppScaffold( - appBarTitle: (TranslationBase.of(context).orderDetail), -// title: Text(TranslationBase.of(context).orderDetail, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, - isShowAppBar: true, - isPharmacy:true , - body: Container( - color: Colors.white, - child: SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 15.0, 1.0, 5.0), - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_mark_icon.svg', - width: 28, - height: 28,), - Text(TranslationBase.of(context).shippingAddress, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 15.0, right: 10.0), - padding: EdgeInsets.only(left: 11.0, right: 11.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.blue, - style: BorderStyle.solid, - width: 5.0, - ), - color: Colors.blue, - borderRadius: BorderRadius.circular(30.0) - ), - child: Text( - TranslationBase.of(context).delivered, - style: TextStyle( - color: Colors.white, - fontSize: 13.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - Container( - margin: EdgeInsets.only(left: 10.0, top: 13.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Cloud Solutions', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - color: Colors.grey, - ), - ), - ], - ), - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 8.0, 5.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), - ), - Container( - margin: EdgeInsets.only(top: 5.0, bottom: 5.0), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, - ), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 10.0, 5.0, 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/shipping_truck_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.all(10.0), - child:Text(TranslationBase.of(context).shippedMethod, - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/hmg_shipping_logo.svg', - height: 25, - width: 25,), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - Row( - children: [ - Container( - margin: EdgeInsets.fromLTRB(10.0, 10.0, 1.0, 10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/credit_card_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.all(10.0), - child: SvgPicture.asset( - 'assets/images/pharmacy/credit_card_icon.svg', - height: 20, - width: 20,), - ), - Container( - margin: EdgeInsets.only(bottom: 10.0, top: 10.0), - child:Text('Mada', - style: TextStyle(fontSize: 13.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - Container( - padding: EdgeInsets.only(bottom: 15.0), - margin: EdgeInsets.only(left: 10.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TranslationBase.of(context).orderDetail, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Container( - child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, - productReviews:4, totalPrice: '10.00', qyt: '3',), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(left: 10.0, top: 5.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TranslationBase.of(context).orderSummary, - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), - child: Text( - TranslationBase.of(context).subtotal, - style: TextStyle( - fontSize: 13.0, - ), - ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, - ), - ), - ), - Text('343.55', - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0, left: 10.0 ), - child: Text( - TranslationBase.of(context).shipping, - style: TextStyle( - fontSize: 13.0, - ), - ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, - ), - ), - ), - Text('343.55', - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), - child: Text( - TranslationBase.of(context).vat, - style: TextStyle( - fontSize: 13.0, - ), - ), - ), - Container( - padding: EdgeInsets.only(bottom: 10.0), - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 13.0, - ), - ), - ), - Text('343.55', - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.only(top: 5.0,left: 10.0 ), - child: Text( - TranslationBase.of(context).total, - style: TextStyle( - fontSize: 15.0,fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 5.0), - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right: 5.0), - child: Text(TranslationBase.of(context).sar, - style: TextStyle(fontSize: 15.0,fontWeight: FontWeight.bold, - ), - ), - ), - Text('343.55', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ], - ), - InkWell( - onTap: (){ - }, - child: Container( - margin: EdgeInsets.only(top: 20.0), - height: 50.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).payOnline, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - InkWell( - onTap: () { -// confirmDelete(snapshot.data[index]["id"]); - cancelOrder("id"); - }, - child: Container( - height: 50.0, - color: Colors.transparent, - child: Center( - child: Text( - TranslationBase.of(context).cancelOrder, - style: TextStyle( - color: Colors.red[900], - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline - ), - ), - ), - ), - ), - ], - ), - ), - ), - ), - ); - } - cancelOrder(id){ - showDialog( - context: context, - builder: (BuildContext context)=> AlertDialog( - title: Text(TranslationBase.of(context).confirm, - style: TextStyle( - fontWeight: FontWeight.bold, - ),), - content: Text(TranslationBase.of(context).confirmCancellation, - style: TextStyle( - color: Colors.grey, - ),), - actions:[ - FlatButton( - child: Text(TranslationBase.of(context).cancel, - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ - Navigator.pop(context); - }, - ), - FlatButton( - child: Text(TranslationBase.of(context).ok, - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ -// http.delete(""https://uat.hmgwebservices.com/epharmacy/api/orders/$id"); - Navigator.push(context, - MaterialPageRoute(builder: (context)=> OrderDetailsPage())); - }, - ), - ], - ) - ); - } -} - - getOrderDetails() { - print("getOrderDetails 5466"); - OrderDetailsService service = new OrderDetailsService(); - service.getOrderDetails(AppGlobal.context).then((res) { - print(res); - }); - } - - - getPayOrder(){ - - } diff --git a/lib/pages/pharmacy/order/ProductReview.dart b/lib/pages/pharmacy/order/ProductReview.dart deleted file mode 100644 index 9de67849..00000000 --- a/lib/pages/pharmacy/order/ProductReview.dart +++ /dev/null @@ -1,312 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/order_service.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/profile/profile.dart'; -import 'package:rating_bar/rating_bar.dart'; -import 'package:diplomaticquarterapp/widgets//pharmacy/product_tile.dart'; - -class ProductReviewPage extends StatefulWidget { - - @override - _ProductReviewPageState createState() => _ProductReviewPageState(); -} - -class _ProductReviewPageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).writeReview, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - color: Colors.white, - child: SingleChildScrollView( - child: Column( - children: [ -// Container( -// child: productTile(productName: 'Panadol Extra 500 MG', productPrice: '10.00', productRate: 3.00, -// productReviews:4, ), -// ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 80, - height: 80, - ), - ), - Container( - margin: EdgeInsets.only(top :15.0, bottom: 15.0), - child: Column( - children: [ - Row( - children: [ - Text('medication name', - style: TextStyle(fontSize: 16.0, - ), - ), - ], - ), - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 5), - child: Text('90.00', - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text('SAR', - style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - Row( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: 3, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - Container( - child: Text('4.9', - style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold, - ), - ), - ), - Container( - margin: EdgeInsets.only(left: 5), - child: Text('10 (reviews)', - style: TextStyle(fontSize: 12.0, - ), - ), - ), - ], - ), - ], - ), - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 8, - indent: 0, - endIndent: 0, - ), - Container( - margin: EdgeInsets.only( top: 12.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - RatingBar( - // initialRating: - // this.doctor.actualDoctorRate.toDouble(), - size: 40.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ], - ), - ), - Container( - padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0,20.0), - child: Column( - children: [ - TextFormField ( - decoration: InputDecoration( - contentPadding: const EdgeInsets.symmetric(vertical: 60.0), - border: InputBorder.none, - hintText: 'Tell us more about product!', - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(5.0), - borderSide: BorderSide(width: 1, color: Colors.grey[400]), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - borderSide: BorderSide(color: Colors.grey[400], width: 1), - ), - ), - ), - ], - ), - ), - InkWell( - onTap: () { - - }, - child: Container( - height: 50.0, - width: 400.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.yellow[700], - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.yellow[700], - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).shareReview, - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ], - ), - ), - ), - ); - } - - //new screen is showing after submitting the review - Widget getReviewedProduct(){ - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - width: 28, - height: 28,), - Container( - margin: EdgeInsets.only(left: 10.0), - child: Text(TranslationBase.of(context).reviewSuccessful, - style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - Container( - margin: EdgeInsets.only(top:5.0, bottom: 20.0 ), - child: Text(TranslationBase.of(context).reviewShared, - style: TextStyle(fontSize: 15.0, - ), - ), - ), - Container( - margin: EdgeInsets.only(bottom: 30.0, top: 30.0 ), - child: SvgPicture.asset( - 'assets/images/pharmacy/success_review_icon.svg', - width: 100, - height: 100,), - ), - Container( - margin: EdgeInsets.only(left: 20.0, right: 20.0), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/quote_start.svg', - width: 15, - height: 15,), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(TranslationBase.of(context).reviewComment, - style: TextStyle(fontSize: 15.0, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/quote_end.svg', - width: 15, - height: 15,), - ], - ), - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 20.0 ), - child: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return PharmacyProfilePage(); - }), - ); - }, - child: Container( - height: 50.0, color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).backMyAccount, - style: TextStyle( - color: Colors.orange, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ), - ], - ); - } -} diff --git a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart b/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart deleted file mode 100644 index 30fd4cd6..00000000 --- a/lib/pages/pharmacy/pharmacyAddresses/AddAddress.dart +++ /dev/null @@ -1,127 +0,0 @@ -import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_html/style.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; - -class AddAddressPage extends StatefulWidget { - @override - _AddAddressState createState() => _AddAddressState(); -} - -class _AddAddressState extends State { - - void onMapCreated(controller){ - setState(() { - mapController= controller; - }); - } - void _getAddressFromLatLng() {} - _onMapTypeButtonPressed(){} - _onAddMarkerButtonPressed(){} - - LatLng _initialPosition; - GoogleMapController mapController; - @override - void initState() { - // TODO: implement initState - _initialPosition = LatLng(24.662617030, 46.7334844); - super.initState(); - } - - void _onMapCreated(GoogleMapController controller) { - mapController = controller; - } - - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).addNewAddress, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Stack( - children: [ - GoogleMap( - zoomControlsEnabled: true, - myLocationButtonEnabled: true, - myLocationEnabled: true, - onMapCreated: _onMapCreated, - onCameraMove: (object) { -// widget.currentLat = object.target.latitude; -// widget.currentLong = object.target.longitude; - }, - onCameraIdle: _getAddressFromLatLng, - padding: EdgeInsets.only(bottom: 90.0), - initialCameraPosition: CameraPosition( - target: _initialPosition, - zoom: 13.0, - ), - ), -// Align( -// alignment: Alignment.topRight, -// child: Column( -// children: [ -// button(_onMapTypeButtonPressed,Icons.map), -// SizedBox( -// height:16.0, -// ), -// button(_onAddMarkerButtonPressed, Icons.add_location) -// ], -// ), -// ), - ] - ), - bottomSheet: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - height: 50.0, - color: Colors.green, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(10.0) - ), - child: Center( - child: Text(TranslationBase.of(context).confirmLocation, - style: TextStyle( - color: Colors.white, - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ); - } - - -// Widget button(Function function, IconData icon){ -// return FloatingActionButton( -// onPressed: function, -// materialTapTargetSize: MaterialTapTargetSize.padded, -// backgroundColor: Colors.red, -// child: Icon( -// icon, -// size: 18.0, -// ),); -// } - -} - diff --git a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart b/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart deleted file mode 100644 index 44df964d..00000000 --- a/lib/pages/pharmacy/pharmacyAddresses/PharmacyAddresses.dart +++ /dev/null @@ -1,380 +0,0 @@ - -import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/pages/pharmacy/pharmacyAddresses/AddAddress.dart'; -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; - -class PharmacyAddressesPage extends StatefulWidget{ - @override - _PharmacyAddressesState createState() => _PharmacyAddressesState(); - } - -class _PharmacyAddressesState extends State{ - - int selectedRadio; - bool _value = false; - - AppSharedPreferences sharedPref = AppSharedPreferences(); - - - @override - void initState(){ -// WidgetsBinding.instance.addPostFrameCallback((_) => getAllAddress()); - - super.initState(); - selectedRadio=0; - } - setSelectedRadio(int val){ - setState(() { - selectedRadio = val; - }); - } - - Widget build (BuildContext context){ - return BaseView( - onModelReady: (model) => model.getAddress(), - builder: (_,model, wi )=> AppScaffold( - appBarTitle: "", -// centerTitle: true, -// title: Text(TranslationBase.of(context).changeAddress, style: TextStyle(color:Colors.white)), -// backgroundColor: Colors.green, - isShowAppBar: true, - isPharmacy:true , - body: Container( - child:SingleChildScrollView( - child: Column( - children:[ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: 5 , - itemBuilder: (context, index){ - return Container( - child: Padding( - padding:EdgeInsets.only(top:10.0, left:5.0, right:5.0, bottom:5.0,), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - InkWell( - onTap: () { - setState(() { - _value = !_value; - }); - }, - child: Container( - margin: EdgeInsets.only(right: 20), - - child: Padding( - padding: const EdgeInsets.all(5.0), - child: _value - ? Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 25, - width: 25,), - ) - : Container( - child: SvgPicture.asset( - 'assets/images/pharmacy/check_icon.svg', - height: 23, - width: 23, - color: Colors.transparent, - ), - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(50.0) - ), - ), - ), - ), - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('NAME', - style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, - ), - ), - SizedBox( - height: 5,), - Text('Address', - style: TextStyle(fontSize: 15.0, color: Colors.grey, - ), - ), - SizedBox( - height: 5,), - Row( - children: [ - Container( - margin: EdgeInsets.only(bottom: 8), - child: SvgPicture.asset( - 'assets/images/pharmacy/mobile_number_icon.svg', - height: 13,), - ), - Container( - margin: EdgeInsets.only(left: 10, bottom: 8), - child: Text('588888778', - style: TextStyle(fontSize: 15.0, - ), - ), - ), - ], - ), - SizedBox( - height: 15,), - Row( - children: [ - Column( - children: [ - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(right:10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/edit_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(right:5, bottom: 15), - padding: EdgeInsets.only(right: 10.0), - child: Text(TranslationBase.of(context).edit, - style: TextStyle(fontSize: 15.0, - color: Colors.blue, - ), - ), - decoration: BoxDecoration( - border: Border( - right: BorderSide( - color: Colors.grey, - width: 1.0, - ), - ), - ), - ), - ], - ), - ), - ], - ), - Column( - children: [ - InkWell( - onTap: () { -// confirmDelete(snapshot.data[index]["id"]); - confirmDelete("address"); - }, - child: Row( - children: [ - Container( - margin: EdgeInsets.only(left: 15, right: 10, bottom: 15), - child: SvgPicture.asset( - 'assets/images/pharmacy/delete_red_icon.svg', - height: 15,), - ), - Container( - margin: EdgeInsets.only(bottom: 15), - child: Text(TranslationBase.of(context).delete, - style: TextStyle(fontSize: 15.0, - color: Colors.redAccent, - ), - ), - ), - ], - ), - ), - ], - ) - ], - ), - ], - ), - SizedBox( - height: 10, - ), - ], - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 6, - indent: 0, - endIndent: 0, - ), - ], - ), - ), - ); - } - ), - SizedBox( - height: 10, - ), - InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - margin: EdgeInsets.only(bottom: 100.0), - height: 50.0, - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text( - TranslationBase.of(context).addAddress, - style: TextStyle( - color: Colors.green, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ], - ), - ), - ), - bottomSheet: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AddAddressPage(); - }), - ); - }, - child: Container( - height: 50.0, - color: Colors.green, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0) - ), - child: Center( - child: Text(TranslationBase.of(context).confirmAddress, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ), - ), - ); - } - confirmDelete(address){ - showDialog( - context: context, - builder: (BuildContext context)=> AlertDialog( - title: Text(TranslationBase.of(context).confirmDeleteMsg, - style: TextStyle( - fontWeight: FontWeight.bold, - ),), - content: Text("address"), - actions:[ - FlatButton( - child: Text(TranslationBase.of(context).cancel, - style: TextStyle( - color: Colors.red, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ - Navigator.pop(context); - }, - ), - FlatButton( - child: Text(TranslationBase.of(context).confirmDelete, - style: TextStyle( - color: Colors.grey, - fontWeight: FontWeight.bold, - fontSize: 16, - ),), - onPressed: (){ -// http.delete("https://uat.hmgwebservices.com/epharmacy/api/Customers/272843?fields=addresses/$id"); - Navigator.push(context, - MaterialPageRoute(builder: (context)=> PharmacyAddressesPage() )); - }, - ), - ], - ) - ); - } -} - -getAllAddress() { -// print("ADDRESSES"); -// PharmacyAddressService service = new PharmacyAddressService(); -// service.getAddress(AppGlobal.context).then((res) { -// print(res); -// }); - -} - - - - getConfirmAddress(){ - - } - getEditAddress(){ - - } - getDeleteAddress(){ - -} - - - - - diff --git a/lib/pages/pharmacy/profile/profile.dart b/lib/pages/pharmacy/profile/profile.dart deleted file mode 100644 index 272ef0d4..00000000 --- a/lib/pages/pharmacy/profile/profile.dart +++ /dev/null @@ -1,384 +0,0 @@ -import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; - -class PharmacyProfilePage extends StatefulWidget { - @override - _ProfilePageState createState() => _ProfilePageState(); -} - -class _ProfilePageState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - centerTitle: true, - title: Text(TranslationBase.of(context).myAccount, style: TextStyle(color:Colors.white)), - backgroundColor: Colors.green, - ), - body: Container( - child:SingleChildScrollView( - child: Column( - children:[ - Container( - child:Row( - children: [ - Container( - padding:EdgeInsets.only(top:20.0, left:10.0, right:10.0, bottom:10.0,), - child: LargeAvatar(name: "profile", url:'' ,), - ), - Container( - child: Column( - children: [ - Text( - TranslationBase.of(context).welcome, - style: TextStyle(fontSize: 14.0, - fontWeight: FontWeight.bold, - color:Colors.grey - ), - ), - Text( - 'NAME', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - ], - ), - ) - ], - ), - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 15, - ), - Container( - child:Row( - children: [ - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/orders_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).orders, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/lakum_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).lakum, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold - ), - ), - ], - ), - ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/wishlist_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).wishlist, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), - ), - Expanded( - child: InkWell( - child: Column( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/review_icon.svg', - width: 50, - height: 50,), - SizedBox( - height: 5, - ), - Text( - TranslationBase.of(context).reviews, - style: TextStyle(fontSize: 13.0, - fontWeight: FontWeight.bold,), - ), - ], - ), - ), - ), - ], - ) - ), - SizedBox( - height: 15, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, - ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).myAccount, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - SizedBox( - height: 10, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_prescription_icon.svg', - width: 28, - height: 28,), - SizedBox( - width: 15, - ), - Text(TranslationBase.of(context).myPrescriptions, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/medication_refill_icon.svg', - width: 28, - height: 28,), - SizedBox( - width: 15, - ), - Text(TranslationBase.of(context).medicationRefill, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/pill_reminder_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).pillReminder, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/my_family_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).family, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/shipping_addresses_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text(TranslationBase.of(context).shippingAddresses, - style: TextStyle(fontSize: 13.0, - ), - ), - ], - ), - ), - ], - ), - ), - SizedBox( - height: 10, - ), - Divider( - color: Colors.grey[350], - height: 20, - thickness: 5, - indent: 0, - endIndent: 0, - ), - SizedBox( - height: 10, - ), - Container( - padding: EdgeInsets.only(left: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - TranslationBase.of(context).reachUs, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/contact_us_icon.svg', - width: 20, - height: 20,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).contactUs, - style: TextStyle(fontSize: 13.0), - ), - ], - ), - ), - SizedBox( - height: 5, - ), - Divider( - color: Colors.grey, - height: 20, - ), - InkWell( - child: Row( - children: [ - SvgPicture.asset( - 'assets/images/pharmacy/our_locations_icon.svg', - width: 30, - height: 30,), - SizedBox( - width: 20, - ), - Text( - TranslationBase.of(context).ourLocations, - style: TextStyle(fontSize: 13.0), - ), - ], - ), - ) - ], - ), - ) - ], - ), - ), - ), - ); - }} - - - - diff --git a/lib/pages/pharmacy_categorise.dart b/lib/pages/pharmacy_categorise.dart deleted file mode 100644 index 169fb92d..00000000 --- a/lib/pages/pharmacy_categorise.dart +++ /dev/null @@ -1,238 +0,0 @@ -import 'package:charts_flutter/flutter.dart'; -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page_pharmcy.dart'; -import 'package:diplomaticquarterapp/pages/parent_categorise_page.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; -import 'package:diplomaticquarterapp/uitl/utils.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:barcode_scan/platform_wrapper.dart'; -import 'package:provider/provider.dart'; -import 'base/base_view.dart'; -import 'final_products_page.dart'; - -class PharmacyCategorisePage extends StatefulWidget { - @override - _PharmacyCategorisePageState createState() => _PharmacyCategorisePageState(); -} - -class _PharmacyCategorisePageState extends State { - String idCategorise; - - @override - Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); - return BaseView( - onModelReady: (model) => model.getCategorise(), - builder: (BuildContext context, PharmacyCategoriseViewModel model, - Widget child) => - AppScaffold( - isShowDecPage: false, - baseViewModel: model, - body: Column( - children: [ - Container( - height: 400, - margin: EdgeInsets.only(bottom: 22), - child: GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 1.0, - childAspectRatio: 3.2, - ), - itemCount: model.categorise.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: EdgeInsets.all(4.0), - child: InkWell( - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5), - color: Colors.grey.withOpacity(0.24), - ), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - projectViewModel.isArabic - ? model.categorise[index].namen - : model.categorise[index].name, - fontWeight: FontWeight.w600, - ), - ), - ), - onTap: () => { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - model.categorise[index].id != '12' - ? ParentCategorisePage( - id: model.categorise[index].id, - titleName: model.categorise[index].name, - ) - : FinalProductsPage( - id: model.categorise[index].id, - ), - ), - ), - }, - ), - ); - }, - ), - ), - Container( - height: 140, - child: Column( - children: [ - Divider( - height: 2.0, - thickness: 1.0, - color: Colors.black12.withOpacity(0.14)), - SizedBox( - height: 10.0, - ), - Row( - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.all(4.0), - child: Container( - height: 50.0, - width: 55.0, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.0), - color: Colors.green.shade300.withOpacity(0.34), - ), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - projectViewModel.isArabic - ? 'الاكثر مبيعا' - : 'Best Sellers', - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.all(4.0), - child: Container( - height: 50.0, - width: 55.0, - decoration: BoxDecoration( - color: Colors.orangeAccent.shade200 - .withOpacity(0.34), - borderRadius: BorderRadius.circular(5.0), - ), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - projectViewModel.isArabic - ? 'الاكثر مشاهدة' - : 'Most Viewed', - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ), - ], - ), - Row( - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.all(4.0), - child: Container( - height: 50.0, - width: 55.0, - decoration: BoxDecoration( - color: Colors.blue.shade200.withOpacity(0.34), - borderRadius: BorderRadius.circular(5.0), - ), - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - projectViewModel.isArabic - ? 'منتجات جديدة' - : 'New Products', - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.all(4.0), - child: InkWell( - onTap: () { - _scanQrAndGetPatient(context, model); - }, - child: Container( - height: 50.0, - width: 55.0, - decoration: BoxDecoration( - color: - Colors.purple.shade200.withOpacity(0.34), - borderRadius: BorderRadius.circular(5.0), - ), - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 10.0), - child: Texts( - projectViewModel.isArabic - ? 'شوهد مؤخرا' - : 'Recently Viewed', - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ), - ), - ], - ), - ], - )), - ], - ), - ), - ); - } - - _scanQrAndGetPatient( - BuildContext context, - PharmacyCategoriseViewModel model, - ) async { - /// When give qr we will change this method to get data - /// var result = await BarcodeScanner.scan(); - /// int patientID = get from qr result - var result = await BarcodeScanner.scan(); - if (result.rawContent == "") { - List listOfParams = result.rawContent.split(','); - // ScanQrRequestModel _scanQrRequestModel = ScanQrRequestModel( - // deliveryOrderID: int.parse(listOfParams[0]), groupID: 0); - String patientType = "1"; - await model.scanQr(); - if (model.state == ViewState.ErrorLocal) { - Utils.showErrorToast(model.error); - } else { - AppToast.showSuccessToast(message: model.scanList[0].id); - { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => LandingPagePharmacy()), - ); - } - } - } - } -} diff --git a/lib/pages/search_products_page.dart b/lib/pages/search_products_page.dart deleted file mode 100644 index 45cafd35..00000000 --- a/lib/pages/search_products_page.dart +++ /dev/null @@ -1,287 +0,0 @@ -import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; -import 'package:diplomaticquarterapp/uitl/utils.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/input/text_field.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; -import 'package:flutter/material.dart'; - -import 'base/base_view.dart'; - -class SearchProductsPage extends StatefulWidget { - @override - _SearchProductsPageState createState() => _SearchProductsPageState(); -} - -class _SearchProductsPageState extends State { - final textController = TextEditingController(); - final _formKey = GlobalKey(); - String msg = ''; - - @override - Widget build(BuildContext context) { - return BaseView( - onModelReady: (model) => model.clearSearchList(), - builder: (BuildContext context, PharmacyCategoriseViewModel model, - Widget child) => - PharmacyAppScaffold( - appBarTitle: 'Search', - isBottomBar: false, - isShowAppBar: true, - backgroundColor: Colors.white, - isShowDecPage: false, - //baseViewModel: model, - body: SingleChildScrollView( - child: Container( - height: SizeConfig.screenHeight, - child: Column( - children: [ - Padding( - padding: EdgeInsets.all(8.0), - child: Row( - children: [ - Container( - width: MediaQuery.of(context).size.width * 0.79, - child: Form( - key: _formKey, - child: TextFields( - autoFocus: true, - hintText: 'Search', - fontSize: 19.0, - prefixIcon: Icon(Icons.search), - inputAction: TextInputAction.search, - onSaved: (value) { - //searchMedicine(model, context); - }, - onSubmit: (value) { - searchMedicine(model, context); - msg = 'No Result Found'; - }, - controller: textController, - validator: (value) { - if (value.isEmpty) { - return 'please Enter Product Name'; - } - return null; - }, - ), - ), - ), - SizedBox( - width: 10.0, - ), - InkWell( - child: Texts( - 'Cancel', - fontSize: 17.0, - fontWeight: FontWeight.w500, - ), - onTap: () { - Navigator.pop(context); - }, - ), - - // child: Container( - // child: Button( - // backgroundColor: Colors.green, - // loading: model.state == ViewState.BusyLocal, - // label: 'Search', - // onTap: () { - // searchMedicine(model, context); - // }), - // width: MediaQuery.of(context).size.width * 0.09, - // ), - ], - ), - ), - Center( - child: NetworkBaseView( - baseViewModel: model, - child: model.searchList.isNotEmpty - ? Container( - height: MediaQuery.of(context).size.height * 0.80, - child: GridView.builder( - //physics: NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 1.0, - ), - itemCount: model.searchList.length, - itemBuilder: (BuildContext context, int index) { - return Card( - color: model.searchList[index].discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: - EdgeInsets.symmetric(horizontal: 0), - width: - MediaQuery.of(context).size.width / 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.searchList[index].images - .isNotEmpty - ? model.searchList[index] - .images[0].thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: model.searchList[index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: BorderRadius.only( - topLeft: - Radius.circular(6)), - ), - child: Texts( - model.searchList[index] - .rxMessage != - null - ? model.searchList[index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: FontWeight.w400, - ), - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - model.searchList[index].name, - regular: true, - fontSize: 12, - fontWeight: FontWeight.w400, - ), - Padding( - padding: const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.searchList[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .searchList[ - index] - .approvedRatingSum > - 0 - ? (model - .searchList[ - index] - .approvedRatingSum - .toDouble() / - model - .searchList[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.searchList[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ), - ); - }, - ), - ) - : Texts(msg), - ), - ) - ], - ), - ), - ), - ), - ); - } - - searchMedicine(PharmacyCategoriseViewModel model, BuildContext context) { - Utils.hideKeyboard(context); - if (_formKey.currentState.validate()) - model.searchProducts(productName: textController.text); - } -} diff --git a/lib/pages/sub_categorise_page.dart b/lib/pages/sub_categorise_page.dart deleted file mode 100644 index 45c9fd6c..00000000 --- a/lib/pages/sub_categorise_page.dart +++ /dev/null @@ -1,944 +0,0 @@ -import 'package:diplomaticquarterapp/core/viewModels/pharmacy_categorise_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; -import 'package:diplomaticquarterapp/widgets/others/app_scaffold_pharmacy_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -import 'base/base_view.dart'; -import 'final_products_page.dart'; - -class SubCategorisePage extends StatefulWidget { - String id; - String title; - String parentId; - - SubCategorisePage({this.id, this.parentId, this.title}); - @override - _SubCategorisePageState createState() => - _SubCategorisePageState(id: id, title: title, parentId: parentId); -} - -class _SubCategorisePageState extends State { - bool checkedBrands = false; - bool checkedCategorise = false; - String id; - String title; - String parentId; - _SubCategorisePageState({this.title, this.parentId, this.id}); - String categoriseName = "Personal Care"; - bool styleOne = true; - bool styleTwo = false; - Icon styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - @override - Widget build(BuildContext context) { - return BaseView( - onModelReady: (model) => model.getSubCategorise(i: id), - builder: (BuildContext context, PharmacyCategoriseViewModel model, - Widget child) => - PharmacyAppScaffold( - appBarTitle: title, - isBottomBar: false, - isShowAppBar: true, - backgroundColor: Colors.white, - isShowDecPage: false, - baseViewModel: model, - body: SingleChildScrollView( - child: Container( - height: MediaQuery.of(context).size.height * 5.97, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - child: Image.network( - parentId == '1' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089188_personal-care_2.png' - : parentId == '2' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089189_skin-care_2.png' - : parentId == '3' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089190_health-care_2.png' - : parentId == '4' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089191_sexual-health_2.png' - : parentId == '5' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089192_beauty_2.png' - : parentId == '6' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089193_baby-child_2.png' - : parentId == '7' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089194_vitamins-supplements_2.png' - : parentId == '8' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089195_diet-nutrition_2.png' - : parentId == '9' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089196_household_2.png' - : parentId == - '10' - ? 'https://uat.hmgwebservices.com/epharmacy/content/images/thumbs/0089197_home-care-appliances_2.png' - : '', - fit: BoxFit.fill, - height: 160.0, - width: double.infinity), - ), - if (model.subCategorise.length > 8) - Column( - children: [ - InkWell( - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: EdgeInsets.all(10.0), - child: Container( - child: Texts('View All Categories'), - ), - ), - Icon(Icons.arrow_forward) - ], - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return Container( - height: - MediaQuery.of(context).size.height * - 0.89, - color: Colors.white, - child: Center( - child: ListView.builder( - scrollDirection: Axis.vertical, - itemCount: - model.subCategorise.length, - itemBuilder: (BuildContext context, - int index) { - return Container( - child: Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Texts(model - .subCategorise[ - index] - .name), - Divider( - thickness: 0.6, - color: Colors.black12, - ) - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - FinalProductsPage( - id: model - .subCategorise[ - index] - .id, - ), - ), - ); - }, - ), - ), - ); - }), - ), - ); - }, - ); - }, - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - ], - ), - -//Expanded widget heree if nassery - Padding( - padding: EdgeInsets.only(top: 35.0), - child: Container( - height: MediaQuery.of(context).size.height * 0.2, - child: Center( - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: model.subCategorise.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.0), - child: InkWell( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: 13.0), - child: Container( - height: 60.0, - width: 65.0, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.orange.shade200 - .withOpacity(0.45), - ), - child: Center( - child: Icon( - Icons.apps_sharp, - size: 32.0, - ), - ), - ), - ), - Container( - width: MediaQuery.of(context) - .size - .width * - 0.17, - height: MediaQuery.of(context) - .size - .height * - 0.10, - child: Center( - child: Texts( - model.subCategorise[index].name, - fontSize: 14, - fontWeight: FontWeight.w600, - maxLines: 2, - ), - ), - ), - ], - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - FinalProductsPage( - id: model.subCategorise[index].id, - ), - ), - ); - }, - ), - ); - }), - ), - ), - ), - - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - InkWell( - child: Row( - children: [ - Icon(Icons.wrap_text), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: FontWeight.w600, - ), - ], - ), - onTap: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (BuildContext context) { - return DraggableScrollableSheet( - initialChildSize: 0.95, - maxChildSize: 0.95, - minChildSize: 0.9, - builder: (BuildContext context, - ScrollController scrollController) { - return SingleChildScrollView( - controller: scrollController, - child: Container( - height: MediaQuery.of(context) - .size - .height * - 1.95, - child: Column( - children: [ - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - children: [ - Icon( - Icons.wrap_text, - ), - SizedBox( - width: 10.0, - ), - Texts( - 'Refine', - fontWeight: - FontWeight.w600, - ), - SizedBox( - width: 250.0, - ), - InkWell( - child: Texts( - 'Close', - color: Colors.red, - fontWeight: - FontWeight.w600, - fontSize: 15.0, - ), - onTap: () { - Navigator.pop( - context); - }, - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - Column( - children: [ - ExpansionTile( - title: - Texts('Categorise'), - children: [ - Container( - height: 350, - child: ListView - .builder( - controller: - scrollController, - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .categoriseParent - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: - true, - title: Texts(model - .categoriseParent[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedCategorise, - onChanged: - (bool - value) { - setState( - () { - checkedCategorise = - value; - }); - }, - ); - }), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - ExpansionTile( - title: Texts('Brands'), - children: [ - Container( - height: 350, - child: ListView - .builder( - scrollDirection: - Axis - .vertical, - shrinkWrap: - true, - itemCount: model - .brandsList - .length, - itemBuilder: - (BuildContext - context, - int index) { - return CheckboxListTile( - tristate: - true, - title: Texts(model - .brandsList[index] - .name), - controlAffinity: - ListTileControlAffinity.leading, - value: - checkedBrands, - onChanged: - (bool - value) { - setState( - () { - checkedBrands = - value; - }); - }, - autofocus: - true, - ); - }), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - ExpansionTile( - title: Texts('Price'), - children: [ - Container( - color: Color( - 0xffEEEEEE), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceAround, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Texts( - 'Min'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), - ), - ), - ), - ], - ), - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - children: [ - Texts( - 'Max'), - Container( - color: Colors - .white, - width: - 200, - height: - 40, - child: - TextFormField( - decoration: - InputDecoration( - border: - OutlineInputBorder(), - ), - ), - ), - ], - ), - ], - ), - ) - ], - ), - Divider( - thickness: 1.0, - color: Colors.black12, - ), - SizedBox( - height: MediaQuery.of( - context) - .size - .height * - 0.4, - ), - Padding( - padding: - EdgeInsets.all(8.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment - .spaceEvenly, - children: [ - Container( - width: 100, - child: Button( - label: 'Reset', - backgroundColor: - Colors.red, - ), - ), - SizedBox( - width: 30, - ), - Container( - width: 200, - child: Button( - label: 'Apply', - backgroundColor: - Colors - .green, - ), - ), - ], - ), - ), - ], - ), - ], - ), - ), - ); - }); - }, - ); - }, - ), - Row( - children: [ - Container( - height: 44.0, - child: VerticalDivider( - color: Colors.black45, - thickness: 1.0, - //width: 0.3, - // indent: 0.0, - ), - ), - Padding( - padding: EdgeInsets.all(8.0), - child: InkWell( - child: styleIcon, - onTap: () { - setState(() { - if (styleOne == true) { - styleOne = false; - styleTwo = true; - styleIcon = Icon( - Icons.auto_awesome_mosaic, - color: Colors.blue, - size: 29.0, - ); - } else { - styleOne = true; - styleTwo = false; - styleIcon = Icon( - Icons.widgets_sharp, - color: Colors.blue, - size: 29.0, - ); - } - }); - }, - ), - ), - ], - ), - ], - ), - ), - Divider( - thickness: 1.0, - color: Colors.grey.shade400, - ), - styleOne == true - ? Container( - height: MediaQuery.of(context).size.height * 3.85, - child: GridView.builder( - physics: NeverScrollableScrollPhysics(), - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 0.5, - mainAxisSpacing: 2.0, - childAspectRatio: 1.0, - ), - itemCount: model.subProducts.length, - itemBuilder: (BuildContext context, int index) { - return NetworkBaseView( - baseViewModel: model, - child: Card( - color: model.subProducts[index] - .discountName != - null - ? Color(0xffFFFF00) - : Colors.white, - elevation: 0, - shape: Border( - right: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - left: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - bottom: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - top: BorderSide( - color: Colors.grey.shade300, - width: 1, - ), - ), - margin: EdgeInsets.symmetric( - horizontal: 8, - vertical: 4, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(110.0), - ), - color: Colors.white, - ), - padding: EdgeInsets.symmetric( - horizontal: 0), - width: MediaQuery.of(context) - .size - .width / - 3, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - margin: EdgeInsets.fromLTRB( - 0, 16, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.subProducts[index] - .images.isNotEmpty - ? model - .subProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.cover, - height: 80, - ), - ), - Container( - width: model - .subProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.subProducts[index] - .rxMessage != - null - ? model - .subProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - Container( - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - model.subProducts[index] - .name, - regular: true, - fontSize: 12, - fontWeight: - FontWeight.w400, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, - bottom: 4), - child: Texts( - "SAR ${model.subProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .subProducts[ - index] - .approvedRatingSum > - 0 - ? (model.subProducts[index].approvedRatingSum - .toDouble() / - model - .subProducts[index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.subProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ), - )); - }, - ), - ) - : Container( - height: MediaQuery.of(context).size.height * 5.0, - child: ListView.builder( - physics: NeverScrollableScrollPhysics(), - itemCount: model.subProducts.length, - itemBuilder: - (BuildContext context, int index) { - return Card( - child: Row( - children: [ - Stack( - children: [ - Column( - children: [ - Container( - decoration: BoxDecoration(), - child: Padding( - padding: EdgeInsets.only( - left: 9.0, - top: 8.0, - right: 10.0, - ), - ), - ), - Container( - margin: EdgeInsets.fromLTRB( - 0, 0, 0, 0), - alignment: Alignment.center, - child: Image.network( - model.subProducts[index] - .images.isNotEmpty - ? model - .subProducts[ - index] - .images[0] - .thumb - : 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', - fit: BoxFit.contain, - height: 80, - ), - ), - ], - ), - Column( - children: [ - Container( - width: model - .subProducts[ - index] - .rxMessage != - null - ? MediaQuery.of(context) - .size - .width / - 5 - : 0, - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: Color(0xffb23838), - borderRadius: - BorderRadius.only( - topLeft: Radius - .circular(6)), - ), - child: Texts( - model.subProducts[index] - .rxMessage != - null - ? model - .subProducts[ - index] - .rxMessage - : "", - color: Colors.white, - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ), - ), - ], - ), - ], - ), - Container( - height: 100.0, - margin: EdgeInsets.symmetric( - horizontal: 6, - vertical: 0, - ), - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceAround, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox( - height: 4.0, - ), - Container( - height: 35.0, - width: 250.0, - child: Texts( - model.subProducts[index] - .name, - regular: true, - fontSize: 13.2, - fontWeight: FontWeight.w500, - maxLines: 2, - ), - ), - SizedBox( - height: 8.0, - ), - Padding( - padding: - const EdgeInsets.only( - top: 4, bottom: 4), - child: Texts( - "SAR ${model.subProducts[index].price}", - bold: true, - fontSize: 14, - ), - ), - Row( - children: [ - StarRating( - totalAverage: model - .subProducts[ - index] - .approvedRatingSum > - 0 - ? (model - .subProducts[ - index] - .approvedRatingSum - .toDouble() / - model - .parentProducts[ - index] - .approvedRatingSum - .toDouble()) - .toDouble() - : 0, - forceStars: true), - Texts( - "(${model.subProducts[index].approvedTotalReviews})", - regular: true, - fontSize: 10, - fontWeight: - FontWeight.w400, - ) - ], - ), - ], - ), - ), - ], - ), - ); - }), - ) - ], - ), - ), - ), - )); - } -} diff --git a/lib/services/pharmacy_services/orderDetails_service.dart b/lib/services/pharmacy_services/orderDetails_service.dart deleted file mode 100644 index fb58097f..00000000 --- a/lib/services/pharmacy_services/orderDetails_service.dart +++ /dev/null @@ -1,39 +0,0 @@ - -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; -import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:flutter/material.dart'; - - -class OrderDetailsService extends BaseService{ - - AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); - - List get orderDetails => orderDetails; - List _orderList = List(); - List get orderList => _orderList; - - - Future getOrderDetails(orderId) async { - print("step 1"); - hasError = false; - await baseAppClient.getPharmacy(GET_ORDER_DETAILS+orderId, - onSuccess: (dynamic response, int statusCode) { - _orderList.clear(); - response['orders'].forEach((item) { - _orderList.add(OrderModel.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); - } -} \ No newline at end of file diff --git a/lib/services/pharmacy_services/order_service.dart b/lib/services/pharmacy_services/order_service.dart deleted file mode 100644 index d43d417b..00000000 --- a/lib/services/pharmacy_services/order_service.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; - - -class OrderService extends BaseService{ - AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); - - List _orderList = List(); - List get orderList => _orderList; -String url =""; - - Future getOrder(custmerId, page_id) async { - print("step 1"); - hasError = false; - url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=1&limit=200&customer_id=1367368"; -// url =GET_ORDER+"customer=1,fields=id,order_total,order_status,order_statusn,order_status_id,created_on_utc&page=$page_id&limit=200&customer_id=$custmerId"; - print(url); - await baseAppClient.getPharmacy(url, - onSuccess: (dynamic response, int statusCode) { - _orderList.clear(); - response['orders'].forEach((item) { - _orderList.add(OrderModel.fromJson(item)); - }); - print(response); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); - } - - -// Future getOrder(BuildContext context ) async { -// -// if (await this.sharedPref.getObject(USER_PROFILE) != null) { -// var data = AuthenticatedUser.fromJson( -// await this.sharedPref.getObject(USER_PROFILE)); -// authUser = data; -// } -// -// dynamic localRes; -// String URL; -// URL = GET_ORDER; -// -// await baseAppClient.get(URL, -// onSuccess: (response, statusCode) async { -// localRes = response; -// }, onFailure: (String error, int statusCode) { -// throw error; -// }); -// return Future.value(localRes); -// } -} \ No newline at end of file diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart deleted file mode 100644 index eae5ac8c..00000000 --- a/lib/services/pharmacy_services/pharmacyAddress_service.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:flutter/material.dart'; -import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyAddressesModel.dart'; - - -class PharmacyAddressService extends BaseService{ - List get address => address; - - AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); - - List _addressList = List(); - List get reviewList => _addressList; - - - Future getAddress() async { - print("step 1"); - hasError = false; - await baseAppClient.getPharmacy(GET_ORDER, - onSuccess: (dynamic response, int statusCode) { - _addressList.clear(); - response['customers'].forEach((item) { - _addressList.add(PharmacyAddressesModel.fromJson(item)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }); - }} \ No newline at end of file diff --git a/lib/services/pharmacy_services/wishList_service.dart b/lib/services/pharmacy_services/wishList_service.dart deleted file mode 100644 index 0f9687e8..00000000 --- a/lib/services/pharmacy_services/wishList_service.dart +++ /dev/null @@ -1,39 +0,0 @@ - -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; -import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; -import 'package:flutter/material.dart'; - - -class WishListService extends BaseService { - AppSharedPreferences sharedPref = AppSharedPreferences(); - AppGlobal appGlobal = new AppGlobal(); - - AuthenticatedUser authUser = new AuthenticatedUser(); - AuthProvider authProvider = new AuthProvider(); - - - Future getWishlist(BuildContext context) async { - - if (await this.sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson( - await this.sharedPref.getObject(USER_PROFILE)); - authUser = data; - } - - dynamic localRes; - String URL; - URL = GET_WISHLIST+"272843"+"?shopping_cart_type=2"; - await baseAppClient.get(URL, - onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - throw error; - }); - return Future.value(localRes); - } - -} diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 2d963988..0b2b45d9 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -325,11 +325,6 @@ class DateUtil { return ""; } - static String getFormattedDate(DateTime dateTime, String formattedString){ - return DateFormat(formattedString) - .format(dateTime); - } - static convertISODateToJsonDate(String isoDate) { return "/Date(" + DateFormat('mm-dd-yyy') diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 6339ceb0..e31ac717 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -147,7 +147,7 @@ class TranslationBase { String get idNo => localizedValues['national-id'][locale.languageCode]; String get fileNo => localizedValues['fileNo'][locale.languageCode]; - String get fileno => localizedValues['fileno'][locale.languageCode]; +String get fileno => localizedValues['fileno'][locale.languageCode]; String get forgotPassword => localizedValues['forgotFileNo'][locale.languageCode]; @@ -692,64 +692,6 @@ class TranslationBase { localizedValues['ServiceInformationButton'][locale.languageCode]; String get serviceInformationTitle => localizedValues['ServiceInformationTitle'][locale.languageCode]; - String get infoLab => localizedValues['info-lab'][locale.languageCode]; - String get infoRadiology => - localizedValues['info-radiology'][locale.languageCode]; - String get orders => localizedValues['orders'][locale.languageCode]; - String get lakum => localizedValues['lakum'][locale.languageCode]; - String get wishlist => localizedValues['wishlist'][locale.languageCode]; - String get reviews => localizedValues['reviews'][locale.languageCode]; - String get myPrescriptions => - localizedValues['myPrescriptions'][locale.languageCode]; - String get medicationRefill => - localizedValues['medicationRefill'][locale.languageCode]; - String get pillReminder => - localizedValues['pillReminder'][locale.languageCode]; - String get shippingAddresses => - localizedValues['shippingAddresses'][locale.languageCode]; - String get reachUs => localizedValues['reachUs'][locale.languageCode]; - String get ourLocations => - localizedValues['ourLocations'][locale.languageCode]; - String get edit => localizedValues['edit'][locale.languageCode]; - String get delete => localizedValues['delete'][locale.languageCode]; - String get addAddress => localizedValues['addAddress'][locale.languageCode]; - String get addNewAddress => - localizedValues['addNewAddress'][locale.languageCode]; - String get order => localizedValues['order'][locale.languageCode]; - String get delivered => localizedValues['delivered'][locale.languageCode]; - String get processing => localizedValues['processing'][locale.languageCode]; - String get pending => localizedValues['pending'][locale.languageCode]; - String get cancelled => localizedValues['cancelled'][locale.languageCode]; - String get writeReview => localizedValues['writeReview'][locale.languageCode]; - String get shareReview => localizedValues['shareReview'][locale.languageCode]; - String get backMyAccount => - localizedValues['backMyAccount'][locale.languageCode]; - String get reviewSuccessful => - localizedValues['reviewSuccessful'][locale.languageCode]; - String get reviewShared => - localizedValues['reviewShared'][locale.languageCode]; - String get reviewComment => - localizedValues['reviewComment'][locale.languageCode]; - String get shippedMethod => - localizedValues['shippedMethod'][locale.languageCode]; - String get orderDetail => localizedValues['orderDetail'][locale.languageCode]; - String get subtotal => localizedValues['subtotal'][locale.languageCode]; - String get shipping => localizedValues['shipping'][locale.languageCode]; - String get vat => localizedValues['vat'][locale.languageCode]; - String get total => localizedValues['total'][locale.languageCode]; - String get sar => localizedValues['sar'][locale.languageCode]; - String get payOnline => localizedValues['payOnline'][locale.languageCode]; - String get cancelOrder => localizedValues['cancelOrder'][locale.languageCode]; - String get confirmAddress => - localizedValues['confirmAddress'][locale.languageCode]; - String get confirmLocation => - localizedValues['confirmLocation'][locale.languageCode]; - String get confirmDeleteMsg => - localizedValues['confirmDeleteMsg'][locale.languageCode]; - String get confirmDelete => - localizedValues['confirmDelete'][locale.languageCode]; - String get confirmCancellation => - localizedValues['confirmCancellation'][locale.languageCode]; String get serviceInformation => localizedValues['ServiceInformation'][locale.languageCode]; String get homeHealthCare => @@ -761,54 +703,18 @@ class TranslationBase { String get loginRegister => localizedValues['LoginRegister'][locale.languageCode]; String get orderLog => localizedValues['OrderLog'][locale.languageCode]; - // String get infoLab => localizedValues['info-lab'][locale.languageCode]; - // String get infoRadiology => - - String get orderNumber => localizedValues['orderNumber'][locale.languageCode]; - String get orderDate => localizedValues['orderDate'][locale.languageCode]; - String get itemsNo => localizedValues['itemsNo'][locale.languageCode]; - String get noOrder => localizedValues['noOrder'][locale.languageCode]; + String get infoLab => localizedValues['info-lab'][locale.languageCode]; + String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; // pharmacy module - - String get offersAndPromotions => - localizedValues['offersAndPromotions'][locale.languageCode]; - - String get searchAndScanMedication => - localizedValues['searchAndScanMedication'][locale.languageCode]; - String get shopByBrands => - localizedValues['shopByBrands'][locale.languageCode]; - String get recentlyViewed => - localizedValues['recentlyViewed'][locale.languageCode]; + String get medicationRefill => localizedValues['medicationRefill'][locale.languageCode]; + String get offersAndPromotions => localizedValues['offersAndPromotions'][locale.languageCode]; + String get myPrescriptions => localizedValues['myPrescriptions'][locale.languageCode]; + String get searchAndScanMedication => localizedValues['searchAndScanMedication'][locale.languageCode]; + String get shopByBrands => localizedValues['shopByBrands'][locale.languageCode]; + String get recentlyViewed => localizedValues['recentlyViewed'][locale.languageCode]; String get bestSellers => localizedValues['bestSellers'][locale.languageCode]; - String get deleteAllItems => - localizedValues['deleteAllItems'][locale.languageCode]; - String get selectAddress => - localizedValues['selectAddress'][locale.languageCode]; - String get shippingAddress => - localizedValues['shippingAddress'][locale.languageCode]; - String get changeAddress => - localizedValues['changeAddress'][locale.languageCode]; - String get selectPaymentOption => - localizedValues['selectPaymentOption'][locale.languageCode]; - String get changeMethod => - localizedValues['changeMethod'][locale.languageCode]; - String get reviewOrder => localizedValues['reviewOrder'][locale.languageCode]; - String get orderSummary => - localizedValues['orderSummary'][locale.languageCode]; - String get active => localizedValues['active'][locale.languageCode]; - String get inactive => localizedValues['inactive'][locale.languageCode]; - String get balance => localizedValues['balance'][locale.languageCode]; - String get gained => localizedValues['gained'][locale.languageCode]; - String get consumed => localizedValues['consumed'][locale.languageCode]; - String get transferred => localizedValues['transferred'][locale.languageCode]; - String get checkBeneficiary => - localizedValues['checkBeneficiary'][locale.languageCode]; - String get beneficiaryName => - localizedValues['beneficiaryName'][locale.languageCode]; - String get accountActivation => - localizedValues['accountActivation'][locale.languageCode]; - String get acceptLbl => localizedValues['acceptLbl'][locale.languageCode]; + String get deleteAllItems => localizedValues['deleteAllItems'][locale.languageCode]; String get termsService => localizedValues['TermsService'][locale.languageCode]; @@ -834,11 +740,6 @@ class TranslationBase { String get selectAge => localizedValues['select-age'][locale.languageCode]; String get iAm => localizedValues['i-am'][locale.languageCode]; String get yearOld => localizedValues['years-old'][locale.languageCode]; - String get categorise => localizedValues['categorise'][locale.languageCode]; - String get cart => localizedValues['cart'][locale.languageCode]; - String get wishList => localizedValues['wishList'][locale.languageCode]; - String get searchProductHere => - localizedValues['searchProductHere'][locale.languageCode]; String get email => localizedValues['email'][locale.languageCode]; String get book => localizedValues['Book'][locale.languageCode]; String get appointmentLabel => @@ -900,8 +801,7 @@ class TranslationBase { String get modes => localizedValues['modes'][locale.languageCode]; String get vibration => localizedValues['vibration'][locale.languageCode]; String get blindMode => localizedValues['blind-modes'][locale.languageCode]; - String get invertTheme => - localizedValues['invert-theme'][locale.languageCode]; + String get invertTheme => localizedValues['invert-theme'][locale.languageCode]; String get offTheme => localizedValues['off-theme'][locale.languageCode]; String get dimTheme => localizedValues['dim-theme'][locale.languageCode]; String get bwTheme => localizedValues['bw-theme'][locale.languageCode]; @@ -915,18 +815,18 @@ class TranslationBase { localizedValues['accessibility'][locale.languageCode]; String get selectClinic => localizedValues['selectClinic'][locale.languageCode]; + String get reviews => + localizedValues['reviews'][locale.languageCode]; String get orderStatus => localizedValues['orderStatus'][locale.languageCode]; + String get cancelOrder => localizedValues['CancelOrder'][locale.languageCode]; String get findUs => localizedValues['FindUs'][locale.languageCode]; String get feedback => localizedValues['Feedback'][locale.languageCode]; String get liveChat => localizedValues['LiveChat'][locale.languageCode]; String get service => localizedValues['Service'][locale.languageCode]; - String get hMGServiceLabel => - localizedValues['HMGServiceLabel'][locale.languageCode]; - String get healthWeatherIndicators => - localizedValues['HealthWeatherIndicators'][locale.languageCode]; - String get healthTipsBasedOnCurrentWeather => - localizedValues['HealthTipsBasedOnCurrentWeather'][locale.languageCode]; + String get hMGServiceLabel => localizedValues['HMGServiceLabel'][locale.languageCode]; + String get healthWeatherIndicators => localizedValues['HealthWeatherIndicators'][locale.languageCode]; + String get healthTipsBasedOnCurrentWeather => localizedValues['HealthTipsBasedOnCurrentWeather'][locale.languageCode]; String get moreDetails => localizedValues['MoreDetails'][locale.languageCode]; String get sendCopy => localizedValues['SendCopy'][locale.languageCode]; String get resendOrder => localizedValues['ResendOrder'][locale.languageCode]; @@ -940,8 +840,7 @@ class TranslationBase { String get mass => localizedValues['mass'][locale.languageCode]; String get tempC => localizedValues['temp-c'][locale.languageCode]; String get bpm => localizedValues['bpm'][locale.languageCode]; - String get respirationSigns => - localizedValues['respiration-signs'][locale.languageCode]; + String get respirationSigns => localizedValues['respiration-signs'][locale.languageCode]; String get sysDias => localizedValues['sys-dias'][locale.languageCode]; String get body => localizedValues['body'][locale.languageCode]; String get feedbackTitle => localizedValues['feedback'][locale.languageCode]; @@ -950,39 +849,26 @@ class TranslationBase { String get likeToHear => localizedValues['like-to-hear'][locale.languageCode]; String get subject => localizedValues['subject'][locale.languageCode]; String get message => localizedValues['message'][locale.languageCode]; - String get emptySubject => - localizedValues['empty-subject'][locale.languageCode]; - String get emptyMessage => - localizedValues['empty-message'][locale.languageCode]; - String get selectAttachment => - localizedValues['select-attachment'][locale.languageCode]; - String get complainAppo => - localizedValues['complain-appo'][locale.languageCode]; - String get complainWithoutAppo => - localizedValues['complain-without-appo'][locale.languageCode]; + String get emptySubject => localizedValues['empty-subject'][locale.languageCode]; + String get emptyMessage => localizedValues['empty-message'][locale.languageCode]; + String get selectAttachment => localizedValues['select-attachment'][locale.languageCode]; + String get complainAppo => localizedValues['complain-appo'][locale.languageCode]; + String get complainWithoutAppo => localizedValues['complain-without-appo'][locale.languageCode]; String get question => localizedValues['question'][locale.languageCode]; - String get messageType => - localizedValues['message-type'][locale.languageCode]; + String get messageType => localizedValues['message-type'][locale.languageCode]; String get compliment => localizedValues['compliment'][locale.languageCode]; String get suggestion => localizedValues['suggestion'][locale.languageCode]; - String get yourFeedback => - localizedValues['your-feedback'][locale.languageCode]; + String get yourFeedback => localizedValues['your-feedback'][locale.languageCode]; String get selectPart => localizedValues['select-part'][locale.languageCode]; String get number => localizedValues['number'][locale.languageCode]; - String get notClassified => - localizedValues['not-classified'][locale.languageCode]; - String get searchItemError => - localizedValues['searchItemError'][locale.languageCode]; + String get notClassified => localizedValues['not-classified'][locale.languageCode]; + String get searchItemError => localizedValues['searchItemError'][locale.languageCode]; String get youCanFind => localizedValues['YouCanFind'][locale.languageCode]; - String get itemInSearch => - localizedValues['ItemInSearch'][locale.languageCode]; + String get itemInSearch => localizedValues['ItemInSearch'][locale.languageCode]; String get invoiceNo => localizedValues['InvoiceNo'][locale.languageCode]; - String get specialResult => - localizedValues['SpecialResult'][locale.languageCode]; - String get generalResult => - localizedValues['GeneralResult'][locale.languageCode]; - String get showMoreBtn => - localizedValues['show-more-btn'][locale.languageCode]; + String get specialResult => localizedValues['SpecialResult'][locale.languageCode]; + String get generalResult => localizedValues['GeneralResult'][locale.languageCode]; + String get showMoreBtn => localizedValues['show-more-btn'][locale.languageCode]; String get value => localizedValues['value'][locale.languageCode]; String get range => localizedValues['range'][locale.languageCode]; String get outpatient => localizedValues['out-patient'][locale.languageCode]; @@ -991,73 +877,47 @@ class TranslationBase { String get openRad => localizedValues['open-rad'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; String get vaccination => localizedValues['vaccination'][locale.languageCode]; - String get welcomeBackV => - localizedValues['welcomeBack'][locale.languageCode]; - String get instructions => - localizedValues['instructions'][locale.languageCode]; - String get updateEmail => - localizedValues['update-email'][locale.languageCode]; - String get updatedEmail => - localizedValues['updated-email'][locale.languageCode]; - String get viewListChildren => - localizedValues['view-list-children'][locale.languageCode]; + String get welcomeBackV => localizedValues['welcomeBack'][locale.languageCode]; + String get instructions => localizedValues['instructions'][locale.languageCode]; + String get updateEmail => localizedValues['update-email'][locale.languageCode]; + String get updatedEmail => localizedValues['updated-email'][locale.languageCode]; + String get viewListChildren => localizedValues['view-list-children'][locale.languageCode]; String get addChild => localizedValues['add-child'][locale.languageCode]; String get childName => localizedValues['child-name'][locale.languageCode]; String get childDob => localizedValues['childDob'][locale.languageCode]; - String get deletedChildMes => - localizedValues['deleted-child-mes'][locale.languageCode]; + String get delete => localizedValues['delete'][locale.languageCode]; + String get deletedChildMes => localizedValues['deleted-child-mes'][locale.languageCode]; String get visit => localizedValues['visit'][locale.languageCode]; - String get descriptionVaccination => - localizedValues['description-vaccination'][locale.languageCode]; + String get descriptionVaccination => localizedValues['description-vaccination'][locale.languageCode]; String get dueDate => localizedValues['due-date'][locale.languageCode]; String get validEmail => localizedValues['valid-email'][locale.languageCode]; - String get confirmSend => - localizedValues['confirm-send'][locale.languageCode]; - String get emailSuccess => - localizedValues['email-success'][locale.languageCode]; - String get deletedChild => - localizedValues['deleted-child'][locale.languageCode]; - String get addInstructions => - localizedValues['add-instructions'][locale.languageCode]; + String get confirmSend => localizedValues['confirm-send'][locale.languageCode]; + String get emailSuccess => localizedValues['email-success'][locale.languageCode]; + String get deletedChild => localizedValues['deleted-child'][locale.languageCode]; + String get addInstructions => localizedValues['add-instructions'][locale.languageCode]; String get addedChild => localizedValues['added-child'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; - String get ereferralSaveSuccess => - localizedValues['ereferralSaveSuccess'][locale.languageCode]; - String get year => localizedValues['Year'][locale.languageCode]; - String get month => localizedValues['Month'][locale.languageCode]; - String get point => localizedValues['point'][locale.languageCode]; - String get riyal => localizedValues['riyal'][locale.languageCode]; - String get termOfService => - localizedValues['termOfService'][locale.languageCode]; - String get shoppingCart => - localizedValues['shoppingCart'][locale.languageCode]; - - String get referralStatus => - localizedValues['referralStatus'][locale.languageCode]; - String get referralDate => - localizedValues['referralDate'][locale.languageCode]; + String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; + + String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; + String get referralDate => localizedValues['referralDate'][locale.languageCode]; String get patientName => localizedValues['patientName'][locale.languageCode]; - String get referralNumber => - localizedValues['referralNumber'][locale.languageCode]; + String get referralNumber => localizedValues['referralNumber'][locale.languageCode]; + String get requestID => localizedValues['requestID'][locale.languageCode]; String get OrderStatus => localizedValues['OrderStatus'][locale.languageCode]; String get pickupDate => localizedValues['pickupDate'][locale.languageCode]; String get serviceName => localizedValues['serviceName'][locale.languageCode]; - String get orderLocation => - localizedValues['orderLocation'][locale.languageCode]; - String get selectService => - localizedValues['selectService'][locale.languageCode]; - String get coveredService => - localizedValues['coveredService'][locale.languageCode]; - String get selectedService => - localizedValues['selectedService'][locale.languageCode]; - String get cancelOrderMsg => - localizedValues['cancelOrderMsg'][locale.languageCode]; - String get processDoneSuccessfully => - localizedValues['processDoneSuccessfully'][locale.languageCode]; - String get selectHomeHealthCareServices => - localizedValues['selectHomeHealthCareServices'][locale.languageCode]; + String get orderLocation => localizedValues['orderLocation'][locale.languageCode]; + String get selectService => localizedValues['selectService'][locale.languageCode]; + String get coveredService => localizedValues['coveredService'][locale.languageCode]; + String get selectAddress => localizedValues['selectAddress'][locale.languageCode]; + String get addNewAddress => localizedValues['addNewAddress'][locale.languageCode]; + String get selectedService => localizedValues['selectedService'][locale.languageCode]; + String get cancelOrderMsg => localizedValues['cancelOrderMsg'][locale.languageCode]; + String get processDoneSuccessfully => localizedValues['processDoneSuccessfully'][locale.languageCode]; + String get selectHomeHealthCareServices => localizedValues['selectHomeHealthCareServices'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/buttons/GestureIconButton.dart b/lib/widgets/buttons/GestureIconButton.dart index 62265985..841d7ea6 100644 --- a/lib/widgets/buttons/GestureIconButton.dart +++ b/lib/widgets/buttons/GestureIconButton.dart @@ -3,12 +3,12 @@ import 'package:flutter/material.dart'; class GestureIconButton extends StatefulWidget { GestureIconButton( - this.label, - this.icon, { - Key key, - this.onTap, - this.backgroundColor, - }) : super(key: key); + this.label, + this.icon, { + Key key, + this.onTap, + this.backgroundColor, + }) : super(key: key); final String label; final Widget icon; @@ -29,7 +29,6 @@ class _GestureIconButtonState extends State { setState(() => _buttonLongPress = !_buttonLongPress), onLongPressEnd: (_) => setState(() => _buttonLongPress = !_buttonLongPress), - onTap: () => {widget.onTap()}, child: Wrap( children: [ Container( diff --git a/lib/widgets/buttons/borderedButton.dart b/lib/widgets/buttons/borderedButton.dart index e297a10e..5e05448e 100644 --- a/lib/widgets/buttons/borderedButton.dart +++ b/lib/widgets/buttons/borderedButton.dart @@ -4,79 +4,55 @@ import 'package:flutter/material.dart'; class BorderedButton extends StatelessWidget { final String text; final Function handler; - final Color textColor; + final Color color; final bool hasBorder; final Color borderColor; final Color backgroundColor; final double vPadding; final double hPadding; - final double radius; - final double lPadding; - final double tPadding; - final double rPadding; - final double bPadding; - final double fontSize; - final Widget icon; - final FontWeight fontWeight; BorderedButton( this.text, { this.handler, - this.textColor, + this.color, this.hasBorder = false, this.borderColor, this.backgroundColor, this.vPadding = 0, this.hPadding = 0, - this.radius = 4.0, - this.lPadding = 4.0, - this.tPadding = 0.0, - this.rPadding = 4.0, - this.bPadding = 0.0, - this.fontSize = 0, - this.icon, - this.fontWeight, }); @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () { - handler(); - }, - child: Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, + return Container( + padding: EdgeInsets.symmetric(horizontal: 4, vertical: 4), + child: ButtonTheme( + //adds padding inside the button + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + //limits the touch area to the button area + minWidth: 0, + //wraps child's width + height: 0, + //wraps child's height + child: RaisedButton( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: EdgeInsets.symmetric(horizontal: 12, vertical: vPadding), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4.0), + side: BorderSide(color: hasBorder ? borderColor : Colors.white, width: 0.8),), color: backgroundColor ?? Colors.white, - borderRadius: BorderRadius.circular(radius), - border: Border.fromBorderSide(BorderSide( - color: hasBorder ? borderColor : Colors.white, - width: 0.8, - )), - ), - child: Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - icon != null ? icon : Container(), - Container( - padding: (hPadding > 0 || vPadding > 0) - ? EdgeInsets.symmetric( - vertical: vPadding, horizontal: hPadding) - : EdgeInsets.fromLTRB( - lPadding, tPadding, rPadding, bPadding), - child: Text( - text, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize == 0 ? SizeConfig.textMultiplier * 1.6 : fontSize, - fontWeight: fontWeight != null ? fontWeight : FontWeight.normal, - color: textColor ?? Color(0xffc4aa54)), - ), - ), - ], + textColor: color ?? Color(0xffc4aa54), + disabledTextColor: color ?? Colors.black, + disabledColor: backgroundColor ?? Colors.white, + onPressed: handler, + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.6, + fontWeight: FontWeight.normal), ), - ), + ), //your original button ), ); } diff --git a/lib/widgets/data_display/text.dart b/lib/widgets/data_display/text.dart index eb90221b..49f31354 100644 --- a/lib/widgets/data_display/text.dart +++ b/lib/widgets/data_display/text.dart @@ -217,7 +217,6 @@ class _TextsState extends State { : TextOverflow.ellipsis) : null, maxLines: widget.maxLines ?? null, - style: widget.style != null ? _getFontStyle().copyWith( fontStyle: widget.italic ? FontStyle.italic : null, diff --git a/lib/widgets/dialogs/radio-group-dialog.dart b/lib/widgets/dialogs/radio-group-dialog.dart deleted file mode 100644 index 5eff11bd..00000000 --- a/lib/widgets/dialogs/radio-group-dialog.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:diplomaticquarterapp/models/id-name-pair.dart'; -import 'package:flutter/material.dart'; - -// AppToast.showErrorToast(message: "Please select Time Slot to continue"); - -class RadioGroupDialog extends StatefulWidget { - - final BuildContext context; - final title; - final List list; - final okText; - final cancelText; - final Function(IdNamePair) okFunction; - final Function cancelFunction; - IdNamePair selectedValue; - - RadioGroupDialog( - {@required this.context, - @required this.title, - @required this.list, - @required this.okText, - @required this.cancelText, - @required this.okFunction, - @required this.cancelFunction}); - - - @override - RadioGroupState createState() => RadioGroupState(); -} - -class RadioGroupState extends State { - - @override - void initState() { - super.initState(); - widget.selectedValue = widget.selectedValue ?? widget.list[0]; - } - - @override - Widget build(BuildContext context) { - return showAlertDialog(context); - } - - showAlertDialog(BuildContext context) { - // set up the buttons - Widget cancelButton = FlatButton( - child: Text(this.widget.cancelText), - onPressed: () { - Navigator.of(context).pop(); - }); - Widget continueButton = - FlatButton(child: Text(this.widget.okText), onPressed: () { - this.widget.okFunction(widget.selectedValue); - Navigator.of(context).pop(); - }); - - // set up the AlertDialog - AlertDialog alert = AlertDialog( - title: Text(widget.title), - content: createDialogGroup(), - actions: [ - cancelButton, - continueButton, - ], - ); - return alert; - } - - static closeAlertDialog(BuildContext context) { - Navigator.of(context).pop(); - } - - Widget createDialogGroup(){ - return Container( - height: MediaQuery.of(context).size.height * 0.3, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - child: Column( - children: - widget.list.map((data) => RadioListTile( - title: Text("${data.name}"), - groupValue: widget.selectedValue.id, - value: data.id, - onChanged: (val) { - setState(() { - widget.selectedValue = data ; - }); - }, - )).toList(), - ), - ), - - ], - ), - ), - ); - } - -} diff --git a/lib/widgets/input/text_field.dart b/lib/widgets/input/text_field.dart index e044bb71..e31ae88a 100644 --- a/lib/widgets/input/text_field.dart +++ b/lib/widgets/input/text_field.dart @@ -73,7 +73,7 @@ class TextFields extends StatefulWidget { this.fontSize = 16.0, this.fontWeight = FontWeight.w700, this.autoValidate = false, - this.fillColor, + this.fillColor, this.hintColor}) : super(key: key); @@ -214,6 +214,7 @@ class _TextFieldsState extends State { blurRadius: focus ? 34.0 : 12.0) ]), child: TextFormField( + keyboardAppearance: Theme.of(context).brightness, scrollPhysics: BouncingScrollPhysics(), autovalidate: widget.autoValidate, @@ -252,12 +253,15 @@ class _TextFieldsState extends State { ] : widget.inputFormatters, decoration: InputDecoration( + counterText: "", hintText: widget.hintText, hintStyle: TextStyle( - fontSize: widget.fontSize, - fontWeight: widget.fontWeight, - color: widget.hintColor ?? Theme.of(context).hintColor, + fontSize: widget.fontSize, + fontWeight: widget.fontWeight, + color: widget.hintColor ?? Theme.of(context).hintColor, + + ), contentPadding: widget.padding != null ? widget.padding diff --git a/lib/widgets/others/app_scaffold_pharmacy_widget.dart b/lib/widgets/others/app_scaffold_pharmacy_widget.dart deleted file mode 100644 index 764089e9..00000000 --- a/lib/widgets/others/app_scaffold_pharmacy_widget.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; -import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; -import 'package:diplomaticquarterapp/routes.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; -import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; -import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; - -import '../../locator.dart'; -import 'floating_button_search.dart'; -import '../progress_indicator/app_loader_widget.dart'; -import 'arrow_back.dart'; -import 'network_base_view.dart'; -import 'not_auh_page.dart'; - -class PharmacyAppScaffold extends StatelessWidget { - final String appBarTitle; - final Widget body; - final Widget bottomSheet; - final bool isLoading; - final bool isShowAppBar; - final bool hasAppBarParam; - final BaseViewModel baseViewModel; - final bool isBottomBar; - final Widget floatingActionButton; - final String title; - final String description; - final bool isShowDecPage; - final Color backgroundColor; - - AuthenticatedUserObject authenticatedUserObject = - locator(); - - PharmacyAppScaffold( - {@required this.body, - this.appBarTitle = '', - this.isLoading = false, - this.isShowAppBar = false, - this.hasAppBarParam, - this.bottomSheet, - this.baseViewModel, - this.floatingActionButton, - this.title, - this.description, - this.isShowDecPage = true, - this.isBottomBar, - this.backgroundColor}); - - @override - Widget build(BuildContext context) { - AppGlobal.context = context; - - return Scaffold( - backgroundColor: - backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: Color(0xff5AB145), - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(authenticatedUserObject.isLogin - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [], - ) - : null, - body: (!authenticatedUserObject.isLogin && isShowDecPage) - ? NotAutPage( - title: appBarTitle, - description: description, - ) - : baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: baseViewModel, - ) - : buildBodyWidget(), - bottomSheet: bottomSheet, - floatingActionButton: floatingActionButton ?? floatingActionButton, - // bottomNavigationBar: - // this.isBottomBar == true ? BottomBarSearch() : SizedBox() - // floatingActionButton: FloatingSearchButton(), - ); - } - - buildAppLoaderWidget(bool isLoading) { - return isLoading ? AppLoaderWidget() : Container(); - } - - buildBodyWidget() { - // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [ - body, /*FloatingSearchButton()*/ - ]); - } -} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 07e76557..976b28e1 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -36,16 +36,12 @@ class AppScaffold extends StatelessWidget { final BaseViewModel baseViewModel; final bool isBottomBar; final Widget floatingActionButton; - final bool isPharmacy; final String title; final String description; final String image; final bool isShowDecPage; final List infoList; final Color backgroundColor; - final double preferredSize; - final List appBarIcons; - final PreferredSizeWidget appBarWidget; AuthenticatedUserObject authenticatedUserObject = locator(); @@ -59,45 +55,74 @@ class AppScaffold extends StatelessWidget { this.bottomSheet, this.baseViewModel, this.floatingActionButton, - this.isPharmacy = false, this.title, this.description, this.isShowDecPage = true, - this.isBottomBar, this.backgroundColor, - this.preferredSize = 0.0, - this.appBarIcons, - this.appBarWidget, + this.isBottomBar, this.image, this.infoList}); @override Widget build(BuildContext context) { AppGlobal.context = context; - PreferredSizeWidget appBar; - - if (this.appBarWidget == null) { - PreferredSizeWidget appBarWidget = AppBarWidget( - appBarTitle, - appBarIcons, - isShowAppBar, - isPharmacy: isPharmacy, - isShowDecPage: isShowDecPage, - image: image, - ); - appBar = preferredSize == 0 - ? appBarWidget - : PreferredSize( - child: appBarWidget, - preferredSize: Size.fromHeight(preferredSize)); - } else { - appBar = this.appBarWidget; - } return Scaffold( - backgroundColor: - backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, - appBar: appBar, + backgroundColor: backgroundColor ?? Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Texts( + authenticatedUserObject.isLogin || !isShowDecPage + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle, + color: Colors.white, + bold: true, + ), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + image != null + ? InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: InsuranceUpdate(), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + image, + height: SizeConfig.heightMultiplier * 5, + width: SizeConfig.heightMultiplier * 5, + color: Colors.white, + ), + ), + ) + : IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute( + builder: (context) => LandingPage()), + (Route r) => false); + }, + ), + ], + ) + : null, body: (!Provider.of(context, listen: false).isLogin && isShowDecPage) ? NotAutPage( @@ -105,7 +130,7 @@ class AppScaffold extends StatelessWidget { description: description, infoList: infoList, ) - : baseViewModel != null + : baseViewModel != null ? NetworkBaseView( child: buildBodyWidget(), baseViewModel: baseViewModel, @@ -130,97 +155,3 @@ class AppScaffold extends StatelessWidget { ]); } } - -class AppBarWidget extends StatelessWidget with PreferredSizeWidget { - final AuthenticatedUserObject authenticatedUserObject = - locator(); - - final String appBarTitle; - final List appBarIcons; - final bool isShowAppBar; - final bool isPharmacy; - final bool isShowDecPage; - final String image; - - AppBarWidget(this.appBarTitle, this.appBarIcons, this.isShowAppBar, - {this.isPharmacy = true, this.isShowDecPage = true, this.image}); - - @override - Widget build(BuildContext context) { - return buildAppBar(context); - } - - Widget buildAppBar(BuildContext context) { - return isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: - isPharmacy ? Colors.green : Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: - TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Texts( - authenticatedUserObject.isLogin || !isShowDecPage - ? appBarTitle.toUpperCase() - : TranslationBase.of(context).serviceInformationTitle, - color: Colors.white, - bold: true, - ), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - centerTitle: true, - actions: [ - isPharmacy - ? IconButton( - icon: Icon(Icons.shopping_cart), - color: Colors.white, - onPressed: () { - Navigator.of(context) - .popUntil(ModalRoute.withName('/')); - }) - : Container(), - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.white, - ), - ), - ) - : IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute( - builder: (context) => LandingPage()), - (Route r) => false); - }, - ), - if (appBarIcons != null) ...appBarIcons - ], - ) - : Container( - height: 0, - width: 0, - ); - } - - @override - Size get preferredSize => Size(double.maxFinite, 60); -} diff --git a/lib/widgets/others/points-expandable-notifier.dart b/lib/widgets/others/points-expandable-notifier.dart deleted file mode 100644 index 5f969765..00000000 --- a/lib/widgets/others/points-expandable-notifier.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:expandable/expandable.dart'; -import 'package:flutter/material.dart'; - -class PointsExpandableNotifier extends StatefulWidget { - final Widget headerWidget; - final Widget bodyWidget; - final Widget collapsed; - final bool isExpand; - bool expandFlag = false; - var controller = new ExpandableController(); - - PointsExpandableNotifier( - {this.headerWidget, this.bodyWidget, this.collapsed, this.isExpand}); - - @override - _PointsExpandableNotifierState createState() => - _PointsExpandableNotifierState(); -} - -class _PointsExpandableNotifierState extends State { - @override - Widget build(BuildContext context) { - setState(() { - if (widget.isExpand == true) { - widget.expandFlag = widget.isExpand; - widget.controller.expanded = true; - } - }); - - return ExpandableNotifier( - child: Padding( - padding: const EdgeInsets.only(left: 0, right: 0), - child: Column( - children: [ - SizedBox( - child: widget.headerWidget, - ), - ScrollOnExpand( - scrollOnExpand: true, - scrollOnCollapse: false, - child: ExpandablePanel( - theme: const ExpandableThemeData( - headerAlignment: ExpandablePanelHeaderAlignment.center, - tapBodyToCollapse: true, - ), - // header: widget.headerWidget, - /* - // setState(() { - // widget.expandFlag = !widget.expandFlag; - // if (widget.expandFlag == true) { - // widget.controller.expanded = true; - // } else { - // widget.controller.expanded = false; - // } - // }); - */ - collapsed: Container(), - expanded: widget.bodyWidget, - builder: (_, collapsed, expanded) { - return Padding( - padding: EdgeInsets.only(left: 0, right: 0, bottom: 0), - child: Expandable( - controller: widget.controller, - collapsed: collapsed, - expanded: expanded, - theme: const ExpandableThemeData(crossFadePoint: 0), - ), - ); - }, - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart deleted file mode 100644 index d9717c38..00000000 --- a/lib/widgets/pharmacy/bottom_nav_pharmacy_bar.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; - -import 'bottom_nav_pharmacy_home_item.dart'; -import 'bottom_nav_pharmacy_item.dart'; - -class BottomNavPharmacyBar extends StatefulWidget { - final ValueChanged changeIndex; - final int index; - BottomNavPharmacyBar({Key key, this.changeIndex, this.index}) - : super(key: key); - - @override - _BottomNavPharmacyBarState createState() => _BottomNavPharmacyBarState(); -} - -class _BottomNavPharmacyBarState extends State { - int _index = 0; - - _changeIndex(int index) { - widget.changeIndex(index); - } - - @override - Widget build(BuildContext context) { - return BottomAppBar( - elevation: 4, - shape: CircularNotchedRectangle(), - color: Colors.white, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 18), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - BottomNavHomeItem( - icon: EvaIcons.image, - activeIcon: EvaIcons.image, - changeIndex: _changeIndex, - index: widget.index, - currentIndex: 0, - ), - - Container( - height: 65.0, - child: Center( - child: VerticalDivider( - color: Colors.grey, - thickness: 0.5, - width: 0.3, - indent: 25.5, - ), - ), - ), - - BottomNavPharmacyItem( - icon: EvaIcons.list, - activeIcon: EvaIcons.list, - changeIndex: _changeIndex, - index: widget.index, - currentIndex: 1, - title: TranslationBase.of(context).categorise, - ), -// Expanded( -// child: SizedBox( -// height: 50, -// child: Column( -// mainAxisSize: MainAxisSize.min, -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// SizedBox(height: 22), -// ], -// ), -// ), -// ), - - // Added Calendar Icon to access book appointment flow - BottomNavPharmacyItem( - icon: EvaIcons.heart, - activeIcon: EvaIcons.heart, - changeIndex: _changeIndex, - index: widget.index, - currentIndex: 2, - title: TranslationBase.of(context).wishList), - - BottomNavPharmacyItem( - icon: EvaIcons.person, - activeIcon: EvaIcons.person, - changeIndex: _changeIndex, - index: widget.index, - currentIndex: 3, - title: TranslationBase.of(context).myAccount, - ), - BottomNavPharmacyItem( - icon: EvaIcons.shoppingCart, - activeIcon: EvaIcons.shoppingCart, - changeIndex: _changeIndex, - index: widget.index, - currentIndex: 4, - title: TranslationBase.of(context).cart) - ], - ), - ), - ); - } -} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart deleted file mode 100644 index c5c3519b..00000000 --- a/lib/widgets/pharmacy/bottom_nav_pharmacy_home_item.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; -import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:flutter/material.dart'; - -class BottomNavHomeItem extends StatelessWidget { - final IconData icon; - final Image image; - - final ValueChanged changeIndex; - final int index; - final int currentIndex; - final Function onTap; - final IconData activeIcon; - - BottomNavHomeItem( - {this.icon, - this.changeIndex, - this.index, - this.currentIndex, - this.activeIcon, - this.onTap, - this.image}); - - @override - Widget build(BuildContext context) { - return Expanded( - child: SizedBox( - // height: 72.0, - child: Material( - type: MaterialType.transparency, - child: InkWell( - highlightColor: Colors.transparent, - splashColor: Colors.transparent, - onTap: () => { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => LandingPage()), - ), - }, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - height: 15, - ), - currentIndex == index - ? Divider( - // color: Color(0xff5AB145), - thickness: 0.5, - ) - : Divider( - thickness: 0, - ), - Container( - child: Image.asset( - 'assets/images/habib-logo.png', - height: 35.0, - ), - ), - SizedBox( - height: 11, - ), - - // Added TextAlign Property - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart b/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart deleted file mode 100644 index 9d46e2eb..00000000 --- a/lib/widgets/pharmacy/bottom_nav_pharmacy_item.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:flutter/material.dart'; - -class BottomNavPharmacyItem extends StatelessWidget { - final String title; - final IconData icon; - - final ValueChanged changeIndex; - final int index; - final int currentIndex; - final Function onTap; - - final IconData activeIcon; - BottomNavPharmacyItem( - {this.icon, - this.changeIndex, - this.index, - this.currentIndex, - this.activeIcon, - this.title, - this.onTap}); - - @override - Widget build(BuildContext context) { - return Expanded( - child: SizedBox( - // height: 72.0, - child: Material( - type: MaterialType.transparency, - child: InkWell( - highlightColor: Colors.transparent, - splashColor: Colors.transparent, - onTap: () => changeIndex(currentIndex), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - height: 15, - ), - currentIndex == index - ? Divider( - color: Color(0xff5AB145), - thickness: 3.5, - ) - : Divider( - thickness: 0, - ), - Container( - child: Icon(currentIndex == index ? activeIcon : icon, - color: currentIndex == index - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColor, - size: 22.0), - ), - SizedBox( - height: 11, - ), - - // Added TextAlign Property - Texts( - title, - textAlign: TextAlign.center, - color: currentIndex == index - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColor, - fontSize: 11, - ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/pharmacy/product_tile.dart b/lib/widgets/pharmacy/product_tile.dart deleted file mode 100644 index e0182f08..00000000 --- a/lib/widgets/pharmacy/product_tile.dart +++ /dev/null @@ -1,230 +0,0 @@ -import 'package:diplomaticquarterapp/pages/pharmacy/order/ProductReview.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_html/style.dart'; - -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:rating_bar/rating_bar.dart'; -import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; - - - -class productTile extends StatelessWidget { - final String productName; - final String productPrice; - final double productRate; - final int productReviews; - final String qyt; - final String totalPrice; - final bool isOrderDetails; - - - productTile({this.productName, this.productPrice, this.productRate, - this.qyt, this.totalPrice, this.productReviews, - this.isOrderDetails=true}); - - @override - Widget build(BuildContext context) { - return Container( - height: 150, - width: double.infinity, - color: Colors.white, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Container( - margin: EdgeInsets.only(left: 10), - child: Image( - image: - AssetImage('assets/images/al-habib_onlne_pharmacy_bg.png'), - fit: BoxFit.cover, - width: 80, - height: 80, - ), - ), - Expanded( - flex: 5, - child: Column( - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: - productName, - style: TextStyle( - color: Colors.black54, - fontSize: 15, - fontWeight: FontWeight.bold), - ), - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: 'SAR $productPrice', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 13), - ), - ), - ), - ), - this.isOrderDetails == false ? Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ): Container(), - ], - ), - ), - this.isOrderDetails == false ? Expanded( - flex: 1, - child: Column ( - children: [ - Icon(FontAwesomeIcons.trashAlt, size: 15), - SizedBox(height: 50,), - Icon(FontAwesomeIcons.shoppingCart, size: 15), - ], - ), - ) : Container(), - ], - ), - this.isOrderDetails == true ?Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( -// margin: EdgeInsets.all(5), - child: RichText( - text: TextSpan( - text: 'QYT: $qyt', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.grey, - fontSize: 13), - ), - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - TranslationBase.of(context).total, - style: TextStyle( - color: Colors.grey, - fontSize: 13.0, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - RichText( - text: TextSpan( - text: ' $totalPrice SAR', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: 15), - ), - ), - ], - ), - ], - ), - ], - ), - ): Container(), - this.isOrderDetails == true ?Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RatingBar.readOnly( - initialRating: productRate, - size: 15.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - ), - Container( - margin: EdgeInsets.all(5), - child: Align( - alignment: Alignment.topLeft, - child: RichText( - text: TextSpan( - text: '($productReviews reviews)', - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.grey, - fontSize: 13), - ), - ), - ), - ), - InkWell( - onTap: () { - Navigator.push(context, - MaterialPageRoute(builder: (context) => ProductReviewPage())); - }, - child: Container( - padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), - height: 30.0, - decoration: BoxDecoration( - border: Border.all( - color: Colors.orange, - style: BorderStyle.solid, - width: 1.0 - ), - color: Colors.transparent, - borderRadius: BorderRadius.circular(5.0) - ), - child: Text( - TranslationBase.of(context).writeReview, - style: TextStyle( - fontSize:12, - color: Colors.orange, - ), - ), - ), - ), - ], - ) : Container(), - ], - ), - ); - } -} diff --git a/pubspec.yaml b/pubspec.yaml index dee882e6..d3c16056 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -82,9 +82,6 @@ dependencies: google_maps_flutter: ^1.0.3 - # Qr code Scanner TODO fix it - barcode_scanner: ^1.0.1 - barcode_scan: any # Qr code Scanner barcode_scan_fix: ^1.0.2 @@ -95,7 +92,7 @@ dependencies: table_calendar: ^2.3.0 # SVG Images - flutter_svg: any + flutter_svg: ^0.18.0 # Location Helper map_launcher: ^0.8.1 @@ -177,7 +174,6 @@ flutter: # assets: assets: - assets/images/ - - assets/images/pharmacy/ - assets/images/medical/ - assets/images/new-design/ - assets/images/login/ @@ -189,8 +185,6 @@ flutter: - assets/tracker/ - assets/images/AlHabibMedicalService/ - assets/images/pharmacy_module/ - - assets/images/pharmacy_module/payment/ - - assets/images/pharmacy_module/lakum/ fonts: From a1f91d99b3987b090ccffd4c780750c964f4df8f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 7 Dec 2020 10:32:21 +0300 Subject: [PATCH 65/69] added countdown timer in my appointments --- lib/pages/BookAppointment/BookConfirm.dart | 7 ++++--- .../widgets/AppointmentActions.dart | 2 +- .../widgets/AppointmentCardView.dart | 21 +++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/pages/BookAppointment/BookConfirm.dart b/lib/pages/BookAppointment/BookConfirm.dart index ed0f5bf1..7a247b78 100644 --- a/lib/pages/BookAppointment/BookConfirm.dart +++ b/lib/pages/BookAppointment/BookConfirm.dart @@ -16,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:rating_bar/rating_bar.dart'; import 'BookSuccess.dart'; @@ -39,13 +40,11 @@ class BookConfirm extends StatefulWidget { PatientShareResponse patientShareResponse; AuthenticatedUser authUser; - @override _BookConfirmState createState() => _BookConfirmState(); } class _BookConfirmState extends State { - ToDoCountProviderModel toDoProvider; @override @@ -59,6 +58,7 @@ class _BookConfirmState extends State { @override Widget build(BuildContext context) { + toDoProvider = Provider.of(context); return AppScaffold( appBarTitle: TranslationBase.of(context).bookAppo, isShowAppBar: true, @@ -426,9 +426,10 @@ class _BookConfirmState extends State { AppToast.showSuccessToast(message: "Appointment Booked Successfully"); print(res['AppointmentNo']); - Future.delayed(new Duration(milliseconds: 1800), () { + Future.delayed(new Duration(milliseconds: 500), () { getPatientShare(context, res['AppointmentNo'], docObject.clinicID, docObject.projectID, docObject); + getToDoCount(); }); } else { GifLoaderDialogUtils.hideDialog(context); diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index ce312a8d..c0399b8a 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -52,7 +52,6 @@ class _AppointmentActionsState extends State { @override void initState() { - toDoProvider = Provider.of(context); _getAppointmentActionButtons(); super.initState(); } @@ -60,6 +59,7 @@ class _AppointmentActionsState extends State { @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); + toDoProvider = Provider.of(context); var size = MediaQuery.of(context).size; final double itemHeight = projectViewModel.isArabic ? ((size.height - kToolbarHeight - 24) * 0.47) / 2 diff --git a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart index 71bde484..1bbe471a 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart @@ -1,6 +1,10 @@ import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; +import 'package:diplomaticquarterapp/pages/MyAppointments/models/AppointmentType.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_countdown_timer/current_remaining_time.dart'; +import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:rating_bar/rating_bar.dart'; import '../AppointmentDetails.dart'; @@ -104,6 +108,23 @@ class _ApointmentCardState extends State { ), ], ), + widget.appo.patientStatusType == AppointmentType.BOOKED ? + Container( + child: CountdownTimer( + endTime: DateTime.now().millisecondsSinceEpoch + + (widget.appo.remaniningHoursTocanPay * 1000) * + 60, + widgetBuilder: (_, CurrentRemainingTime time) { + return Text( + '${time.days}:${time.hours}:${time.min}:${time.sec} ' + + TranslationBase.of(context) + .upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color(0xff40ACC9))); + }, + ), + ) : Container(), ], ), ), From 2e2a29145ceb42e4d661881aac57a9444149c0ed Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 7 Dec 2020 10:27:06 +0200 Subject: [PATCH 66/69] fix merge issues --- lib/config/localized_values.dart | 2 +- lib/pages/landing/home_page.dart | 3 +-- lib/routes.dart | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 2891da6c..df63929a 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1307,7 +1307,7 @@ const Map localizedValues = { "referralNumber": { "en": "Referral Number", "ar": "رقم الإحالة" - } + }, "requestID": { "en": "Request ID", "ar": " رقم الطلب" diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index f6742789..9c82ff09 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -479,7 +479,7 @@ class _HomePageState extends State { opacity: 0.5, ), DashboardItem( - onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), + //onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), child: Center( child: Padding( @@ -677,7 +677,6 @@ class _HomePageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ DashboardItem( - opacity:1.0, child: Container( width: double.infinity, padding: EdgeInsets.all(10), diff --git a/lib/routes.dart b/lib/routes.dart index 84438456..78b79c0f 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -57,7 +57,7 @@ var routes = { SYMPTOM_CHECKER_INFO: (_) => SymptomInfo(), SELECT_GENDER: (_) => SelectGender(), SETTINGS: (_) => Settings(), - APP_UPDATE: (_) => AppUpdatePage() + APP_UPDATE: (_) => AppUpdatePage(), SETTINGS: (_) => Settings(), HEALTH_WEATHER: (_)=> HealthWeatherIndicator() }; From 935e72975c272e90696eebfbdcd0e583e838325f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 9 Dec 2020 10:22:02 +0200 Subject: [PATCH 67/69] add new privilege --- lib/pages/landing/home_page.dart | 1 + lib/pages/landing/landing_page.dart | 2 +- lib/pages/medical/reports/report_home_page.dart | 7 +++++-- lib/uitl/utils.dart | 2 +- lib/widgets/bottom_navigation/bottom_nav_bar.dart | 8 ++++++-- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 5624182a..2acb3047 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -627,6 +627,7 @@ class _HomePageState extends State { borderRadius: BorderRadius.circular(6.0), color: Colors.white, )), + if(projectViewModel.havePrivilege(60)) Container( width: MediaQuery.of(context).size.width * 0.29, child: InkWell( diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index b47a1e75..cc53a0a9 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -440,7 +440,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { index: currentTab, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, - floatingActionButton: currentTab == 0 + floatingActionButton: (projectViewModel.havePrivilege(34) && currentTab == 0) ? FloatingButton( elevation: true, onTap: () { diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 5c6812e2..4d913b31 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/reports_page.dart'; @@ -11,6 +12,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class HomeReportPage extends StatefulWidget { @override @@ -35,6 +37,7 @@ class _HomeReportPageState extends State @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getReports(), //model.getPrescriptions(), builder: (_, model, widget) => AppScaffold( @@ -143,7 +146,7 @@ class _HomeReportPageState extends State SizedBox(height: 110,) ], ), - bottomSheet: Container( + bottomSheet: projectViewModel.havePrivilege(21) ?Container( width: double.infinity, height: 90, margin: EdgeInsets.all(8.0), @@ -157,7 +160,7 @@ class _HomeReportPageState extends State ), ), ), - ), + ):null, ), ), ); diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index c92d4e69..34c0e58d 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -463,7 +463,7 @@ class Utils { ), )); } - + if (projectViewModel.havePrivilege(30)) medical.add(InkWell( onTap: () { Navigator.push(context, FadePage(page: SmartWatchInstructions())); diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 21cbebba..436e0737 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -1,9 +1,11 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../d_q_icons_icons.dart'; import 'bottom_navigation_item.dart'; @@ -26,6 +28,7 @@ class _BottomNavBarState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BottomAppBar( elevation: 4, shape: CircularNotchedRectangle(), @@ -52,7 +55,7 @@ class _BottomNavBarState extends State { currentIndex: 1, name: TranslationBase.of(context).medicalProfile, ), - if(widget.index == 0) + if(widget.index == 0 && projectViewModel.havePrivilege(34)) Expanded( child: SizedBox( height: 50, @@ -65,7 +68,7 @@ class _BottomNavBarState extends State { ), ), ), - if(widget.index != 0) + if(widget.index != 0 && projectViewModel.havePrivilege(34)) BottomNavigationItem( icon: EvaIcons.calendar, activeIcon: EvaIcons.calendar, @@ -83,6 +86,7 @@ class _BottomNavBarState extends State { currentIndex: 3, name: TranslationBase.of(context).myFamily, ), + if(projectViewModel.havePrivilege(51)) BottomNavigationItem( icon: EvaIcons.calendar, activeIcon: EvaIcons.calendar, From 9b8599a2cfa65c0093e552d8b60a2b4d35fbc2a6 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 9 Dec 2020 14:38:24 +0200 Subject: [PATCH 68/69] remove load user from SplashScreen --- lib/splashPage.dart | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/lib/splashPage.dart b/lib/splashPage.dart index a40eb0c5..aaffcbbd 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -30,28 +30,17 @@ class _SplashScreenState extends State { Timer( Duration(seconds: 1, milliseconds: 500), () { - getUserData().then((value) { - loadPrivilege().then((value) { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (BuildContext context) => LandingPage(), - ), - ); - }); + loadPrivilege().then((value) { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (BuildContext context) => LandingPage(), + ), + ); }); }, ); } - Future getUserData() async { - var data = await sharedPref.getObject(USER_PROFILE); - if (data != null) { - AuthenticatedUser userData = AuthenticatedUser.fromJson(data); - Provider.of(context, listen: false).isLogin = true; - authenticatedUserObject.isLogin = true; - authenticatedUserObject.user = userData; - } - } /// load the Privilege from service Future loadPrivilege() async { From a1e92e1fdd5253d46c4659fa69e4104e582a7462 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 9 Dec 2020 15:00:49 +0200 Subject: [PATCH 69/69] fix merge issue --- .../Authentication/check_activation_code_response.dart | 6 +++--- lib/pages/DrawerPages/family/my-family.dart | 9 +-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/models/Authentication/check_activation_code_response.dart b/lib/models/Authentication/check_activation_code_response.dart index 3a0aed65..55ba6559 100644 --- a/lib/models/Authentication/check_activation_code_response.dart +++ b/lib/models/Authentication/check_activation_code_response.dart @@ -270,7 +270,7 @@ class CheckActivationCode { } } -class List { +class Lists { String setupID; int patientType; int patientID; @@ -330,7 +330,7 @@ class List { dynamic tempAddress; dynamic zipCode; - List({ + Lists({ this.setupID, this.patientType, this.patientID, @@ -391,7 +391,7 @@ class List { this.zipCode, }); - List.fromJson(Map json) { + Lists.fromJson(Map json) { setupID = json['SetupID']; patientType = json['PatientType']; patientID = json['PatientID']; diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index f7acc1e8..196f9e19 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -6,24 +6,17 @@ import 'package:diplomaticquarterapp/models/Authentication/check_activation_code import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; -import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart' as list; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; -import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -39,7 +32,6 @@ class MyFamily extends StatefulWidget { } class _MyFamily extends State with TickerProviderStateMixin { - List imagesInfo = List(); final familyFileProvider = FamilyFilesProvider(); AppSharedPreferences sharedPref = new AppSharedPreferences(); var userID; @@ -51,6 +43,7 @@ class _MyFamily extends State with TickerProviderStateMixin { locator(); ProjectViewModel projectViewModel; AuthenticatedUser user; + List imagesInfo = List(); @override void initState() { _tabController = new TabController(length: 2, vsync: this, initialIndex: 0);