add advanced search filter by mailbox
This commit is contained in:
@@ -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:
|
||||
|
||||
+42
-10
@@ -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
|
||||
|
||||
+1
@@ -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) {
|
||||
|
||||
+3
-1
@@ -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,
|
||||
|
||||
+1
@@ -31,6 +31,7 @@ class AdvancedSearchFilterFormBottomView
|
||||
_buildButton(
|
||||
onAction: () {
|
||||
controller.cleanSearchFilter();
|
||||
popBack();
|
||||
},
|
||||
colorButton: AppColor.primaryColor.withOpacity(0.14),
|
||||
colorText: AppColor.primaryColor,
|
||||
|
||||
-10
@@ -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,
|
||||
|
||||
+8
-3
@@ -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) {
|
||||
|
||||
@@ -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',
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user