TF-3002 [WEB] Add Starred search filters in suggestion search view

This commit is contained in:
dab246
2024-09-13 09:43:26 +07:00
committed by Dat H. Pham
parent b10b2200ff
commit 0efbece76f
5 changed files with 32 additions and 5 deletions
@@ -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.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.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/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/email/presentation_email.dart';
import 'package:model/extensions/email_filter_condition_extension.dart'; import 'package:model/extensions/email_filter_condition_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
@@ -117,6 +118,9 @@ class SearchController extends BaseController with DateRangePickerMixin {
: null, : null,
from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) from: listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)
? userName.value ? userName.value
: null,
hasKeyword: listFilterOnSuggestionForm.contains(QuickSearchFilter.starred)
? KeyWordIdentifier.emailFlagged.value
: null : null
); );
@@ -523,7 +523,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
final isSelected = searchFilter.isSelected( final isSelected = searchFilter.isSelected(
context, context,
searchEmailFilter, searchEmailFilter,
sortOrderType); sortOrderType,
userName);
EdgeInsetsGeometry? buttonPadding; EdgeInsetsGeometry? buttonPadding;
if (searchFilter != QuickSearchFilter.sortBy) { if (searchFilter != QuickSearchFilter.sortBy) {
@@ -3,6 +3,7 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:jmap_dart_client/jmap/core/user_name.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: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/presentation/extensions/presentation_mailbox_extension.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_receive_time_type.dart';
@@ -14,6 +15,7 @@ enum QuickSearchFilter {
hasAttachment, hasAttachment,
last7Days, last7Days,
fromMe, fromMe,
starred,
sortBy, sortBy,
dateTime, dateTime,
from, from,
@@ -53,6 +55,8 @@ enum QuickSearchFilter {
return mailbox?.getDisplayName(context) ?? AppLocalizations.of(context).all; return mailbox?.getDisplayName(context) ?? AppLocalizations.of(context).all;
case QuickSearchFilter.to: case QuickSearchFilter.to:
return AppLocalizations.of(context).to_email_address_prefix; 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; return imagePaths.icUserSB;
case QuickSearchFilter.folder: case QuickSearchFilter.folder:
return imagePaths.icFolderMailbox; return imagePaths.icFolderMailbox;
case QuickSearchFilter.starred:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icStar;
} }
} }
@@ -106,15 +112,18 @@ enum QuickSearchFilter {
bool isSelected( bool isSelected(
BuildContext context, BuildContext context,
SearchEmailFilter searchFilter, SearchEmailFilter searchFilter,
EmailSortOrderType sortOrderType EmailSortOrderType sortOrderType,
UserName? userName,
) { ) {
switch (this) { switch (this) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
return searchFilter.hasAttachment; return searchFilter.hasAttachment;
case QuickSearchFilter.last7Days: case QuickSearchFilter.last7Days:
return true; return searchFilter.emailReceiveTimeType == EmailReceiveTimeType.last7Days;
case QuickSearchFilter.fromMe: 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: case QuickSearchFilter.sortBy:
return sortOrderType != EmailSortOrderType.mostRecent; return sortOrderType != EmailSortOrderType.mostRecent;
case QuickSearchFilter.dateTime: case QuickSearchFilter.dateTime:
@@ -124,7 +133,9 @@ enum QuickSearchFilter {
case QuickSearchFilter.to: case QuickSearchFilter.to:
return searchFilter.to.isNotEmpty; return searchFilter.to.isNotEmpty;
case QuickSearchFilter.folder: case QuickSearchFilter.folder:
return searchFilter.mailbox != null; return searchFilter.mailbox != null;
case QuickSearchFilter.starred:
return searchFilter.hasKeyword.contains(KeyWordIdentifier.emailFlagged.value) == true;
} }
} }
@@ -20,6 +20,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final SearchQuery? text; final SearchQuery? text;
final String? subject; final String? subject;
final Set<String> notKeyword; final Set<String> notKeyword;
final Set<String> hasKeyword;
final PresentationMailbox? mailbox; final PresentationMailbox? mailbox;
final EmailReceiveTimeType emailReceiveTimeType; final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment; final bool hasAttachment;
@@ -41,6 +42,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
this.text, this.text,
this.subject, this.subject,
Set<String>? notKeyword, Set<String>? notKeyword,
Set<String>? hasKeyword,
this.mailbox, this.mailbox,
this.before, this.before,
this.startDate, this.startDate,
@@ -50,6 +52,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
}) : from = from ?? <String>{}, }) : from = from ?? <String>{},
to = to ?? <String>{}, to = to ?? <String>{},
notKeyword = notKeyword ?? <String>{}, notKeyword = notKeyword ?? <String>{},
hasKeyword = hasKeyword ?? <String>{},
hasAttachment = hasAttachment ?? false, hasAttachment = hasAttachment ?? false,
emailReceiveTimeType = emailReceiveTimeType =
emailReceiveTimeType ?? EmailReceiveTimeType.allTime; emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
@@ -60,6 +63,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
SearchQuery? text, SearchQuery? text,
Option<String>? subjectOption, Option<String>? subjectOption,
Set<String>? notKeyword, Set<String>? notKeyword,
Set<String>? hasKeyword,
Option<PresentationMailbox>? mailboxOption, Option<PresentationMailbox>? mailboxOption,
EmailReceiveTimeType? emailReceiveTimeType, EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment, bool? hasAttachment,
@@ -75,6 +79,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
text: text ?? this.text, text: text ?? this.text,
subject: getOptionParam(subjectOption, subject), subject: getOptionParam(subjectOption, subject),
notKeyword: notKeyword ?? this.notKeyword, notKeyword: notKeyword ?? this.notKeyword,
hasKeyword: hasKeyword ?? this.hasKeyword,
mailbox: getOptionParam(mailboxOption, mailbox), mailbox: getOptionParam(mailboxOption, mailbox),
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType, emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType,
hasAttachment: hasAttachment ?? this.hasAttachment, hasAttachment: hasAttachment ?? this.hasAttachment,
@@ -122,6 +127,10 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
LogicFilterOperator( LogicFilterOperator(
Operator.NOT, Operator.NOT,
notKeyword.map((e) => EmailFilterCondition(text: e)).toSet()), 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) if (moreFilterCondition != null && moreFilterCondition.hasCondition)
moreFilterCondition moreFilterCondition
}; };
@@ -138,6 +147,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
text, text,
subject, subject,
notKeyword, notKeyword,
hasKeyword,
mailbox, mailbox,
emailReceiveTimeType, emailReceiveTimeType,
hasAttachment, hasAttachment,
@@ -69,6 +69,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
QuickSearchFilter.hasAttachment, QuickSearchFilter.hasAttachment,
QuickSearchFilter.last7Days, QuickSearchFilter.last7Days,
QuickSearchFilter.fromMe, QuickSearchFilter.fromMe,
QuickSearchFilter.starred,
], ],
actionButtonBuilder: (context, filterAction, suggestionsListState) { actionButtonBuilder: (context, filterAction, suggestionsListState) {
if (filterAction is QuickSearchFilter) { if (filterAction is QuickSearchFilter) {