TF-933 Remove advanced search filter on search query in mobile/tablet
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user