TF-4229 Implement search by label filter in mobile
This commit is contained in:
@@ -45,6 +45,8 @@ mixin OptionalPopupSelectedIcon<T> {
|
||||
Color get selectedIconColor => AppColor.primaryMain;
|
||||
|
||||
double get selectedIconSize => 16.0;
|
||||
|
||||
bool get isArrangeRTL => true;
|
||||
}
|
||||
|
||||
mixin OptionalPopupHoverIcon {
|
||||
|
||||
@@ -19,6 +19,7 @@ class ContextMenuDialogItem extends StatelessWidget {
|
||||
Widget? iconWidget;
|
||||
Widget? selectedIconWidget;
|
||||
bool isSelected = false;
|
||||
bool isArrangeRTL = true;
|
||||
|
||||
if (menuAction is ContextMenuItemActionRequiredIcon) {
|
||||
final specificMenuAction =
|
||||
@@ -47,6 +48,7 @@ class ContextMenuDialogItem extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
isSelected = specificMenuAction.selectedAction == menuAction.action;
|
||||
isArrangeRTL = specificMenuAction.isArrangeRTL;
|
||||
} else if (menuAction is ContextMenuItemActionRequiredFull) {
|
||||
final specificMenuAction =
|
||||
menuAction as ContextMenuItemActionRequiredFull;
|
||||
@@ -71,8 +73,12 @@ class ContextMenuDialogItem extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
isSelected = specificMenuAction.selectedAction == menuAction.action;
|
||||
isArrangeRTL = specificMenuAction.isArrangeRTL;
|
||||
}
|
||||
|
||||
final leadingWidget =
|
||||
iconWidget ?? (isArrangeRTL ? const SizedBox(width: 24) : null);
|
||||
|
||||
return Material(
|
||||
type: MaterialType.transparency,
|
||||
child: InkWell(
|
||||
@@ -81,7 +87,9 @@ class ContextMenuDialogItem extends StatelessWidget {
|
||||
height: 48,
|
||||
child: Row(
|
||||
children: [
|
||||
if (iconWidget != null) iconWidget else const SizedBox(width: 24),
|
||||
if (leadingWidget != null) leadingWidget,
|
||||
if (!isArrangeRTL && selectedIconWidget != null)
|
||||
selectedIconWidget,
|
||||
Expanded(
|
||||
child: Text(
|
||||
menuAction.actionName,
|
||||
@@ -95,7 +103,7 @@ class ContextMenuDialogItem extends StatelessWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
if (isSelected && selectedIconWidget != null)
|
||||
if (isArrangeRTL && isSelected && selectedIconWidget != null)
|
||||
selectedIconWidget
|
||||
else
|
||||
const SizedBox(width: 24),
|
||||
|
||||
@@ -31,6 +31,8 @@ mixin OptionalSelectedIcon<T> {
|
||||
String get selectedIcon;
|
||||
|
||||
Color get selectedIconColor => AppColor.primaryMain;
|
||||
|
||||
bool get isArrangeRTL => true;
|
||||
}
|
||||
|
||||
abstract class ContextMenuItemActionRequiredIcon<T>
|
||||
|
||||
@@ -5,6 +5,8 @@ import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||
import 'package:labels/extensions/label_extension.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||
@@ -22,7 +24,8 @@ enum QuickSearchFilter {
|
||||
dateTime,
|
||||
from,
|
||||
to,
|
||||
folder;
|
||||
folder,
|
||||
labels;
|
||||
|
||||
String getTitle(
|
||||
BuildContext context, {
|
||||
@@ -33,7 +36,8 @@ enum QuickSearchFilter {
|
||||
Set<String>? listAddressOfFrom,
|
||||
UserName? userName,
|
||||
Set<String>? listAddressOfTo,
|
||||
PresentationMailbox? mailbox
|
||||
PresentationMailbox? mailbox,
|
||||
Label? label,
|
||||
}) {
|
||||
switch(this) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
@@ -61,6 +65,8 @@ enum QuickSearchFilter {
|
||||
return AppLocalizations.of(context).starred;
|
||||
case QuickSearchFilter.unread:
|
||||
return AppLocalizations.of(context).unread;
|
||||
case QuickSearchFilter.labels:
|
||||
return label?.safeDisplayName ?? AppLocalizations.of(context).allLabels;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,6 +92,8 @@ enum QuickSearchFilter {
|
||||
return isSelected ? imagePaths.icSelectedSB : imagePaths.icUnStar;
|
||||
case QuickSearchFilter.unread:
|
||||
return isSelected ? imagePaths.icSelectedSB : imagePaths.icUnread;
|
||||
case QuickSearchFilter.labels:
|
||||
return imagePaths.icTag;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,6 +160,8 @@ enum QuickSearchFilter {
|
||||
return searchFilter.hasKeyword.contains(KeyWordIdentifier.emailFlagged.value) == true;
|
||||
case QuickSearchFilter.unread:
|
||||
return searchFilter.unread;
|
||||
case QuickSearchFilter.labels:
|
||||
return searchFilter.label != null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,5 +181,6 @@ enum QuickSearchFilter {
|
||||
this == QuickSearchFilter.from ||
|
||||
this == QuickSearchFilter.to ||
|
||||
this == QuickSearchFilter.folder ||
|
||||
this == QuickSearchFilter.sortBy;
|
||||
this == QuickSearchFilter.sortBy ||
|
||||
this == QuickSearchFilter.labels;
|
||||
}
|
||||
+4
@@ -4,6 +4,7 @@ import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.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';
|
||||
@@ -29,6 +30,7 @@ class SearchFilterButton extends StatefulWidget {
|
||||
final Set<String>? listAddressOfFrom;
|
||||
final Set<String>? listAddressOfTo;
|
||||
final PresentationMailbox? mailbox;
|
||||
final Label? label;
|
||||
final Color? backgroundColor;
|
||||
final EdgeInsetsGeometry? buttonPadding;
|
||||
final bool isContextMenuAlignEndButton;
|
||||
@@ -49,6 +51,7 @@ class SearchFilterButton extends StatefulWidget {
|
||||
this.listAddressOfFrom,
|
||||
this.listAddressOfTo,
|
||||
this.mailbox,
|
||||
this.label,
|
||||
this.backgroundColor,
|
||||
this.buttonPadding,
|
||||
this.onSelectSearchFilterAction,
|
||||
@@ -73,6 +76,7 @@ class _SearchFilterButtonState extends State<SearchFilterButton> {
|
||||
sortOrderType: widget.sortOrderType,
|
||||
listAddressOfFrom: widget.listAddressOfFrom,
|
||||
mailbox: widget.mailbox,
|
||||
label: widget.label,
|
||||
listAddressOfTo: widget.listAddressOfTo,
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:labels/model/label.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/quick_search_filter.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
|
||||
|
||||
extension UpdateSearchFilterExtension on SearchEmailController {
|
||||
void deleteQuickSearchFilter({required QuickSearchFilter filter}) {
|
||||
switch (filter) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
updateSimpleSearchFilter(hasAttachmentOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.starred:
|
||||
updateSimpleSearchFilter(hasKeywordOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.unread:
|
||||
updateSimpleSearchFilter(unreadOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.sortBy:
|
||||
updateSimpleSearchFilter(
|
||||
sortOrderTypeOption: const Some(SearchEmailFilter.defaultSortOrder),
|
||||
);
|
||||
break;
|
||||
case QuickSearchFilter.dateTime:
|
||||
updateSimpleSearchFilter(
|
||||
emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.allTime),
|
||||
startDateOption: const None(),
|
||||
endDateOption: const None(),
|
||||
);
|
||||
break;
|
||||
case QuickSearchFilter.from:
|
||||
updateSimpleSearchFilter(fromOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.to:
|
||||
updateSimpleSearchFilter(toOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.folder:
|
||||
updateSimpleSearchFilter(mailboxOption: const None());
|
||||
break;
|
||||
case QuickSearchFilter.labels:
|
||||
updateSimpleSearchFilter(labelOption: const None());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
searchEmailAction();
|
||||
}
|
||||
|
||||
void onSelectLabelFilter(Label? newLabel) {
|
||||
updateSimpleSearchFilter(labelOption: optionOf(newLabel));
|
||||
searchEmailAction();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
import 'package:core/presentation/resources/image_paths.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/label_drop_down_button.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/context_item_label_type_action.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/popup_menu_item_label_type_action.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
mixin SearchLabelFilterModalMixin on PopupContextMenuActionMixin {
|
||||
void openLabelsFilterModal({
|
||||
required BuildContext context,
|
||||
required List<Label> labels,
|
||||
required Label? selectedLabel,
|
||||
required ImagePaths imagePaths,
|
||||
required OnSelectLabelsActions onSelectLabelsActions,
|
||||
RelativeRect? position,
|
||||
}) {
|
||||
if (position != null) {
|
||||
openPopupMenuLabelsFilter(
|
||||
context: context,
|
||||
position: position,
|
||||
labels: labels,
|
||||
selectedLabel: selectedLabel,
|
||||
imagePaths: imagePaths,
|
||||
onSelectLabelsActions: onSelectLabelsActions,
|
||||
);
|
||||
} else {
|
||||
openContextMenuLabelsFilter(
|
||||
context: context,
|
||||
labels: labels,
|
||||
selectedLabel: selectedLabel,
|
||||
imagePaths: imagePaths,
|
||||
onSelectLabelsActions: onSelectLabelsActions,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void openPopupMenuLabelsFilter({
|
||||
required BuildContext context,
|
||||
required RelativeRect position,
|
||||
required List<Label> labels,
|
||||
required Label? selectedLabel,
|
||||
required ImagePaths imagePaths,
|
||||
required OnSelectLabelsActions onSelectLabelsActions,
|
||||
}) {
|
||||
final popupMenuItems = labels.map((label) {
|
||||
return PopupMenuItem(
|
||||
padding: EdgeInsets.zero,
|
||||
child: PopupMenuItemActionWidget(
|
||||
menuAction: PopupMenuItemLabelTypeAction(
|
||||
label,
|
||||
selectedLabel,
|
||||
imagePaths,
|
||||
),
|
||||
menuActionClick: (menuAction) {
|
||||
popBack();
|
||||
onSelectLabelsActions(menuAction.action);
|
||||
},
|
||||
),
|
||||
);
|
||||
}).toList();
|
||||
|
||||
openPopupMenuAction(context, position, popupMenuItems);
|
||||
}
|
||||
|
||||
void openContextMenuLabelsFilter({
|
||||
required BuildContext context,
|
||||
required List<Label> labels,
|
||||
required Label? selectedLabel,
|
||||
required ImagePaths imagePaths,
|
||||
required OnSelectLabelsActions onSelectLabelsActions,
|
||||
}) {
|
||||
final contextMenuActions = labels.map((label) {
|
||||
return ContextItemLabelTypeAction(
|
||||
label,
|
||||
selectedLabel,
|
||||
imagePaths,
|
||||
);
|
||||
}).toList();
|
||||
|
||||
openBottomSheetContextMenuAction(
|
||||
context: context,
|
||||
itemActions: contextMenuActions,
|
||||
onContextMenuActionClick: (menuAction) {
|
||||
popBack();
|
||||
onSelectLabelsActions(menuAction.action);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/resources/image_paths.dart';
|
||||
import 'package:flutter/animation.dart';
|
||||
import 'package:labels/labels.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/context_menu/context_menu_item_action.dart';
|
||||
|
||||
class ContextItemLabelTypeAction
|
||||
extends ContextMenuItemActionRequiredSelectedIcon<Label> {
|
||||
final ImagePaths imagePaths;
|
||||
|
||||
ContextItemLabelTypeAction(
|
||||
super.action,
|
||||
super.selectedAction,
|
||||
this.imagePaths,
|
||||
);
|
||||
|
||||
bool get isSelected => action.id == selectedAction?.id;
|
||||
|
||||
@override
|
||||
String get actionName => action.safeDisplayName;
|
||||
|
||||
@override
|
||||
String get selectedIcon => isSelected
|
||||
? imagePaths.icCheckboxSelected
|
||||
: imagePaths.icCheckboxUnselected;
|
||||
|
||||
@override
|
||||
Color get selectedIconColor => isSelected
|
||||
? AppColor.primaryMain
|
||||
: AppColor.gray424244.withValues(alpha: 0.72);
|
||||
|
||||
@override
|
||||
bool get isArrangeRTL => false;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/resources/image_paths.dart';
|
||||
import 'package:flutter/animation.dart';
|
||||
import 'package:labels/extensions/label_extension.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:tmail_ui_user/features/base/model/popup_menu_item_action.dart';
|
||||
|
||||
class PopupMenuItemLabelTypeAction
|
||||
extends PopupMenuItemActionRequiredSelectedIcon<Label> {
|
||||
final ImagePaths imagePaths;
|
||||
|
||||
PopupMenuItemLabelTypeAction(
|
||||
super.action,
|
||||
super.selectedAction,
|
||||
this.imagePaths,
|
||||
);
|
||||
|
||||
bool get isSelected => action.id == selectedAction?.id;
|
||||
|
||||
@override
|
||||
String get actionName => action.safeDisplayName;
|
||||
|
||||
@override
|
||||
String get selectedIcon => isSelected
|
||||
? imagePaths.icCheckboxSelected
|
||||
: imagePaths.icCheckboxUnselected;
|
||||
|
||||
@override
|
||||
Color get selectedIconColor => isSelected
|
||||
? AppColor.primaryMain
|
||||
: AppColor.gray424244.withValues(alpha: 0.72);
|
||||
|
||||
@override
|
||||
bool get isArrangeRTL => false;
|
||||
}
|
||||
@@ -17,6 +17,7 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/mark_star_action.dart';
|
||||
import 'package:model/email/prefix_email_address.dart';
|
||||
@@ -61,6 +62,8 @@ import 'package:tmail_ui_user/features/push_notification/presentation/websocket/
|
||||
import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/handle_keyboard_shortcut_actions_extension.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/update_search_filter_extension.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/mixin/search_label_filter_modal_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||
@@ -83,7 +86,8 @@ import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||
|
||||
class SearchEmailController extends BaseController
|
||||
with EmailActionController,
|
||||
DateRangePickerMixin {
|
||||
DateRangePickerMixin,
|
||||
SearchLabelFilterModalMixin {
|
||||
|
||||
final networkConnectionController = Get.find<NetworkConnectionController>();
|
||||
|
||||
@@ -141,6 +145,8 @@ class SearchEmailController extends BaseController
|
||||
|
||||
PresentationMailbox? get mailboxFiltered => searchEmailFilter.value.mailbox;
|
||||
|
||||
Label? get labelFiltered => searchEmailFilter.value.label;
|
||||
|
||||
Set<String> get listAddressOfToFiltered => searchEmailFilter.value.to;
|
||||
|
||||
Set<String> get listAddressOfFromFiltered => searchEmailFilter.value.from;
|
||||
@@ -452,7 +458,9 @@ class SearchEmailController extends BaseController
|
||||
));
|
||||
}
|
||||
|
||||
void _searchEmailAction(BuildContext context) {
|
||||
void searchEmailAction() => _searchEmailAction();
|
||||
|
||||
void _searchEmailAction() {
|
||||
textInputSearchFocus.unfocus();
|
||||
|
||||
if (session == null || accountId == null) {
|
||||
@@ -592,16 +600,13 @@ class SearchEmailController extends BaseController
|
||||
queryString: recentSearch.value);
|
||||
}
|
||||
|
||||
void searchEmailByEmailAddressAction(
|
||||
BuildContext context,
|
||||
EmailAddress emailAddress
|
||||
) {
|
||||
void searchEmailByEmailAddressAction(EmailAddress emailAddress) {
|
||||
textInputSearchController.clear();
|
||||
currentSearchText.value = '';
|
||||
_updateSimpleSearchFilter(
|
||||
textOption: const None(),
|
||||
fromOption: Some({emailAddress.emailAddress}));
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _searchEmailByQueryString({
|
||||
@@ -618,30 +623,30 @@ class SearchEmailController extends BaseController
|
||||
searchIsRunning.value = false;
|
||||
final isMailAddress = EmailUtils.isEmailAddressValid(queryString);
|
||||
if (isMailAddress) {
|
||||
searchEmailByEmailAddressAction(context, EmailAddress(null, queryString));
|
||||
searchEmailByEmailAddressAction(EmailAddress(null, queryString));
|
||||
} else {
|
||||
_updateSimpleSearchFilter(textOption: Some(SearchQuery(queryString)));
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
}
|
||||
|
||||
void selectHasAttachmentSearchFilter(BuildContext context) {
|
||||
void selectHasAttachmentSearchFilter() {
|
||||
_updateSimpleSearchFilter(hasAttachmentOption: const Some(true));
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void selectStarredSearchFilter(BuildContext context) {
|
||||
void selectStarredSearchFilter() {
|
||||
final listKeyword = listHasKeywordFiltered;
|
||||
if (!listKeyword.contains(KeyWordIdentifier.emailFlagged.value)) {
|
||||
listKeyword.add(KeyWordIdentifier.emailFlagged.value);
|
||||
}
|
||||
_updateSimpleSearchFilter(hasKeywordOption: Some(listKeyword));
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void selectUnreadSearchFilter(BuildContext context) {
|
||||
void selectUnreadSearchFilter() {
|
||||
_updateSimpleSearchFilter(unreadOption: const Some(true));
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
bool checkQuickSearchFilterSelected(QuickSearchFilter filter) {
|
||||
@@ -675,7 +680,7 @@ class SearchEmailController extends BaseController
|
||||
);
|
||||
|
||||
_setEmailReceiveTimeType(emailReceiveTimeType);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
);
|
||||
} else {
|
||||
@@ -686,18 +691,18 @@ class SearchEmailController extends BaseController
|
||||
);
|
||||
|
||||
_setEmailReceiveTimeType(emailReceiveTimeType);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
}
|
||||
|
||||
void selectSortOrderQuickSearchFilter(BuildContext context, EmailSortOrderType sortOrderType) {
|
||||
void selectSortOrderQuickSearchFilter(EmailSortOrderType sortOrderType) {
|
||||
emailSortOrderType.value = sortOrderType;
|
||||
_updateSimpleSearchFilter(sortOrderTypeOption: Some(sortOrderType));
|
||||
mailboxDashBoardController.storeEmailSortOrder(sortOrderType);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async {
|
||||
void selectMailboxForSearchFilter(PresentationMailbox? mailbox) async {
|
||||
final arguments = DestinationPickerArguments(
|
||||
mailboxDashBoardController.accountId.value!,
|
||||
MailboxActions.select,
|
||||
@@ -716,9 +721,7 @@ class SearchEmailController extends BaseController
|
||||
: Some(destinationMailbox)
|
||||
);
|
||||
|
||||
if (context.mounted) {
|
||||
_searchEmailAction(context);
|
||||
}
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
Future<void> selectContactForSearchFilter(
|
||||
@@ -776,9 +779,41 @@ class SearchEmailController extends BaseController
|
||||
break;
|
||||
}
|
||||
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void updateSimpleSearchFilter({
|
||||
Option<Set<String>>? fromOption,
|
||||
Option<Set<String>>? toOption,
|
||||
Option<SearchQuery>? textOption,
|
||||
Option<PresentationMailbox>? mailboxOption,
|
||||
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
|
||||
Option<bool>? hasAttachmentOption,
|
||||
Option<bool>? unreadOption,
|
||||
Option<UTCDate>? beforeOption,
|
||||
Option<UTCDate>? startDateOption,
|
||||
Option<UTCDate>? endDateOption,
|
||||
Option<int>? positionOption,
|
||||
Option<Set<String>>? hasKeywordOption,
|
||||
Option<EmailSortOrderType>? sortOrderTypeOption,
|
||||
Option<Label>? labelOption,
|
||||
}) => _updateSimpleSearchFilter(
|
||||
fromOption: fromOption,
|
||||
toOption: toOption,
|
||||
textOption: textOption,
|
||||
mailboxOption: mailboxOption,
|
||||
emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
|
||||
hasAttachmentOption: hasAttachmentOption,
|
||||
unreadOption: unreadOption,
|
||||
beforeOption: beforeOption,
|
||||
startDateOption: startDateOption,
|
||||
endDateOption: endDateOption,
|
||||
positionOption: positionOption,
|
||||
hasKeywordOption: hasKeywordOption,
|
||||
sortOrderTypeOption: sortOrderTypeOption,
|
||||
labelOption: labelOption,
|
||||
);
|
||||
|
||||
void _updateSimpleSearchFilter({
|
||||
Option<Set<String>>? fromOption,
|
||||
Option<Set<String>>? toOption,
|
||||
@@ -793,6 +828,7 @@ class SearchEmailController extends BaseController
|
||||
Option<int>? positionOption,
|
||||
Option<Set<String>>? hasKeywordOption,
|
||||
Option<EmailSortOrderType>? sortOrderTypeOption,
|
||||
Option<Label>? labelOption,
|
||||
}) {
|
||||
searchEmailFilter.value = searchEmailFilter.value.copyWith(
|
||||
fromOption: fromOption,
|
||||
@@ -808,6 +844,7 @@ class SearchEmailController extends BaseController
|
||||
positionOption: positionOption,
|
||||
hasKeywordOption: hasKeywordOption,
|
||||
sortOrderTypeOption: sortOrderTypeOption,
|
||||
labelOption: labelOption,
|
||||
);
|
||||
searchEmailFilter.refresh();
|
||||
}
|
||||
@@ -1017,45 +1054,48 @@ class SearchEmailController extends BaseController
|
||||
) {
|
||||
switch(searchFilter) {
|
||||
case QuickSearchFilter.dateTime:
|
||||
_deleteDateTimeSearchFilter(context);
|
||||
_deleteDateTimeSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.sortBy:
|
||||
_deleteSortOrderSearchFilter(context);
|
||||
_deleteSortOrderSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.from:
|
||||
_deleteFromSearchFilter(context);
|
||||
_deleteFromSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
_deleteHasAttachmentSearchFilter(context);
|
||||
_deleteHasAttachmentSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.to:
|
||||
_deleteToSearchFilter(context);
|
||||
_deleteToSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.folder:
|
||||
_deleteFolderSearchFilter(context);
|
||||
_deleteFolderSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.starred:
|
||||
_deleteStarredSearchFilter(context);
|
||||
_deleteStarredSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.unread:
|
||||
_deleteUnreadSearchFilter(context);
|
||||
_deleteUnreadSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.labels:
|
||||
deleteQuickSearchFilter(filter: QuickSearchFilter.labels);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void _deleteDateTimeSearchFilter(BuildContext context) {
|
||||
void _deleteDateTimeSearchFilter() {
|
||||
_updateSimpleSearchFilter(
|
||||
emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.allTime),
|
||||
startDateOption: const None(),
|
||||
endDateOption: const None(),
|
||||
);
|
||||
_setEmailReceiveTimeType(EmailReceiveTimeType.allTime);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteSortOrderSearchFilter(BuildContext context) {
|
||||
void _deleteSortOrderSearchFilter() {
|
||||
emailSortOrderType.value = SearchEmailFilter.defaultSortOrder;
|
||||
_updateSimpleSearchFilter(
|
||||
sortOrderTypeOption: const Some(SearchEmailFilter.defaultSortOrder),
|
||||
@@ -1063,40 +1103,40 @@ class SearchEmailController extends BaseController
|
||||
mailboxDashBoardController.storeEmailSortOrder(
|
||||
SearchEmailFilter.defaultSortOrder,
|
||||
);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteFromSearchFilter(BuildContext context) {
|
||||
void _deleteFromSearchFilter() {
|
||||
_updateSimpleSearchFilter(fromOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteToSearchFilter(BuildContext context) {
|
||||
void _deleteToSearchFilter() {
|
||||
_updateSimpleSearchFilter(toOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteHasAttachmentSearchFilter(BuildContext context) {
|
||||
void _deleteHasAttachmentSearchFilter() {
|
||||
_updateSimpleSearchFilter(hasAttachmentOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteFolderSearchFilter(BuildContext context) {
|
||||
void _deleteFolderSearchFilter() {
|
||||
_updateSimpleSearchFilter(mailboxOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteStarredSearchFilter(BuildContext context) {
|
||||
void _deleteStarredSearchFilter() {
|
||||
_updateSimpleSearchFilter(hasKeywordOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void _deleteUnreadSearchFilter(BuildContext context) {
|
||||
void _deleteUnreadSearchFilter() {
|
||||
_updateSimpleSearchFilter(unreadOption: const None());
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
void clearAllSearchFilterApplied(BuildContext context) {
|
||||
void clearAllSearchFilterApplied() {
|
||||
textInputSearchController.clear();
|
||||
currentSearchText.value = '';
|
||||
listRecentSearch.clear();
|
||||
@@ -1109,7 +1149,7 @@ class SearchEmailController extends BaseController
|
||||
searchEmailFilter.value = SearchEmailFilter.withSortOrder(
|
||||
emailSortOrderType.value,
|
||||
);
|
||||
_searchEmailAction(context);
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -32,6 +32,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/se
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/handle_email_more_action_extension.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/handle_keyboard_shortcut_actions_extension.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/handle_press_email_selection_action.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/extension/update_search_filter_extension.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/context_item_receive_time_type_action.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/context_item_sort_order_type_action.dart';
|
||||
import 'package:tmail_ui_user/features/search/email/presentation/model/popup_menu_item_date_filter_action.dart';
|
||||
@@ -278,6 +279,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
children: [
|
||||
_buildSearchFilterButton(context, QuickSearchFilter.folder),
|
||||
SearchEmailViewStyle.searchFilterSizeBoxMargin,
|
||||
_buildSearchFilterButton(context, QuickSearchFilter.labels),
|
||||
SearchEmailViewStyle.searchFilterSizeBoxMargin,
|
||||
_buildSearchFilterButton(context, QuickSearchFilter.from),
|
||||
SearchEmailViewStyle.searchFilterSizeBoxMargin,
|
||||
_buildSearchFilterButton(context, QuickSearchFilter.to),
|
||||
@@ -308,7 +311,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
fontSize: 13,
|
||||
fontWeight: FontWeight.w500
|
||||
),
|
||||
onTapActionCallback: () => controller.clearAllSearchFilterApplied(context)
|
||||
onTapActionCallback: controller.clearAllSearchFilterApplied
|
||||
);
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
@@ -331,6 +334,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
final endDate = controller.endDateFiltered;
|
||||
final receiveTimeType = controller.receiveTimeFiltered;
|
||||
final mailbox = controller.mailboxFiltered;
|
||||
final label = controller.labelFiltered;
|
||||
final listAddressOfTo = controller.listAddressOfToFiltered;
|
||||
|
||||
final isSelected = searchFilter.isSelected(
|
||||
@@ -352,6 +356,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
listAddressOfFrom: listAddressOfFrom,
|
||||
listAddressOfTo: listAddressOfTo,
|
||||
mailbox: mailbox,
|
||||
label: label,
|
||||
backgroundColor: searchFilter.getMobileBackgroundColor(isSelected: isSelected),
|
||||
onSelectSearchFilterAction: _onSelectSearchFilterAction,
|
||||
onDeleteSearchFilterAction: (searchFilter) =>
|
||||
@@ -386,7 +391,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
PrefixEmailAddress.from);
|
||||
break;
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
controller.selectHasAttachmentSearchFilter(context);
|
||||
controller.selectHasAttachmentSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.to:
|
||||
controller.selectContactForSearchFilter(
|
||||
@@ -394,15 +399,26 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
PrefixEmailAddress.to);
|
||||
break;
|
||||
case QuickSearchFilter.folder:
|
||||
controller.selectMailboxForSearchFilter(
|
||||
context,
|
||||
controller.mailboxFiltered);
|
||||
controller.selectMailboxForSearchFilter(controller.mailboxFiltered);
|
||||
break;
|
||||
case QuickSearchFilter.starred:
|
||||
controller.selectStarredSearchFilter(context);
|
||||
controller.selectStarredSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.unread:
|
||||
controller.selectUnreadSearchFilter(context);
|
||||
controller.selectUnreadSearchFilter();
|
||||
break;
|
||||
case QuickSearchFilter.labels:
|
||||
final listLabels = controller.mailboxDashBoardController.labelController.labels;
|
||||
final selectedLabel = controller.labelFiltered;
|
||||
|
||||
controller.openLabelsFilterModal(
|
||||
context: context,
|
||||
position: buttonPosition,
|
||||
labels: listLabels,
|
||||
selectedLabel: selectedLabel,
|
||||
imagePaths: controller.imagePaths,
|
||||
onSelectLabelsActions: controller.onSelectLabelFilter,
|
||||
);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -471,10 +487,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
),
|
||||
menuActionClick: (menuAction) {
|
||||
popBack();
|
||||
controller.selectSortOrderQuickSearchFilter(
|
||||
context,
|
||||
menuAction.action,
|
||||
);
|
||||
controller.selectSortOrderQuickSearchFilter(menuAction.action);
|
||||
},
|
||||
),
|
||||
);
|
||||
@@ -499,10 +512,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
itemActions: contextMenuActions,
|
||||
onContextMenuActionClick: (menuAction) {
|
||||
popBack();
|
||||
controller.selectSortOrderQuickSearchFilter(
|
||||
context,
|
||||
menuAction.action,
|
||||
);
|
||||
controller.selectSortOrderQuickSearchFilter(menuAction.action);
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -648,7 +658,6 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
child: InkWell(
|
||||
child: ContactQuickSearchItem(emailAddress: emailAddress),
|
||||
onTap: () => controller.searchEmailByEmailAddressAction(
|
||||
context,
|
||||
emailAddress
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user