Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] TF-2085 Combine conditions to create rules #2145

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/features/base/widget/drop_down_button_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:tmail_ui_user/features/composer/presentation/model/font_name_type.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/rule_condition_combiner.dart';

class DropDownButtonWidget<T> extends StatelessWidget {

Expand Down Expand Up @@ -188,6 +189,9 @@ class DropDownButtonWidget<T> extends StatelessWidget {
if (item is EmailRuleFilterAction) {
return item.getTitle(context);
}
if (item is ConditionCombiner) {
return item.getTitle(context);
}
return '';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

enum ConditionCombiner {
and,
or;

String getTitle(BuildContext context) {
switch(this) {
case ConditionCombiner.and:
return AppLocalizations.of(context).all;
case ConditionCombiner.or:
return AppLocalizations.of(context).any;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.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/rule_condition_combiner.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
Expand All @@ -61,6 +62,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
final TextEditingController inputRuleNameController = TextEditingController();
final FocusNode inputRuleNameFocusNode = FocusNode();
final listRuleConditionValueArguments = RxList<RulesFilterInputFieldArguments>();
final conditionCombinerType = Rxn<ConditionCombiner>();

String? _newRuleName;

Expand Down Expand Up @@ -143,6 +145,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
}

void _setUpDefaultValueRuleFilter() {
conditionCombinerType.value = ConditionCombiner.and;
switch(actionType.value) {
case CreatorActionType.create:
RuleCondition newRuleCondition = RuleCondition(
Expand Down Expand Up @@ -419,4 +422,10 @@ class RulesFilterCreatorController extends BaseMailboxController {
listRuleCondition.removeAt(ruleConditionIndex);
listRuleConditionValueArguments.removeAt(ruleConditionIndex);
}

void selectConditionCombiner(ConditionCombiner? combinerType) {
if (combinerType != null) {
conditionCombinerType.value = combinerType;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
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';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rule_condition_combiner.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_action_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_condition_combiner_bottomsheet_action_tile_builder.dart';
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/rule_filter_title_builder.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';
Expand Down Expand Up @@ -137,14 +140,11 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
focusNode: controller.inputRuleNameFocusNode,
onChangeAction: (value) => controller.updateRuleName(context, value),)),
const SizedBox(height: 24),
Text(AppLocalizations.of(context).conditionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: 1,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black)),
Obx(() => RuleFilterTitle(
conditionCombinerType: controller.conditionCombinerType.value,
tapActionCallback: (value) => controller.selectConditionCombiner(value),
ruleFilterConditionScreenType: RuleFilterConditionScreenType.desktop,
)),
const SizedBox(height: 24),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.desktop),
Container(
Expand Down Expand Up @@ -288,15 +288,11 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
focusNode: controller.inputRuleNameFocusNode,
onChangeAction: (value) => controller.updateRuleName(context, value),)),
const SizedBox(height: 24),
Text(AppLocalizations.of(context).conditionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: 1,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24),
Obx(() => RuleFilterTitle(
conditionCombinerType: controller.conditionCombinerType.value,
tapActionCallback: (value) => controller.selectConditionCombiner(value),
ruleFilterConditionScreenType: RuleFilterConditionScreenType.tablet,
)),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.tablet),
Container(
padding: const EdgeInsets.only(top: 8),
Expand Down Expand Up @@ -445,14 +441,19 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
height: 1,
thickness: 0.2),
),
Text(AppLocalizations.of(context).conditionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: 1,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black)),
Obx(() => RuleFilterTitle(
conditionCombinerType: controller.conditionCombinerType.value,
ruleFilterConditionScreenType: RuleFilterConditionScreenType.mobile,
tapActionCallback: (value) => {
controller.openContextMenuAction(
context,
_bottomSheetRuleConditionCombinerActionTiles(
context,
controller.conditionCombinerType.value,
)
),
},
)),
const SizedBox(height: 24),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.mobile),
Container(
Expand Down Expand Up @@ -708,6 +709,39 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
.build();
}

List<Widget> _bottomSheetRuleConditionCombinerActionTiles(
BuildContext context,
ConditionCombiner? combinerSelected,
) {
return ConditionCombiner.values
.map((combiner) =>
_buildRuleConditionCombinerWidget(context, combiner, combinerSelected))
.toList();
}

