From a0fede7b8f812e10c4ed90028acabaf4275e27a1 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 8 Nov 2023 13:50:49 +0700 Subject: [PATCH] TF-1155 Automatically collapsed and created tags when fields lose focus Signed-off-by: dab246 (cherry picked from commit 6c2ffefca87d26b115bae628e48a0ed356de6b33) --- .../advanced_filter_controller.dart | 101 ++++++++---------- .../model/search/advanced_search_filter.dart | 6 +- .../advanced_search_input_form.dart | 4 +- ..._field_autocomplete_email_address_web.dart | 5 +- 4 files changed, 49 insertions(+), 67 deletions(-) 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 db1fc0400..b537e0179 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -52,7 +52,6 @@ class AdvancedFilterController extends BaseController { TextEditingController fromEmailAddressController = TextEditingController(); TextEditingController toEmailAddressController = TextEditingController(); - TextEditingController subjectFilterInputController = TextEditingController(); TextEditingController hasKeyWordFilterInputController = TextEditingController(); TextEditingController notKeyWordFilterInputController = TextEditingController(); @@ -74,6 +73,7 @@ class AdvancedFilterController extends BaseController { @override void onInit() { _registerWorkerListener(); + _registerFocusListener(); super.onInit(); } @@ -311,22 +311,25 @@ class AdvancedFilterController extends BaseController { } } - void onEmailAddressFocusChange(AdvancedSearchFilterField field, bool hasFocus) { - if (hasFocus) { - switch(field) { - case AdvancedSearchFilterField.form: - fromAddressExpandMode.value = ExpandMode.EXPAND; - toAddressExpandMode.value = ExpandMode.COLLAPSE; - break; - case AdvancedSearchFilterField.to: - fromAddressExpandMode.value = ExpandMode.COLLAPSE; - toAddressExpandMode.value = ExpandMode.EXPAND; - break; - default: - break; - } - + void _onFromFieldFocusChange() { + if (focusManager.fromFieldFocusNode.hasFocus) { + fromAddressExpandMode.value = ExpandMode.EXPAND; + toAddressExpandMode.value = ExpandMode.COLLAPSE; _closeSuggestionBox(); + } else { + fromAddressExpandMode.value = ExpandMode.COLLAPSE; + _autoCreateTagFromField(); + } + } + + void _onToFieldFocusChange() { + if (focusManager.toFieldFocusNode.hasFocus) { + toAddressExpandMode.value = ExpandMode.EXPAND; + fromAddressExpandMode.value = ExpandMode.COLLAPSE; + _closeSuggestionBox(); + } else { + toAddressExpandMode.value = ExpandMode.COLLAPSE; + _autoCreateTagToField(); } } @@ -342,7 +345,7 @@ class AdvancedFilterController extends BaseController { void showFullEmailAddress(AdvancedSearchFilterField field) { switch(field) { - case AdvancedSearchFilterField.form: + case AdvancedSearchFilterField.from: fromAddressExpandMode.value = ExpandMode.EXPAND; toAddressExpandMode.value = ExpandMode.COLLAPSE; focusManager.fromFieldFocusNode.requestFocus(); @@ -364,7 +367,7 @@ class AdvancedFilterController extends BaseController { List listEmailAddress, ) { switch(field) { - case AdvancedSearchFilterField.form: + case AdvancedSearchFilterField.from: listFromEmailAddress = List.from(listEmailAddress); searchEmailFilter.from.addAll(listEmailAddress.map((emailAddress) => emailAddress.emailAddress)); break; @@ -384,12 +387,15 @@ class AdvancedFilterController extends BaseController { .contains(inputEmail); } - void _autoCreateFromEmailTag(String inputEmail) { + void _autoCreateTagFromField() { + final inputEmail = fromEmailAddressController.text; + if (inputEmail.isEmpty) { + return; + } + if (!_isDuplicatedEmailAddress(inputEmail, listFromEmailAddress)) { final emailAddress = EmailAddress(null, inputEmail); listFromEmailAddress.add(emailAddress); - - log('AdvancedFilterController::_autoCreateFromEmailTag(): STATE: ${keyFromEmailTagEditor.currentState}'); keyFromEmailTagEditor.currentState?.resetTextField(); Future.delayed(const Duration(milliseconds: 300), () { keyFromEmailTagEditor.currentState?.closeSuggestionBox(); @@ -397,12 +403,15 @@ class AdvancedFilterController extends BaseController { } } - void _autoCreateToEmailTag(String inputEmail) { + void _autoCreateTagToField() { + final inputEmail = toEmailAddressController.text; + if (inputEmail.isEmpty) { + return; + } + if (!_isDuplicatedEmailAddress(inputEmail, listToEmailAddress)) { final emailAddress = EmailAddress(null, inputEmail); listToEmailAddress.add(emailAddress); - - log('AdvancedFilterController::_autoCreateToEmailTag(): STATE: ${keyToEmailTagEditor.currentState}'); keyToEmailTagEditor.currentState?.resetTextField(); Future.delayed(const Duration(milliseconds: 300), () { keyToEmailTagEditor.currentState?.closeSuggestionBox(); @@ -410,39 +419,6 @@ class AdvancedFilterController extends BaseController { } } - void _autoCreateEmailTag() { - final inputFromEmail = fromEmailAddressController.text; - final inputToEmail = toEmailAddressController.text; - - if (inputFromEmail.isNotEmpty) { - _autoCreateFromEmailTag(inputFromEmail); - } - - if (inputToEmail.isNotEmpty) { - _autoCreateToEmailTag(inputToEmail); - } - } - - void handleFocusNextAddressAction() { - _autoCreateEmailTag(); - } - - void removeEmailAddress(EmailAddress emailAddress, AdvancedSearchFilterField field) { - log('AdvancedFilterController::removeEMailAddress: $emailAddress - $field'); - switch(field) { - case AdvancedSearchFilterField.form: - listFromEmailAddress.remove(emailAddress); - fromAddressExpandMode.value = ExpandMode.EXPAND; - break; - case AdvancedSearchFilterField.to: - listToEmailAddress.remove(emailAddress); - toAddressExpandMode.value = ExpandMode.EXPAND; - break; - default: - break; - } - } - void _resetAllToOriginalValue() { dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime; hasAttachment.value = false; @@ -480,10 +456,20 @@ class AdvancedFilterController extends BaseController { ); } + void _registerFocusListener() { + focusManager.fromFieldFocusNode.addListener(_onFromFieldFocusChange); + focusManager.toFieldFocusNode.addListener(_onToFieldFocusChange); + } + void _unregisterWorkerListener() { _dashboardActionWorker.dispose(); } + void _removeFocusListener() { + focusManager.fromFieldFocusNode.removeListener(_onFromFieldFocusChange); + focusManager.toFieldFocusNode.removeListener(_onToFieldFocusChange); + } + void _handleClearAllFieldOfAdvancedSearch() { _resetAllToOriginalValue(); _clearAllTextFieldInput(); @@ -491,6 +477,7 @@ class AdvancedFilterController extends BaseController { @override void onClose() { + _removeFocusListener(); focusManager.dispose(); subjectFilterInputController.dispose(); hasKeyWordFilterInputController.dispose(); diff --git a/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart b/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart index dfdbebc52..d6d4b1b84 100644 --- a/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart +++ b/lib/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart @@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; enum AdvancedSearchFilterField { - form, + from, to, subject, hasKeyword, @@ -14,7 +14,7 @@ enum AdvancedSearchFilterField { String getTitle(BuildContext context) { switch (this) { - case AdvancedSearchFilterField.form: + case AdvancedSearchFilterField.from: return AppLocalizations.of(context).form; case AdvancedSearchFilterField.to: return AppLocalizations.of(context).to; @@ -35,7 +35,7 @@ enum AdvancedSearchFilterField { String getHintText(BuildContext context) { switch (this) { - case AdvancedSearchFilterField.form: + case AdvancedSearchFilterField.from: case AdvancedSearchFilterField.to: return AppLocalizations.of(context).nameOrEmailAddress; case AdvancedSearchFilterField.subject: diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_input_form.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_input_form.dart index 25da41a30..4986316b0 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_input_form.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_input_form.dart @@ -30,7 +30,7 @@ class AdvancedSearchInputForm extends GetWidget child: Obx(() => Column( children: [ TextFieldAutocompleteEmailAddressWeb( - field: AdvancedSearchFilterField.form, + field: AdvancedSearchFilterField.from, listEmailAddress: controller.listFromEmailAddress, expandMode: controller.fromAddressExpandMode.value, controller: controller.fromEmailAddressController, @@ -40,7 +40,6 @@ class AdvancedSearchInputForm extends GetWidget onShowFullListEmailAddressAction: controller.showFullEmailAddress, onUpdateListEmailAddressAction: controller.updateListEmailAddress, onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onRemoveEmailAddressAction: controller.removeEmailAddress, ), TextFieldAutocompleteEmailAddressWeb( field: AdvancedSearchFilterField.to, @@ -53,7 +52,6 @@ class AdvancedSearchInputForm extends GetWidget onShowFullListEmailAddressAction: controller.showFullEmailAddress, onUpdateListEmailAddressAction: controller.updateListEmailAddress, onSuggestionEmailAddress: controller.getAutoCompleteSuggestion, - onRemoveEmailAddressAction: controller.removeEmailAddress, ), _buildFilterField( textEditingController: controller.subjectFilterInputController, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart index 0d2f4fad9..b0263275a 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart @@ -21,7 +21,6 @@ typedef OnSuggestionEmailAddress = Future> Function(String wo typedef OnUpdateListEmailAddressAction = void Function(AdvancedSearchFilterField field, List newData); typedef OnDeleteEmailAddressTypeAction = void Function(AdvancedSearchFilterField field); typedef OnShowFullListEmailAddressAction = void Function(AdvancedSearchFilterField field); -typedef OnRemoveEmailAddressAction = void Function(EmailAddress emailAddress, AdvancedSearchFilterField field); typedef OnDeleteTagAction = void Function(EmailAddress emailAddress); class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget { @@ -39,7 +38,6 @@ class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget { final OnUpdateListEmailAddressAction? onUpdateListEmailAddressAction; final OnDeleteEmailAddressTypeAction? onDeleteEmailAddressTypeAction; final OnShowFullListEmailAddressAction? onShowFullListEmailAddressAction; - final OnRemoveEmailAddressAction? onRemoveEmailAddressAction; final TextEditingController? controller; const TextFieldAutocompleteEmailAddressWeb({ @@ -57,7 +55,6 @@ class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget { this.onUpdateListEmailAddressAction, this.onDeleteEmailAddressTypeAction, this.onShowFullListEmailAddressAction, - this.onRemoveEmailAddressAction, this.controller, }) : super(key: key); @@ -113,7 +110,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State