tf-2083 make each rule condition can change value field separately
(cherry picked from commit 1ac91dcba099dab2d30edaa5b3496a2a2494f33f)
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
||||
enum RuleFilterConditionType {
|
||||
enum RuleFilterConditionScreenType {
|
||||
mobile,
|
||||
tablet,
|
||||
desktop
|
||||
|
||||
+58
-19
@@ -50,7 +50,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
GetAllRulesInteractor? _getAllRulesInteractor;
|
||||
|
||||
final errorRuleName = Rxn<String>();
|
||||
final errorRuleConditionValue = Rxn<String>();
|
||||
final listErrorRuleConditionValue = RxList<String>();
|
||||
final errorRuleActionValue = Rxn<String>();
|
||||
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
|
||||
final mailboxSelected = Rxn<PresentationMailbox>();
|
||||
@@ -58,12 +58,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
|
||||
final listRuleCondition = RxList<RuleCondition>();
|
||||
|
||||
final TextEditingController inputRuleNameController = TextEditingController();
|
||||
final TextEditingController inputConditionValueController = TextEditingController();
|
||||
final List<TextEditingController> listInputConditionValueController = [];
|
||||
final FocusNode inputRuleNameFocusNode = FocusNode();
|
||||
final FocusNode inputRuleConditionFocusNode = FocusNode();
|
||||
final List<FocusNode> 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<String> 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);
|
||||
}
|
||||
}
|
||||
@@ -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<RulesFilterCreatorController> {
|
||||
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<RulesFilterCreatorController> {
|
||||
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<RulesFilterCreatorController> {
|
||||
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<RulesFilterCreatorController> {
|
||||
)
|
||||
),
|
||||
conditionValueOnChangeAction: (value) =>
|
||||
controller.updateConditionValue(context, value),
|
||||
controller.updateConditionValue(context, value, index),
|
||||
tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index),
|
||||
);
|
||||
},
|
||||
|
||||
+15
-16
@@ -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<rule_condition.Field>(
|
||||
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<rule_condition.Comparator>(
|
||||
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<rule_condition.Field>(
|
||||
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<rule_condition.Comparator>(
|
||||
items: rule_condition.Comparator.values,
|
||||
itemSelected: ruleCondition!.comparator.obs.value,
|
||||
itemSelected: ruleCondition.comparator,
|
||||
onChanged: (newComparator) => {
|
||||
tapRuleConditionComparatorCallback!(newComparator)
|
||||
},
|
||||
|
||||
+1
-1
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user