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<int>? positionOption,
Option<EmailSortOrderType>? sortOrderTypeOption,
Option<Label>? labelOption,
}) {
_memorySearchFilter = _memorySearchFilter.copyWith(
fromOption: fromOption,
@@ -147,7 +148,9 @@ class AdvancedFilterController extends BaseController {
startDateOption: startDateOption,
endDateOption: endDateOption,
positionOption: positionOption,
sortOrderTypeOption: sortOrderTypeOption);
sortOrderTypeOption: sortOrderTypeOption,
labelOption: labelOption,
);
}
void _synchronizeSearchFilter() {
@@ -190,6 +193,8 @@ class AdvancedFilterController extends BaseController {
{KeyWordIdentifier.emailFlagged.value},
);
final labelOption = optionOf(selectedLabel.value);
_updateMemorySearchFilter(
textOption: textOption,
notKeywordOption: notKeywordsOption,
@@ -203,7 +208,8 @@ class AdvancedFilterController extends BaseController {
unreadOption: unreadOption,
hasKeywordOption: hasKeywordOption,
startDateOption: startDateOption,
endDateOption: endDateOption
endDateOption: endDateOption,
labelOption: labelOption,
);
searchController.synchronizeSearchFilter(_memorySearchFilter);
@@ -314,6 +320,8 @@ class AdvancedFilterController extends BaseController {
: StringConvert.writeNullToEmpty(
_memorySearchFilter.mailbox?.getDisplayName(context));
}
selectedLabel.value = _memorySearchFilter.label;
}
void selectDateRange(BuildContext context) {
@@ -482,6 +490,7 @@ class AdvancedFilterController extends BaseController {
listFromEmailAddress.clear();
listToEmailAddress.clear();
_destinationMailboxSelected = null;
selectedLabel.value = null;
}
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/mail/email/email_filter_condition.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/extensions/email_filter_condition_extension.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
@@ -35,6 +36,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final UTCDate? endDate;
final int? position;
final EmailSortOrderType sortOrderType;
final Label? label;
factory SearchEmailFilter.initial() => SearchEmailFilter();
@@ -49,6 +51,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
this.startDate,
this.endDate,
this.position,
this.label,
Set<String>? from,
Set<String>? to,
EmailReceiveTimeType? emailReceiveTimeType,
@@ -83,6 +86,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Option<UTCDate>? endDateOption,
Option<int>? positionOption,
Option<EmailSortOrderType>? sortOrderTypeOption,
Option<Label>? labelOption,
}) {
return SearchEmailFilter(
from: getOptionParam(fromOption, from),
@@ -100,6 +104,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
endDate: getOptionParam(endDateOption, endDate),
position: getOptionParam(positionOption, position),
sortOrderType: getOptionParam(sortOrderTypeOption, sortOrderType),
label: getOptionParam(labelOption, label),
);
}
@@ -146,6 +151,8 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Operator.AND,
hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet(),
),
if (label != null)
EmailFilterCondition(hasKeyword: label!.keyword),
if (moreFilterCondition != null && moreFilterCondition.hasCondition)
moreFilterCondition
};
@@ -203,6 +210,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
emailReceiveTimeType != EmailReceiveTimeType.allTime ||
sortOrderType != SearchEmailFilter.defaultSortOrder ||
(mailbox != null && mailbox?.id != PresentationMailbox.unifiedMailbox.id) ||
label != null ||
hasAttachment ||
unread;
@@ -217,6 +225,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
emailReceiveTimeType == EmailReceiveTimeType.allTime &&
sortOrderType == SearchEmailFilter.defaultSortOrder &&
(mailbox == null || mailbox?.id == PresentationMailbox.unifiedMailbox.id) &&
label == null &&
!hasAttachment &&
!unread;
@@ -236,6 +245,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
startDate,
endDate,
position,
sortOrderType
sortOrderType,
label,
];
}