TF-933 Update correct mailbox contain for each email result search

This commit is contained in:
dab246
2022-09-15 22:56:06 +07:00
committed by Dat H. Pham
parent 4eb77daff2
commit e832786e1c
6 changed files with 106 additions and 37 deletions
+40 -21
View File
@@ -40,8 +40,11 @@ class EmailView extends GetWidget<EmailController> with NetworkConnectionMixin {
? AppColor.colorBgDesktop ? AppColor.colorBgDesktop
: Colors.white, : Colors.white,
body: Row(children: [ body: Row(children: [
if (responsiveUtils.isMailboxDashboardSplitView(context)) if (_supportVerticalDivider(context))
const VerticalDivider(color: AppColor.lineItemListColor, width: 1, thickness: 0.2), const VerticalDivider(
color: AppColor.lineItemListColor,
width: 1,
thickness: 0.2),
Expanded(child: SafeArea( Expanded(child: SafeArea(
right: responsiveUtils.isLandscapeMobile(context), right: responsiveUtils.isLandscapeMobile(context),
left: responsiveUtils.isLandscapeMobile(context), left: responsiveUtils.isLandscapeMobile(context),
@@ -60,24 +63,7 @@ class EmailView extends GetWidget<EmailController> with NetworkConnectionMixin {
: EdgeInsets.zero, : EdgeInsets.zero,
child: Column(children: [ child: Column(children: [
_buildAppBar(context), _buildAppBar(context),
Obx(() { _buildVacationNotificationMessage(context),
if (controller.mailboxDashBoardController.vacationResponse.value?.vacationResponderIsValid == true &&
(responsiveUtils.isMobile(context) ||
responsiveUtils.isTablet(context) ||
responsiveUtils.isLandscapeMobile(context))) {
return Padding(
padding: const EdgeInsets.only(bottom: 5),
child: VacationNotificationMessageWidget(
radius: 0,
margin: EdgeInsets.zero,
vacationResponse: controller.mailboxDashBoardController.vacationResponse.value!,
actionGotoVacationSetting: () => controller.mailboxDashBoardController.goToVacationSetting(),
actionEndNow: () => controller.mailboxDashBoardController.disableVacationResponder()),
);
} else {
return const SizedBox.shrink();
}
}),
if (responsiveUtils.isWebDesktop(context)) if (responsiveUtils.isWebDesktop(context))
const SizedBox(height: 5), const SizedBox(height: 5),
Obx(() { Obx(() {
@@ -100,18 +86,51 @@ class EmailView extends GetWidget<EmailController> with NetworkConnectionMixin {
); );
} }
bool _supportVerticalDivider(BuildContext context) {
if (BuildUtils.isWeb) {
return responsiveUtils.isTabletLarge(context);
} else {
return responsiveUtils.isLandscapeTablet(context) || responsiveUtils.isDesktop(context);
}
}
Widget _buildDivider({EdgeInsets? edgeInsets}){ Widget _buildDivider({EdgeInsets? edgeInsets}){
return Padding( return Padding(
padding: edgeInsets ?? const EdgeInsets.symmetric(horizontal: 16), padding: edgeInsets ?? const EdgeInsets.symmetric(horizontal: 16),
child: const Divider(color: AppColor.colorDividerEmailView, height: 0.5)); child: const Divider(color: AppColor.colorDividerEmailView, height: 0.5));
} }
Widget _buildVacationNotificationMessage(BuildContext context) {
return Obx(() {
final vacation = controller.mailboxDashBoardController.vacationResponse.value;
if (vacation?.vacationResponderIsValid == true &&
(responsiveUtils.isMobile(context) ||
responsiveUtils.isTablet(context) ||
responsiveUtils.isLandscapeMobile(context))) {
return Padding(
padding: const EdgeInsets.only(bottom: 5),
child: VacationNotificationMessageWidget(
radius: 0,
margin: EdgeInsets.zero,
vacationResponse: vacation!,
actionGotoVacationSetting: () => controller.mailboxDashBoardController.goToVacationSetting(),
actionEndNow: () => controller.mailboxDashBoardController.disableVacationResponder()),
);
} else {
return const SizedBox.shrink();
}
});
}
Widget _buildAppBar(BuildContext context) { Widget _buildAppBar(BuildContext context) {
return Obx(() => Padding( return Obx(() => Padding(
padding: const EdgeInsets.only(top: 6), padding: const EdgeInsets.only(top: 6),
child: AppBarMailWidgetBuilder( child: AppBarMailWidgetBuilder(
controller.currentEmail, controller.currentEmail,
controller.currentMailbox, currentMailbox: controller.mailboxDashBoardController.searchController.isSearchEmailRunning
? controller.currentEmail?.findMailboxContain(controller.mailboxDashBoardController.mapMailbox)
: controller.currentMailbox,
isSearchIsRunning: controller.mailboxDashBoardController.searchController.isSearchEmailRunning,
onBackActionClick: () => controller.closeEmailView(context), onBackActionClick: () => controller.closeEmailView(context),
onEmailActionClick: (email, action) => onEmailActionClick: (email, action) =>
controller.handleEmailAction(context, email, action), controller.handleEmailAction(context, email, action),
@@ -15,19 +15,21 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
final PresentationEmail? _presentationEmail; final PresentationEmail? _presentationEmail;
final PresentationMailbox? _currentMailbox; final PresentationMailbox? currentMailbox;
final bool isSearchIsRunning;
final OnBackActionClick? onBackActionClick; final OnBackActionClick? onBackActionClick;
final OnEmailActionClick? onEmailActionClick; final OnEmailActionClick? onEmailActionClick;
final OnMoreActionClick? onMoreActionClick; final OnMoreActionClick? onMoreActionClick;
AppBarMailWidgetBuilder( AppBarMailWidgetBuilder(
this._presentationEmail, this._presentationEmail,
this._currentMailbox,
{ {
Key? key, Key? key,
this.currentMailbox,
this.onBackActionClick, this.onBackActionClick,
this.onEmailActionClick, this.onEmailActionClick,
this.onMoreActionClick this.onMoreActionClick,
this.isSearchIsRunning = false,
} }
) : super(key: key); ) : super(key: key);
@@ -39,7 +41,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
color: Colors.transparent, color: Colors.transparent,
padding: const EdgeInsets.only(left: 8), padding: const EdgeInsets.only(left: 8),
child: Row(children: [ child: Row(children: [
if (_responsiveUtils.mailboxDashboardHasMailboxAndEmailView(context)) if (_supportDisplayMailboxNameTitle(context))
Material( Material(
color: Colors.transparent, color: Colors.transparent,
child: InkWell( child: InkWell(
@@ -63,7 +65,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250), maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250),
child: Text( child: Text(
_currentMailbox?.name?.name.capitalizeFirstEach ?? '', currentMailbox?.name?.name.capitalizeFirstEach ?? '',
maxLines: 1, maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap, softWrap: CommonTextStyle.defaultSoftWrap,
@@ -80,6 +82,20 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
); );
} }
bool _supportDisplayMailboxNameTitle(BuildContext context) {
if (BuildUtils.isWeb) {
return _responsiveUtils.isDesktop(context) ||
_responsiveUtils.isMobile(context) ||
_responsiveUtils.isTablet(context) ||
isSearchIsRunning;
} else {
return _responsiveUtils.isPortraitMobile(context) ||
_responsiveUtils.isLandscapeMobile(context) ||
_responsiveUtils.isTablet(context) ||
isSearchIsRunning;
}
}
Widget _buildListOptionButton(BuildContext context) { Widget _buildListOptionButton(BuildContext context) {
return Row( return Row(
children: [ children: [
@@ -104,18 +120,18 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
: EmailActionType.markAsStarred)), : EmailActionType.markAsStarred)),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
_currentMailbox?.role == PresentationMailbox.roleTrash currentMailbox?.role == PresentationMailbox.roleTrash
? _imagePaths.icDeleteComposer ? _imagePaths.icDeleteComposer
: _imagePaths.icDelete, : _imagePaths.icDelete,
color: AppColor.colorDefaultButton, color: AppColor.colorDefaultButton,
width: 24, width: 24,
height: 24, height: 24,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash tooltip: currentMailbox?.role != PresentationMailbox.roleTrash
? AppLocalizations.of(context).move_to_trash ? AppLocalizations.of(context).move_to_trash
: AppLocalizations.of(context).delete_permanently, : AppLocalizations.of(context).delete_permanently,
onTap: () { onTap: () {
if (_currentMailbox?.role != PresentationMailbox.roleTrash) { if (currentMailbox?.role != PresentationMailbox.roleTrash) {
onEmailActionClick?.call( onEmailActionClick?.call(
_presentationEmail!, _presentationEmail!,
EmailActionType.moveToTrash); EmailActionType.moveToTrash);
@@ -165,6 +165,8 @@ class SearchController extends BaseController {
bool isAdvanceSearchActive() => isAdvancedSearchHasApply.isTrue; bool isAdvanceSearchActive() => isAdvancedSearchHasApply.isTrue;
bool get isSearchEmailRunning => isSearchActive() || isAdvanceSearchActive();
void enableSearch() { void enableSearch() {
searchState.value = searchState.value.enableSearchState(); searchState.value = searchState.value.enableSearchState();
} }
@@ -955,10 +955,15 @@ class ThreadController extends BaseController {
} }
} }
void pressEmailAction(BuildContext context, EmailActionType actionType, PresentationEmail selectedEmail) { void pressEmailAction(
BuildContext context,
EmailActionType actionType,
PresentationEmail selectedEmail,
{PresentationMailbox? mailboxContain}
) {
switch(actionType) { switch(actionType) {
case EmailActionType.preview: case EmailActionType.preview:
if (mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleDrafts) { if (mailboxContain?.isDrafts == true) {
editEmail(selectedEmail); editEmail(selectedEmail);
} else { } else {
previewEmail(context, selectedEmail); previewEmail(context, selectedEmail);
@@ -573,7 +573,14 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
controller.searchController.searchState.value.searchStatus, controller.searchController.searchState.value.searchStatus,
controller.searchQuery, controller.searchQuery,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue) advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue)
..addOnPressEmailActionClick((action, email) => controller.pressEmailAction(context, action, email)) ..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(
context,
action,
email,
mailboxContain: controller.searchController.isSearchEmailRunning
? email.findMailboxContain(controller.mailboxDashBoardController.mapMailbox)
: controller.currentMailbox))
..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context)
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))) : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))))
@@ -672,12 +679,18 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
} }
Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) { Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) {
final mailboxContain = controller.searchController.isSearchEmailRunning
? email.findMailboxContain(controller.mailboxDashBoardController.mapMailbox)
: controller.currentMailbox;
return (EmailActionCupertinoActionSheetActionBuilder( return (EmailActionCupertinoActionSheetActionBuilder(
const Key('mark_as_spam_or_un_spam_action'), const Key('mark_as_spam_or_un_spam_action'),
SvgPicture.asset( SvgPicture.asset(
controller.currentMailbox?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, mailboxContain?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam,
width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton), width: 28,
controller.currentMailbox?.isSpam == true height: 28,
fit: BoxFit.fill,
color: AppColor.colorTextButton),
mailboxContain?.isSpam == true
? AppLocalizations.of(context).remove_from_spam ? AppLocalizations.of(context).remove_from_spam
: AppLocalizations.of(context).mark_as_spam, : AppLocalizations.of(context).mark_as_spam,
email, email,
@@ -688,10 +701,11 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
? const EdgeInsets.only(right: 12) ? const EdgeInsets.only(right: 12)
: EdgeInsets.zero) : EdgeInsets.zero)
..onActionClick((email) => controller.pressEmailAction(context, ..onActionClick((email) => controller.pressEmailAction(context,
controller.currentMailbox?.isSpam == true mailboxContain?.isSpam == true
? EmailActionType.unSpam ? EmailActionType.unSpam
: EmailActionType.moveToSpam, : EmailActionType.moveToSpam,
email))) email,
mailboxContain: mailboxContain)))
.build(); .build();
} }
@@ -147,4 +147,17 @@ extension PresentationEmailExtension on PresentationEmail {
selectMode: selectMode, selectMode: selectMode,
); );
} }
PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) {
final newMailboxIds = mailboxIds;
newMailboxIds?.removeWhere((key, value) => !value);
if (newMailboxIds?.isNotEmpty == true) {
final firstMailboxId = newMailboxIds!.keys.first;
if (mapMailbox.containsKey(firstMailboxId)) {
return mapMailbox[firstMailboxId];
}
}
return null;
}
} }