TF-691 Persist mailbox selected when click outside destination picker to close

This commit is contained in:
dab246
2022-08-04 17:48:41 +07:00
committed by Dat H. Pham
parent 58f08c221b
commit 766c6a5e8f
7 changed files with 166 additions and 93 deletions
@@ -76,28 +76,35 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
onTap: () => controller.closeDestinationPicker(),
child: ResponsiveWidget(
responsiveUtils: _responsiveUtils,
mobile: SizedBox(child: _buildBodyMailboxLocation(context, actions), width: double.infinity),
mobile: SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: double.infinity),
landscapeMobile: Row(children: [
SizedBox(child: _buildBodyMailboxLocation(context, actions), width: ResponsiveUtils.defaultSizeDrawer),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: ResponsiveUtils.defaultSizeDrawer),
Expanded(child: Container(color: Colors.transparent)),
]),
tablet: Row(children: [
Expanded(child: Container(color: Colors.transparent)),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: _responsiveUtils.getSizeScreenWidth(context) - ResponsiveUtils.defaultSizeDrawer),
width: _responsiveUtils.getSizeScreenWidth(context) -
ResponsiveUtils.defaultSizeDrawer),
]),
landscapeTablet: Row(children: [
Expanded(child: Container(color: Colors.transparent)),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: _responsiveUtils.getSizeScreenWidth(context) -
ResponsiveUtils.defaultSizeLeftMenuMobile),
]),
tabletLarge: Row(children: [
Expanded(child: Container(color: Colors.transparent)),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: _responsiveUtils.getSizeScreenWidth(context) - ResponsiveUtils.defaultSizeDrawer),
]),
desktop: Row(children: [
Expanded(child: Container(color: Colors.transparent)),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: _responsiveUtils.getSizeScreenWidth(context) - ResponsiveUtils.defaultSizeDrawer),
width: _responsiveUtils.getSizeScreenWidth(context) -
ResponsiveUtils.defaultSizeLeftMenuMobile),
]),
),
)
@@ -111,21 +118,31 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
onTap: () => controller.closeDestinationPicker(),
child: ResponsiveWidget(
responsiveUtils: _responsiveUtils,
mobile: SizedBox(child: _buildBodyMailboxLocation(context, actions), width: double.infinity),
mobile: SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: double.infinity),
landscapeMobile: Row(children: [
SizedBox(child: _buildBodyMailboxLocation(context, actions), width: ResponsiveUtils.defaultSizeDrawer),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: ResponsiveUtils.defaultSizeDrawer),
Expanded(child: Container(color: Colors.transparent)),
]),
tablet: Row(children: [
SizedBox(child: _buildBodyMailboxLocation(context, actions), width: ResponsiveUtils.defaultSizeDrawer),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: ResponsiveUtils.defaultSizeDrawer),
Expanded(child: Container(color: Colors.transparent)),
]),
landscapeTablet: Row(children: [
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: ResponsiveUtils.defaultSizeLeftMenuMobile),
Expanded(child: Container(color: Colors.transparent)),
]),
tabletLarge: Row(children: [
SizedBox(child: _buildBodyMailboxLocation(context, actions), width: ResponsiveUtils.defaultSizeDrawer),
Expanded(child: Container(color: Colors.transparent)),
]),
desktop: Row(children: [
SizedBox(child: _buildBodyMailboxLocation(context, actions), width: ResponsiveUtils.defaultSizeDrawer),
SizedBox(
child: _buildBodyMailboxLocation(context, actions),
width: ResponsiveUtils.defaultSizeLeftMenuMobile),
Expanded(child: Container(color: Colors.transparent)),
]),
),
@@ -158,30 +175,41 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
onTap: () => {},
child: ClipRRect(
borderRadius: BorderRadius.only(
topRight: Radius.circular(
!BuildUtils.isWeb && _responsiveUtils.isPortraitMobile(context)
? 14 : 0),
topLeft: Radius.circular(
!BuildUtils.isWeb && _responsiveUtils.isPortraitMobile(context)
? 14 : 0)),
topRight: Radius.circular(!BuildUtils.isWeb &&
_responsiveUtils.isPortraitMobile(context)
? 14
: 0),
topLeft: Radius.circular(!BuildUtils.isWeb &&
_responsiveUtils.isPortraitMobile(context)
? 14
: 0)),
child: Container(
color: Colors.white,
child: Column(children: [
SafeArea(
left: !BuildUtils.isWeb && _responsiveUtils.isLandscapeMobile(context),
left: !BuildUtils.isWeb &&
_responsiveUtils.isLandscapeMobile(context),
right: false,
bottom: false,
child: _buildAppBar(context)),
const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2),
const Divider(
color: AppColor.colorDividerMailbox,
height: 0.5,
thickness: 0.2),
Obx(() => controller.isSearchActive()
? SafeArea(bottom: false, top: false, right: false, child: _buildInputSearchFormWidget(context))
? SafeArea(
bottom: false,
top: false,
right: false,
child: _buildInputSearchFormWidget(context))
: const SizedBox.shrink()),
Expanded(child: Container(
color: actions == MailboxActions.create ? AppColor.colorBgMailbox : Colors.white,
color: actions?.getBackgroundColor(),
child: SafeArea(
top: false,
bottom: false,
left: !BuildUtils.isWeb && _responsiveUtils.isLandscapeMobile(context),
left: !BuildUtils.isWeb &&
_responsiveUtils.isLandscapeMobile(context),
right: false,
child: _buildBodyDestinationPicker(context, actions))))
])
@@ -192,16 +220,15 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
}
Widget _buildAppBar(BuildContext context) {
return Obx(() => (AppBarDestinationPickerBuilder(context, _imagePaths, controller.mailboxAction.value)
..addCloseActionClick(() => controller.closeDestinationPicker()))
.build());
return Obx(() => AppBarDestinationPickerBuilder(
controller.mailboxAction.value,
onCloseAction: () => controller.closeDestinationPicker()));
}
Widget _buildSearchBarWidget(BuildContext context) {
return Padding(
padding: EdgeInsets.only(
top: _responsiveUtils.isScreenWithShortestSide(context) &&
!BuildUtils.isWeb ? 12 : 0,
top: !BuildUtils.isWeb ? 12 : 0,
left: _responsiveUtils.isLandscapeMobile(context) &&
!BuildUtils.isWeb ? 0 : 16,
right: 16),
@@ -237,11 +264,31 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
if (actions?.hasSearchActive() == true)
_buildSearchBarWidget(context),
_buildLoadingView(),
if (actions == MailboxActions.create && !BuildUtils.isWeb && _responsiveUtils.isScreenWithShortestSide(context))
if (actions == MailboxActions.create && !BuildUtils.isWeb)
const SizedBox(height: 12),
if (actions?.hasAllMailboxDefault() == true)
_buildUnifiedMailbox(context, actions),
const SizedBox(height: 12),
...[
_buildUnifiedMailbox(context, actions),
const SizedBox(height: 12),
if (actions != MailboxActions.create &&
(
_responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isPortraitMobile(context) ||
_responsiveUtils.isTablet(context) ||
_responsiveUtils.isLandscapeTablet(context) ||
_responsiveUtils.isTabletLarge(context)
)
&& !BuildUtils.isWeb
)
Padding(
padding: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 40 : 55,
right: 20),
child: const Divider(
color: AppColor.lineItemListColor,
height: 0.5,
thickness: 0.2)),
],
Obx(() => controller.defaultMailboxHasChild
? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode, actions)
: const SizedBox.shrink()),
@@ -393,10 +440,21 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
borderRadius: const BorderRadius.all(Radius.circular(14)),
child: Container(
color: Colors.white,
margin: const EdgeInsets.only(
left: BuildUtils.isWeb ? 8 : 0,
margin: EdgeInsets.only(
left: BuildUtils.isWeb ||
_responsiveUtils.isTablet(context) ||
_responsiveUtils.isLandscapeTablet(context) ||
_responsiveUtils.isTabletLarge(context) ||
_responsiveUtils.isPortraitMobile(context)
? 8
: 0,
top: 8),
padding: const EdgeInsets.only(left: 16, top: 16),
padding: EdgeInsets.only(
left: !BuildUtils.isWeb &&
_responsiveUtils.isLandscapeMobile(context)
? 8
: 16,
top: 16),
child: Row(children: [
SvgPicture.asset(
_imagePaths.icFolderMailbox,
@@ -2,31 +2,27 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnCloseActionClick = void Function();
class AppBarDestinationPickerBuilder extends StatelessWidget {
class AppBarDestinationPickerBuilder {
OnCloseActionClick? _onCloseActionClick;
final BuildContext _context;
final ImagePaths _imagePaths;
final MailboxActions? _mailboxAction;
final VoidCallback? onCloseAction;
AppBarDestinationPickerBuilder(
this._context,
this._imagePaths,
this._mailboxAction,
);
const AppBarDestinationPickerBuilder(
this._mailboxAction,
{
Key? key,
this.onCloseAction
}
) : super(key: key);
void addCloseActionClick(OnCloseActionClick onCloseActionClick) {
_onCloseActionClick = onCloseActionClick;
}
Widget build() {
@override
Widget build(BuildContext context) {
final imagePaths = Get.find<ImagePaths>();
return Container(
key: const Key('app_bar_destination_picker'),
alignment: Alignment.center,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)),
@@ -37,17 +33,28 @@ class AppBarDestinationPickerBuilder {
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
_buildBackButton(),
Expanded(child: _buildTitle()),
_buildCancelButton(),
_buildBackButton(context, imagePaths),
Expanded(child: Text(
_mailboxAction?.getTitle(context) ?? '',
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 20,
color: AppColor.colorNameEmail,
fontWeight: FontWeight.w700))),
_buildCancelButton(context),
]
)
)
);
}
Widget _buildCancelButton() {
if (_mailboxAction == MailboxActions.moveEmail || _mailboxAction == MailboxActions.move) {
Widget _buildCancelButton(BuildContext context) {
if (_mailboxAction == MailboxActions.moveEmail ||
_mailboxAction == MailboxActions.move ||
_mailboxAction == MailboxActions.select) {
return Padding(
padding: const EdgeInsets.only(right: 12),
child: Material(
@@ -55,9 +62,11 @@ class AppBarDestinationPickerBuilder {
color: Colors.transparent,
child: TextButton(
child: Text(
AppLocalizations.of(_context).cancel,
style: const TextStyle(fontSize: 17, color: AppColor.colorTextButton)),
onPressed: () => _onCloseActionClick?.call()
AppLocalizations.of(context).cancel,
style: const TextStyle(
fontSize: 17,
color: AppColor.colorTextButton)),
onPressed: () => onCloseAction?.call()
)
));
} else {
@@ -65,23 +74,16 @@ class AppBarDestinationPickerBuilder {
}
}
Widget _buildBackButton() {
Widget _buildBackButton(BuildContext context, ImagePaths imagePaths) {
if (_mailboxAction == MailboxActions.create) {
return buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icBack, color: AppColor.colorTextButton, fit: BoxFit.fill),
onTap: () => _onCloseActionClick?.call());
icon: SvgPicture.asset(
imagePaths.icBack,
color: AppColor.colorTextButton,
fit: BoxFit.fill),
onTap: () => onCloseAction?.call());
} else {
return const SizedBox(width: 100, height: 40);
return const SizedBox(width: 70, height: 40);
}
}
Widget _buildTitle() {
return Text(
_mailboxAction?.getTitle(_context) ?? '',
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 20, color: AppColor.colorNameEmail, fontWeight: FontWeight.w700));
}
}
@@ -140,8 +140,14 @@ class MailboxCreatorController extends BaseController {
arguments: DestinationPickerArguments(accountId!, MailboxActions.create)
);
selectedMailbox.value = destinationMailbox;
_createListMailboxNameAsStringInMailboxLocation();
if (destinationMailbox is PresentationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation();
}
}
}
@@ -32,8 +32,12 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
SizedBox(child: _buildBody(context), width: ResponsiveUtils.defaultSizeDrawer),
Expanded(child: Container(color: Colors.transparent)),
]),
landscapeTablet: Row(children: [
SizedBox(child: _buildBody(context), width: ResponsiveUtils.defaultSizeLeftMenuMobile),
Expanded(child: Container(color: Colors.transparent)),
]),
tabletLarge: Row(children: [
SizedBox(child: _buildBody(context), width: ResponsiveUtils.defaultSizeDrawer),
SizedBox(child: _buildBody(context), width: ResponsiveUtils.defaultSizeLeftMenuMobile),
Expanded(child: Container(color: Colors.transparent)),
]),
desktop: Row(children: [
@@ -111,23 +111,26 @@ class AdvancedFilterController extends GetxController {
);
}
Future<void> selectedMailBox() async {
final PresentationMailbox destinationMailbox = await push(
void selectedMailBox() async {
final destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments(
_mailboxDashBoardController.accountId.value!,
MailboxActions.select));
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
if (destinationMailbox is PresentationMailbox) {
searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
}
}
void applyAdvancedSearchFilter(BuildContext context) {
_updateFilterEmailFromAdvancedSearchView();
searchController.isAdvancedSearchHasApply.value = _checkAdvancedSearchHasApply();
searchController.isAdvancedSearchViewOpen.toggle();
_mailboxDashBoardController.searchEmail(
context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
searchController.isAdvancedSearchViewOpen.toggle();
searchController.isAdvancedSearchHasApply.value = _checkAdvancedSearchHasApply();
}
void _checkContactPermission() async {
@@ -67,7 +67,9 @@ class SearchEmailFilter {
Filter mappingToEmailFilterCondition({Filter? moreFilterCondition}) {
final emailEmailFilterConditionShared = EmailFilterCondition(
text: text?.value,
inMailbox: mailbox?.id,
inMailbox: mailbox == PresentationMailbox.unifiedMailbox
? null
: mailbox?.id,
after: emailReceiveTimeType.toUTCDate(),
hasAttachment: hasAttachment == false ? null : hasAttachment,
subject: subject,
@@ -71,9 +71,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
currentFocusNode: controller.focusManager.mailboxFieldFocusNode,
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
mouseCursor: SystemMouseCursors.click,
onTap: () async {
await controller.selectedMailBox();
}),
onTap: () => controller.selectedMailBox()),
_buildFilterField(
textEditingController: controller.dateFilterInputController,
context: context,