diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_detailed_builder.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_detailed_builder.dart new file mode 100644 index 000000000..3a8b001c7 --- /dev/null +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_detailed_builder.dart @@ -0,0 +1,57 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:model/mailbox/presentation_mailbox.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/widgets/rule_filter_button_field.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'; + +class RuleFilterActionDetailed extends StatelessWidget { + final EmailRuleFilterAction? actionType; + final PresentationMailbox? mailboxSelected; + final String? errorValue; + final Function()? tapActionDetailedCallback; + final TextEditingController? forwardEmailEditingController; + final FocusNode? forwardEmailFocusNode; + final OnChangeFilterInputAction? forwardEmailOnChangeAction; + + const RuleFilterActionDetailed({ + Key? key, + this.actionType, + this.mailboxSelected, + this.errorValue, + this.tapActionDetailedCallback, + this.forwardEmailEditingController, + this.forwardEmailFocusNode, + this.forwardEmailOnChangeAction, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final borderColor = errorValue?.isNotEmpty == true ? AppColor.colorInputBorderErrorVerifyName : AppColor.colorInputBorderCreateMailbox; + switch (actionType) { + case EmailRuleFilterAction.moveMessage: + return RuleFilterButtonField( + value: mailboxSelected, + borderColor: borderColor, + tapActionCallback: (value) { + tapActionDetailedCallback!(); + }, + ); + case EmailRuleFilterAction.forwardTo: + return RulesFilterInputField( + errorText: errorValue, + hintText: AppLocalizations.of(context).forwardEmailHintText, + editingController: forwardEmailEditingController, + focusNode: forwardEmailFocusNode, + onChangeAction: forwardEmailOnChangeAction, + ); + case EmailRuleFilterAction.maskAsSeen: + case EmailRuleFilterAction.startIt: + case EmailRuleFilterAction.rejectIt: + case EmailRuleFilterAction.markAsSpam: + default: + return const SizedBox.shrink(); + } + } +} diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_builder.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_builder.dart new file mode 100644 index 000000000..51655de3f --- /dev/null +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_builder.dart @@ -0,0 +1,93 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/style_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:model/mailbox/presentation_mailbox.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/email_rule_filter_action.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_filter_action_detailed_builder.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/main/localizations/app_localizations.dart'; + +class RuleFilterActionRow extends StatelessWidget { + final List actionList; + final EmailRuleFilterAction? actionSelected; + final Function(EmailRuleFilterAction?)? onActionChanged; + final PresentationMailbox? mailboxSelected; + final String? errorValue; + final Function()? tapActionDetailedCallback; + final ImagePaths? imagePaths; + final Function()? tapRemoveActionCallback; + final TextEditingController? forwardEmailEditingController; + final FocusNode? forwardEmailFocusNode; + final OnChangeFilterInputAction? onChangeForwardEmail; + + const RuleFilterActionRow({ + Key? key, + required this.actionList, + this.actionSelected, + this.onActionChanged, + this.mailboxSelected, + this.errorValue, + this.tapActionDetailedCallback, + this.imagePaths, + this.tapRemoveActionCallback, + this.forwardEmailEditingController, + this.forwardEmailFocusNode, + this.onChangeForwardEmail, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final supportedAction = actionList.where((action) => action.getSupported() == true).toList(); + return Row( + crossAxisAlignment: actionSelected == EmailRuleFilterAction.moveMessage ? CrossAxisAlignment.center : CrossAxisAlignment.start, + children: [ + Expanded( + child: DropDownButtonWidget( + items: supportedAction, + itemSelected: actionSelected, + onChanged: (newAction) => onActionChanged!(newAction), + supportSelectionIcon: true, + supportHint: true, + hintText: AppLocalizations.of(context).selectAction, + ), + ), + actionSelected == EmailRuleFilterAction.moveMessage + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: RuleFilterActionStyles.mainPadding), + child: Text( + AppLocalizations.of(context).toMailbox, + overflow: CommonTextStyle.defaultTextOverFlow, + softWrap: CommonTextStyle.defaultSoftWrap, + maxLines: RuleFilterActionStyles.maxLines, + style: RuleFilterActionStyles.textStyle, + ), + ) + : SizedBox( + width: actionSelected == EmailRuleFilterAction.forwardTo ? RuleFilterActionStyles.itemDistance : 0, + ), + Expanded( + child: RuleFilterActionDetailed( + actionType: actionSelected, + mailboxSelected: mailboxSelected, + errorValue: errorValue, + tapActionDetailedCallback: tapActionDetailedCallback, + forwardEmailEditingController: forwardEmailEditingController, + forwardEmailFocusNode: forwardEmailFocusNode, + forwardEmailOnChangeAction: onChangeForwardEmail, + ), + ), + Container( + padding: const EdgeInsets.only(left: RuleFilterActionStyles.mainPadding), + alignment: Alignment.center, + child: RuleFilterConditionRemoveButton( + imagePath: imagePaths, + tapRemoveRuleFilterConditionCallback: tapRemoveActionCallback, + ), + ) + ], + ); + } +} diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_mobile_builder.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_mobile_builder.dart new file mode 100644 index 000000000..9c878260a --- /dev/null +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_mobile_builder.dart @@ -0,0 +1,72 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:model/mailbox/presentation_mailbox.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/styles/rule_filter_action_styles.dart'; +import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_filter_action_detailed_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/rules_filter_input_field_builder.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class RuleFilterActionRowMobile extends StatelessWidget { + final EmailRuleFilterAction? actionSelected; + final Function()? tapActionCallback; + final PresentationMailbox? mailboxSelected; + final String? errorValue; + final Function()? tapActionDetailedCallback; + final TextEditingController? forwardEmailEditingController; + final FocusNode? forwardEmailFocusNode; + final OnChangeFilterInputAction? onChangeForwardEmail; + + const RuleFilterActionRowMobile({ + Key? key, + this.actionSelected, + this.tapActionCallback, + this.mailboxSelected, + this.errorValue, + this.tapActionDetailedCallback, + this.forwardEmailEditingController, + this.forwardEmailFocusNode, + this.onChangeForwardEmail, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RuleFilterButtonField( + value: actionSelected, + tapActionCallback: (value) { + tapActionCallback!(); + }, + hintText: AppLocalizations.of(context).selectAction, + ), + actionSelected == EmailRuleFilterAction.moveMessage + ? Container( + alignment: Alignment.centerLeft, + padding: const EdgeInsets.symmetric(vertical: RuleFilterActionStyles.mainPadding), + child: Text( + AppLocalizations.of(context).toMailbox, + overflow: CommonTextStyle.defaultTextOverFlow, + softWrap: CommonTextStyle.defaultSoftWrap, + maxLines: RuleFilterActionStyles.maxLines, + style: RuleFilterActionStyles.textStyle, + ), + ) + : SizedBox( + height: actionSelected == EmailRuleFilterAction.forwardTo ? RuleFilterActionStyles.itemDistance : 0, + ), + RuleFilterActionDetailed( + actionType: actionSelected, + mailboxSelected: mailboxSelected, + errorValue: errorValue, + tapActionDetailedCallback: tapActionDetailedCallback, + forwardEmailEditingController: forwardEmailEditingController, + forwardEmailFocusNode: forwardEmailFocusNode, + forwardEmailOnChangeAction: onChangeForwardEmail, + ), + ], + ); + } +} diff --git a/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_widget.dart b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_widget.dart new file mode 100644 index 000000000..29bb4b346 --- /dev/null +++ b/lib/features/rules_filter_creator/presentation/widgets/rule_filter_action_widget.dart @@ -0,0 +1,121 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:model/mailbox/presentation_mailbox.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/styles/rule_filter_action_styles.dart'; +import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_builder.dart'; +import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_filter_action_row_mobile_builder.dart'; +import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart'; + +class RuleFilterActionWidget extends StatelessWidget { + final ResponsiveUtils responsiveUtils; + final Function()? tapRemoveCallback; + final ImagePaths? imagePaths; + final EmailRuleFilterAction? actionSelected; + final Function(EmailRuleFilterAction?)? onActionChanged; + final Function()? onActionChangeMobile; + final PresentationMailbox? mailboxSelected; + final String? errorValue; + final Function()? tapActionDetailedCallback; + final TextEditingController? forwardEmailEditingController; + final FocusNode? forwardEmailFocusNode; + final OnChangeFilterInputAction? onChangeForwardEmail; + + const RuleFilterActionWidget({ + Key? key, + required this.responsiveUtils, + this.tapRemoveCallback, + this.imagePaths, + this.actionSelected, + this.onActionChanged, + this.mailboxSelected, + this.errorValue, + this.tapActionDetailedCallback, + this.forwardEmailEditingController, + this.forwardEmailFocusNode, + this.onChangeForwardEmail, + this.onActionChangeMobile, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Slidable( + enabled: responsiveUtils.isMobile(context) ? true : false, + endActionPane: ActionPane( + extentRatio: RuleFilterActionStyles.extentRatio, + motion: const BehindMotion(), + children: [ + CustomSlidableAction( + padding: const EdgeInsets.only(right: RuleFilterActionStyles.mainPadding), + borderRadius: const BorderRadius.only( + topRight: Radius.circular(RuleFilterActionStyles.mainBorderRadius), + bottomRight: Radius.circular(RuleFilterActionStyles.mainBorderRadius), + ), + onPressed: (_) => tapRemoveCallback!(), + backgroundColor: AppColor.colorBackgroundFieldConditionRulesFilter, + child: CircleAvatar( + backgroundColor: AppColor.colorRemoveRuleFilterConditionButton, + radius: RuleFilterActionStyles.removeButtonRadius, + child: SvgPicture.asset( + imagePaths!.icMinimize, + fit: BoxFit.fill, + colorFilter: AppColor.colorDeletePermanentlyButton.asFilter(), + ), + ), + ) + ], + ), + child: Builder( + builder: (context) { + SlidableController? slideController = Slidable.of(context); + return ValueListenableBuilder( + valueListenable: slideController?.direction ?? ValueNotifier(0), + builder: (context, value, _) { + var borderRadius = value != -1 + ? BorderRadius.circular(RuleFilterActionStyles.mainBorderRadius) + : const BorderRadius.only( + bottomLeft: Radius.circular(RuleFilterActionStyles.mainBorderRadius), + topLeft: Radius.circular(RuleFilterActionStyles.mainBorderRadius), + ); + return Container( + padding: const EdgeInsets.all(RuleFilterActionStyles.mainPadding), + decoration: BoxDecoration( + color: AppColor.colorBackgroundFieldConditionRulesFilter, + borderRadius: borderRadius, + ), + child: responsiveUtils.isMobile(context) + ? RuleFilterActionRowMobile( + actionSelected: actionSelected, + mailboxSelected: mailboxSelected, + errorValue: errorValue, + tapActionDetailedCallback: tapActionDetailedCallback, + forwardEmailEditingController: forwardEmailEditingController, + forwardEmailFocusNode: forwardEmailFocusNode, + onChangeForwardEmail: onChangeForwardEmail, + tapActionCallback: onActionChangeMobile, + ) + : RuleFilterActionRow( + actionList: EmailRuleFilterAction.values, + actionSelected: actionSelected, + onActionChanged: onActionChanged, + mailboxSelected: mailboxSelected, + errorValue: errorValue, + tapActionDetailedCallback: tapActionDetailedCallback, + imagePaths: imagePaths, + tapRemoveActionCallback: tapRemoveCallback, + forwardEmailEditingController: forwardEmailEditingController, + forwardEmailFocusNode: forwardEmailFocusNode, + onChangeForwardEmail: onChangeForwardEmail, + ) + ); + }, + ); + } + ), + ); + } +}