TF-3226 Apply minInputLength on autocomplete capability to app
This commit is contained in:
@@ -124,6 +124,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
fromState: controller.fromRecipientState.value,
|
||||
ccState: controller.ccRecipientState.value,
|
||||
bccState: controller.bccRecipientState.value,
|
||||
@@ -150,6 +153,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listCcEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.ccAddressExpandMode.value,
|
||||
controller: controller.ccEmailAddressController,
|
||||
focusNode: controller.ccAddressFocusNode,
|
||||
@@ -176,6 +182,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listBccEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.bccAddressExpandMode.value,
|
||||
controller: controller.bccEmailAddressController,
|
||||
focusNode: controller.bccAddressFocusNode,
|
||||
@@ -280,6 +289,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
fromState: controller.fromRecipientState.value,
|
||||
ccState: controller.ccRecipientState.value,
|
||||
bccState: controller.bccRecipientState.value,
|
||||
@@ -305,6 +317,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listCcEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.ccAddressExpandMode.value,
|
||||
controller: controller.ccEmailAddressController,
|
||||
focusNode: controller.ccAddressFocusNode,
|
||||
@@ -326,6 +341,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listBccEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.bccAddressExpandMode.value,
|
||||
controller: controller.bccEmailAddressController,
|
||||
focusNode: controller.bccAddressFocusNode,
|
||||
|
||||
@@ -89,6 +89,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
fromState: controller.fromRecipientState.value,
|
||||
ccState: controller.ccRecipientState.value,
|
||||
bccState: controller.bccRecipientState.value,
|
||||
@@ -115,6 +118,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listCcEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.ccAddressExpandMode.value,
|
||||
controller: controller.ccEmailAddressController,
|
||||
focusNode: controller.ccAddressFocusNode,
|
||||
@@ -138,6 +144,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listBccEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.bccAddressExpandMode.value,
|
||||
controller: controller.bccEmailAddressController,
|
||||
focusNode: controller.bccAddressFocusNode,
|
||||
@@ -328,6 +337,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
fromState: controller.fromRecipientState.value,
|
||||
ccState: controller.ccRecipientState.value,
|
||||
bccState: controller.bccRecipientState.value,
|
||||
@@ -354,6 +366,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listCcEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.ccAddressExpandMode.value,
|
||||
controller: controller.ccEmailAddressController,
|
||||
focusNode: controller.ccAddressFocusNode,
|
||||
@@ -377,6 +392,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listBccEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.bccAddressExpandMode.value,
|
||||
controller: controller.bccEmailAddressController,
|
||||
focusNode: controller.bccAddressFocusNode,
|
||||
@@ -600,6 +618,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
fromState: controller.fromRecipientState.value,
|
||||
ccState: controller.ccRecipientState.value,
|
||||
bccState: controller.bccRecipientState.value,
|
||||
@@ -626,6 +647,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listCcEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.ccAddressExpandMode.value,
|
||||
controller: controller.ccEmailAddressController,
|
||||
focusNode: controller.ccAddressFocusNode,
|
||||
@@ -649,6 +673,9 @@ class ComposerView extends GetWidget<ComposerController> {
|
||||
listEmailAddress: controller.listBccEmailAddress,
|
||||
imagePaths: controller.imagePaths,
|
||||
maxWidth: constraints.maxWidth,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
expandMode: controller.bccAddressExpandMode.value,
|
||||
controller: controller.bccEmailAddressController,
|
||||
focusNode: controller.bccAddressFocusNode,
|
||||
|
||||
@@ -64,6 +64,7 @@ class RecipientComposerWidget extends StatefulWidget {
|
||||
final EdgeInsetsGeometry? margin;
|
||||
final OnEnableAllRecipientsInputAction? onEnableAllRecipientsInputAction;
|
||||
final bool isTestingForWeb;
|
||||
final int minInputLengthAutocomplete;
|
||||
|
||||
const RecipientComposerWidget({
|
||||
super.key,
|
||||
@@ -71,6 +72,7 @@ class RecipientComposerWidget extends StatefulWidget {
|
||||
required this.listEmailAddress,
|
||||
required this.imagePaths,
|
||||
required this.maxWidth,
|
||||
this.minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete,
|
||||
@visibleForTesting this.isTestingForWeb = false,
|
||||
this.ccState = PrefixRecipientState.disabled,
|
||||
this.bccState = PrefixRecipientState.disabled,
|
||||
@@ -410,10 +412,13 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
|
||||
}
|
||||
|
||||
final tmailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
||||
if (processedQuery.length >= AppConfig.limitCharToStartSearch &&
|
||||
if (processedQuery.length >= widget.minInputLengthAutocomplete &&
|
||||
widget.onSuggestionEmailAddress != null) {
|
||||
final listEmailAddress = await widget.onSuggestionEmailAddress!(processedQuery);
|
||||
final listSuggestionEmailAddress = listEmailAddress.map((emailAddress) => _toSuggestionEmailAddress(emailAddress, _currentListEmailAddress));
|
||||
final listSuggestionEmailAddress = listEmailAddress
|
||||
.map((emailAddress) => _toSuggestionEmailAddress(
|
||||
emailAddress,
|
||||
_currentListEmailAddress));
|
||||
tmailSuggestion.addAll(listSuggestionEmailAddress);
|
||||
}
|
||||
|
||||
|
||||
@@ -55,6 +55,8 @@ class ContactController extends BaseController with AutoCompleteResultMixin {
|
||||
VoidCallback? onDismissContactView;
|
||||
StreamSubscription<String>? _deBouncerTimeStreamSubscription;
|
||||
|
||||
late int _minInputLengthAutocomplete;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -79,6 +81,7 @@ class ContactController extends BaseController with AutoCompleteResultMixin {
|
||||
textInputSearchFocus.requestFocus();
|
||||
}
|
||||
}
|
||||
_minInputLengthAutocomplete = _fetchMinInputLengthAutocomplete();
|
||||
if (PlatformInfo.isMobile) {
|
||||
Future.delayed(
|
||||
const Duration(milliseconds: 500),
|
||||
@@ -95,6 +98,7 @@ class ContactController extends BaseController with AutoCompleteResultMixin {
|
||||
textInputSearchController.dispose();
|
||||
_deBouncerTimeStreamSubscription?.cancel();
|
||||
_deBouncerTime.cancel();
|
||||
_accountId = null;
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
@@ -115,7 +119,7 @@ class ContactController extends BaseController with AutoCompleteResultMixin {
|
||||
Future<void> _handleDeBounceTimeSearchContact(String value) async {
|
||||
final queryStringTrimmed = value.trim();
|
||||
|
||||
if (queryStringTrimmed.length < AppConfig.limitCharToStartSearch) {
|
||||
if (queryStringTrimmed.length < _minInputLengthAutocomplete) {
|
||||
searchStatus.value = SearchStatus.INACTIVE;
|
||||
return;
|
||||
}
|
||||
@@ -235,4 +239,13 @@ class ContactController extends BaseController with AutoCompleteResultMixin {
|
||||
FocusManager.instance.primaryFocus?.unfocus();
|
||||
searchStatus.value = SearchStatus.INACTIVE;
|
||||
}
|
||||
|
||||
int _fetchMinInputLengthAutocomplete() {
|
||||
if (contactArguments.value?.session == null || _accountId == null) {
|
||||
return AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
return getMinInputLengthAutocomplete(
|
||||
session: contactArguments.value!.session,
|
||||
accountId: _accountId!);
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_r
|
||||
import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_time_type.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
|
||||
class EmailRecoveryController extends BaseController with DateRangePickerMixin {
|
||||
GetAllAutoCompleteInteractor? _getAllAutoCompleteInteractor;
|
||||
@@ -87,6 +88,15 @@ class EmailRecoveryController extends BaseController with DateRangePickerMixin {
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
int get minInputLengthAutocomplete {
|
||||
if (_session == null || _accountId == null) {
|
||||
return AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
return getMinInputLengthAutocomplete(
|
||||
session: _session!,
|
||||
accountId: _accountId!);
|
||||
}
|
||||
|
||||
void _checkContactPermission() async {
|
||||
final permissionStatus = await Permission.contacts.status;
|
||||
if (permissionStatus.isGranted) {
|
||||
|
||||
+2
@@ -75,6 +75,7 @@ class EmailRecoveryFormDesktopBuilder extends GetWidget<EmailRecoveryController>
|
||||
listEmailAddress: controller.listRecipients,
|
||||
responsiveUtils: controller.responsiveUtils,
|
||||
expandMode: controller.recipientsExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.recipientsFieldInputController,
|
||||
focusNode: controller.focusManager.recipientsFieldFocusNode,
|
||||
nextFocusNode: controller.listSenders.length != 1
|
||||
@@ -90,6 +91,7 @@ class EmailRecoveryFormDesktopBuilder extends GetWidget<EmailRecoveryController>
|
||||
listEmailAddress: controller.listSenders,
|
||||
responsiveUtils: controller.responsiveUtils,
|
||||
expandMode: controller.senderExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.senderFieldInputController,
|
||||
focusNode: controller.focusManager.senderFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||
|
||||
+2
@@ -73,6 +73,7 @@ class EmailRecoveryFormMobileBuilder extends GetWidget<EmailRecoveryController>
|
||||
focusNode: controller.focusManager.recipientsFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.senderFieldFocusNode,
|
||||
expandMode: controller.recipientsExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.recipientsFieldInputController,
|
||||
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
||||
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
||||
@@ -86,6 +87,7 @@ class EmailRecoveryFormMobileBuilder extends GetWidget<EmailRecoveryController>
|
||||
focusNode: controller.focusManager.senderFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||
expandMode: controller.senderExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.senderFieldInputController,
|
||||
onShowFullListEmailAddressAction: controller.showFullEmailAddress,
|
||||
onUpdateListEmailAddressAction: controller.updateListEmailAddress,
|
||||
|
||||
+2
@@ -75,6 +75,7 @@ class EmailRecoveryFormTabletBuilder extends GetWidget<EmailRecoveryController>
|
||||
listEmailAddress: controller.listRecipients,
|
||||
responsiveUtils: controller.responsiveUtils,
|
||||
expandMode: controller.recipientsExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.recipientsFieldInputController,
|
||||
focusNode: controller.focusManager.recipientsFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.senderFieldFocusNode,
|
||||
@@ -88,6 +89,7 @@ class EmailRecoveryFormTabletBuilder extends GetWidget<EmailRecoveryController>
|
||||
listEmailAddress: controller.listSenders,
|
||||
responsiveUtils: controller.responsiveUtils,
|
||||
expandMode: controller.senderExpandMode.value,
|
||||
minInputLengthAutocomplete: controller.minInputLengthAutocomplete,
|
||||
textEditingController: controller.senderFieldInputController,
|
||||
focusNode: controller.focusManager.senderFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||
|
||||
+3
-1
@@ -40,6 +40,7 @@ class TextInputFieldSuggestionWidget extends StatefulWidget {
|
||||
final OnDeleteTagAction? onDeleteTagAction;
|
||||
final TextEditingController? textEditingController;
|
||||
final VoidCallback? onCreateAction;
|
||||
final int minInputLengthAutocomplete;
|
||||
|
||||
const TextInputFieldSuggestionWidget({
|
||||
super.key,
|
||||
@@ -47,6 +48,7 @@ class TextInputFieldSuggestionWidget extends StatefulWidget {
|
||||
required this.listEmailAddress,
|
||||
required this.responsiveUtils,
|
||||
this.expandMode = ExpandMode.EXPAND,
|
||||
this.minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete,
|
||||
this.focusNode,
|
||||
this.keyTagEditor,
|
||||
this.nextFocusNode,
|
||||
@@ -325,7 +327,7 @@ class _TextInputFieldSuggestionWidgetState extends State<TextInputFieldSuggestio
|
||||
|
||||
final tmailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
||||
if (
|
||||
processedQuery.length >= AppConfig.limitCharToStartSearch
|
||||
processedQuery.length >= widget.minInputLengthAutocomplete
|
||||
&& widget.onSuggestionEmailAddress != null
|
||||
) {
|
||||
final listEmailAddress = await widget.onSuggestionEmailAddress!(processedQuery);
|
||||
|
||||
@@ -98,7 +98,6 @@ class AdvancedFilterController extends BaseController {
|
||||
_memorySearchFilter = searchFilter;
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
MailboxDashBoardController get mailboxDashBoardController => _mailboxDashBoardController;
|
||||
|
||||
void _updateMemorySearchFilter({
|
||||
|
||||
+14
@@ -160,6 +160,7 @@ import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||
import 'package:tmail_ui_user/main/universal_import/html_stub.dart' as html;
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
||||
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
@@ -2556,6 +2557,10 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
|
||||
return <EmailAddress>[];
|
||||
}
|
||||
|
||||
if (query.length < minInputLengthAutocomplete) {
|
||||
return <EmailAddress>[];
|
||||
}
|
||||
|
||||
final listEmailAddress = await _getAutoCompleteInteractor!
|
||||
.execute(AutoCompletePattern(word: query, accountId: accountId.value!, limit: 2))
|
||||
.then((value) => value.fold(
|
||||
@@ -2908,6 +2913,15 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
|
||||
dispatchAction(ClearSearchFilterAppliedAction());
|
||||
}
|
||||
|
||||
int get minInputLengthAutocomplete {
|
||||
if (sessionCurrent == null || accountId.value == null) {
|
||||
return AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
return getMinInputLengthAutocomplete(
|
||||
session: sessionCurrent!,
|
||||
accountId: accountId.value!);
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
if (PlatformInfo.isWeb) {
|
||||
|
||||
+6
@@ -31,6 +31,9 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
||||
field: AdvancedSearchFilterField.from,
|
||||
listEmailAddress: controller.listFromEmailAddress,
|
||||
expandMode: controller.fromAddressExpandMode.value,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
controller: controller.fromEmailAddressController,
|
||||
focusNode: controller.focusManager.fromFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.toFieldFocusNode,
|
||||
@@ -45,6 +48,9 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
||||
field: AdvancedSearchFilterField.to,
|
||||
listEmailAddress: controller.listToEmailAddress,
|
||||
expandMode: controller.toAddressExpandMode.value,
|
||||
minInputLengthAutocomplete: controller
|
||||
.mailboxDashBoardController
|
||||
.minInputLengthAutocomplete,
|
||||
controller: controller.toEmailAddressController,
|
||||
focusNode: controller.focusManager.toFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.subjectFieldFocusNode,
|
||||
|
||||
+3
-1
@@ -45,12 +45,14 @@ class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
||||
final OnRemoveDraggableEmailAddressAction? onRemoveDraggableEmailAddressAction;
|
||||
final TextEditingController? controller;
|
||||
final VoidCallback? onSearchAction;
|
||||
final int minInputLengthAutocomplete;
|
||||
|
||||
const TextFieldAutocompleteEmailAddressWeb({
|
||||
Key? key,
|
||||
required this.field,
|
||||
required this.listEmailAddress,
|
||||
this.expandMode = ExpandMode.EXPAND,
|
||||
this.minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete,
|
||||
this.focusNode,
|
||||
this.keyTagEditor,
|
||||
this.nextFocusNode,
|
||||
@@ -242,7 +244,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
||||
}
|
||||
|
||||
final tmailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
||||
if (processedQuery.length >= AppConfig.limitCharToStartSearch &&
|
||||
if (processedQuery.length >= widget.minInputLengthAutocomplete &&
|
||||
widget.onSuggestionEmailAddress != null) {
|
||||
final listEmailAddress = await widget.onSuggestionEmailAddress!(processedQuery);
|
||||
final listSuggestionEmailAddress = listEmailAddress.map((emailAddress) => _toSuggestionEmailAddress(emailAddress, _currentListEmailAddress));
|
||||
|
||||
@@ -30,7 +30,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/qu
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
|
||||
class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
|
||||
final _searchController = Get.find<search.SearchController>();
|
||||
@@ -67,7 +66,7 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
|
||||
child: QuickSearchInputForm<PresentationEmail, EmailAddress, RecentSearch>(
|
||||
maxHeight: 52,
|
||||
suggestionsBoxVerticalOffset: 0.0,
|
||||
minInputLengthAutocomplete: AppConfig.limitCharToStartSearch,
|
||||
minInputLengthAutocomplete: _dashBoardController.minInputLengthAutocomplete,
|
||||
textFieldConfiguration: _createConfiguration(context),
|
||||
suggestionsBoxDecoration: const QuickSearchSuggestionsBoxDecoration(
|
||||
color: Colors.white,
|
||||
|
||||
@@ -127,6 +127,7 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
|
||||
return AutocompleteContactTextFieldWithTags(
|
||||
listEmailAddress: controller.recipientController.listRecipients,
|
||||
internalDomain: controller.accountDashBoardController.sessionCurrent?.internalDomain ?? '',
|
||||
minInputLengthAutocomplete: controller.accountDashBoardController.minInputLengthAutocomplete,
|
||||
controller: controller.recipientController.inputRecipientController,
|
||||
onSuggestionCallback: controller.recipientController.getAutoCompleteSuggestion,
|
||||
hasAddContactButton: true,
|
||||
|
||||
+6
-1
@@ -39,6 +39,7 @@ class AutocompleteContactTextFieldWithTags extends StatefulWidget {
|
||||
final OnAddListContactCallbackAction? onAddContactCallback;
|
||||
final OnExceptionAddListContactCallbackAction? onExceptionCallback;
|
||||
final String internalDomain;
|
||||
final int minInputLengthAutocomplete;
|
||||
|
||||
const AutocompleteContactTextFieldWithTags({
|
||||
Key? key,
|
||||
@@ -46,6 +47,7 @@ class AutocompleteContactTextFieldWithTags extends StatefulWidget {
|
||||
required this.internalDomain,
|
||||
this.controller,
|
||||
this.hasAddContactButton = false,
|
||||
this.minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete,
|
||||
this.onSuggestionCallback,
|
||||
this.onAddContactCallback,
|
||||
this.onExceptionCallback,
|
||||
@@ -206,7 +208,10 @@ class _AutocompleteContactTextFieldWithTagsState extends State<AutocompleteConta
|
||||
}
|
||||
|
||||
final teamMailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
||||
if (processedQuery.isNotEmpty && widget.onSuggestionCallback != null) {
|
||||
if (processedQuery.isNotEmpty
|
||||
&& processedQuery.length >= widget.minInputLengthAutocomplete
|
||||
&& widget.onSuggestionCallback != null
|
||||
) {
|
||||
final addedEmailAddresses = await widget.onSuggestionCallback!(processedQuery);
|
||||
final listSuggestionEmailAddress = addedEmailAddresses
|
||||
.map((emailAddress) => _toSuggestionEmailAddress(emailAddress, listEmailAddress))
|
||||
|
||||
@@ -39,6 +39,7 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
|
||||
class ManageAccountDashBoardController extends ReloadableController with UserSettingPopupMenuMixin {
|
||||
|
||||
@@ -372,6 +373,15 @@ class ManageAccountDashBoardController extends ReloadableController with UserSet
|
||||
);
|
||||
}
|
||||
|
||||
int get minInputLengthAutocomplete {
|
||||
if (sessionCurrent == null || accountId.value == null) {
|
||||
return AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
return getMinInputLengthAutocomplete(
|
||||
session: sessionCurrent!,
|
||||
accountId: accountId.value!);
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
BackButtonInterceptor.removeByName(AppRoutes.settings);
|
||||
|
||||
@@ -64,6 +64,8 @@ import 'package:tmail_ui_user/features/upload/domain/usecases/local_image_picker
|
||||
import 'package:tmail_ui_user/features/upload/presentation/controller/upload_controller.dart';
|
||||
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
@@ -120,6 +122,9 @@ class MockMailboxDashBoardController extends Mock implements MailboxDashBoardCon
|
||||
|
||||
@override
|
||||
String get baseDownloadUrl => '';
|
||||
|
||||
@override
|
||||
int get minInputLengthAutocomplete => AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
|
||||
@GenerateNiceMocks([
|
||||
@@ -156,6 +161,7 @@ class MockMailboxDashBoardController extends Mock implements MailboxDashBoardCon
|
||||
MockSpec<NetworkConnectionController>(fallbackGenerators: fallbackGenerators),
|
||||
MockSpec<BeforeReconnectManager>(),
|
||||
MockSpec<RichTextMobileTabletController>(fallbackGenerators: fallbackGenerators),
|
||||
MockSpec<CacheExceptionThrower>(),
|
||||
|
||||
// Additional misc dependencies mock specs
|
||||
MockSpec<HtmlEditorApi>(),
|
||||
@@ -198,6 +204,7 @@ void main() {
|
||||
final mockBeforeReconnectManager = MockBeforeReconnectManager();
|
||||
final mockRichTextMobileTabletController = MockRichTextMobileTabletController();
|
||||
final mockRichTextWebController = MockRichTextWebController();
|
||||
final mockCacheExceptionThrower = MockCacheExceptionThrower();
|
||||
|
||||
// Declaration misc dependencies
|
||||
late MockHtmlEditorApi mockHtmlEditorApi;
|
||||
@@ -240,6 +247,7 @@ void main() {
|
||||
Get.put<NetworkConnectionController>(mockNetworkConnectionController);
|
||||
Get.put<BeforeReconnectManager>(mockBeforeReconnectManager);
|
||||
Get.put<RichTextMobileTabletController>(mockRichTextMobileTabletController);
|
||||
Get.put<CacheExceptionThrower>(mockCacheExceptionThrower);
|
||||
|
||||
// Mock composer controller
|
||||
mockLocalFilePickerInteractor = MockLocalFilePickerInteractor();
|
||||
@@ -254,7 +262,7 @@ void main() {
|
||||
mockGetAlwaysReadReceiptSettingInteractor = MockGetAlwaysReadReceiptSettingInteractor();
|
||||
mockCreateNewAndSendEmailInteractor = MockCreateNewAndSendEmailInteractor();
|
||||
mockCreateNewAndSaveEmailToDraftsInteractor = MockCreateNewAndSaveEmailToDraftsInteractor();
|
||||
|
||||
|
||||
composerController = ComposerController(
|
||||
mockLocalFilePickerInteractor,
|
||||
mockLocalImagePickerInteractor,
|
||||
|
||||
Reference in New Issue
Block a user