From 34caadc2b7fddeac86b99df8028d826a41a80060 Mon Sep 17 00:00:00 2001 From: hieubt Date: Sat, 11 Nov 2023 00:43:14 +0700 Subject: [PATCH] TF-1709 Implement sortOrder (cherry picked from commit b3e5844bf37c692f763ccbf66bcbfb63c75d2d9f) --- .../advanced_filter_controller.dart | 10 ++++ .../mailbox_dashboard_controller.dart | 9 ++++ .../controller/search_controller.dart | 8 ++- .../model/search/email_sort_order_type.dart | 53 ++++++++++++------- .../model/search/search_email_filter.dart | 9 ++-- .../styles/sort_by_drop_down_style.dart | 2 +- .../sort_by_drop_down_button.dart | 4 +- .../widgets/search_input_form_widget.dart | 2 +- .../presentation/thread_controller.dart | 10 ++-- 9 files changed, 73 insertions(+), 34 deletions(-) diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 563a7b1c6..dd513e674 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.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/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'; @@ -127,6 +128,8 @@ class AdvancedFilterController extends BaseController { searchController.updateFilterEmail(toOption: const None()); } + searchController.updateFilterEmail(sortOrderOption: searchController.sortOrderFiltered.value.getSortOrder()); + searchController.updateFilterEmail( mailbox: _destinationMailboxSelected, subjectOption: optionOf(subjectFilterInputController.text), @@ -410,12 +413,19 @@ class AdvancedFilterController extends BaseController { } } + void updateSortOrder(EmailSortOrderType? sortOrder) { + if (sortOrder != null) { + searchController.sortOrderFiltered.value = sortOrder; + } + } + void _resetAllToOriginalValue() { _updateDateRangeTime(EmailReceiveTimeType.allTime); hasAttachment.value = false; listFromEmailAddress.clear(); listToEmailAddress.clear(); _destinationMailboxSelected = null; + searchController.sortOrderFiltered.value = EmailSortOrderType.mostRecent; } void _clearAllTextFieldInput() { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 1f12c15cf..e39becf23 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -84,6 +84,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/down import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/refresh_action_view_event.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/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; @@ -1533,6 +1534,14 @@ class MailboxDashBoardController extends ReloadableController { } } + void selectSortOrderQuickSearchFilter(BuildContext context, EmailSortOrderType sortOrder) { + log('MailboxDashBoardController::selectSortOrderQuickSearchFilter():sortOrder: $sortOrder'); + popBack(); + searchController.sortOrderFiltered.value = sortOrder; + searchController.updateFilterEmail(sortOrderOption: sortOrder.getSortOrder()); + dispatchAction(StartSearchEmailAction()); + } + bool isEmptyTrashBannerEnabledOnWeb(BuildContext context) { return selectedMailbox.value != null && selectedMailbox.value!.isTrash && diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 7eb06f468..65cb73322 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -26,6 +26,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_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_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/search_email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; @@ -45,6 +46,7 @@ class SearchController extends BaseController with DateRangePickerMixin { final listFilterOnSuggestionForm = RxList(); final simpleSearchIsActivated = RxBool(false); final advancedSearchIsActivated = RxBool(false); + final sortOrderFiltered = EmailSortOrderType.mostRecent.obs; SearchQuery? get searchQuery => searchEmailFilter.value.text; @@ -82,6 +84,8 @@ class SearchController extends BaseController with DateRangePickerMixin { final newListEmailAddress = isFilterSelected ? {} : {userProfile.email}; updateFilterEmail(fromOption: Some(newListEmailAddress)); return; + case QuickSearchFilter.sortBy: + return; } } @@ -179,7 +183,8 @@ class SearchController extends BaseController with DateRangePickerMixin { bool? hasAttachment, Option? beforeOption, Option? startDateOption, - Option? endDateOption + Option? endDateOption, + Option>? sortOrderOption, }) { searchEmailFilter.value = searchEmailFilter.value.copyWith( fromOption: fromOption, @@ -193,6 +198,7 @@ class SearchController extends BaseController with DateRangePickerMixin { beforeOption: beforeOption, startDateOption: startDateOption, endDateOption: endDateOption, + sortOrderOption: sortOrderOption, ); searchEmailFilter.refresh(); } diff --git a/lib/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart b/lib/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart index 6595603ba..742b8faac 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart @@ -1,3 +1,4 @@ +import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart'; @@ -32,34 +33,46 @@ enum EmailSortOrderType { } } - Set getSortOrder() { + Option> getSortOrder() { switch (this) { case EmailSortOrderType.mostRecent: - return {} - ..add(EmailComparator(EmailComparatorProperty.receivedAt) - ..setIsAscending(false)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.receivedAt) + ..setIsAscending(false)) + ); case EmailSortOrderType.oldest: - return {} - ..add(EmailComparator(EmailComparatorProperty.receivedAt) - ..setIsAscending(true)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.receivedAt) + ..setIsAscending(true)) + ); case EmailSortOrderType.relevance: - return {}; + return const None(); case EmailSortOrderType.senderAscending: - return {} - ..add(EmailComparator(EmailComparatorProperty.from) - ..setIsAscending(true)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.from) + ..setIsAscending(true)) + ); case EmailSortOrderType.senderDescending: - return {} - ..add(EmailComparator(EmailComparatorProperty.from) - ..setIsAscending(false)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.from) + ..setIsAscending(false)) + ); case EmailSortOrderType.subjectAscending: - return {} - ..add(EmailComparator(EmailComparatorProperty.subject) - ..setIsAscending(true)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.subject) + ..setIsAscending(true)) + ); case EmailSortOrderType.subjectDescending: - return {} - ..add(EmailComparator(EmailComparatorProperty.subject) - ..setIsAscending(false)); + return Some( + {} + ..add(EmailComparator(EmailComparatorProperty.subject) + ..setIsAscending(false)) + ); } } diff --git a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart index 79c69979d..f7f6f5724 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart @@ -40,14 +40,13 @@ class SearchEmailFilter with EquatableMixin { this.before, this.startDate, this.endDate, - Set? sortOrder, + this.sortOrder, }) : from = from ?? {}, to = to ?? {}, notKeyword = notKeyword ?? {}, hasAttachment = hasAttachment ?? false, emailReceiveTimeType = - emailReceiveTimeType ?? EmailReceiveTimeType.allTime, - sortOrder = sortOrder ?? {}; + emailReceiveTimeType ?? EmailReceiveTimeType.allTime; SearchEmailFilter copyWith({ Option>? fromOption, @@ -61,7 +60,7 @@ class SearchEmailFilter with EquatableMixin { Option? beforeOption, Option? startDateOption, Option? endDateOption, - Set? sortOrder, + Option>? sortOrderOption, }) { return SearchEmailFilter( from: _getOptionParam(fromOption, from), @@ -75,7 +74,7 @@ class SearchEmailFilter with EquatableMixin { before: _getOptionParam(beforeOption, before), startDate: _getOptionParam(startDateOption, startDate), endDate: _getOptionParam(endDateOption, endDate), - sortOrder: sortOrder ?? this.sortOrder, + sortOrder: _getOptionParam(sortOrderOption, sortOrder), ); } diff --git a/lib/features/mailbox_dashboard/presentation/styles/sort_by_drop_down_style.dart b/lib/features/mailbox_dashboard/presentation/styles/sort_by_drop_down_style.dart index 709dd6091..30115b1bf 100644 --- a/lib/features/mailbox_dashboard/presentation/styles/sort_by_drop_down_style.dart +++ b/lib/features/mailbox_dashboard/presentation/styles/sort_by_drop_down_style.dart @@ -17,7 +17,7 @@ class SortByDropdownStyle { color: Colors.white ); - static const EdgeInsetsGeometry buttonPadding = EdgeInsets.only(left: 12, right: 10); + static const EdgeInsetsDirectional buttonPadding = EdgeInsetsDirectional.only(start: 12, end: 10); static const MenuItemStyleData menuItemStyleData = MenuItemStyleData( height: height, padding: EdgeInsets.symmetric(horizontal: 12), diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart index c3adf22e1..20f094e05 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart @@ -8,11 +8,13 @@ import 'package:pointer_interceptor/pointer_interceptor.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/styles/sort_by_drop_down_style.dart'; +typedef OnSortOrderSelected = void Function(EmailSortOrderType?); + class SortByDropDownButton extends StatelessWidget { final ImagePaths imagePaths; final EmailSortOrderType? sortOrderSelected; - final Function(EmailSortOrderType?)? onSortOrderSelected; + final OnSortOrderSelected? onSortOrderSelected; const SortByDropDownButton({ Key? key, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart index 0553872d7..8bad44a9b 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart @@ -68,7 +68,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { debounceDuration: const Duration(milliseconds: 300), listActionButton: QuickSearchFilter.values, actionButtonBuilder: (context, filterAction) { - if (filterAction is QuickSearchFilter) { + if (filterAction is QuickSearchFilter && filterAction != QuickSearchFilter.sortBy) { return buildListButtonForQuickSearchForm(context, filterAction); } else { return const SizedBox.shrink(); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 097153402..0477a5cda 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -429,7 +429,7 @@ class ThreadController extends BaseController with EmailActionController { _session!, _accountId!, limit: ThreadConstants.defaultLimit, - sort: _sortOrder, + sort: _searchEmailFilter.sortOrder ?? _sortOrder, emailFilter: EmailFilter( filter: _getFilterCondition(mailboxIdSelected: _currentMailboxId), filterOption: mailboxDashBoardController.filterMessageOption.value, @@ -502,7 +502,7 @@ class ThreadController extends BaseController with EmailActionController { _session!, _accountId!, newEmailState, - sort: _sortOrder, + sort: _searchEmailFilter.sortOrder ?? _sortOrder, propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, emailFilter: EmailFilter( @@ -526,7 +526,7 @@ class ThreadController extends BaseController with EmailActionController { _session!, _accountId!, limit: ThreadConstants.defaultLimit, - sort: _sortOrder, + sort: _searchEmailFilter.sortOrder ?? _sortOrder, filterOption: mailboxDashBoardController.filterMessageOption.value, filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: _currentMailboxId), properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), @@ -720,7 +720,7 @@ class ThreadController extends BaseController with EmailActionController { _session!, _accountId!, limit: limit ?? ThreadConstants.defaultLimit, - sort: _sortOrder, + sort: _searchEmailFilter.sortOrder, filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()), properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), )); @@ -768,7 +768,7 @@ class ThreadController extends BaseController with EmailActionController { _session!, _accountId!, limit: ThreadConstants.defaultLimit, - sort: _sortOrder, + sort: _searchEmailFilter.sortOrder ?? _sortOrder, filter: searchController.searchEmailFilter.value.mappingToEmailFilterCondition(moreFilterCondition: _getFilterCondition()), properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), lastEmailId: oldestEmail?.id