From 0fb78cef5ea424700eec48dc1a11914183804a10 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 15 Sep 2022 18:42:16 +0700 Subject: [PATCH] TF-933 Update new position all button `QuickSearchFilter` on Web Desktop --- .../presentation/action/dashboard_action.dart | 8 + .../mailbox_dashboard_controller.dart | 25 ++- .../controller/search_controller.dart | 5 +- .../mailbox_dashboard_view_web.dart | 174 ++++++++++++++++-- .../domain/state/search_email_state.dart | 10 - .../presentation/thread_controller.dart | 13 +- .../thread/presentation/thread_view.dart | 130 ------------- 7 files changed, 204 insertions(+), 161 deletions(-) diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index e1c7bfb82..cb95bd48b 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -76,6 +76,14 @@ class DisableSearchEmailAction extends DashBoardAction { DisableSearchEmailAction(); + @override + List get props => []; +} + +class StartSearchEmailAction extends DashBoardAction { + + StartSearchEmailAction(); + @override List get props => []; } \ No newline at end of file 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 d562e2ca7..eee22958b 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -43,6 +43,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.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/manage_account/domain/state/get_all_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; @@ -54,7 +55,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -366,7 +366,7 @@ class MailboxDashBoardController extends ReloadableController { void searchEmail(BuildContext context, String value) { searchController.updateFilterEmail(text: SearchQuery(value)); - dispatchState(Right(SearchEmailNewQuery(searchController.searchEmailFilter.value.text ?? SearchQuery.initial()))); + dispatchAction(StartSearchEmailAction()); FocusScope.of(context).unfocus(); if (_searchInsideEmailDetailedViewIsActive(context)) { _closeEmailDetailedView(); @@ -659,6 +659,27 @@ class MailboxDashBoardController extends ReloadableController { } } + void selectQuickSearchFilterAction(QuickSearchFilter filter) { + selectQuickSearchFilter(quickSearchFilter: filter); + dispatchAction(StartSearchEmailAction()); + } + + void selectReceiveTimeQuickSearchFilter(EmailReceiveTimeType? emailReceiveTimeType) { + popBack(); + + if (emailReceiveTimeType != null) { + searchController.updateFilterEmail(emailReceiveTimeType: emailReceiveTimeType); + } else { + searchController.updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime); + } + searchController.setEmailReceiveTimeType(emailReceiveTimeType); + searchController.updateFilterEmail(); + if (searchController.searchQuery == null){ + searchController.updateFilterEmail(text: SearchQuery.initial()); + } + dispatchAction(StartSearchEmailAction()); + } + @override void onClose() { _emailReceiveManager.closeEmailReceiveManagerStream(); diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 7fdae28ab..78cc24e26 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -42,8 +42,11 @@ class SearchController extends BaseController { final mailboxFilterSelectedFormAdvancedSearch = Rxn(); final hasAttachment = false.obs; final emailReceiveTimeType = Rxn(); + final searchIsActive = RxBool(false); - get searchEmailFilterValue => searchEmailFilter.value; + SearchEmailFilter get searchEmailFilterValue => searchEmailFilter.value; + + SearchQuery? get searchQuery => searchEmailFilter.value.text; FocusNode searchFocus = FocusNode(); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index adb21f88c..1e27e463e 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/das import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.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/widgets/advanced_search/advanced_search_filter_overlay.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart'; @@ -95,17 +96,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { children: [ SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu), Expanded(child: Column(children: [ - Obx(() { - if (controller.vacationResponse.value?.vacationResponderIsValid == true) { - return VacationNotificationMessageWidget( - margin: const EdgeInsets.only(top: 16, right: 16), - vacationResponse: controller.vacationResponse.value!, - actionGotoVacationSetting: () => controller.goToVacationSetting(), - actionEndNow: () => controller.disableVacationResponder()); - } else { - return const SizedBox.shrink(); - } - }), + _buildVacationNotificationMessage(context), + _buildListButtonQuickSearchFilter(context), _buildMarkAsMailboxReadLoading(context), Expanded(child: Obx(() { switch(controller.routePath.value) { @@ -681,4 +673,164 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { } }); } + + Widget _buildVacationNotificationMessage(BuildContext context) { + return Obx(() { + if (controller.vacationResponse.value?.vacationResponderIsValid == true) { + return VacationNotificationMessageWidget( + margin: const EdgeInsets.only(top: 16, right: 16), + vacationResponse: controller.vacationResponse.value!, + actionGotoVacationSetting: () => controller.goToVacationSetting(), + actionEndNow: () => controller.disableVacationResponder()); + } else { + return const SizedBox.shrink(); + } + }); + } + + bool supportListButtonQuickSearchFilter(BuildContext context) { + return controller.searchController.isSearchActive() + && controller.searchController.searchIsActive.isTrue + && responsiveUtils.isWebDesktop(context); + } + + Widget _buildListButtonQuickSearchFilter(BuildContext context) { + return Obx(() { + if (supportListButtonQuickSearchFilter(context)) { + return Padding( + padding: const EdgeInsets.only(right: 16, top: 16), + child: Row( + children: QuickSearchFilter.values + .map((filter) => _buildQuickSearchFilterButton(context, filter)) + .toList()), + ); + } else { + return const SizedBox.shrink(); + } + }); + } + + Widget _buildQuickSearchFilterButton( + BuildContext context, + QuickSearchFilter filter + ) { + return Obx(() { + final quickSearchFilterSelected = controller.checkQuickSearchFilterSelected( + quickSearchFilter: filter, + ); + + return Padding( + padding: const EdgeInsets.only(right: 8), + child: InkWell( + onTap: () { + if (filter != QuickSearchFilter.last7Days) { + controller.selectQuickSearchFilterAction(filter); + } + }, + onTapDown: (detail) { + if (filter == QuickSearchFilter.last7Days) { + final screenSize = MediaQuery.of(context).size; + final offset = detail.globalPosition; + final position = RelativeRect.fromLTRB( + offset.dx, + offset.dy, + screenSize.width - offset.dx, + screenSize.height - offset.dy, + ); + controller.openPopupMenuAction(context, position, + popupMenuEmailReceiveTimeType(context, + controller.searchController.emailReceiveTimeType.value, + (receiveTime) => controller.selectReceiveTimeQuickSearchFilter(receiveTime))); + } + }, + borderRadius: const BorderRadius.all(Radius.circular(10)), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected)), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + SvgPicture.asset( + filter.getIcon( + imagePaths, + quickSearchFilterSelected: quickSearchFilterSelected), + width: 16, + height: 16, + fit: BoxFit.fill), + const SizedBox(width: 4), + Text( + filter.getTitle( + context, + receiveTimeType: controller.searchController.emailReceiveTimeType.value), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: filter.getTextStyle( + quickSearchFilterSelected: quickSearchFilterSelected), + ), + if (filter == QuickSearchFilter.last7Days) + ... [ + const SizedBox(width: 4), + SvgPicture.asset( + imagePaths.icChevronDown, + width: 16, + height: 16, + fit: BoxFit.fill), + ] + ])), + ), + ); + }); + } + + List popupMenuEmailReceiveTimeType( + BuildContext context, + EmailReceiveTimeType? receiveTimeSelected, + Function(EmailReceiveTimeType?)? onCallBack + ) { + return EmailReceiveTimeType.values + .map((timeType) => PopupMenuItem( + padding: EdgeInsets.zero, + child: _receiveTimeTileAction( + context, + receiveTimeSelected, + timeType, + onCallBack))) + .toList(); + } + + Widget _receiveTimeTileAction( + BuildContext context, + EmailReceiveTimeType? receiveTimeSelected, + EmailReceiveTimeType receiveTimeType, + Function(EmailReceiveTimeType?)? onCallBack + ) { + return InkWell( + onTap: () => onCallBack?.call(receiveTimeType == receiveTimeSelected + ? null + : receiveTimeType), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + child: SizedBox( + width: 320, + child: Row(children: [ + Expanded(child: Text( + receiveTimeType.getTitle(context), + style: const TextStyle( + fontSize: 17, + color: Colors.black, + fontWeight: FontWeight.normal))), + if (receiveTimeType == receiveTimeSelected) + ...[ + const SizedBox(width: 12), + SvgPicture.asset( + imagePaths.icFilterSelected, + width: 24, + height: 24, + fit: BoxFit.fill), + ] + ]) + ), + ) + ); + } } \ No newline at end of file diff --git a/lib/features/thread/domain/state/search_email_state.dart b/lib/features/thread/domain/state/search_email_state.dart index 0c5810a89..3baf53c8c 100644 --- a/lib/features/thread/domain/state/search_email_state.dart +++ b/lib/features/thread/domain/state/search_email_state.dart @@ -1,7 +1,6 @@ import 'package:core/core.dart'; import 'package:model/email/presentation_email.dart'; -import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; class SearchingState extends UIState { @@ -11,15 +10,6 @@ class SearchingState extends UIState { List get props => []; } -class SearchEmailNewQuery extends UIState { - final SearchQuery searchQuery; - - SearchEmailNewQuery(this.searchQuery); - - @override - List get props => [searchQuery]; -} - class SearchEmailSuccess extends UIState { final List emailList; diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index b245fa4b7..ce3264284 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -94,7 +94,6 @@ class ThreadController extends BaseController { final MoveToMailboxInteractor _moveToMailboxInteractor; final emailList = [].obs; - final searchIsActive = RxBool(false); bool canLoadMore = true; bool canSearchMore = true; @@ -279,6 +278,9 @@ class ThreadController extends BaseController { } else if (action is DisableSearchEmailAction) { closeSearchEmailAction(); mailboxDashBoardController.clearDashBoardAction(); + } else if (action is StartSearchEmailAction) { + _searchEmail(); + mailboxDashBoardController.clearDashBoardAction(); } } }); @@ -286,10 +288,7 @@ class ThreadController extends BaseController { viewStateWorker = ever(mailboxDashBoardController.viewState, (viewState) { if (viewState is Either) { viewState.map((success) { - if (success is SearchEmailNewQuery){ - mailboxDashBoardController.clearState(); - _searchEmail(); - } else if (success is MarkAsEmailReadSuccess) { + if (success is MarkAsEmailReadSuccess) { _refreshEmailChanges(currentEmailState: success.currentEmailState); } else if (success is MoveToMailboxSuccess) { _refreshEmailChanges(currentEmailState: success.currentEmailState); @@ -842,7 +841,7 @@ class ThreadController extends BaseController { } void disableSearch() { - searchIsActive.value = false; + searchController.searchIsActive.value = false; searchController.disableSearch(); } @@ -858,7 +857,7 @@ class ThreadController extends BaseController { void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) { if (_accountId != null && searchQuery != null) { - searchIsActive.value = true; + searchController.searchIsActive.value = true; if(searchController.isAdvancedSearchHasApply.isFalse){ searchController.updateFilterEmail(mailbox: currentMailbox); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index e78dfd716..250869437 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -10,7 +10,6 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_c import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.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/widgets/advanced_search/advanced_search_filter_overlay.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart'; @@ -66,7 +65,6 @@ class ThreadView extends GetWidget with AppLoaderMixin, _buildVacationNotificationMessage(context), ], _buildEmptyTrashButton(context), - _buildListButtonQuickSearchFilter(context), if (!_responsiveUtils.isDesktop(context)) _buildMarkAsMailboxReadLoading(context), _buildLoadingView(), @@ -701,134 +699,6 @@ class ThreadView extends GetWidget with AppLoaderMixin, ]; } - bool supportListButtonQuickSearchFilter(BuildContext context) { - return controller.isSearchActive() - && controller.searchIsActive.isTrue - && _responsiveUtils.isWebDesktop(context); - } - - Widget _buildListButtonQuickSearchFilter(BuildContext context) { - return Obx(() { - if (supportListButtonQuickSearchFilter(context)) { - return Padding( - padding: EdgeInsets.only( - left: _responsiveUtils.isWebDesktop(context) ? 32 : 16, - right: _responsiveUtils.isWebDesktop(context) ? 20 : 16, - bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16, - top: _responsiveUtils.isWebDesktop(context) ? 16 : 0), - child: Row( - children: QuickSearchFilter.values - .map((filter) => _buildQuickSearchFilterButton(context, filter)) - .toList()), - ); - } else { - return const SizedBox.shrink(); - } - }); - } - - Widget _buildQuickSearchFilterButton( - BuildContext context, QuickSearchFilter filter) { - return Obx(() { - final quickSearchFilterSelected = controller.mailboxDashBoardController.checkQuickSearchFilterSelected( - quickSearchFilter: filter, - ); - - return Padding( - padding: const EdgeInsets.only(right: 8), - child: InkWell( - onTap: () { - if (filter != QuickSearchFilter.last7Days) { - controller.selectQuickSearchFilter(filter); - } - }, - onTapDown: (detail) { - if (filter == QuickSearchFilter.last7Days) { - final screenSize = MediaQuery.of(context).size; - final offset = detail.globalPosition; - final position = RelativeRect.fromLTRB( - offset.dx, - offset.dy, - screenSize.width - offset.dx, - screenSize.height - offset.dy, - ); - controller.openPopupReceiveTimeQuickSearchFilter(context, position, - popupMenuEmailReceiveTimeType(context, - controller.searchController.emailReceiveTimeType.value, - (receiveTime) => controller.selectReceiveTimeQuickSearchFilter(receiveTime))); - } - }, - borderRadius: const BorderRadius.all(Radius.circular(10)), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected)), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset( - filter.getIcon(_imagePaths, quickSearchFilterSelected: quickSearchFilterSelected), - width: 16, - height: 16, - fit: BoxFit.fill), - const SizedBox(width: 4), - Text( - filter.getTitle(context, receiveTimeType: controller.searchController.emailReceiveTimeType.value), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: filter.getTextStyle(quickSearchFilterSelected: quickSearchFilterSelected), - ), - if (filter == QuickSearchFilter.last7Days) - ... [ - const SizedBox(width: 4), - SvgPicture.asset( - _imagePaths.icChevronDown, - width: 16, - height: 16, - fit: BoxFit.fill), - ] - ])), - ), - ); - }); - } - - List popupMenuEmailReceiveTimeType(BuildContext context, - EmailReceiveTimeType? receiveTimeSelected, Function(EmailReceiveTimeType?)? onCallBack) { - return EmailReceiveTimeType.values - .map((timeType) => PopupMenuItem( - padding: EdgeInsets.zero, - child: _receiveTimeTileAction(context, receiveTimeSelected, timeType, onCallBack))) - .toList(); - } - - Widget _receiveTimeTileAction( - BuildContext context, - EmailReceiveTimeType? receiveTimeSelected, - EmailReceiveTimeType receiveTimeType, - Function(EmailReceiveTimeType?)? onCallBack - ) { - return InkWell( - onTap: () => onCallBack?.call(receiveTimeType == receiveTimeSelected - ? null - : receiveTimeType), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), - child: SizedBox( - width: 320, - child: Row(children: [ - Expanded(child: Text( - receiveTimeType.getTitle(context), - style: const TextStyle(fontSize: 17, color: Colors.black, fontWeight: FontWeight.normal))), - if (receiveTimeType == receiveTimeSelected) - const SizedBox(width: 12), - if (receiveTimeType == receiveTimeSelected) - SvgPicture.asset(_imagePaths.icFilterSelected, width: 24, height: 24, fit: BoxFit.fill), - ]) - ), - ) - ); - } - Widget _buildQuickSearchFilterButtonSuggestionBox( BuildContext context, QuickSearchFilter filter) { return Obx(() {