TF-3002 [WEB] Add Starred search filters in suggestion search view
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user