TF-2084 Update rule filter creator view for multi actions

(cherry picked from commit f885b446ebbb81b77ef56edf8ec45d99093ea717)
This commit is contained in:
hieubt
2023-10-02 17:27:44 +07:00
committed by Dat Vu
parent f8e5d3bab9
commit 061433dfbb
@@ -2,25 +2,23 @@ import 'package:core/core.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.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: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/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/styles/rule_filter_action_styles.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_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_action_list.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/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';
import 'model/rule_filter_condition_type.dart'; import 'model/rule_filter_condition_type.dart';
class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> { class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
@@ -182,40 +180,53 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16, fontSize: 16,
color: Colors.black)), color: Colors.black)),
const SizedBox(height: 24), const SizedBox(height: 24),
Container( Obx(() {
padding: const EdgeInsets.all(12), return RuleFilterActionListWidget(
decoration: BoxDecoration( responsiveUtils: _responsiveUtils,
color: AppColor.colorBackgroundFieldConditionRulesFilter, actionList: controller.listEmailRuleFilterActionSelected,
borderRadius: BorderRadius.circular(12)), onActionChanged: (newAction, index) {
child: Row(children: [ controller.selectEmailRuleFilterAction(newAction, index);
Expanded(child: Obx(() => DropDownButtonWidget<EmailRuleFilterAction>( },
items: EmailRuleFilterAction.values, forwardEmailEditingController: controller.forwardEmailController,
itemSelected: controller.emailRuleFilterActionSelected.value, forwardEmailFocusNode: controller.forwardEmailFocusNode,
onChanged: (newAction) => onChangeForwardEmail: (value, index) => controller.updateForwardEmailValue(context, value, index),
controller.selectEmailRuleFilterAction(newAction), tapActionDetailedCallback: (index) {
supportSelectionIcon: true))), KeyboardUtils.hideKeyboard(context);
Padding( controller.selectMailbox(context, index);
padding: const EdgeInsets.symmetric(horizontal: 12), },
child: Text( tapRemoveCallback: (index) => controller.tapRemoveAction(index),
AppLocalizations.of(context).toFolder, imagePaths: _imagePaths,
overflow: CommonTextStyle.defaultTextOverFlow, errorForwardEmail: controller.errorForwardEmailValue.value,
softWrap: CommonTextStyle.defaultSoftWrap, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
maxLines: 1, );
style: const TextStyle( }),
fontWeight: FontWeight.normal, Obx(() {
fontSize: 16, if (controller.isShowAddAction.value == true) {
color: Colors.black)), return Container(
), padding: const EdgeInsets.only(top: 8),
Expanded(child: Obx(() => child: InkWell(
RuleFilterButtonField<PresentationMailbox>( onTap: controller.tapAddAction,
value: controller.mailboxSelected.value, child: Row(
borderColor: _getBorderColorMailboxSelected(), crossAxisAlignment: CrossAxisAlignment.center,
tapActionCallback: (value) { children: [
KeyboardUtils.hideKeyboard(context); SvgPicture.asset(
controller.selectMailbox(context); _imagePaths.icAddNewFolder,
}))), fit: BoxFit.fill,
]) ),
), const SizedBox(width: 15,),
Text(
AppLocalizations.of(context).addAction,
maxLines: RuleFilterActionStyles.maxLines,
style: RuleFilterActionStyles.addActionButtonTextStyle
)
],
),
),
);
} else {
return const SizedBox.shrink();
}
})
] ]
), ),
), ),
@@ -330,41 +341,53 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16, fontSize: 16,
color: Colors.black)), color: Colors.black)),
const SizedBox(height: 24), const SizedBox(height: 24),
Container( Obx(() {
padding: const EdgeInsets.all(12), return RuleFilterActionListWidget(
decoration: BoxDecoration( responsiveUtils: _responsiveUtils,
color: AppColor.colorBackgroundFieldConditionRulesFilter, actionList: controller.listEmailRuleFilterActionSelected,
borderRadius: BorderRadius.circular(12)), onActionChanged: (newAction, index) {
child: Row(children: [ controller.selectEmailRuleFilterAction(newAction, index);
Expanded(child: Obx(() => DropDownButtonWidget<EmailRuleFilterAction>( },
items: EmailRuleFilterAction.values, forwardEmailEditingController: controller.forwardEmailController,
itemSelected: controller.emailRuleFilterActionSelected.value, forwardEmailFocusNode: controller.forwardEmailFocusNode,
onChanged: (newAction) => onChangeForwardEmail: (value, index) => controller.updateForwardEmailValue(context, value, index),
controller.selectEmailRuleFilterAction(newAction), tapActionDetailedCallback: (index) {
supportSelectionIcon: true))), KeyboardUtils.hideKeyboard(context);
Container( controller.selectMailbox(context, index);
alignment: Alignment.centerLeft, },
padding: const EdgeInsets.symmetric(horizontal: 12), tapRemoveCallback: (index) => controller.tapRemoveAction(index),
child: Text( imagePaths: _imagePaths,
AppLocalizations.of(context).toFolder, errorForwardEmail: controller.errorForwardEmailValue.value,
overflow: CommonTextStyle.defaultTextOverFlow, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
softWrap: CommonTextStyle.defaultSoftWrap, );
maxLines: 1, }),
style: const TextStyle( Obx(() {
fontWeight: FontWeight.normal, if (controller.isShowAddAction.value == true) {
fontSize: 16, return Container(
color: Colors.black)), padding: const EdgeInsets.only(top: 8),
child: InkWell(
onTap: controller.tapAddAction,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
_imagePaths.icAddNewFolder,
fit: BoxFit.fill,
),
const SizedBox(width: 15,),
Text(
AppLocalizations.of(context).addAction,
maxLines: RuleFilterActionStyles.maxLines,
style: RuleFilterActionStyles.addActionButtonTextStyle
)
],
),
), ),
Expanded(child: Obx(() => );
RuleFilterButtonField<PresentationMailbox>( } else {
value: controller.mailboxSelected.value, return const SizedBox.shrink();
borderColor: _getBorderColorMailboxSelected(), }
tapActionCallback: (value) { })
KeyboardUtils.hideKeyboard(context);
controller.selectMailbox(context);
}))),
])
),
] ]
), ),
), ),
@@ -498,47 +521,62 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
fontSize: 16, fontSize: 16,
color: Colors.black)), color: Colors.black)),
const SizedBox(height: 24), const SizedBox(height: 24),
Container( Obx(() {
padding: const EdgeInsets.all(12), return RuleFilterActionListWidget(
decoration: BoxDecoration( responsiveUtils: _responsiveUtils,
color: AppColor.colorBackgroundFieldConditionRulesFilter, actionList: controller.listEmailRuleFilterActionSelected,
borderRadius: BorderRadius.circular(12)), onActionChangeMobile: (currentAction, index) {
child: Column(children: [ KeyboardUtils.hideKeyboard(context);
Obx(() { controller.openContextMenuAction(
return RuleFilterButtonField<EmailRuleFilterAction>( context,
value: controller.emailRuleFilterActionSelected.value, _bottomSheetActionRuleFilterActionTiles(
tapActionCallback: (value) { context,
KeyboardUtils.hideKeyboard(context); currentAction,
controller.openContextMenuAction( index
context, )
_bottomSheetActionRuleFilterActionTiles( );
context, },
controller.emailRuleFilterActionSelected.value)); forwardEmailEditingController: controller.forwardEmailController,
} forwardEmailFocusNode: controller.forwardEmailFocusNode,
); onChangeForwardEmail: (value, index) => controller.updateForwardEmailValue(context, value, index),
}), tapActionDetailedCallback: (index) {
Container( KeyboardUtils.hideKeyboard(context);
alignment: Alignment.centerLeft, controller.selectMailbox(context, index);
padding: const EdgeInsets.symmetric(vertical: 12), },
child: Text( tapRemoveCallback: (index) => controller.tapRemoveAction(index),
AppLocalizations.of(context).toFolder, imagePaths: _imagePaths,
overflow: CommonTextStyle.defaultTextOverFlow, errorForwardEmail: controller.errorForwardEmailValue.value,
softWrap: CommonTextStyle.defaultSoftWrap, errorMailboxSelected: controller.errorMailboxSelectedValue.value,
maxLines: 1, );
style: const TextStyle( }),
fontWeight: FontWeight.normal, Obx(() {
fontSize: 16, if (controller.isShowAddAction.value == true) {
color: Colors.black)), return Container(
padding: const EdgeInsets.only(top: 12),
child: InkWell(
onTap: controller.tapAddAction,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
_imagePaths.icAddNewFolder,
fit: BoxFit.fill,
),
const SizedBox(width: 15,),
Text(
AppLocalizations.of(context).addAction,
maxLines: RuleFilterActionStyles.maxLines,
style: RuleFilterActionStyles.addActionButtonTextStyle
)
],
),
), ),
Obx(() => RuleFilterButtonField<PresentationMailbox>( );
value: controller.mailboxSelected.value, } else {
borderColor: _getBorderColorMailboxSelected(), return const SizedBox.shrink();
tapActionCallback: (value) { }
KeyboardUtils.hideKeyboard(context); })
controller.selectMailbox(context);
}))
])
),
] ]
), ),
), ),
@@ -745,18 +783,23 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
List<Widget> _bottomSheetActionRuleFilterActionTiles( List<Widget> _bottomSheetActionRuleFilterActionTiles(
BuildContext context, BuildContext context,
EmailRuleFilterAction? ruleActionSelected EmailRuleFilterAction? ruleActionSelected,
int ruleActionIndex,
) { ) {
return EmailRuleFilterAction.values final supportedAction = EmailRuleFilterAction.values
.where((ruleAction) => ruleAction.getSupported() == true)
.toList();
return supportedAction
.map((ruleAction) => .map((ruleAction) =>
_buildRuleActionWidget(context, ruleAction, ruleActionSelected)) _buildRuleActionWidget(context, ruleAction, ruleActionSelected, ruleActionIndex))
.toList(); .toList();
} }
Widget _buildRuleActionWidget( Widget _buildRuleActionWidget(
BuildContext context, BuildContext context,
EmailRuleFilterAction ruleAction, EmailRuleFilterAction ruleAction,
EmailRuleFilterAction? ruleActionSelected EmailRuleFilterAction? ruleActionSelected,
int ruleActionIndex,
) { ) {
return (RuleActionSheetActionTileBuilder( return (RuleActionSheetActionTileBuilder(
ruleAction.getTitle(context), ruleAction.getTitle(context),
@@ -770,17 +813,11 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
height: 20, height: 20,
fit: BoxFit.fill)) fit: BoxFit.fill))
..onActionClick((ruleAction) { ..onActionClick((ruleAction) {
controller.selectEmailRuleFilterAction(ruleAction); if (ruleAction != controller.listEmailRuleFilterActionSelected[ruleActionIndex].action) {
controller.selectEmailRuleFilterAction(ruleAction, ruleActionIndex);
}
popBack(); popBack();
})) }))
.build(); .build();
} }
Color _getBorderColorMailboxSelected() {
if (controller.errorRuleActionValue.value?.isNotEmpty == true) {
return AppColor.colorInputBorderErrorVerifyName;
} else {
return AppColor.colorInputBorderCreateMailbox;
}
}
} }