From 0efbece76fd1b9afb335112de6d7a4e108047506 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 13 Sep 2024 09:43:26 +0700 Subject: [PATCH] TF-3002 [WEB] Add `Starred` search filters in suggestion search view --- .../controller/search_controller.dart | 4 ++++ .../mailbox_dashboard_view_web.dart | 3 ++- .../model/search/quick_search_filter.dart | 19 +++++++++++++++---- .../model/search/search_email_filter.dart | 10 ++++++++++ .../widgets/search_input_form_widget.dart | 1 + 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index c584f7075..de306a3ea 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -14,6 +14,7 @@ import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart'; +import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/email_filter_condition_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; @@ -117,6 +118,9 @@ class SearchController extends BaseController with DateRangePickerMixin { : null, from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) ? userName.value + : null, + hasKeyword: listFilterOnSuggestionForm.contains(QuickSearchFilter.starred) + ? KeyWordIdentifier.emailFlagged.value : null ); 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 4b0a94d32..a737605a3 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -523,7 +523,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { final isSelected = searchFilter.isSelected( context, searchEmailFilter, - sortOrderType); + sortOrderType, + userName); EdgeInsetsGeometry? buttonPadding; if (searchFilter != QuickSearchFilter.sortBy) { 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 8b5110cd4..3d24b8002 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 @@ -3,6 +3,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.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: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'; @@ -14,6 +15,7 @@ enum QuickSearchFilter { hasAttachment, last7Days, fromMe, + starred, sortBy, dateTime, from, @@ -53,6 +55,8 @@ enum QuickSearchFilter { return mailbox?.getDisplayName(context) ?? AppLocalizations.of(context).all; case QuickSearchFilter.to: return AppLocalizations.of(context).to_email_address_prefix; + case QuickSearchFilter.starred: + return AppLocalizations.of(context).starred; } } @@ -74,6 +78,8 @@ enum QuickSearchFilter { return imagePaths.icUserSB; case QuickSearchFilter.folder: return imagePaths.icFolderMailbox; + case QuickSearchFilter.starred: + return isSelected ? imagePaths.icSelectedSB : imagePaths.icStar; } } @@ -106,15 +112,18 @@ enum QuickSearchFilter { bool isSelected( BuildContext context, SearchEmailFilter searchFilter, - EmailSortOrderType sortOrderType + EmailSortOrderType sortOrderType, + UserName? userName, ) { switch (this) { case QuickSearchFilter.hasAttachment: return searchFilter.hasAttachment; case QuickSearchFilter.last7Days: - return true; + return searchFilter.emailReceiveTimeType == EmailReceiveTimeType.last7Days; case QuickSearchFilter.fromMe: - return searchFilter.from.length == 1; + return searchFilter.from.length == 1 && + userName?.value.isNotEmpty == true && + userName?.value == searchFilter.from.first; case QuickSearchFilter.sortBy: return sortOrderType != EmailSortOrderType.mostRecent; case QuickSearchFilter.dateTime: @@ -124,7 +133,9 @@ enum QuickSearchFilter { case QuickSearchFilter.to: return searchFilter.to.isNotEmpty; case QuickSearchFilter.folder: - return searchFilter.mailbox != null; + return searchFilter.mailbox != null; + case QuickSearchFilter.starred: + return searchFilter.hasKeyword.contains(KeyWordIdentifier.emailFlagged.value) == true; } } diff --git a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart index d40eebbe5..d1c60ef88 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart @@ -20,6 +20,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { final SearchQuery? text; final String? subject; final Set notKeyword; + final Set hasKeyword; final PresentationMailbox? mailbox; final EmailReceiveTimeType emailReceiveTimeType; final bool hasAttachment; @@ -41,6 +42,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { this.text, this.subject, Set? notKeyword, + Set? hasKeyword, this.mailbox, this.before, this.startDate, @@ -50,6 +52,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { }) : from = from ?? {}, to = to ?? {}, notKeyword = notKeyword ?? {}, + hasKeyword = hasKeyword ?? {}, hasAttachment = hasAttachment ?? false, emailReceiveTimeType = emailReceiveTimeType ?? EmailReceiveTimeType.allTime; @@ -60,6 +63,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { SearchQuery? text, Option? subjectOption, Set? notKeyword, + Set? hasKeyword, Option? mailboxOption, EmailReceiveTimeType? emailReceiveTimeType, bool? hasAttachment, @@ -75,6 +79,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { text: text ?? this.text, subject: getOptionParam(subjectOption, subject), notKeyword: notKeyword ?? this.notKeyword, + hasKeyword: hasKeyword ?? this.hasKeyword, mailbox: getOptionParam(mailboxOption, mailbox), emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType, hasAttachment: hasAttachment ?? this.hasAttachment, @@ -122,6 +127,10 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { LogicFilterOperator( Operator.NOT, notKeyword.map((e) => EmailFilterCondition(text: e)).toSet()), + if (hasKeyword.isNotEmpty) + LogicFilterOperator( + Operator.AND, + hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet()), if (moreFilterCondition != null && moreFilterCondition.hasCondition) moreFilterCondition }; @@ -138,6 +147,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin { text, subject, notKeyword, + hasKeyword, mailbox, emailReceiveTimeType, hasAttachment, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index d5dc1c5da..0ab5026e2 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -69,6 +69,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { QuickSearchFilter.hasAttachment, QuickSearchFilter.last7Days, QuickSearchFilter.fromMe, + QuickSearchFilter.starred, ], actionButtonBuilder: (context, filterAction, suggestionsListState) { if (filterAction is QuickSearchFilter) {