From f0713f37891f249d0e3b6911e45d1488080a5ef1 Mon Sep 17 00:00:00 2001 From: hieubt Date: Sat, 11 Nov 2023 00:40:57 +0700 Subject: [PATCH] TF-1709 Add quick sort filter to mailbox dashboard (cherry picked from commit 7a50bebfd102887a10b425976993ae56fcff6c7f) --- .../mailbox_dashboard_view_web.dart | 52 +++++++++++++++++-- .../model/search/quick_search_filter.dart | 14 ++++- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 605b880d9..37c05c354 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailb import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart'; @@ -536,9 +537,14 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { if (supportListButtonQuickSearchFilter(context)) { return Padding( padding: const EdgeInsetsDirectional.only(end: 16, top: 8), - child: Row(children: QuickSearchFilter.values - .map((filter) => _buildQuickSearchFilterButton(context, filter)) - .toList() + child: Row( + children: [ + ...QuickSearchFilter.values + .where((filter) => filter != QuickSearchFilter.sortBy) + .map((filter) => _buildQuickSearchFilterButton(context, filter)), + const Spacer(), + _buildQuickSearchFilterButton(context, QuickSearchFilter.sortBy) + ] ), ); } else { @@ -588,6 +594,25 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ) ); } + if (filter == QuickSearchFilter.sortBy) { + final screenSize = MediaQuery.of(context).size; + final offset = detail.globalPosition; + final position = RelativeRect.fromLTRB( + offset.dx, + offset.dy, + screenSize.width - offset.dx, + screenSize.height - offset.dy, + ); + controller.openPopupMenuAction( + context, + position, + popupMenuEmailSortOrderType( + context, + controller.searchController.sortOrderFiltered.value, + onCallBack: (sortOrder) => controller.selectSortOrderQuickSearchFilter(context, sortOrder) + ) + ); + } }, borderRadius: const BorderRadius.all(Radius.circular(10)), child: Container( @@ -607,7 +632,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { context, receiveTimeType: controller.searchController.receiveTimeFiltered, startDate: controller.searchController.startDateFiltered, - endDate: controller.searchController.endDateFiltered + endDate: controller.searchController.endDateFiltered, + sortOrderType: controller.searchController.sortOrderFiltered.value, ), maxLines: 1, overflow: TextOverflow.ellipsis, @@ -646,6 +672,24 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { .toList(); } + List popupMenuEmailSortOrderType( + BuildContext context, + EmailSortOrderType? sortOrderSelected, + {Function(EmailSortOrderType)? onCallBack} + ) { + return EmailSortOrderType.values + .map((sortType) => PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemNoIconWidget( + sortType.getTitle(context), + svgIconSelected: imagePaths.icFilterSelected, + maxWidth: 332, + isSelected: sortOrderSelected == sortType, + onCallbackAction: () => onCallBack?.call(sortType), + ))) + .toList(); + } + Widget _buildComposerButton(BuildContext context) { return Container( padding: const EdgeInsetsDirectional.only( diff --git a/lib/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart index f4a56cc2c..58b71caf3 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart @@ -4,13 +4,15 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:flutter/cupertino.dart'; import 'package:model/user/user_profile.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; enum QuickSearchFilter { hasAttachment, last7Days, - fromMe; + fromMe, + sortBy; String getName(BuildContext context) { switch(this) { @@ -20,12 +22,15 @@ enum QuickSearchFilter { return AppLocalizations.of(context).last7Days; case QuickSearchFilter.fromMe: return AppLocalizations.of(context).fromMe; + case QuickSearchFilter.sortBy: + return AppLocalizations.of(context).sortBy; } } String getTitle( BuildContext context, { EmailReceiveTimeType? receiveTimeType, + EmailSortOrderType? sortOrderType, DateTime? startDate, DateTime? endDate, }) { @@ -37,6 +42,9 @@ enum QuickSearchFilter { ?? AppLocalizations.of(context).allTime; case QuickSearchFilter.fromMe: return AppLocalizations.of(context).fromMe; + case QuickSearchFilter.sortBy: + return sortOrderType?.getTitle(context) + ?? AppLocalizations.of(context).mostRecent; } } @@ -51,6 +59,8 @@ enum QuickSearchFilter { return imagePaths.icCalendarSB; case QuickSearchFilter.fromMe: return imagePaths.icUserSB; + case QuickSearchFilter.sortBy: + return imagePaths.icFilterSB; } } } @@ -89,6 +99,8 @@ enum QuickSearchFilter { return userProfile != null && filter.from.contains(userProfile.email) && filter.from.length == 1; + case QuickSearchFilter.sortBy: + return true; } } } \ No newline at end of file