From f13bc5de61515a48711d1664bcb40af8f79522ae Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 8 Nov 2023 16:51:37 +0700 Subject: [PATCH] TF-1155 Update value From field when click quick search action Signed-off-by: dab246 (cherry picked from commit eeb16993c41325bc1a617b533c4eaf94f5f32103) --- .../recipient_suggestion_item_widget.dart | 4 +- .../email/presentation/email_view.dart | 9 ++- .../presentation/action/dashboard_action.dart | 18 ++++-- .../advanced_filter_controller.dart | 18 ++++-- .../mailbox_dashboard_controller.dart | 2 +- .../controller/search_controller.dart | 26 +++----- .../mailbox_dashboard_view_web.dart | 6 +- ...tocomplete_suggestion_item_widget_web.dart | 4 +- .../autocomplete_tag_item_widget_web.dart | 62 ++++++++++--------- .../icon_open_advanced_search_widget.dart | 8 +-- .../widgets/search_input_form_widget.dart | 4 +- 11 files changed, 79 insertions(+), 82 deletions(-) diff --git a/lib/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart b/lib/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart index db96fa245..a2d6bd4ab 100644 --- a/lib/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart +++ b/lib/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart @@ -50,7 +50,7 @@ class RecipientSuggestionItemWidget extends StatelessWidget { textOrigin: emailAddress.asString(), wordSearched: suggestionValid ?? '' ), - subtitle: emailAddress.emailAddress.isNotEmpty + subtitle: emailAddress.displayName.isNotEmpty ? RichTextWidget( textOrigin: emailAddress.emailAddress, wordSearched: suggestionValid ?? '', @@ -79,7 +79,7 @@ class RecipientSuggestionItemWidget extends StatelessWidget { textOrigin: emailAddress.asString(), wordSearched: suggestionValid ?? '' ), - subtitle: emailAddress.emailAddress.isNotEmpty + subtitle: emailAddress.displayName.isNotEmpty ? RichTextWidget( textOrigin: emailAddress.emailAddress, wordSearched: suggestionValid ?? '', diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index e06c46c45..6d5169970 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -268,13 +268,12 @@ class EmailView extends GetWidget { ); } - EdgeInsets _getMarginEmailView(BuildContext context) { + EdgeInsetsGeometry _getMarginEmailView(BuildContext context) { if (PlatformInfo.isWeb) { if (responsiveUtils.isDesktop(context)) { - return EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 16 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 16, - top: 16, + return const EdgeInsetsDirectional.only( + end: 16, + top: 8, bottom: 16 ); } else { diff --git a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart index b65c8f55a..1a0aa73dd 100644 --- a/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart +++ b/lib/features/mailbox_dashboard/presentation/action/dashboard_action.dart @@ -4,6 +4,7 @@ import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.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/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; @@ -30,7 +31,7 @@ class FilterMessageAction extends DashBoardAction { FilterMessageAction(this.context, this.option); @override - List get props => [option]; + List get props => [context, option]; } class HandleEmailActionTypeAction extends DashBoardAction { @@ -42,7 +43,7 @@ class HandleEmailActionTypeAction extends DashBoardAction { HandleEmailActionTypeAction(this.context, this.listEmailSelected, this.emailAction); @override - List get props => [listEmailSelected, emailAction]; + List get props => [context, listEmailSelected, emailAction]; } class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction { @@ -53,10 +54,17 @@ class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction { OpenEmailDetailedFromSuggestionQuickSearchAction(this.context, this.presentationEmail); @override - List get props => [presentationEmail]; + List get props => [context, presentationEmail]; } -class StartSearchEmailAction extends DashBoardAction {} +class StartSearchEmailAction extends DashBoardAction { + final QuickSearchFilter? filter; + + StartSearchEmailAction({this.filter}); + + @override + List get props => [filter]; +} class EmptyTrashAction extends DashBoardAction { @@ -65,7 +73,7 @@ class EmptyTrashAction extends DashBoardAction { EmptyTrashAction(this.context); @override - List get props => []; + List get props => [context]; } class ClearSearchEmailAction extends DashBoardAction {} 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 2ee004cef..637f1d9c2 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/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/thread/domain/model/search_query.dart'; @@ -342,18 +343,14 @@ class AdvancedFilterController extends BaseController { } void showFullEmailAddress(AdvancedSearchFilterField field) { + FocusManager.instance.primaryFocus?.unfocus(); + switch(field) { case AdvancedSearchFilterField.from: fromAddressExpandMode.value = ExpandMode.EXPAND; - toAddressExpandMode.value = ExpandMode.COLLAPSE; - focusManager.fromFieldFocusNode.requestFocus(); - focusManager.toFieldFocusNode.unfocus(); break; case AdvancedSearchFilterField.to: - fromAddressExpandMode.value = ExpandMode.COLLAPSE; toAddressExpandMode.value = ExpandMode.EXPAND; - focusManager.toFieldFocusNode.requestFocus(); - focusManager.fromFieldFocusNode.unfocus(); break; default: break; @@ -446,6 +443,10 @@ class AdvancedFilterController extends BaseController { ); } else if (action is ClearDateRangeToAdvancedSearch) { _updateDateRangeTime(action.receiveTime); + } else if (action is StartSearchEmailAction) { + if (action.filter == QuickSearchFilter.fromMe) { + _updateFromField(); + } } } ); @@ -470,6 +471,11 @@ class AdvancedFilterController extends BaseController { _clearAllTextFieldInput(); } + void _updateFromField() { + final listEmailAddress = searchEmailFilter.from.map((address) => EmailAddress(null, address)).toList(); + listFromEmailAddress = List.from(listEmailAddress); + } + @override void onClose() { _removeFocusListener(); 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 e9628e351..cd8406d12 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1505,7 +1505,7 @@ class MailboxDashBoardController extends ReloadableController { void selectQuickSearchFilterAction(QuickSearchFilter filter) { log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter'); selectQuickSearchFilter(filter); - dispatchAction(StartSearchEmailAction()); + dispatchAction(StartSearchEmailAction(filter: filter)); } void selectReceiveTimeQuickSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 4a673f4f6..7eb06f468 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -1,6 +1,5 @@ import 'dart:async'; -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'; @@ -29,7 +28,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_re import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.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/presentation/model/search_state.dart'; @@ -40,8 +38,6 @@ class SearchController extends BaseController with DateRangePickerMixin { final SaveRecentSearchInteractor _saveRecentSearchInteractor; final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor; - final ResponsiveUtils _responsiveUtils = Get.find(); - final searchInputController = TextEditingController(); final searchEmailFilter = SearchEmailFilter.initial().obs; final searchState = SearchState.initial().obs; @@ -60,8 +56,12 @@ class SearchController extends BaseController with DateRangePickerMixin { this._getAllRecentSearchLatestInteractor, ); - void selectOpenAdvanceSearch() { - isAdvancedSearchViewOpen.toggle(); + void openAdvanceSearch() { + isAdvancedSearchViewOpen.value = true; + } + + void closeAdvanceSearch() { + isAdvancedSearchViewOpen.value = false; } void clearSearchFilter() { @@ -79,10 +79,8 @@ class SearchController extends BaseController with DateRangePickerMixin { updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime); return; case QuickSearchFilter.fromMe: - isFilterSelected - ? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email) - : searchEmailFilter.value.from.add(userProfile.email); - updateFilterEmail(fromOption: Some(searchEmailFilter.value.from)); + final newListEmailAddress = isFilterSelected ? {} : {userProfile.email}; + updateFilterEmail(fromOption: Some(newListEmailAddress)); return; } } @@ -244,14 +242,6 @@ class SearchController extends BaseController with DateRangePickerMixin { : [])); } - void showAdvancedFilterView(BuildContext context) async { - selectOpenAdvanceSearch(); - if (_responsiveUtils.isMobile(context)) { - await showAdvancedSearchFilterBottomSheet(context); - selectOpenAdvanceSearch(); - } - } - void activateSimpleSearch() { simpleSearchIsActivated.value = true; } 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 948cd5306..605b880d9 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -535,11 +535,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { return Obx(() { if (supportListButtonQuickSearchFilter(context)) { return Padding( - padding: EdgeInsets.only( - right: AppUtils.isDirectionRTL(context) ? 0 : 16, - left: AppUtils.isDirectionRTL(context) ? 16 : 0, - top: 16 - ), + padding: const EdgeInsetsDirectional.only(end: 16, top: 8), child: Row(children: QuickSearchFilter.values .map((filter) => _buildQuickSearchFilterButton(context, filter)) .toList() diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_suggestion_item_widget_web.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_suggestion_item_widget_web.dart index 8b905e5cc..669894fd8 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_suggestion_item_widget_web.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_suggestion_item_widget_web.dart @@ -45,7 +45,7 @@ class AutoCompleteSuggestionItemWidgetWeb extends StatelessWidget { textOrigin: emailAddress.asString(), wordSearched: suggestionValid ?? '' ), - subtitle: emailAddress.emailAddress.isNotEmpty + subtitle: emailAddress.displayName.isNotEmpty ? RichTextWidget( textOrigin: emailAddress.emailAddress, wordSearched: suggestionValid ?? '', @@ -74,7 +74,7 @@ class AutoCompleteSuggestionItemWidgetWeb extends StatelessWidget { textOrigin: emailAddress.asString(), wordSearched: suggestionValid ?? '' ), - subtitle: emailAddress.emailAddress.isNotEmpty + subtitle: emailAddress.displayName.isNotEmpty ? RichTextWidget( textOrigin: emailAddress.emailAddress, wordSearched: suggestionValid ?? '', diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_tag_item_widget_web.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_tag_item_widget_web.dart index 7e92066f6..e1f6b131e 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_tag_item_widget_web.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_tag_item_widget_web.dart @@ -48,37 +48,39 @@ class AutoCompleteTagItemWidgetWeb extends StatelessWidget { top: AutoCompleteTagItemWebStyle.paddingTop, end: isCollapsed ? AutoCompleteTagItemWebStyle.paddingEnd : 0, ), - child: InkWell( - onTap: () => isCollapsed - ? null - : onShowFullAction?.call(field), - child: MouseRegion( - cursor: SystemMouseCursors.grab, - child: Chip( - labelPadding: EdgeInsetsDirectional.symmetric( - horizontal: AutoCompleteTagItemWebStyle.labelPaddingHorizontal, - vertical: DirectionUtils.isDirectionRTLByHasAnyRtl(currentEmailAddress.asString()) ? 0 : 2 + child: TextFieldTapRegion( + child: InkWell( + onTap: () => isCollapsed + ? onShowFullAction?.call(field) + : null, + child: MouseRegion( + cursor: SystemMouseCursors.grab, + child: Chip( + labelPadding: EdgeInsetsDirectional.symmetric( + horizontal: AutoCompleteTagItemWebStyle.labelPaddingHorizontal, + vertical: DirectionUtils.isDirectionRTLByHasAnyRtl(currentEmailAddress.asString()) ? 0 : 2 + ), + label: Text( + currentEmailAddress.asString(), + maxLines: 1, + overflow: CommonTextStyle.defaultTextOverFlow, + softWrap: CommonTextStyle.defaultSoftWrap, + ), + deleteIcon: SvgPicture.asset( + _imagePaths.icClose, + fit: BoxFit.fill, + ), + labelStyle: AutoCompleteTagItemWebStyle.labelTextStyle, + backgroundColor: _getTagBackgroundColor(), + shape: RoundedRectangleBorder( + borderRadius: AutoCompleteTagItemWebStyle.shapeBorderRadius, + side: _getTagBorderSide(), + ), + avatar: currentEmailAddress.emailAddress.isNotEmpty + ? AvatarTagItemWidget(tagName: currentEmailAddress.emailAddress) + : null, + onDeleted: () => onDeleteTagAction?.call(currentEmailAddress), ), - label: Text( - currentEmailAddress.asString(), - maxLines: 1, - overflow: CommonTextStyle.defaultTextOverFlow, - softWrap: CommonTextStyle.defaultSoftWrap, - ), - deleteIcon: SvgPicture.asset( - _imagePaths.icClose, - fit: BoxFit.fill, - ), - labelStyle: AutoCompleteTagItemWebStyle.labelTextStyle, - backgroundColor: _getTagBackgroundColor(), - shape: RoundedRectangleBorder( - borderRadius: AutoCompleteTagItemWebStyle.shapeBorderRadius, - side: _getTagBorderSide(), - ), - avatar: currentEmailAddress.emailAddress.isNotEmpty - ? AvatarTagItemWidget(tagName: currentEmailAddress.emailAddress) - : null, - onDeleted: () => onDeleteTagAction?.call(currentEmailAddress), ), ), ), diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart index 3b08d0fc2..40318b6d1 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart @@ -10,15 +10,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/main/utils/app_utils.dart'; class IconOpenAdvancedSearchWidget extends StatelessWidget { - IconOpenAdvancedSearchWidget( - this._parentContext, { - Key? key, - }) : super(key: key); + IconOpenAdvancedSearchWidget({Key? key}) : super(key: key); final _imagePaths = Get.find(); final search.SearchController searchController = Get.find(); final AdvancedFilterController advancedFilterController = Get.find(); - final BuildContext _parentContext; @override Widget build(BuildContext context) { @@ -44,7 +40,7 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget { onTap: () { log('IconOpenAdvancedSearchWidget::build(): clicked'); advancedFilterController.initSearchFilterField(context); - searchController.showAdvancedFilterView(_parentContext); + searchController.openAdvanceSearch(); }), ), ); 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 c9f0b51bb..7a712bd4e 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 @@ -39,7 +39,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { portalFollower: PointerInterceptor( child: GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () => _searchController.selectOpenAdvanceSearch() + onTap: _searchController.closeAdvanceSearch ), ), child: PortalTarget( @@ -210,7 +210,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { ), onTap: _searchController.clearTextSearch ), - rightButton: IconOpenAdvancedSearchWidget(context) + rightButton: IconOpenAdvancedSearchWidget() ); }