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_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
);
@@ -523,7 +523,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
final isSelected = searchFilter.isSelected(
context,
searchEmailFilter,
sortOrderType);
sortOrderType,
userName);
EdgeInsetsGeometry? buttonPadding;
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: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;
}
}
@@ -20,6 +20,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final SearchQuery? text;
final String? subject;
final Set<String> notKeyword;
final Set<String> hasKeyword;
final PresentationMailbox? mailbox;
final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment;
@@ -41,6 +42,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
this.text,
this.subject,
Set<String>? notKeyword,
Set<String>? hasKeyword,
this.mailbox,
this.before,
this.startDate,
@@ -50,6 +52,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
}) : from = from ?? <String>{},
to = to ?? <String>{},
notKeyword = notKeyword ?? <String>{},
hasKeyword = hasKeyword ?? <String>{},
hasAttachment = hasAttachment ?? false,
emailReceiveTimeType =
emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
@@ -60,6 +63,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
SearchQuery? text,
Option<String>? subjectOption,
Set<String>? notKeyword,
Set<String>? hasKeyword,
Option<PresentationMailbox>? 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,
@@ -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) {