TF-599 Apply action context menu for mailbox

This commit is contained in:
dab246
2022-05-31 15:20:51 +07:00
committed by Dat H. Pham
parent 769d365387
commit 08b327737b
12 changed files with 301 additions and 75 deletions
@@ -57,29 +57,38 @@ class ConfirmationDialogActionSheetBuilder {
Container( Container(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 10), padding: EdgeInsets.symmetric(vertical: 8, horizontal: 10),
color: Colors.white, color: Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
child: Text( cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
_messageText ?? '', child: CupertinoActionSheetAction(
textAlign: TextAlign.center, child: Text(
style: _styleMessage ?? TextStyle(fontSize: 14, color: AppColor.colorMessageConfirmDialog)), _messageText ?? '',
onPressed: () => {}, textAlign: TextAlign.center,
style: _styleMessage ?? TextStyle(fontSize: 14, color: AppColor.colorMessageConfirmDialog)),
onPressed: () => {},
),
) )
), ),
Container( Container(
color: Colors.white, color: Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
child: Text( cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
_confirmText ?? '', child: CupertinoActionSheetAction(
style: _styleConfirmButton ?? TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorActionDeleteConfirmDialog)), child: Text(
onPressed: () => _onConfirmActionClick?.call(), _confirmText ?? '',
style: _styleConfirmButton ?? TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorActionDeleteConfirmDialog)),
onPressed: () => _onConfirmActionClick?.call(),
),
) )
), ),
], ],
cancelButton: CupertinoActionSheetAction( cancelButton: MouseRegion(
child: Text( cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
_cancelText ?? '', child: CupertinoActionSheetAction(
style: _styleCancelButton ?? TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorActionCancelDialog)), child: Text(
onPressed: () => _onCancelActionClick?.call(), _cancelText ?? '',
style: _styleCancelButton ?? TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorActionCancelDialog)),
onPressed: () => _onCancelActionClick?.call(),
),
), ),
)) ))
); );
@@ -25,11 +25,14 @@ mixin PopupContextMenuActionMixin {
} }
Widget buildCancelButton(BuildContext context) { Widget buildCancelButton(BuildContext context) {
return CupertinoActionSheetAction( return MouseRegion(
child: Text( cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
AppLocalizations.of(context).cancel, child: CupertinoActionSheetAction(
style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorTextButton)), child: Text(
onPressed: () => popBack(), AppLocalizations.of(context).cancel,
style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: AppColor.colorTextButton)),
onPressed: () => popBack(),
),
); );
} }
} }
@@ -30,19 +30,22 @@ class EmailActionCupertinoActionSheetActionBuilder extends CupertinoActionSheetA
Widget build() { Widget build() {
return Container( return Container(
color: bgColor ?? Colors.white, color: bgColor ?? Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
key: key, cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: CupertinoActionSheetAction(
Padding( key: key,
padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
child: actionIcon), Padding(
Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())), padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16),
]), child: actionIcon),
onPressed: () { Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
if (onCupertinoActionSheetActionClick != null) { ]),
onCupertinoActionSheetActionClick!(presentationEmail); onPressed: () {
} if (onCupertinoActionSheetActionClick != null) {
}, onCupertinoActionSheetActionClick!(presentationEmail);
}
},
),
), ),
); );
} }
@@ -684,6 +684,28 @@ class MailboxController extends BaseMailboxController {
} }
} }
void handleMailboxAction(BuildContext context, MailboxActions actions,
PresentationMailbox mailbox) {
popBack();
switch(actions) {
case MailboxActions.delete:
_openConfirmationDialogDeleteMailboxAction(context, mailbox);
break;
case MailboxActions.rename:
_openDialogRenameMailboxAction(context, mailbox);
break;
case MailboxActions.move:
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
break;
case MailboxActions.markAsRead:
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
break;
default:
break;
}
}
void closeMailboxScreen(BuildContext context) { void closeMailboxScreen(BuildContext context) {
_cancelSelectMailbox(); _cancelSelectMailbox();
mailboxDashBoardController.closeMailboxMenuDrawer(); mailboxDashBoardController.closeMailboxMenuDrawer();
@@ -5,17 +5,20 @@ import 'package:get/get.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin { class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin, PopupMenuWidgetMixin {
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -350,6 +353,63 @@ class MailboxView extends GetWidget<MailboxController> with AppLoaderMixin {
} }
void _openMailboxMenuAction(BuildContext context, RelativeRect position, void _openMailboxMenuAction(BuildContext context, RelativeRect position,
PresentationMailbox presentationMailbox) { PresentationMailbox mailbox) {
final listMailboxActions = [
MailboxActions.markAsRead,
if (!mailbox.hasRole()) MailboxActions.move,
if (!mailbox.hasRole()) MailboxActions.rename,
if (!mailbox.hasRole()) MailboxActions.delete,
];
if (_responsiveUtils.isScreenWithShortestSide(context)) {
controller.openContextMenuAction(context,
_bottomSheetIdentityActionTiles(context, mailbox, listMailboxActions));
} else {
controller.openPopupMenuAction(context, position,
_popupMenuMailboxActionTiles(context, mailbox, listMailboxActions));
}
}
List<Widget> _bottomSheetIdentityActionTiles(BuildContext context,
PresentationMailbox mailbox, List<MailboxActions> listMailboxActions) {
return listMailboxActions
.map((action) => _mailboxContextMenuActionTile(context, action, mailbox))
.toList();
}
Widget _mailboxContextMenuActionTile(BuildContext context, MailboxActions actions,
PresentationMailbox mailbox) {
return (MailboxBottomSheetActionTileBuilder(
Key('${actions.name}_action'),
SvgPicture.asset(
actions.getContextMenuIcon(_imagePaths),
color: actions.getColorContextMenuIcon()),
actions.getTitleContextMenu(context),
mailbox)
..onActionClick((mailbox) =>
controller.handleMailboxAction(context, actions, mailbox)))
.build();
}
List<PopupMenuEntry> _popupMenuMailboxActionTiles(BuildContext context,
PresentationMailbox mailbox, List<MailboxActions> listMailboxActions) {
return listMailboxActions
.map((action) => _mailboxPopupMenuActionTile(context, action, mailbox))
.toList();
}
PopupMenuItem _mailboxPopupMenuActionTile(BuildContext context, MailboxActions actions,
PresentationMailbox mailbox) {
return PopupMenuItem(
padding: EdgeInsets.zero,
child: popupItem(actions.getContextMenuIcon(_imagePaths),
actions.getTitleContextMenu(context),
colorIcon: actions.getColorContextMenuIcon(),
styleName: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 17,
color: actions.getColorContextMenuIcon()),
onCallbackAction: () =>
controller.handleMailboxAction(context, actions, mailbox)));
} }
} }
@@ -1,5 +1,7 @@
import 'package:core/core.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum MailboxActions { enum MailboxActions {
@@ -7,6 +9,8 @@ enum MailboxActions {
moveEmail, moveEmail,
delete, delete,
rename, rename,
move,
markAsRead,
} }
extension MailboxActionsExtension on MailboxActions { extension MailboxActionsExtension on MailboxActions {
@@ -21,4 +25,43 @@ extension MailboxActionsExtension on MailboxActions {
return ''; return '';
} }
} }
String getTitleContextMenu(BuildContext context) {
switch(this) {
case MailboxActions.markAsRead:
return AppLocalizations.of(context).mark_as_read;
case MailboxActions.move:
return AppLocalizations.of(context).moveMailbox;
case MailboxActions.rename:
return AppLocalizations.of(context).rename_mailbox;
case MailboxActions.delete:
return AppLocalizations.of(context).deleteMailbox;
default:
return '';
}
}
String getContextMenuIcon(ImagePaths imagePaths) {
switch(this) {
case MailboxActions.markAsRead:
return imagePaths.icRead;
case MailboxActions.move:
return imagePaths.icMove;
case MailboxActions.rename:
return imagePaths.icRenameMailbox;
case MailboxActions.delete:
return imagePaths.icDelete;
default:
return '';
}
}
Color getColorContextMenuIcon() {
switch(this) {
case MailboxActions.delete:
return AppColor.colorActionDeleteConfirmDialog;
default:
return Colors.black;
}
}
} }
@@ -0,0 +1,52 @@
import 'package:core/core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
class MailboxBottomSheetActionTileBuilder extends CupertinoActionSheetActionBuilder<PresentationMailbox> {
final PresentationMailbox presentationMailbox;
final SvgPicture? actionSelected;
final Color? bgColor;
final EdgeInsets? iconLeftPadding;
final EdgeInsets? iconRightPadding;
MailboxBottomSheetActionTileBuilder(
Key key,
SvgPicture actionIcon,
String actionName,
this.presentationMailbox,
{
this.actionSelected,
this.bgColor,
this.iconLeftPadding,
this.iconRightPadding,
}
) : super(key, actionIcon, actionName);
@override
Widget build() {
return Container(
color: bgColor ?? Colors.white,
child: MouseRegion(
cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: CupertinoActionSheetAction(
key: key,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Padding(
padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16),
child: actionIcon),
Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
]),
onPressed: () {
if (onCupertinoActionSheetActionClick != null) {
onCupertinoActionSheetActionClick!(presentationMailbox);
}
},
),
),
);
}
}
@@ -30,19 +30,22 @@ class IdentityBottomSheetActionTileBuilder extends CupertinoActionSheetActionBui
Widget build() { Widget build() {
return Container( return Container(
color: bgColor ?? Colors.white, color: bgColor ?? Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
key: key, cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: CupertinoActionSheetAction(
Padding( key: key,
padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
child: actionIcon), Padding(
Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())), padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16),
]), child: actionIcon),
onPressed: () { Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
if (onCupertinoActionSheetActionClick != null) { ]),
onCupertinoActionSheetActionClick!(identity); onPressed: () {
} if (onCupertinoActionSheetActionClick != null) {
}, onCupertinoActionSheetActionClick!(identity);
}
},
),
), ),
); );
} }
@@ -23,15 +23,18 @@ class AppActionSheetActionBuilder extends CupertinoActionSheetActionBuilder {
Widget build() { Widget build() {
return Container( return Container(
color: bgColor ?? Colors.white, color: bgColor ?? Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
key: key, cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: CupertinoActionSheetAction(
Padding( key: key,
padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
child: actionIcon), Padding(
Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())), padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16),
]), child: actionIcon),
onPressed: () => onCupertinoActionSheetActionClick?.call(null), Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
]),
onPressed: () => onCupertinoActionSheetActionClick?.call(null),
),
), ),
); );
} }
@@ -33,23 +33,26 @@ class FilterMessageCupertinoActionSheetActionBuilder
Widget build() { Widget build() {
return Container( return Container(
color: bgColor ?? Colors.white, color: bgColor ?? Colors.white,
child: CupertinoActionSheetAction( child: MouseRegion(
key: key, cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ child: CupertinoActionSheetAction(
Padding( key: key,
padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16), child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
child: actionIcon),
Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
if (optionCurrent == option && actionSelected != null)
Padding( Padding(
padding: iconRightPadding ?? const EdgeInsets.only(right: 12), padding: iconLeftPadding ?? const EdgeInsets.only(left: 12, right: 16),
child: actionSelected!), child: actionIcon),
]), Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())),
onPressed: () { if (optionCurrent == option && actionSelected != null)
if (onCupertinoActionSheetActionClick != null) { Padding(
onCupertinoActionSheetActionClick!(option); padding: iconRightPadding ?? const EdgeInsets.only(right: 12),
} child: actionSelected!),
}, ]),
onPressed: () {
if (onCupertinoActionSheetActionClick != null) {
onCupertinoActionSheetActionClick!(option);
}
},
),
), ),
); );
} }
+13 -1
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2022-05-27T10:11:30.148525", "@@last_modified": "2022-05-31T15:17:59.229845",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -1371,5 +1371,17 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"moveMailbox": "Move mailbox",
"@moveMailbox": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"deleteMailbox": "Delete mailbox",
"@deleteMailbox": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -1405,4 +1405,17 @@ class AppLocalizations {
'Can not get token, please check with your system administrator', 'Can not get token, please check with your system administrator',
name: 'canNotGetToken'); name: 'canNotGetToken');
} }
String get moveMailbox {
return Intl.message(
'Move mailbox',
name: 'moveMailbox',
);
}
String get deleteMailbox {
return Intl.message(
'Delete mailbox',
name: 'deleteMailbox');
}
} }