TF-682 Standardize layout of Mailbox Dashboard on web
This commit is contained in:
@@ -84,8 +84,8 @@ class ResponsiveUtils {
|
|||||||
|
|
||||||
bool hasLeftMenuDrawerActive(BuildContext context) {
|
bool hasLeftMenuDrawerActive(BuildContext context) {
|
||||||
if (BuildUtils.isWeb) {
|
if (BuildUtils.isWeb) {
|
||||||
return isMobile(context) &&
|
return isMobile(context) ||
|
||||||
isTablet(context) &&
|
isTablet(context) ||
|
||||||
isTabletLarge(context);
|
isTabletLarge(context);
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
@@ -94,4 +94,26 @@ class ResponsiveUtils {
|
|||||||
|
|
||||||
bool isWebDesktop(BuildContext context) =>
|
bool isWebDesktop(BuildContext context) =>
|
||||||
BuildUtils.isWeb && isDesktop(context);
|
BuildUtils.isWeb && isDesktop(context);
|
||||||
|
|
||||||
|
bool mailboxDashboardHasMailboxAndEmailView(BuildContext context) {
|
||||||
|
if (BuildUtils.isWeb) {
|
||||||
|
return isDesktop(context) ||
|
||||||
|
isMobile(context) ||
|
||||||
|
isTablet(context);
|
||||||
|
} else {
|
||||||
|
return isPortraitMobile(context) ||
|
||||||
|
isLandscapeMobile(context) ||
|
||||||
|
isTablet(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mailboxDashboardOnlyHasEmailView(BuildContext context) {
|
||||||
|
if (BuildUtils.isWeb) {
|
||||||
|
return isMobile(context) || isTablet(context);
|
||||||
|
} else {
|
||||||
|
return isPortraitMobile(context) ||
|
||||||
|
isLandscapeMobile(context) ||
|
||||||
|
isTablet(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -122,6 +122,7 @@ class ButtonBuilder {
|
|||||||
if (_text != null) {
|
if (_text != null) {
|
||||||
return _isVertical!
|
return _isVertical!
|
||||||
? Column(
|
? Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
_buildIcon(),
|
_buildIcon(),
|
||||||
@@ -129,6 +130,7 @@ class ButtonBuilder {
|
|||||||
if (_iconAction != null) _iconAction!
|
if (_iconAction != null) _iconAction!
|
||||||
])
|
])
|
||||||
: Row(
|
: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
_buildIcon(),
|
_buildIcon(),
|
||||||
@@ -148,7 +150,7 @@ class ButtonBuilder {
|
|||||||
return Text(
|
return Text(
|
||||||
'${_text ?? ''}',
|
'${_text ?? ''}',
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: CommonTextStyle.defaultTextOverFlow,
|
||||||
style: _textStyle ?? TextStyle(fontSize: 12, color: AppColor.colorTextButton),
|
style: _textStyle ?? TextStyle(fontSize: 12, color: AppColor.colorTextButton),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,30 +26,51 @@ class ResponsiveWidget extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
log('ResponsiveWidget::build(): WIDTH_SIZE: ${responsiveUtils.getDeviceWidth(context)}');
|
log('ResponsiveWidget::build(): WIDTH_SIZE: ${responsiveUtils.getDeviceWidth(context)}');
|
||||||
|
|
||||||
if (responsiveUtils.isLandscapeMobile(context)) {
|
if (BuildUtils.isWeb) {
|
||||||
return landscapeMobile ?? mobile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (responsiveUtils.isLandscapeTablet(context)) {
|
if (responsiveUtils.isMobile(context)) {
|
||||||
return landscapeTablet ?? tablet ?? mobile;
|
return tablet ?? mobile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (responsiveUtils.isMobile(context)) {
|
if (responsiveUtils.isTablet(context)) {
|
||||||
return tablet ?? mobile;
|
return tablet ?? mobile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (responsiveUtils.isTablet(context)) {
|
if (responsiveUtils.isTabletLarge(context)) {
|
||||||
return tablet ?? mobile;
|
return tabletLarge ?? tablet ?? mobile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (responsiveUtils.isTabletLarge(context)) {
|
if (responsiveUtils.isDesktop(context)) {
|
||||||
return tabletLarge ?? tablet ?? mobile;
|
return desktop ?? tablet ?? mobile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (responsiveUtils.isDesktop(context)) {
|
return mobile;
|
||||||
return desktop ?? tablet ?? mobile;
|
} else {
|
||||||
}
|
if (responsiveUtils.isLandscapeMobile(context)) {
|
||||||
|
return landscapeMobile ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
return mobile;
|
if (responsiveUtils.isLandscapeTablet(context)) {
|
||||||
|
return landscapeTablet ?? tablet ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responsiveUtils.isMobile(context)) {
|
||||||
|
return tablet ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responsiveUtils.isTablet(context)) {
|
||||||
|
return tablet ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responsiveUtils.isTabletLarge(context)) {
|
||||||
|
return tabletLarge ?? tablet ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responsiveUtils.isDesktop(context)) {
|
||||||
|
return desktop ?? tablet ?? mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mobile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,11 +122,11 @@ class EmailView extends GetWidget<EmailController> with NetworkConnectionMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildBottomBar(BuildContext context) {
|
Widget _buildBottomBar(BuildContext context) {
|
||||||
bool isMobileDevice = responsiveUtils.isPortraitMobile(context) &&
|
bool isMobileDevice = responsiveUtils.isPortraitMobile(context) ||
|
||||||
responsiveUtils.isLandscapeMobile(context);
|
responsiveUtils.isLandscapeMobile(context);
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
bottom: !BuildUtils.isWeb && isMobileDevice ? 16 : 0),
|
bottom: isMobileDevice ? 16 : 0),
|
||||||
child: Obx(() => (BottomBarMailWidgetBuilder(
|
child: Obx(() => (BottomBarMailWidgetBuilder(
|
||||||
context,
|
context,
|
||||||
imagePaths,
|
imagePaths,
|
||||||
|
|||||||
@@ -51,9 +51,9 @@ class AppBarMailWidgetBuilder {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
if (_mailboxDashboardOnlyHasEmailView(_context))
|
if (_responsiveUtils.mailboxDashboardHasMailboxAndEmailView(_context))
|
||||||
_buildBackButton(),
|
_buildBackButton(),
|
||||||
if (_mailboxDashboardOnlyHasEmailView(_context))
|
if (_responsiveUtils.mailboxDashboardHasMailboxAndEmailView(_context))
|
||||||
Expanded(child: _buildMailboxName()),
|
Expanded(child: _buildMailboxName()),
|
||||||
if (_presentationEmail != null) _buildListOptionButton(),
|
if (_presentationEmail != null) _buildListOptionButton(),
|
||||||
]
|
]
|
||||||
@@ -62,16 +62,6 @@ class AppBarMailWidgetBuilder {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _mailboxDashboardOnlyHasEmailView(BuildContext context) {
|
|
||||||
if (BuildUtils.isWeb) {
|
|
||||||
return _responsiveUtils.isDesktop(context);
|
|
||||||
} else {
|
|
||||||
return _responsiveUtils.isPortraitMobile(context) ||
|
|
||||||
_responsiveUtils.isLandscapeMobile(context) ||
|
|
||||||
_responsiveUtils.isTablet(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildBackButton() {
|
Widget _buildBackButton() {
|
||||||
return buildIconWeb(
|
return buildIconWeb(
|
||||||
icon: SvgPicture.asset(_imagePaths.icBack, width: 18, height: 18, color: AppColor.colorTextButton, fit: BoxFit.fill),
|
icon: SvgPicture.asset(_imagePaths.icBack, width: 18, height: 18, color: AppColor.colorTextButton, fit: BoxFit.fill),
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ typedef OnPressEmailActionClick = void Function(EmailActionType emailActionType)
|
|||||||
|
|
||||||
class BottomBarMailWidgetBuilder {
|
class BottomBarMailWidgetBuilder {
|
||||||
|
|
||||||
|
static const double maxWidthBottomBar = 540;
|
||||||
|
|
||||||
final BuildContext _context;
|
final BuildContext _context;
|
||||||
final ImagePaths _imagePaths;
|
final ImagePaths _imagePaths;
|
||||||
final ResponsiveUtils _responsiveUtils;
|
final ResponsiveUtils _responsiveUtils;
|
||||||
@@ -32,7 +34,9 @@ class BottomBarMailWidgetBuilder {
|
|||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
child: MediaQuery(
|
child: MediaQuery(
|
||||||
data: const MediaQueryData(padding: EdgeInsets.zero),
|
data: const MediaQueryData(padding: EdgeInsets.zero),
|
||||||
child: _presentationEmail != null ? _buildListOptionButton(_presentationEmail!) : const SizedBox.shrink()
|
child: _presentationEmail != null
|
||||||
|
? _buildListOptionButton(_presentationEmail!)
|
||||||
|
: const SizedBox.shrink()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -91,7 +95,7 @@ class BottomBarMailWidgetBuilder {
|
|||||||
}})
|
}})
|
||||||
..text(AppLocalizations.of(_context).forward, isVertical: _responsiveUtils.isMobile(_context)))
|
..text(AppLocalizations.of(_context).forward, isVertical: _responsiveUtils.isMobile(_context)))
|
||||||
.build()),
|
.build()),
|
||||||
if (!_responsiveUtils.isDesktop(_context))
|
if (_responsiveUtils.mailboxDashboardOnlyHasEmailView(_context))
|
||||||
Expanded(child: (ButtonBuilder(_imagePaths.icNewMessage)
|
Expanded(child: (ButtonBuilder(_imagePaths.icNewMessage)
|
||||||
..key(const Key('button_new_message'))
|
..key(const Key('button_new_message'))
|
||||||
..size(20)
|
..size(20)
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ad
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/app_setting.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/reading_pane.dart';
|
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
@@ -34,8 +32,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (controller.isDrawerOpen && (responsiveUtils.isDesktop(context)
|
if (controller.isDrawerOpen && responsiveUtils.isDesktop(context)) {
|
||||||
|| responsiveUtils.isTabletLarge(context))) {
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
controller.closeMailboxMenuDrawer();
|
controller.closeMailboxMenuDrawer();
|
||||||
});
|
});
|
||||||
@@ -48,10 +45,9 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
responsiveUtils: responsiveUtils,
|
responsiveUtils: responsiveUtils,
|
||||||
mobile: SizedBox(child: MailboxView(), width: ResponsiveUtils.defaultSizeDrawer),
|
mobile: SizedBox(child: MailboxView(), width: ResponsiveUtils.defaultSizeDrawer),
|
||||||
tablet: SizedBox(child: MailboxView(), width: ResponsiveUtils.defaultSizeDrawer),
|
tablet: SizedBox(child: MailboxView(), width: ResponsiveUtils.defaultSizeDrawer),
|
||||||
tabletLarge: const SizedBox.shrink(),
|
tabletLarge: SizedBox(child: MailboxView(), width: ResponsiveUtils.defaultSizeLeftMenuMobile),
|
||||||
desktop: const SizedBox.shrink(),
|
desktop: const SizedBox.shrink()),
|
||||||
),
|
drawerEnableOpenDragGesture: !responsiveUtils.isDesktop(context),
|
||||||
drawerEnableOpenDragGesture: responsiveUtils.isMobile(context) || responsiveUtils.isTablet(context),
|
|
||||||
body: Portal(
|
body: Portal(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
ResponsiveWidget(
|
ResponsiveWidget(
|
||||||
@@ -97,7 +93,16 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu),
|
SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu),
|
||||||
Expanded(child: Column(children: [
|
Expanded(child: Column(children: [
|
||||||
_buildMarkAsMailboxReadLoading(context),
|
_buildMarkAsMailboxReadLoading(context),
|
||||||
Expanded(child: _wrapContainerForThreadAndEmail(context))
|
Expanded(child: Obx(() {
|
||||||
|
switch(controller.routePath.value) {
|
||||||
|
case AppRoutes.THREAD:
|
||||||
|
return ThreadView();
|
||||||
|
case AppRoutes.EMAIL:
|
||||||
|
return EmailView();
|
||||||
|
default:
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
}))
|
||||||
]))
|
]))
|
||||||
],
|
],
|
||||||
))
|
))
|
||||||
@@ -106,60 +111,40 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
tabletLarge: Row(
|
tabletLarge: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu),
|
SizedBox(
|
||||||
Expanded(child: _wrapContainerForThreadAndEmail(context))
|
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
|
||||||
|
child: ThreadView()),
|
||||||
|
Expanded(child: EmailView()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
tablet: ThreadView(),
|
mobile: Obx(() {
|
||||||
mobile: ThreadView(),
|
switch(controller.routePath.value) {
|
||||||
|
case AppRoutes.THREAD:
|
||||||
|
return ThreadView();
|
||||||
|
case AppRoutes.EMAIL:
|
||||||
|
return EmailView();
|
||||||
|
default:
|
||||||
|
return ThreadView();
|
||||||
|
}
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
Obx(() => controller.composerOverlayState.value == ComposerOverlayState.active
|
Obx(() => controller.composerOverlayState.value == ComposerOverlayState.active
|
||||||
? ComposerView()
|
? ComposerView()
|
||||||
: const SizedBox.shrink()),
|
: const SizedBox.shrink()),
|
||||||
Obx(() => controller.isNetworkConnectionAvailable()
|
Obx(() {
|
||||||
? const SizedBox.shrink()
|
if (controller.isNetworkConnectionAvailable()) {
|
||||||
: Align(alignment: Alignment.bottomCenter, child: buildNetworkConnectionWidget(context))),
|
return const SizedBox.shrink();
|
||||||
|
} else {
|
||||||
|
return Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
child: buildNetworkConnectionWidget(context));
|
||||||
|
}
|
||||||
|
}),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _wrapContainerForThreadAndEmail(BuildContext context) {
|
|
||||||
switch(AppSetting.readingPane) {
|
|
||||||
case ReadingPane.noSplit:
|
|
||||||
return Obx(() {
|
|
||||||
switch(controller.routePath.value) {
|
|
||||||
case AppRoutes.THREAD:
|
|
||||||
return ThreadView();
|
|
||||||
case AppRoutes.EMAIL:
|
|
||||||
return EmailView();
|
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
case ReadingPane.rightOfInbox:
|
|
||||||
if (responsiveUtils.isDesktop(context)) {
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Expanded(flex: 1, child: ThreadView()),
|
|
||||||
Expanded(flex: 2, child: EmailView()),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Expanded(flex: 1, child: ThreadView()),
|
|
||||||
Expanded(flex: 1, child: EmailView()),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildRightHeader(BuildContext context) {
|
Widget _buildRightHeader(BuildContext context) {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
Obx(() {
|
Obx(() {
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/reading_pane.dart';
|
|
||||||
|
|
||||||
class AppSetting {
|
|
||||||
static ReadingPane readingPane = ReadingPane.noSplit;
|
|
||||||
}
|
|
||||||
@@ -88,8 +88,10 @@ class AppBarThreadWidgetBuilder {
|
|||||||
|
|
||||||
Widget _buildBodyAppBarForWeb() {
|
Widget _buildBodyAppBarForWeb() {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
if (!_responsiveUtils.isTabletLarge(_context)) _buildMenuButton(),
|
if (_responsiveUtils.hasLeftMenuDrawerActive(_context))
|
||||||
if (_responsiveUtils.isTabletLarge(_context)) const SizedBox(width: 16),
|
_buildMenuButton(),
|
||||||
|
if (_responsiveUtils.hasLeftMenuDrawerActive(_context))
|
||||||
|
const SizedBox(width: 16),
|
||||||
Expanded(child: Text(
|
Expanded(child: Text(
|
||||||
_currentMailbox?.name?.name.capitalizeFirstEach ?? '',
|
_currentMailbox?.name?.name.capitalizeFirstEach ?? '',
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
|
|||||||
Reference in New Issue
Block a user