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 3b1f9a796..d9f88b8ff 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -104,10 +104,7 @@ class AdvancedFilterController extends BaseController { } if(lastTextForm.isNotEmpty && !searchController.searchEmailFilter.value.from.contains(lastTextForm.value)){ - searchController.updateFilterEmail( - from: searchController.searchEmailFilter.value.from..add(lastTextForm.value), - ); - + searchController.updateFilterEmail(fromOption: Some(searchController.searchEmailFilter.value.from..add(lastTextForm.value))); lastTextForm.value = ''; } 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 f1ba08f21..386231d02 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -529,7 +529,11 @@ class MailboxDashBoardController extends ReloadableController { bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE; void searchEmail(BuildContext context, String value) { + log('MailboxDashBoardController::searchEmail():'); clearFilterMessageOption(); + if (searchController.listFilterOnSuggestionForm.isNotEmpty) { + searchController.applyFilterSuggestionToSearchFilter(userProfile.value); + } searchController.updateFilterEmail(text: SearchQuery(value)); dispatchAction(StartSearchEmailAction()); KeyboardUtils.hideKeyboard(context); diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index a7e4cc7ea..87faea93b 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -1,7 +1,6 @@ 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'; import 'package:get/get.dart'; @@ -62,13 +61,7 @@ class SearchController extends BaseController with DateRangePickerMixin { this._getAllRecentSearchLatestInteractor, ); - @override - void onInit() { - _registerSearchFocusListener(); - super.onInit(); - } - - selectOpenAdvanceSearch() { + void selectOpenAdvanceSearch() { isAdvancedSearchViewOpen.toggle(); } @@ -90,7 +83,7 @@ class SearchController extends BaseController with DateRangePickerMixin { isFilterSelected ? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email) : searchEmailFilter.value.from.add(userProfile.email); - updateFilterEmail(from: searchEmailFilter.value.from); + updateFilterEmail(fromOption: Some(searchEmailFilter.value.from)); return; } } @@ -152,8 +145,37 @@ class SearchController extends BaseController with DateRangePickerMixin { : null; } + void applyFilterSuggestionToSearchFilter(UserProfile? userProfile) { + final receiveTime = listFilterOnSuggestionForm.contains(QuickSearchFilter.last7Days) + ? EmailReceiveTimeType.last7Days + : EmailReceiveTimeType.allTime; + + final hasAttachment = listFilterOnSuggestionForm.contains(QuickSearchFilter.hasAttachment) ? true : false; + + var listFromAddress = searchEmailFilter.value.from; + if (userProfile != null) { + if (listFilterOnSuggestionForm.contains(QuickSearchFilter.fromMe)) { + listFromAddress.add(userProfile.email); + } else { + listFromAddress.remove(userProfile.email); + } + } + + updateFilterEmail( + emailReceiveTimeType: receiveTime, + hasAttachment: hasAttachment, + fromOption: Some(listFromAddress) + ); + + clearFilterSuggestion(); + } + + void clearFilterSuggestion() { + listFilterOnSuggestionForm.clear(); + } + void updateFilterEmail({ - Set? from, + Option>? fromOption, Set? to, SearchQuery? text, Option? subjectOption, @@ -166,7 +188,7 @@ class SearchController extends BaseController with DateRangePickerMixin { Option? endDateOption }) { searchEmailFilter.value = searchEmailFilter.value.copyWith( - from: from, + fromOption: fromOption, to: to, text: text, subjectOption: subjectOption, @@ -181,20 +203,6 @@ class SearchController extends BaseController with DateRangePickerMixin { searchEmailFilter.refresh(); } - void _registerSearchFocusListener() { - searchFocus.addListener(() { - final hasFocus = searchFocus.hasFocus; - final query = searchEmailFilter.value.text?.value; - log('SearchController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query'); - if (!hasFocus && (query == null || query.isEmpty) && advancedSearchIsActivated.isFalse) { - updateFilterEmail(text: SearchQuery.initial()); - searchInputController.clear(); - clearSearchFilter(); - searchFocus.unfocus(); - } - }); - } - EmailReceiveTimeType get receiveTimeFiltered => searchEmailFilter.value.emailReceiveTimeType; DateTime? get startDateFiltered => searchEmailFilter.value.startDate?.value.toLocal(); @@ -217,31 +225,14 @@ class SearchController extends BaseController with DateRangePickerMixin { } void clearTextSearch() { - updateFilterEmail(text: SearchQuery.initial()); searchInputController.clear(); searchFocus.requestFocus(); } - void onChangeTextSearch(String value) { - updateFilterEmail(text: SearchQuery(value)); - } - void updateTextSearch(String value) { searchInputController.text = value; } - bool checkQuickSearchFilterSelected(QuickSearchFilter quickSearchFilter, UserProfile userProfile) { - switch (quickSearchFilter) { - case QuickSearchFilter.hasAttachment: - return searchEmailFilter.value.hasAttachment == true; - case QuickSearchFilter.last7Days: - return true; - case QuickSearchFilter.fromMe: - return searchEmailFilter.value.from.contains(userProfile.email) && - searchEmailFilter.value.from.length == 1; - } - } - void saveRecentSearch(RecentSearch recentSearch) { consumeState(_saveRecentSearchInteractor.execute(recentSearch)); } 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 5c1e65476..e7e5e1b6b 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -80,7 +80,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { if (controller.appInformation.value != null) { return Padding(padding: const EdgeInsets.only(top: 6), child: Text( - 'v.${controller.appInformation.value!.version}', + 'v${controller.appInformation.value!.version}', textAlign: TextAlign.center, style: const TextStyle( fontSize: 13, 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 437798f42..ad450724a 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 @@ -45,7 +45,7 @@ class SearchEmailFilter with EquatableMixin { emailReceiveTimeType ?? EmailReceiveTimeType.allTime; SearchEmailFilter copyWith({ - Set? from, + Option>? fromOption, Set? to, SearchQuery? text, Option? subjectOption, @@ -58,7 +58,7 @@ class SearchEmailFilter with EquatableMixin { Option? endDateOption, }) { return SearchEmailFilter( - from: from ?? this.from, + from: _getOptionParam(fromOption, from), to: to ?? this.to, text: text ?? this.text, subject: _getOptionParam(subjectOption, subject), 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 310c13da4..b777efc7f 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 @@ -69,7 +69,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { borderRadius: const BorderRadius.all(Radius.circular(16)), constraints: BoxConstraints(maxWidth: maxWidth) ), - debounceDuration: const Duration(milliseconds: 500), + debounceDuration: const Duration(milliseconds: 300), listActionButton: QuickSearchFilter.values, actionButtonBuilder: (context, filterAction) { if (filterAction is QuickSearchFilter) { @@ -122,6 +122,9 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { if (query.isNotEmpty) { dashBoardController.searchController.saveRecentSearch(RecentSearch.now(query)); + } + + if (query.isNotEmpty || dashBoardController.searchController.listFilterOnSuggestionForm.isNotEmpty) { dashBoardController.searchEmail(context, query); } else { dashBoardController.clearSearchEmail(); @@ -179,7 +182,6 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin { focusNode: controller.searchFocus, textInputAction: TextInputAction.done, onSubmitted: (keyword) => _invokeSearchEmailAction(context, keyword.trim()), - onChanged: controller.onChangeTextSearch, decoration: InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none,