Widget _buildRuleConditionCombinerWidget(
BuildContext context,
ConditionCombiner combiner,
ConditionCombiner? combinerSelected,
) {
return (RuleConditionCombinerSheetActionTileBuilder(
combiner.getTitle(context),
combiner,
combinerSelected,
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
iconRightPadding: const EdgeInsets.only(right: 12),
actionSelected: SvgPicture.asset(
_imagePaths.icFilterSelected,
width: 20,
height: 20,
fit: BoxFit.fill))
..onActionClick((combiner) {
controller.selectConditionCombiner(combiner);
popBack();
}))
.build();
}

List<Widget> _bottomSheetActionRuleFilterActionTiles(
BuildContext context,
EmailRuleFilterAction? ruleActionSelected
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import 'package:core/core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rule_condition_combiner.dart';

class RuleConditionCombinerSheetActionTileBuilder
extends CupertinoActionSheetNoIconBuilder<ConditionCombiner> {

final ConditionCombiner combiner;
final ConditionCombiner? combinerCurrent;
final SvgPicture? actionSelected;
final Color? bgColor;
final EdgeInsets? iconLeftPadding;
final EdgeInsets? iconRightPadding;

RuleConditionCombinerSheetActionTileBuilder(
String actionName,
this.combiner,
this.combinerCurrent,
{
Key? key,
this.actionSelected,
this.bgColor,
this.iconLeftPadding,
this.iconRightPadding,
}
) : super(actionName, key: key);

@override
Widget build() {
return Container(
color: bgColor ?? Colors.white,
child: MouseRegion(
cursor: PlatformInfo.isWeb
? MaterialStateMouseCursor.clickable
: MouseCursor.defer,
child: CupertinoActionSheetAction(
key: key,
child: Stack(
children: [
Center(
child: Text(actionName,
textAlign: TextAlign.center,
style: actionTextStyle()),
),
if (combinerCurrent == combiner && actionSelected != null)
Align(
alignment: Alignment.centerRight,
child: Padding(
padding: iconRightPadding ??
const EdgeInsets.only(right: 12),
child: actionSelected!),
),
],
),
onPressed: () {
if (onCupertinoActionSheetActionClick != null) {
onCupertinoActionSheetActionClick!(combiner);
}
},
),
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.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/rule_condition_combiner.dart';

typedef OnTapActionCallback<T> = Function(T? value);

Expand Down Expand Up @@ -71,6 +72,9 @@ class RuleFilterButtonField<T> extends StatelessWidget {
if (value is EmailRuleFilterAction) {
return value.getTitle(context);
}
if (value is ConditionCombiner) {
return value.getTitle(context);
}
return '';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:flutter/material.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_condition_combiner.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/widgets/rule_filter_button_field.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';

typedef OnTapActionCallback<RuleConditionCombiner> = Function(RuleConditionCombiner? value);

class RuleFilterTitle extends StatelessWidget {

final ConditionCombiner? conditionCombinerType;
final OnTapActionCallback? tapActionCallback;
final RuleFilterConditionScreenType ruleFilterConditionScreenType;

const RuleFilterTitle({
Key? key,
this.conditionCombinerType,
this.tapActionCallback,
required this.ruleFilterConditionScreenType,
}) : super(key: key);

@override
Widget build(BuildContext context) {
final conditionTitle = AppLocalizations.of(context).conditionTitleRulesFilter;

return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text(
conditionTitle.substring(0, 2),
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: 1,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
)
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 12),
width: 150,
child: ruleFilterConditionScreenType == RuleFilterConditionScreenType.mobile
? RuleFilterButtonField<ConditionCombiner>(
value: conditionCombinerType,
tapActionCallback: (value) {
KeyboardUtils.hideKeyboard(context);
tapActionCallback?.call(value);
},
)
: DropDownButtonWidget<ConditionCombiner>(
items: ConditionCombiner.values,
itemSelected: conditionCombinerType,
supportSelectionIcon: true,
onChanged: (value) {
KeyboardUtils.hideKeyboard(context);
tapActionCallback?.call(value);
},
),
),
Text(
conditionTitle.substring(6),
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: 1,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black
)
)
]
);
}
}
14 changes: 13 additions & 1 deletion lib/l10n/intl_messages.arb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"@@last_modified": "2023-08-31T14:39:56.761446",
"@@last_modified": "2023-09-13T09:40:22.389681",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
Expand Down Expand Up @@ -3217,5 +3217,17 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"all": "All",
"@all": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"any": "Any",
"@any": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
}
}
Loading
Loading