From cbc3243907b678ec7d3b66be318321310bf19519 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 20 Feb 2023 13:40:16 +0700 Subject: [PATCH] TF-1176 Fix delete button is enable even when no mailbox is selected --- .../views/button/button_builder.dart | 24 ++- .../presentation/mailbox_controller.dart | 25 +++ .../mailbox/presentation/mailbox_view.dart | 52 +++--- .../bottom_bar_selection_mailbox_widget.dart | 152 +++++------------- .../list_presentation_mailbox_extension.dart | 6 + 5 files changed, 117 insertions(+), 142 deletions(-) diff --git a/core/lib/presentation/views/button/button_builder.dart b/core/lib/presentation/views/button/button_builder.dart index 6758b30d2..0dde01af3 100644 --- a/core/lib/presentation/views/button/button_builder.dart +++ b/core/lib/presentation/views/button/button_builder.dart @@ -25,6 +25,7 @@ class ButtonBuilder { double? _radiusSplash; double? _maxWidth; EdgeInsets? _padding; + String? _tooltip; void key(Key key) { _key = key; @@ -79,6 +80,10 @@ class ButtonBuilder { _isVertical = isVertical; } + void tooltip(String? message) { + _tooltip = message; + } + ButtonBuilder(this._icon); void onPressActionClick(OnPressActionClick onPressActionClick) { @@ -109,14 +114,17 @@ class ButtonBuilder { }, customBorder: RoundedRectangleBorder( borderRadius: BorderRadius.circular(_radiusSplash ?? 20)), - child: Container( - key: _key, - alignment: Alignment.center, - color: _decoration == null ? _colorButton : null, - decoration: _decoration, - width: _maxWidth, - padding: _padding ?? EdgeInsets.zero, - child: _buildBody() + child: Tooltip( + message: _tooltip ?? '', + child: Container( + key: _key, + alignment: Alignment.center, + color: _decoration == null ? _colorButton : null, + decoration: _decoration, + width: _maxWidth, + padding: _padding ?? EdgeInsets.zero, + child: _buildBody() + ), ) ), ); diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index f490bbea5..2e743ded2 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -573,6 +573,31 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE; + List get listActionOfMailboxSelected { + final currentMailboxesSelected = listMailboxSelected; + + if (currentMailboxesSelected.length == 1) { + if (currentMailboxesSelected.isAllDefaultMailboxes && currentMailboxesSelected.isAllUnreadMailboxes) { + return [MailboxActions.markAsRead]; + } else if (currentMailboxesSelected.isAllPersonalMailboxes) { + return [ + MailboxActions.move, + MailboxActions.rename, + if (currentMailboxesSelected.isAllUnreadMailboxes) + MailboxActions.markAsRead, + MailboxActions.delete + ]; + } else { + return []; + } + } else if (currentMailboxesSelected.length > 1 + && currentMailboxesSelected.isAllPersonalMailboxes) { + return [MailboxActions.delete]; + } else { + return []; + } + } + void _cancelSelectMailbox() { unAllSelectedMailboxNode(); currentSelectMode.value = SelectMode.INACTIVE; diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index afd9c47e9..6fc36208f 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -58,9 +58,14 @@ class MailboxView extends GetWidget ) ), )), - Obx(() => controller.isSelectionEnabled() - ? _buildOptionSelectionMailbox(context) - : const SizedBox.shrink()), + Obx(() { + if (controller.isSelectionEnabled() + && controller.listActionOfMailboxSelected.isNotEmpty) { + return _buildOptionSelectionMailbox(context); + } else { + return const SizedBox.shrink(); + } + }), ]), ), Obx(() => controller.isMailboxListScrollable.isTrue @@ -377,21 +382,32 @@ class MailboxView extends GetWidget } Widget _buildOptionSelectionMailbox(BuildContext context) { - return Column(children: [ - const Divider(color: AppColor.lineItemListColor, height: 1, thickness: 0.2), - SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: (BottomBarSelectionMailboxWidget(context, - _imagePaths, - controller.listMailboxSelected) - ..addOnMailboxActionsClick((actions, listMailboxSelected) => - controller.pressMailboxSelectionAction( - context, - actions, - listMailboxSelected))) - .build())) - ]); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Divider( + color: AppColor.lineItemListColor, + height: 1, + thickness: 0.2 + ), + SafeArea( + right: false, + top: false, + child: BottomBarSelectionMailboxWidget( + _responsiveUtils, + _imagePaths, + controller.listMailboxSelected, + controller.listActionOfMailboxSelected, + onMailboxActionsClick: (actions, listMailboxSelected) => + controller.pressMailboxSelectionAction( + context, + actions, + listMailboxSelected + ) + ) + ) + ] + ); } Widget _buildVersionInformation(BuildContext context, PackageInfo packageInfo) { diff --git a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart index 3ca8a43ff..2d8dbecfd 100644 --- a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart +++ b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart @@ -1,133 +1,53 @@ -import 'package:core/core.dart'; +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:core/presentation/views/button/button_builder.dart'; import 'package:flutter/material.dart'; -import 'package:model/model.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; typedef OnMailboxActionsClick = void Function(MailboxActions, List); -class BottomBarSelectionMailboxWidget { +class BottomBarSelectionMailboxWidget extends StatelessWidget { - final BuildContext _context; + final ResponsiveUtils _responsiveUtils; final ImagePaths _imagePaths; final List _listSelectionMailbox; + final List _listMailboxActions; + final OnMailboxActionsClick onMailboxActionsClick; - OnMailboxActionsClick? _onMailboxActionsClick; - - BottomBarSelectionMailboxWidget( - this._context, + const BottomBarSelectionMailboxWidget( + this._responsiveUtils, this._imagePaths, this._listSelectionMailbox, - ); + this._listMailboxActions, + { + Key? key, + required this.onMailboxActionsClick + } + ) : super(key: key); - void addOnMailboxActionsClick(OnMailboxActionsClick onMailboxActionsClick) { - _onMailboxActionsClick = onMailboxActionsClick; + + @override + Widget build(BuildContext context) { + return Row(children: _listMailboxActions + .map((action) => _buildMailboxActionButton(context, action)) + .toList()); } - Widget build() { - return Container( - key: const Key('bottom_bar_selection_mailbox_widget'), - alignment: Alignment.center, - color: Colors.white, - child: MediaQuery( - data: const MediaQueryData(padding: EdgeInsets.zero), - child: SafeArea(child: _buildListOptionButton()) + Widget _buildMailboxActionButton(BuildContext context, MailboxActions actions) { + return Expanded(child: (ButtonBuilder(actions.getContextMenuIcon(_imagePaths)) + ..key(const Key('button_move_all_mailbox')) + ..radiusSplash(8) + ..padding(const EdgeInsets.all(8)) + ..tooltip(actions.getTitleContextMenu(context)) + ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) + ..iconColor(AppColor.colorTextButton) + ..onPressActionClick(() => onMailboxActionsClick.call(actions, _listSelectionMailbox)) + ..text( + _responsiveUtils.isLandscapeMobile(context) ? null : actions.getTitleContextMenu(context), + isVertical: true ) - ); + ).build()); } - - Widget _buildListOptionButton() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded(child: (ButtonBuilder(_imagePaths.icMoveMailbox) - ..key(const Key('button_move_all_mailbox')) - ..paddingIcon(const EdgeInsets.all(8)) - ..textStyle(TextStyle( - fontSize: 12, - color: _isMoveMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3))) - ..iconColor(_isMoveMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3)) - ..onPressActionClick(() { - if (_isMoveMailboxValid) { - _onMailboxActionsClick?.call(MailboxActions.move, _listSelectionMailbox); - } - }) - ..text(AppLocalizations.of(_context).move, isVertical: true)) - .build()), - Expanded(child: (ButtonBuilder(_imagePaths.icRenameMailbox) - ..key(const Key('button_rename_mailbox')) - ..paddingIcon(const EdgeInsets.all(8)) - ..textStyle(TextStyle( - fontSize: 12, - color: _isRenameMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3))) - ..iconColor(_isRenameMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3)) - ..onPressActionClick(() { - if (_isRenameMailboxValid) { - _onMailboxActionsClick?.call(MailboxActions.rename, _listSelectionMailbox); - } - }) - ..text(AppLocalizations.of(_context).rename, isVertical: true)) - .build()), - Expanded(child: (ButtonBuilder(_imagePaths.icMarkAsRead) - ..key(const Key('button_mark_read_all_mailbox')) - ..paddingIcon(const EdgeInsets.all(8)) - ..textStyle(TextStyle( - fontSize: 12, - color: _isMarkAsReadMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3))) - ..iconColor(_isMarkAsReadMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3)) - ..onPressActionClick(() { - if (_isMarkAsReadMailboxValid) { - _onMailboxActionsClick?.call(MailboxActions.markAsRead, _listSelectionMailbox); - } - }) - ..text(AppLocalizations.of(_context).mark_as_read, isVertical: true)) - .build()), - Expanded(child: (ButtonBuilder(_imagePaths.icDeleteMailbox) - ..key(const Key('button_delete_all_mailbox')) - ..paddingIcon(const EdgeInsets.all(8)) - ..textStyle(TextStyle( - fontSize: 12, - color: _isDeleteMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3))) - ..iconColor(_isDeleteMailboxValid - ? AppColor.colorTextButton - : AppColor.colorTextButton.withOpacity(0.3)) - ..onPressActionClick(() { - if (_isDeleteMailboxValid) { - _onMailboxActionsClick?.call(MailboxActions.delete, _listSelectionMailbox); - } - }) - ..text(AppLocalizations.of(_context).delete, isVertical: true)) - .build()) - ] - ); - } - - bool get _isDeleteMailboxValid => _isAllFolderMailbox; - - bool get _isRenameMailboxValid => _listSelectionMailbox.length == 1 - && _isAllFolderMailbox; - - bool get _isMarkAsReadMailboxValid => _listSelectionMailbox.length == 1 - && _listSelectionMailbox.first.getCountUnReadEmails().isNotEmpty; - - bool get _isMoveMailboxValid => _listSelectionMailbox.length == 1 - && _isAllFolderMailbox; - - bool get _isAllFolderMailbox => - _listSelectionMailbox.every((mailbox) => !mailbox.hasRole()); } \ No newline at end of file diff --git a/model/lib/extensions/list_presentation_mailbox_extension.dart b/model/lib/extensions/list_presentation_mailbox_extension.dart index edd00616a..f23b2d80e 100644 --- a/model/lib/extensions/list_presentation_mailbox_extension.dart +++ b/model/lib/extensions/list_presentation_mailbox_extension.dart @@ -11,4 +11,10 @@ extension ListPresentationMailboxExtension on List { List get listPersonalMailboxes => where((mailbox) => mailbox.isPersonal).toList(); + + bool get isAllPersonalMailboxes => every((mailbox) => mailbox.isPersonal && !mailbox.isDefault); + + bool get isAllDefaultMailboxes => every((mailbox) => mailbox.isDefault); + + bool get isAllUnreadMailboxes => every((mailbox) => mailbox.getCountUnReadEmails().isNotEmpty); } \ No newline at end of file