TF-894 Enable CreateButton every time and only show error when not valid condition

This commit is contained in:
dab246
2022-09-08 14:17:52 +07:00
committed by Dat H. Pham
parent 474235de4f
commit 38f890dd30
5 changed files with 95 additions and 72 deletions
@@ -1,7 +1,5 @@
import 'package:core/presentation/state/failure.dart'; import 'package:core/core.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.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/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/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/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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class RulesFilterCreatorController extends BaseMailboxController { class RulesFilterCreatorController extends BaseMailboxController {
final _appToast = Get.find<AppToast>();
final VerifyNameInteractor _verifyNameInteractor; final VerifyNameInteractor _verifyNameInteractor;
final GetAllMailboxInteractor _getAllMailboxInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor;
final actionType = CreatorActionType.create.obs; final actionType = CreatorActionType.create.obs;
final errorRuleName = Rxn<String>(); final errorRuleName = Rxn<String>();
final errorConditionValue = Rxn<String>(); final errorRuleConditionValue = Rxn<String>();
final errorRuleActionValue = Rxn<String>();
final ruleConditionFieldSelected = Rxn<rule_condition.Field>(); final ruleConditionFieldSelected = Rxn<rule_condition.Field>();
final ruleConditionComparatorSelected = Rxn<rule_condition.Comparator>(); final ruleConditionComparatorSelected = Rxn<rule_condition.Comparator>();
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>(); final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
final mailboxSelected = Rxn<PresentationMailbox>(); final mailboxSelected = Rxn<PresentationMailbox>();
final isCreateRuleFilterValid = RxBool(false);
final inputRuleNameController = TextEditingController(); final inputRuleNameController = TextEditingController();
final inputConditionValueController = TextEditingController(); final inputConditionValueController = TextEditingController();
final inputRuleNameFocusNode = FocusNode(); final inputRuleNameFocusNode = FocusNode();
final inputRuleConditionFocusNode = FocusNode();
AccountId? _accountId; AccountId? _accountId;
String? _newRuleName; String? _newRuleName;
String? _newConditionValue; String? _newRuleConditionValue;
TMailRule? _currentTMailRule; TMailRule? _currentTMailRule;
RulesFilterCreatorController( RulesFilterCreatorController(
@@ -65,6 +67,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
@override @override
void onClose() { void onClose() {
inputRuleNameFocusNode.dispose(); inputRuleNameFocusNode.dispose();
inputRuleConditionFocusNode.dispose();
inputRuleNameController.dispose(); inputRuleNameController.dispose();
inputConditionValueController.dispose(); inputConditionValueController.dispose();
super.onClose(); super.onClose();
@@ -77,16 +80,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
void onData(Either<Failure, Success> newState) { void onData(Either<Failure, Success> newState) {
super.onData(newState); super.onData(newState);
newState.fold( newState.fold(
(failure) { (failure) => null,
if (failure is GetAllMailboxFailure) {
_updateStateCreatorButton();
}
},
(success) async { (success) async {
if (success is GetAllMailboxSuccess) { if (success is GetAllMailboxSuccess) {
await buildTree(success.mailboxList); await buildTree(success.mailboxList);
_setUpMailboxSelected(); _setUpMailboxSelected();
_updateStateCreatorButton();
} }
}); });
} }
@@ -115,8 +113,8 @@ class RulesFilterCreatorController extends BaseMailboxController {
ruleConditionFieldSelected.value = _currentTMailRule!.condition.field; ruleConditionFieldSelected.value = _currentTMailRule!.condition.field;
ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator; ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator;
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
_newConditionValue = _currentTMailRule!.condition.value; _newRuleConditionValue = _currentTMailRule!.condition.value;
_setValueInputField(inputConditionValueController, _newConditionValue ?? ''); _setValueInputField(inputConditionValueController, _newRuleConditionValue ?? '');
_newRuleName = _currentTMailRule!.name; _newRuleName = _currentTMailRule!.name;
_setValueInputField(inputRuleNameController, _newRuleName ?? ''); _setValueInputField(inputRuleNameController, _newRuleName ?? '');
_getAllMailboxAction(); _getAllMailboxAction();
@@ -124,7 +122,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
break; break;
} }
inputRuleNameFocusNode.requestFocus(); inputRuleNameFocusNode.requestFocus();
_updateStateCreatorButton();
} }
void _setValueInputField(TextEditingController controller, String value) { void _setValueInputField(TextEditingController controller, String value) {
@@ -150,13 +147,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
void updateRuleName(BuildContext context, String? value) { void updateRuleName(BuildContext context, String? value) {
_newRuleName = value; _newRuleName = value;
errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName); errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName);
_updateStateCreatorButton();
} }
void updateConditionValue(BuildContext context, String? value) { void updateConditionValue(BuildContext context, String? value) {
_newConditionValue = value; _newRuleConditionValue = value;
errorConditionValue.value = _getErrorStringByInputValue(context, _newConditionValue); errorRuleConditionValue.value = _getErrorStringByInputValue(context, _newRuleConditionValue);
_updateStateCreatorButton();
} }
String? _getErrorStringByInputValue(BuildContext context, String? inputValue) { String? _getErrorStringByInputValue(BuildContext context, String? inputValue) {
@@ -174,20 +169,17 @@ class RulesFilterCreatorController extends BaseMailboxController {
void selectRuleConditionField(rule_condition.Field? newField) { void selectRuleConditionField(rule_condition.Field? newField) {
ruleConditionFieldSelected.value = newField; ruleConditionFieldSelected.value = newField;
_updateStateCreatorButton();
} }
void selectRuleConditionComparator(rule_condition.Comparator? newComparator) { void selectRuleConditionComparator(rule_condition.Comparator? newComparator) {
ruleConditionComparatorSelected.value = newComparator; ruleConditionComparatorSelected.value = newComparator;
_updateStateCreatorButton();
} }
void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) { void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) {
emailRuleFilterActionSelected.value = newAction; emailRuleFilterActionSelected.value = newAction;
_updateStateCreatorButton();
} }
void selectMailbox() async { void selectMailbox(BuildContext context) async {
final destinationMailbox = await push( final destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER, AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments( arguments: DestinationPickerArguments(
@@ -196,19 +188,12 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
mailboxSelected.value = destinationMailbox; 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 { void createNewRuleFilter(BuildContext context) async {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
@@ -216,13 +201,44 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (errorName?.isNotEmpty == true) { if (errorName?.isNotEmpty == true) {
log('RulesFilterCreatorController::createNewRuleFilter(): errorName: $errorName'); log('RulesFilterCreatorController::createNewRuleFilter(): errorName: $errorName');
errorRuleName.value = errorName; errorRuleName.value = errorName;
inputRuleNameFocusNode.requestFocus();
_appToast.showToastWithIcon(
currentOverlayContext!,
textColor: AppColor.toastErrorBackgroundColor,
message: AppLocalizations.of(currentContext!).this_field_cannot_be_blank);
return; return;
} }
final errorCondition = _getErrorStringByInputValue(context, _newConditionValue); final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue);
if (errorCondition?.isNotEmpty == true) { if (errorCondition?.isNotEmpty == true) {
log('RulesFilterCreatorController::createNewRuleFilter(): errorCondition: $errorCondition'); 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; return;
} }
@@ -237,7 +253,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
condition: rule_condition.RuleCondition( condition: rule_condition.RuleCondition(
field: ruleConditionFieldSelected.value!, field: ruleConditionFieldSelected.value!,
comparator: ruleConditionComparatorSelected.value!, comparator: ruleConditionComparatorSelected.value!,
value: _newConditionValue! value: _newRuleConditionValue!
)); ));
log('RulesFilterCreatorController::newTMailRule(): $newTMailRule'); log('RulesFilterCreatorController::newTMailRule(): $newTMailRule');
@@ -161,8 +161,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
supportSelectionIcon: true))), supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField( Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput, hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value, errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController, editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) => onChangeAction: (value) =>
controller.updateConditionValue(context, value)))) controller.updateConditionValue(context, value))))
] ]
@@ -205,7 +206,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Expanded(child: Obx(() => Expanded(child: Obx(() =>
RuleFilterButtonField<PresentationMailbox>( RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value, value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox()))), borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))),
]) ])
), ),
] ]
@@ -235,16 +237,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context), controller.actionType.value.getActionName(context),
width: 128, width: 128,
height: 44, height: 44,
backgroundColor: AppColor.colorTextButton backgroundColor: AppColor.colorTextButton,
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
radius: 10, radius: 10,
onTap: () { onTap: () => controller.createNewRuleFilter(context))),
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
})),
] ]
), ),
) )
@@ -322,8 +317,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
supportSelectionIcon: true))), supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField( Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput, hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value, errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController, editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) => onChangeAction: (value) =>
controller.updateConditionValue(context, value)))) controller.updateConditionValue(context, value))))
] ]
@@ -367,7 +363,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
Expanded(child: Obx(() => Expanded(child: Obx(() =>
RuleFilterButtonField<PresentationMailbox>( RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value, value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox()))), borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))),
]) ])
), ),
] ]
@@ -396,16 +393,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context), controller.actionType.value.getActionName(context),
width: 128, width: 128,
height: 44, height: 44,
backgroundColor: AppColor.colorTextButton backgroundColor: AppColor.colorTextButton,
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
radius: 10, radius: 10,
onTap: () { onTap: () => controller.createNewRuleFilter(context)))),
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
}))),
] ]
), ),
) )
@@ -498,8 +488,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
), ),
Obx(() => RulesFilterInputField( Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput, hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorConditionValue.value, errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController, editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) => onChangeAction: (value) =>
controller.updateConditionValue(context, value))) controller.updateConditionValue(context, value)))
] ]
@@ -552,7 +543,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
), ),
Obx(() => RuleFilterButtonField<PresentationMailbox>( Obx(() => RuleFilterButtonField<PresentationMailbox>(
value: controller.mailboxSelected.value, value: controller.mailboxSelected.value,
tapActionCallback: (value) => controller.selectMailbox())) borderColor: _getBorderColorMailboxSelected(),
tapActionCallback: (value) => controller.selectMailbox(context)))
]) ])
), ),
] ]
@@ -581,16 +573,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
controller.actionType.value.getActionName(context), controller.actionType.value.getActionName(context),
width: 128, width: 128,
height: 44, height: 44,
backgroundColor: AppColor.colorTextButton backgroundColor: AppColor.colorTextButton,
.withOpacity(controller.isCreateRuleFilterValid.value
? 1.0
: 0.4),
radius: 10, radius: 10,
onTap: () { onTap: () => controller.createNewRuleFilter(context)))),
if (controller.isCreateRuleFilterValid.value) {
controller.createNewRuleFilter(context);
}
}))),
] ]
), ),
) )
@@ -704,4 +689,12 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
})) }))
.build(); .build();
} }
Color _getBorderColorMailboxSelected() {
if (controller.errorRuleActionValue.value?.isNotEmpty == true) {
return AppColor.colorInputBorderErrorVerifyName;
} else {
return AppColor.colorInputBorderCreateMailbox;
}
}
} }
@@ -16,11 +16,13 @@ class RuleFilterButtonField<T> extends StatelessWidget {
final T? value; final T? value;
final OnTapActionCallback? tapActionCallback; final OnTapActionCallback? tapActionCallback;
final Color? borderColor;
const RuleFilterButtonField({ const RuleFilterButtonField({
super.key, super.key,
this.value, this.value,
this.tapActionCallback this.tapActionCallback,
this.borderColor,
}); });
@override @override
@@ -34,7 +36,7 @@ class RuleFilterButtonField<T> extends StatelessWidget {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
border: Border.all( border: Border.all(
color: AppColor.colorInputBorderCreateMailbox, color: borderColor ?? AppColor.colorInputBorderCreateMailbox,
width: 1), width: 1),
color: Colors.white), color: Colors.white),
padding: const EdgeInsets.only(left: 12, right: 10), padding: const EdgeInsets.only(left: 12, right: 10),
+7 -1
View File
@@ -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": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -2129,5 +2129,11 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"toastErrorMessageWhenCreateNewRule": "You have not filled in the information completely.",
"@toastErrorMessageWhenCreateNewRule": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -2198,4 +2198,10 @@ class AppLocalizations {
'The rule has been removed.', 'The rule has been removed.',
name: 'toastMessageDeleteEmailRuleSuccessfully'); name: 'toastMessageDeleteEmailRuleSuccessfully');
} }
String get toastErrorMessageWhenCreateNewRule {
return Intl.message(
'You have not filled in the information completely.',
name: 'toastErrorMessageWhenCreateNewRule');
}
} }