TF-2085 Add Dropdown select condition group

(cherry picked from commit ec96c105814346e5c9c18efa1643aaadeb1ca77e)
This commit is contained in:
hieubt
2023-09-20 12:35:09 +07:00
committed by Dat Vu
parent 675259a813
commit ebb72f3a6f
15 changed files with 423 additions and 153 deletions
@@ -10,6 +10,7 @@ import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:rich_text_composer/rich_text_composer.dart' as rich_text_composer; import 'package:rich_text_composer/rich_text_composer.dart' as rich_text_composer;
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/font_name_type.dart'; 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/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/email_rule_filter_action.dart';
@@ -188,6 +189,9 @@ class DropDownButtonWidget<T> extends StatelessWidget {
if (item is EmailRuleFilterAction) { if (item is EmailRuleFilterAction) {
return item.getTitle(context); return item.getTitle(context);
} }
if (item is ConditionCombiner) {
return item.getTitle(context);
}
return ''; return '';
} }
} }
@@ -2,6 +2,7 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.dart' as rule_combiner;
extension RuleConditionFieldExtension on rule_condition.Field { extension RuleConditionFieldExtension on rule_condition.Field {
@@ -35,4 +36,16 @@ extension RuleConditionComparatorExtension on rule_condition.Comparator {
return AppLocalizations.of(context).notExactlyEquals; return AppLocalizations.of(context).notExactlyEquals;
} }
} }
}
extension RuleConditionCombinerExtension on rule_combiner.ConditionCombiner {
String getTitle(BuildContext context) {
switch(this) {
case rule_combiner.ConditionCombiner.AND:
return AppLocalizations.of(context).all;
case rule_combiner.ConditionCombiner.OR:
return AppLocalizations.of(context).any;
}
}
} }
@@ -16,6 +16,7 @@ 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_append_in.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; 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/rule_condition.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:rule_filter/rule_filter/tmail_rule.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/base/base_mailbox_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
@@ -61,6 +62,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
final TextEditingController inputRuleNameController = TextEditingController(); final TextEditingController inputRuleNameController = TextEditingController();
final FocusNode inputRuleNameFocusNode = FocusNode(); final FocusNode inputRuleNameFocusNode = FocusNode();
final listRuleConditionValueArguments = RxList<RulesFilterInputFieldArguments>(); final listRuleConditionValueArguments = RxList<RulesFilterInputFieldArguments>();
final conditionCombinerType = Rxn<ConditionCombiner>();
String? _newRuleName; String? _newRuleName;
@@ -143,6 +145,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
void _setUpDefaultValueRuleFilter() { void _setUpDefaultValueRuleFilter() {
conditionCombinerType.value = ConditionCombiner.AND;
switch(actionType.value) { switch(actionType.value) {
case CreatorActionType.create: case CreatorActionType.create:
RuleCondition newRuleCondition = RuleCondition( RuleCondition newRuleCondition = RuleCondition(
@@ -177,23 +180,27 @@ class RulesFilterCreatorController extends BaseMailboxController {
break; break;
case CreatorActionType.edit: case CreatorActionType.edit:
if (_currentTMailRule != null) { if (_currentTMailRule != null) {
RuleCondition currentRule = RuleCondition( RuleConditionGroup currentRule = RuleConditionGroup(
field: _currentTMailRule!.condition.field, conditionCombiner: _currentTMailRule!.conditionGroup!.conditionCombiner,
comparator: _currentTMailRule!.condition.comparator, conditions: _currentTMailRule!.conditionGroup!.conditions,
value: _currentTMailRule!.condition.value
); );
listRuleCondition.add(currentRule); for (var condition in currentRule.conditions) {
RulesFilterInputFieldArguments newRuleConditionValueArguments = RulesFilterInputFieldArguments( listRuleCondition.add(condition);
focusNode: FocusNode(), RulesFilterInputFieldArguments newRuleConditionValueArguments = RulesFilterInputFieldArguments(
errorText: '', focusNode: FocusNode(),
controller: TextEditingController(), errorText: '',
); controller: TextEditingController(),
listRuleConditionValueArguments.add(newRuleConditionValueArguments); );
listRuleConditionValueArguments.add(newRuleConditionValueArguments);
_setValueInputField(
newRuleConditionValueArguments.controller,
condition.value
);
}
conditionCombinerType.value = currentRule.conditionCombiner;
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage; emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
_setValueInputField(
listRuleConditionValueArguments[0].controller,
listRuleCondition[0].value
);
_newRuleName = _currentTMailRule!.name; _newRuleName = _currentTMailRule!.name;
_setValueInputField(inputRuleNameController, _newRuleName ?? ''); _setValueInputField(inputRuleNameController, _newRuleName ?? '');
_getAllMailboxAction(); _getAllMailboxAction();
@@ -367,8 +374,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
late EquatableMixin ruleFilterRequest; late EquatableMixin ruleFilterRequest;
if (actionType.value == CreatorActionType.create) { if (actionType.value == CreatorActionType.create) {
for (var ruleCondition in listRuleCondition) { final newTMailRule = TMailRule(
final newTMailRule = TMailRule(
id: _currentTMailRule?.id, id: _currentTMailRule?.id,
name: _newRuleName!, name: _newRuleName!,
action: RuleAction( action: RuleAction(
@@ -376,13 +382,12 @@ class RulesFilterCreatorController extends BaseMailboxController {
mailboxIds: [mailboxSelected.value!.id] mailboxIds: [mailboxSelected.value!.id]
) )
), ),
condition: rule_condition.RuleCondition( conditionGroup: RuleConditionGroup(
field: ruleCondition.field, conditionCombiner: conditionCombinerType.value!,
comparator: ruleCondition.comparator, conditions: listRuleCondition,
value: ruleCondition.value )
)); );
ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule); ruleFilterRequest = CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule);
}
} else { } else {
final newTMailRule = TMailRule( final newTMailRule = TMailRule(
id: _currentTMailRule?.id, id: _currentTMailRule?.id,
@@ -392,10 +397,9 @@ class RulesFilterCreatorController extends BaseMailboxController {
mailboxIds: [mailboxSelected.value!.id] mailboxIds: [mailboxSelected.value!.id]
) )
), ),
condition: rule_condition.RuleCondition( conditionGroup: RuleConditionGroup(
field: listRuleCondition[0].field, conditionCombiner: conditionCombinerType.value!,
comparator: listRuleCondition[0].comparator, conditions: listRuleCondition,
value: listRuleCondition[0].value
)); ));
ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule); ruleFilterRequest = EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule);
} }
@@ -425,4 +429,10 @@ class RulesFilterCreatorController extends BaseMailboxController {
listRuleCondition.removeAt(ruleConditionIndex); listRuleCondition.removeAt(ruleConditionIndex);
listRuleConditionValueArguments.removeAt(ruleConditionIndex); listRuleConditionValueArguments.removeAt(ruleConditionIndex);
} }
void selectConditionCombiner(ConditionCombiner? combinerType) {
if (combinerType != null) {
conditionCombinerType.value = combinerType;
}
}
} }
@@ -5,15 +5,18 @@ import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:pointer_interceptor/pointer_interceptor.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' as rule_condition;
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.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/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/email_rule_filter_action.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/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_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_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_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_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_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/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/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
@@ -137,41 +140,38 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
focusNode: controller.inputRuleNameFocusNode, focusNode: controller.inputRuleNameFocusNode,
onChangeAction: (value) => controller.updateRuleName(context, value),)), onChangeAction: (value) => controller.updateRuleName(context, value),)),
const SizedBox(height: 24), const SizedBox(height: 24),
Text(AppLocalizations.of(context).conditionTitleRulesFilter, Obx(() => RuleFilterTitle(
overflow: CommonTextStyle.defaultTextOverFlow, conditionCombinerType: controller.conditionCombinerType.value,
softWrap: CommonTextStyle.defaultSoftWrap, tapActionCallback: (value) => controller.selectConditionCombiner(value),
maxLines: 1, ruleFilterConditionScreenType: RuleFilterConditionScreenType.desktop,
style: const TextStyle( )),
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24), const SizedBox(height: 24),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.desktop), _buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.desktop),
// Container( Container(
// padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8),
// child: InkWell( child: InkWell(
// onTap: controller.tapAddCondition, onTap: controller.tapAddCondition,
// child: Row( child: Row(
// crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
// children: [ children: [
// SvgPicture.asset( SvgPicture.asset(
// _imagePaths.icAddNewFolder, _imagePaths.icAddNewFolder,
// fit: BoxFit.fill, fit: BoxFit.fill,
// ), ),
// const SizedBox(width: 15,), const SizedBox(width: 15,),
// Text( Text(
// AppLocalizations.of(context).addCondition, AppLocalizations.of(context).addCondition,
// maxLines: 1, maxLines: 1,
// style: const TextStyle( style: const TextStyle(
// fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
// fontSize: 17, fontSize: 17,
// color: AppColor.primaryColor color: AppColor.primaryColor
// ) )
// ) )
// ], ],
// ), ),
// ), ),
// ), ),
const SizedBox(height: 24), const SizedBox(height: 24),
Text(AppLocalizations.of(context).actionTitleRulesFilter, Text(AppLocalizations.of(context).actionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
@@ -288,41 +288,38 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
focusNode: controller.inputRuleNameFocusNode, focusNode: controller.inputRuleNameFocusNode,
onChangeAction: (value) => controller.updateRuleName(context, value),)), onChangeAction: (value) => controller.updateRuleName(context, value),)),
const SizedBox(height: 24), const SizedBox(height: 24),
Text(AppLocalizations.of(context).conditionTitleRulesFilter, Obx(() => RuleFilterTitle(
overflow: CommonTextStyle.defaultTextOverFlow, conditionCombinerType: controller.conditionCombinerType.value,
softWrap: CommonTextStyle.defaultSoftWrap, tapActionCallback: (value) => controller.selectConditionCombiner(value),
maxLines: 1, ruleFilterConditionScreenType: RuleFilterConditionScreenType.tablet,
style: const TextStyle( )),
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.black)),
const SizedBox(height: 24), const SizedBox(height: 24),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.tablet), _buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.tablet),
// Container( Container(
// padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8),
// child: InkWell( child: InkWell(
// onTap: controller.tapAddCondition, onTap: controller.tapAddCondition,
// child: Row( child: Row(
// crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
// children: [ children: [
// SvgPicture.asset( SvgPicture.asset(
// _imagePaths.icAddNewFolder, _imagePaths.icAddNewFolder,
// fit: BoxFit.fill, fit: BoxFit.fill,
// ), ),
// const SizedBox(width: 15,), const SizedBox(width: 15,),
// Text( Text(
// AppLocalizations.of(context).addCondition, AppLocalizations.of(context).addCondition,
// maxLines: 1, maxLines: 1,
// style: const TextStyle( style: const TextStyle(
// fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
// fontSize: 17, fontSize: 17,
// color: AppColor.primaryColor color: AppColor.primaryColor
// ) )
// ) )
// ], ],
// ), ),
// ), ),
// ), ),
const SizedBox(height: 24), const SizedBox(height: 24),
Text(AppLocalizations.of(context).actionTitleRulesFilter, Text(AppLocalizations.of(context).actionTitleRulesFilter,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
@@ -445,42 +442,47 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
height: 1, height: 1,
thickness: 0.2), thickness: 0.2),
), ),
Text(AppLocalizations.of(context).conditionTitleRulesFilter, Obx(() => RuleFilterTitle(
overflow: CommonTextStyle.defaultTextOverFlow, conditionCombinerType: controller.conditionCombinerType.value,
softWrap: CommonTextStyle.defaultSoftWrap, ruleFilterConditionScreenType: RuleFilterConditionScreenType.mobile,
maxLines: 1, tapActionCallback: (value) => {
style: const TextStyle( controller.openContextMenuAction(
fontWeight: FontWeight.w500, context,
fontSize: 16, _bottomSheetRuleConditionCombinerActionTiles(
color: Colors.black)), context,
controller.conditionCombinerType.value,
)
),
},
)),
const SizedBox(height: 24), const SizedBox(height: 24),
_buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.mobile), _buildListRuleFilterConditionList(context, RuleFilterConditionScreenType.mobile),
// Container( Container(
// padding: const EdgeInsets.only(top: 12), padding: const EdgeInsets.only(top: 12),
// child: InkWell( child: InkWell(
// onTap: controller.tapAddCondition, onTap: controller.tapAddCondition,
// child: Row( child: Row(
// crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
// children: [ children: [
// SvgPicture.asset( SvgPicture.asset(
// _imagePaths.icAddNewFolder, _imagePaths.icAddNewFolder,
// fit: BoxFit.fill, fit: BoxFit.fill,
// ), ),
// const SizedBox(width: 15,), const SizedBox(width: 15,),
// Text( Text(
// AppLocalizations.of(context).addCondition, AppLocalizations.of(context).addCondition,
// maxLines: 1, maxLines: 1,
// style: const TextStyle( style: const TextStyle(
// fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
// fontSize: 17, fontSize: 17,
// color: AppColor.primaryColor color: AppColor.primaryColor
// ) )
// ) )
// ], ],
// ), ),
// ), ),
// ), ),
const Padding( const Padding(
padding: EdgeInsets.symmetric(vertical: 12), padding: EdgeInsets.symmetric(vertical: 12),
child: Divider( child: Divider(
@@ -708,6 +710,39 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
.build(); .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( List<Widget> _bottomSheetActionRuleFilterActionTiles(
BuildContext context, BuildContext context,
EmailRuleFilterAction? ruleActionSelected EmailRuleFilterAction? ruleActionSelected
@@ -0,0 +1,6 @@
import 'package:flutter/material.dart';
class RuleConditionCombinerBottomSheetStyles {
static const Color defaultBgColor = Colors.white;
static const double defaultIconRightPadding = 12.0;
}
@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
class RuleFilterTitleStyles {
static const double fontSize = 16.0;
static const Color textColor = Colors.black;
static const TextStyle textStyle = TextStyle(
fontWeight: FontWeight.w500,
fontSize: fontSize,
color: textColor,
);
static const int textMaxLines = 1;
static const double combinerTypeSelectionAreaWith = 200.0;
static const double combinerTypeSelectionAreaPadding = 12.0;
}
@@ -0,0 +1,69 @@
import 'package:core/core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/styles/rule_condition_combiner_bottom_sheet_styles.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 ?? RuleConditionCombinerBottomSheetStyles.defaultBgColor,
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: RuleConditionCombinerBottomSheetStyles.defaultIconRightPadding),
child: actionSelected!
),
),
],
),
onPressed: () {
if (onCupertinoActionSheetActionClick != null) {
onCupertinoActionSheetActionClick!(combiner);
}
},
),
),
);
}
}
@@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition; import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; 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/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/email_rule_filter_action.dart';
@@ -71,6 +72,9 @@ class RuleFilterButtonField<T> extends StatelessWidget {
if (value is EmailRuleFilterAction) { if (value is EmailRuleFilterAction) {
return value.getTitle(context); return value.getTitle(context);
} }
if (value is ConditionCombiner) {
return value.getTitle(context);
}
return ''; return '';
} }
} }
@@ -6,6 +6,7 @@ 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/base/widget/drop_down_button_widget.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/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/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_remove_button_builder.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_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/localizations/app_localizations.dart';
@@ -105,14 +106,14 @@ class RuleFilterConditionRow extends StatelessWidget {
editingController: conditionValueEditingController, editingController: conditionValueEditingController,
) )
), ),
// Container( Container(
// padding: const EdgeInsets.only(left: 12), padding: const EdgeInsets.only(left: 12),
// alignment: Alignment.center, alignment: Alignment.center,
// child: RuleFilterConditionRemoveButton( child: RuleFilterConditionRemoveButton(
// tapRemoveRuleFilterConditionCallback: tapRemoveRuleFilterConditionCallback, tapRemoveRuleFilterConditionCallback: tapRemoveRuleFilterConditionCallback,
// imagePath: imagePaths, imagePath: imagePaths,
// ) )
// ), ),
], ],
); );
default: default:
@@ -37,8 +37,7 @@ class RuleFilterConditionWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Slidable( return Slidable(
// enabled: ruleFilterConditionScreenType == RuleFilterConditionScreenType.mobile ? true : false, enabled: ruleFilterConditionScreenType == RuleFilterConditionScreenType.mobile ? true : false,
enabled: false,
endActionPane: ActionPane( endActionPane: ActionPane(
extentRatio: 0.1, extentRatio: 0.1,
motion: const BehindMotion(), motion: const BehindMotion(),
@@ -0,0 +1,71 @@
import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:flutter/material.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.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_filter_condition_type.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/styles/rule_filter_title_styles.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(ConditionCombiner? value);
class RuleFilterTitle extends StatelessWidget {
final ConditionCombiner? conditionCombinerType;
final OnTapActionCallback? tapActionCallback;
final RuleFilterConditionScreenType ruleFilterConditionScreenType;
const RuleFilterTitle({
Key? key,
required this.ruleFilterConditionScreenType,
this.conditionCombinerType,
this.tapActionCallback,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text(
AppLocalizations.of(context).conditionTitleRulesFilterBeforeCombiner,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
maxLines: RuleFilterTitleStyles.textMaxLines,
style: RuleFilterTitleStyles.textStyle,
),
Container(
padding: const EdgeInsets.symmetric(horizontal: RuleFilterTitleStyles.combinerTypeSelectionAreaPadding),
width: RuleFilterTitleStyles.combinerTypeSelectionAreaWith,
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);
},
),
),
Expanded(
child: Text(
AppLocalizations.of(context).conditionTitleRulesFilterAfterCombiner,
overflow: CommonTextStyle.defaultTextOverFlow,
style: RuleFilterTitleStyles.textStyle,
),
)
]
);
}
}
+25 -1
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2023-10-27T20:44:50.998215", "@@last_modified": "2023-09-16T17:09:02.481409",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -3325,5 +3325,29 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"all": "All",
"@all": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"any": "Any",
"@any": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"conditionTitleRulesFilterBeforeCombiner": "If",
"@conditionTitleRulesFilterBeforeCombiner": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"conditionTitleRulesFilterAfterCombiner": "of the following conditions are met:",
"@conditionTitleRulesFilterAfterCombiner": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -3428,4 +3428,32 @@ class AppLocalizations {
name: 'sending', name: 'sending',
); );
} }
String get all {
return Intl.message(
'All',
name: 'all',
);
}
String get any {
return Intl.message(
'Any',
name: 'any',
);
}
String get conditionTitleRulesFilterBeforeCombiner {
return Intl.message(
'If',
name: 'conditionTitleRulesFilterBeforeCombiner',
);
}
String get conditionTitleRulesFilterAfterCombiner {
return Intl.message(
'of the following conditions are met:',
name: 'conditionTitleRulesFilterAfterCombiner',
);
}
} }
@@ -24,9 +24,9 @@ class RuleConditionGroup extends FilterCondition {
@override @override
List<Object?> get props => [ List<Object?> get props => [
conditionCombiner, conditionCombiner,
conditions, conditions,
]; ];
factory RuleConditionGroup.fromJson(Map<String, dynamic> json) => factory RuleConditionGroup.fromJson(Map<String, dynamic> json) =>
_$RuleConditionGroupFromJson(json); _$RuleConditionGroupFromJson(json);
+3 -11
View File
@@ -15,7 +15,9 @@ part 'tmail_rule.g.dart';
class TMailRule extends Rule { class TMailRule extends Rule {
final RuleId? id; final RuleId? id;
final String name; final String name;
@JsonKey(includeIfNull: false)
final RuleCondition? condition; final RuleCondition? condition;
@JsonKey(includeIfNull: false)
final RuleConditionGroup? conditionGroup; final RuleConditionGroup? conditionGroup;
final RuleAction action; final RuleAction action;
@@ -30,17 +32,7 @@ class TMailRule extends Rule {
factory TMailRule.fromJson(Map<String, dynamic> json) => factory TMailRule.fromJson(Map<String, dynamic> json) =>
_$TMailRuleFromJson(json); _$TMailRuleFromJson(json);
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() => _$TMailRuleToJson(this);
final result = _$TMailRuleToJson(this);
if (result['condition'] != null) {
result.remove('conditionGroup');
} else {
result.remove('condition');
}
return result;
}
@override @override
List<Object?> get props => [ List<Object?> get props => [