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 5d584a8ef..30d035b29 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 @@ -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(); final mailboxSelected = Rxn(); final actionType = CreatorActionType.create.obs; + final listRuleCondition = RxList(); 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) { 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 373578814..77d17f77c 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,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 { final _imagePaths = Get.find(); @@ -143,40 +147,62 @@ class RuleFilterCreatorView extends GetWidget { 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( - 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( - 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( + // 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( + // 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 { 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( - 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( - 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( + // 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( + // 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 { 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( - 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( - 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( + // 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( + // 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 { List _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 { height: 20, fit: BoxFit.fill)) ..onActionClick((field) { - controller.selectRuleConditionField(field); + controller.selectRuleConditionField(field, ruleConditionIndex); popBack(); })) .build(); @@ -649,18 +721,20 @@ class RuleFilterCreatorView extends GetWidget { List _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 { height: 20, fit: BoxFit.fill)) ..onActionClick((comparator) { - controller.selectRuleConditionComparator(comparator); + controller.selectRuleConditionComparator(comparator, ruleConditionIndex); popBack(); })) .build(); 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 88c7071b9..8bcbba3b8 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 @@ -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, + ) + ); } }