TF-2084 Add widget for action row

(cherry picked from commit aef42f4f70a54b98fcfe4534aac85372424c9d25)
This commit is contained in:
hieubt
2023-10-02 17:26:34 +07:00
committed by Dat Vu
parent ca631d54fc
commit 759476df5a
4 changed files with 343 additions and 0 deletions
@@ -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();
}
}
}
@@ -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,
),
)
],
);
}
}
@@ -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,
),
],
);
}
}
@@ -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,
)
);
},
);
}
),
);
}
}