tf-2083 make each rule condition can change value field separately

(cherry picked from commit 1ac91dcba099dab2d30edaa5b3496a2a2494f33f)
This commit is contained in:
hieubt
2023-09-06 10:40:52 +07:00
committed by Dat Vu
parent f6888fee31
commit 44b0072ae3
5 changed files with 90 additions and 53 deletions
@@ -1,4 +1,4 @@
enum RuleFilterConditionType { enum RuleFilterConditionScreenType {
mobile, mobile,
tablet, tablet,
desktop desktop
@@ -50,7 +50,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
GetAllRulesInteractor? _getAllRulesInteractor; GetAllRulesInteractor? _getAllRulesInteractor;
final errorRuleName = Rxn<String>(); final errorRuleName = Rxn<String>();
final errorRuleConditionValue = Rxn<String>(); final listErrorRuleConditionValue = RxList<String>();
final errorRuleActionValue = Rxn<String>(); final errorRuleActionValue = Rxn<String>();
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>(); final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
final mailboxSelected = Rxn<PresentationMailbox>(); final mailboxSelected = Rxn<PresentationMailbox>();
@@ -58,12 +58,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
final listRuleCondition = RxList<RuleCondition>(); final listRuleCondition = RxList<RuleCondition>();
final TextEditingController inputRuleNameController = TextEditingController(); final TextEditingController inputRuleNameController = TextEditingController();
final TextEditingController inputConditionValueController = TextEditingController(); final List<TextEditingController> listInputConditionValueController = [];
final FocusNode inputRuleNameFocusNode = FocusNode(); final FocusNode inputRuleNameFocusNode = FocusNode();
final FocusNode inputRuleConditionFocusNode = FocusNode(); final List<FocusNode> listInputRuleConditionFocusNode = [];
String? _newRuleName; String? _newRuleName;
String? _newRuleConditionValue;
RulesFilterCreatorArguments? arguments; RulesFilterCreatorArguments? arguments;
AccountId? _accountId; AccountId? _accountId;
@@ -112,9 +111,13 @@ class RulesFilterCreatorController extends BaseMailboxController {
void onClose() { void onClose() {
log('RulesFilterCreatorController::onClose():'); log('RulesFilterCreatorController::onClose():');
inputRuleNameFocusNode.dispose(); inputRuleNameFocusNode.dispose();
inputRuleConditionFocusNode.dispose(); for (var inputRuleConditionFocusNode in listInputRuleConditionFocusNode) {
inputRuleConditionFocusNode.dispose();
}
inputRuleNameController.dispose(); inputRuleNameController.dispose();
inputConditionValueController.dispose(); for (var inputConditionValueController in listInputConditionValueController) {
inputConditionValueController.dispose();
}
super.onClose(); super.onClose();
} }
@@ -150,10 +153,19 @@ class RulesFilterCreatorController extends BaseMailboxController {
value: '' value: ''
); );
listRuleCondition.add(newRuleCondition); listRuleCondition.add(newRuleCondition);
listInputConditionValueController.add(TextEditingController());
listInputRuleConditionFocusNode.add(FocusNode());
listErrorRuleConditionValue.add('');
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
if (_emailAddress != null) { if (_emailAddress != null) {
_newRuleConditionValue = _emailAddress?.email; RuleCondition firstRuleCondition = RuleCondition(
_setValueInputField(inputConditionValueController, _newRuleConditionValue ?? ''); 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) { if (_mailboxDestination != null) {
mailboxSelected.value = _mailboxDestination; mailboxSelected.value = _mailboxDestination;
@@ -167,9 +179,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
value: _currentTMailRule!.condition.value value: _currentTMailRule!.condition.value
); );
listRuleCondition.add(currentRule); listRuleCondition.add(currentRule);
listInputConditionValueController.add(TextEditingController());
listInputRuleConditionFocusNode.add(FocusNode());
listErrorRuleConditionValue.add('');
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
_newRuleConditionValue = _currentTMailRule!.condition.value; _setValueInputField(listInputConditionValueController[0], listRuleCondition[0].value.obs.value);
_setValueInputField(inputConditionValueController, _newRuleConditionValue ?? '');
_newRuleName = _currentTMailRule!.name; _newRuleName = _currentTMailRule!.name;
_setValueInputField(inputRuleNameController, _newRuleName ?? ''); _setValueInputField(inputRuleNameController, _newRuleName ?? '');
_getAllMailboxAction(); _getAllMailboxAction();
@@ -204,9 +218,21 @@ class RulesFilterCreatorController extends BaseMailboxController {
errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName); errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName);
} }
void updateConditionValue(BuildContext context, String? value) { void updateConditionValue(BuildContext context, String? value, int ruleConditionIndex) {
_newRuleConditionValue = value; RuleCondition newRuleCondition = RuleCondition(
errorRuleConditionValue.value = _getErrorStringByInputValue(context, _newRuleConditionValue); 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) { String? _getErrorStringByInputValue(BuildContext context, String? inputValue) {
@@ -276,10 +302,17 @@ class RulesFilterCreatorController extends BaseMailboxController {
return; return;
} }
final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue); List<String> errorCondition = [];
if (errorCondition?.isNotEmpty == true) { for (var ruleCondition in listRuleCondition) {
errorRuleConditionValue.value = errorCondition; if (_getErrorStringByInputValue(context, ruleCondition.value) != null) {
inputRuleConditionFocusNode.requestFocus(); errorCondition.add(_getErrorStringByInputValue(context, ruleCondition.value)!);
}
}
if (errorCondition.isNotEmpty) {
listErrorRuleConditionValue.value = errorCondition;
for (var inputRuleConditionFocusNode in listInputRuleConditionFocusNode) {
inputRuleConditionFocusNode.requestFocus();
}
return; return;
} }
@@ -318,7 +351,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
condition: rule_condition.RuleCondition( condition: rule_condition.RuleCondition(
field: ruleCondition.field, field: ruleCondition.field,
comparator: ruleCondition.comparator, comparator: ruleCondition.comparator,
value: _newRuleConditionValue! value: ruleCondition.value
)); ));
ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule); ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule);
} }
@@ -334,7 +367,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
condition: rule_condition.RuleCondition( condition: rule_condition.RuleCondition(
field: listRuleCondition[0].field, field: listRuleCondition[0].field,
comparator: listRuleCondition[0].comparator, comparator: listRuleCondition[0].comparator,
value: _newRuleConditionValue! value: listRuleCondition[0].value
)); ));
ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule); ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule);
} }
@@ -353,9 +386,15 @@ class RulesFilterCreatorController extends BaseMailboxController {
value: '' value: ''
); );
listRuleCondition.add(newRuleCondition); listRuleCondition.add(newRuleCondition);
listInputConditionValueController.add(TextEditingController());
listInputRuleConditionFocusNode.add(FocusNode());
listErrorRuleConditionValue.add('');
} }
void tapRemoveCondition(int ruleConditionIndex) { void tapRemoveCondition(int ruleConditionIndex) {
listRuleCondition.removeAt(ruleConditionIndex); listRuleCondition.removeAt(ruleConditionIndex);
listInputConditionValueController.removeAt(ruleConditionIndex);
listInputRuleConditionFocusNode.removeAt(ruleConditionIndex);
listErrorRuleConditionValue.removeAt(ruleConditionIndex);
} }
} }
@@ -5,7 +5,6 @@ import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.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' 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/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/extensions/rule_condition_extensions.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';
@@ -153,18 +152,18 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
itemCount: controller.listRuleCondition.length, itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return RuleFilterConditionWidget( return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.desktop, ruleFilterConditionScreenType: RuleFilterConditionScreenType.desktop,
ruleCondition: controller.listRuleCondition[index], ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths, imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value, conditionValueErrorText: controller.listErrorRuleConditionValue[index],
conditionValueFocusNode: controller.inputRuleConditionFocusNode, conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index],
conditionValueEditingController: controller.inputConditionValueController, conditionValueEditingController: controller.listInputConditionValueController[index],
tapRuleConditionFieldCallback: (value) => tapRuleConditionFieldCallback: (value) =>
controller.selectRuleConditionField(value, index), controller.selectRuleConditionField(value, index),
tapRuleConditionComparatorCallback: (value) => tapRuleConditionComparatorCallback: (value) =>
controller.selectRuleConditionComparator(value, index), controller.selectRuleConditionComparator(value, index),
conditionValueOnChangeAction: (value) => conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value), controller.updateConditionValue(context, value, index),
tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index),
); );
}, },
@@ -329,18 +328,18 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
itemCount: controller.listRuleCondition.length, itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return RuleFilterConditionWidget( return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.tablet, ruleFilterConditionScreenType: RuleFilterConditionScreenType.tablet,
ruleCondition: controller.listRuleCondition[index], ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths, imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value, conditionValueErrorText: controller.listErrorRuleConditionValue.elementAtOrNull(index),
conditionValueFocusNode: controller.inputRuleConditionFocusNode, conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index],
conditionValueEditingController: controller.inputConditionValueController, conditionValueEditingController: controller.listInputConditionValueController[index],
tapRuleConditionFieldCallback: (value) => tapRuleConditionFieldCallback: (value) =>
controller.selectRuleConditionField(value, index), controller.selectRuleConditionField(value, index),
tapRuleConditionComparatorCallback: (value) => tapRuleConditionComparatorCallback: (value) =>
controller.selectRuleConditionComparator(value, index), controller.selectRuleConditionComparator(value, index),
conditionValueOnChangeAction: (value) => conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value), controller.updateConditionValue(context, value, index),
tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index),
); );
}, },
@@ -511,12 +510,12 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
itemCount: controller.listRuleCondition.length, itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return RuleFilterConditionWidget( return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.mobile, ruleFilterConditionScreenType: RuleFilterConditionScreenType.mobile,
ruleCondition: controller.listRuleCondition[index], ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths, imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value, conditionValueErrorText: controller.listErrorRuleConditionValue.elementAtOrNull(index),
conditionValueFocusNode: controller.inputRuleConditionFocusNode, conditionValueFocusNode: controller.listInputRuleConditionFocusNode[index],
conditionValueEditingController: controller.inputConditionValueController, conditionValueEditingController: controller.listInputConditionValueController[index],
tapRuleConditionFieldCallback: (value) => controller.openContextMenuAction( tapRuleConditionFieldCallback: (value) => controller.openContextMenuAction(
context, context,
_bottomSheetRuleConditionFieldActionTiles( _bottomSheetRuleConditionFieldActionTiles(
@@ -534,7 +533,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
) )
), ),
conditionValueOnChangeAction: (value) => conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value), controller.updateConditionValue(context, value, index),
tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index),
); );
}, },
@@ -2,7 +2,6 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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/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: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; 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'; import 'package:core/presentation/resources/image_paths.dart';
class RuleFilterConditionWidget extends StatelessWidget { class RuleFilterConditionWidget extends StatelessWidget {
final RuleFilterConditionType? ruleFilterConditionType; final RuleFilterConditionScreenType? ruleFilterConditionScreenType;
final RuleCondition? ruleCondition; final RuleCondition ruleCondition;
final Function(Field?)? tapRuleConditionFieldCallback; final Function(Field?)? tapRuleConditionFieldCallback;
final Function(Comparator?)? tapRuleConditionComparatorCallback; final Function(Comparator?)? tapRuleConditionComparatorCallback;
final String? conditionValueErrorText; final String? conditionValueErrorText;
@@ -26,8 +25,8 @@ class RuleFilterConditionWidget extends StatelessWidget {
const RuleFilterConditionWidget({ const RuleFilterConditionWidget({
super.key, super.key,
this.ruleFilterConditionType, this.ruleFilterConditionScreenType,
this.ruleCondition, required this.ruleCondition,
this.tapRuleConditionFieldCallback, this.tapRuleConditionFieldCallback,
this.tapRuleConditionComparatorCallback, this.tapRuleConditionComparatorCallback,
this.conditionValueErrorText, this.conditionValueErrorText,
@@ -48,7 +47,7 @@ class RuleFilterConditionWidget extends StatelessWidget {
), ),
child: _buildRuleFilterCondition( child: _buildRuleFilterCondition(
context, context,
ruleFilterConditionType, ruleFilterConditionScreenType,
ruleCondition, ruleCondition,
tapRuleConditionFieldCallback, tapRuleConditionFieldCallback,
tapRuleConditionComparatorCallback, tapRuleConditionComparatorCallback,
@@ -66,8 +65,8 @@ class RuleFilterConditionWidget extends StatelessWidget {
Widget _buildRuleFilterCondition( Widget _buildRuleFilterCondition(
BuildContext context, BuildContext context,
RuleFilterConditionType? ruleFilterConditionType, RuleFilterConditionScreenType? ruleFilterConditionScreenType,
RuleCondition? ruleCondition, RuleCondition ruleCondition,
Function(Field?)? tapRuleConditionFieldCallback, Function(Field?)? tapRuleConditionFieldCallback,
Function(Comparator?)? tapRuleConditionComparatorCallback, Function(Comparator?)? tapRuleConditionComparatorCallback,
String? conditionValueErrorText, String? conditionValueErrorText,
@@ -77,13 +76,13 @@ Widget _buildRuleFilterCondition(
Function()? tapRemoveRuleFilterConditionCallback, Function()? tapRemoveRuleFilterConditionCallback,
ImagePaths? imagePaths, ImagePaths? imagePaths,
) { ) {
switch (ruleFilterConditionType) { switch (ruleFilterConditionScreenType) {
case RuleFilterConditionType.mobile: case RuleFilterConditionScreenType.mobile:
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
RuleFilterButtonField<rule_condition.Field>( RuleFilterButtonField<rule_condition.Field>(
value: ruleCondition!.field.obs.value, value: ruleCondition.field,
tapActionCallback: (value) { tapActionCallback: (value) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
tapRuleConditionFieldCallback!(ruleCondition.field); tapRuleConditionFieldCallback!(ruleCondition.field);
@@ -92,7 +91,7 @@ Widget _buildRuleFilterCondition(
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 12), padding: const EdgeInsets.symmetric(vertical: 12),
child: RuleFilterButtonField<rule_condition.Comparator>( child: RuleFilterButtonField<rule_condition.Comparator>(
value: ruleCondition!.comparator.obs.value, value: ruleCondition.comparator,
tapActionCallback: (value) { tapActionCallback: (value) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
tapRuleConditionComparatorCallback!(ruleCondition.comparator); tapRuleConditionComparatorCallback!(ruleCondition.comparator);
@@ -108,15 +107,15 @@ Widget _buildRuleFilterCondition(
), ),
], ],
); );
case RuleFilterConditionType.tablet: case RuleFilterConditionScreenType.tablet:
case RuleFilterConditionType.desktop: case RuleFilterConditionScreenType.desktop:
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
child: DropDownButtonWidget<rule_condition.Field>( child: DropDownButtonWidget<rule_condition.Field>(
items: rule_condition.Field.values, items: rule_condition.Field.values,
itemSelected: ruleCondition!.field.obs.value, itemSelected: ruleCondition.field,
dropdownMaxHeight: 250, dropdownMaxHeight: 250,
onChanged: (newField) => { onChanged: (newField) => {
tapRuleConditionFieldCallback!(newField) tapRuleConditionFieldCallback!(newField)
@@ -129,7 +128,7 @@ Widget _buildRuleFilterCondition(
padding: const EdgeInsets.symmetric(horizontal: 12), padding: const EdgeInsets.symmetric(horizontal: 12),
child: DropDownButtonWidget<rule_condition.Comparator>( child: DropDownButtonWidget<rule_condition.Comparator>(
items: rule_condition.Comparator.values, items: rule_condition.Comparator.values,
itemSelected: ruleCondition!.comparator.obs.value, itemSelected: ruleCondition.comparator,
onChanged: (newComparator) => { onChanged: (newComparator) => {
tapRuleConditionComparatorCallback!(newComparator) tapRuleConditionComparatorCallback!(newComparator)
}, },
@@ -41,7 +41,7 @@ class RulesFilterInputDecorationBuilder extends InputDecorationBuilder {
contentPadding: contentPadding ?? const EdgeInsets.symmetric( contentPadding: contentPadding ?? const EdgeInsets.symmetric(
horizontal: 12, horizontal: 12,
vertical: 12), vertical: 12),
errorText: errorText, errorText: errorText != '' ? errorText : null,
errorStyle: errorTextStyle ?? const TextStyle( errorStyle: errorTextStyle ?? const TextStyle(
color: AppColor.colorInputBorderErrorVerifyName, color: AppColor.colorInputBorderErrorVerifyName,
fontSize: 13), fontSize: 13),