TF-2084 Add widget for action row
(cherry picked from commit aef42f4f70a54b98fcfe4534aac85372424c9d25)
This commit is contained in:
+57
@@ -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<PresentationMailbox>(
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+93
@@ -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<EmailRuleFilterAction> 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<EmailRuleFilterAction>(
|
||||||
|
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,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+72
@@ -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<EmailRuleFilterAction>(
|
||||||
|
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,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
+121
@@ -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<int>(
|
||||||
|
valueListenable: slideController?.direction ?? ValueNotifier<int>(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,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user