TF-1179 Reset before in filter when updating the filter

This commit is contained in:
Dat PHAM HOANG
2022-11-25 15:25:41 +07:00
committed by Dat H. Pham
parent 009cf7cbf8
commit 17e6cde83e
2 changed files with 99 additions and 73 deletions
@@ -1,3 +1,4 @@
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
@@ -33,25 +34,33 @@ class SimpleSearchFilter with EquatableMixin {
emailReceiveTimeType = emailReceiveTimeType ?? EmailReceiveTimeType.allTime; emailReceiveTimeType = emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
SimpleSearchFilter copyWith({ SimpleSearchFilter copyWith({
Set<String>? from, Option<Set<String>>? fromOption,
Set<String>? to, Option<Set<String>>? toOption,
SearchQuery? text, Option<SearchQuery>? textOption,
PresentationMailbox? mailbox, Option<PresentationMailbox>? mailboxOption,
EmailReceiveTimeType? emailReceiveTimeType, Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
bool? hasAttachment, Option<bool>? hasAttachmentOption,
UTCDate? before, Option<UTCDate>? beforeOption,
}) { }) {
return SimpleSearchFilter( return SimpleSearchFilter(
from: from ?? this.from, from: _getOptionParam(fromOption, from),
to: to ?? this.to, to: _getOptionParam(toOption, to),
text: text ?? this.text, text: _getOptionParam(textOption, text),
mailbox: mailbox ?? this.mailbox, mailbox: _getOptionParam(mailboxOption, mailbox),
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType, emailReceiveTimeType: _getOptionParam(emailReceiveTimeTypeOption, emailReceiveTimeType),
hasAttachment: hasAttachment ?? this.hasAttachment, hasAttachment: _getOptionParam(hasAttachmentOption, hasAttachment),
before: before ?? this.before, before: _getOptionParam(beforeOption, before),
); );
} }
T? _getOptionParam<T>(Option<T?>? option, T? defaultValue) {
if (option != null) {
return option.toNullable();
} else {
return defaultValue;
}
}
Filter? mappingToEmailFilterCondition() { Filter? mappingToEmailFilterCondition() {
final emailEmailFilterConditionShared = EmailFilterCondition( final emailEmailFilterConditionShared = EmailFilterCondition(
text: text?.value.trim().isNotEmpty == true text: text?.value.trim().isNotEmpty == true
@@ -86,30 +95,6 @@ class SimpleSearchFilter with EquatableMixin {
} }
extension SearchEmailFilterExtension on SimpleSearchFilter { extension SearchEmailFilterExtension on SimpleSearchFilter {
SimpleSearchFilter toSimpleSearchFilterByBefore({UTCDate? newBefore}) {
return SimpleSearchFilter(
from: from,
to: to,
text: text,
mailbox: mailbox,
emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment,
before: newBefore,
);
}
SimpleSearchFilter toSimpleSearchFilterByMailbox({PresentationMailbox? newMailbox}) {
return SimpleSearchFilter(
from: from,
text: text,
mailbox: newMailbox,
emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment,
before: before,
);
}
bool get searchFilterByMailboxApplied => mailbox != null; bool get searchFilterByMailboxApplied => mailbox != null;
bool get searchFilterByFromApplied => from.isNotEmpty; bool get searchFilterByFromApplied => from.isNotEmpty;
@@ -9,8 +9,8 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
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_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
@@ -157,7 +157,10 @@ class SearchEmailController extends BaseController
_deBouncerTime.values.listen((value) async { _deBouncerTime.values.listen((value) async {
log('SearchEmailController::_initializeDebounceTimeTextSearchChange(): $value'); log('SearchEmailController::_initializeDebounceTimeTextSearchChange(): $value');
currentSearchText.value = value; currentSearchText.value = value;
_updateSimpleSearchFilter(text: value.isNotEmpty ? SearchQuery(value) : null); _updateSimpleSearchFilter(
textOption: value.isNotEmpty ? Some(SearchQuery(value)) : const None(),
beforeOption: const None()
);
if (value.isNotEmpty && accountId != null) { if (value.isNotEmpty && accountId != null) {
listSuggestionSearch.value = await quickSearchEmails(accountId: accountId!); listSuggestionSearch.value = await quickSearchEmails(accountId: accountId!);
} else { } else {
@@ -207,8 +210,7 @@ class SearchEmailController extends BaseController
final limit = listResultSearch.isNotEmpty final limit = listResultSearch.isNotEmpty
? UnsignedInt(listResultSearch.length) ? UnsignedInt(listResultSearch.length)
: ThreadConstants.defaultLimit; : ThreadConstants.defaultLimit;
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByBefore(newBefore: null); _updateSimpleSearchFilter(beforeOption: const None());
consumeState(_refreshChangesSearchEmailInteractor.execute( consumeState(_refreshChangesSearchEmailInteractor.execute(
accountId!, accountId!,
limit: limit, limit: limit,
@@ -268,6 +270,7 @@ class SearchEmailController extends BaseController
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (accountId != null) { if (accountId != null) {
canSearchMore = true;
searchIsRunning.value = true; searchIsRunning.value = true;
cancelSelectionMode(context); cancelSelectionMode(context);
@@ -309,7 +312,7 @@ class SearchEmailController extends BaseController
void searchMoreEmailsAction() { void searchMoreEmailsAction() {
if (canSearchMore && accountId != null) { if (canSearchMore && accountId != null) {
final lastEmail = listResultSearch.last; final lastEmail = listResultSearch.last;
_updateSimpleSearchFilter(before: lastEmail.receivedAt); _updateSimpleSearchFilter(beforeOption: optionOf(lastEmail.receivedAt));
consumeState(_searchMoreEmailInteractor.execute( consumeState(_searchMoreEmailInteractor.execute(
accountId!, accountId!,
@@ -343,18 +346,27 @@ class SearchEmailController extends BaseController
void showAllResultSearchAction(BuildContext context, String query) { void showAllResultSearchAction(BuildContext context, String query) {
setTextInputSearchForm(query); setTextInputSearchForm(query);
_updateSimpleSearchFilter(text: SearchQuery(query)); _updateSimpleSearchFilter(
textOption: Some(SearchQuery(query)),
beforeOption: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) { void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) {
setTextInputSearchForm(recentSearch.value); setTextInputSearchForm(recentSearch.value);
_updateSimpleSearchFilter(text: SearchQuery(recentSearch.value)); _updateSimpleSearchFilter(
textOption: Some(SearchQuery(recentSearch.value)),
beforeOption: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
void submitSearchAction(BuildContext context, String query) { void submitSearchAction(BuildContext context, String query) {
_updateSimpleSearchFilter(text: SearchQuery(query)); _updateSimpleSearchFilter(
textOption: Some(SearchQuery(query)),
beforeOption: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
@@ -381,15 +393,24 @@ class SearchEmailController extends BaseController
final filterSelected = checkQuickSearchFilterSelected(filter); final filterSelected = checkQuickSearchFilterSelected(filter);
switch (filter) { switch (filter) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
_updateSimpleSearchFilter(hasAttachment: !filterSelected); _updateSimpleSearchFilter(
hasAttachmentOption: Some(!filterSelected),
beforeOption: const None()
);
break; break;
case QuickSearchFilter.last7Days: case QuickSearchFilter.last7Days:
if (filterSelected) { if (filterSelected) {
_setEmailReceiveTimeType(null); _setEmailReceiveTimeType(null);
_updateSimpleSearchFilter(emailReceiveTimeType: EmailReceiveTimeType.allTime); _updateSimpleSearchFilter(
emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.allTime),
beforeOption: const None()
);
} else { } else {
_setEmailReceiveTimeType(EmailReceiveTimeType.last7Days); _setEmailReceiveTimeType(EmailReceiveTimeType.last7Days);
_updateSimpleSearchFilter(emailReceiveTimeType: EmailReceiveTimeType.last7Days); _updateSimpleSearchFilter(
emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.last7Days),
beforeOption: const None()
);
} }
break; break;
default: default:
@@ -406,12 +427,20 @@ class SearchEmailController extends BaseController
if (emailReceiveTimeType != null) { if (emailReceiveTimeType != null) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
emailReceiveTimeType: emailReceiveTimeType, emailReceiveTimeTypeOption: Some(emailReceiveTimeType),
text: searchQuery == null ? SearchQuery.initial() : simpleSearchFilter.value.text); textOption: searchQuery == null
? Some(SearchQuery.initial())
: optionOf(simpleSearchFilter.value.text),
beforeOption: const None()
);
} else { } else {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
emailReceiveTimeType: EmailReceiveTimeType.allTime, emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.allTime),
text: searchQuery == null ? SearchQuery.initial() : simpleSearchFilter.value.text); textOption: searchQuery == null
? Some(SearchQuery.initial())
: optionOf(simpleSearchFilter.value.text),
beforeOption: const None()
);
} }
_setEmailReceiveTimeType(emailReceiveTimeType); _setEmailReceiveTimeType(emailReceiveTimeType);
_searchEmailAction(context); _searchEmailAction(context);
@@ -429,8 +458,11 @@ class SearchEmailController extends BaseController
arguments: arguments, arguments: arguments,
onSelectedMailbox: (destinationMailbox) { onSelectedMailbox: (destinationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox; final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailbox?.id != mailboxSelected?.id) { if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); _updateSimpleSearchFilter(
mailboxOption: Some(mailboxSelected),
beforeOption: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
}); });
@@ -441,8 +473,11 @@ class SearchEmailController extends BaseController
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox; final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailbox?.id != mailboxSelected?.id) { if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); _updateSimpleSearchFilter(
mailboxOption: Some(mailboxSelected),
beforeOption: const None()
);
_searchEmailAction(context); _searchEmailAction(context);
} }
} }
@@ -526,10 +561,16 @@ class SearchEmailController extends BaseController
switch(prefixEmailAddress) { switch(prefixEmailAddress) {
case PrefixEmailAddress.from: case PrefixEmailAddress.from:
_updateSimpleSearchFilter(from: simpleSearchFilter.value.from); _updateSimpleSearchFilter(
fromOption: Some(simpleSearchFilter.value.from),
beforeOption: const None()
);
break; break;
case PrefixEmailAddress.to: case PrefixEmailAddress.to:
_updateSimpleSearchFilter(to: simpleSearchFilter.value.to); _updateSimpleSearchFilter(
toOption: Some(simpleSearchFilter.value.to),
beforeOption: const None()
);
break; break;
default: default:
break; break;
@@ -539,22 +580,22 @@ class SearchEmailController extends BaseController
} }
void _updateSimpleSearchFilter({ void _updateSimpleSearchFilter({
Set<String>? from, Option<Set<String>>? fromOption,
Set<String>? to, Option<Set<String>>? toOption,
SearchQuery? text, Option<SearchQuery>? textOption,
PresentationMailbox? mailbox, Option<PresentationMailbox>? mailboxOption,
EmailReceiveTimeType? emailReceiveTimeType, Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
bool? hasAttachment, Option<bool>? hasAttachmentOption,
UTCDate? before, Option<UTCDate>? beforeOption,
}) { }) {
simpleSearchFilter.value = simpleSearchFilter.value.copyWith( simpleSearchFilter.value = simpleSearchFilter.value.copyWith(
from: from, fromOption: fromOption,
to: to, toOption: toOption,
text: text, textOption: textOption,
mailbox: mailbox, mailboxOption: mailboxOption,
emailReceiveTimeType: emailReceiveTimeType, emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
hasAttachment: hasAttachment, hasAttachmentOption: hasAttachmentOption,
before: before, beforeOption: beforeOption,
); );
simpleSearchFilter.refresh(); simpleSearchFilter.refresh();
} }