From 38f890dd301deda629b3f43bfe281b96d105e1c4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 8 Sep 2022 14:17:52 +0700 Subject: [PATCH] TF-894 Enable `CreateButton` every time and only show error when not valid condition --- .../rules_filter_creator_controller.dart | 88 +++++++++++-------- .../rules_filter_creator_view.dart | 59 ++++++------- .../widgets/rule_filter_button_field.dart | 6 +- lib/l10n/intl_messages.arb | 8 +- lib/main/localizations/app_localizations.dart | 6 ++ 5 files changed, 95 insertions(+), 72 deletions(-) diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart index 05ac03e81..68bd0cbba 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart @@ -1,7 +1,5 @@ -import 'package:core/presentation/state/failure.dart'; -import 'package:core/presentation/state/success.dart'; -import 'package:core/utils/app_logger.dart'; +import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; @@ -23,30 +21,34 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/v import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/email_rule_filter_action.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class RulesFilterCreatorController extends BaseMailboxController { + final _appToast = Get.find(); + final VerifyNameInteractor _verifyNameInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor; final actionType = CreatorActionType.create.obs; final errorRuleName = Rxn(); - final errorConditionValue = Rxn(); + final errorRuleConditionValue = Rxn(); + final errorRuleActionValue = Rxn(); final ruleConditionFieldSelected = Rxn(); final ruleConditionComparatorSelected = Rxn(); final emailRuleFilterActionSelected = Rxn(); final mailboxSelected = Rxn(); - final isCreateRuleFilterValid = RxBool(false); final inputRuleNameController = TextEditingController(); final inputConditionValueController = TextEditingController(); final inputRuleNameFocusNode = FocusNode(); + final inputRuleConditionFocusNode = FocusNode(); AccountId? _accountId; String? _newRuleName; - String? _newConditionValue; + String? _newRuleConditionValue; TMailRule? _currentTMailRule; RulesFilterCreatorController( @@ -65,6 +67,7 @@ class RulesFilterCreatorController extends BaseMailboxController { @override void onClose() { inputRuleNameFocusNode.dispose(); + inputRuleConditionFocusNode.dispose(); inputRuleNameController.dispose(); inputConditionValueController.dispose(); super.onClose(); @@ -77,16 +80,11 @@ class RulesFilterCreatorController extends BaseMailboxController { void onData(Either newState) { super.onData(newState); newState.fold( - (failure) { - if (failure is GetAllMailboxFailure) { - _updateStateCreatorButton(); - } - }, + (failure) => null, (success) async { if (success is GetAllMailboxSuccess) { await buildTree(success.mailboxList); _setUpMailboxSelected(); - _updateStateCreatorButton(); } }); } @@ -115,8 +113,8 @@ class RulesFilterCreatorController extends BaseMailboxController { ruleConditionFieldSelected.value = _currentTMailRule!.condition.field; ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator; emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; - _newConditionValue = _currentTMailRule!.condition.value; - _setValueInputField(inputConditionValueController, _newConditionValue ?? ''); + _newRuleConditionValue = _currentTMailRule!.condition.value; + _setValueInputField(inputConditionValueController, _newRuleConditionValue ?? ''); _newRuleName = _currentTMailRule!.name; _setValueInputField(inputRuleNameController, _newRuleName ?? ''); _getAllMailboxAction(); @@ -124,7 +122,6 @@ class RulesFilterCreatorController extends BaseMailboxController { break; } inputRuleNameFocusNode.requestFocus(); - _updateStateCreatorButton(); } void _setValueInputField(TextEditingController controller, String value) { @@ -150,13 +147,11 @@ class RulesFilterCreatorController extends BaseMailboxController { void updateRuleName(BuildContext context, String? value) { _newRuleName = value; errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName); - _updateStateCreatorButton(); } void updateConditionValue(BuildContext context, String? value) { - _newConditionValue = value; - errorConditionValue.value = _getErrorStringByInputValue(context, _newConditionValue); - _updateStateCreatorButton(); + _newRuleConditionValue = value; + errorRuleConditionValue.value = _getErrorStringByInputValue(context, _newRuleConditionValue); } String? _getErrorStringByInputValue(BuildContext context, String? inputValue) { @@ -174,20 +169,17 @@ class RulesFilterCreatorController extends BaseMailboxController { void selectRuleConditionField(rule_condition.Field? newField) { ruleConditionFieldSelected.value = newField; - _updateStateCreatorButton(); } void selectRuleConditionComparator(rule_condition.Comparator? newComparator) { ruleConditionComparatorSelected.value = newComparator; - _updateStateCreatorButton(); } void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) { emailRuleFilterActionSelected.value = newAction; - _updateStateCreatorButton(); } - void selectMailbox() async { + void selectMailbox(BuildContext context) async { final destinationMailbox = await push( AppRoutes.DESTINATION_PICKER, arguments: DestinationPickerArguments( @@ -196,19 +188,12 @@ class RulesFilterCreatorController extends BaseMailboxController { if (destinationMailbox is PresentationMailbox) { mailboxSelected.value = destinationMailbox; - _updateStateCreatorButton(); + errorRuleActionValue.value = _getErrorStringByInputValue( + context, + mailboxSelected.value?.name?.name); } } - void _updateStateCreatorButton() { - isCreateRuleFilterValid.value = _newRuleName?.trim().isNotEmpty == true && - _newConditionValue?.trim().isNotEmpty == true && - mailboxSelected.value != null && - ruleConditionFieldSelected.value != null && - emailRuleFilterActionSelected.value != null && - ruleConditionComparatorSelected.value != null; - } - void createNewRuleFilter(BuildContext context) async { FocusScope.of(context).unfocus(); @@ -216,13 +201,44 @@ class RulesFilterCreatorController extends BaseMailboxController { if (errorName?.isNotEmpty == true) { log('RulesFilterCreatorController::createNewRuleFilter(): errorName: $errorName'); errorRuleName.value = errorName; + inputRuleNameFocusNode.requestFocus(); + _appToast.showToastWithIcon( + currentOverlayContext!, + textColor: AppColor.toastErrorBackgroundColor, + message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank); return; } - final errorCondition = _getErrorStringByInputValue(context, _newConditionValue); + final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue); if (errorCondition?.isNotEmpty == true) { log('RulesFilterCreatorController::createNewRuleFilter(): errorCondition: $errorCondition'); - errorConditionValue.value = errorName; + errorRuleConditionValue.value = errorCondition; + inputRuleConditionFocusNode.requestFocus(); + _appToast.showToastWithIcon( + currentOverlayContext!, + textColor: AppColor.toastErrorBackgroundColor, + message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank); + return; + } + + final errorAction = _getErrorStringByInputValue(context, mailboxSelected.value?.name?.name); + if (errorAction?.isNotEmpty == true) { + log('RulesFilterCreatorController::createNewRuleFilter(): errorAction: $errorAction'); + errorRuleActionValue.value = errorAction; + _appToast.showToastWithIcon( + currentOverlayContext!, + textColor: AppColor.toastErrorBackgroundColor, + message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank); + return; + } + + if (ruleConditionFieldSelected.value == null || + ruleConditionComparatorSelected.value == null || + emailRuleFilterActionSelected.value == null) { + _appToast.showToastWithIcon( + currentOverlayContext!, + textColor: AppColor.toastErrorBackgroundColor, + message: AppLocalizations.of(currentContext!).toastErrorMessageWhenCreateNewRule); return; } @@ -237,7 +253,7 @@ class RulesFilterCreatorController extends BaseMailboxController { condition: rule_condition.RuleCondition( field: ruleConditionFieldSelected.value!, comparator: ruleConditionComparatorSelected.value!, - value: _newConditionValue! + value: _newRuleConditionValue! )); log('RulesFilterCreatorController::newTMailRule(): $newTMailRule'); diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart index 27c720a2f..2bf44aeff 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart @@ -161,8 +161,9 @@ class RuleFilterCreatorView extends GetWidget { supportSelectionIcon: true))), Expanded(child: Obx(() => RulesFilterInputField( hintText: AppLocalizations.of(context).conditionValueHintTextInput, - errorText: controller.errorConditionValue.value, + errorText: controller.errorRuleConditionValue.value, editingController: controller.inputConditionValueController, + focusNode: controller.inputRuleConditionFocusNode, onChangeAction: (value) => controller.updateConditionValue(context, value)))) ] @@ -205,7 +206,8 @@ class RuleFilterCreatorView extends GetWidget { Expanded(child: Obx(() => RuleFilterButtonField( value: controller.mailboxSelected.value, - tapActionCallback: (value) => controller.selectMailbox()))), + borderColor: _getBorderColorMailboxSelected(), + tapActionCallback: (value) => controller.selectMailbox(context)))), ]) ), ] @@ -235,16 +237,9 @@ class RuleFilterCreatorView extends GetWidget { controller.actionType.value.getActionName(context), width: 128, height: 44, - backgroundColor: AppColor.colorTextButton - .withOpacity(controller.isCreateRuleFilterValid.value - ? 1.0 - : 0.4), + backgroundColor: AppColor.colorTextButton, radius: 10, - onTap: () { - if (controller.isCreateRuleFilterValid.value) { - controller.createNewRuleFilter(context); - } - })), + onTap: () => controller.createNewRuleFilter(context))), ] ), ) @@ -322,8 +317,9 @@ class RuleFilterCreatorView extends GetWidget { supportSelectionIcon: true))), Expanded(child: Obx(() => RulesFilterInputField( hintText: AppLocalizations.of(context).conditionValueHintTextInput, - errorText: controller.errorConditionValue.value, + errorText: controller.errorRuleConditionValue.value, editingController: controller.inputConditionValueController, + focusNode: controller.inputRuleConditionFocusNode, onChangeAction: (value) => controller.updateConditionValue(context, value)))) ] @@ -367,7 +363,8 @@ class RuleFilterCreatorView extends GetWidget { Expanded(child: Obx(() => RuleFilterButtonField( value: controller.mailboxSelected.value, - tapActionCallback: (value) => controller.selectMailbox()))), + borderColor: _getBorderColorMailboxSelected(), + tapActionCallback: (value) => controller.selectMailbox(context)))), ]) ), ] @@ -396,16 +393,9 @@ class RuleFilterCreatorView extends GetWidget { controller.actionType.value.getActionName(context), width: 128, height: 44, - backgroundColor: AppColor.colorTextButton - .withOpacity(controller.isCreateRuleFilterValid.value - ? 1.0 - : 0.4), + backgroundColor: AppColor.colorTextButton, radius: 10, - onTap: () { - if (controller.isCreateRuleFilterValid.value) { - controller.createNewRuleFilter(context); - } - }))), + onTap: () => controller.createNewRuleFilter(context)))), ] ), ) @@ -498,8 +488,9 @@ class RuleFilterCreatorView extends GetWidget { ), Obx(() => RulesFilterInputField( hintText: AppLocalizations.of(context).conditionValueHintTextInput, - errorText: controller.errorConditionValue.value, + errorText: controller.errorRuleConditionValue.value, editingController: controller.inputConditionValueController, + focusNode: controller.inputRuleConditionFocusNode, onChangeAction: (value) => controller.updateConditionValue(context, value))) ] @@ -552,7 +543,8 @@ class RuleFilterCreatorView extends GetWidget { ), Obx(() => RuleFilterButtonField( value: controller.mailboxSelected.value, - tapActionCallback: (value) => controller.selectMailbox())) + borderColor: _getBorderColorMailboxSelected(), + tapActionCallback: (value) => controller.selectMailbox(context))) ]) ), ] @@ -581,16 +573,9 @@ class RuleFilterCreatorView extends GetWidget { controller.actionType.value.getActionName(context), width: 128, height: 44, - backgroundColor: AppColor.colorTextButton - .withOpacity(controller.isCreateRuleFilterValid.value - ? 1.0 - : 0.4), + backgroundColor: AppColor.colorTextButton, radius: 10, - onTap: () { - if (controller.isCreateRuleFilterValid.value) { - controller.createNewRuleFilter(context); - } - }))), + onTap: () => controller.createNewRuleFilter(context)))), ] ), ) @@ -704,4 +689,12 @@ class RuleFilterCreatorView extends GetWidget { })) .build(); } + + Color _getBorderColorMailboxSelected() { + if (controller.errorRuleActionValue.value?.isNotEmpty == true) { + return AppColor.colorInputBorderErrorVerifyName; + } else { + return AppColor.colorInputBorderCreateMailbox; + } + } } \ No newline at end of file diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_button_field.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_button_field.dart index 9d9e46bbd..e001fa523 100644 --- a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_button_field.dart +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_button_field.dart @@ -16,11 +16,13 @@ class RuleFilterButtonField extends StatelessWidget { final T? value; final OnTapActionCallback? tapActionCallback; + final Color? borderColor; const RuleFilterButtonField({ super.key, this.value, - this.tapActionCallback + this.tapActionCallback, + this.borderColor, }); @override @@ -34,7 +36,7 @@ class RuleFilterButtonField extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), border: Border.all( - color: AppColor.colorInputBorderCreateMailbox, + color: borderColor ?? AppColor.colorInputBorderCreateMailbox, width: 1), color: Colors.white), padding: const EdgeInsets.only(left: 12, right: 10), diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 1ded965f5..37bcce936 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-09-05T09:25:59.780036", + "@@last_modified": "2022-09-08T14:02:20.481140", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -2129,5 +2129,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "toastErrorMessageWhenCreateNewRule": "You have not filled in the information completely.", + "@toastErrorMessageWhenCreateNewRule": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 171fdac82..a8df23e4b 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2198,4 +2198,10 @@ class AppLocalizations { 'The rule has been removed.', name: 'toastMessageDeleteEmailRuleSuccessfully'); } + + String get toastErrorMessageWhenCreateNewRule { + return Intl.message( + 'You have not filled in the information completely.', + name: 'toastErrorMessageWhenCreateNewRule'); + } } \ No newline at end of file