add advanced search filter by mailbox

This commit is contained in:
ManhNTX
2022-06-26 22:40:18 +07:00
committed by Dat H. Pham
parent 8ab7b3adaa
commit 1c26fd5ec1
15 changed files with 83 additions and 32 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
SERVER_URL=https://jmap.upn.integration-open-paas.org
SERVER_URL=http://localhost
DOMAIN_REDIRECT_URL=http://localhost:3000
WEB_OIDC_CLIENT_ID=teammail-web
@@ -13,7 +13,7 @@ class CheckOIDCIsAvailableInteractor {
try {
final result = await _oidcRepository.checkOIDCIsAvailable(oidcRequest);
log('CheckOIDCIsAvailableInteractor::execute(): result: $result');
return Left<Failure, Success>(CheckOIDCIsAvailableFailure('aaaa'));
return Right<Failure, Success>(CheckOIDCIsAvailableSuccess(result));
} catch (e) {
log('CheckOIDCIsAvailableInteractor::execute(): ERROR: $e');
return Left<Failure, Success>(CheckOIDCIsAvailableFailure(e));
@@ -7,6 +7,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum MailboxActions {
create,
moveEmail,
select,
delete,
rename,
move,
@@ -21,6 +22,8 @@ extension MailboxActionsExtension on MailboxActions {
return AppLocalizations.of(context).mailbox_location;
case MailboxActions.moveEmail:
return AppLocalizations.of(context).move_message;
case MailboxActions.select:
return AppLocalizations.of(context).selectMailbox;
case MailboxActions.move:
return AppLocalizations.of(context).allMailboxes;
default:
@@ -4,15 +4,18 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.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/search_email_filter.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class AdvancedFilterController extends BaseController {
final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs;
final mailboxFilterSelectedFormAdvancedSearch = Rxn<PresentationMailbox>();
final hasAttachment = false.obs;
TextEditingController fromFilterInputController = TextEditingController();
@@ -34,34 +37,66 @@ class AdvancedFilterController extends BaseController {
cleanSearchFilter() {
_searchController.cleanSearchFilter();
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
fromFilterInputController.text = '';
toFilterInputController.text = '';
subjectFilterInputController.text = '';
hasKeyWordFilterInputController.text = '';
notKeyWordFilterInputController.text = '';
dateFilterInputController.text = '';
hasAttachment.value = false;
_searchController.isAdvancedSearchHasApply.isFalse;
_searchController.isAdvancedSearchViewOpen.toggle();
}
void _updateFilterEmailFromAdvancedSearchView() {
if (fromFilterInputController.text.isNotEmpty) {
_searchEmailFilter.from.add(fromFilterInputController.text);
_searchController.updateFilterEmail(from: fromFilterInputController.text.split(',').toSet());
}
if (toFilterInputController.text.isNotEmpty) {
_searchEmailFilter.to.add(toFilterInputController.text);
_searchController.updateFilterEmail(to: toFilterInputController.text.split(',').toSet());
}
_searchController.searchEmailFilter.value = _searchEmailFilter.copyWith(
_searchController.updateFilterEmail(
subject: StringConvert.writeEmptyToNull(subjectFilterInputController.text),
hasKeyword: Wrapped.value(
StringConvert.writeEmptyToNull(hasKeyWordFilterInputController.text)),
notKeyword: Wrapped.value(
StringConvert.writeNullToEmpty(notKeyWordFilterInputController.text)),
mailbox: mailboxFilterSelectedFormAdvancedSearch.value,
StringConvert.writeEmptyToNull(notKeyWordFilterInputController.text)),
emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value,
hasAttachment: hasAttachment.value,
);
}
Future<void> selectedMailBox() async{
final PresentationMailbox destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments(_mailboxDashBoardController.accountId.value!, MailboxActions.moveEmail));
_searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
}
applyAdvancedSearchFilter(BuildContext context){
_updateFilterEmailFromAdvancedSearchView();
_mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(_searchEmailFilter.text?.value));
_searchController.isAdvancedSearchViewOpen.toggle();
_searchController.isAdvancedSearchHasApply.value = _checkAdvancedSearchHasApply();
}
bool _checkAdvancedSearchHasApply() {
return fromFilterInputController.text.isNotEmpty ||
toFilterInputController.text.isNotEmpty ||
subjectFilterInputController.text.isNotEmpty ||
hasKeyWordFilterInputController.text.isNotEmpty ||
notKeyWordFilterInputController.text.isNotEmpty ||
dateFilterInputController.text.isNotEmpty ||
mailBoxFilterInputController.text.isNotEmpty ||
hasAttachment.isFalse;
}
initSearchFilterField(BuildContext context) {
fromFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.from.firstOrNull);
_searchController.updateFilterEmail(mailbox: _mailboxDashBoardController.selectedMailbox.value);
fromFilterInputController.text = StringConvert.writeNullToEmpty(_searchController.searchEmailFilter.value.from.firstOrNull);
toFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.to.firstOrNull);
subjectFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.subject);
hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.hasKeyword);
@@ -69,18 +104,15 @@ class AdvancedFilterController extends BaseController {
dateFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.emailReceiveTimeType.getTitle(context));
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.mailbox?.name?.name);
dateFilterSelectedFormAdvancedSearch.value = _searchEmailFilter.emailReceiveTimeType;
mailboxFilterSelectedFormAdvancedSearch.value = _searchEmailFilter.mailbox;
hasAttachment.value = _searchEmailFilter.hasAttachment;
}
@override
void onDone() {
// TODO: implement onDone
}
@override
void onError(error) {
// TODO: implement onError
}
@override
@@ -243,6 +243,7 @@ class MailboxDashBoardController extends ReloadableController {
void setNewFirstSelectedMailbox(PresentationMailbox? newPresentationMailbox) {
selectedMailbox.firstRebuild = true;
selectedMailbox.value = newPresentationMailbox;
}
void setSelectedEmail(PresentationEmail? newPresentationEmail) {
@@ -38,6 +38,7 @@ class SearchController extends BaseController {
final accountId = Rxn<AccountId>();
final userProfile = Rxn<UserProfile>();
final isAdvancedSearchViewOpen = false.obs;
final isAdvancedSearchHasApply = false.obs;
final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs;
final mailboxFilterSelectedFormAdvancedSearch = Rxn<PresentationMailbox>();
final hasAttachment = false.obs;
@@ -144,11 +145,11 @@ class SearchController extends BaseController {
searchFocus.addListener(() {
final hasFocus = searchFocus.hasFocus;
final query = searchEmailFilter.value.text?.value;
log('MailboxDashBoardController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query');
if (!hasFocus && (query == null || query.isEmpty)) {
log('SearchController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query');
if (!hasFocus && (query == null || query.isEmpty) && isAdvancedSearchHasApply.isFalse) {
updateFilterEmail(text: SearchQuery.initial());
searchInputController.clear();
cleanSearchFilter();
cleanSearchFilter();
searchFocus.unfocus();
}
});
@@ -165,7 +166,6 @@ class SearchController extends BaseController {
searchState.value = searchState.value.disableSearchState();
updateFilterEmail(text: SearchQuery.initial());
searchInputController.clear();
cleanSearchFilter();
searchFocus.unfocus();
}
@@ -433,6 +433,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
textFieldConfiguration: QuickSearchTextFieldConfiguration(
controller: controller.searchController.searchInputController,
autofocus: true,
enabled: controller.searchController.isAdvancedSearchViewOpen.isFalse,
focusNode: controller.searchController.searchFocus,
textInputAction: TextInputAction.done,
onSubmitted: (keyword) {
@@ -20,7 +20,6 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
@override
Widget build(BuildContext context) {
controller.initSearchFilterField(context);
return Material(
color: Colors.white,
child: Column(
@@ -55,6 +54,9 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
context: context,
advancedSearchFilterField: AdvancedSearchFilterField.mailBox,
isSelectFormList: true,
onTap: () async {
await controller.selectedMailBox();
}
),
_buildFilterField(
textEditingController: controller.dateFilterInputController,
@@ -31,6 +31,7 @@ class AdvancedSearchFilterFormBottomView
_buildButton(
onAction: () {
controller.cleanSearchFilter();
popBack();
},
colorButton: AppColor.primaryColor.withOpacity(0.14),
colorText: AppColor.primaryColor,
@@ -25,16 +25,6 @@ class DateDropDownButton extends GetWidget<AdvancedFilterController> {
}
}
class MailBoxDropDownButton extends StatelessWidget {
const MailBoxDropDownButton({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container();
}
}
Widget _buildDropDownButton<T>({
required List<T> items,
required T itemSelected,
@@ -4,6 +4,7 @@ import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
class IconOpenAdvancedSearchWidget extends StatelessWidget {
@@ -13,7 +14,8 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
}) : super(key: key);
final _imagePaths = Get.find<ImagePaths>();
final controller = Get.find<SearchController>();
final SearchController searchController = Get.find<SearchController>();
final AdvancedFilterController advancedFilterController = Get.find<AdvancedFilterController>();
final BuildContext _parentContext;
@override
@@ -23,13 +25,16 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
minSize: 0,
iconPadding: const EdgeInsets.only(right: 8),
icon: SvgPicture.asset(_imagePaths.icFilterAdvanced,
color: controller.isAdvancedSearchViewOpen.isTrue
color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.isAdvancedSearchHasApply.isTrue
? AppColor.colorFilterMessageEnabled
: AppColor.colorFilterMessageDisabled,
width: 16,
height: 16),
onTap: () {
controller.showAdvancedFilterView(_parentContext);
if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.isAdvancedSearchHasApply.isFalse){
advancedFilterController.initSearchFilterField(context);
}
searchController.showAdvancedFilterView(_parentContext);
}),
);
}
@@ -820,7 +820,9 @@ class ThreadController extends BaseController {
if (_accountId != null && searchQuery != null) {
searchIsActive.value = true;
searchController.updateFilterEmail(mailbox: currentMailbox);
if(searchController.isAdvancedSearchHasApply.isFalse){
searchController.updateFilterEmail(mailbox: currentMailbox);
}
consumeState(_searchEmailInteractor.execute(
_accountId!,
@@ -200,6 +200,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
textFieldConfiguration: QuickSearchTextFieldConfiguration(
controller: controller.searchController.searchInputController,
autofocus: true,
enabled: controller.searchController.isAdvancedSearchViewOpen.isFalse,
focusNode: controller.searchController.searchFocus,
textInputAction: TextInputAction.done,
onSubmitted: (keyword) {
+7 -1
View File
@@ -1,5 +1,5 @@
{
"@@last_modified": "2022-06-25T22:39:15.113430",
"@@last_modified": "2022-06-26T22:28:09.520951",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
@@ -1495,5 +1495,11 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"selectMailbox": "Select Mailbox",
"@selectMailbox": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
}
}
@@ -1538,4 +1538,11 @@ class AppLocalizations {
name: 'advancedSearch',
);
}
String get selectMailbox {
return Intl.message(
'Select Mailbox',
name: 'selectMailbox',
);
}
}