TF-894 Enable CreateButton every time and only show error when not valid condition
This commit is contained in:
+52
-36
@@ -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<AppToast>();
|
||||
|
||||
final VerifyNameInteractor _verifyNameInteractor;
|
||||
final GetAllMailboxInteractor _getAllMailboxInteractor;
|
||||
|
||||
final actionType = CreatorActionType.create.obs;
|
||||
final errorRuleName = Rxn<String>();
|
||||
final errorConditionValue = Rxn<String>();
|
||||
final errorRuleConditionValue = Rxn<String>();
|
||||
final errorRuleActionValue = Rxn<String>();
|
||||
final ruleConditionFieldSelected = Rxn<rule_condition.Field>();
|
||||
final ruleConditionComparatorSelected = Rxn<rule_condition.Comparator>();
|
||||
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
|
||||
final mailboxSelected = Rxn<PresentationMailbox>();
|
||||
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<Failure, Success> 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');
|
||||
|
||||
@@ -161,8 +161,9 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
|
||||
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<RulesFilterCreatorController> {
|
||||
Expanded(child: Obx(() =>
|
||||
RuleFilterButtonField<PresentationMailbox>(
|
||||
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),
|
||||
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<RulesFilterCreatorController> {
|
||||
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<RulesFilterCreatorController> {
|
||||
Expanded(child: Obx(() =>
|
||||
RuleFilterButtonField<PresentationMailbox>(
|
||||
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),
|
||||
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<RulesFilterCreatorController> {
|
||||
),
|
||||
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<RulesFilterCreatorController> {
|
||||
),
|
||||
Obx(() => RuleFilterButtonField<PresentationMailbox>(
|
||||
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),
|
||||
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<RulesFilterCreatorController> {
|
||||
}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Color _getBorderColorMailboxSelected() {
|
||||
if (controller.errorRuleActionValue.value?.isNotEmpty == true) {
|
||||
return AppColor.colorInputBorderErrorVerifyName;
|
||||
} else {
|
||||
return AppColor.colorInputBorderCreateMailbox;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -16,11 +16,13 @@ class RuleFilterButtonField<T> 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<T> 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),
|
||||
|
||||
@@ -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": {}
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user