From 1831863ef898abd97c481f12a7130c79c5304db6 Mon Sep 17 00:00:00 2001 From: hieubt Date: Wed, 6 Sep 2023 10:40:52 +0700 Subject: [PATCH] tf-2083 make each rule condition can change value field separately --- .../model/rule_filter_condition_type.dart | 2 +- .../rules_filter_creator_controller.dart | 77 ++++++++++++++----- .../rules_filter_creator_view.dart | 31 ++++---- .../widgets/rule_filter_condition_widget.dart | 31 ++++---- ...rules_filter_input_decoration_builder.dart | 2 +- 5 files changed, 90 insertions(+), 53 deletions(-) diff --git a/lib/features/rules_filter_creator/presentation/model/rule_filter_condition_type.dart b/lib/features/rules_filter_creator/presentation/model/rule_filter_condition_type.dart index 5c85247b0b..a8984f187b 100644 --- a/lib/features/rules_filter_creator/presentation/model/rule_filter_condition_type.dart +++ b/lib/features/rules_filter_creator/presentation/model/rule_filter_condition_type.dart @@ -1,4 +1,4 @@ -enum RuleFilterConditionType { +enum RuleFilterConditionScreenType { mobile, tablet, desktop 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 0da27c21a0..7e7826e6bd 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 @@ -50,7 +50,7 @@ class RulesFilterCreatorController extends BaseMailboxController { GetAllRulesInteractor? _getAllRulesInteractor; final errorRuleName = Rxn(); - final errorRuleConditionValue = Rxn(); + final listErrorRuleConditionValue = RxList(); final errorRuleActionValue = Rxn(); final emailRuleFilterActionSelected = Rxn(); final mailboxSelected = Rxn(); @@ -58,12 +58,11 @@ class RulesFilterCreatorController extends BaseMailboxController { final listRuleCondition = RxList(); final TextEditingController inputRuleNameController = TextEditingController(); - final TextEditingController inputConditionValueController = TextEditingController(); + final List listInputConditionValueController = []; final FocusNode inputRuleNameFocusNode = FocusNode(); - final FocusNode inputRuleConditionFocusNode = FocusNode(); + final List listInputRuleConditionFocusNode = []; String? _newRuleName; - String? _newRuleConditionValue; RulesFilterCreatorArguments? arguments; AccountId? _accountId; @@ -112,9 +111,13 @@ class RulesFilterCreatorController extends BaseMailboxController { void onClose() { log('RulesFilterCreatorController::onClose():'); inputRuleNameFocusNode.dispose(); - inputRuleConditionFocusNode.dispose(); + for (var inputRuleConditionFocusNode in listInputRuleConditionFocusNode) { + inputRuleConditionFocusNode.dispose(); + } inputRuleNameController.dispose(); - inputConditionValueController.dispose(); + for (var inputConditionValueController in listInputConditionValueController) { + inputConditionValueController.dispose(); + } super.onClose(); } @@ -150,10 +153,19 @@ class RulesFilterCreatorController extends BaseMailboxController { value: '' ); listRuleCondition.add(newRuleCondition); + listInputConditionValueController.add(TextEditingController()); + listInputRuleConditionFocusNode.add(FocusNode()); + listErrorRuleConditionValue.add(''); emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; if (_emailAddress != null) { - _newRuleConditionValue = _emailAddress?.email; - _setValueInputField(inputConditionValueController, _newRuleConditionValue ?? ''); + RuleCondition firstRuleCondition = RuleCondition( + field: rule_condition.Field.from, + comparator: rule_condition.Comparator.contains, + value: _emailAddress!.email!, + ); + listRuleCondition[0] = firstRuleCondition; + listRuleCondition.refresh(); + _setValueInputField(listInputConditionValueController[0], listRuleCondition[0].value.obs.value); } if (_mailboxDestination != null) { mailboxSelected.value = _mailboxDestination; @@ -167,9 +179,11 @@ class RulesFilterCreatorController extends BaseMailboxController { value: _currentTMailRule!.condition.value ); listRuleCondition.add(currentRule); + listInputConditionValueController.add(TextEditingController()); + listInputRuleConditionFocusNode.add(FocusNode()); + listErrorRuleConditionValue.add(''); emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; - _newRuleConditionValue = _currentTMailRule!.condition.value; - _setValueInputField(inputConditionValueController, _newRuleConditionValue ?? ''); + _setValueInputField(listInputConditionValueController[0], listRuleCondition[0].value.obs.value); _newRuleName = _currentTMailRule!.name; _setValueInputField(inputRuleNameController, _newRuleName ?? ''); _getAllMailboxAction(); @@ -204,9 +218,21 @@ class RulesFilterCreatorController extends BaseMailboxController { errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName); } - void updateConditionValue(BuildContext context, String? value) { - _newRuleConditionValue = value; - errorRuleConditionValue.value = _getErrorStringByInputValue(context, _newRuleConditionValue); + void updateConditionValue(BuildContext context, String? value, int ruleConditionIndex) { + RuleCondition newRuleCondition = RuleCondition( + field: listRuleCondition[ruleConditionIndex].field.obs.value, + comparator: listRuleCondition[ruleConditionIndex].comparator.obs.value, + value: value!, + ); + listRuleCondition[ruleConditionIndex] = newRuleCondition; + listRuleCondition.refresh(); + String? errorString = _getErrorStringByInputValue(context, listRuleCondition[ruleConditionIndex].value.obs.value); + if (listErrorRuleConditionValue.length > ruleConditionIndex) { + listErrorRuleConditionValue[ruleConditionIndex] = errorString ?? ''; + } else { + listErrorRuleConditionValue.add(errorString ?? ''); + } + listErrorRuleConditionValue.refresh(); } String? _getErrorStringByInputValue(BuildContext context, String? inputValue) { @@ -276,10 +302,17 @@ class RulesFilterCreatorController extends BaseMailboxController { return; } - final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue); - if (errorCondition?.isNotEmpty == true) { - errorRuleConditionValue.value = errorCondition; - inputRuleConditionFocusNode.requestFocus(); + List errorCondition = []; + for (var ruleCondition in listRuleCondition) { + if (_getErrorStringByInputValue(context, ruleCondition.value) != null) { + errorCondition.add(_getErrorStringByInputValue(context, ruleCondition.value)!); + } + } + if (errorCondition.isNotEmpty) { + listErrorRuleConditionValue.value = errorCondition; + for (var inputRuleConditionFocusNode in listInputRuleConditionFocusNode) { + inputRuleConditionFocusNode.requestFocus(); + } return; } @@ -318,7 +351,7 @@ class RulesFilterCreatorController extends BaseMailboxController { condition: rule_condition.RuleCondition( field: ruleCondition.field, comparator: ruleCondition.comparator, - value: _newRuleConditionValue! + value: ruleCondition.value )); ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule); } @@ -334,7 +367,7 @@ class RulesFilterCreatorController extends BaseMailboxController { condition: rule_condition.RuleCondition( field: listRuleCondition[0].field, comparator: listRuleCondition[0].comparator, - value: _newRuleConditionValue! + value: listRuleCondition[0].value )); ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule); } @@ -353,9 +386,15 @@ class RulesFilterCreatorController extends BaseMailboxController { value: '' ); listRuleCondition.add(newRuleCondition); + listInputConditionValueController.add(TextEditingController()); + listInputRuleConditionFocusNode.add(FocusNode()); + listErrorRuleConditionValue.add(''); } void tapRemoveCondition(int ruleConditionIndex) { listRuleCondition.removeAt(ruleConditionIndex); + listInputConditionValueController.removeAt(ruleConditionIndex); + listInputRuleConditionFocusNode.removeAt(ruleConditionIndex); + listErrorRuleConditionValue.removeAt(ruleConditionIndex); } } \ No newline at end of file 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 2284dee247..980a503a23 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 @@ -5,7 +5,6 @@ import 'package:get/get.dart'; import 'package:model/model.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; -import 'package:rule_filter/rule_filter/rule_condition.dart'; import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/extensions/rule_condition_extensions.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/email_rule_filter_action.dart'; @@ -153,18 +152,18 @@ class RuleFilterCreatorView extends GetWidget { itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { return RuleFilterConditionWidget( - ruleFilterConditionType: RuleFilterConditionType.desktop, + ruleFilterConditionScreenType: RuleFilterConditionScreenType.desktop, ruleCondition: controller.listRuleCondition[index], imagePaths: _imagePaths, - conditionValueErrorText: controller.errorRuleConditionValue.value, - conditionValueFocusNode: controller.inputRuleConditionFocusNode, - conditionValueEditingController: controller.inputConditionValueController, + conditionValueErrorText: controller.listErrorRuleConditionValue[index], + conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index], + conditionValueEditingController: controller.listInputConditionValueController[index], tapRuleConditionFieldCallback: (value) => controller.selectRuleConditionField(value, index), tapRuleConditionComparatorCallback: (value) => controller.selectRuleConditionComparator(value, index), conditionValueOnChangeAction: (value) => - controller.updateConditionValue(context, value), + controller.updateConditionValue(context, value, index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); }, @@ -329,18 +328,18 @@ class RuleFilterCreatorView extends GetWidget { itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { return RuleFilterConditionWidget( - ruleFilterConditionType: RuleFilterConditionType.tablet, + ruleFilterConditionScreenType: RuleFilterConditionScreenType.tablet, ruleCondition: controller.listRuleCondition[index], imagePaths: _imagePaths, - conditionValueErrorText: controller.errorRuleConditionValue.value, - conditionValueFocusNode: controller.inputRuleConditionFocusNode, - conditionValueEditingController: controller.inputConditionValueController, + conditionValueErrorText: controller.listErrorRuleConditionValue.elementAtOrNull(index), + conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index], + conditionValueEditingController: controller.listInputConditionValueController[index], tapRuleConditionFieldCallback: (value) => controller.selectRuleConditionField(value, index), tapRuleConditionComparatorCallback: (value) => controller.selectRuleConditionComparator(value, index), conditionValueOnChangeAction: (value) => - controller.updateConditionValue(context, value), + controller.updateConditionValue(context, value, index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); }, @@ -511,12 +510,12 @@ class RuleFilterCreatorView extends GetWidget { itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { return RuleFilterConditionWidget( - ruleFilterConditionType: RuleFilterConditionType.mobile, + ruleFilterConditionScreenType: RuleFilterConditionScreenType.mobile, ruleCondition: controller.listRuleCondition[index], imagePaths: _imagePaths, - conditionValueErrorText: controller.errorRuleConditionValue.value, - conditionValueFocusNode: controller.inputRuleConditionFocusNode, - conditionValueEditingController: controller.inputConditionValueController, + conditionValueErrorText: controller.listErrorRuleConditionValue.elementAtOrNull(index), + conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index], + conditionValueEditingController: controller.listInputConditionValueController[index], tapRuleConditionFieldCallback: (value) => controller.openContextMenuAction( context, _bottomSheetRuleConditionFieldActionTiles( @@ -534,7 +533,7 @@ class RuleFilterCreatorView extends GetWidget { ) ), conditionValueOnChangeAction: (value) => - controller.updateConditionValue(context, value), + controller.updateConditionValue(context, value, index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); }, diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_condition_widget.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_condition_widget.dart index e4bd55b4c3..729bbeb28d 100644 --- a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_condition_widget.dart +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_condition_widget.dart @@ -2,7 +2,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rule_filter_condition_type.dart'; import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; @@ -13,8 +12,8 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:core/presentation/resources/image_paths.dart'; class RuleFilterConditionWidget extends StatelessWidget { - final RuleFilterConditionType? ruleFilterConditionType; - final RuleCondition? ruleCondition; + final RuleFilterConditionScreenType? ruleFilterConditionScreenType; + final RuleCondition ruleCondition; final Function(Field?)? tapRuleConditionFieldCallback; final Function(Comparator?)? tapRuleConditionComparatorCallback; final String? conditionValueErrorText; @@ -26,8 +25,8 @@ class RuleFilterConditionWidget extends StatelessWidget { const RuleFilterConditionWidget({ super.key, - this.ruleFilterConditionType, - this.ruleCondition, + this.ruleFilterConditionScreenType, + required this.ruleCondition, this.tapRuleConditionFieldCallback, this.tapRuleConditionComparatorCallback, this.conditionValueErrorText, @@ -48,7 +47,7 @@ class RuleFilterConditionWidget extends StatelessWidget { ), child: _buildRuleFilterCondition( context, - ruleFilterConditionType, + ruleFilterConditionScreenType, ruleCondition, tapRuleConditionFieldCallback, tapRuleConditionComparatorCallback, @@ -66,8 +65,8 @@ class RuleFilterConditionWidget extends StatelessWidget { Widget _buildRuleFilterCondition( BuildContext context, - RuleFilterConditionType? ruleFilterConditionType, - RuleCondition? ruleCondition, + RuleFilterConditionScreenType? ruleFilterConditionScreenType, + RuleCondition ruleCondition, Function(Field?)? tapRuleConditionFieldCallback, Function(Comparator?)? tapRuleConditionComparatorCallback, String? conditionValueErrorText, @@ -77,13 +76,13 @@ Widget _buildRuleFilterCondition( Function()? tapRemoveRuleFilterConditionCallback, ImagePaths? imagePaths, ) { - switch (ruleFilterConditionType) { - case RuleFilterConditionType.mobile: + switch (ruleFilterConditionScreenType) { + case RuleFilterConditionScreenType.mobile: return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ RuleFilterButtonField( - value: ruleCondition!.field.obs.value, + value: ruleCondition.field, tapActionCallback: (value) { KeyboardUtils.hideKeyboard(context); tapRuleConditionFieldCallback!(ruleCondition.field); @@ -92,7 +91,7 @@ Widget _buildRuleFilterCondition( Padding( padding: const EdgeInsets.symmetric(vertical: 12), child: RuleFilterButtonField( - value: ruleCondition!.comparator.obs.value, + value: ruleCondition.comparator, tapActionCallback: (value) { KeyboardUtils.hideKeyboard(context); tapRuleConditionComparatorCallback!(ruleCondition.comparator); @@ -108,15 +107,15 @@ Widget _buildRuleFilterCondition( ), ], ); - case RuleFilterConditionType.tablet: - case RuleFilterConditionType.desktop: + case RuleFilterConditionScreenType.tablet: + case RuleFilterConditionScreenType.desktop: return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: DropDownButtonWidget( items: rule_condition.Field.values, - itemSelected: ruleCondition!.field.obs.value, + itemSelected: ruleCondition.field, dropdownMaxHeight: 250, onChanged: (newField) => { tapRuleConditionFieldCallback!(newField) @@ -129,7 +128,7 @@ Widget _buildRuleFilterCondition( padding: const EdgeInsets.symmetric(horizontal: 12), child: DropDownButtonWidget( items: rule_condition.Comparator.values, - itemSelected: ruleCondition!.comparator.obs.value, + itemSelected: ruleCondition.comparator, onChanged: (newComparator) => { tapRuleConditionComparatorCallback!(newComparator) }, diff --git a/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_decoration_builder.dart b/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_decoration_builder.dart index 8c757c4545..cbea00dce7 100644 --- a/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_decoration_builder.dart +++ b/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_decoration_builder.dart @@ -41,7 +41,7 @@ class RulesFilterInputDecorationBuilder extends InputDecorationBuilder { contentPadding: contentPadding ?? const EdgeInsets.symmetric( horizontal: 12, vertical: 12), - errorText: errorText, + errorText: errorText != '' ? errorText : null, errorStyle: errorTextStyle ?? const TextStyle( color: AppColor.colorInputBorderErrorVerifyName, fontSize: 13),