TF-1155 Automatically collapsed and created tags when fields lose focus
Signed-off-by: dab246 <tdvu@linagora.com> (cherry picked from commit 6c2ffefca87d26b115bae628e48a0ed356de6b33)
This commit is contained in:
+44
-57
@@ -52,7 +52,6 @@ class AdvancedFilterController extends BaseController {
|
|||||||
|
|
||||||
TextEditingController fromEmailAddressController = TextEditingController();
|
TextEditingController fromEmailAddressController = TextEditingController();
|
||||||
TextEditingController toEmailAddressController = TextEditingController();
|
TextEditingController toEmailAddressController = TextEditingController();
|
||||||
|
|
||||||
TextEditingController subjectFilterInputController = TextEditingController();
|
TextEditingController subjectFilterInputController = TextEditingController();
|
||||||
TextEditingController hasKeyWordFilterInputController = TextEditingController();
|
TextEditingController hasKeyWordFilterInputController = TextEditingController();
|
||||||
TextEditingController notKeyWordFilterInputController = TextEditingController();
|
TextEditingController notKeyWordFilterInputController = TextEditingController();
|
||||||
@@ -74,6 +73,7 @@ class AdvancedFilterController extends BaseController {
|
|||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
_registerWorkerListener();
|
_registerWorkerListener();
|
||||||
|
_registerFocusListener();
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,22 +311,25 @@ class AdvancedFilterController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onEmailAddressFocusChange(AdvancedSearchFilterField field, bool hasFocus) {
|
void _onFromFieldFocusChange() {
|
||||||
if (hasFocus) {
|
if (focusManager.fromFieldFocusNode.hasFocus) {
|
||||||
switch(field) {
|
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
case AdvancedSearchFilterField.form:
|
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
|
||||||
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
|
||||||
break;
|
|
||||||
case AdvancedSearchFilterField.to:
|
|
||||||
fromAddressExpandMode.value = ExpandMode.COLLAPSE;
|
|
||||||
toAddressExpandMode.value = ExpandMode.EXPAND;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
_closeSuggestionBox();
|
_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) {
|
void showFullEmailAddress(AdvancedSearchFilterField field) {
|
||||||
switch(field) {
|
switch(field) {
|
||||||
case AdvancedSearchFilterField.form:
|
case AdvancedSearchFilterField.from:
|
||||||
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
focusManager.fromFieldFocusNode.requestFocus();
|
focusManager.fromFieldFocusNode.requestFocus();
|
||||||
@@ -364,7 +367,7 @@ class AdvancedFilterController extends BaseController {
|
|||||||
List<EmailAddress> listEmailAddress,
|
List<EmailAddress> listEmailAddress,
|
||||||
) {
|
) {
|
||||||
switch(field) {
|
switch(field) {
|
||||||
case AdvancedSearchFilterField.form:
|
case AdvancedSearchFilterField.from:
|
||||||
listFromEmailAddress = List.from(listEmailAddress);
|
listFromEmailAddress = List.from(listEmailAddress);
|
||||||
searchEmailFilter.from.addAll(listEmailAddress.map((emailAddress) => emailAddress.emailAddress));
|
searchEmailFilter.from.addAll(listEmailAddress.map((emailAddress) => emailAddress.emailAddress));
|
||||||
break;
|
break;
|
||||||
@@ -384,12 +387,15 @@ class AdvancedFilterController extends BaseController {
|
|||||||
.contains(inputEmail);
|
.contains(inputEmail);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _autoCreateFromEmailTag(String inputEmail) {
|
void _autoCreateTagFromField() {
|
||||||
|
final inputEmail = fromEmailAddressController.text;
|
||||||
|
if (inputEmail.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_isDuplicatedEmailAddress(inputEmail, listFromEmailAddress)) {
|
if (!_isDuplicatedEmailAddress(inputEmail, listFromEmailAddress)) {
|
||||||
final emailAddress = EmailAddress(null, inputEmail);
|
final emailAddress = EmailAddress(null, inputEmail);
|
||||||
listFromEmailAddress.add(emailAddress);
|
listFromEmailAddress.add(emailAddress);
|
||||||
|
|
||||||
log('AdvancedFilterController::_autoCreateFromEmailTag(): STATE: ${keyFromEmailTagEditor.currentState}');
|
|
||||||
keyFromEmailTagEditor.currentState?.resetTextField();
|
keyFromEmailTagEditor.currentState?.resetTextField();
|
||||||
Future.delayed(const Duration(milliseconds: 300), () {
|
Future.delayed(const Duration(milliseconds: 300), () {
|
||||||
keyFromEmailTagEditor.currentState?.closeSuggestionBox();
|
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)) {
|
if (!_isDuplicatedEmailAddress(inputEmail, listToEmailAddress)) {
|
||||||
final emailAddress = EmailAddress(null, inputEmail);
|
final emailAddress = EmailAddress(null, inputEmail);
|
||||||
listToEmailAddress.add(emailAddress);
|
listToEmailAddress.add(emailAddress);
|
||||||
|
|
||||||
log('AdvancedFilterController::_autoCreateToEmailTag(): STATE: ${keyToEmailTagEditor.currentState}');
|
|
||||||
keyToEmailTagEditor.currentState?.resetTextField();
|
keyToEmailTagEditor.currentState?.resetTextField();
|
||||||
Future.delayed(const Duration(milliseconds: 300), () {
|
Future.delayed(const Duration(milliseconds: 300), () {
|
||||||
keyToEmailTagEditor.currentState?.closeSuggestionBox();
|
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() {
|
void _resetAllToOriginalValue() {
|
||||||
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
|
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
|
||||||
hasAttachment.value = false;
|
hasAttachment.value = false;
|
||||||
@@ -480,10 +456,20 @@ class AdvancedFilterController extends BaseController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _registerFocusListener() {
|
||||||
|
focusManager.fromFieldFocusNode.addListener(_onFromFieldFocusChange);
|
||||||
|
focusManager.toFieldFocusNode.addListener(_onToFieldFocusChange);
|
||||||
|
}
|
||||||
|
|
||||||
void _unregisterWorkerListener() {
|
void _unregisterWorkerListener() {
|
||||||
_dashboardActionWorker.dispose();
|
_dashboardActionWorker.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _removeFocusListener() {
|
||||||
|
focusManager.fromFieldFocusNode.removeListener(_onFromFieldFocusChange);
|
||||||
|
focusManager.toFieldFocusNode.removeListener(_onToFieldFocusChange);
|
||||||
|
}
|
||||||
|
|
||||||
void _handleClearAllFieldOfAdvancedSearch() {
|
void _handleClearAllFieldOfAdvancedSearch() {
|
||||||
_resetAllToOriginalValue();
|
_resetAllToOriginalValue();
|
||||||
_clearAllTextFieldInput();
|
_clearAllTextFieldInput();
|
||||||
@@ -491,6 +477,7 @@ class AdvancedFilterController extends BaseController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
|
_removeFocusListener();
|
||||||
focusManager.dispose();
|
focusManager.dispose();
|
||||||
subjectFilterInputController.dispose();
|
subjectFilterInputController.dispose();
|
||||||
hasKeyWordFilterInputController.dispose();
|
hasKeyWordFilterInputController.dispose();
|
||||||
|
|||||||
+3
-3
@@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
enum AdvancedSearchFilterField {
|
enum AdvancedSearchFilterField {
|
||||||
form,
|
from,
|
||||||
to,
|
to,
|
||||||
subject,
|
subject,
|
||||||
hasKeyword,
|
hasKeyword,
|
||||||
@@ -14,7 +14,7 @@ enum AdvancedSearchFilterField {
|
|||||||
|
|
||||||
String getTitle(BuildContext context) {
|
String getTitle(BuildContext context) {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case AdvancedSearchFilterField.form:
|
case AdvancedSearchFilterField.from:
|
||||||
return AppLocalizations.of(context).form;
|
return AppLocalizations.of(context).form;
|
||||||
case AdvancedSearchFilterField.to:
|
case AdvancedSearchFilterField.to:
|
||||||
return AppLocalizations.of(context).to;
|
return AppLocalizations.of(context).to;
|
||||||
@@ -35,7 +35,7 @@ enum AdvancedSearchFilterField {
|
|||||||
|
|
||||||
String getHintText(BuildContext context) {
|
String getHintText(BuildContext context) {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case AdvancedSearchFilterField.form:
|
case AdvancedSearchFilterField.from:
|
||||||
case AdvancedSearchFilterField.to:
|
case AdvancedSearchFilterField.to:
|
||||||
return AppLocalizations.of(context).nameOrEmailAddress;
|
return AppLocalizations.of(context).nameOrEmailAddress;
|
||||||
case AdvancedSearchFilterField.subject:
|
case AdvancedSearchFilterField.subject:
|
||||||
|
|||||||
+1
-3
@@ -30,7 +30,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
child: Obx(() => Column(
|
child: Obx(() => Column(
|
||||||
children: [
|
children: [
|
||||||
TextFieldAutocompleteEmailAddressWeb(
|
TextFieldAutocompleteEmailAddressWeb(
|
||||||
field: AdvancedSearchFilterField.form,
|
field: AdvancedSearchFilterField.from,
|
||||||
listEmailAddress: controller.listFromEmailAddress,
|
listEmailAddress: controller.listFromEmailAddress,
|
||||||
expandMode: controller.fromAddressExpandMode.value,
|
expandMode: controller.fromAddressExpandMode.value,
|
||||||
controller: controller.fromEmailAddressController,
|
controller: controller.fromEmailAddressController,
|
||||||
@@ -40,7 +40,6 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
||||||
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
||||||
onSuggestionEmailAddress: controller.getAutoCompleteSuggestion,
|
onSuggestionEmailAddress: controller.getAutoCompleteSuggestion,
|
||||||
onRemoveEmailAddressAction: controller.removeEmailAddress,
|
|
||||||
),
|
),
|
||||||
TextFieldAutocompleteEmailAddressWeb(
|
TextFieldAutocompleteEmailAddressWeb(
|
||||||
field: AdvancedSearchFilterField.to,
|
field: AdvancedSearchFilterField.to,
|
||||||
@@ -53,7 +52,6 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
||||||
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
||||||
onSuggestionEmailAddress: controller.getAutoCompleteSuggestion,
|
onSuggestionEmailAddress: controller.getAutoCompleteSuggestion,
|
||||||
onRemoveEmailAddressAction: controller.removeEmailAddress,
|
|
||||||
),
|
),
|
||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
textEditingController: controller.subjectFilterInputController,
|
textEditingController: controller.subjectFilterInputController,
|
||||||
|
|||||||
+1
-4
@@ -21,7 +21,6 @@ typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String wo
|
|||||||
typedef OnUpdateListEmailAddressAction = void Function(AdvancedSearchFilterField field, List<EmailAddress> newData);
|
typedef OnUpdateListEmailAddressAction = void Function(AdvancedSearchFilterField field, List<EmailAddress> newData);
|
||||||
typedef OnDeleteEmailAddressTypeAction = void Function(AdvancedSearchFilterField field);
|
typedef OnDeleteEmailAddressTypeAction = void Function(AdvancedSearchFilterField field);
|
||||||
typedef OnShowFullListEmailAddressAction = void Function(AdvancedSearchFilterField field);
|
typedef OnShowFullListEmailAddressAction = void Function(AdvancedSearchFilterField field);
|
||||||
typedef OnRemoveEmailAddressAction = void Function(EmailAddress emailAddress, AdvancedSearchFilterField field);
|
|
||||||
typedef OnDeleteTagAction = void Function(EmailAddress emailAddress);
|
typedef OnDeleteTagAction = void Function(EmailAddress emailAddress);
|
||||||
|
|
||||||
class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
||||||
@@ -39,7 +38,6 @@ class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
|||||||
final OnUpdateListEmailAddressAction? onUpdateListEmailAddressAction;
|
final OnUpdateListEmailAddressAction? onUpdateListEmailAddressAction;
|
||||||
final OnDeleteEmailAddressTypeAction? onDeleteEmailAddressTypeAction;
|
final OnDeleteEmailAddressTypeAction? onDeleteEmailAddressTypeAction;
|
||||||
final OnShowFullListEmailAddressAction? onShowFullListEmailAddressAction;
|
final OnShowFullListEmailAddressAction? onShowFullListEmailAddressAction;
|
||||||
final OnRemoveEmailAddressAction? onRemoveEmailAddressAction;
|
|
||||||
final TextEditingController? controller;
|
final TextEditingController? controller;
|
||||||
|
|
||||||
const TextFieldAutocompleteEmailAddressWeb({
|
const TextFieldAutocompleteEmailAddressWeb({
|
||||||
@@ -57,7 +55,6 @@ class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
|||||||
this.onUpdateListEmailAddressAction,
|
this.onUpdateListEmailAddressAction,
|
||||||
this.onDeleteEmailAddressTypeAction,
|
this.onDeleteEmailAddressTypeAction,
|
||||||
this.onShowFullListEmailAddressAction,
|
this.onShowFullListEmailAddressAction,
|
||||||
this.onRemoveEmailAddressAction,
|
|
||||||
this.controller,
|
this.controller,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@@ -113,7 +110,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
textInputAction: TextInputAction.done,
|
textInputAction: TextInputAction.done,
|
||||||
debounceDuration: TextFieldAutoCompleteEmailAddressWebStyles.debounceDuration,
|
debounceDuration: TextFieldAutoCompleteEmailAddressWebStyles.debounceDuration,
|
||||||
hasAddButton: false,
|
hasAddButton: false,
|
||||||
autofocus: widget.field == AdvancedSearchFilterField.form && _currentListEmailAddress.isEmpty,
|
autofocus: widget.field == AdvancedSearchFilterField.from && _currentListEmailAddress.isEmpty,
|
||||||
inputDecoration: InputDecoration(
|
inputDecoration: InputDecoration(
|
||||||
filled: true,
|
filled: true,
|
||||||
fillColor: TextFieldAutoCompleteEmailAddressWebStyles.textInputFillColor,
|
fillColor: TextFieldAutoCompleteEmailAddressWebStyles.textInputFillColor,
|
||||||
|
|||||||
Reference in New Issue
Block a user