From b79edd701cfa9294e2a7317294056fbd31b21ab8 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 4 Sep 2022 12:44:38 +0300 Subject: [PATCH] code improvement & translation added. --- assets/langs/ar-SA.json | 7 + assets/langs/en-US.json | 7 + lib/classes/colors.dart | 1 + lib/extensions/int_extensions.dart | 4 + lib/extensions/string_extensions.dart | 2 +- lib/generated/codegen_loader.g.dart | 18 +- lib/generated/locale_keys.g.dart | 11 +- lib/provider/dashboard_provider_model.dart | 2 +- lib/ui/landing/dashboard_screen.dart | 10 +- lib/ui/profile/profile_screen.dart | 1 - .../fragments/items_for_sale.dart | 190 +++++++++--------- .../items_for_sale/item_for_sale_detail.dart | 7 +- .../items_for_sale/items_for_sale_home.dart | 23 +-- lib/ui/screens/my_requests/my_requests.dart | 91 ++++----- lib/ui/screens/my_requests/new_request.dart | 80 ++++---- .../offers_and_discounts_details.dart | 135 ++++++------- .../offers_and_discounts_home.dart | 39 ++-- 17 files changed, 307 insertions(+), 321 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 5353a84..082270f 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -363,6 +363,13 @@ "numberDays": "عدد الأيام", "poweredBy": "مشغل بواسطة", "cloudSolutions": "حلول السحابة", + "selectTemplate": "حدد قالب", + "myPostedAds": "إعلاناتي المنشورة", + "browseCategories": "تصفح الفئات", + "searchItems": "عناصر البحث", + "offerAndDiscounts": "العروض والخصومات", + "offerValid": "العرض صالح", + "offerExpired": "انتهى العرض", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 18bf326..1bf8cc7 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -363,6 +363,13 @@ "cloudSolutions": "Cloud Solutions", "subordinateLeave": "Subordinate Leave", "numberDays": "Number of days", + "selectTemplate": "Select Template", + "myPostedAds": "My posted ads", + "browseCategories": "Browse Categories", + "searchItems": "Search Items", + "offerAndDiscounts": "Offer & Discounts", + "offerValid": "Offer Valid", + "offerExpired": "Offer Expired", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart index 3469681..e1448ef 100644 --- a/lib/classes/colors.dart +++ b/lib/classes/colors.dart @@ -18,6 +18,7 @@ class MyColors { static const Color grey98Color = Color(0xff989898); static const Color lightGreyEFColor = Color(0xffEFEFEF); static const Color lightGreyEDColor = Color(0xffEDEDED); + static const Color lightGreyE3Color = Color(0xffE3E3E3); static const Color lightGreyE6Color = Color(0xffE6E6E6); static const Color lightGreyEAColor = Color(0xffEAEAEA); static const Color darkWhiteColor = Color(0xffE0E0E0); diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart index 215f8d9..f46d5bb 100644 --- a/lib/extensions/int_extensions.dart +++ b/lib/extensions/int_extensions.dart @@ -1,9 +1,13 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; extension IntExtensions on int { Widget get height => SizedBox(height: toDouble()); Widget get width => SizedBox(width: toDouble()); + Widget get divider => Divider(height: toDouble(), thickness: toDouble(), color: MyColors.lightGreyEFColor); + Widget get makeItSquare => SizedBox(width: toDouble(), height: toDouble()); } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 30c7e2e..5627f4c 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -15,7 +15,7 @@ extension CapExtension on String { extension EmailValidator on String { Widget get toWidget => Text(this); - Widget toText10({Color? color, bool isBold = false, int? maxLine}) => Text( + Widget toText10({Color? color, bool isBold = false, int? maxlines}) => Text( this, maxLines: maxlines, style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 255e04e..0dfa765 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -379,6 +379,13 @@ class CodegenLoader extends AssetLoader{ "numberDays": "عدد الأيام", "poweredBy": "مشغل بواسطة", "cloudSolutions": "حلول السحابة", + "selectTemplate": "حدد قالب", + "myPostedAds": "إعلاناتي المنشورة", + "browseCategories": "تصفح الفئات", + "searchItems": "عناصر البحث", + "offerAndDiscounts": "العروض والخصومات", + "offerValid": "العرض صالح", + "offerExpired": "انتهى العرض", "profile": { "reset_password": { "label": "Reset Password", @@ -774,10 +781,17 @@ static const Map en_US = { "hours": "Hours", "approvalStatus": "Approval Status", "absenceStatus": "Absence Status", - "subordinateLeave": "Subordinate Leave", - "numberDays": "Number of days", "poweredBy": "Powered By", "cloudSolutions": "Cloud Solutions", + "subordinateLeave": "Subordinate Leave", + "numberDays": "Number of days", + "selectTemplate": "Select Template", + "myPostedAds": "My posted ads", + "browseCategories": "Browse Categories", + "searchItems": "Search Items", + "offerAndDiscounts": "Offer & Discounts", + "offerValid": "Offer Valid", + "offerExpired": "Offer Expired", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 8c6247b..7214616 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -360,10 +360,17 @@ abstract class LocaleKeys { static const hours = 'hours'; static const approvalStatus = 'approvalStatus'; static const absenceStatus = 'absenceStatus'; - static const poweredBy = 'poweredBy'; - static const cloudSolutions = 'cloudSolutions'; static const subordinateLeave = 'subordinateLeave'; static const numberDays = 'numberDays'; + static const poweredBy = 'poweredBy'; + static const cloudSolutions = 'cloudSolutions'; + static const selectTemplate = 'selectTemplate'; + static const myPostedAds = 'myPostedAds'; + static const browseCategories = 'browseCategories'; + static const searchItems = 'searchItems'; + static const offerAndDiscounts = 'offerAndDiscounts'; + static const offerValid = 'offerValid'; + static const offerExpired = 'offerExpired'; static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index 5c4b20f..dca964d 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -159,7 +159,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { List menuList = await DashboardApiClient().getListMenu(); List findMyRequest = menuList.where((element) => element.menuName == "My Requests").toList(); if (findMyRequest.isNotEmpty) { - drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myTeam)); + drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests)); } List findMyTeam = menuList.where((element) => element.menuName == "My Team").toList(); if (findMyTeam.isNotEmpty) { diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index ad5ba1d..907072e 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -277,11 +277,9 @@ class _DashboardScreenState extends State { ], ), ), - InkWell( - onTap: () { - Navigator.pushNamed(context, AppRoutes.offersAndDiscounts); - }, - child: LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true)), + LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() { + Navigator.pushNamed(context, AppRoutes.offersAndDiscounts); + }) ], ).paddingOnly(left: 21, right: 21), Consumer( @@ -312,7 +310,7 @@ class _DashboardScreenState extends State { borderRadius: const BorderRadius.all( Radius.circular(100), ), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + border: Border.all(color: MyColors.lightGreyE3Color, width: 1), ), child: ClipRRect( borderRadius: const BorderRadius.all( diff --git a/lib/ui/profile/profile_screen.dart b/lib/ui/profile/profile_screen.dart index 8caf637..e72d3a9 100644 --- a/lib/ui/profile/profile_screen.dart +++ b/lib/ui/profile/profile_screen.dart @@ -17,7 +17,6 @@ import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/ui/profile/widgets/profile_panel.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; -// todo '@sultan' kindly follow structure of code written. use extension methods for widgets and dont hard code strings, use localizations class ProfileScreen extends StatefulWidget { const ProfileScreen({Key? key}) : super(key: key); diff --git a/lib/ui/screens/items_for_sale/fragments/items_for_sale.dart b/lib/ui/screens/items_for_sale/fragments/items_for_sale.dart index 93ea8e9..0e9f4db 100644 --- a/lib/ui/screens/items_for_sale/fragments/items_for_sale.dart +++ b/lib/ui/screens/items_for_sale/fragments/items_for_sale.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/api/items_for_sale/items_for_sale_api_client.dart'; @@ -9,9 +10,9 @@ import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/items_for_sale/get_items_for_sale_list.dart'; import 'package:mohem_flutter_app/models/items_for_sale/get_sale_categories_list.dart'; -import 'package:mohem_flutter_app/ui/screens/items_for_sale/items_for_sale_home.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; class ItemsForSaleFragment extends StatefulWidget { @@ -35,7 +36,7 @@ class _ItemsForSaleFragmentState extends State { gridScrollController.addListener(() { if (gridScrollController.position.atEdge) { bool isTop = gridScrollController.position.pixels == 0; - if (!isTop) { + if (!isTop && getItemsForSaleList.length == currentPageNo * 10) { print('At the bottom'); currentPageNo++; getItemsForSale(currentPageNo, currentCategoryID); @@ -47,103 +48,100 @@ class _ItemsForSaleFragmentState extends State { @override Widget build(BuildContext context) { - return SingleChildScrollView( + return ListView( controller: gridScrollController, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - DynamicTextFieldWidget( - "Search", - "Search Items", - isEnable: true, - suffixIconData: Icons.search, - isPopup: false, - lines: 1, - isInputTypeNum: false, - isReadOnly: false, - onChange: (String value) { - // _runFilter(value); - }, - ).paddingOnly(left: 21, right: 21, top: 21, bottom: 18), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - "Browse Categories".toText17(), - IconButton( - icon: const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0), - onPressed: () => Navigator.pop(context), - ), - ], - ).paddingOnly(left: 21, right: 21), - SizedBox( - height: 105.0, - child: getSaleCategoriesList.isNotEmpty - ? ListView.separated( - shrinkWrap: true, - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13), - scrollDirection: Axis.horizontal, - itemBuilder: (cxt, index) { - return AspectRatio( - aspectRatio: 1 / 1, - child: InkWell( - onTap: () { - setState(() { - currentCategoryID = getSaleCategoriesList[index].categoryID!; - getItemsForSaleList.clear(); - currentPageNo = 1; - getItemsForSale(currentPageNo, currentCategoryID); - }); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - boxShadow: [ - BoxShadow( - color: const Color(0xff000000).withOpacity(.05), - blurRadius: 26, - offset: const Offset(0, -3), - ), - ], - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SvgPicture.string(getSaleCategoriesList[index].content!, fit: BoxFit.contain), - currentCategoryID == getSaleCategoriesList[index].categoryID ? const Icon(Icons.check_circle_rounded, color: MyColors.greenColor, size: 16.0) : Container(), - ], - ).expanded, - getSaleCategoriesList[index].title!.toText10() - ], - ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), + children: [ + DynamicTextFieldWidget( + LocaleKeys.search.tr(), + LocaleKeys.searchItems.tr(), + isEnable: true, + suffixIconData: Icons.search, + isPopup: false, + lines: 1, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + // _runFilter(value); + }, + ).paddingOnly(left: 21, right: 21, top: 21), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.browseCategories.tr().toText17(), + // todo @haroon define the purpose of this icon button + IconButton( + icon: const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0), + onPressed: () => Navigator.pop(context), + ), + ], + ).paddingOnly(left: 21, right: 21), + SizedBox( + height: 105.0, + child: getSaleCategoriesList.isNotEmpty + ? ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13), + scrollDirection: Axis.horizontal, + itemBuilder: (cxt, index) { + return AspectRatio( + aspectRatio: 1 / 1, + child: InkWell( + onTap: () { + setState(() { + currentCategoryID = getSaleCategoriesList[index].categoryID!; + getItemsForSaleList.clear(); + currentPageNo = 1; + getItemsForSale(currentPageNo, currentCategoryID); + }); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SvgPicture.string(getSaleCategoriesList[index].content!, fit: BoxFit.contain), + currentCategoryID == getSaleCategoriesList[index].categoryID ? const Icon(Icons.check_circle_rounded, color: MyColors.greenColor, size: 16.0) : Container(), + ], + ).expanded, + getSaleCategoriesList[index].title!.toText10() + ], + ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), ), - ); - }, - separatorBuilder: (cxt, index) => 12.width, - itemCount: getSaleCategoriesList.length) - : Container(), - ), - getItemsForSaleList.isNotEmpty - ? GridView( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 162 / 266, crossAxisSpacing: 12, mainAxisSpacing: 12), - padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 21), - shrinkWrap: true, - primary: false, - physics: const ScrollPhysics(), - children: getItemsForSaleWidgets(), - ) - : Utils.getNoDataWidget(context).paddingOnly(top: 50), - // 32.height, - ], - ), + ), + ); + }, + separatorBuilder: (cxt, index) => 12.width, + itemCount: getSaleCategoriesList.length) + : Container(), + ), + getItemsForSaleList.isNotEmpty + ? GridView( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 162 / 266, crossAxisSpacing: 12, mainAxisSpacing: 12), + padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 21), + shrinkWrap: true, + primary: false, + physics: const ScrollPhysics(), + children: getItemsForSaleWidgets(), + ) + : Utils.getNoDataWidget(context).paddingOnly(top: 50), + // 32.height, + ], ); } diff --git a/lib/ui/screens/items_for_sale/item_for_sale_detail.dart b/lib/ui/screens/items_for_sale/item_for_sale_detail.dart index c85f4e0..8129b8a 100644 --- a/lib/ui/screens/items_for_sale/item_for_sale_detail.dart +++ b/lib/ui/screens/items_for_sale/item_for_sale_detail.dart @@ -1,10 +1,12 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/items_for_sale/get_items_for_sale_list.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -26,10 +28,7 @@ class _ItemForSaleDetailPageState extends State { getItemsForSaleList = ModalRoute.of(context)?.settings.arguments as GetItemsForSaleList; return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget(context, - // title: LocaleKeys.mowadhafhiRequest.tr(), - title: "Items for sale", - showHomeButton: true,), + appBar: AppBarWidget(context, title: LocaleKeys.itemsForSale.tr(), showHomeButton: true), body: SingleChildScrollView( child: Column( children: [ diff --git a/lib/ui/screens/items_for_sale/items_for_sale_home.dart b/lib/ui/screens/items_for_sale/items_for_sale_home.dart index 360c0ae..9f3151d 100644 --- a/lib/ui/screens/items_for_sale/items_for_sale_home.dart +++ b/lib/ui/screens/items_for_sale/items_for_sale_home.dart @@ -1,10 +1,11 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/models/items_for_sale/get_sale_categories_list.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/items_for_sale.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -24,10 +25,7 @@ class _ItemsForSaleState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget(context, - // title: LocaleKeys.mowadhafhiRequest.tr(), - title: "Items for sale", - showHomeButton: true), + appBar: AppBarWidget(context, title: LocaleKeys.itemsForSale.tr(), showHomeButton: true), body: Column( children: [ Container( @@ -48,7 +46,7 @@ class _ItemsForSaleState extends State { ), ), child: Row( - children: [myTab("Items for sale", 0), myTab("My posted ads", 1)], + children: [myTab(LocaleKeys.itemsForSale.tr(), 0), myTab("My posted ads", 1)], ), ), PageView( @@ -59,10 +57,7 @@ class _ItemsForSaleState extends State { tabIndex = pageIndex; }); }, - children: [ - ItemsForSaleFragment(), - MyPostedAdsFragment() - ], + children: [ItemsForSaleFragment(), MyPostedAdsFragment()], ).expanded, ], ), @@ -77,9 +72,11 @@ class _ItemsForSaleState extends State { ]), ), child: const Icon(Icons.add, color: Colors.white, size: 30), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.addNewItemForSale); - }) + ).onPress( + () { + Navigator.pushNamed(context, AppRoutes.addNewItemForSale); + }, + ), ); } diff --git a/lib/ui/screens/my_requests/my_requests.dart b/lib/ui/screens/my_requests/my_requests.dart index ebeff43..65aa534 100644 --- a/lib/ui/screens/my_requests/my_requests.dart +++ b/lib/ui/screens/my_requests/my_requests.dart @@ -49,45 +49,36 @@ class _MyRequestsState extends State { context, title: "Concurrent Reports", ), - body: Container( - width: double.infinity, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: const Color(0xff000000).withOpacity(.05), - blurRadius: 26, - offset: const Offset(0, -3), - ), - ], - ), - child: Column( - children: [ - 12.height, - Container( - padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 0), - margin: const EdgeInsets.only(left: 12, right: 12, top: 0, bottom: 0), - child: PopupMenuButton( - child: DynamicTextFieldWidget( - "Template Name", - selectedConcurrentProgramList?.uSERCONCURRENTPROGRAMNAME ?? "", - isEnable: false, - isPopup: true, - isInputTypeNum: true, - isReadOnly: false, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getConcurrentProgramsList!.length; i++) PopupMenuItem(child: Text(getConcurrentProgramsList![i].uSERCONCURRENTPROGRAMNAME!), value: i), - ], - onSelected: (int popupIndex) { - selectedConcurrentProgramList = getConcurrentProgramsList![popupIndex]; - getCCPTransactions(selectedConcurrentProgramList?.cONCURRENTPROGRAMNAME); - setState(() {}); - }), - ), - 12.height, - Expanded( + body: Column( + children: [ + ListView( + physics: const BouncingScrollPhysics(), + children: [ + Container( + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 0), + margin: const EdgeInsets.only(left: 12, right: 12, top: 0, bottom: 0), + child: PopupMenuButton( + child: DynamicTextFieldWidget( + LocaleKeys.templateName.tr(), + selectedConcurrentProgramList?.uSERCONCURRENTPROGRAMNAME ?? LocaleKeys.selectTemplate.tr(), + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getConcurrentProgramsList!.length; i++) PopupMenuItem(child: Text(getConcurrentProgramsList![i].uSERCONCURRENTPROGRAMNAME!), value: i), + ], + onSelected: (int popupIndex) { + selectedConcurrentProgramList = getConcurrentProgramsList![popupIndex]; + getCCPTransactions(selectedConcurrentProgramList?.cONCURRENTPROGRAMNAME); + setState(() {}); + }), + ), + 12.height, + Expanded( + // todo list don't have data, need to confirm later , because have issues, need fixes + child: ListView.separated( physics: const BouncingScrollPhysics(), shrinkWrap: true, @@ -149,21 +140,15 @@ class _MyRequestsState extends State { ); }, separatorBuilder: (BuildContext context, int index) => 12.height, - itemCount: getCCPTransactionsList.length ?? 0)), - 80.height, - Container( - decoration: const BoxDecoration( - color: MyColors.white, - boxShadow: [ - BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), - ], + itemCount: getCCPTransactionsList.length), ), - child: DefaultButton(LocaleKeys.createRequest.tr(), () async { - openNewRequest(); - }).insideContainer, - ) - ], - ), + ], + ).expanded, + 1.divider, + DefaultButton(LocaleKeys.createRequest.tr(), () async { + openNewRequest(); + }).insideContainer, + ], ), ); } diff --git a/lib/ui/screens/my_requests/new_request.dart b/lib/ui/screens/my_requests/new_request.dart index 4cc2b20..b476ecc 100644 --- a/lib/ui/screens/my_requests/new_request.dart +++ b/lib/ui/screens/my_requests/new_request.dart @@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_requests_api_client.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -27,7 +26,7 @@ class _NewRequestState extends State { List getConcurrentProgramsList = []; GetConcurrentProgramsModel? selectedConcurrentProgramList; - List getCCPDFFStructureModelList = []; + List? getCCPDFFStructureModelList; DateTime selectedDate = DateTime.now(); @@ -45,17 +44,16 @@ class _NewRequestState extends State { context, title: "Concurrent Reports", ), - body: Container( - child: Column( - children: [ - 12.height, - Container( - padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 0), - margin: const EdgeInsets.only(left: 12, right: 12, top: 0, bottom: 0), - child: PopupMenuButton( + body: Column( + children: [ + ListView( + padding: const EdgeInsets.all(21), + physics: const BouncingScrollPhysics(), + children: [ + PopupMenuButton( child: DynamicTextFieldWidget( - "Template Name", - selectedConcurrentProgramList?.uSERCONCURRENTPROGRAMNAME ?? "", + LocaleKeys.templateName.tr(), + selectedConcurrentProgramList?.uSERCONCURRENTPROGRAMNAME ?? LocaleKeys.selectTemplate.tr(), isEnable: false, isPopup: true, isInputTypeNum: true, @@ -69,32 +67,28 @@ class _NewRequestState extends State { getCCPDFFStructure(selectedConcurrentProgramList?.cONCURRENTPROGRAMNAME); setState(() {}); }), - ), - (getCCPDFFStructureModelList.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center - : ListView.separated( - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.all(21), - itemBuilder: (cxt, int parentIndex) => parseDynamicFormatType(getCCPDFFStructureModelList[parentIndex], parentIndex), - separatorBuilder: (cxt, index) => 0.height, - itemCount: getCCPDFFStructureModelList.length)) - .expanded, - Container( - decoration: const BoxDecoration( - color: MyColors.white, - boxShadow: [ - BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), - ], - ), - child: DefaultButton(LocaleKeys.submit.tr(), () async { - // openNewRequest(); - }) - .insideContainer, - ) - ], - ), + getCCPDFFStructureModelList == null + ? const SizedBox() + : (getCCPDFFStructureModelList!.isEmpty + ? LocaleKeys.noDataAvailable.tr().toText16().center + : ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: const EdgeInsets.all(0), + itemBuilder: (cxt, int parentIndex) => parseDynamicFormatType(getCCPDFFStructureModelList![parentIndex], parentIndex), + separatorBuilder: (cxt, index) => 0.height, + itemCount: getCCPDFFStructureModelList!.length, + )), + ], + ).expanded, + 1.divider, + DefaultButton(LocaleKeys.submit.tr(), () { + // todo need to add submit method + // openNewRequest(); + }) + .insideContainer, + ], ), - // bottomSheet: ); } @@ -132,9 +126,7 @@ class _NewRequestState extends State { isReadOnly: model.rEADONLY == "Y", onChange: (text) { model.fieldAnswer = text; - if (model.eSERVICESDV == null) { - model.eSERVICESDV = ESERVICESDV(); - } + model.eSERVICESDV ??= ESERVICESDV(); model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); @@ -146,9 +138,7 @@ class _NewRequestState extends State { isInputTypeNum: true, onChange: (text) { model.fieldAnswer = text; - if (model.eSERVICESDV == null) { - model.eSERVICESDV = ESERVICESDV(); - } + model.eSERVICESDV ??= ESERVICESDV(); model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); @@ -164,7 +154,7 @@ class _NewRequestState extends State { } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - displayText, + displayText.isEmpty ? LocaleKeys.pleaseSelectDate.tr() : displayText, suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { @@ -331,7 +321,7 @@ class _NewRequestState extends State { } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - displayText, + displayText.isEmpty ? LocaleKeys.pleaseSelectDate.tr() : displayText, suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { diff --git a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart index e1e216d..9a308ba 100644 --- a/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart +++ b/lib/ui/screens/offers_and_discounts/offers_and_discounts_details.dart @@ -50,86 +50,69 @@ class _OffersAndDiscountsDetailsState extends State { title: "Offers & Discounts", showHomeButton: true, ), - body: SingleChildScrollView( + body: ListView( controller: _scrollController, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: const Color(0xff000000).withOpacity(.05), - blurRadius: 26, - offset: const Offset(0, -3), - ), - ], + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Hero( + tag: "ItemImage" + getOffersList[0].rowID!, + // transitionOnUserGestures: true, + child: RepaintBoundary( + key: _globalKey, + child: ClipRRect( + borderRadius: BorderRadius.circular(6), + child: Image.network( + getOffersList[0].bannerImage!, + fit: BoxFit.contain, + ), + ).paddingAll(12), + ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + 8.height, + AppState().isArabic(context) + ? getOffersList[0].titleAR!.toText22(isBold: true, color: const Color(0xff2B353E)).center + : getOffersList[0].title!.toText22(isBold: true, color: const Color(0xff2B353E)).center, + Html( + data: AppState().isArabic(context) ? getOffersList[0].descriptionAR! : getOffersList[0].description ?? "", + onLinkTap: (String? url, RenderContext context, Map attributes, _) { + launchUrl(Uri.parse(url!)); + }, + ), + checkDate(getOffersList[0].endDate!).paddingOnly(left: 8), + 10.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Hero( - tag: "ItemImage" + getOffersList[0].rowID!, - // transitionOnUserGestures: true, - child: RepaintBoundary( - key: _globalKey, - child: ClipRRect( - borderRadius: BorderRadius.circular(6), - child: Image.network( - getOffersList[0].bannerImage!, - fit: BoxFit.contain, - ), - ).paddingAll(12), - ), - ), - 8.height, - AppState().isArabic(context) - ? getOffersList[0].titleAR!.toText22(isBold: true, color: const Color(0xff2B353E)).center - : getOffersList[0].title!.toText22(isBold: true, color: const Color(0xff2B353E)).center, - Html( - data: AppState().isArabic(context) ? getOffersList[0].descriptionAR! : getOffersList[0].description ?? "", - onLinkTap: (String? url, RenderContext context, Map attributes, _) { - launchUrl(Uri.parse(url!)); - }, - ), - checkDate(getOffersList[0].endDate!).paddingOnly(left: 8), - 10.height, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - getOffersList[0].discount!.toText16(isBold: true), - InkWell( - onTap: () { - _shareOfferAsImage(); - }, - child: const Icon(Icons.share, color: MyColors.darkIconColor).paddingOnly(bottom: 4)) - ], - ).paddingOnly(left: 8, right: 8), - getOffersList[0].isHasLocation == "true" - ? InkWell( - onTap: () {}, - child: Row( - children: [const Icon(Icons.map_sharp, color: MyColors.darkIconColor).paddingOnly(bottom: 4), "Offer Location".toText16(isUnderLine: true).paddingOnly(left: 8)], - ).paddingOnly(left: 8, right: 8, top: 8), - ) - : 12.height, + getOffersList[0].discount!.toText16(isBold: true), + InkWell( + onTap: () { + _shareOfferAsImage(); + }, + child: const Icon(Icons.share, color: MyColors.darkIconColor).paddingOnly(bottom: 4)) ], - ), - ).paddingOnly(left: 21, right: 21, top: 21), - "Related Offers".toText22(isBold: true, color: const Color(0xff2B353E)).paddingAll(21.0), - GridView( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 162 / 266, crossAxisSpacing: 12, mainAxisSpacing: 12), - padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 21), - shrinkWrap: true, - primary: false, - physics: const ScrollPhysics(), - children: getItemsForSaleWidgets(), - ), - 50.height, - ], - ), + ).paddingOnly(left: 8, right: 8), + getOffersList[0].isHasLocation == "true" + ? InkWell( + onTap: () {}, + child: Row( + children: [const Icon(Icons.map_sharp, color: MyColors.darkIconColor).paddingOnly(bottom: 4), "Offer Location".toText16(isUnderLine: true).paddingOnly(left: 8)], + ).paddingOnly(left: 8, right: 8, top: 8), + ) + : 12.height, + ], + ).objectContainerView().paddingOnly(left: 21, right: 21, top: 21), + "Related Offers".toText22(isBold: true, color: const Color(0xff2B353E)).paddingOnly(left: 21, right: 21, top: 21), + GridView( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 162 / 266, crossAxisSpacing: 12, mainAxisSpacing: 12), + padding: const EdgeInsets.all(21), + shrinkWrap: true, + primary: false, + physics: const ScrollPhysics(), + children: getItemsForSaleWidgets(), + ), + ], ), ); } diff --git a/lib/ui/screens/offers_and_discounts/offers_and_discounts_home.dart b/lib/ui/screens/offers_and_discounts/offers_and_discounts_home.dart index bdf6ed5..fed4583 100644 --- a/lib/ui/screens/offers_and_discounts/offers_and_discounts_home.dart +++ b/lib/ui/screens/offers_and_discounts/offers_and_discounts_home.dart @@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_categories_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -37,20 +38,15 @@ class _OffersAndDiscountsHomeState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - // title: LocaleKeys.mowadhafhiRequest.tr(), - title: "Offers & Discounts", - showHomeButton: true, - ), + appBar: AppBarWidget(context, title: LocaleKeys.offerAndDiscounts.tr(), showHomeButton: true), body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ DynamicTextFieldWidget( - "Search", - "Search Items", + LocaleKeys.search.tr(), + LocaleKeys.searchItems.tr(), isEnable: true, suffixIconData: Icons.search, isPopup: false, @@ -60,17 +56,16 @@ class _OffersAndDiscountsHomeState extends State { onChange: (String value) { // _runFilter(value); }, - ).paddingOnly(left: 21, right: 21, top: 21, bottom: 18), + ).paddingOnly(left: 21, right: 21, top: 21), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "Browse Categories".toText17(), - IconButton( - icon: const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0), - onPressed: () => Navigator.pop(context), - ), + LocaleKeys.browseCategories.tr().toText17(), + const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0).onPress(() { + Navigator.pop(context); + }), ], - ).paddingOnly(left: 21, right: 21), + ).paddingOnly(left: 21, right: 21, top: 21), SizedBox( height: 110.0, child: getCategoriesList.isNotEmpty @@ -120,7 +115,7 @@ class _OffersAndDiscountsHomeState extends State { currentCategoryID == getCategoriesList[index].id ? const Icon(Icons.check_circle_rounded, color: MyColors.greenColor, size: 16.0) : Container(), ], ).expanded, - AppState().isArabic(context) ? getCategoriesList[index].categoryNameAr!.toText10(maxLine: 1) : getCategoriesList[index].categoryNameEn!.toText10(maxLine: 1) + AppState().isArabic(context) ? getCategoriesList[index].categoryNameAr!.toText10(maxlines: 1) : getCategoriesList[index].categoryNameEn!.toText10(maxlines: 1) ], ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), ), @@ -195,7 +190,9 @@ class _OffersAndDiscountsHomeState extends State { ), ), 10.height, - AppState().isArabic(context) ? getOffersList.titleAR!.toText16(isBold: true, color: const Color(0xff2B353E), maxlines: 1) : getOffersList.title!.toText16(isBold: true, color: const Color(0xff2B353E), maxlines: 1), + AppState().isArabic(context) + ? getOffersList.titleAR!.toText16(isBold: true, color: const Color(0xff2B353E), maxlines: 1) + : getOffersList.title!.toText16(isBold: true, color: const Color(0xff2B353E), maxlines: 1), // Html( // data: AppState().isArabic(context) ? getOffersList.descriptionAR! : getOffersList.description ?? "", // // onLinkTap: (String? url, RenderContext context, Map attributes, _) { @@ -224,8 +221,8 @@ class _OffersAndDiscountsHomeState extends State { getOffersDetailList.add(offersListModelObj); getOffersList.forEach((element) { - if(counter <= 4) { - if(element.rowID != offersListModelObj.rowID) { + if (counter <= 4) { + if (element.rowID != offersListModelObj.rowID) { getOffersDetailList.add(element); counter++; } @@ -238,9 +235,9 @@ class _OffersAndDiscountsHomeState extends State { Widget checkDate(String endDate) { DateTime endDateObj = DateFormat("yyyy-MM-dd").parse(endDate); if (endDateObj.isAfter(DateTime.now())) { - return "Offer Valid".toText14(isBold: true, color: MyColors.greenColor); + return LocaleKeys.offerValid.tr().toText14(isBold: true, color: MyColors.greenColor); } else { - return "Offer Expired".toText14(isBold: true, color: MyColors.redColor); + return LocaleKeys.offerExpired.tr().toText14(isBold: true, color: MyColors.redColor); } }