TF-4229 Implement advanced search email by label

This commit is contained in:
dab246
2026-01-02 18:04:49 +07:00
committed by Dat H. Pham
parent 7839e6b339
commit 96f03eaa40
2 changed files with 22 additions and 3 deletions
@@ -131,6 +131,7 @@ class AdvancedFilterController extends BaseController {
Option<UTCDate>? endDateOption, Option<UTCDate>? endDateOption,
Option<int>? positionOption, Option<int>? positionOption,
Option<EmailSortOrderType>? sortOrderTypeOption, Option<EmailSortOrderType>? sortOrderTypeOption,
Option<Label>? labelOption,
}) { }) {
_memorySearchFilter = _memorySearchFilter.copyWith( _memorySearchFilter = _memorySearchFilter.copyWith(
fromOption: fromOption, fromOption: fromOption,
@@ -147,7 +148,9 @@ class AdvancedFilterController extends BaseController {
startDateOption: startDateOption, startDateOption: startDateOption,
endDateOption: endDateOption, endDateOption: endDateOption,
positionOption: positionOption, positionOption: positionOption,
sortOrderTypeOption: sortOrderTypeOption); sortOrderTypeOption: sortOrderTypeOption,
labelOption: labelOption,
);
} }
void _synchronizeSearchFilter() { void _synchronizeSearchFilter() {
@@ -190,6 +193,8 @@ class AdvancedFilterController extends BaseController {
{KeyWordIdentifier.emailFlagged.value}, {KeyWordIdentifier.emailFlagged.value},
); );
final labelOption = optionOf(selectedLabel.value);
_updateMemorySearchFilter( _updateMemorySearchFilter(
textOption: textOption, textOption: textOption,
notKeywordOption: notKeywordsOption, notKeywordOption: notKeywordsOption,
@@ -203,7 +208,8 @@ class AdvancedFilterController extends BaseController {
unreadOption: unreadOption, unreadOption: unreadOption,
hasKeywordOption: hasKeywordOption, hasKeywordOption: hasKeywordOption,
startDateOption: startDateOption, startDateOption: startDateOption,
endDateOption: endDateOption endDateOption: endDateOption,
labelOption: labelOption,
); );
searchController.synchronizeSearchFilter(_memorySearchFilter); searchController.synchronizeSearchFilter(_memorySearchFilter);
@@ -314,6 +320,8 @@ class AdvancedFilterController extends BaseController {
: StringConvert.writeNullToEmpty( : StringConvert.writeNullToEmpty(
_memorySearchFilter.mailbox?.getDisplayName(context)); _memorySearchFilter.mailbox?.getDisplayName(context));
} }
selectedLabel.value = _memorySearchFilter.label;
} }
void selectDateRange(BuildContext context) { void selectDateRange(BuildContext context) {
@@ -482,6 +490,7 @@ class AdvancedFilterController extends BaseController {
listFromEmailAddress.clear(); listFromEmailAddress.clear();
listToEmailAddress.clear(); listToEmailAddress.clear();
_destinationMailboxSelected = null; _destinationMailboxSelected = null;
selectedLabel.value = null;
} }
void _clearAllTextFieldInput() { void _clearAllTextFieldInput() {
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator
import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/core/utc_date.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:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:labels/model/label.dart';
import 'package:model/email/prefix_email_address.dart'; import 'package:model/email/prefix_email_address.dart';
import 'package:model/extensions/email_filter_condition_extension.dart'; import 'package:model/extensions/email_filter_condition_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart';
@@ -35,6 +36,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final UTCDate? endDate; final UTCDate? endDate;
final int? position; final int? position;
final EmailSortOrderType sortOrderType; final EmailSortOrderType sortOrderType;
final Label? label;
factory SearchEmailFilter.initial() => SearchEmailFilter(); factory SearchEmailFilter.initial() => SearchEmailFilter();
@@ -49,6 +51,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
this.startDate, this.startDate,
this.endDate, this.endDate,
this.position, this.position,
this.label,
Set<String>? from, Set<String>? from,
Set<String>? to, Set<String>? to,
EmailReceiveTimeType? emailReceiveTimeType, EmailReceiveTimeType? emailReceiveTimeType,
@@ -83,6 +86,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Option<UTCDate>? endDateOption, Option<UTCDate>? endDateOption,
Option<int>? positionOption, Option<int>? positionOption,
Option<EmailSortOrderType>? sortOrderTypeOption, Option<EmailSortOrderType>? sortOrderTypeOption,
Option<Label>? labelOption,
}) { }) {
return SearchEmailFilter( return SearchEmailFilter(
from: getOptionParam(fromOption, from), from: getOptionParam(fromOption, from),
@@ -100,6 +104,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
endDate: getOptionParam(endDateOption, endDate), endDate: getOptionParam(endDateOption, endDate),
position: getOptionParam(positionOption, position), position: getOptionParam(positionOption, position),
sortOrderType: getOptionParam(sortOrderTypeOption, sortOrderType), sortOrderType: getOptionParam(sortOrderTypeOption, sortOrderType),
label: getOptionParam(labelOption, label),
); );
} }
@@ -146,6 +151,8 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Operator.AND, Operator.AND,
hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet(), hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet(),
), ),
if (label != null)
EmailFilterCondition(hasKeyword: label!.keyword),
if (moreFilterCondition != null && moreFilterCondition.hasCondition) if (moreFilterCondition != null && moreFilterCondition.hasCondition)
moreFilterCondition moreFilterCondition
}; };
@@ -203,6 +210,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
emailReceiveTimeType != EmailReceiveTimeType.allTime || emailReceiveTimeType != EmailReceiveTimeType.allTime ||
sortOrderType != SearchEmailFilter.defaultSortOrder || sortOrderType != SearchEmailFilter.defaultSortOrder ||
(mailbox != null && mailbox?.id != PresentationMailbox.unifiedMailbox.id) || (mailbox != null && mailbox?.id != PresentationMailbox.unifiedMailbox.id) ||
label != null ||
hasAttachment || hasAttachment ||
unread; unread;
@@ -217,6 +225,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
emailReceiveTimeType == EmailReceiveTimeType.allTime && emailReceiveTimeType == EmailReceiveTimeType.allTime &&
sortOrderType == SearchEmailFilter.defaultSortOrder && sortOrderType == SearchEmailFilter.defaultSortOrder &&
(mailbox == null || mailbox?.id == PresentationMailbox.unifiedMailbox.id) && (mailbox == null || mailbox?.id == PresentationMailbox.unifiedMailbox.id) &&
label == null &&
!hasAttachment && !hasAttachment &&
!unread; !unread;
@@ -236,6 +245,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
startDate, startDate,
endDate, endDate,
position, position,
sortOrderType sortOrderType,
label,
]; ];
} }