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 30d035b29..0da27c21a 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 @@ -4,6 +4,7 @@ import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; +import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; @@ -51,8 +52,6 @@ class RulesFilterCreatorController extends BaseMailboxController { final errorRuleName = Rxn(); final errorRuleConditionValue = Rxn(); final errorRuleActionValue = Rxn(); - final ruleConditionFieldSelected = Rxn(); - final ruleConditionComparatorSelected = Rxn(); final emailRuleFilterActionSelected = Rxn(); final mailboxSelected = Rxn(); final actionType = CreatorActionType.create.obs; @@ -145,8 +144,6 @@ class RulesFilterCreatorController extends BaseMailboxController { void _setUpDefaultValueRuleFilter() { switch(actionType.value) { 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, @@ -164,8 +161,6 @@ class RulesFilterCreatorController extends BaseMailboxController { break; case CreatorActionType.edit: if (_currentTMailRule != null) { - ruleConditionFieldSelected.value = _currentTMailRule!.condition.field; - ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator; RuleCondition currentRule = RuleCondition( field: _currentTMailRule!.condition.field, comparator: _currentTMailRule!.condition.comparator, @@ -228,12 +223,22 @@ class RulesFilterCreatorController extends BaseMailboxController { } void selectRuleConditionField(rule_condition.Field? newField, int? ruleConditionIndex) { - listRuleCondition[ruleConditionIndex!].field.obs.value = newField!; + RuleCondition newRuleCondition = RuleCondition( + field: newField!, + comparator: listRuleCondition[ruleConditionIndex!].comparator.obs.value, + value: listRuleCondition[ruleConditionIndex].value.obs.value, + ); + listRuleCondition[ruleConditionIndex] = newRuleCondition; listRuleCondition.refresh(); } void selectRuleConditionComparator(rule_condition.Comparator? newComparator, int? ruleConditionIndex) { - listRuleCondition[ruleConditionIndex!].comparator.obs.value = newComparator!; + RuleCondition newRuleCondition = RuleCondition( + field: listRuleCondition[ruleConditionIndex!].field.obs.value, + comparator: newComparator!, + value: listRuleCondition[ruleConditionIndex].value.obs.value, + ); + listRuleCondition[ruleConditionIndex] = newRuleCondition; listRuleCondition.refresh(); } @@ -289,9 +294,7 @@ class RulesFilterCreatorController extends BaseMailboxController { return; } - if (ruleConditionFieldSelected.value == null || - ruleConditionComparatorSelected.value == null || - emailRuleFilterActionSelected.value == null) { + if (listRuleCondition.isEmpty || emailRuleFilterActionSelected.value == null) { if (currentOverlayContext != null && currentContext != null) { _appToast.showToastErrorMessage( currentOverlayContext!, @@ -300,7 +303,11 @@ class RulesFilterCreatorController extends BaseMailboxController { return; } - final newTMailRule = TMailRule( + late EquatableMixin ruleFilterRequest; + + if (actionType.value == CreatorActionType.create) { + for (var ruleCondition in listRuleCondition) { + final newTMailRule = TMailRule( id: _currentTMailRule?.id, name: _newRuleName!, action: RuleAction( @@ -309,15 +316,28 @@ class RulesFilterCreatorController extends BaseMailboxController { ) ), condition: rule_condition.RuleCondition( - field: ruleConditionFieldSelected.value!, - comparator: ruleConditionComparatorSelected.value!, + field: ruleCondition.field, + comparator: ruleCondition.comparator, value: _newRuleConditionValue! )); - - final ruleFilterRequest = - actionType.value == CreatorActionType.create - ? CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule) - : EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule); + ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule); + } + } else { + final newTMailRule = TMailRule( + id: _currentTMailRule?.id, + name: _newRuleName!, + action: RuleAction( + appendIn: RuleAppendIn( + mailboxIds: [mailboxSelected.value!.id] + ) + ), + condition: rule_condition.RuleCondition( + field: listRuleCondition[0].field, + comparator: listRuleCondition[0].comparator, + value: _newRuleConditionValue! + )); + ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule); + } popBack(result: ruleFilterRequest); } @@ -325,4 +345,17 @@ class RulesFilterCreatorController extends BaseMailboxController { KeyboardUtils.hideKeyboard(context); popBack(); } + + void tapAddCondition() { + RuleCondition newRuleCondition = RuleCondition( + field: rule_condition.Field.from, + comparator: rule_condition.Comparator.contains, + value: '' + ); + listRuleCondition.add(newRuleCondition); + } + + void tapRemoveCondition(int ruleConditionIndex) { + listRuleCondition.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 77d17f77c..2284dee24 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 @@ -147,42 +147,8 @@ 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)))) - // ] - // ) - // ), Obx(() { - return ListView.builder( + return ListView.separated( shrinkWrap: true, itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { @@ -199,10 +165,39 @@ class RuleFilterCreatorView extends GetWidget { controller.selectRuleConditionComparator(value, index), conditionValueOnChangeAction: (value) => controller.updateConditionValue(context, value), + tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); - } + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 12,); + }, ); }), + Container( + padding: const EdgeInsets.only(top: 8), + child: InkWell( + onTap: controller.tapAddCondition, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + _imagePaths.icAddNewFolder, + fit: BoxFit.fill, + ), + const SizedBox(width: 15,), + Text( + AppLocalizations.of(context).addCondition, + maxLines: 1, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 17, + color: AppColor.primaryColor + ) + ) + ], + ), + ), + ), const SizedBox(height: 24), Text(AppLocalizations.of(context).actionTitleRulesFilter, overflow: CommonTextStyle.defaultTextOverFlow, @@ -328,42 +323,8 @@ 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)))) - // ] - // ) - // ), Obx(() { - return ListView.builder( + return ListView.separated( shrinkWrap: true, itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { @@ -380,10 +341,39 @@ class RuleFilterCreatorView extends GetWidget { controller.selectRuleConditionComparator(value, index), conditionValueOnChangeAction: (value) => controller.updateConditionValue(context, value), + tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); - } + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 12,); + }, ); }), + Container( + padding: const EdgeInsets.only(top: 8), + child: InkWell( + onTap: controller.tapAddCondition, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + _imagePaths.icAddNewFolder, + fit: BoxFit.fill, + ), + const SizedBox(width: 15,), + Text( + AppLocalizations.of(context).addCondition, + maxLines: 1, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 17, + color: AppColor.primaryColor + ) + ) + ], + ), + ), + ), const SizedBox(height: 24), Text(AppLocalizations.of(context).actionTitleRulesFilter, overflow: CommonTextStyle.defaultTextOverFlow, @@ -515,55 +505,8 @@ 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))) - // ] - // ) - // ), Obx(() { - return ListView.builder( + return ListView.separated( shrinkWrap: true, itemCount: controller.listRuleCondition.length, itemBuilder: (context, index) { @@ -574,16 +517,58 @@ class RuleFilterCreatorView extends GetWidget { conditionValueErrorText: controller.errorRuleConditionValue.value, conditionValueFocusNode: controller.inputRuleConditionFocusNode, conditionValueEditingController: controller.inputConditionValueController, - tapRuleConditionFieldCallback: (value) => - controller.selectRuleConditionField(value, index), - tapRuleConditionComparatorCallback: (value) => - controller.selectRuleConditionComparator(value, index), + tapRuleConditionFieldCallback: (value) => controller.openContextMenuAction( + context, + _bottomSheetRuleConditionFieldActionTiles( + context, + controller.listRuleCondition[index].field.obs.value, + index, + ) + ), + tapRuleConditionComparatorCallback: (value) => controller.openContextMenuAction( + context, + _bottomSheetRuleConditionComparatorActionTiles( + context, + controller.listRuleCondition[index].comparator.obs.value, + index, + ) + ), conditionValueOnChangeAction: (value) => controller.updateConditionValue(context, value), + tapRemoveRuleFilterConditionCallback: () => controller.tapRemoveCondition(index), ); - } + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 12,); + }, ); }), + Container( + padding: const EdgeInsets.only(top: 12), + child: InkWell( + onTap: controller.tapAddCondition, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + _imagePaths.icAddNewFolder, + fit: BoxFit.fill, + ), + const SizedBox(width: 15,), + Text( + AppLocalizations.of(context).addCondition, + maxLines: 1, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 17, + color: AppColor.primaryColor + ) + ) + ], + ), + ), + ), const Padding( padding: EdgeInsets.symmetric(vertical: 12), child: Divider( 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 8bcbba3b8..e4bd55b4c 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 @@ -22,7 +22,7 @@ class RuleFilterConditionWidget extends StatelessWidget { final FocusNode? conditionValueFocusNode; final OnChangeFilterInputAction? conditionValueOnChangeAction; final ImagePaths? imagePaths; - final Function()? onTapRemoveRuleFilterConditionCallback; + final Function()? tapRemoveRuleFilterConditionCallback; const RuleFilterConditionWidget({ super.key, @@ -35,7 +35,7 @@ class RuleFilterConditionWidget extends StatelessWidget { this.conditionValueFocusNode, this.conditionValueOnChangeAction, this.imagePaths, - this.onTapRemoveRuleFilterConditionCallback, + this.tapRemoveRuleFilterConditionCallback, }); @override @@ -56,7 +56,7 @@ class RuleFilterConditionWidget extends StatelessWidget { conditionValueEditingController, conditionValueFocusNode, conditionValueOnChangeAction, - onTapRemoveRuleFilterConditionCallback, + tapRemoveRuleFilterConditionCallback, imagePaths, ) ); @@ -74,7 +74,7 @@ Widget _buildRuleFilterCondition( TextEditingController? conditionValueEditingController, FocusNode? conditionValueFocusNode, OnChangeFilterInputAction? conditionValueOnChangeAction, - Function()? onTapRemoveRuleFilterConditionCallback, + Function()? tapRemoveRuleFilterConditionCallback, ImagePaths? imagePaths, ) { switch (ruleFilterConditionType) { @@ -111,7 +111,7 @@ Widget _buildRuleFilterCondition( case RuleFilterConditionType.tablet: case RuleFilterConditionType.desktop: return Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: DropDownButtonWidget( @@ -145,7 +145,7 @@ Widget _buildRuleFilterCondition( editingController: conditionValueEditingController, ) ), - _buildRemoveRuleFilterConditionButton(onTapRemoveRuleFilterConditionCallback, imagePaths), + _buildRemoveRuleFilterConditionButton(tapRemoveRuleFilterConditionCallback, imagePaths), ], ); default: @@ -154,13 +154,14 @@ Widget _buildRuleFilterCondition( } Widget _buildRemoveRuleFilterConditionButton ( - Function()? onTapRemoveRuleFilterConditionCallback, + Function()? tapRemoveRuleFilterConditionCallback, ImagePaths? imagePath, ) { return Container( padding: const EdgeInsets.only(left: 12), + alignment: Alignment.center, child: InkWell( - onTap: onTapRemoveRuleFilterConditionCallback, + onTap: tapRemoveRuleFilterConditionCallback, child: CircleAvatar( backgroundColor: AppColor.colorRemoveRuleFilterConditionButton, radius: 22, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index b2c4fb931..2175ee677 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-08-30T16:14:12.029258", + "@@last_modified": "2023-08-31T14:39:56.761446", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3211,5 +3211,11 @@ "placeholders": { "folder": {} } + }, + "addCondition": "Add condition", + "@addCondition": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index d3fe0532e..0d81d81ea 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3310,4 +3310,11 @@ class AppLocalizations { args: [folder] ); } + + String get addCondition { + return Intl.message( + 'Add condition', + name: 'addCondition', + ); + } } \ No newline at end of file