TF-933 Handle selection email search result on desktop

This commit is contained in:
dab246
2022-09-16 01:11:16 +07:00
committed by Dat H. Pham
parent e832786e1c
commit 7073e903dc
10 changed files with 344 additions and 179 deletions
@@ -424,6 +424,7 @@ class ThreadController extends BaseController {
final limit = emailList.isNotEmpty
? UnsignedInt(emailList.length)
: ThreadConstants.defaultLimit;
searchController.searchEmailFilter.value = _searchEmailFilter.toSearchEmailFilter(newBefore: null);
_searchEmail(limit: limit);
}
} else {
@@ -513,9 +514,7 @@ class ThreadController extends BaseController {
mailboxDashBoardController.listEmailSelected.value = listEmailSelected;
}
List<PresentationEmail> get listEmailSelected {
return emailList.where((email) => email.selectMode == SelectMode.ACTIVE).toList();
}
List<PresentationEmail> get listEmailSelected => emailList.listEmailSelected;
bool _isUnSelectedAll() {
return emailList.every((email) => email.selectMode == SelectMode.INACTIVE);
@@ -527,13 +526,16 @@ class ThreadController extends BaseController {
mailboxDashBoardController.listEmailSelected.clear();
}
void markAsReadSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
final readAction = listPresentationEmail.isAllEmailRead ? ReadActions.markAsUnread : ReadActions.markAsRead;
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
if (_accountId != null && mailboxCurrent != null) {
void markAsReadSelectedMultipleEmail(
List<PresentationEmail> listPresentationEmail,
ReadActions readActions
) {
if (_accountId != null) {
cancelSelectEmail();
consumeState(_markAsMultipleEmailReadInteractor.execute(_accountId!, listEmail, readAction));
consumeState(_markAsMultipleEmailReadInteractor.execute(
_accountId!,
listPresentationEmail.listEmail,
readActions));
}
}
@@ -611,9 +613,11 @@ class ThreadController extends BaseController {
}
}
void moveSelectedMultipleEmailToMailbox(List<PresentationEmail> listEmail) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
if (currentMailbox != null && _accountId != null) {
void moveSelectedMultipleEmailToMailbox(
List<PresentationEmail> listEmail,
PresentationMailbox currentMailbox
) async {
if (_accountId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList();
final destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
@@ -707,11 +711,13 @@ class ThreadController extends BaseController {
_refreshEmailChanges(currentEmailState: currentEmailState);
}
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmail) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveSelectedMultipleEmailToTrash(
List<PresentationEmail> listEmail,
PresentationMailbox currentMailbox
) {
final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash);
if (currentMailbox != null && _accountId != null && trashMailboxId != null) {
if (_accountId != null && trashMailboxId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList();
_moveSelectedEmailMultipleToTrashAction(_accountId!, MoveToMailboxRequest(
listEmailIds,
@@ -728,11 +734,13 @@ class ThreadController extends BaseController {
consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest));
}
void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmail) async {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
void moveSelectedMultipleEmailToSpam(
List<PresentationEmail> listEmail,
PresentationMailbox currentMailbox
) {
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
if (currentMailbox != null && _accountId != null && spamMailboxId != null) {
if (_accountId != null && spamMailboxId != null) {
final listEmailIds = listEmail.map((email) => email.id).toList();
_moveSelectedEmailMultipleToSpamAction(_accountId!, MoveToMailboxRequest(
listEmailIds,
@@ -791,12 +799,16 @@ class ThreadController extends BaseController {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
}
void markAsStarSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
final starAction = listPresentationEmail.isAllEmailStarred ? MarkStarAction.unMarkStar : MarkStarAction.markStar;
void markAsStarSelectedMultipleEmail(
List<PresentationEmail> listPresentationEmail,
MarkStarAction markStarAction
) {
if (_accountId != null) {
cancelSelectEmail();
consumeState(_markAsStarMultipleEmailInteractor.execute(_accountId!, listEmail, starAction));
consumeState(_markAsStarMultipleEmailInteractor.execute(
_accountId!,
listPresentationEmail.listEmail,
markStarAction));
}
}
@@ -924,28 +936,52 @@ class ThreadController extends BaseController {
void pressEmailSelectionAction(BuildContext context, EmailActionType actionType, List<PresentationEmail> selectionEmail) {
switch(actionType) {
case EmailActionType.markAsRead:
markAsReadSelectedMultipleEmail(selectionEmail, ReadActions.markAsRead);
break;
case EmailActionType.markAsUnread:
markAsReadSelectedMultipleEmail(selectionEmail);
markAsReadSelectedMultipleEmail(selectionEmail, ReadActions.markAsUnread);
break;
case EmailActionType.markAsStarred:
markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.markStar);
break;
case EmailActionType.unMarkAsStarred:
markAsStarSelectedMultipleEmail(selectionEmail);
markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.unMarkStar);
break;
case EmailActionType.moveToMailbox:
moveSelectedMultipleEmailToMailbox(selectionEmail);
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailbox)
: currentMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent);
}
break;
case EmailActionType.moveToTrash:
moveSelectedMultipleEmailToTrash(selectionEmail);
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailbox)
: currentMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToTrash(selectionEmail, mailboxContainCurrent);
}
break;
case EmailActionType.deletePermanently:
deleteSelectionEmailsPermanently(
context,
DeleteActionType.multiple,
selectedEmails: selectionEmail,
presentationMailbox: currentMailbox);
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailbox)
: currentMailbox;
if (mailboxContainCurrent != null) {
deleteSelectionEmailsPermanently(
context,
DeleteActionType.multiple,
selectedEmails: selectionEmail,
presentationMailbox: mailboxContainCurrent);
}
break;
case EmailActionType.moveToSpam:
moveSelectedMultipleEmailToSpam(selectionEmail);
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailbox)
: currentMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToSpam(selectionEmail, mailboxContainCurrent);
}
break;
case EmailActionType.unSpam:
unSpamSelectedMultipleEmail(selectionEmail);
@@ -134,7 +134,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
return Obx(() {
if ((!BuildUtils.isWeb || (BuildUtils.isWeb && controller.isSelectionEnabled()
&& controller.isSearchActive() && !_responsiveUtils.isDesktop(context)))
&& controller.listEmailSelected.isNotEmpty) {
&& controller.emailList.listEmailSelected.isNotEmpty) {
return Column(children: [
const Divider(color: AppColor.lineItemListColor, height: 1, thickness: 0.2),
Padding(
@@ -143,7 +143,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
context,
_imagePaths,
_responsiveUtils,
controller.listEmailSelected,
controller.emailList.listEmailSelected,
controller.mailboxDashBoardController.selectedMailbox.value)
..addOnPressEmailSelectionActionClick((actionType, selectionEmail) =>
controller.pressEmailSelectionAction(context, actionType, selectionEmail)))
@@ -379,7 +379,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
return (AppBarThreadWidgetBuilder(
context,
controller.currentMailbox,
controller.listEmailSelected,
controller.emailList.listEmailSelected,
controller.mailboxDashBoardController.currentSelectMode.value,
controller.mailboxDashBoardController.filterMessageOption.value)
..addOpenMailboxMenuActionClick(() => controller.openMailboxLeftMenu())
@@ -568,10 +568,13 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
itemBuilder: (context, index) => Obx(() => (EmailTileBuilder(
context,
listPresentationEmail[index],
controller.currentMailbox?.role,
controller.mailboxDashBoardController.currentSelectMode.value,
controller.searchController.searchState.value.searchStatus,
controller.searchQuery,
mailboxCurrent: controller.searchController.isSearchEmailRunning
? listPresentationEmail[index].findMailboxContain(
controller.mailboxDashBoardController.mapMailbox)
: controller.currentMailbox,
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue)
..addOnPressEmailActionClick((action, email) =>
controller.pressEmailAction(
@@ -2,7 +2,6 @@ import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
@@ -17,7 +16,7 @@ class EmailTileBuilder {
final PresentationEmail _presentationEmail;
final BuildContext _context;
final SelectMode _selectModeAll;
final Role? _mailboxRole;
final PresentationMailbox? mailboxCurrent;
final SearchStatus _searchStatus;
final SearchQuery? _searchQuery;
final bool advancedSearchActivated;
@@ -27,12 +26,12 @@ class EmailTileBuilder {
EmailTileBuilder(
this._context,
this._presentationEmail,
this._mailboxRole,
this._selectModeAll,
this._searchStatus,
this._searchQuery,
{
this.advancedSearchActivated = false
this.mailboxCurrent,
this.advancedSearchActivated = false,
}
);
@@ -280,9 +279,9 @@ class EmailTileBuilder {
}
String _getInformationSender() {
if (_mailboxRole == PresentationMailbox.roleSent
|| _mailboxRole == PresentationMailbox.roleDrafts
|| _mailboxRole == PresentationMailbox.roleOutbox) {
if (mailboxCurrent?.isSent == true
|| mailboxCurrent?.isDrafts == true
|| mailboxCurrent?.isOutbox == true) {
return _presentationEmail.recipientsName();
}
return _presentationEmail.getSenderName();
@@ -3,7 +3,6 @@ import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
@@ -20,7 +19,7 @@ class EmailTileBuilder {
final PresentationEmail _presentationEmail;
final BuildContext _context;
final SelectMode _selectModeAll;
final Role? _mailboxRole;
final PresentationMailbox? mailboxCurrent;
final SearchStatus _searchStatus;
final SearchQuery? _searchQuery;
final bool advancedSearchActivated;
@@ -34,11 +33,11 @@ class EmailTileBuilder {
EmailTileBuilder(
this._context,
this._presentationEmail,
this._mailboxRole,
this._selectModeAll,
this._searchStatus,
this._searchQuery,
{
this.mailboxCurrent,
this.advancedSearchActivated = false
}
);
@@ -577,7 +576,7 @@ class EmailTileBuilder {
: EmailActionType.markAsRead,
_presentationEmail)),
const SizedBox(width: 5),
if (_mailboxRole != PresentationMailbox.roleDrafts)
if (mailboxCurrent?.isDrafts == false)
... [
buildIconWeb(
minSize: 18,
@@ -616,7 +615,7 @@ class EmailTileBuilder {
: EmailActionType.moveToTrash,
_presentationEmail)),
const SizedBox(width: 5),
if (_mailboxRole != PresentationMailbox.roleDrafts)
if (mailboxCurrent?.isDrafts == false)
buildIconWebHasPosition(
_context,
icon: SvgPicture.asset(
@@ -641,8 +640,7 @@ class EmailTileBuilder {
}
bool get canDeletePermanently {
return _mailboxRole == PresentationMailbox.roleTrash ||
_mailboxRole == PresentationMailbox.roleDrafts;
return mailboxCurrent?.isTrash == true || mailboxCurrent?.isDrafts == true;
}
Widget _buildDateTimeForDesktopScreen() {
@@ -834,9 +832,9 @@ class EmailTileBuilder {
}
String _getInformationSender() {
if (_mailboxRole == PresentationMailbox.roleSent
|| _mailboxRole == PresentationMailbox.roleDrafts
|| _mailboxRole == PresentationMailbox.roleOutbox) {
if (mailboxCurrent?.isSent == true
|| mailboxCurrent?.isDrafts == true
|| mailboxCurrent?.isOutbox == true) {
return _presentationEmail.recipientsName();
}
return _presentationEmail.getSenderName();