TF-2083 change condition widget to RuleFilterConditionWidget

(cherry picked from commit 6fde253f44d587f10745eb3688d703d03787225c)
This commit is contained in:
hieubt
2023-08-31 12:30:39 +07:00
committed by Dat Vu
parent b5d775c65f
commit d9aecd0458
3 changed files with 236 additions and 146 deletions
@@ -14,6 +14,7 @@ import 'package:model/model.dart';
import 'package:rule_filter/rule_filter/rule_action.dart';
import 'package:rule_filter/rule_filter/rule_append_in.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:rule_filter/rule_filter/rule_condition.dart';
import 'package:rule_filter/rule_filter/tmail_rule.dart';
import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
@@ -55,6 +56,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
final emailRuleFilterActionSelected = Rxn<EmailRuleFilterAction>();
final mailboxSelected = Rxn<PresentationMailbox>();
final actionType = CreatorActionType.create.obs;
final listRuleCondition = RxList<RuleCondition>();
final TextEditingController inputRuleNameController = TextEditingController();
final TextEditingController inputConditionValueController = TextEditingController();
@@ -145,6 +147,12 @@ class RulesFilterCreatorController extends BaseMailboxController {
case CreatorActionType.create:
ruleConditionFieldSelected.value = rule_condition.Field.from;
ruleConditionComparatorSelected.value = rule_condition.Comparator.contains;
RuleCondition newRuleCondition = RuleCondition(
field: rule_condition.Field.from,
comparator: rule_condition.Comparator.contains,
value: ''
);
listRuleCondition.add(newRuleCondition);
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
if (_emailAddress != null) {
_newRuleConditionValue = _emailAddress?.email;
@@ -158,6 +166,12 @@ class RulesFilterCreatorController extends BaseMailboxController {
if (_currentTMailRule != null) {
ruleConditionFieldSelected.value = _currentTMailRule!.condition.field;
ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator;
RuleCondition currentRule = RuleCondition(
field: _currentTMailRule!.condition.field,
comparator: _currentTMailRule!.condition.comparator,
value: _currentTMailRule!.condition.value
);
listRuleCondition.add(currentRule);
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
_newRuleConditionValue = _currentTMailRule!.condition.value;
_setValueInputField(inputConditionValueController, _newRuleConditionValue ?? '');
@@ -213,12 +227,14 @@ class RulesFilterCreatorController extends BaseMailboxController {
);
}
void selectRuleConditionField(rule_condition.Field? newField) {
ruleConditionFieldSelected.value = newField;
void selectRuleConditionField(rule_condition.Field? newField, int? ruleConditionIndex) {
listRuleCondition[ruleConditionIndex!].field.obs.value = newField!;
listRuleCondition.refresh();
}
void selectRuleConditionComparator(rule_condition.Comparator? newComparator) {
ruleConditionComparatorSelected.value = newComparator;
void selectRuleConditionComparator(rule_condition.Comparator? newComparator, int? ruleConditionIndex) {
listRuleCondition[ruleConditionIndex!].comparator.obs.value = newComparator!;
listRuleCondition.refresh();
}
void selectEmailRuleFilterAction(EmailRuleFilterAction? newAction) {
@@ -5,6 +5,7 @@ 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';
@@ -13,10 +14,13 @@ import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_condition_comparator_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_condition_field_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_filter_button_field.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_filter_condition_widget.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'model/rule_filter_condition_type.dart';
class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
final _imagePaths = Get.find<ImagePaths>();
@@ -143,40 +147,62 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24),
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.colorBackgroundFieldConditionRulesFilter,
borderRadius: BorderRadius.circular(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: Obx(() => DropDownButtonWidget<rule_condition.Field>(
items: rule_condition.Field.values,
itemSelected: controller.ruleConditionFieldSelected.value,
dropdownMaxHeight: 250,
onChanged: (newField) =>
controller.selectRuleConditionField(newField),
supportSelectionIcon: true))),
Container(
width: 220,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Obx(() => DropDownButtonWidget<rule_condition.Comparator>(
items: rule_condition.Comparator.values,
itemSelected: controller.ruleConditionComparatorSelected.value,
onChanged: (newComparator) =>
controller.selectRuleConditionComparator(newComparator),
supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value))))
]
)
),
// Container(
// padding: const EdgeInsets.all(12),
// decoration: BoxDecoration(
// color: AppColor.colorBackgroundFieldConditionRulesFilter,
// borderRadius: BorderRadius.circular(12)),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Expanded(child: Obx(() => DropDownButtonWidget<rule_condition.Field>(
// items: rule_condition.Field.values,
// itemSelected: controller.ruleConditionFieldSelected.value,
// dropdownMaxHeight: 250,
// onChanged: (newField) =>
// controller.selectRuleConditionField(newField),
// supportSelectionIcon: true))),
// Container(
// width: 220,
// padding: const EdgeInsets.symmetric(horizontal: 12),
// child: Obx(() => DropDownButtonWidget<rule_condition.Comparator>(
// items: rule_condition.Comparator.values,
// itemSelected: controller.ruleConditionComparatorSelected.value,
// onChanged: (newComparator) =>
// controller.selectRuleConditionComparator(newComparator),
// supportSelectionIcon: true))),
// Expanded(child: Obx(() => RulesFilterInputField(
// hintText: AppLocalizations.of(context).conditionValueHintTextInput,
// errorText: controller.errorRuleConditionValue.value,
// editingController: controller.inputConditionValueController,
// focusNode: controller.inputRuleConditionFocusNode,
// onChangeAction: (value) =>
// controller.updateConditionValue(context, value))))
// ]
// )
// ),
Obx(() {
return ListView.builder(
shrinkWrap: true,
itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) {
return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.desktop,
ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value,
conditionValueFocusNode: controller.inputRuleConditionFocusNode,
conditionValueEditingController: controller.inputConditionValueController,
tapRuleConditionFieldCallback: (value) =>
controller.selectRuleConditionField(value, index),
tapRuleConditionComparatorCallback: (value) =>
controller.selectRuleConditionComparator(value, index),
conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value),
);
}
);
}),
const SizedBox(height: 24),
Text(AppLocalizations.of(context).actionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow,
@@ -302,40 +328,62 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24),
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.colorBackgroundFieldConditionRulesFilter,
borderRadius: BorderRadius.circular(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: Obx(() => DropDownButtonWidget<rule_condition.Field>(
items: rule_condition.Field.values,
itemSelected: controller.ruleConditionFieldSelected.value,
dropdownMaxHeight: 250,
onChanged: (newField) =>
controller.selectRuleConditionField(newField),
supportSelectionIcon: true))),
Container(
width: 220,
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Obx(() => DropDownButtonWidget<rule_condition.Comparator>(
items: rule_condition.Comparator.values,
itemSelected: controller.ruleConditionComparatorSelected.value,
onChanged: (newComparator) =>
controller.selectRuleConditionComparator(newComparator),
supportSelectionIcon: true))),
Expanded(child: Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value))))
]
)
),
// Container(
// padding: const EdgeInsets.all(12),
// decoration: BoxDecoration(
// color: AppColor.colorBackgroundFieldConditionRulesFilter,
// borderRadius: BorderRadius.circular(12)),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Expanded(child: Obx(() => DropDownButtonWidget<rule_condition.Field>(
// items: rule_condition.Field.values,
// itemSelected: controller.ruleConditionFieldSelected.value,
// dropdownMaxHeight: 250,
// onChanged: (newField) =>
// controller.selectRuleConditionField(newField),
// supportSelectionIcon: true))),
// Container(
// width: 220,
// padding: const EdgeInsets.symmetric(horizontal: 12),
// child: Obx(() => DropDownButtonWidget<rule_condition.Comparator>(
// items: rule_condition.Comparator.values,
// itemSelected: controller.ruleConditionComparatorSelected.value,
// onChanged: (newComparator) =>
// controller.selectRuleConditionComparator(newComparator),
// supportSelectionIcon: true))),
// Expanded(child: Obx(() => RulesFilterInputField(
// hintText: AppLocalizations.of(context).conditionValueHintTextInput,
// errorText: controller.errorRuleConditionValue.value,
// editingController: controller.inputConditionValueController,
// focusNode: controller.inputRuleConditionFocusNode,
// onChangeAction: (value) =>
// controller.updateConditionValue(context, value))))
// ]
// )
// ),
Obx(() {
return ListView.builder(
shrinkWrap: true,
itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) {
return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.tablet,
ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value,
conditionValueFocusNode: controller.inputRuleConditionFocusNode,
conditionValueEditingController: controller.inputConditionValueController,
tapRuleConditionFieldCallback: (value) =>
controller.selectRuleConditionField(value, index),
tapRuleConditionComparatorCallback: (value) =>
controller.selectRuleConditionComparator(value, index),
conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value),
);
}
);
}),
const SizedBox(height: 24),
Text(AppLocalizations.of(context).actionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow,
@@ -467,53 +515,75 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24),
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.colorBackgroundFieldConditionRulesFilter,
borderRadius: BorderRadius.circular(12)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Obx(() {
return RuleFilterButtonField<rule_condition.Field>(
value: controller.ruleConditionFieldSelected.value,
tapActionCallback: (value) {
KeyboardUtils.hideKeyboard(context);
controller.openContextMenuAction(
context,
_bottomSheetRuleConditionFieldActionTiles(
context,
controller.ruleConditionFieldSelected.value));
}
);
}),
Padding(
padding: const EdgeInsets.symmetric(vertical: 12),
child: Obx(() {
return RuleFilterButtonField<rule_condition.Comparator>(
value: controller.ruleConditionComparatorSelected.value,
tapActionCallback: (value) {
KeyboardUtils.hideKeyboard(context);
controller.openContextMenuAction(
context,
_bottomSheetRuleConditionComparatorActionTiles(
context,
controller.ruleConditionComparatorSelected.value));
}
);
}),
),
Obx(() => RulesFilterInputField(
hintText: AppLocalizations.of(context).conditionValueHintTextInput,
errorText: controller.errorRuleConditionValue.value,
editingController: controller.inputConditionValueController,
focusNode: controller.inputRuleConditionFocusNode,
onChangeAction: (value) =>
controller.updateConditionValue(context, value)))
]
)
),
// Container(
// padding: const EdgeInsets.all(12),
// decoration: BoxDecoration(
// color: AppColor.colorBackgroundFieldConditionRulesFilter,
// borderRadius: BorderRadius.circular(12)),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Obx(() {
// return RuleFilterButtonField<rule_condition.Field>(
// value: controller.ruleConditionFieldSelected.value,
// tapActionCallback: (value) {
// KeyboardUtils.hideKeyboard(context);
// controller.openContextMenuAction(
// context,
// _bottomSheetRuleConditionFieldActionTiles(
// context,
// controller.ruleConditionFieldSelected.value));
// }
// );
// }),
// Padding(
// padding: const EdgeInsets.symmetric(vertical: 12),
// child: Obx(() {
// return RuleFilterButtonField<rule_condition.Comparator>(
// value: controller.ruleConditionComparatorSelected.value,
// tapActionCallback: (value) {
// KeyboardUtils.hideKeyboard(context);
// controller.openContextMenuAction(
// context,
// _bottomSheetRuleConditionComparatorActionTiles(
// context,
// controller.ruleConditionComparatorSelected.value));
// }
// );
// }),
// ),
// Obx(() => RulesFilterInputField(
// hintText: AppLocalizations.of(context).conditionValueHintTextInput,
// errorText: controller.errorRuleConditionValue.value,
// editingController: controller.inputConditionValueController,
// focusNode: controller.inputRuleConditionFocusNode,
// onChangeAction: (value) =>
// controller.updateConditionValue(context, value)))
// ]
// )
// ),
Obx(() {
return ListView.builder(
shrinkWrap: true,
itemCount: controller.listRuleCondition.length,
itemBuilder: (context, index) {
return RuleFilterConditionWidget(
ruleFilterConditionType: RuleFilterConditionType.mobile,
ruleCondition: controller.listRuleCondition[index],
imagePaths: _imagePaths,
conditionValueErrorText: controller.errorRuleConditionValue.value,
conditionValueFocusNode: controller.inputRuleConditionFocusNode,
conditionValueEditingController: controller.inputConditionValueController,
tapRuleConditionFieldCallback: (value) =>
controller.selectRuleConditionField(value, index),
tapRuleConditionComparatorCallback: (value) =>
controller.selectRuleConditionComparator(value, index),
conditionValueOnChangeAction: (value) =>
controller.updateConditionValue(context, value),
);
}
);
}),
const Padding(
padding: EdgeInsets.symmetric(vertical: 12),
child: Divider(
@@ -616,18 +686,20 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
List<Widget> _bottomSheetRuleConditionFieldActionTiles(
BuildContext context,
rule_condition.Field? fieldSelected
rule_condition.Field? fieldSelected,
int? ruleConditionIndex,
) {
return rule_condition.Field.values
.map((field) =>
_buildRuleConditionFieldWidget(context, field, fieldSelected))
_buildRuleConditionFieldWidget(context, field, fieldSelected, ruleConditionIndex))
.toList();
}
Widget _buildRuleConditionFieldWidget(
BuildContext context,
rule_condition.Field field,
rule_condition.Field? fieldSelected
rule_condition.Field? fieldSelected,
int? ruleConditionIndex,
) {
return (RuleConditionFieldSheetActionTileBuilder(
field.getTitle(context),
@@ -641,7 +713,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
height: 20,
fit: BoxFit.fill))
..onActionClick((field) {
controller.selectRuleConditionField(field);
controller.selectRuleConditionField(field, ruleConditionIndex);
popBack();
}))
.build();
@@ -649,18 +721,20 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
List<Widget> _bottomSheetRuleConditionComparatorActionTiles(
BuildContext context,
rule_condition.Comparator? comparatorSelected
rule_condition.Comparator? comparatorSelected,
int? ruleConditionIndex,
) {
return rule_condition.Comparator.values
.map((comparator) =>
_buildRuleConditionComparatorWidget(context, comparator, comparatorSelected))
_buildRuleConditionComparatorWidget(context, comparator, comparatorSelected, ruleConditionIndex))
.toList();
}
Widget _buildRuleConditionComparatorWidget(
BuildContext context,
rule_condition.Comparator comparator,
rule_condition.Comparator? comparatorSelected
rule_condition.Comparator? comparatorSelected,
int? ruleConditionIndex,
) {
return (RuleConditionComparatorSheetActionTileBuilder(
comparator.getTitle(context),
@@ -674,7 +748,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
height: 20,
fit: BoxFit.fill))
..onActionClick((comparator) {
controller.selectRuleConditionComparator(comparator);
controller.selectRuleConditionComparator(comparator, ruleConditionIndex);
popBack();
}))
.build();
@@ -41,25 +41,25 @@ class RuleFilterConditionWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.colorBackgroundFieldConditionRulesFilter,
borderRadius: BorderRadius.circular(12),
),
child: _buildRuleFilterCondition(
context,
ruleFilterConditionType,
ruleCondition,
tapRuleConditionFieldCallback,
tapRuleConditionComparatorCallback,
conditionValueErrorText,
conditionValueEditingController,
conditionValueFocusNode,
conditionValueOnChangeAction,
onTapRemoveRuleFilterConditionCallback,
imagePaths,
)
);
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.colorBackgroundFieldConditionRulesFilter,
borderRadius: BorderRadius.circular(12),
),
child: _buildRuleFilterCondition(
context,
ruleFilterConditionType,
ruleCondition,
tapRuleConditionFieldCallback,
tapRuleConditionComparatorCallback,
conditionValueErrorText,
conditionValueEditingController,
conditionValueFocusNode,
conditionValueOnChangeAction,
onTapRemoveRuleFilterConditionCallback,
imagePaths,
)
);
}
}