TF-1477 Improve UX for advanced and quick search
This commit is contained in:
+67
-125
@@ -2,14 +2,12 @@ import 'package:collection/collection.dart';
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_date_range_picker/multiple_view_date_range_picker.dart';
|
||||
import 'package:get/get.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/mail/email/email_address.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart';
|
||||
@@ -37,28 +35,24 @@ class AdvancedFilterController extends BaseController {
|
||||
final hasAttachment = false.obs;
|
||||
final lastTextForm = ''.obs;
|
||||
final lastTextTo = ''.obs;
|
||||
final startDate = Rxn<DateTime>();
|
||||
final endDate = Rxn<DateTime>();
|
||||
|
||||
TextEditingController subjectFilterInputController = TextEditingController();
|
||||
TextEditingController hasKeyWordFilterInputController = TextEditingController();
|
||||
TextEditingController notKeyWordFilterInputController = TextEditingController();
|
||||
TextEditingController dateFilterInputController = TextEditingController();
|
||||
TextEditingController mailBoxFilterInputController = TextEditingController();
|
||||
ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact;
|
||||
|
||||
final SearchController searchController = Get.find<SearchController>();
|
||||
final MailboxDashBoardController _mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||
final _appToast = Get.find<AppToast>();
|
||||
final _imagePaths = Get.find<ImagePaths>();
|
||||
|
||||
SearchEmailFilter get searchEmailFilter =>
|
||||
searchController.searchEmailFilter.value;
|
||||
|
||||
final focusManager = InputFieldFocusManager.initial();
|
||||
|
||||
DateTime? _startDate, _endDate;
|
||||
|
||||
DateTime? get startDate => _startDate;
|
||||
|
||||
DateTime? get endDate => _endDate;
|
||||
PresentationMailbox? _destinationMailboxSelected;
|
||||
|
||||
late Worker _dashboardActionWorker;
|
||||
|
||||
@@ -83,17 +77,15 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
void cleanSearchFilter(BuildContext context) {
|
||||
searchController.clearSearchFilter();
|
||||
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
|
||||
clearDateRangeOfFilter();
|
||||
_updateDateRangeTime(EmailReceiveTimeType.allTime);
|
||||
subjectFilterInputController.text = '';
|
||||
hasKeyWordFilterInputController.text = '';
|
||||
notKeyWordFilterInputController.text = '';
|
||||
dateFilterInputController.text = '';
|
||||
hasAttachment.value = false;
|
||||
_destinationMailboxSelected = null;
|
||||
searchController.deactivateAdvancedSearch();
|
||||
searchController.isAdvancedSearchViewOpen.toggle();
|
||||
_mailboxDashBoardController.searchEmail(
|
||||
context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
|
||||
_mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
|
||||
}
|
||||
|
||||
void _updateFilterEmailFromAdvancedSearchView() {
|
||||
@@ -127,11 +119,12 @@ class AdvancedFilterController extends BaseController {
|
||||
}
|
||||
|
||||
searchController.updateFilterEmail(
|
||||
mailbox: _destinationMailboxSelected,
|
||||
subjectOption: optionOf(subjectFilterInputController.text),
|
||||
emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value,
|
||||
hasAttachment: hasAttachment.value,
|
||||
endDate: _endDate.toUTCDate(),
|
||||
startDate: _startDate.toUTCDate()
|
||||
startDateOption: optionOf(startDate.value?.toUTCDate()),
|
||||
endDateOption: optionOf(endDate.value?.toUTCDate())
|
||||
);
|
||||
}
|
||||
|
||||
@@ -150,9 +143,9 @@ class AdvancedFilterController extends BaseController {
|
||||
context: context,
|
||||
arguments: arguments,
|
||||
onSelectedMailbox: (destinationMailbox) {
|
||||
searchController.updateFilterEmail(mailbox: destinationMailbox);
|
||||
mailBoxFilterInputController.text =
|
||||
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
|
||||
_destinationMailboxSelected = destinationMailbox;
|
||||
final mailboxName = destinationMailbox.name?.name;
|
||||
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(mailboxName);
|
||||
});
|
||||
} else {
|
||||
final destinationMailbox = await push(
|
||||
@@ -160,9 +153,9 @@ class AdvancedFilterController extends BaseController {
|
||||
arguments: arguments);
|
||||
|
||||
if (destinationMailbox is PresentationMailbox) {
|
||||
searchController.updateFilterEmail(mailbox: destinationMailbox);
|
||||
mailBoxFilterInputController.text =
|
||||
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
|
||||
_destinationMailboxSelected = destinationMailbox;
|
||||
final mailboxName = destinationMailbox.name?.name;
|
||||
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(mailboxName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -176,8 +169,7 @@ class AdvancedFilterController extends BaseController {
|
||||
searchController.deactivateAdvancedSearch();
|
||||
}
|
||||
if (!isAdvancedSearchHasApplied) {
|
||||
final newSearchEmailFilter = searchController.searchEmailFilter.value.clearBeforeDate();
|
||||
searchController.searchEmailFilter.value = newSearchEmailFilter;
|
||||
searchController.updateFilterEmail(beforeOption: const None());
|
||||
}
|
||||
searchController.isAdvancedSearchViewOpen.toggle();
|
||||
_mailboxDashBoardController.searchEmail(
|
||||
@@ -259,111 +251,55 @@ class AdvancedFilterController extends BaseController {
|
||||
}
|
||||
|
||||
void initSearchFilterField(BuildContext context) {
|
||||
searchController.updateFilterEmail(
|
||||
mailbox: PresentationMailbox.unifiedMailbox);
|
||||
subjectFilterInputController.text =
|
||||
StringConvert.writeNullToEmpty(searchEmailFilter.subject);
|
||||
hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(
|
||||
searchEmailFilter.text?.value);
|
||||
notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(
|
||||
searchEmailFilter.notKeyword.firstOrNull);
|
||||
dateFilterInputController.text = StringConvert.writeNullToEmpty(
|
||||
searchEmailFilter.emailReceiveTimeType.getTitle(
|
||||
context,
|
||||
startDate: _startDate,
|
||||
endDate: _endDate));
|
||||
mailBoxFilterInputController.text =
|
||||
StringConvert.writeNullToEmpty(searchEmailFilter.mailbox?.name?.name);
|
||||
dateFilterSelectedFormAdvancedSearch.value =
|
||||
searchEmailFilter.emailReceiveTimeType;
|
||||
subjectFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.subject);
|
||||
hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.text?.value);
|
||||
notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.notKeyword.firstOrNull);
|
||||
dateFilterSelectedFormAdvancedSearch.value = searchEmailFilter.emailReceiveTimeType;
|
||||
_destinationMailboxSelected = searchEmailFilter.mailbox;
|
||||
if (searchEmailFilter.mailbox == null) {
|
||||
mailBoxFilterInputController.text = AppLocalizations.of(context).allMailboxes;
|
||||
} else {
|
||||
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(searchEmailFilter.mailbox?.name?.name);
|
||||
}
|
||||
hasAttachment.value = searchEmailFilter.hasAttachment;
|
||||
}
|
||||
|
||||
void selectDateRange(BuildContext context) {
|
||||
showGeneralDialog(
|
||||
context: context,
|
||||
barrierDismissible: true,
|
||||
barrierLabel: '',
|
||||
barrierColor: Colors.black54,
|
||||
pageBuilder: (context, animation, secondaryAnimation) {
|
||||
return Dialog(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(18.0)),
|
||||
child: PointerInterceptor(
|
||||
child: MultipleViewDateRangePicker(
|
||||
confirmText: AppLocalizations.of(context).setDate,
|
||||
cancelText: AppLocalizations.of(context).cancel,
|
||||
last7daysTitle: AppLocalizations.of(context).last7Days,
|
||||
last30daysTitle: AppLocalizations.of(context).last30Days,
|
||||
last6monthsTitle: AppLocalizations.of(context).last6Months,
|
||||
lastYearTitle: AppLocalizations.of(context).lastYears,
|
||||
startDate: _startDate,
|
||||
endDate: _endDate,
|
||||
setDateActionCallback: ({startDate, endDate}) {
|
||||
_handleSelectDateRangeResult(context, startDate, endDate);
|
||||
},
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
searchController.showMultipleViewDateRangePicker(
|
||||
context,
|
||||
startDate.value,
|
||||
endDate.value,
|
||||
onCallbackAction: (startDate, endDate) =>
|
||||
_updateDateRangeTime(
|
||||
EmailReceiveTimeType.customRange,
|
||||
newStartDate: startDate,
|
||||
newEndDate: endDate
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
void _handleSelectDateRangeResult(
|
||||
BuildContext context,
|
||||
DateTime? startDate,
|
||||
DateTime? endDate
|
||||
) {
|
||||
log('AdvancedFilterController::_handleSelectDateRangeResult(): startDate: $startDate');
|
||||
log('AdvancedFilterController::_handleSelectDateRangeResult(): endDate: $endDate');
|
||||
if (startDate == null) {
|
||||
_appToast.showToastWithIcon(
|
||||
context,
|
||||
textColor: Colors.black,
|
||||
message: AppLocalizations.of(context).toastMessageErrorWhenSelectStartDateIsEmpty,
|
||||
icon: _imagePaths.icNotConnection);
|
||||
return;
|
||||
}
|
||||
if (endDate == null) {
|
||||
_appToast.showToastWithIcon(
|
||||
context,
|
||||
textColor: Colors.black,
|
||||
message: AppLocalizations.of(context).toastMessageErrorWhenSelectEndDateIsEmpty,
|
||||
icon: _imagePaths.icNotConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
if (endDate.isBefore(startDate)) {
|
||||
_appToast.showToastWithIcon(
|
||||
context,
|
||||
textColor: Colors.black,
|
||||
message: AppLocalizations.of(context).toastMessageErrorWhenSelectDateIsInValid,
|
||||
icon: _imagePaths.icNotConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
_startDate = startDate;
|
||||
_endDate = endDate;
|
||||
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.customRange;
|
||||
dateFilterInputController.text = EmailReceiveTimeType.customRange.getTitle(
|
||||
context,
|
||||
startDate: startDate,
|
||||
endDate: endDate);
|
||||
dateFilterSelectedFormAdvancedSearch.refresh();
|
||||
|
||||
popBack();
|
||||
void _updateDateRangeTime(EmailReceiveTimeType receiveTime, {DateTime? newStartDate, DateTime? newEndDate}) {
|
||||
startDate.value = newStartDate;
|
||||
endDate.value = newEndDate;
|
||||
dateFilterSelectedFormAdvancedSearch.value = receiveTime;
|
||||
}
|
||||
|
||||
void clearDateRangeOfFilter() {
|
||||
_startDate = null;
|
||||
_endDate = null;
|
||||
|
||||
searchController.searchEmailFilter.value =
|
||||
searchController.searchEmailFilter.value.withDateRange(
|
||||
startDate: _startDate.toUTCDate(),
|
||||
endDate: _endDate.toUTCDate());
|
||||
void updateReceiveDateSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) {
|
||||
if (receiveTime == EmailReceiveTimeType.customRange) {
|
||||
searchController.showMultipleViewDateRangePicker(
|
||||
context,
|
||||
startDate.value,
|
||||
endDate.value,
|
||||
onCallbackAction: (startDate, endDate) =>
|
||||
_updateDateRangeTime(
|
||||
EmailReceiveTimeType.customRange,
|
||||
newStartDate: startDate,
|
||||
newEndDate: endDate
|
||||
)
|
||||
);
|
||||
} else {
|
||||
_updateDateRangeTime(receiveTime);
|
||||
}
|
||||
}
|
||||
|
||||
void _resetAllToOriginalValue() {
|
||||
@@ -371,15 +307,14 @@ class AdvancedFilterController extends BaseController {
|
||||
hasAttachment.value = false;
|
||||
lastTextForm.value = '';
|
||||
lastTextTo.value = '';
|
||||
_startDate = null;
|
||||
_endDate = null;
|
||||
startDate.value = null;
|
||||
endDate.value = null;
|
||||
}
|
||||
|
||||
void _clearAllTextFieldInput() {
|
||||
subjectFilterInputController.clear();
|
||||
hasKeyWordFilterInputController.clear();
|
||||
notKeyWordFilterInputController.clear();
|
||||
dateFilterInputController.clear();
|
||||
mailBoxFilterInputController.clear();
|
||||
}
|
||||
|
||||
@@ -389,6 +324,14 @@ class AdvancedFilterController extends BaseController {
|
||||
(action) {
|
||||
if (action is ClearAllFieldOfAdvancedSearchAction) {
|
||||
_handleClearAllFieldOfAdvancedSearch();
|
||||
} else if (action is SelectDateRangeToAdvancedSearch) {
|
||||
_updateDateRangeTime(
|
||||
EmailReceiveTimeType.customRange,
|
||||
newStartDate: action.startDate,
|
||||
newEndDate: action.endDate
|
||||
);
|
||||
} else if (action is ClearDateRangeToAdvancedSearch) {
|
||||
_updateDateRangeTime(action.receiveTime);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -410,7 +353,6 @@ class AdvancedFilterController extends BaseController {
|
||||
hasKeyWordFilterInputController.dispose();
|
||||
notKeyWordFilterInputController.dispose();
|
||||
mailBoxFilterInputController.dispose();
|
||||
dateFilterInputController.dispose();
|
||||
_unregisterWorkerListener();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
+36
-30
@@ -73,6 +73,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacati
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_vacation_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart';
|
||||
@@ -535,9 +536,6 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
if (_searchInsideEmailDetailedViewIsActive(context)) {
|
||||
_closeEmailDetailedView();
|
||||
}
|
||||
if (value.isEmpty){
|
||||
searchController.setEmailReceiveTimeType(null);
|
||||
}
|
||||
_unSelectedMailbox();
|
||||
}
|
||||
|
||||
@@ -1281,23 +1279,13 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
}
|
||||
}
|
||||
|
||||
void selectQuickSearchFilter({
|
||||
required QuickSearchFilter quickSearchFilter,
|
||||
bool fromSuggestionBox = false,
|
||||
}) => searchController.selectQuickSearchFilter(
|
||||
quickSearchFilter: quickSearchFilter,
|
||||
userProfile: userProfile.value!,
|
||||
fromSuggestionBox: fromSuggestionBox,
|
||||
);
|
||||
void selectQuickSearchFilter(QuickSearchFilter filter) {
|
||||
return searchController.selectQuickSearchFilter(filter, userProfile.value!);
|
||||
}
|
||||
|
||||
bool checkQuickSearchFilterSelected({
|
||||
required QuickSearchFilter quickSearchFilter,
|
||||
bool fromSuggestionBox = false,
|
||||
}) => searchController.checkQuickSearchFilterSelected(
|
||||
quickSearchFilter: quickSearchFilter,
|
||||
userProfile: userProfile.value!,
|
||||
fromSuggestionBox: fromSuggestionBox,
|
||||
);
|
||||
void addFilterToSuggestionForm(QuickSearchFilter filter) {
|
||||
searchController.addFilterToSuggestionForm(filter);
|
||||
}
|
||||
|
||||
Future<List<PresentationEmail>> quickSearchEmails() => searchController.quickSearchEmails(accountId: accountId.value!);
|
||||
|
||||
@@ -1353,26 +1341,44 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
|
||||
void selectQuickSearchFilterAction(QuickSearchFilter filter) {
|
||||
log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter');
|
||||
selectQuickSearchFilter(quickSearchFilter: filter);
|
||||
selectQuickSearchFilter(filter);
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
|
||||
void selectReceiveTimeQuickSearchFilter(EmailReceiveTimeType? emailReceiveTimeType) {
|
||||
void selectReceiveTimeQuickSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) {
|
||||
log('MailboxDashBoardController::selectReceiveTimeQuickSearchFilter():receiveTime: $receiveTime');
|
||||
popBack();
|
||||
|
||||
if (emailReceiveTimeType != null) {
|
||||
searchController.updateFilterEmail(emailReceiveTimeType: emailReceiveTimeType);
|
||||
if (receiveTime == EmailReceiveTimeType.customRange) {
|
||||
searchController.showMultipleViewDateRangePicker(
|
||||
context,
|
||||
searchController.startDateFiltered,
|
||||
searchController.endDateFiltered,
|
||||
onCallbackAction: (startDate, endDate) {
|
||||
dispatchAction(SelectDateRangeToAdvancedSearch(startDate, endDate));
|
||||
searchController.updateFilterEmail(
|
||||
emailReceiveTimeType: receiveTime,
|
||||
startDateOption: optionOf(startDate?.toUTCDate()),
|
||||
endDateOption: optionOf(startDate?.toUTCDate()),
|
||||
beforeOption: const None()
|
||||
);
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
);
|
||||
} else {
|
||||
searchController.updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
|
||||
dispatchAction(ClearDateRangeToAdvancedSearch(receiveTime));
|
||||
searchController.updateFilterEmail(
|
||||
emailReceiveTimeType: receiveTime,
|
||||
startDateOption: const None(),
|
||||
endDateOption: const None(),
|
||||
beforeOption: const None()
|
||||
);
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
searchController.setEmailReceiveTimeType(emailReceiveTimeType);
|
||||
searchController.updateFilterEmail();
|
||||
if (searchController.searchQuery == null){
|
||||
searchController.updateFilterEmail(text: SearchQuery.initial());
|
||||
}
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool get isMailboxTrash => selectedMailbox.value?.isTrash == true;
|
||||
|
||||
void emptyTrashAction(BuildContext context) {
|
||||
|
||||
@@ -1,17 +1,26 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.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/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/email_filter_condition_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:model/user/user_profile.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/date_range_picker_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart';
|
||||
@@ -27,7 +36,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
|
||||
|
||||
class SearchController extends BaseController {
|
||||
class SearchController extends BaseController with DateRangePickerMixin {
|
||||
final QuickSearchEmailInteractor _quickSearchEmailInteractor;
|
||||
final SaveRecentSearchInteractor _saveRecentSearchInteractor;
|
||||
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
|
||||
@@ -38,7 +47,7 @@ class SearchController extends BaseController {
|
||||
final searchEmailFilter = SearchEmailFilter.initial().obs;
|
||||
final searchState = SearchState.initial().obs;
|
||||
final isAdvancedSearchViewOpen = false.obs;
|
||||
final emailReceiveTimeType = Rxn<EmailReceiveTimeType>();
|
||||
final listFilterOnSuggestionForm = RxList<QuickSearchFilter>();
|
||||
final simpleSearchIsActivated = RxBool(false);
|
||||
final advancedSearchIsActivated = RxBool(false);
|
||||
final autoFocus = RxBool(true);
|
||||
@@ -67,53 +76,78 @@ class SearchController extends BaseController {
|
||||
searchEmailFilter.value = SearchEmailFilter.initial();
|
||||
}
|
||||
|
||||
void selectQuickSearchFilter({
|
||||
required QuickSearchFilter quickSearchFilter,
|
||||
required UserProfile userProfile,
|
||||
bool fromSuggestionBox = false,
|
||||
}) {
|
||||
final quickSearchFilterSelected = checkQuickSearchFilterSelected(
|
||||
userProfile: userProfile,
|
||||
quickSearchFilter: quickSearchFilter,
|
||||
fromSuggestionBox: fromSuggestionBox,
|
||||
);
|
||||
void selectQuickSearchFilter(QuickSearchFilter quickSearchFilter, UserProfile userProfile) {
|
||||
final isFilterSelected = quickSearchFilter.isSelected(searchEmailFilter.value, userProfile);
|
||||
|
||||
switch (quickSearchFilter) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
updateFilterEmail(hasAttachment: !quickSearchFilterSelected);
|
||||
updateFilterEmail(hasAttachment: !isFilterSelected);
|
||||
return;
|
||||
case QuickSearchFilter.last7Days:
|
||||
if (quickSearchFilterSelected) {
|
||||
setEmailReceiveTimeType(null);
|
||||
updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
|
||||
} else {
|
||||
setEmailReceiveTimeType(EmailReceiveTimeType.last7Days);
|
||||
updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.last7Days);
|
||||
}
|
||||
updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
|
||||
return;
|
||||
case QuickSearchFilter.fromMe:
|
||||
quickSearchFilterSelected
|
||||
? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email)
|
||||
: searchEmailFilter.value.from.add(userProfile.email);
|
||||
isFilterSelected
|
||||
? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email)
|
||||
: searchEmailFilter.value.from.add(userProfile.email);
|
||||
updateFilterEmail(from: searchEmailFilter.value.from);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<PresentationEmail>> quickSearchEmails({required AccountId accountId}) async {
|
||||
return await _quickSearchEmailInteractor
|
||||
.execute(accountId,
|
||||
limit: UnsignedInt(5),
|
||||
sort: <Comparator>{}..add(
|
||||
EmailComparator(EmailComparatorProperty.receivedAt)
|
||||
..setIsAscending(false)),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(),
|
||||
properties: ThreadConstants.propertiesQuickSearch)
|
||||
.then((result) => result.fold(
|
||||
(failure) => <PresentationEmail>[],
|
||||
(success) => success is QuickSearchEmailSuccess
|
||||
? success.emailList
|
||||
: <PresentationEmail>[]));
|
||||
void addFilterToSuggestionForm(QuickSearchFilter filter) {
|
||||
if (listFilterOnSuggestionForm.contains(filter)) {
|
||||
listFilterOnSuggestionForm.remove(filter);
|
||||
} else {
|
||||
listFilterOnSuggestionForm.add(filter);
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<PresentationEmail>> quickSearchEmails({
|
||||
required AccountId accountId,
|
||||
UserProfile? userProfile
|
||||
}) async {
|
||||
return await _quickSearchEmailInteractor.execute(
|
||||
accountId,
|
||||
limit: UnsignedInt(5),
|
||||
sort: <Comparator>{}..add(
|
||||
EmailComparator(EmailComparatorProperty.receivedAt)
|
||||
..setIsAscending(false)),
|
||||
filter: _mappingToFilterOnSuggestionForm(userProfile),
|
||||
properties: ThreadConstants.propertiesQuickSearch
|
||||
).then((result) => result.fold(
|
||||
(failure) => <PresentationEmail>[],
|
||||
(success) => success is QuickSearchEmailSuccess
|
||||
? success.emailList
|
||||
: <PresentationEmail>[]
|
||||
));
|
||||
}
|
||||
|
||||
Filter? _mappingToFilterOnSuggestionForm(UserProfile? userProfile) {
|
||||
final searchText = searchEmailFilter.value.text?.value.trim();
|
||||
|
||||
final filterCondition = EmailFilterCondition(
|
||||
text: searchText?.isNotEmpty == true ? searchText : null,
|
||||
after: listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days)
|
||||
? EmailReceiveTimeType.last7Days.toOldestUTCDate()
|
||||
: null,
|
||||
before: listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days)
|
||||
? EmailReceiveTimeType.last7Days.toLatestUTCDate()
|
||||
: null,
|
||||
hasAttachment: listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment)
|
||||
? true
|
||||
: null
|
||||
);
|
||||
|
||||
final listEmailCondition = {
|
||||
if (filterCondition.hasCondition) filterCondition,
|
||||
if (listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe) && userProfile != null)
|
||||
LogicFilterOperator(Operator.AND, {EmailFilterCondition(from: userProfile.email)})
|
||||
};
|
||||
|
||||
return listEmailCondition.isNotEmpty
|
||||
? LogicFilterOperator(Operator.AND, listEmailCondition)
|
||||
: null;
|
||||
}
|
||||
|
||||
void updateFilterEmail({
|
||||
@@ -125,9 +159,9 @@ class SearchController extends BaseController {
|
||||
PresentationMailbox? mailbox,
|
||||
EmailReceiveTimeType? emailReceiveTimeType,
|
||||
bool? hasAttachment,
|
||||
UTCDate? before,
|
||||
UTCDate? startDate,
|
||||
UTCDate? endDate,
|
||||
Option<UTCDate>? beforeOption,
|
||||
Option<UTCDate>? startDateOption,
|
||||
Option<UTCDate>? endDateOption
|
||||
}) {
|
||||
searchEmailFilter.value = searchEmailFilter.value.copyWith(
|
||||
from: from,
|
||||
@@ -138,9 +172,9 @@ class SearchController extends BaseController {
|
||||
mailbox: mailbox,
|
||||
emailReceiveTimeType: emailReceiveTimeType,
|
||||
hasAttachment: hasAttachment,
|
||||
before: before,
|
||||
startDate: startDate,
|
||||
endDate: endDate,
|
||||
beforeOption: beforeOption,
|
||||
startDateOption: startDateOption,
|
||||
endDateOption: endDateOption,
|
||||
);
|
||||
searchEmailFilter.refresh();
|
||||
}
|
||||
@@ -159,6 +193,12 @@ class SearchController extends BaseController {
|
||||
});
|
||||
}
|
||||
|
||||
EmailReceiveTimeType get receiveTimeFiltered => searchEmailFilter.value.emailReceiveTimeType;
|
||||
|
||||
DateTime? get startDateFiltered => searchEmailFilter.value.startDate?.value.toLocal();
|
||||
|
||||
DateTime? get endDateFiltered => searchEmailFilter.value.endDate?.value.toLocal();
|
||||
|
||||
bool isSearchActive() =>
|
||||
searchState.value.searchStatus == SearchStatus.ACTIVE;
|
||||
|
||||
@@ -188,21 +228,15 @@ class SearchController extends BaseController {
|
||||
searchInputController.text = value;
|
||||
}
|
||||
|
||||
bool checkQuickSearchFilterSelected({
|
||||
required QuickSearchFilter quickSearchFilter,
|
||||
required UserProfile userProfile,
|
||||
bool fromSuggestionBox = false,
|
||||
}) {
|
||||
bool checkQuickSearchFilterSelected(QuickSearchFilter quickSearchFilter, UserProfile userProfile) {
|
||||
switch (quickSearchFilter) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
return searchEmailFilter.value.hasAttachment == true;
|
||||
case QuickSearchFilter.last7Days:
|
||||
if (emailReceiveTimeType.value != null) {
|
||||
return true;
|
||||
}
|
||||
return searchEmailFilter.value.emailReceiveTimeType == EmailReceiveTimeType.last7Days;
|
||||
return true;
|
||||
case QuickSearchFilter.fromMe:
|
||||
return searchEmailFilter.value.from.contains( userProfile.email) && searchEmailFilter.value.from.length == 1;
|
||||
return searchEmailFilter.value.from.contains(userProfile.email) &&
|
||||
searchEmailFilter.value.from.length == 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,11 +254,7 @@ class SearchController extends BaseController {
|
||||
: <RecentSearch>[]));
|
||||
}
|
||||
|
||||
void setEmailReceiveTimeType(EmailReceiveTimeType? receiveTimeType) {
|
||||
emailReceiveTimeType.value = receiveTimeType;
|
||||
}
|
||||
|
||||
showAdvancedFilterView(BuildContext context) async {
|
||||
void showAdvancedFilterView(BuildContext context) async {
|
||||
selectOpenAdvanceSearch();
|
||||
if (_responsiveUtils.isMobile(context)) {
|
||||
await showAdvancedSearchFilterBottomSheet(context);
|
||||
@@ -259,7 +289,6 @@ class SearchController extends BaseController {
|
||||
void _clearAllTextInputSimpleSearch() {
|
||||
searchInputController.clear();
|
||||
searchFocus.unfocus();
|
||||
emailReceiveTimeType.value = null;
|
||||
}
|
||||
|
||||
void disableAllSearchEmail() {
|
||||
|
||||
Reference in New Issue
Block a user