TF-3759 Update style popup context menu for search filter option on mailbox dashboard view

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-14 02:43:10 +07:00
committed by Dat H. Pham
parent e3c9200172
commit e9a86e5a36
5 changed files with 60 additions and 64 deletions
@@ -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);
},
),
@@ -1196,8 +1196,6 @@ class MailboxController extends BaseMailboxController
MailboxActions actions,
PresentationMailbox mailbox
) {
popBack();
switch(actions) {
case MailboxActions.delete:
openConfirmationDialogDeleteMailboxAction(
@@ -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());
}
@@ -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<PopupMenuEntry> 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<PopupMenuEntry> 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);
}
}
@@ -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<SearchFilterButton> {
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,