From 5689e98a432f78a411a3f80f97a4b947c95ed058 Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Thu, 18 Sep 2025 10:27:16 +0330 Subject: [PATCH] refactors on codes --- lib/view_models/your_tenders_view_model.dart | 57 +++ .../detail/pages/detail_desktop_page.dart | 5 + .../detail/pages/detail_tablet_page.dart | 5 + .../final_completion_of_documents_screen.dart | 24 +- .../pages/liked_tenders_desktop_page.dart | 275 ++++++------ .../pages/liked_tenders_tablet_page.dart | 404 +++++++----------- .../widgets/like_filters_bottom_sheet.dart | 66 +++ .../widgets/like_filters_drawer.dart | 73 ++++ .../widgets/liked_tenders_filter_drawer.dart | 136 ------ lib/views/profile/pages/d_profile_page.dart | 54 +-- lib/views/profile/pages/m_profile_page.dart | 54 +-- lib/views/profile/pages/t_profile_page.dart | 54 +-- lib/views/shared/tablet_desktop_appbar.dart | 55 +++ .../shared/tablet_navigation_widget.dart | 2 + .../pages/your_tenders_desktop_page.dart | 195 +++++---- .../pages/your_tenders_tablet_page.dart | 195 +++++---- .../widgets/tablet_desktop_appbar.dart | 33 -- .../your_tenders/widgets/tender_card.dart | 41 +- 18 files changed, 857 insertions(+), 871 deletions(-) create mode 100644 lib/views/liked_tenders/widgets/like_filters_bottom_sheet.dart create mode 100644 lib/views/liked_tenders/widgets/like_filters_drawer.dart delete mode 100644 lib/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart create mode 100644 lib/views/shared/tablet_desktop_appbar.dart delete mode 100644 lib/views/your_tenders/widgets/tablet_desktop_appbar.dart diff --git a/lib/view_models/your_tenders_view_model.dart b/lib/view_models/your_tenders_view_model.dart index 981576b..b36c801 100644 --- a/lib/view_models/your_tenders_view_model.dart +++ b/lib/view_models/your_tenders_view_model.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/result.dart'; import 'package:tm_app/data/repositories/your_tenders_repository.dart'; import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart'; import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart'; import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart'; +import '../core/constants/assets.dart'; import '../core/constants/tender_approval_status.dart'; import '../core/constants/tender_feedback.dart'; import '../data/services/model/request_models/get_tenders_request_model/get_tenders_request_model.dart'; @@ -322,4 +324,59 @@ class YourTendersViewModel with ChangeNotifier { await callWithFilter(); } + + Color getBackGroundColorByStatus(String status) { + if (status == TenderFeedback.liked.value || + status == TenderApprovalStatus.submitted.value) { + return AppColors.green0; + } else if (status == TenderFeedback.disliked.value || + status == TenderApprovalStatus.rejected.value) { + return AppColors.red0; + } + return AppColors.grey0; + } + + Color getBorderColorByStatus(String status) { + if (status == TenderFeedback.liked.value || + status == TenderApprovalStatus.submitted.value) { + return AppColors.green10; + } else if (status == TenderFeedback.disliked.value || + status == TenderApprovalStatus.rejected.value) { + return AppColors.red10; + } + return AppColors.grey30; + } + + Color getStatusCardColorByStatus(String status) { + if (status == TenderFeedback.liked.value || + status == TenderApprovalStatus.submitted.value) { + return AppColors.green20; + } else if (status == TenderFeedback.disliked.value || + status == TenderApprovalStatus.rejected.value) { + return AppColors.red10; + } + return AppColors.grey0; + } + + Color getStatusTextColorByStatus(String status) { + if (status == TenderFeedback.liked.value || + status == TenderApprovalStatus.submitted.value) { + return AppColors.green30; + } else if (status == TenderFeedback.disliked.value || + status == TenderApprovalStatus.rejected.value) { + return AppColors.red20; + } + return AppColors.grey60; + } + + String? getStatusIconByStatus(String status) { + if (status == TenderFeedback.liked.value || + status == TenderApprovalStatus.submitted.value) { + return AssetsManager.tickCircle; + } else if (status == TenderFeedback.disliked.value || + status == TenderApprovalStatus.rejected.value) { + return AssetsManager.closeCircle; + } + return null; + } } diff --git a/lib/views/detail/pages/detail_desktop_page.dart b/lib/views/detail/pages/detail_desktop_page.dart index dd7dfa1..f7c3716 100644 --- a/lib/views/detail/pages/detail_desktop_page.dart +++ b/lib/views/detail/pages/detail_desktop_page.dart @@ -10,6 +10,7 @@ import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; import '../../../core/constants/tender_approval_status.dart'; import '../../../core/utils/app_toast.dart'; import '../../shared/desktop_navigation_widget.dart'; +import '../../shared/tablet_desktop_appbar.dart'; import '../strings/tender_details_strings.dart'; class TenderDetailDesktopPage extends StatefulWidget { @@ -118,6 +119,10 @@ class _TenderDetailDesktopPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + const TabletDesktopAppbar( + title: TenderDetailsStrings.tenderDetailTitle, + ), + SizedBox(height: 32.0.h()), TenderDetailHeader( isScreenBig: true, detail: detail, diff --git a/lib/views/detail/pages/detail_tablet_page.dart b/lib/views/detail/pages/detail_tablet_page.dart index a57b9b1..1ce8b60 100644 --- a/lib/views/detail/pages/detail_tablet_page.dart +++ b/lib/views/detail/pages/detail_tablet_page.dart @@ -11,6 +11,7 @@ import 'package:tm_app/views/shared/tablet_navigation_widget.dart'; import '../../../core/constants/tender_approval_status.dart'; import '../../../core/utils/app_toast.dart'; +import '../../shared/tablet_desktop_appbar.dart'; import '../../shared/tender_app_bar.dart'; import '../strings/tender_details_strings.dart'; @@ -125,6 +126,10 @@ class _TenderDetailTabletPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + const TabletDesktopAppbar( + title: TenderDetailsStrings.tenderDetailTitle, + ), + SizedBox(height: 28.0.h()), TenderDetailHeader(isScreenBig: true, detail: detail), SizedBox(height: 28.0.h()), TenderDetailCard(detail: detail), diff --git a/lib/views/final_completion_of_documents/pages/final_completion_of_documents_screen.dart b/lib/views/final_completion_of_documents/pages/final_completion_of_documents_screen.dart index 984e9b7..19c1a30 100644 --- a/lib/views/final_completion_of_documents/pages/final_completion_of_documents_screen.dart +++ b/lib/views/final_completion_of_documents/pages/final_completion_of_documents_screen.dart @@ -1,7 +1,6 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; @@ -11,6 +10,7 @@ import 'package:tm_app/views/final_completion_of_documents/strings/final_complet import 'package:tm_app/views/final_completion_of_documents/widgets/comment_box.dart'; import 'package:tm_app/views/login/widgets/widgets.dart'; import 'package:tm_app/views/shared/desktop_navigation_widget.dart'; +import 'package:tm_app/views/shared/tablet_desktop_appbar.dart'; import '../../shared/main_drop_down.dart'; @@ -33,27 +33,13 @@ class FinalCompletionOfDocumentsScreen extends StatelessWidget { child: SingleChildScrollView( child: Column( children: [ - Row( - children: [ - InkWell( - borderRadius: BorderRadius.circular(12), - onTap: () => context.pop(), - child: SvgPicture.asset( - AssetsManager.arrowLeft, - ), - ), - const SizedBox(width: 8.0), - Text( + const TabletDesktopAppbar( + title: FinalCompletionOfDocumentsStrings .completionOfDocuments, - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.bold, - color: AppColors.grey70, - ), - ), - ], ), + SizedBox(height: 32.0.h()), + const SizedBox(height: 32.0), const CommentBox(), const SizedBox(height: 32.0), diff --git a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart index 92f83e6..f0c727c 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart @@ -4,15 +4,17 @@ import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/data/services/model/liked_tender_feedback/liked_tender_feedback.dart'; import 'package:tm_app/data/services/model/tender_approvals_data/tender_approvals_data.dart'; import 'package:tm_app/view_models/liked_tenders_view_model.dart'; -import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart'; import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_list_item.dart'; import 'package:tm_app/views/shared/page_selection_dialog.dart'; import '../../../core/utils/app_toast.dart'; import '../../shared/desktop_navigation_widget.dart'; +import '../../shared/tablet_desktop_appbar.dart'; import '../strings/liked_tenders_strings.dart'; +import '../widgets/like_filters_drawer.dart'; class LikedTendersDesktopPage extends StatefulWidget { const LikedTendersDesktopPage({super.key}); @@ -24,6 +26,7 @@ class LikedTendersDesktopPage extends StatefulWidget { class _LikedTendersDesktopPageState extends State { late final LikedTendersViewModel viewModel; + final GlobalKey scaffoldKey = GlobalKey(); @override void initState() { viewModel = context.read(); @@ -54,11 +57,24 @@ class _LikedTendersDesktopPageState extends State { }); }, child: Scaffold( + key: scaffoldKey, backgroundColor: AppColors.backgroundColor, - endDrawer: const LikedTendersFilterDrawer(isTablet: false,), + endDrawer: const LikeFiltersDrawer(), body: Column( children: [ const DesktopNavigationWidget(currentIndex: 1, haveFilter: true), + const SizedBox(height: 40), + SizedBox( + width: 740, + child: TabletDesktopAppbar( + title: LikedTendersStrings.likedTenders, + haveFilter: true, + onFilterPressed: () { + scaffoldKey.currentState?.openEndDrawer(); + }, + ), + ), + const SizedBox(height: 24), Expanded( child: SizedBox( width: 740, @@ -90,134 +106,15 @@ class _LikedTendersDesktopPageState extends State { return Column( children: [ - Expanded( - child: ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 24.0.w(), - vertical: 15.0.h(), - ), - itemCount: feedback.length, - itemBuilder: (context, index) { - final item = feedback[index]; - TenderApprovalsData? approval; - bool hasApproval = viewModel - .hasTenderApprovalForTender(item.tenderId!); - if (hasApproval) { - approval = viewModel.getApprovalStatusForTender( - item.tenderId!, - ); - } else { - approval = null; - } - return Padding( - padding: EdgeInsets.only(bottom: 20.0.h()), - child: Dismissible( - key: ValueKey(item.tenderId ?? index), - direction: DismissDirection.endToStart, - background: Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.symmetric( - horizontal: 20.0.w(), - ), - child: SvgPicture.asset( - AssetsManager.trash, - ), - ), - onDismissed: (_) { - if (item.tenderId != null) { - viewModel.removeTenderById( - item.tenderId!, - ); - } - }, - child: LikedListItem( - tender: item.tender!, - approval: approval, - isDesktop: true, - ), - ), - ); - }, - ), - ), + _likedTendersList(feedback, viewModel), SizedBox(height: 10.0.h()), - Row( - children: [ - const Spacer(), - Text( - LikedTendersStrings.page, - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: - (context) => PageSelectionDialog( - totalPages: totalPages, - ), - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '$currentPage', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, - ), - ), - SizedBox(width: 5.0.w()), - SvgPicture.asset( - AssetsManager.arrowDownSmall, - ), - SizedBox(width: 5.0.w()), - ], - ), - ), - ), - - SizedBox(width: 5.0.w()), - Text( - LikedTendersStrings.of, - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '$totalPages', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - ], + _likedTenersListPageControll( + context, + totalPages, + viewModel, + currentPage, ), SizedBox(height: 30.0.h()), @@ -232,4 +129,126 @@ class _LikedTendersDesktopPageState extends State { ), ); } -} \ No newline at end of file + + Widget _likedTenersListPageControll( + BuildContext context, + int totalPages, + LikedTendersViewModel viewModel, + int currentPage, + ) { + return Row( + children: [ + const Spacer(), + Text( + LikedTendersStrings.page, + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) => PageSelectionDialog(totalPages: totalPages), + ); + + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey30, width: 1), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '$currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset(AssetsManager.arrowDownSmall), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + + SizedBox(width: 5.0.w()), + Text( + LikedTendersStrings.of, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '$totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ); + } + + Widget _likedTendersList( + List feedback, + LikedTendersViewModel viewModel, + ) { + return Expanded( + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 15.0.h()), + itemCount: feedback.length, + itemBuilder: (context, index) { + final item = feedback[index]; + TenderApprovalsData? approval; + bool hasApproval = viewModel.hasTenderApprovalForTender( + item.tenderId!, + ); + if (hasApproval) { + approval = viewModel.getApprovalStatusForTender(item.tenderId!); + } else { + approval = null; + } + return Padding( + padding: EdgeInsets.only(bottom: 20.0.h()), + child: Dismissible( + key: ValueKey(item.tenderId ?? index), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: EdgeInsets.symmetric(horizontal: 20.0.w()), + child: SvgPicture.asset(AssetsManager.trash), + ), + onDismissed: (_) { + if (item.tenderId != null) { + viewModel.removeTenderById(item.tenderId!); + } + }, + child: LikedListItem( + tender: item.tender!, + approval: approval, + isDesktop: true, + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart index 8396e83..b2715f4 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart @@ -5,16 +5,18 @@ import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/data/services/model/liked_tender_feedback/liked_tender_feedback.dart'; import 'package:tm_app/view_models/liked_tenders_view_model.dart'; import 'package:tm_app/views/liked_tenders/strings/liked_tenders_strings.dart'; -import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart'; import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_list_item.dart'; import 'package:tm_app/views/shared/page_selection_dialog.dart'; import 'package:tm_app/views/shared/tender_app_bar.dart'; import '../../../core/utils/app_toast.dart'; import '../../../data/services/model/tender_approvals_data/tender_approvals_data.dart'; +import '../../shared/tablet_desktop_appbar.dart'; import '../../shared/tablet_navigation_widget.dart'; +import '../widgets/like_filters_bottom_sheet.dart'; class LikedTendersTabletPage extends StatefulWidget { const LikedTendersTabletPage({super.key}); @@ -60,126 +62,33 @@ class _LikedTendersTabletPageState extends State { child: Scaffold( key: key, backgroundColor: AppColors.backgroundColor, - appBar: - // PreferredSize( - // preferredSize: const Size.fromHeight(60), - // child: AppBar( - // backgroundColor: AppColors.backgroundColor, - // elevation: 0, - // titleSpacing: 0, - // leading: IconButton( - // icon: SvgPicture.asset( - // AssetsManager.arrowLeft, - // height: 24.0.w(), - // width: 24.0.w(), - // ), - // onPressed: () => Navigator.pop(context), - // ), - // title: Text( - // LikedTendersStrings.likedTenders, - // style: TextStyle( - // color: AppColors.grey70, - // fontWeight: FontWeight.w600, - // fontSize: 20.0.sp(), - // ), - // ), - // actions: [ - // IconButton( - // icon: SvgPicture.asset( - // AssetsManager.filter, - // height: 24.0.w(), - // width: 24.0.w(), - // ), - // onPressed: () { - // showModalBottomSheet( - // context: context, - // isScrollControlled: true, - // backgroundColor: AppColors.backgroundColor, - // shape: const RoundedRectangleBorder( - // borderRadius: BorderRadius.vertical( - // top: Radius.circular(20), - // ), - // ), - // constraints: BoxConstraints( - // maxWidth: MediaQuery.of(context).size.width, - // maxHeight: MediaQuery.of(context).size.height, - // ), - // builder: (context) { - // return SizedBox( - // width: double.infinity, - // child: Padding( - // padding: const EdgeInsets.all(16.0), - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // SizedBox(height: 10.0.h()), - // Text( - // LikedTendersStrings.filter, - // style: TextStyle( - // fontWeight: FontWeight.w600, - // color: AppColors.grey70, - // fontSize: 20.0.sp(), - // ), - // ), - // SizedBox(height: 20.0.h()), - // _buildFilterOption('Industry'), - // _buildFilterOption('Finance'), - // _buildFilterOption('Business'), - // _buildFilterOption('IT'), - // _buildFilterOption('Software'), - // SizedBox(height: 20.0.h()), - // BaseButton( - // backgroundColor: AppColors.primary2, - // borderRadius: 24, - // isEnabled: true, - // onPressed: () => Navigator.pop(context), - // text: 'Apply', - // textColor: AppColors.textBlue, - // ), - // ], - // ), - // ), - // ); - // }, - // ); - // }, - // ), - // SizedBox(width: 16.0.w()), - // ], - // ), - // ), - tabletAppBar(title: LikedTendersStrings.likedTenders, key: key), + appBar: tabletAppBar(title: LikedTendersStrings.likedTenders, key: key), drawer: const TabletNavigationWidget(currentIndex: 1), body: Center( child: SizedBox( width: 720, child: Column( children: [ - AppBar( - backgroundColor: AppColors.backgroundColor, - elevation: 0, - titleSpacing: 0, - scrolledUnderElevation: 0, - leading: IconButton( - icon: SvgPicture.asset( - AssetsManager.arrowLeft, - height: 24.0.w(), - width: 24.0.w(), - ), - onPressed: () => Navigator.pop(context), - ), - title: Text( - LikedTendersStrings.likedTenders, - style: TextStyle( - color: AppColors.grey70, - fontWeight: FontWeight.w600, - fontSize: 20.0.sp(), - ), - ), - actions: [ - const LikedTendersFilterDrawer(isTablet: true,), - SizedBox(width: 16.0.w()), - ], + TabletDesktopAppbar( + title: LikedTendersStrings.likedTenders, + haveFilter: true, + onFilterPressed: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: AppColors.backgroundColor, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + ), + constraints: BoxConstraints( + maxWidth: MediaQuery.sizeOf(context).width, + maxHeight: MediaQuery.sizeOf(context).height, + ), + builder: (context) => const LikeFiltersBottomSheet(), + ); + }, ), Expanded( child: Consumer( @@ -210,144 +119,15 @@ class _LikedTendersTabletPageState extends State { return Column( children: [ - Expanded( - child: RefreshIndicator( - onRefresh: () async { - await viewModel.getLikedTenders(reset: true); - }, - child: ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 24.0.w(), - vertical: 15.0.h(), - ), - itemCount: feedback.length, - itemBuilder: (context, index) { - final item = feedback[index]; - TenderApprovalsData? approval; - bool hasApproval = viewModel - .hasTenderApprovalForTender( - item.tenderId!, - ); - if (hasApproval) { - approval = viewModel - .getApprovalStatusForTender( - item.tenderId!, - ); - } else { - approval = null; - } - return Padding( - padding: EdgeInsets.only(bottom: 20.0.h()), - child: Dismissible( - key: ValueKey(item.tenderId ?? index), - direction: DismissDirection.endToStart, - background: Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.symmetric( - horizontal: 20.0.w(), - ), - child: SvgPicture.asset( - AssetsManager.trash, - width: 32.0.w(), - height: 32.0.h(), - ), - ), - onDismissed: (_) { - if (item.tenderId != null) { - viewModel.removeTenderById( - item.tenderId!, - ); - } - }, - child: LikedListItem( - tender: item.tender!, - approval: approval, - ), - ), - ); - }, - ), - ), - ), + _likedTendersList(feedback, viewModel), SizedBox(height: 10.0.h()), - Row( - children: [ - const Spacer(), - Text( - LikedTendersStrings.page, - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: - (context) => PageSelectionDialog( - totalPages: totalPages, - ), - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '$currentPage', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, - ), - ), - SizedBox(width: 5.0.w()), - SvgPicture.asset( - AssetsManager.arrowDownSmall, - ), - SizedBox(width: 5.0.w()), - ], - ), - ), - ), - - SizedBox(width: 5.0.w()), - Text( - LikedTendersStrings.of, - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '$totalPages', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 30.0.w()), - ], + _likeTendersListPagesControll( + context, + totalPages, + viewModel, + currentPage, ), SizedBox(height: 30.0.h()), @@ -363,5 +143,127 @@ class _LikedTendersTabletPageState extends State { ), ); } -} + Widget _likeTendersListPagesControll( + BuildContext context, + int totalPages, + LikedTendersViewModel viewModel, + int currentPage, + ) { + return Row( + children: [ + const Spacer(), + Text( + LikedTendersStrings.page, + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) => PageSelectionDialog(totalPages: totalPages), + ); + + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey30, width: 1), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '$currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset(AssetsManager.arrowDownSmall), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + + SizedBox(width: 5.0.w()), + Text( + LikedTendersStrings.of, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '$totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 30.0.w()), + ], + ); + } + + Widget _likedTendersList( + List feedback, + LikedTendersViewModel viewModel, + ) { + return Expanded( + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 15.0.h()), + itemCount: feedback.length, + itemBuilder: (context, index) { + final item = feedback[index]; + TenderApprovalsData? approval; + bool hasApproval = viewModel.hasTenderApprovalForTender( + item.tenderId!, + ); + if (hasApproval) { + approval = viewModel.getApprovalStatusForTender(item.tenderId!); + } else { + approval = null; + } + return Padding( + padding: EdgeInsets.only(bottom: 20.0.h()), + child: Dismissible( + key: ValueKey(item.tenderId ?? index), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: EdgeInsets.symmetric(horizontal: 20.0.w()), + child: SvgPicture.asset( + AssetsManager.trash, + width: 32.0.w(), + height: 32.0.h(), + ), + ), + onDismissed: (_) { + if (item.tenderId != null) { + viewModel.removeTenderById(item.tenderId!); + } + }, + child: LikedListItem(tender: item.tender!, approval: approval), + ), + ); + }, + ), + ); + } +} diff --git a/lib/views/liked_tenders/widgets/like_filters_bottom_sheet.dart b/lib/views/liked_tenders/widgets/like_filters_bottom_sheet.dart new file mode 100644 index 0000000..653ff15 --- /dev/null +++ b/lib/views/liked_tenders/widgets/like_filters_bottom_sheet.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:tm_app/core/utils/size_config.dart'; + +import '../../../core/theme/colors.dart'; +import '../../shared/base_button.dart'; +import '../strings/liked_tenders_strings.dart'; + +class LikeFiltersBottomSheet extends StatelessWidget { + const LikeFiltersBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(height: 10.0.h()), + Text( + LikedTendersStrings.filter, + style: TextStyle( + fontWeight: FontWeight.w600, + color: AppColors.grey70, + fontSize: 20.0.sp(), + ), + ), + SizedBox(height: 20.0.h()), + _buildFilterOption('Industry'), + _buildFilterOption('Finance'), + _buildFilterOption('Business'), + _buildFilterOption('IT'), + _buildFilterOption('Software'), + SizedBox(height: 20.0.h()), + BaseButton( + backgroundColor: AppColors.primary2, + borderRadius: 24, + isEnabled: true, + onPressed: () => Navigator.pop(context), + text: 'Apply', + textColor: AppColors.textBlue, + ), + ], + ), + ), + ); + } + + Widget _buildFilterOption(String title) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 8.0.h()), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + title, + style: TextStyle( + fontSize: 16.0.sp(), + color: AppColors.grey80, + fontWeight: FontWeight.w400, + ), + ), + ), + ); + } +} diff --git a/lib/views/liked_tenders/widgets/like_filters_drawer.dart b/lib/views/liked_tenders/widgets/like_filters_drawer.dart new file mode 100644 index 0000000..5b053dd --- /dev/null +++ b/lib/views/liked_tenders/widgets/like_filters_drawer.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:tm_app/core/utils/size_config.dart'; + +import '../../../core/theme/colors.dart'; +import '../../shared/base_button.dart'; +import '../strings/liked_tenders_strings.dart'; + +class LikeFiltersDrawer extends StatelessWidget { + const LikeFiltersDrawer({super.key}); + + @override + Widget build(BuildContext context) { + return Drawer( + backgroundColor: AppColors.backgroundColor, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 30.0.h()), + Text( + LikedTendersStrings.filter, + style: TextStyle( + fontWeight: FontWeight.w600, + color: AppColors.grey70, + fontSize: 20.0.sp(), + ), + ), + SizedBox(height: 20.0.h()), + + _buildFilterOption('Industry'), + _buildFilterOption('Finance'), + _buildFilterOption('Business'), + _buildFilterOption('IT'), + _buildFilterOption('Software'), + + const Spacer(), + + BaseButton( + backgroundColor: AppColors.primary2, + borderRadius: 24, + isEnabled: true, + onPressed: () { + Navigator.pop(context); + }, + text: LikedTendersStrings.apply, + textColor: AppColors.textBlue, + ), + + SizedBox(height: 20.0.h()), + ], + ), + ), + ); + } + + Widget _buildFilterOption(String title) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 8.0.h()), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + title, + style: TextStyle( + fontSize: 16.0.sp(), + color: AppColors.grey80, + fontWeight: FontWeight.w400, + ), + ), + ), + ); + } +} diff --git a/lib/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart b/lib/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart deleted file mode 100644 index ba16e3c..0000000 --- a/lib/views/liked_tenders/widgets/liked_tenders_filter_drawer.dart +++ /dev/null @@ -1,136 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:tm_app/core/constants/assets.dart'; -import 'package:tm_app/core/theme/colors.dart'; -import 'package:tm_app/core/utils/size_config.dart'; -import 'package:tm_app/views/liked_tenders/strings/liked_tenders_strings.dart'; - -import '../../shared/base_button.dart'; - -class LikedTendersFilterDrawer extends StatelessWidget { - const LikedTendersFilterDrawer({required this.isTablet, super.key}); - - final bool isTablet; - - @override - Widget build(BuildContext context) { - return isTablet - ? IconButton( - icon: SvgPicture.asset( - AssetsManager.filter, - height: 24.0.w(), - width: 24.0.w(), - ), - onPressed: () { - showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: AppColors.backgroundColor, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.vertical(top: Radius.circular(20)), - ), - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width, - maxHeight: MediaQuery.of(context).size.height, - ), - builder: (context) { - return SizedBox( - width: double.infinity, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox(height: 10.0.h()), - Text( - LikedTendersStrings.filter, - style: TextStyle( - fontWeight: FontWeight.w600, - color: AppColors.grey70, - fontSize: 20.0.sp(), - ), - ), - SizedBox(height: 20.0.h()), - _buildFilterOption('Industry'), - _buildFilterOption('Finance'), - _buildFilterOption('Business'), - _buildFilterOption('IT'), - _buildFilterOption('Software'), - SizedBox(height: 20.0.h()), - BaseButton( - backgroundColor: AppColors.primary2, - borderRadius: 24, - isEnabled: true, - onPressed: () => Navigator.pop(context), - text: 'Apply', - textColor: AppColors.textBlue, - ), - ], - ), - ), - ); - }, - ); - }, - ) - : Drawer( - backgroundColor: AppColors.backgroundColor, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 30.0.h()), - Text( - LikedTendersStrings.filter, - style: TextStyle( - fontWeight: FontWeight.w600, - color: AppColors.grey70, - fontSize: 20.0.sp(), - ), - ), - SizedBox(height: 20.0.h()), - - _buildFilterOption('Industry'), - _buildFilterOption('Finance'), - _buildFilterOption('Business'), - _buildFilterOption('IT'), - _buildFilterOption('Software'), - - const Spacer(), - - BaseButton( - backgroundColor: AppColors.primary2, - borderRadius: 24, - isEnabled: true, - onPressed: () { - Navigator.pop(context); - }, - text: LikedTendersStrings.apply, - textColor: AppColors.textBlue, - ), - - SizedBox(height: 20.0.h()), - ], - ), - ), - ); - } - - Widget _buildFilterOption(String title) { - return Padding( - padding: EdgeInsets.symmetric(vertical: 8.0.h()), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - title, - style: TextStyle( - fontSize: 16.0.sp(), - color: AppColors.grey80, - fontWeight: FontWeight.w400, - ), - ), - ), - ); - } -} diff --git a/lib/views/profile/pages/d_profile_page.dart b/lib/views/profile/pages/d_profile_page.dart index 6a0f00d..452d65a 100644 --- a/lib/views/profile/pages/d_profile_page.dart +++ b/lib/views/profile/pages/d_profile_page.dart @@ -110,31 +110,7 @@ class _DesktopProfilePageState extends State { ), ), SizedBox(height: 36.0.h()), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0.w()), - child: Row( - children: [ - Text( - ProfileStrings.appTheme, - style: TextStyle( - fontSize: 16.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey70, - ), - ), - const Spacer(), - SvgPicture.asset(AssetsManager.sun), - SizedBox(width: 12.0.w()), - SizedBox( - width: 52.0.w(), - height: 32.0.h(), - child: const ThemeToggle(), - ), - SizedBox(width: 12.0.w()), - SvgPicture.asset(AssetsManager.moon), - ], - ), - ), + _themeChangeRow(), SizedBox(height: 24.0.h()), Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 24.0.h()), @@ -172,4 +148,32 @@ class _DesktopProfilePageState extends State { ), ); } + + Widget _themeChangeRow() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0.w()), + child: Row( + children: [ + Text( + ProfileStrings.appTheme, + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey70, + ), + ), + const Spacer(), + SvgPicture.asset(AssetsManager.sun), + SizedBox(width: 12.0.w()), + SizedBox( + width: 52.0.w(), + height: 32.0.h(), + child: const ThemeToggle(), + ), + SizedBox(width: 12.0.w()), + SvgPicture.asset(AssetsManager.moon), + ], + ), + ); + } } diff --git a/lib/views/profile/pages/m_profile_page.dart b/lib/views/profile/pages/m_profile_page.dart index ab9cc35..01b25bb 100644 --- a/lib/views/profile/pages/m_profile_page.dart +++ b/lib/views/profile/pages/m_profile_page.dart @@ -109,31 +109,7 @@ class _MobileProfilePageState extends State { ), ), SizedBox(height: 36.0.h()), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0.w()), - child: Row( - children: [ - Text( - ProfileStrings.appTheme, - style: TextStyle( - fontSize: 16.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey70, - ), - ), - const Spacer(), - SvgPicture.asset(AssetsManager.sun), - SizedBox(width: 12.0.w()), - SizedBox( - width: 52.0.w(), - height: 32.0.h(), - child: const ThemeToggle(), - ), - SizedBox(width: 12.0.w()), - SvgPicture.asset(AssetsManager.moon), - ], - ), - ), + _themeChangeRow(), SizedBox(height: 24.0.h()), Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 24.0.h()), @@ -166,4 +142,32 @@ class _MobileProfilePageState extends State { ), ); } + + Widget _themeChangeRow() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0.w()), + child: Row( + children: [ + Text( + ProfileStrings.appTheme, + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey70, + ), + ), + const Spacer(), + SvgPicture.asset(AssetsManager.sun), + SizedBox(width: 12.0.w()), + SizedBox( + width: 52.0.w(), + height: 32.0.h(), + child: const ThemeToggle(), + ), + SizedBox(width: 12.0.w()), + SvgPicture.asset(AssetsManager.moon), + ], + ), + ); + } } diff --git a/lib/views/profile/pages/t_profile_page.dart b/lib/views/profile/pages/t_profile_page.dart index 9673336..188b038 100644 --- a/lib/views/profile/pages/t_profile_page.dart +++ b/lib/views/profile/pages/t_profile_page.dart @@ -115,31 +115,7 @@ class _TabletProfilePageState extends State { ), ), SizedBox(height: 36.0.h()), - Padding( - padding: EdgeInsets.symmetric(horizontal: 8.0.w()), - child: Row( - children: [ - Text( - ProfileStrings.appTheme, - style: TextStyle( - fontSize: 16.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey70, - ), - ), - const Spacer(), - SvgPicture.asset(AssetsManager.sun), - SizedBox(width: 12.0.w()), - SizedBox( - width: 52.0.w(), - height: 32.0.h(), - child: const ThemeToggle(), - ), - SizedBox(width: 12.0.w()), - SvgPicture.asset(AssetsManager.moon), - ], - ), - ), + _themeChangeRow(), SizedBox(height: 24.0.h()), Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 24.0.h()), @@ -176,4 +152,32 @@ class _TabletProfilePageState extends State { }, ); } + + Widget _themeChangeRow() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0.w()), + child: Row( + children: [ + Text( + ProfileStrings.appTheme, + style: TextStyle( + fontSize: 16.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey70, + ), + ), + const Spacer(), + SvgPicture.asset(AssetsManager.sun), + SizedBox(width: 12.0.w()), + SizedBox( + width: 52.0.w(), + height: 32.0.h(), + child: const ThemeToggle(), + ), + SizedBox(width: 12.0.w()), + SvgPicture.asset(AssetsManager.moon), + ], + ), + ); + } } diff --git a/lib/views/shared/tablet_desktop_appbar.dart b/lib/views/shared/tablet_desktop_appbar.dart new file mode 100644 index 0000000..1999f86 --- /dev/null +++ b/lib/views/shared/tablet_desktop_appbar.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:tm_app/core/utils/size_config.dart'; + +import '../../core/constants/assets.dart'; +import '../../core/theme/colors.dart'; + +class TabletDesktopAppbar extends StatelessWidget { + const TabletDesktopAppbar({ + required this.title, + this.haveFilter, + this.onFilterPressed, + super.key, + }); + + final String title; + final bool? haveFilter; + final VoidCallback? onFilterPressed; + + @override + Widget build(BuildContext context) { + final isRtl = Directionality.of(context) == TextDirection.rtl; + return Row( + children: [ + InkWell( + borderRadius: BorderRadius.circular(8), + onTap: () => context.pop(), + child: SvgPicture.asset( + isRtl ? AssetsManager.arrowRight : AssetsManager.arrowLeft, + ), + ), + SizedBox(width: 8.0.w()), + Text( + title, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: AppColors.grey70, + ), + ), + const Spacer(), + if (haveFilter == true) + IconButton( + icon: SvgPicture.asset( + AssetsManager.filter, + height: 24.0.w(), + width: 24.0.w(), + ), + onPressed: onFilterPressed, + ), + ], + ); + } +} diff --git a/lib/views/shared/tablet_navigation_widget.dart b/lib/views/shared/tablet_navigation_widget.dart index daf533d..4e1c330 100644 --- a/lib/views/shared/tablet_navigation_widget.dart +++ b/lib/views/shared/tablet_navigation_widget.dart @@ -35,6 +35,7 @@ class TabletNavigationWidget extends StatelessWidget { if (currentIndex == 0) { return; } else { + context.pop(); Router.neglect( context, () => const HomeRouteData().go(context), @@ -53,6 +54,7 @@ class TabletNavigationWidget extends StatelessWidget { if (currentIndex == 1) { return; } else { + context.pop(); Router.neglect( context, () => const TendersRouteData().go(context), diff --git a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart index 4198e44..07c667b 100644 --- a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart @@ -4,10 +4,10 @@ import 'package:tm_app/core/constants/tender_feedback.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/view_models/your_tenders_view_model.dart'; +import 'package:tm_app/views/shared/tablet_desktop_appbar.dart'; import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart'; import 'package:tm_app/views/your_tenders/widgets/filter_button.dart'; import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart'; -import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart'; import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart'; import '../../shared/desktop_navigation_widget.dart'; @@ -48,7 +48,9 @@ class _YourTendersDesktopPageState extends State child: Column( children: [ SizedBox(height: 64.0.h()), - const TabletDesktopAppbar(), + const TabletDesktopAppbar( + title: YourTendersStrings.yourTenders, + ), SizedBox(height: 20.0.h()), const FilterButton(platformType: PlatformType.tabletDesktop), @@ -106,103 +108,7 @@ class _YourTendersDesktopPageState extends State Expanded(child: content), SizedBox(height: 10.0.h()), - Row( - children: [ - const Spacer(), - Text( - YourTendersStrings.page, - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - backgroundColor: - AppColors.backgroundColor, - title: const Text( - YourTendersStrings.selectPage, - ), - content: SizedBox( - width: 200.0.w(), - height: 300.0.h(), - child: ListView.builder( - itemCount: viewModel.totalPages, - itemBuilder: (context, index) { - final pageNumber = index + 1; - return ListTile( - title: Text( - '${YourTendersStrings.page} $pageNumber', - ), - onTap: - () => Navigator.pop( - context, - pageNumber, - ), - ); - }, - ), - ), - ); - }, - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '${viewModel.currentPage}', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, - ), - ), - SizedBox(width: 5.0.w()), - const Icon(Icons.arrow_drop_down), - SizedBox(width: 5.0.w()), - ], - ), - ), - ), - SizedBox(width: 5.0.w()), - Text( - YourTendersStrings.of, - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '${viewModel.totalPages}', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - ], - ), + _listPagesControll(context, viewModel), SizedBox(height: 30.0.h()), ], @@ -218,4 +124,95 @@ class _YourTendersDesktopPageState extends State ), ); } + + Widget _listPagesControll( + BuildContext context, + YourTendersViewModel viewModel, + ) { + return Row( + children: [ + const Spacer(), + Text( + YourTendersStrings.page, + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: AppColors.backgroundColor, + title: const Text(YourTendersStrings.selectPage), + content: SizedBox( + width: 200.0.w(), + height: 300.0.h(), + child: ListView.builder( + itemCount: viewModel.totalPages, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text('${YourTendersStrings.page} $pageNumber'), + onTap: () => Navigator.pop(context, pageNumber), + ); + }, + ), + ), + ); + }, + ); + + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey30, width: 1), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '${viewModel.currentPage}', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + const Icon(Icons.arrow_drop_down), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + SizedBox(width: 5.0.w()), + Text( + YourTendersStrings.of, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '${viewModel.totalPages}', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ); + } } diff --git a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart index 95eafa9..518e67a 100644 --- a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart @@ -3,9 +3,9 @@ import 'package:provider/provider.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/view_models/your_tenders_view_model.dart'; +import 'package:tm_app/views/shared/tablet_desktop_appbar.dart'; import 'package:tm_app/views/your_tenders/widgets/filter_button.dart'; import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart'; -import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart'; import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart'; import '../../../core/constants/tender_feedback.dart'; @@ -52,7 +52,9 @@ class _YourTendersTabletPageState extends State const SizedBox(height: 64.0), Padding( padding: EdgeInsets.symmetric(horizontal: 8.0.w()), - child: const TabletDesktopAppbar(), + child: const TabletDesktopAppbar( + title: YourTendersStrings.yourTenders, + ), ), SizedBox(height: 24.0.h()), const FilterButton(platformType: PlatformType.tabletDesktop), @@ -111,103 +113,7 @@ class _YourTendersTabletPageState extends State Expanded(child: content), SizedBox(height: 10.0.h()), - Row( - children: [ - const Spacer(), - Text( - YourTendersStrings.page, - style: TextStyle( - fontSize: 13.0, - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - backgroundColor: - AppColors.backgroundColor, - title: const Text( - YourTendersStrings.selectPage, - ), - content: SizedBox( - width: 200.0.w(), - height: 300.0.h(), - child: ListView.builder( - itemCount: viewModel.totalPages, - itemBuilder: (context, index) { - final pageNumber = index + 1; - return ListTile( - title: Text( - '${YourTendersStrings.page} $pageNumber', - ), - onTap: - () => Navigator.pop( - context, - pageNumber, - ), - ); - }, - ), - ), - ); - }, - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '${viewModel.currentPage}', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, - ), - ), - SizedBox(width: 5.0.w()), - const Icon(Icons.arrow_drop_down), - SizedBox(width: 5.0.w()), - ], - ), - ), - ), - const SizedBox(width: 5.0), - Text( - YourTendersStrings.page, - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '${viewModel.totalPages}', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - ], - ), + _listPagesControll(context, viewModel), const SizedBox(height: 30.0), ], @@ -221,4 +127,95 @@ class _YourTendersTabletPageState extends State ), ); } + + Widget _listPagesControll( + BuildContext context, + YourTendersViewModel viewModel, + ) { + return Row( + children: [ + const Spacer(), + Text( + YourTendersStrings.page, + style: TextStyle( + fontSize: 13.0, + fontWeight: FontWeight.w300, + color: AppColors.grey60, + ), + ), + SizedBox(width: 10.0.w()), + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: AppColors.backgroundColor, + title: const Text(YourTendersStrings.selectPage), + content: SizedBox( + width: 200.0.w(), + height: 300.0.h(), + child: ListView.builder( + itemCount: viewModel.totalPages, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text('${YourTendersStrings.page} $pageNumber'), + onTap: () => Navigator.pop(context, pageNumber), + ); + }, + ), + ), + ); + }, + ); + + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: AppColors.grey30, width: 1), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '${viewModel.currentPage}', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + const Icon(Icons.arrow_drop_down), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + const SizedBox(width: 5.0), + Text( + YourTendersStrings.page, + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '${viewModel.totalPages}', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ); + } } diff --git a/lib/views/your_tenders/widgets/tablet_desktop_appbar.dart b/lib/views/your_tenders/widgets/tablet_desktop_appbar.dart deleted file mode 100644 index 9b18ee0..0000000 --- a/lib/views/your_tenders/widgets/tablet_desktop_appbar.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; -import 'package:tm_app/core/utils/size_config.dart'; - -import '../../../core/constants/assets.dart'; -import '../../../core/theme/colors.dart'; -import '../strings/your_tenders_strings.dart'; - -class TabletDesktopAppbar extends StatelessWidget { - const TabletDesktopAppbar({super.key}); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - InkWell( - onTap: () => context.pop(), - child: SvgPicture.asset(AssetsManager.arrowLeft), - ), - SizedBox(width: 8.0.w()), - Text( - YourTendersStrings.yourTenders, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - color: AppColors.grey70, - ), - ), - ], - ); - } -} diff --git a/lib/views/your_tenders/widgets/tender_card.dart b/lib/views/your_tenders/widgets/tender_card.dart index 9b6e388..7fa5d6c 100644 --- a/lib/views/your_tenders/widgets/tender_card.dart +++ b/lib/views/your_tenders/widgets/tender_card.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:provider/provider.dart'; import 'package:tm_app/core/utils/date_utils.dart'; import 'package:tm_app/data/services/model/tender_data/tender_data.dart'; import '../../../core/constants/assets.dart'; import '../../../core/constants/tender_approval_status.dart'; -import '../../../core/constants/tender_feedback.dart'; import '../../../core/theme/colors.dart'; import '../../../core/utils/size_config.dart'; +import '../../../view_models/your_tenders_view_model.dart'; import '../../shared/flag.dart'; class TenderCard extends StatelessWidget { @@ -26,29 +27,7 @@ class TenderCard extends StatelessWidget { @override Widget build(BuildContext context) { - // Determine styling based on tender status - Color backgroundColor = AppColors.grey0; - Color borderColor = AppColors.grey30; - String? statusIcon; - Color statusCardColor = AppColors.grey0; - Color statusTextColor = AppColors.grey60; - - if (status == TenderFeedback.liked.value || - status == TenderApprovalStatus.submitted.value) { - backgroundColor = AppColors.green0; - borderColor = AppColors.green10; - statusIcon = AssetsManager.tickCircle; - statusCardColor = AppColors.green20; - statusTextColor = AppColors.green30; - } - if (status == TenderFeedback.disliked.value || - status == TenderApprovalStatus.rejected.value) { - backgroundColor = AppColors.red0; - borderColor = AppColors.red10; - statusIcon = AssetsManager.closeCircle; - statusCardColor = AppColors.red10; - statusTextColor = AppColors.red20; - } + final viewModel = context.read(); return Container( height: isDesktop ? 182.0.h() : 240.0.h(), @@ -59,9 +38,9 @@ class TenderCard extends StatelessWidget { bottom: 12.0.h(), ), decoration: BoxDecoration( - color: backgroundColor, + color: viewModel.getBackGroundColorByStatus(status), borderRadius: BorderRadius.circular(12), - border: Border.all(color: borderColor), + border: Border.all(color: viewModel.getBorderColorByStatus(status)), ), child: Padding( padding: EdgeInsets.all(16.0.w()), @@ -88,18 +67,18 @@ class TenderCard extends StatelessWidget { vertical: 4.0.h(), ), decoration: BoxDecoration( - color: statusCardColor, + color: viewModel.getStatusCardColorByStatus(status), borderRadius: BorderRadius.circular(8), ), child: Row( children: [ - if (statusIcon != null) + if (viewModel.getStatusIconByStatus(status) != null) SvgPicture.asset( - statusIcon, + viewModel.getStatusIconByStatus(status)!, width: 16.0.w(), height: 16.0.h(), colorFilter: ColorFilter.mode( - statusTextColor, + viewModel.getStatusTextColorByStatus(status), BlendMode.srcIn, ), ), @@ -107,7 +86,7 @@ class TenderCard extends StatelessWidget { Text( status, style: TextStyle( - color: statusTextColor, + color: viewModel.getStatusTextColorByStatus(status), fontSize: 12.0.sp(), fontWeight: FontWeight.w500, ),