From e9a86e5a36cc8cde2db61f2cbe3ffa0b9b431da5 Mon Sep 17 00:00:00 2001 From: dab246 Date: Sat, 14 Jun 2025 02:43:10 +0700 Subject: [PATCH] TF-3759 Update style popup context menu for search filter option on mailbox dashboard view Signed-off-by: dab246 --- .../handle_mailbox_action_extension.dart | 2 + .../presentation/mailbox_controller.dart | 2 - .../mailbox_dashboard_controller.dart | 3 - .../mailbox_dashboard_view_web.dart | 110 +++++++++--------- .../search_filters/search_filter_button.dart | 7 +- 5 files changed, 60 insertions(+), 64 deletions(-) diff --git a/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart b/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart index 3d3ee3688..314b844f7 100644 --- a/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart +++ b/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart @@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; extension HandleMailboxActionExtension on MailboxController { @@ -113,6 +114,7 @@ extension HandleMailboxActionExtension on MailboxController { child: PopupMenuItemActionWidget( menuAction: menuAction, menuActionClick: (menuAction) { + popBack(); handleMailboxAction(context, menuAction.action, mailbox); }, ), diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index ed043596d..c89f8d896 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1196,8 +1196,6 @@ class MailboxController extends BaseMailboxController MailboxActions actions, PresentationMailbox mailbox ) { - popBack(); - switch(actions) { case MailboxActions.delete: openConfirmationDialogDeleteMailboxAction( diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index f3e33d653..6c897f728 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -2045,8 +2045,6 @@ class MailboxDashBoardController extends ReloadableController void selectReceiveTimeQuickSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) { log('MailboxDashBoardController::selectReceiveTimeQuickSearchFilter():receiveTime: $receiveTime'); - popBack(); - if (receiveTime == EmailReceiveTimeType.customRange) { searchController.showMultipleViewDateRangePicker( context, @@ -2075,7 +2073,6 @@ class MailboxDashBoardController extends ReloadableController void selectSortOrderQuickSearchFilter(EmailSortOrderType sortOrder) { log('MailboxDashBoardController::selectSortOrderQuickSearchFilter():sortOrder: $sortOrder'); - popBack(); searchController.updateFilterEmail(sortOrderTypeOption: Some(sortOrder)); dispatchAction(StartSearchEmailAction()); } 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 3aed44d41..8d831d9ec 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -7,7 +7,6 @@ import 'package:get/get.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.dart'; -import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart'; import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/composer/presentation/view/web/composer_overlay_view.dart'; @@ -40,6 +39,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/va import 'package:tmail_ui_user/features/manage_account/presentation/vacation/styles/vacation_notification_message_widget_style.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart'; +import 'package:tmail_ui_user/features/search/email/presentation/model/popup_menu_item_date_filter_action.dart'; +import 'package:tmail_ui_user/features/search/email/presentation/model/popup_menu_item_sort_order_type_action.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_view.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; @@ -636,6 +637,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { buttonPadding = MailboxDashboardViewWebStyle.getSearchFilterButtonPadding(isSelected); } + final isFilterApplied = listAddressOfFrom.isNotEmpty || + listAddressOfTo.isNotEmpty || + startDate != null || + endDate != null || + receiveTimeType != EmailReceiveTimeType.allTime || + mailbox != null; + return SearchFilterButton( key: Key('${searchFilter.name}_search_filter_button'), searchFilter: searchFilter, @@ -650,6 +658,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { listAddressOfTo: listAddressOfTo, mailbox: mailbox, buttonPadding: buttonPadding, + isContextMenuAlignEndButton: isFilterApplied || + searchFilter == QuickSearchFilter.sortBy, onSelectSearchFilterAction: _onSelectSearchFilterAction, onDeleteSearchFilterAction: controller.onDeleteSearchFilterAction, ); @@ -693,66 +703,50 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { } } - List popupMenuEmailReceiveTimeType( - BuildContext context, - EmailReceiveTimeType? receiveTimeSelected, - {Function(EmailReceiveTimeType)? onCallBack} - ) { - return EmailReceiveTimeType.values - .map((receiveTime) => PopupMenuItem( - padding: EdgeInsets.zero, - child: PopupItemNoIconWidget( - receiveTime.getTitle(context), - svgIconSelected: controller.imagePaths.icFilterSelected, - maxWidth: 320, - isSelected: receiveTimeSelected == receiveTime, - onCallbackAction: () => onCallBack?.call(receiveTime), - ))) - .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: controller.imagePaths.icFilterSelected, - maxWidth: 332, - isSelected: sortOrderSelected == sortType, - onCallbackAction: () => onCallBack?.call(sortType), - ))) - .toList(); - } - void _openPopupMenuDateFilter(BuildContext context, RelativeRect position) { - controller.openPopupMenuAction( - context, - position, - popupMenuEmailReceiveTimeType( - context, - controller.searchController.receiveTimeFiltered, - onCallBack: (receiveTime) => controller.selectReceiveTimeQuickSearchFilter( - context, - receiveTime - ) - ) - ); + final popupMenuItems = EmailReceiveTimeType.values.map((timeType) { + return PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupMenuItemActionWidget( + menuAction: PopupMenuItemDateFilterAction( + timeType, + controller.searchController.receiveTimeFiltered, + AppLocalizations.of(context), + controller.imagePaths, + ), + menuActionClick: (menuAction) { + popBack(); + controller.selectReceiveTimeQuickSearchFilter( + context, + menuAction.action, + ); + }, + ), + ); + }).toList(); + + controller.openPopupMenuAction(context, position, popupMenuItems); } void _openPopupMenuSortFilter(BuildContext context, RelativeRect position) { - controller.openPopupMenuAction( - context, - position, - popupMenuEmailSortOrderType( - context, - controller.searchController.sortOrderFiltered, - onCallBack: controller.selectSortOrderQuickSearchFilter - ) - ); + final popupMenuItems = EmailSortOrderType.values.map((sortType) { + return PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupMenuItemActionWidget( + menuAction: PopupMenuItemSortOrderTypeAction( + sortType, + controller.searchController.sortOrderFiltered, + AppLocalizations.of(context), + controller.imagePaths, + ), + menuActionClick: (menuAction) { + popBack(); + controller.selectSortOrderQuickSearchFilter(menuAction.action); + }, + ), + ); + }).toList(); + + controller.openPopupMenuAction(context, position, popupMenuItems); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart index 2ddd346fb..e2a810a43 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart @@ -31,6 +31,7 @@ class SearchFilterButton extends StatefulWidget { final PresentationMailbox? mailbox; final Color? backgroundColor; final EdgeInsetsGeometry? buttonPadding; + final bool isContextMenuAlignEndButton; final OnSelectSearchFilterAction? onSelectSearchFilterAction; final OnDeleteSearchFilterAction? onDeleteSearchFilterAction; @@ -40,6 +41,7 @@ class SearchFilterButton extends StatefulWidget { required this.imagePaths, required this.responsiveUtils, this.isSelected = false, + this.isContextMenuAlignEndButton = true, this.receiveTimeType, this.sortOrderType, this.startDate, @@ -228,10 +230,13 @@ class _SearchFilterButtonState extends State { ancestor: overlayBox, ); final buttonSize = buttonBox.size; + final dX = widget.isContextMenuAlignEndButton + ? buttonPosition.dx + buttonSize.width + : buttonPosition.dx; position = RelativeRect.fromRect( Rect.fromLTWH( - buttonPosition.dx + buttonSize.width, + dX, buttonPosition.dy + buttonSize.height + 8, 0, 0,