TF-2085 Add RuleConditionGroup
(cherry picked from commit d6e642fe707627a29931265fe156d17fb01d8d64)
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
import 'package:jmap_dart_client/jmap/core/filter/filter_condition.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_condition.dart';
|
||||
|
||||
part 'rule_condition_group.g.dart';
|
||||
|
||||
enum ConditionCombiner {
|
||||
@JsonValue('AND')
|
||||
AND,
|
||||
@JsonValue('OR')
|
||||
OR
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class RuleConditionGroup extends FilterCondition {
|
||||
final ConditionCombiner conditionCombiner;
|
||||
|
||||
final List<RuleCondition> conditions;
|
||||
|
||||
RuleConditionGroup({
|
||||
required this.conditionCombiner,
|
||||
required this.conditions,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
conditionCombiner,
|
||||
conditions,
|
||||
];
|
||||
|
||||
factory RuleConditionGroup.fromJson(Map<String, dynamic> json) =>
|
||||
_$RuleConditionGroupFromJson(json);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() => _$RuleConditionGroupToJson(this);
|
||||
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import 'package:rule_filter/rule_filter/converter/rule_id_nullable_converter.dar
|
||||
import 'package:rule_filter/rule_filter/rule.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_action.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_condition.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_id.dart';
|
||||
|
||||
part 'tmail_rule.g.dart';
|
||||
@@ -14,26 +15,39 @@ part 'tmail_rule.g.dart';
|
||||
class TMailRule extends Rule {
|
||||
final RuleId? id;
|
||||
final String name;
|
||||
final RuleCondition condition;
|
||||
final RuleCondition? condition;
|
||||
final RuleConditionGroup? conditionGroup;
|
||||
final RuleAction action;
|
||||
|
||||
TMailRule({
|
||||
this.id,
|
||||
required this.name,
|
||||
required this.condition,
|
||||
this.condition,
|
||||
this.conditionGroup,
|
||||
required this.action,
|
||||
});
|
||||
|
||||
factory TMailRule.fromJson(Map<String, dynamic> json) =>
|
||||
_$TMailRuleFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$TMailRuleToJson(this);
|
||||
Map<String, dynamic> toJson() {
|
||||
final result = _$TMailRuleToJson(this);
|
||||
|
||||
if (result['condition'] != null) {
|
||||
result.remove('conditionGroup');
|
||||
} else {
|
||||
result.remove('condition');
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
name,
|
||||
condition,
|
||||
action,
|
||||
conditionGroup,
|
||||
];
|
||||
|
||||
TMailRule copyWith({
|
||||
@@ -41,12 +55,14 @@ class TMailRule extends Rule {
|
||||
String? name,
|
||||
RuleCondition? condition,
|
||||
RuleAction? action,
|
||||
RuleConditionGroup? conditionGroup,
|
||||
}) {
|
||||
return TMailRule(
|
||||
id: id ?? this.id,
|
||||
name: name ?? this.name,
|
||||
condition: condition ?? this.condition,
|
||||
action: action ?? this.action,
|
||||
conditionGroup: conditionGroup ?? this.conditionGroup,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.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';
|
||||
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_filter_id.dart';
|
||||
import 'package:rule_filter/rule_filter/rule_id.dart';
|
||||
import 'package:rule_filter/rule_filter/set/set_rule_filter_method.dart';
|
||||
@@ -20,6 +21,21 @@ void main() {
|
||||
final expectedUpdated = TMailRule(
|
||||
id: RuleId(id: Id('1')),
|
||||
name: 'My first rule',
|
||||
conditionGroup: RuleConditionGroup(
|
||||
conditionCombiner: ConditionCombiner.AND,
|
||||
conditions: [
|
||||
RuleCondition(
|
||||
value: 'question',
|
||||
comparator: Comparator.contains,
|
||||
field: Field.subject,
|
||||
),
|
||||
RuleCondition(
|
||||
field: Field.from,
|
||||
comparator: Comparator.contains,
|
||||
value: 'user2'
|
||||
)
|
||||
]
|
||||
),
|
||||
condition: RuleCondition(
|
||||
value: 'question',
|
||||
comparator: Comparator.contains,
|
||||
@@ -54,6 +70,21 @@ void main() {
|
||||
"singleton": {
|
||||
"id": "1",
|
||||
"name": "My first rule",
|
||||
"conditionGroup": {
|
||||
"conditionCombiner": "AND",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "subject",
|
||||
"comparator": "contains",
|
||||
"value": "question"
|
||||
},
|
||||
{
|
||||
"field": "from",
|
||||
"comparator": "contains",
|
||||
"value": "user2"
|
||||
},
|
||||
]
|
||||
},
|
||||
"condition": {
|
||||
"field": "subject",
|
||||
"comparator": "contains",
|
||||
|
||||
Reference in New Issue
Block a user