able filter message option after using advanced search

This commit is contained in:
ManhNTX
2022-06-27 02:46:38 +07:00
committed by Dat H. Pham
parent 9ea8fc1cb8
commit 7ca8b83822
9 changed files with 52 additions and 33 deletions
@@ -35,7 +35,7 @@ class AdvancedFilterController extends BaseController {
_searchController.isAdvancedSearchViewOpen.toggle(); _searchController.isAdvancedSearchViewOpen.toggle();
} }
cleanSearchFilter() { cleanSearchFilter(BuildContext context) {
_searchController.cleanSearchFilter(); _searchController.cleanSearchFilter();
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime; dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
fromFilterInputController.text = ''; fromFilterInputController.text = '';
@@ -45,22 +45,31 @@ class AdvancedFilterController extends BaseController {
notKeyWordFilterInputController.text = ''; notKeyWordFilterInputController.text = '';
dateFilterInputController.text = ''; dateFilterInputController.text = '';
hasAttachment.value = false; hasAttachment.value = false;
_searchController.isAdvancedSearchHasApply.isFalse; _searchController.isAdvancedSearchHasApply.value = false;
_searchController.isAdvancedSearchViewOpen.toggle(); _searchController.isAdvancedSearchViewOpen.toggle();
_mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(_searchEmailFilter.text?.value));
} }
void _updateFilterEmailFromAdvancedSearchView() { void _updateFilterEmailFromAdvancedSearchView() {
if (fromFilterInputController.text.isNotEmpty) { if (fromFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(from: fromFilterInputController.text.split(',').toSet()); _searchController.updateFilterEmail(from: fromFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(from: {});
} }
if (toFilterInputController.text.isNotEmpty) { if (toFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(to: toFilterInputController.text.split(',').toSet()); _searchController.updateFilterEmail(to: toFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(to: {});
} }
if (hasKeyWordFilterInputController.text.isNotEmpty) { if (hasKeyWordFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(hasKeyword: hasKeyWordFilterInputController.text.split(',').toSet()); _searchController.updateFilterEmail(hasKeyword: hasKeyWordFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(hasKeyword: {});
} }
if (notKeyWordFilterInputController.text.isNotEmpty) { if (notKeyWordFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(notKeyword: notKeyWordFilterInputController.text.split(',').toSet()); _searchController.updateFilterEmail(notKeyword: notKeyWordFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(notKeyword: {});
} }
_searchController.updateFilterEmail( _searchController.updateFilterEmail(
@@ -93,7 +102,7 @@ class AdvancedFilterController extends BaseController {
notKeyWordFilterInputController.text.isNotEmpty || notKeyWordFilterInputController.text.isNotEmpty ||
dateFilterInputController.text.isNotEmpty || dateFilterInputController.text.isNotEmpty ||
mailBoxFilterInputController.text.isNotEmpty || mailBoxFilterInputController.text.isNotEmpty ||
hasAttachment.isFalse; hasAttachment.isTrue;
} }
initSearchFilterField(BuildContext context) { initSearchFilterField(BuildContext context) {
@@ -201,7 +201,6 @@ class MailboxDashBoardController extends ReloadableController {
void _getUserProfile() async { void _getUserProfile() async {
userProfile.value = sessionCurrent != null ? UserProfile(sessionCurrent!.username.value) : null; userProfile.value = sessionCurrent != null ? UserProfile(sessionCurrent!.username.value) : null;
searchController.userProfile.value = userProfile.value;
} }
void _setSessionCurrent() { void _setSessionCurrent() {
@@ -210,7 +209,6 @@ class MailboxDashBoardController extends ReloadableController {
if (arguments is Session) { if (arguments is Session) {
sessionCurrent = arguments; sessionCurrent = arguments;
accountId.value = sessionCurrent?.accounts.keys.first; accountId.value = sessionCurrent?.accounts.keys.first;
searchController.accountId.value = accountId.value;
} else { } else {
if (kIsWeb) { if (kIsWeb) {
reload(); reload();
@@ -382,7 +380,6 @@ class MailboxDashBoardController extends ReloadableController {
void handleReloaded(Session session) { void handleReloaded(Session session) {
sessionCurrent = session; sessionCurrent = session;
accountId.value = sessionCurrent?.accounts.keys.first; accountId.value = sessionCurrent?.accounts.keys.first;
searchController.accountId.value = accountId.value;
_getUserProfile(); _getUserProfile();
} }
@@ -35,8 +35,6 @@ class SearchController extends BaseController {
final searchInputController = TextEditingController(); final searchInputController = TextEditingController();
final searchEmailFilter = SearchEmailFilter().obs; final searchEmailFilter = SearchEmailFilter().obs;
final searchState = SearchState.initial().obs; final searchState = SearchState.initial().obs;
final accountId = Rxn<AccountId>();
final userProfile = Rxn<UserProfile>();
final isAdvancedSearchViewOpen = false.obs; final isAdvancedSearchViewOpen = false.obs;
final isAdvancedSearchHasApply = false.obs; final isAdvancedSearchHasApply = false.obs;
final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs; final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs;
@@ -29,8 +29,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
MailboxDashBoardView({Key? key}) : super(key: key); MailboxDashBoardView({Key? key}) : super(key: key);
final SearchController searchController = Get.find<SearchController>(); final SearchController searchController = Get.find<SearchController>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (controller.isDrawerOpen && (responsiveUtils.isDesktop(context) if (controller.isDrawerOpen && (responsiveUtils.isDesktop(context)
@@ -417,7 +417,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
color: AppColor.colorBgSearchBar), color: AppColor.colorBgSearchBar),
height: 45, height: 45,
child: PortalTarget( child: PortalTarget(
visible: controller.searchController.isAdvancedSearchViewOpen.isTrue, visible: searchController.isAdvancedSearchViewOpen.isTrue,
anchor: const Aligned( anchor: const Aligned(
follower: Alignment.topLeft, follower: Alignment.topLeft,
target: Alignment.bottomLeft, target: Alignment.bottomLeft,
@@ -431,10 +431,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
portalFollower:const AdvancedSearchFilterOverlay(), portalFollower:const AdvancedSearchFilterOverlay(),
child: QuickSearchInputForm<PresentationEmail, RecentSearch>( child: QuickSearchInputForm<PresentationEmail, RecentSearch>(
textFieldConfiguration: QuickSearchTextFieldConfiguration( textFieldConfiguration: QuickSearchTextFieldConfiguration(
controller: controller.searchController.searchInputController, controller: searchController.searchInputController,
autofocus: true, autofocus: true,
enabled: controller.searchController.isAdvancedSearchViewOpen.isFalse, enabled: searchController.isAdvancedSearchViewOpen.isFalse,
focusNode: controller.searchController.searchFocus, focusNode: searchController.searchFocus,
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
onSubmitted: (keyword) { onSubmitted: (keyword) {
if (keyword.trim().isNotEmpty) { if (keyword.trim().isNotEmpty) {
@@ -444,7 +444,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
}, },
onChanged: (query) { onChanged: (query) {
log('MailboxDashBoardView::_buildSearchForm(): onChanged: $query'); log('MailboxDashBoardView::_buildSearchForm(): onChanged: $query');
controller.searchController.onChangeTextSearch(query); searchController.onChangeTextSearch(query);
}, },
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: InputBorder.none,
@@ -466,9 +466,9 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
onTap: () { onTap: () {
final keyword = controller.searchController.searchInputController.text; final keyword = searchController.searchInputController.text;
if (keyword.trim().isNotEmpty) { if (keyword.trim().isNotEmpty) {
controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); searchController.saveRecentSearch(RecentSearch.now(keyword));
} }
controller.searchEmail(context, keyword); controller.searchEmail(context, keyword);
}), }),
@@ -479,7 +479,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
height: 16, height: 16,
fit: BoxFit.fill), fit: BoxFit.fill),
onTap: () { onTap: () {
controller.searchController.clearTextSearch(); searchController.clearTextSearch();
}), }),
rightButton: IconOpenAdvancedSearchWidget(context) rightButton: IconOpenAdvancedSearchWidget(context)
), ),
@@ -505,7 +505,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
}, },
buttonActionCallback: (filterAction) { buttonActionCallback: (filterAction) {
if (filterAction is QuickSearchFilter) { if (filterAction is QuickSearchFilter) {
controller.searchController.selectQuickSearchFilter( controller.selectQuickSearchFilter(
quickSearchFilter: filterAction, quickSearchFilter: filterAction,
fromSuggestionBox: true, fromSuggestionBox: true,
); );
@@ -529,7 +529,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return InkWell( return InkWell(
onTap: () { onTap: () {
if (keyword.trim().isNotEmpty) { if (keyword.trim().isNotEmpty) {
controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); searchController.saveRecentSearch(RecentSearch.now(keyword));
} }
controller.searchEmail(context, keyword); controller.searchEmail(context, keyword);
}, },
@@ -561,17 +561,17 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
child: loadingWidget, child: loadingWidget,
), ),
fetchRecentActionCallback: (pattern) async { fetchRecentActionCallback: (pattern) async {
return controller.searchController.getAllRecentSearchAction(pattern); return searchController.getAllRecentSearchAction(pattern);
}, },
itemRecentBuilder: (context, recent) { itemRecentBuilder: (context, recent) {
return RecentSearchItemTileWidget(recent); return RecentSearchItemTileWidget(recent);
}, },
onRecentSelected: (recent) { onRecentSelected: (recent) {
controller.searchController.searchInputController.text = recent.value; searchController.searchInputController.text = recent.value;
controller.searchEmail(context, recent.value); controller.searchEmail(context, recent.value);
}, },
suggestionsCallback: (pattern) async { suggestionsCallback: (pattern) async {
return controller.searchController.quickSearchEmails(); return controller.quickSearchEmails();
}, },
itemBuilder: (context, email) { itemBuilder: (context, email) {
return EmailQuickSearchItemTileWidget( return EmailQuickSearchItemTileWidget(
@@ -59,7 +59,7 @@ class SearchEmailFilter {
); );
} }
Filter? mappingToEmailFilterCondition() { Filter? mappingToEmailFilterCondition({Filter? moreFilterCondition}) {
final emailEmailFilterConditionShared = EmailFilterCondition( final emailEmailFilterConditionShared = EmailFilterCondition(
text: text?.value, text: text?.value,
inMailbox: mailbox?.id, inMailbox: mailbox?.id,
@@ -77,6 +77,7 @@ class SearchEmailFilter {
Operator.AND, hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet()), Operator.AND, hasKeyword.map((e) => EmailFilterCondition(hasKeyword: e)).toSet()),
LogicFilterOperator( LogicFilterOperator(
Operator.AND, notKeyword.map((e) => EmailFilterCondition(notKeyword: e)).toSet()), Operator.AND, notKeyword.map((e) => EmailFilterCondition(notKeyword: e)).toSet()),
if(moreFilterCondition !=null) moreFilterCondition
}); });
} }
} }
@@ -30,7 +30,7 @@ class AdvancedSearchFilterFormBottomView
Expanded(child: _buildCheckboxHasAttachment(context)), Expanded(child: _buildCheckboxHasAttachment(context)),
_buildButton( _buildButton(
onAction: () { onAction: () {
controller.cleanSearchFilter(); controller.cleanSearchFilter(context);
popBack(); popBack();
}, },
colorButton: AppColor.primaryColor.withOpacity(0.14), colorButton: AppColor.primaryColor.withOpacity(0.14),
@@ -103,7 +103,8 @@ class ThreadController extends BaseController {
MailboxId? _currentMailboxId; MailboxId? _currentMailboxId;
jmap.State? _currentEmailState; jmap.State? _currentEmailState;
final ScrollController listEmailController = ScrollController(); final ScrollController listEmailController = ScrollController();
late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker; late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker, advancedSearchFilterWorker;
Set<Comparator>? get _sortOrder => <Comparator>{} Set<Comparator>? get _sortOrder => <Comparator>{}
..add(EmailComparator(EmailComparatorProperty.receivedAt) ..add(EmailComparator(EmailComparatorProperty.receivedAt)
@@ -251,6 +252,12 @@ class ThreadController extends BaseController {
} }
}); });
advancedSearchFilterWorker = ever(searchController.isAdvancedSearchViewOpen, (hasOpen) {
if (hasOpen == true) {
mailboxDashBoardController.filterMessageOption.value = FilterMessageOption.all;
}
});
dashboardActionWorker = ever(mailboxDashBoardController.dashBoardAction, (action) { dashboardActionWorker = ever(mailboxDashBoardController.dashBoardAction, (action) {
if (action is DashBoardAction) { if (action is DashBoardAction) {
if (action is RefreshAllEmailAction) { if (action is RefreshAllEmailAction) {
@@ -304,6 +311,7 @@ class ThreadController extends BaseController {
mailboxWorker.call(); mailboxWorker.call();
dashboardActionWorker.call(); dashboardActionWorker.call();
searchWorker.call(); searchWorker.call();
advancedSearchFilterWorker.call();
viewStateWorker.call(); viewStateWorker.call();
} }
@@ -571,8 +579,8 @@ class ThreadController extends BaseController {
message: newFilterOption.getMessageToast(context), message: newFilterOption.getMessageToast(context),
icon: newFilterOption.getIconToast(_imagePaths)); icon: newFilterOption.getIconToast(_imagePaths));
if (isSearchActive()) { if (isSearchActive() || searchController.isAdvancedSearchHasApply.isTrue) {
_searchEmail(); _searchEmail(filterMessageOption: _getFilterCondition());
} else { } else {
refreshAllEmail(); refreshAllEmail();
} }
@@ -816,7 +824,7 @@ class ThreadController extends BaseController {
searchController.clearTextSearch(); searchController.clearTextSearch();
} }
void _searchEmail({UnsignedInt? limit}) { void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) {
if (_accountId != null && searchQuery != null) { if (_accountId != null && searchQuery != null) {
searchIsActive.value = true; searchIsActive.value = true;
@@ -824,11 +832,17 @@ class ThreadController extends BaseController {
searchController.updateFilterEmail(mailbox: currentMailbox); searchController.updateFilterEmail(mailbox: currentMailbox);
} }
filterMessageOption = EmailFilterCondition(
notKeyword: filterMessageOption?.notKeyword,
hasKeyword: filterMessageOption?.hasKeyword,
hasAttachment: filterMessageOption?.hasAttachment,
);
consumeState(_searchEmailInteractor.execute( consumeState(_searchEmailInteractor.execute(
_accountId!, _accountId!,
limit: limit ?? ThreadConstants.defaultLimit, limit: limit ?? ThreadConstants.defaultLimit,
sort: _sortOrder, sort: _sortOrder,
filter: _searchEmailFilter.mappingToEmailFilterCondition(), filter: _searchEmailFilter.mappingToEmailFilterCondition(moreFilterCondition: filterMessageOption),
properties: ThreadConstants.propertiesDefault, properties: ThreadConstants.propertiesDefault,
)); ));
} }
@@ -267,7 +267,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
}, },
buttonActionCallback: (filterAction) { buttonActionCallback: (filterAction) {
if (filterAction is QuickSearchFilter) { if (filterAction is QuickSearchFilter) {
controller.searchController.selectQuickSearchFilter( controller.mailboxDashBoardController.selectQuickSearchFilter(
quickSearchFilter: filterAction, quickSearchFilter: filterAction,
fromSuggestionBox: true, fromSuggestionBox: true,
); );
@@ -331,7 +331,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
controller.mailboxDashBoardController.searchEmail(context, recent.value); controller.mailboxDashBoardController.searchEmail(context, recent.value);
}, },
suggestionsCallback: (pattern) async { suggestionsCallback: (pattern) async {
return controller.searchController.quickSearchEmails(); return controller.mailboxDashBoardController.quickSearchEmails();
}, },
itemBuilder: (context, email) { itemBuilder: (context, email) {
return EmailQuickSearchItemTileWidget( return EmailQuickSearchItemTileWidget(
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2022-06-26T22:28:09.520951", "@@last_modified": "2022-06-24T14:16:53.170960",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",