TF-3002 [MOBILE] Combine SimpleSearchFilter & SearchEmailFilter

This commit is contained in:
dab246
2024-09-13 12:12:15 +07:00
committed by Dat H. Pham
parent 1041470f2d
commit fec26a555b
9 changed files with 149 additions and 261 deletions
@@ -91,16 +91,19 @@ class AdvancedFilterController extends BaseController {
void _updateFilterEmailFromAdvancedSearchView() { void _updateFilterEmailFromAdvancedSearchView() {
if (hasKeyWordFilterInputController.text.isNotEmpty) { if (hasKeyWordFilterInputController.text.isNotEmpty) {
searchController.updateFilterEmail(text: SearchQuery(hasKeyWordFilterInputController.text)); searchController.updateFilterEmail(
textOption: Some(SearchQuery(hasKeyWordFilterInputController.text)));
searchController.searchInputController.text = hasKeyWordFilterInputController.text; searchController.searchInputController.text = hasKeyWordFilterInputController.text;
} else { } else {
searchController.updateFilterEmail(text: SearchQuery.initial()); searchController.updateFilterEmail(
textOption: Some(SearchQuery.initial()));
} }
if (notKeyWordFilterInputController.text.isNotEmpty) { if (notKeyWordFilterInputController.text.isNotEmpty) {
searchController.updateFilterEmail(notKeyword: notKeyWordFilterInputController.text.split(',').toSet()); searchController.updateFilterEmail(
notKeywordOption: Some(notKeyWordFilterInputController.text.split(',').toSet()));
} else { } else {
searchController.updateFilterEmail(notKeyword: {}); searchController.updateFilterEmail(notKeywordOption: const None());
} }
if (listFromEmailAddress.isNotEmpty) { if (listFromEmailAddress.isNotEmpty) {
@@ -121,8 +124,8 @@ class AdvancedFilterController extends BaseController {
searchController.updateFilterEmail( searchController.updateFilterEmail(
mailboxOption: optionOf(_destinationMailboxSelected), mailboxOption: optionOf(_destinationMailboxSelected),
subjectOption: optionOf(subjectFilterInputController.text), subjectOption: optionOf(subjectFilterInputController.text),
emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value, emailReceiveTimeTypeOption: optionOf(dateFilterSelectedFormAdvancedSearch.value),
hasAttachment: hasAttachment.value, hasAttachmentOption: optionOf(hasAttachment.value),
startDateOption: optionOf(startDate.value?.toUTCDate()), startDateOption: optionOf(startDate.value?.toUTCDate()),
endDateOption: optionOf(endDate.value?.toUTCDate()) endDateOption: optionOf(endDate.value?.toUTCDate())
); );
@@ -672,7 +672,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
clearFilterMessageOption(); clearFilterMessageOption();
searchController.clearFilterSuggestion(); searchController.clearFilterSuggestion();
if (queryString?.isNotEmpty == true) { if (queryString?.isNotEmpty == true) {
searchController.updateFilterEmail(text: SearchQuery(queryString!)); searchController.updateFilterEmail(textOption: Some(SearchQuery(queryString!)));
} }
searchController.updateFilterEmail(sortOrderOption: searchController.sortOrderFiltered.value.getSortOrder()); searchController.updateFilterEmail(sortOrderOption: searchController.sortOrderFiltered.value.getSortOrder());
dispatchAction(StartSearchEmailAction()); dispatchAction(StartSearchEmailAction());
@@ -1657,7 +1657,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
} }
void selectHasAttachmentSearchFilter() { void selectHasAttachmentSearchFilter() {
searchController.updateFilterEmail(hasAttachment: true); searchController.updateFilterEmail(hasAttachmentOption: const Some(true));
dispatchAction(StartSearchEmailAction()); dispatchAction(StartSearchEmailAction());
} }
@@ -1743,7 +1743,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
onCallbackAction: (startDate, endDate) { onCallbackAction: (startDate, endDate) {
dispatchAction(SelectDateRangeToAdvancedSearch(startDate, endDate)); dispatchAction(SelectDateRangeToAdvancedSearch(startDate, endDate));
searchController.updateFilterEmail( searchController.updateFilterEmail(
emailReceiveTimeType: receiveTime, emailReceiveTimeTypeOption: Some(receiveTime),
startDateOption: optionOf(startDate?.toUTCDate()), startDateOption: optionOf(startDate?.toUTCDate()),
endDateOption: optionOf(endDate?.toUTCDate()), endDateOption: optionOf(endDate?.toUTCDate()),
beforeOption: const None() beforeOption: const None()
@@ -1754,7 +1754,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
} else { } else {
dispatchAction(ClearDateRangeToAdvancedSearch(receiveTime)); dispatchAction(ClearDateRangeToAdvancedSearch(receiveTime));
searchController.updateFilterEmail( searchController.updateFilterEmail(
emailReceiveTimeType: receiveTime, emailReceiveTimeTypeOption: Some(receiveTime),
startDateOption: const None(), startDateOption: const None(),
endDateOption: const None(), endDateOption: const None(),
beforeOption: const None() beforeOption: const None()
@@ -1774,7 +1774,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
void _deleteDateTimeSearchFilter() { void _deleteDateTimeSearchFilter() {
dispatchAction(ClearDateRangeToAdvancedSearch(EmailReceiveTimeType.allTime)); dispatchAction(ClearDateRangeToAdvancedSearch(EmailReceiveTimeType.allTime));
searchController.updateFilterEmail( searchController.updateFilterEmail(
emailReceiveTimeType: EmailReceiveTimeType.allTime, emailReceiveTimeTypeOption: const Some(EmailReceiveTimeType.allTime),
startDateOption: const None(), startDateOption: const None(),
endDateOption: const None(), endDateOption: const None(),
beforeOption: const None() beforeOption: const None()
@@ -1800,7 +1800,7 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
} }
void _deleteHasAttachmentSearchFilter() { void _deleteHasAttachmentSearchFilter() {
searchController.updateFilterEmail(hasAttachment: false); searchController.updateFilterEmail(hasAttachmentOption: const Some(false));
dispatchAction(StartSearchEmailAction()); dispatchAction(StartSearchEmailAction());
} }
@@ -146,8 +146,8 @@ class SearchController extends BaseController with DateRangePickerMixin {
} }
updateFilterEmail( updateFilterEmail(
emailReceiveTimeType: receiveTime, emailReceiveTimeTypeOption: Some(receiveTime),
hasAttachment: hasAttachment, hasAttachmentOption: Some(hasAttachment),
fromOption: Some(listFromAddress) fromOption: Some(listFromAddress)
); );
@@ -161,12 +161,12 @@ class SearchController extends BaseController with DateRangePickerMixin {
void updateFilterEmail({ void updateFilterEmail({
Option<Set<String>>? fromOption, Option<Set<String>>? fromOption,
Option<Set<String>>? toOption, Option<Set<String>>? toOption,
SearchQuery? text, Option<SearchQuery>? textOption,
Option<String>? subjectOption, Option<String>? subjectOption,
Set<String>? notKeyword, Option<Set<String>>? notKeywordOption,
Option<PresentationMailbox>? mailboxOption, Option<PresentationMailbox>? mailboxOption,
EmailReceiveTimeType? emailReceiveTimeType, Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
bool? hasAttachment, Option<bool>? hasAttachmentOption,
Option<UTCDate>? beforeOption, Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption, Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption, Option<UTCDate>? endDateOption,
@@ -176,12 +176,12 @@ class SearchController extends BaseController with DateRangePickerMixin {
searchEmailFilter.value = searchEmailFilter.value.copyWith( searchEmailFilter.value = searchEmailFilter.value.copyWith(
fromOption: fromOption, fromOption: fromOption,
toOption: toOption, toOption: toOption,
text: text, textOption: textOption,
subjectOption: subjectOption, subjectOption: subjectOption,
notKeyword: notKeyword, notKeywordOption: notKeywordOption,
mailboxOption: mailboxOption, mailboxOption: mailboxOption,
emailReceiveTimeType: emailReceiveTimeType, emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
hasAttachment: hasAttachment, hasAttachmentOption: hasAttachmentOption,
beforeOption: beforeOption, beforeOption: beforeOption,
startDateOption: startDateOption, startDateOption: startDateOption,
endDateOption: endDateOption, endDateOption: endDateOption,
@@ -199,6 +199,10 @@ class SearchController extends BaseController with DateRangePickerMixin {
PresentationMailbox? get mailboxFiltered => searchEmailFilter.value.mailbox; PresentationMailbox? get mailboxFiltered => searchEmailFilter.value.mailbox;
Set<String> get listAddressOfToFiltered => searchEmailFilter.value.to;
Set<String> get listAddressOfFromFiltered => searchEmailFilter.value.from;
bool isSearchActive() => bool isSearchActive() =>
searchState.value.searchStatus == SearchStatus.ACTIVE; searchState.value.searchStatus == SearchStatus.ACTIVE;
@@ -218,7 +222,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
} }
void disableSimpleSearch() { void disableSimpleSearch() {
updateFilterEmail(text: SearchQuery.initial()); updateFilterEmail(textOption: Some(SearchQuery.initial()));
_clearAllTextInputSimpleSearch(); _clearAllTextInputSimpleSearch();
deactivateSimpleSearch(); deactivateSimpleSearch();
hideSimpleSearchFormView(); hideSimpleSearchFormView();
@@ -534,13 +534,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() { return Obx(() {
final searchEmailFilter = controller.searchController.searchEmailFilter.value; final searchEmailFilter = controller.searchController.searchEmailFilter.value;
final sortOrderType = controller.searchController.sortOrderFiltered.value; final sortOrderType = controller.searchController.sortOrderFiltered.value;
final listAddressOfFrom = controller.searchController.searchEmailFilter.value.from; final listAddressOfFrom = controller.searchController.listAddressOfFromFiltered;
final userName = controller.sessionCurrent?.username; final userName = controller.sessionCurrent?.username;
final startDate = controller.searchController.startDateFiltered; final startDate = controller.searchController.startDateFiltered;
final endDate = controller.searchController.endDateFiltered; final endDate = controller.searchController.endDateFiltered;
final receiveTimeType = controller.searchController.receiveTimeFiltered; final receiveTimeType = controller.searchController.receiveTimeFiltered;
final mailbox = controller.searchController.mailboxFiltered; final mailbox = controller.searchController.mailboxFiltered;
final listAddressOfTo = controller.searchController.searchEmailFilter.value.to; final listAddressOfTo = controller.searchController.listAddressOfToFiltered;
final isSelected = searchFilter.isSelected( final isSelected = searchFilter.isSelected(
context, context,
@@ -1,18 +1,22 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.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';
import 'package:jmap_dart_client/jmap/core/filter/filter_operator.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/filter/operator/logic_filter_operator.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/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: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';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.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/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.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';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class SearchEmailFilter with EquatableMixin, OptionParamMixin { class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final Set<String> from; final Set<String> from;
@@ -60,13 +64,13 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
SearchEmailFilter copyWith({ SearchEmailFilter copyWith({
Option<Set<String>>? fromOption, Option<Set<String>>? fromOption,
Option<Set<String>>? toOption, Option<Set<String>>? toOption,
SearchQuery? text, Option<SearchQuery>? textOption,
Option<String>? subjectOption, Option<String>? subjectOption,
Set<String>? notKeyword, Option<Set<String>>? notKeywordOption,
Set<String>? hasKeyword, Option<Set<String>>? hasKeywordOption,
Option<PresentationMailbox>? mailboxOption, Option<PresentationMailbox>? mailboxOption,
EmailReceiveTimeType? emailReceiveTimeType, Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
bool? hasAttachment, Option<bool>? hasAttachmentOption,
Option<UTCDate>? beforeOption, Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption, Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption, Option<UTCDate>? endDateOption,
@@ -76,13 +80,13 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
return SearchEmailFilter( return SearchEmailFilter(
from: getOptionParam(fromOption, from), from: getOptionParam(fromOption, from),
to: getOptionParam(toOption, to), to: getOptionParam(toOption, to),
text: text ?? this.text, text: getOptionParam(textOption, text),
subject: getOptionParam(subjectOption, subject), subject: getOptionParam(subjectOption, subject),
notKeyword: notKeyword ?? this.notKeyword, notKeyword: getOptionParam(notKeywordOption, notKeyword),
hasKeyword: hasKeyword ?? this.hasKeyword, hasKeyword: getOptionParam(hasKeywordOption, hasKeyword),
mailbox: getOptionParam(mailboxOption, mailbox), mailbox: getOptionParam(mailboxOption, mailbox),
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType, emailReceiveTimeType: getOptionParam(emailReceiveTimeTypeOption, emailReceiveTimeType),
hasAttachment: hasAttachment ?? this.hasAttachment, hasAttachment: getOptionParam(hasAttachmentOption, hasAttachment),
before: getOptionParam(beforeOption, before), before: getOptionParam(beforeOption, before),
startDate: getOptionParam(startDateOption, startDate), startDate: getOptionParam(startDateOption, startDate),
endDate: getOptionParam(endDateOption, endDate), endDate: getOptionParam(endDateOption, endDate),
@@ -140,6 +144,58 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
: null; : null;
} }
Set<String> getContactApplied(PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return from;
case PrefixEmailAddress.to:
return to;
default:
return {};
}
}
bool get searchFilterByMailboxApplied => mailbox != null;
String getMailboxName(BuildContext context) => mailbox?.getDisplayName(context) ?? '';
bool get searchFilterByFromApplied => from.isNotEmpty;
bool get searchFilterByToApplied => to.isNotEmpty;
bool searchFilterByContactApplied(PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return searchFilterByFromApplied;
case PrefixEmailAddress.to:
return searchFilterByToApplied;
default:
return false;
}
}
String getNameContactApplied(BuildContext context, PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return '${AppLocalizations.of(context).from_email_address_prefix} ${from.first}';
case PrefixEmailAddress.to:
return '${AppLocalizations.of(context).to_email_address_prefix} ${to.first}';
default:
return '';
}
}
String getNameContactDefault(BuildContext context, PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return AppLocalizations.of(context).from_email_address_prefix;
case PrefixEmailAddress.to:
return AppLocalizations.of(context).to_email_address_prefix;
default:
return '';
}
}
@override @override
List<Object?> get props => [ List<Object?> get props => [
from, from,
@@ -1,186 +0,0 @@
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.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_operator.dart';
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.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/email/prefix_email_address.dart';
import 'package:model/extensions/email_filter_condition_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.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_sort_order_type.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class SimpleSearchFilter with EquatableMixin {
final Set<String> from;
final Set<String> to;
final SearchQuery? text;
final PresentationMailbox? mailbox;
final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment;
final UTCDate? before;
final UTCDate? startDate;
final UTCDate? endDate;
final Set<Comparator>? sortOrder;
final int? position;
SimpleSearchFilter({
Set<String>? from,
Set<String>? to,
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
this.text,
this.before,
this.mailbox,
this.startDate,
this.endDate,
this.sortOrder,
this.position,
}) : from = from ?? <String>{},
to = to ?? <String>{},
hasAttachment = hasAttachment ?? false,
emailReceiveTimeType = emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
SimpleSearchFilter copyWith({
Option<Set<String>>? fromOption,
Option<Set<String>>? toOption,
Option<SearchQuery>? textOption,
Option<PresentationMailbox>? mailboxOption,
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
Option<bool>? hasAttachmentOption,
Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption,
Option<Set<Comparator>>? sortOrderOption,
Option<int>? positionOption,
}) {
return SimpleSearchFilter(
from: _getOptionParam(fromOption, from),
to: _getOptionParam(toOption, to),
text: _getOptionParam(textOption, text),
mailbox: _getOptionParam(mailboxOption, mailbox),
emailReceiveTimeType: _getOptionParam(emailReceiveTimeTypeOption, emailReceiveTimeType),
hasAttachment: _getOptionParam(hasAttachmentOption, hasAttachment),
before: _getOptionParam(beforeOption, before),
startDate: _getOptionParam(startDateOption, startDate),
endDate: _getOptionParam(endDateOption, endDate),
sortOrder: _getOptionParam(sortOrderOption, sortOrder),
position: _getOptionParam(positionOption, position),
);
}
T? _getOptionParam<T>(Option<T?>? option, T? defaultValue) {
if (option != null) {
return option.toNullable();
} else {
return defaultValue;
}
}
Filter? mappingToEmailFilterCondition({required EmailSortOrderType sortOrderType}) {
final emailEmailFilterConditionShared = EmailFilterCondition(
text: text?.value.trim().isNotEmpty == true
? text?.value
: null,
inMailbox: mailbox?.id,
after: sortOrderType.isScrollByPosition()
? null
: emailReceiveTimeType.getAfterDate(startDate),
hasAttachment: hasAttachment == false ? null : hasAttachment,
before: sortOrderType.isScrollByPosition()
? null
: emailReceiveTimeType.getBeforeDate(endDate, before)
);
final listEmailCondition = {
if (emailEmailFilterConditionShared.hasCondition)
emailEmailFilterConditionShared,
if (from.isNotEmpty)
LogicFilterOperator(
Operator.AND,
from.map((e) => EmailFilterCondition(from: e)).toSet()),
if (to.isNotEmpty)
LogicFilterOperator(
Operator.AND,
to.map((e) => EmailFilterCondition(to: e)).toSet()),
};
return listEmailCondition.isNotEmpty
? LogicFilterOperator(Operator.AND, listEmailCondition)
: null;
}
@override
List<Object?> get props => [
from,
to,
text,
mailbox,
emailReceiveTimeType,
hasAttachment,
before,
startDate,
endDate,
sortOrder,
position,
];
}
extension SearchEmailFilterExtension on SimpleSearchFilter {
bool get searchFilterByMailboxApplied => mailbox != null;
bool get searchFilterByFromApplied => from.isNotEmpty;
bool get searchFilterByToApplied => to.isNotEmpty;
bool searchFilterByContactApplied(PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return searchFilterByFromApplied;
case PrefixEmailAddress.to:
return searchFilterByToApplied;
default:
return false;
}
}
Set<String> getContactApplied(PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return from;
case PrefixEmailAddress.to:
return to;
default:
return {};
}
}
String getNameContactApplied(BuildContext context, PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return '${AppLocalizations.of(context).from_email_address_prefix} ${from.first}';
case PrefixEmailAddress.to:
return '${AppLocalizations.of(context).to_email_address_prefix} ${to.first}';
default:
return '';
}
}
String getNameContactDefault(BuildContext context, PrefixEmailAddress prefixEmailAddress) {
switch(prefixEmailAddress) {
case PrefixEmailAddress.from:
return AppLocalizations.of(context).from_email_address_prefix;
case PrefixEmailAddress.to:
return AppLocalizations.of(context).to_email_address_prefix;
default:
return '';
}
}
String getMailboxName(BuildContext context) => mailbox?.getDisplayName(context) ?? '';
}
@@ -50,13 +50,13 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dash
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/email_sort_order_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_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/manage_account/presentation/extensions/datetime_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'
if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart';
import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart'; import 'package:tmail_ui_user/features/search/email/domain/state/refresh_changes_search_email_state.dart';
import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart'; import 'package:tmail_ui_user/features/search/email/domain/usecases/refresh_changes_search_email_interactor.dart';
import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart'; import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart';
import 'package:tmail_ui_user/features/search/email/presentation/model/simple_search_filter.dart';
import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart'; import 'package:tmail_ui_user/features/search/email/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';
@@ -99,7 +99,7 @@ class SearchEmailController extends BaseController
final listRecentSearch = RxList<RecentSearch>(); final listRecentSearch = RxList<RecentSearch>();
final listSuggestionSearch = RxList<PresentationEmail>(); final listSuggestionSearch = RxList<PresentationEmail>();
final listContactSuggestionSearch = RxList<EmailAddress>(); final listContactSuggestionSearch = RxList<EmailAddress>();
final simpleSearchFilter = Rx<SimpleSearchFilter>(SimpleSearchFilter()); final searchEmailFilter = SearchEmailFilter.initial().obs;
final searchIsRunning = RxBool(false); final searchIsRunning = RxBool(false);
final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs; final emailReceiveTimeType = EmailReceiveTimeType.allTime.obs;
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE); final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
@@ -118,10 +118,22 @@ class SearchEmailController extends BaseController
Session? get session => mailboxDashBoardController.sessionCurrent; Session? get session => mailboxDashBoardController.sessionCurrent;
SearchQuery? get searchQuery => simpleSearchFilter.value.text; SearchQuery? get searchQuery => searchEmailFilter.value.text;
RxList<PresentationEmail> get listResultSearch => mailboxDashBoardController.listResultSearch; RxList<PresentationEmail> get listResultSearch => mailboxDashBoardController.listResultSearch;
EmailReceiveTimeType get receiveTimeFiltered => searchEmailFilter.value.emailReceiveTimeType;
DateTime? get startDateFiltered => searchEmailFilter.value.startDate?.value.toLocal();
DateTime? get endDateFiltered => searchEmailFilter.value.endDate?.value.toLocal();
PresentationMailbox? get mailboxFiltered => searchEmailFilter.value.mailbox;
Set<String> get listAddressOfToFiltered => searchEmailFilter.value.to;
Set<String> get listAddressOfFromFiltered => searchEmailFilter.value.from;
SearchEmailController( SearchEmailController(
this._quickSearchEmailInteractor, this._quickSearchEmailInteractor,
this._saveRecentSearchInteractor, this._saveRecentSearchInteractor,
@@ -266,9 +278,9 @@ class SearchEmailController extends BaseController
session!, session!,
accountId!, accountId!,
limit: limit, limit: limit,
position: simpleSearchFilter.value.position, position: searchEmailFilter.value.position,
sort: emailSortOrderType.value.getSortOrder().toNullable(), sort: emailSortOrderType.value.getSortOrder().toNullable(),
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value), filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!), properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
)); ));
} }
@@ -311,7 +323,7 @@ class SearchEmailController extends BaseController
accountId, accountId,
limit: UnsignedInt(5), limit: UnsignedInt(5),
sort: emailSortOrderType.value.getSortOrder().toNullable(), sort: emailSortOrderType.value.getSortOrder().toNullable(),
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value), filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: ThreadConstants.propertiesQuickSearch) properties: ThreadConstants.propertiesQuickSearch)
.then((result) => result.fold( .then((result) => result.fold(
(failure) => <PresentationEmail>[], (failure) => <PresentationEmail>[],
@@ -361,9 +373,9 @@ class SearchEmailController extends BaseController
session!, session!,
accountId!, accountId!,
limit: ThreadConstants.defaultLimit, limit: ThreadConstants.defaultLimit,
position: simpleSearchFilter.value.position, position: searchEmailFilter.value.position,
sort: emailSortOrderType.value.getSortOrder().toNullable(), sort: emailSortOrderType.value.getSortOrder().toNullable(),
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value), filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!), properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
)); ));
} }
@@ -416,8 +428,8 @@ class SearchEmailController extends BaseController
accountId!, accountId!,
limit: ThreadConstants.defaultLimit, limit: ThreadConstants.defaultLimit,
sort: emailSortOrderType.value.getSortOrder().toNullable(), sort: emailSortOrderType.value.getSortOrder().toNullable(),
position: simpleSearchFilter.value.position, position: searchEmailFilter.value.position,
filter: simpleSearchFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value), filter: searchEmailFilter.value.mappingToEmailFilterCondition(sortOrderType: emailSortOrderType.value),
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!), properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
lastEmailId: lastEmail.id lastEmailId: lastEmail.id
)); ));
@@ -495,7 +507,7 @@ class SearchEmailController extends BaseController
bool checkQuickSearchFilterSelected(QuickSearchFilter filter) { bool checkQuickSearchFilterSelected(QuickSearchFilter filter) {
switch (filter) { switch (filter) {
case QuickSearchFilter.hasAttachment: case QuickSearchFilter.hasAttachment:
return simpleSearchFilter.value.hasAttachment == true; return searchEmailFilter.value.hasAttachment == true;
case QuickSearchFilter.last7Days: case QuickSearchFilter.last7Days:
return true; return true;
case QuickSearchFilter.sortBy: case QuickSearchFilter.sortBy:
@@ -543,14 +555,14 @@ class SearchEmailController extends BaseController
if (emailReceiveTimeType == EmailReceiveTimeType.customRange) { if (emailReceiveTimeType == EmailReceiveTimeType.customRange) {
showMultipleViewDateRangePicker( showMultipleViewDateRangePicker(
context, context,
simpleSearchFilter.value.startDate?.value.toLocal(), searchEmailFilter.value.startDate?.value.toLocal(),
simpleSearchFilter.value.endDate?.value.toLocal(), searchEmailFilter.value.endDate?.value.toLocal(),
onCallbackAction: (newStartDate, newEndDate) { onCallbackAction: (newStartDate, newEndDate) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
emailReceiveTimeTypeOption: Some(emailReceiveTimeType), emailReceiveTimeTypeOption: Some(emailReceiveTimeType),
textOption: searchQuery == null textOption: searchQuery == null
? Some(SearchQuery.initial()) ? Some(SearchQuery.initial())
: optionOf(simpleSearchFilter.value.text), : optionOf(searchEmailFilter.value.text),
beforeOption: const None(), beforeOption: const None(),
startDateOption: optionOf(newStartDate?.toUTCDate()), startDateOption: optionOf(newStartDate?.toUTCDate()),
endDateOption: optionOf(newEndDate?.toUTCDate()), endDateOption: optionOf(newEndDate?.toUTCDate()),
@@ -566,7 +578,7 @@ class SearchEmailController extends BaseController
emailReceiveTimeTypeOption: Some(emailReceiveTimeType), emailReceiveTimeTypeOption: Some(emailReceiveTimeType),
textOption: searchQuery == null textOption: searchQuery == null
? Some(SearchQuery.initial()) ? Some(SearchQuery.initial())
: optionOf(simpleSearchFilter.value.text), : optionOf(searchEmailFilter.value.text),
beforeOption: const None(), beforeOption: const None(),
startDateOption: const None(), startDateOption: const None(),
endDateOption: const None(), endDateOption: const None(),
@@ -622,7 +634,7 @@ class SearchEmailController extends BaseController
PrefixEmailAddress prefixEmailAddress PrefixEmailAddress prefixEmailAddress
) async { ) async {
if (accountId != null && session != null) { if (accountId != null && session != null) {
final listContactSelected = simpleSearchFilter.value.getContactApplied(prefixEmailAddress); final listContactSelected = searchEmailFilter.value.getContactApplied(prefixEmailAddress);
final arguments = ContactArguments(accountId!, session!, listContactSelected); final arguments = ContactArguments(accountId!, session!, listContactSelected);
final newContact = await push(AppRoutes.contact, arguments: arguments); final newContact = await push(AppRoutes.contact, arguments: arguments);
@@ -647,18 +659,18 @@ class SearchEmailController extends BaseController
switch(prefixEmailAddress) { switch(prefixEmailAddress) {
case PrefixEmailAddress.from: case PrefixEmailAddress.from:
if (listContactSelected.first == newContact.email) { if (listContactSelected.first == newContact.email) {
simpleSearchFilter.value.from.clear(); searchEmailFilter.value.from.clear();
} else { } else {
simpleSearchFilter.value.from.clear(); searchEmailFilter.value.from.clear();
simpleSearchFilter.value.from.add(newContact.email!); searchEmailFilter.value.from.add(newContact.email!);
} }
break; break;
case PrefixEmailAddress.to: case PrefixEmailAddress.to:
if (listContactSelected.first == newContact.email) { if (listContactSelected.first == newContact.email) {
simpleSearchFilter.value.to.clear(); searchEmailFilter.value.to.clear();
} else { } else {
simpleSearchFilter.value.to.clear(); searchEmailFilter.value.to.clear();
simpleSearchFilter.value.to.add(newContact.email!); searchEmailFilter.value.to.add(newContact.email!);
} }
break; break;
default: default:
@@ -667,10 +679,10 @@ class SearchEmailController extends BaseController
} else { } else {
switch(prefixEmailAddress) { switch(prefixEmailAddress) {
case PrefixEmailAddress.from: case PrefixEmailAddress.from:
simpleSearchFilter.value.from.add(newContact.email!); searchEmailFilter.value.from.add(newContact.email!);
break; break;
case PrefixEmailAddress.to: case PrefixEmailAddress.to:
simpleSearchFilter.value.to.add(newContact.email!); searchEmailFilter.value.to.add(newContact.email!);
break; break;
default: default:
break; break;
@@ -680,14 +692,14 @@ class SearchEmailController extends BaseController
switch(prefixEmailAddress) { switch(prefixEmailAddress) {
case PrefixEmailAddress.from: case PrefixEmailAddress.from:
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
fromOption: Some(simpleSearchFilter.value.from), fromOption: Some(searchEmailFilter.value.from),
beforeOption: const None(), beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None() positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
); );
break; break;
case PrefixEmailAddress.to: case PrefixEmailAddress.to:
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
toOption: Some(simpleSearchFilter.value.to), toOption: Some(searchEmailFilter.value.to),
beforeOption: const None(), beforeOption: const None(),
positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None() positionOption: emailSortOrderType.value.isScrollByPosition() ? const Some(0) : const None()
); );
@@ -712,7 +724,7 @@ class SearchEmailController extends BaseController
Option<Set<Comparator>>? sortOrderOption, Option<Set<Comparator>>? sortOrderOption,
Option<int>? positionOption, Option<int>? positionOption,
}) { }) {
simpleSearchFilter.value = simpleSearchFilter.value.copyWith( searchEmailFilter.value = searchEmailFilter.value.copyWith(
fromOption: fromOption, fromOption: fromOption,
toOption: toOption, toOption: toOption,
textOption: textOption, textOption: textOption,
@@ -725,7 +737,7 @@ class SearchEmailController extends BaseController
sortOrderOption: sortOrderOption, sortOrderOption: sortOrderOption,
positionOption: positionOption, positionOption: positionOption,
); );
simpleSearchFilter.refresh(); searchEmailFilter.refresh();
} }
void onTextSearchChange(String text) { void onTextSearchChange(String text) {
@@ -758,7 +770,7 @@ class SearchEmailController extends BaseController
listSuggestionSearch.clear(); listSuggestionSearch.clear();
listContactSuggestionSearch.clear(); listContactSuggestionSearch.clear();
listResultSearch.clear(); listResultSearch.clear();
simpleSearchFilter.value = SimpleSearchFilter(); searchEmailFilter.value = SearchEmailFilter.initial();
} }
void closeSearchView({BuildContext? context}) { void closeSearchView({BuildContext? context}) {
@@ -20,7 +20,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/qu
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/email_quick_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/email_quick_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/recent_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/recent_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart'; import 'package:tmail_ui_user/features/search/email/presentation/model/search_more_state.dart';
import 'package:tmail_ui_user/features/search/email/presentation/model/simple_search_filter.dart';
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
import 'package:tmail_ui_user/features/search/email/presentation/utils/search_email_utils.dart'; import 'package:tmail_ui_user/features/search/email/presentation/utils/search_email_utils.dart';
import 'package:tmail_ui_user/features/search/email/presentation/widgets/app_bar_selection_mode.dart'; import 'package:tmail_ui_user/features/search/email/presentation/widgets/app_bar_selection_mode.dart';
@@ -265,8 +264,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
filter.getTitle( filter.getTitle(
context, context,
receiveTimeType: controller.emailReceiveTimeType.value, receiveTimeType: controller.emailReceiveTimeType.value,
startDate: controller.simpleSearchFilter.value.startDate?.value.toLocal(), startDate: controller.startDateFiltered,
endDate: controller.simpleSearchFilter.value.endDate?.value.toLocal(), endDate: controller.endDateFiltered,
sortOrderType: controller.emailSortOrderType.value sortOrderType: controller.emailSortOrderType.value
), ),
maxLines: 1, maxLines: 1,
@@ -685,13 +684,13 @@ class SearchEmailView extends GetWidget<SearchEmailController>
Widget _buildSearchFilterByMailboxButton(BuildContext context) { Widget _buildSearchFilterByMailboxButton(BuildContext context) {
return Obx(() { return Obx(() {
final filterSelected = controller.simpleSearchFilter.value.searchFilterByMailboxApplied; final filterSelected = controller.searchEmailFilter.value.searchFilterByMailboxApplied;
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: const EdgeInsets.only(right: 8),
child: InkWell( child: InkWell(
onTap: () => controller.selectMailboxForSearchFilter( onTap: () => controller.selectMailboxForSearchFilter(
context, context,
controller.simpleSearchFilter.value.mailbox), controller.mailboxFiltered),
borderRadius: const BorderRadius.all(Radius.circular(10)), borderRadius: const BorderRadius.all(Radius.circular(10)),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -709,7 +708,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
const SizedBox(width: 4), const SizedBox(width: 4),
Text( Text(
filterSelected filterSelected
? controller.simpleSearchFilter.value.getMailboxName(context) ? controller.searchEmailFilter.value.getMailboxName(context)
: AppLocalizations.of(context).folder, : AppLocalizations.of(context).folder,
maxLines: 1, maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
@@ -740,7 +739,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
Widget _buildSearchFilterByContactButton(BuildContext context, PrefixEmailAddress prefixEmailAddress) { Widget _buildSearchFilterByContactButton(BuildContext context, PrefixEmailAddress prefixEmailAddress) {
return Obx(() { return Obx(() {
final filterSelected = controller.simpleSearchFilter.value final filterSelected = controller.searchEmailFilter.value
.searchFilterByContactApplied(prefixEmailAddress); .searchFilterByContactApplied(prefixEmailAddress);
return Padding( return Padding(
padding: const EdgeInsets.only(right: 8), padding: const EdgeInsets.only(right: 8),
@@ -763,8 +762,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
const SizedBox(width: 4), const SizedBox(width: 4),
Text( Text(
filterSelected filterSelected
? controller.simpleSearchFilter.value.getNameContactApplied(context, prefixEmailAddress) ? controller.searchEmailFilter.value.getNameContactApplied(context, prefixEmailAddress)
: controller.simpleSearchFilter.value.getNameContactDefault(context, prefixEmailAddress), : controller.searchEmailFilter.value.getNameContactDefault(context, prefixEmailAddress),
maxLines: 1, maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap, softWrap: CommonTextStyle.defaultSoftWrap,
@@ -1316,7 +1316,7 @@ class ThreadController extends BaseController with EmailActionController {
searchController.enableSearch(); searchController.enableSearch();
if (searchQuery != null) { if (searchQuery != null) {
searchController.updateTextSearch(searchQuery.value); searchController.updateTextSearch(searchQuery.value);
searchController.updateFilterEmail(text: searchQuery); searchController.updateFilterEmail(textOption: Some(searchQuery));
if (currentContext != null) { if (currentContext != null) {
FocusScope.of(currentContext!).unfocus(); FocusScope.of(currentContext!).unfocus();
} }
@@ -1331,7 +1331,7 @@ class ThreadController extends BaseController with EmailActionController {
dispatchState(Right(SearchingState())); dispatchState(Right(SearchingState()));
searchController.enableSearch(); searchController.enableSearch();
searchController.updateTextSearch(searchQuery.value); searchController.updateTextSearch(searchQuery.value);
searchController.updateFilterEmail(text: searchQuery); searchController.updateFilterEmail(textOption: Some(searchQuery));
if (currentContext != null) { if (currentContext != null) {
FocusScope.of(currentContext!).unfocus(); FocusScope.of(currentContext!).unfocus();
} }