TF-1155 Update value From field when click quick search action

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit eeb16993c41325bc1a617b533c4eaf94f5f32103)
This commit is contained in:
dab246
2023-11-08 16:51:37 +07:00
committed by Dat Vu
parent c94dfc5f00
commit f13bc5de61
11 changed files with 79 additions and 82 deletions
@@ -50,7 +50,7 @@ class RecipientSuggestionItemWidget extends StatelessWidget {
textOrigin: emailAddress.asString(), textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '' wordSearched: suggestionValid ?? ''
), ),
subtitle: emailAddress.emailAddress.isNotEmpty subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget( ? RichTextWidget(
textOrigin: emailAddress.emailAddress, textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '', wordSearched: suggestionValid ?? '',
@@ -79,7 +79,7 @@ class RecipientSuggestionItemWidget extends StatelessWidget {
textOrigin: emailAddress.asString(), textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '' wordSearched: suggestionValid ?? ''
), ),
subtitle: emailAddress.emailAddress.isNotEmpty subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget( ? RichTextWidget(
textOrigin: emailAddress.emailAddress, textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '', wordSearched: suggestionValid ?? '',
@@ -268,13 +268,12 @@ class EmailView extends GetWidget<SingleEmailController> {
); );
} }
EdgeInsets _getMarginEmailView(BuildContext context) { EdgeInsetsGeometry _getMarginEmailView(BuildContext context) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
if (responsiveUtils.isDesktop(context)) { if (responsiveUtils.isDesktop(context)) {
return EdgeInsets.only( return const EdgeInsetsDirectional.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0, end: 16,
right: AppUtils.isDirectionRTL(context) ? 0 : 16, top: 8,
top: 16,
bottom: 16 bottom: 16
); );
} else { } else {
@@ -4,6 +4,7 @@ import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.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/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/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/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart';
@@ -30,7 +31,7 @@ class FilterMessageAction extends DashBoardAction {
FilterMessageAction(this.context, this.option); FilterMessageAction(this.context, this.option);
@override @override
List<Object?> get props => [option]; List<Object?> get props => [context, option];
} }
class HandleEmailActionTypeAction extends DashBoardAction { class HandleEmailActionTypeAction extends DashBoardAction {
@@ -42,7 +43,7 @@ class HandleEmailActionTypeAction extends DashBoardAction {
HandleEmailActionTypeAction(this.context, this.listEmailSelected, this.emailAction); HandleEmailActionTypeAction(this.context, this.listEmailSelected, this.emailAction);
@override @override
List<Object> get props => [listEmailSelected, emailAction]; List<Object> get props => [context, listEmailSelected, emailAction];
} }
class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction { class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction {
@@ -53,10 +54,17 @@ class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction {
OpenEmailDetailedFromSuggestionQuickSearchAction(this.context, this.presentationEmail); OpenEmailDetailedFromSuggestionQuickSearchAction(this.context, this.presentationEmail);
@override @override
List<Object?> get props => [presentationEmail]; List<Object?> get props => [context, presentationEmail];
} }
class StartSearchEmailAction extends DashBoardAction {} class StartSearchEmailAction extends DashBoardAction {
final QuickSearchFilter? filter;
StartSearchEmailAction({this.filter});
@override
List<Object?> get props => [filter];
}
class EmptyTrashAction extends DashBoardAction { class EmptyTrashAction extends DashBoardAction {
@@ -65,7 +73,7 @@ class EmptyTrashAction extends DashBoardAction {
EmptyTrashAction(this.context); EmptyTrashAction(this.context);
@override @override
List<Object?> get props => []; List<Object?> get props => [context];
} }
class ClearSearchEmailAction extends DashBoardAction {} class ClearSearchEmailAction extends DashBoardAction {}
@@ -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/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/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_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/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/thread/domain/model/search_query.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) { void showFullEmailAddress(AdvancedSearchFilterField field) {
FocusManager.instance.primaryFocus?.unfocus();
switch(field) { switch(field) {
case AdvancedSearchFilterField.from: case AdvancedSearchFilterField.from:
fromAddressExpandMode.value = ExpandMode.EXPAND; fromAddressExpandMode.value = ExpandMode.EXPAND;
toAddressExpandMode.value = ExpandMode.COLLAPSE;
focusManager.fromFieldFocusNode.requestFocus();
focusManager.toFieldFocusNode.unfocus();
break; break;
case AdvancedSearchFilterField.to: case AdvancedSearchFilterField.to:
fromAddressExpandMode.value = ExpandMode.COLLAPSE;
toAddressExpandMode.value = ExpandMode.EXPAND; toAddressExpandMode.value = ExpandMode.EXPAND;
focusManager.toFieldFocusNode.requestFocus();
focusManager.fromFieldFocusNode.unfocus();
break; break;
default: default:
break; break;
@@ -446,6 +443,10 @@ class AdvancedFilterController extends BaseController {
); );
} else if (action is ClearDateRangeToAdvancedSearch) { } else if (action is ClearDateRangeToAdvancedSearch) {
_updateDateRangeTime(action.receiveTime); _updateDateRangeTime(action.receiveTime);
} else if (action is StartSearchEmailAction) {
if (action.filter == QuickSearchFilter.fromMe) {
_updateFromField();
}
} }
} }
); );
@@ -470,6 +471,11 @@ class AdvancedFilterController extends BaseController {
_clearAllTextFieldInput(); _clearAllTextFieldInput();
} }
void _updateFromField() {
final listEmailAddress = searchEmailFilter.from.map((address) => EmailAddress(null, address)).toList();
listFromEmailAddress = List.from(listEmailAddress);
}
@override @override
void onClose() { void onClose() {
_removeFocusListener(); _removeFocusListener();
@@ -1505,7 +1505,7 @@ class MailboxDashBoardController extends ReloadableController {
void selectQuickSearchFilterAction(QuickSearchFilter filter) { void selectQuickSearchFilterAction(QuickSearchFilter filter) {
log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter'); log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter');
selectQuickSearchFilter(filter); selectQuickSearchFilter(filter);
dispatchAction(StartSearchEmailAction()); dispatchAction(StartSearchEmailAction(filter: filter));
} }
void selectReceiveTimeQuickSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) { void selectReceiveTimeQuickSearchFilter(BuildContext context, EmailReceiveTimeType receiveTime) {
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/material.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/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/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/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/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';
import 'package:tmail_ui_user/features/thread/presentation/model/search_state.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 SaveRecentSearchInteractor _saveRecentSearchInteractor;
final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor; final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor;
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final searchInputController = TextEditingController(); final searchInputController = TextEditingController();
final searchEmailFilter = SearchEmailFilter.initial().obs; final searchEmailFilter = SearchEmailFilter.initial().obs;
final searchState = SearchState.initial().obs; final searchState = SearchState.initial().obs;
@@ -60,8 +56,12 @@ class SearchController extends BaseController with DateRangePickerMixin {
this._getAllRecentSearchLatestInteractor, this._getAllRecentSearchLatestInteractor,
); );
void selectOpenAdvanceSearch() { void openAdvanceSearch() {
isAdvancedSearchViewOpen.toggle(); isAdvancedSearchViewOpen.value = true;
}
void closeAdvanceSearch() {
isAdvancedSearchViewOpen.value = false;
} }
void clearSearchFilter() { void clearSearchFilter() {
@@ -79,10 +79,8 @@ class SearchController extends BaseController with DateRangePickerMixin {
updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime); updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
return; return;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
isFilterSelected final newListEmailAddress = isFilterSelected ? <String>{} : <String>{userProfile.email};
? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email) updateFilterEmail(fromOption: Some(newListEmailAddress));
: searchEmailFilter.value.from.add(userProfile.email);
updateFilterEmail(fromOption: Some(searchEmailFilter.value.from));
return; return;
} }
} }
@@ -244,14 +242,6 @@ class SearchController extends BaseController with DateRangePickerMixin {
: <RecentSearch>[])); : <RecentSearch>[]));
} }
void showAdvancedFilterView(BuildContext context) async {
selectOpenAdvanceSearch();
if (_responsiveUtils.isMobile(context)) {
await showAdvancedSearchFilterBottomSheet(context);
selectOpenAdvanceSearch();
}
}
void activateSimpleSearch() { void activateSimpleSearch() {
simpleSearchIsActivated.value = true; simpleSearchIsActivated.value = true;
} }
@@ -535,11 +535,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() { return Obx(() {
if (supportListButtonQuickSearchFilter(context)) { if (supportListButtonQuickSearchFilter(context)) {
return Padding( return Padding(
padding: EdgeInsets.only( padding: const EdgeInsetsDirectional.only(end: 16, top: 8),
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
child: Row(children: QuickSearchFilter.values child: Row(children: QuickSearchFilter.values
.map((filter) => _buildQuickSearchFilterButton(context, filter)) .map((filter) => _buildQuickSearchFilterButton(context, filter))
.toList() .toList()
@@ -45,7 +45,7 @@ class AutoCompleteSuggestionItemWidgetWeb extends StatelessWidget {
textOrigin: emailAddress.asString(), textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '' wordSearched: suggestionValid ?? ''
), ),
subtitle: emailAddress.emailAddress.isNotEmpty subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget( ? RichTextWidget(
textOrigin: emailAddress.emailAddress, textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '', wordSearched: suggestionValid ?? '',
@@ -74,7 +74,7 @@ class AutoCompleteSuggestionItemWidgetWeb extends StatelessWidget {
textOrigin: emailAddress.asString(), textOrigin: emailAddress.asString(),
wordSearched: suggestionValid ?? '' wordSearched: suggestionValid ?? ''
), ),
subtitle: emailAddress.emailAddress.isNotEmpty subtitle: emailAddress.displayName.isNotEmpty
? RichTextWidget( ? RichTextWidget(
textOrigin: emailAddress.emailAddress, textOrigin: emailAddress.emailAddress,
wordSearched: suggestionValid ?? '', wordSearched: suggestionValid ?? '',
@@ -48,37 +48,39 @@ class AutoCompleteTagItemWidgetWeb extends StatelessWidget {
top: AutoCompleteTagItemWebStyle.paddingTop, top: AutoCompleteTagItemWebStyle.paddingTop,
end: isCollapsed ? AutoCompleteTagItemWebStyle.paddingEnd : 0, end: isCollapsed ? AutoCompleteTagItemWebStyle.paddingEnd : 0,
), ),
child: InkWell( child: TextFieldTapRegion(
onTap: () => isCollapsed child: InkWell(
? null onTap: () => isCollapsed
: onShowFullAction?.call(field), ? onShowFullAction?.call(field)
child: MouseRegion( : null,
cursor: SystemMouseCursors.grab, child: MouseRegion(
child: Chip( cursor: SystemMouseCursors.grab,
labelPadding: EdgeInsetsDirectional.symmetric( child: Chip(
horizontal: AutoCompleteTagItemWebStyle.labelPaddingHorizontal, labelPadding: EdgeInsetsDirectional.symmetric(
vertical: DirectionUtils.isDirectionRTLByHasAnyRtl(currentEmailAddress.asString()) ? 0 : 2 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),
), ),
), ),
), ),
@@ -10,15 +10,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IconOpenAdvancedSearchWidget extends StatelessWidget { class IconOpenAdvancedSearchWidget extends StatelessWidget {
IconOpenAdvancedSearchWidget( IconOpenAdvancedSearchWidget({Key? key}) : super(key: key);
this._parentContext, {
Key? key,
}) : super(key: key);
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
final search.SearchController searchController = Get.find<search.SearchController>(); final search.SearchController searchController = Get.find<search.SearchController>();
final AdvancedFilterController advancedFilterController = Get.find<AdvancedFilterController>(); final AdvancedFilterController advancedFilterController = Get.find<AdvancedFilterController>();
final BuildContext _parentContext;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -44,7 +40,7 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
onTap: () { onTap: () {
log('IconOpenAdvancedSearchWidget::build(): clicked'); log('IconOpenAdvancedSearchWidget::build(): clicked');
advancedFilterController.initSearchFilterField(context); advancedFilterController.initSearchFilterField(context);
searchController.showAdvancedFilterView(_parentContext); searchController.openAdvanceSearch();
}), }),
), ),
); );
@@ -39,7 +39,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
portalFollower: PointerInterceptor( portalFollower: PointerInterceptor(
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () => _searchController.selectOpenAdvanceSearch() onTap: _searchController.closeAdvanceSearch
), ),
), ),
child: PortalTarget( child: PortalTarget(
@@ -210,7 +210,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
), ),
onTap: _searchController.clearTextSearch onTap: _searchController.clearTextSearch
), ),
rightButton: IconOpenAdvancedSearchWidget(context) rightButton: IconOpenAdvancedSearchWidget()
); );
} }