TF-933 Remove advanced search filter on search query in mobile/tablet

This commit is contained in:
dab246
2022-09-19 16:36:47 +07:00
committed by Dat H. Pham
parent b9d1d6cc7b
commit 639ac62bad
2 changed files with 113 additions and 38 deletions
@@ -0,0 +1,83 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter_operator.dart';
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.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:model/model.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
class SimpleSearchFilter with EquatableMixin {
final Set<String> from;
final SearchQuery? text;
final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment;
final UTCDate? before;
SimpleSearchFilter({
Set<String>? from,
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
this.text,
this.before,
}) : from = from ?? <String>{},
hasAttachment = hasAttachment ?? false,
emailReceiveTimeType =emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
SimpleSearchFilter copyWith({
Set<String>? from,
SearchQuery? text,
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
UTCDate? before,
}) {
return SimpleSearchFilter(
from: from ?? this.from,
text: text ?? this.text,
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType,
hasAttachment: hasAttachment ?? this.hasAttachment,
before: before ?? this.before,
);
}
Filter? mappingToEmailFilterCondition() {
final emailEmailFilterConditionShared = EmailFilterCondition(
text: text?.value.trim().isNotEmpty == true
? text?.value
: null,
after: emailReceiveTimeType.toUTCDate(),
hasAttachment: hasAttachment == false ? null : hasAttachment,
before: before,
);
final listEmailCondition = {
if (emailEmailFilterConditionShared.hasCondition)
emailEmailFilterConditionShared,
if (from.isNotEmpty)
LogicFilterOperator(
Operator.AND,
from.map((e) => EmailFilterCondition(from: e)).toSet()),
};
return listEmailCondition.isNotEmpty
? LogicFilterOperator(Operator.AND, listEmailCondition)
: null;
}
@override
List<Object?> get props => [from, text, emailReceiveTimeType, hasAttachment, before];
}
extension SearchEmailFilterExtension on SimpleSearchFilter {
SimpleSearchFilter toSimpleSearchFilter({UTCDate? newBefore}) {
return SimpleSearchFilter(
from: from,
text: text,
emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment,
before: newBefore,
);
}
}
@@ -27,10 +27,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_s
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.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';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
import 'package:tmail_ui_user/features/search/domain/state/refresh_changes_search_email_state.dart'; import 'package:tmail_ui_user/features/search/domain/state/refresh_changes_search_email_state.dart';
import 'package:tmail_ui_user/features/search/domain/usecases/refresh_changes_search_email_interactor.dart'; import 'package:tmail_ui_user/features/search/domain/usecases/refresh_changes_search_email_interactor.dart';
import 'package:tmail_ui_user/features/search/presentation/model/search_more_state.dart'; import 'package:tmail_ui_user/features/search/presentation/model/search_more_state.dart';
import 'package:tmail_ui_user/features/search/presentation/model/simple_search_filter.dart';
import 'package:tmail_ui_user/features/search/presentation/search_email_bindings.dart'; import 'package:tmail_ui_user/features/search/presentation/search_email_bindings.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
@@ -65,7 +65,7 @@ class SearchEmailController extends BaseController
final listRecentSearch = RxList<RecentSearch>(); final listRecentSearch = RxList<RecentSearch>();
final listSuggestionSearch = RxList<PresentationEmail>(); final listSuggestionSearch = RxList<PresentationEmail>();
final listResultSearch = RxList<PresentationEmail>(); final listResultSearch = RxList<PresentationEmail>();
final searchEmailFilter = Rx<SearchEmailFilter>(SearchEmailFilter()); final simpleSearchFilter = Rx<SimpleSearchFilter>(SimpleSearchFilter());
final searchIsRunning = RxBool(false); final searchIsRunning = RxBool(false);
final emailReceiveTimeType = Rxn<EmailReceiveTimeType>(); final emailReceiveTimeType = Rxn<EmailReceiveTimeType>();
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE); final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
@@ -81,7 +81,7 @@ class SearchEmailController extends BaseController
UserProfile? get userProfile => mailboxDashBoardController.userProfile.value; UserProfile? get userProfile => mailboxDashBoardController.userProfile.value;
SearchQuery? get searchQuery => searchEmailFilter.value.text; SearchQuery? get searchQuery => simpleSearchFilter.value.text;
SearchEmailController( SearchEmailController(
this._quickSearchEmailInteractor, this._quickSearchEmailInteractor,
@@ -147,7 +147,7 @@ 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;
_updateFilterEmail(text: value.isNotEmpty ? SearchQuery(value) : null); _updateSimpleSearchFilter(text: value.isNotEmpty ? SearchQuery(value) : null);
if (value.isNotEmpty && accountId != null) { if (value.isNotEmpty && accountId != null) {
listSuggestionSearch.value = await quickSearchEmails(accountId: accountId!); listSuggestionSearch.value = await quickSearchEmails(accountId: accountId!);
} else { } else {
@@ -197,7 +197,7 @@ class SearchEmailController extends BaseController
final limit = listResultSearch.isNotEmpty final limit = listResultSearch.isNotEmpty
? UnsignedInt(listResultSearch.length) ? UnsignedInt(listResultSearch.length)
: ThreadConstants.defaultLimit; : ThreadConstants.defaultLimit;
searchEmailFilter.value = searchEmailFilter.value.toSearchEmailFilter(newBefore: null); simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilter(newBefore: null);
consumeState(_refreshChangesSearchEmailInteractor.execute( consumeState(_refreshChangesSearchEmailInteractor.execute(
accountId!, accountId!,
@@ -205,7 +205,7 @@ class SearchEmailController extends BaseController
sort: <Comparator>{} sort: <Comparator>{}
..add(EmailComparator(EmailComparatorProperty.receivedAt) ..add(EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false)), ..setIsAscending(false)),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(), filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
)); ));
} }
@@ -241,7 +241,7 @@ class SearchEmailController extends BaseController
sort: <Comparator>{}..add( sort: <Comparator>{}..add(
EmailComparator(EmailComparatorProperty.receivedAt) EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false)), ..setIsAscending(false)),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(), filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
properties: ThreadConstants.propertiesQuickSearch) properties: ThreadConstants.propertiesQuickSearch)
.then((result) => result.fold( .then((result) => result.fold(
(failure) => <PresentationEmail>[], (failure) => <PresentationEmail>[],
@@ -266,7 +266,7 @@ class SearchEmailController extends BaseController
sort: <Comparator>{} sort: <Comparator>{}
..add(EmailComparator(EmailComparatorProperty.receivedAt) ..add(EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false)), ..setIsAscending(false)),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(), filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
)); ));
} }
@@ -298,7 +298,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;
_updateFilterEmail(before: lastEmail.receivedAt); _updateSimpleSearchFilter(before: lastEmail.receivedAt);
consumeState(_searchMoreEmailInteractor.execute( consumeState(_searchMoreEmailInteractor.execute(
accountId!, accountId!,
@@ -306,7 +306,7 @@ class SearchEmailController extends BaseController
sort: <Comparator>{} sort: <Comparator>{}
..add(EmailComparator(EmailComparatorProperty.receivedAt) ..add(EmailComparator(EmailComparatorProperty.receivedAt)
..setIsAscending(false)), ..setIsAscending(false)),
filter: searchEmailFilter.value.mappingToEmailFilterCondition(), filter: simpleSearchFilter.value.mappingToEmailFilterCondition(),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
lastEmailId: lastEmail.id lastEmailId: lastEmail.id
)); ));
@@ -332,18 +332,18 @@ class SearchEmailController extends BaseController
void showAllResultSearchAction(BuildContext context, String query) { void showAllResultSearchAction(BuildContext context, String query) {
setTextInputSearchForm(query); setTextInputSearchForm(query);
_updateFilterEmail(text: SearchQuery(query)); _updateSimpleSearchFilter(text: SearchQuery(query));
_searchEmailAction(context); _searchEmailAction(context);
} }
void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) { void searchEmailByRecentAction(BuildContext context, RecentSearch recentSearch) {
setTextInputSearchForm(recentSearch.value); setTextInputSearchForm(recentSearch.value);
_updateFilterEmail(text: SearchQuery(recentSearch.value)); _updateSimpleSearchFilter(text: SearchQuery(recentSearch.value));
_searchEmailAction(context); _searchEmailAction(context);
} }
void submitSearchAction(BuildContext context, String query) { void submitSearchAction(BuildContext context, String query) {
_updateFilterEmail(text: SearchQuery(query)); _updateSimpleSearchFilter(text: SearchQuery(query));
_searchEmailAction(context); _searchEmailAction(context);
} }
@@ -355,16 +355,16 @@ class SearchEmailController extends BaseController
bool checkQuickSearchFilterSelected(QuickSearchFilter filter) { bool checkQuickSearchFilterSelected(QuickSearchFilter filter) {
switch (filter) { switch (filter) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
return searchEmailFilter.value.hasAttachment == true; return simpleSearchFilter.value.hasAttachment == true;
case QuickSearchFilter.last7Days: case QuickSearchFilter.last7Days:
if (emailReceiveTimeType.value != null) { if (emailReceiveTimeType.value != null) {
return true; return true;
} }
return searchEmailFilter.value.emailReceiveTimeType == EmailReceiveTimeType.last7Days; return simpleSearchFilter.value.emailReceiveTimeType == EmailReceiveTimeType.last7Days;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
return userProfile != null && return userProfile != null &&
searchEmailFilter.value.from.contains(userProfile!.email) && simpleSearchFilter.value.from.contains(userProfile!.email) &&
searchEmailFilter.value.from.length == 1; simpleSearchFilter.value.from.length == 1;
} }
} }
@@ -373,23 +373,23 @@ class SearchEmailController extends BaseController
switch (filter) { switch (filter) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
_updateFilterEmail(hasAttachment: !filterSelected); _updateSimpleSearchFilter(hasAttachment: !filterSelected);
break; break;
case QuickSearchFilter.last7Days: case QuickSearchFilter.last7Days:
if (filterSelected) { if (filterSelected) {
_setEmailReceiveTimeType(null); _setEmailReceiveTimeType(null);
_updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime); _updateSimpleSearchFilter(emailReceiveTimeType: EmailReceiveTimeType.allTime);
} else { } else {
_setEmailReceiveTimeType(EmailReceiveTimeType.last7Days); _setEmailReceiveTimeType(EmailReceiveTimeType.last7Days);
_updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.last7Days); _updateSimpleSearchFilter(emailReceiveTimeType: EmailReceiveTimeType.last7Days);
} }
break; break;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
if (userProfile != null) { if (userProfile != null) {
filterSelected filterSelected
? searchEmailFilter.value.from.removeWhere((e) => e == userProfile!.email) ? simpleSearchFilter.value.from.removeWhere((e) => e == userProfile!.email)
: searchEmailFilter.value.from.add(userProfile!.email); : simpleSearchFilter.value.from.add(userProfile!.email);
_updateFilterEmail(from: searchEmailFilter.value.from); _updateSimpleSearchFilter(from: simpleSearchFilter.value.from);
} }
break; break;
} }
@@ -403,36 +403,28 @@ class SearchEmailController extends BaseController
popBack(); popBack();
if (emailReceiveTimeType != null) { if (emailReceiveTimeType != null) {
_updateFilterEmail( _updateSimpleSearchFilter(
emailReceiveTimeType: emailReceiveTimeType, emailReceiveTimeType: emailReceiveTimeType,
text: searchQuery == null ? SearchQuery.initial() : searchEmailFilter.value.text); text: searchQuery == null ? SearchQuery.initial() : simpleSearchFilter.value.text);
} else { } else {
_updateFilterEmail( _updateSimpleSearchFilter(
emailReceiveTimeType: EmailReceiveTimeType.allTime, emailReceiveTimeType: EmailReceiveTimeType.allTime,
text: searchQuery == null ? SearchQuery.initial() : searchEmailFilter.value.text); text: searchQuery == null ? SearchQuery.initial() : simpleSearchFilter.value.text);
} }
_setEmailReceiveTimeType(emailReceiveTimeType); _setEmailReceiveTimeType(emailReceiveTimeType);
_searchEmailAction(context); _searchEmailAction(context);
} }
void _updateFilterEmail({ void _updateSimpleSearchFilter({
Set<String>? from, Set<String>? from,
Set<String>? to,
SearchQuery? text, SearchQuery? text,
String? subject,
Set<String>? notKeyword,
PresentationMailbox? mailbox,
EmailReceiveTimeType? emailReceiveTimeType, EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment, bool? hasAttachment,
UTCDate? before, UTCDate? before,
}) { }) {
searchEmailFilter.value = searchEmailFilter.value.copyWith( simpleSearchFilter.value = simpleSearchFilter.value.copyWith(
from: from, from: from,
to: to,
text: text, text: text,
subject: subject,
notKeyword: notKeyword,
mailbox: mailbox,
emailReceiveTimeType: emailReceiveTimeType, emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment, hasAttachment: hasAttachment,
before: before, before: before,
@@ -460,7 +452,7 @@ class SearchEmailController extends BaseController
listRecentSearch.clear(); listRecentSearch.clear();
listSuggestionSearch.clear(); listSuggestionSearch.clear();
listResultSearch.clear(); listResultSearch.clear();
searchEmailFilter.value = SearchEmailFilter(); simpleSearchFilter.value = SimpleSearchFilter();
} }
void closeSearchView(BuildContext context) { void closeSearchView(BuildContext context) {