TF-934 Implement search by query when open new tab
This commit is contained in:
@@ -4,6 +4,7 @@ import 'package:core/presentation/resources/image_paths.dart';
|
||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
|
||||
import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/build_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
@@ -46,6 +47,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
}
|
||||
|
||||
void previewEmail(BuildContext context, PresentationEmail presentationEmail) {
|
||||
log('EmailActionController::previewEmail():presentationEmailId: ${presentationEmail.id}');
|
||||
mailboxDashBoardController.setSelectedEmail(presentationEmail);
|
||||
mailboxDashBoardController.dispatchRoute(DashboardRoutes.emailDetailed);
|
||||
if (BuildUtils.isWeb && presentationEmail.routeWeb != null) {
|
||||
@@ -55,14 +57,13 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
}
|
||||
}
|
||||
|
||||
void moveToTrash(PresentationEmail email) async {
|
||||
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
|
||||
void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
|
||||
|
||||
if (currentMailbox != null && accountId != null && trashMailboxId != null) {
|
||||
if (mailboxContain != null && accountId != null && trashMailboxId != null) {
|
||||
_moveToTrashAction(accountId, MoveToMailboxRequest(
|
||||
{currentMailbox.id: [email.id]},
|
||||
{mailboxContain.id: [email.id]},
|
||||
trashMailboxId,
|
||||
MoveAction.moving,
|
||||
mailboxDashBoardController.sessionCurrent!,
|
||||
@@ -75,14 +76,13 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
|
||||
}
|
||||
|
||||
void moveToSpam(PresentationEmail email) async {
|
||||
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
|
||||
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
|
||||
|
||||
if (currentMailbox != null && accountId != null && spamMailboxId != null) {
|
||||
if (mailboxContain != null && accountId != null && spamMailboxId != null) {
|
||||
moveToSpamAction(accountId, MoveToMailboxRequest(
|
||||
{currentMailbox.id: [email.id]},
|
||||
{mailboxContain.id: [email.id]},
|
||||
spamMailboxId,
|
||||
MoveAction.moving,
|
||||
mailboxDashBoardController.sessionCurrent!,
|
||||
@@ -111,11 +111,14 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
|
||||
}
|
||||
|
||||
void moveToMailbox(BuildContext context, PresentationEmail email) async {
|
||||
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
|
||||
void moveToMailbox(
|
||||
BuildContext context,
|
||||
PresentationEmail email,
|
||||
{PresentationMailbox? mailboxContain}
|
||||
) async {
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
if (currentMailbox != null && accountId != null) {
|
||||
if (mailboxContain != null && accountId != null) {
|
||||
final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail);
|
||||
|
||||
if (BuildUtils.isWeb) {
|
||||
@@ -129,7 +132,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
accountId,
|
||||
mailboxDashBoardController.sessionCurrent!,
|
||||
email,
|
||||
currentMailbox,
|
||||
mailboxContain,
|
||||
destinationMailbox);
|
||||
}
|
||||
});
|
||||
@@ -146,7 +149,7 @@ mixin EmailActionController on ViewAsDialogActionMixin {
|
||||
accountId,
|
||||
mailboxDashBoardController.sessionCurrent!,
|
||||
email,
|
||||
currentMailbox,
|
||||
mailboxContain,
|
||||
destinationMailbox);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,9 +90,9 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
bool canLoadMore = true;
|
||||
bool canSearchMore = true;
|
||||
bool _isLoadingMore = false;
|
||||
get isLoadingMore => _isLoadingMore;
|
||||
MailboxId? _currentMailboxId;
|
||||
jmap.State? _currentEmailState;
|
||||
NavigationRouter? _navigationRouter;
|
||||
final ScrollController listEmailController = ScrollController();
|
||||
final FocusNode focusNodeKeyBoard = FocusNode();
|
||||
final latestEmailSelectedOrUnselected = Rxn<PresentationEmail>();
|
||||
@@ -102,6 +102,8 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
..add(EmailComparator(EmailComparatorProperty.receivedAt)
|
||||
..setIsAscending(false));
|
||||
|
||||
bool get isLoadingMore => _isLoadingMore;
|
||||
|
||||
AccountId? get _accountId => mailboxDashBoardController.accountId.value;
|
||||
|
||||
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
|
||||
@@ -157,6 +159,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
_isLoadingMore = false;
|
||||
} else if (failure is GetEmailByIdFailure) {
|
||||
openingEmail.value = false;
|
||||
_navigationRouter = null;
|
||||
}
|
||||
},
|
||||
(success) {
|
||||
@@ -176,7 +179,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
openingEmail.value = true;
|
||||
} else if (success is GetEmailByIdSuccess) {
|
||||
openingEmail.value = false;
|
||||
_openEmailDetailView(success.email, success.mailboxId, success.dashboardType);
|
||||
_openEmailDetailView(success.email);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -246,13 +249,22 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is StartSearchEmailAction) {
|
||||
cancelSelectEmail();
|
||||
_updateSearchRouteOnBrowser();
|
||||
_searchEmail();
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is EmptyTrashAction) {
|
||||
deleteSelectionEmailsPermanently(action.context, DeleteActionType.all);
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is SelectEmailByIdAction) {
|
||||
_getEmailByIdAction(action.emailId, action.mailboxId, action.dashboardType);
|
||||
_navigationRouter = action.navigationRouter;
|
||||
if (_navigationRouter!.searchQuery != null) {
|
||||
_activateSearchFromRouter();
|
||||
}
|
||||
_getEmailByIdAction(_navigationRouter!.emailId!);
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is SearchEmailByQueryAction) {
|
||||
_navigationRouter = action.navigationRouter;
|
||||
_activateSearchFromRouter();
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
}
|
||||
});
|
||||
@@ -312,6 +324,18 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
viewStateWorker.dispose();
|
||||
}
|
||||
|
||||
void _activateSearchFromRouter() {
|
||||
searchController.autoFocus.value = false;
|
||||
searchController.enableSearch();
|
||||
searchController.updateTextSearch(_navigationRouter!.searchQuery!.value);
|
||||
searchController.updateFilterEmail(text: _navigationRouter!.searchQuery!);
|
||||
if (currentContext != null) {
|
||||
FocusScope.of(currentContext!).unfocus();
|
||||
}
|
||||
searchController.searchFocus.unfocus();
|
||||
_searchEmail();
|
||||
}
|
||||
|
||||
void _handleErrorGetAllOrRefreshChangesEmail(dynamic error) async {
|
||||
logError('ThreadController::_handleErrorGetAllOrRefreshChangesEmail():Error: $error');
|
||||
if (error is CannotCalculateChangesMethodResponseException) {
|
||||
@@ -334,7 +358,6 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
canLoadMore = true;
|
||||
_isLoadingMore = false;
|
||||
cancelSelectEmail();
|
||||
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
|
||||
}
|
||||
|
||||
void _getAllEmailSuccess(GetAllEmailSuccess success) {
|
||||
@@ -613,6 +636,18 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
}
|
||||
}
|
||||
|
||||
void _updateSearchRouteOnBrowser() {
|
||||
if (BuildUtils.isWeb) {
|
||||
final route = RouteUtils.generateRouteBrowser(
|
||||
AppRoutes.dashboard,
|
||||
NavigationRouter(
|
||||
searchQuery: searchQuery,
|
||||
dashboardType: DashboardType.search)
|
||||
);
|
||||
RouteUtils.updateRouteOnBrowser('SearchEmail', route);
|
||||
}
|
||||
}
|
||||
|
||||
void _searchEmailsSuccess(SearchEmailSuccess success) {
|
||||
final resultEmailSearchList = success.emailList
|
||||
.map((email) => email.toSearchPresentationEmail(mailboxDashBoardController.mapMailboxById))
|
||||
@@ -622,6 +657,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
final emailsSearchAfterChanges = resultEmailSearchList;
|
||||
final newListEmailSearch = emailsSearchAfterChanges.combine(emailsSearchBeforeChanges);
|
||||
emailList.value = newListEmailSearch;
|
||||
searchController.autoFocus.value = true;
|
||||
}
|
||||
|
||||
void searchMoreEmails() {
|
||||
@@ -750,17 +786,17 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar);
|
||||
break;
|
||||
case EmailActionType.moveToMailbox:
|
||||
moveToMailbox(context, selectedEmail);
|
||||
moveToMailbox(context, selectedEmail, mailboxContain: mailboxContain);
|
||||
break;
|
||||
case EmailActionType.moveToTrash:
|
||||
moveToTrash(selectedEmail);
|
||||
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
|
||||
break;
|
||||
case EmailActionType.deletePermanently:
|
||||
deleteEmailPermanently(context, selectedEmail);
|
||||
break;
|
||||
case EmailActionType.moveToSpam:
|
||||
popBack();
|
||||
moveToSpam(selectedEmail);
|
||||
moveToSpam(selectedEmail, mailboxContain: mailboxContain);
|
||||
break;
|
||||
case EmailActionType.unSpam:
|
||||
popBack();
|
||||
@@ -815,6 +851,9 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
NavigationRouter(
|
||||
emailId: currentEmail.id,
|
||||
mailboxId: currentMailbox?.id,
|
||||
searchQuery: searchController.isSearchEmailRunning
|
||||
? searchQuery
|
||||
: null,
|
||||
dashboardType: searchController.isSearchEmailRunning
|
||||
? DashboardType.search
|
||||
: DashboardType.normal
|
||||
@@ -827,30 +866,29 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
}
|
||||
}
|
||||
|
||||
void _getEmailByIdAction(EmailId emailId, MailboxId? mailboxId, DashboardType dashboardType) {
|
||||
PresentationMailbox? getMailboxContain(PresentationEmail currentEmail) {
|
||||
return currentEmail.findMailboxContain(mailboxDashBoardController.mapMailboxById);
|
||||
}
|
||||
|
||||
void _getEmailByIdAction(EmailId emailId) {
|
||||
if (_accountId != null) {
|
||||
consumeState(_getEmailByIdInteractor.execute(
|
||||
_accountId!,
|
||||
emailId,
|
||||
mailboxId: mailboxId,
|
||||
dashboardType: dashboardType,
|
||||
properties: ThreadConstants.propertiesDefault));
|
||||
}
|
||||
}
|
||||
|
||||
void _openEmailDetailView(
|
||||
PresentationEmail email,
|
||||
MailboxId? mailboxId,
|
||||
DashboardType dashboardType
|
||||
) {
|
||||
void _openEmailDetailView(PresentationEmail email) {
|
||||
if (currentContext != null) {
|
||||
final mailboxContain = email.findMailboxContain(mailboxDashBoardController.mapMailboxById);
|
||||
final route = RouteUtils.generateRouteBrowser(
|
||||
AppRoutes.dashboard,
|
||||
NavigationRouter(
|
||||
emailId: email.id,
|
||||
mailboxId: mailboxId,
|
||||
dashboardType: dashboardType
|
||||
mailboxId: _navigationRouter?.mailboxId,
|
||||
searchQuery: _navigationRouter?.searchQuery,
|
||||
dashboardType: _navigationRouter?.dashboardType ?? DashboardType.normal
|
||||
)
|
||||
);
|
||||
pressEmailAction(
|
||||
@@ -860,5 +898,6 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
mailboxContain: mailboxContain
|
||||
);
|
||||
}
|
||||
_navigationRouter = null;
|
||||
}
|
||||
}
|
||||
@@ -335,7 +335,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
itemExtent: _getItemExtent(context),
|
||||
itemCount: listPresentationEmail.length,
|
||||
itemBuilder: (context, index) {
|
||||
final mailboxContain = _getMailboxContain(listPresentationEmail[index]);
|
||||
final mailboxContain = controller.getMailboxContain(listPresentationEmail[index]);
|
||||
final newPresentationEmail = controller.generateEmailByPlatform(listPresentationEmail[index]);
|
||||
return Obx(() => Draggable<List<PresentationEmail>>(
|
||||
maxSimultaneousDrags: kIsWeb ? null : 0,
|
||||
@@ -375,12 +375,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
);
|
||||
}
|
||||
|
||||
PresentationMailbox? _getMailboxContain(PresentationEmail currentEmail) {
|
||||
return controller.searchController.isSearchEmailRunning
|
||||
? currentEmail.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById)
|
||||
: controller.currentMailbox;
|
||||
}
|
||||
|
||||
Widget _buildFeedBackWidget(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: 60,
|
||||
@@ -508,7 +502,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
}
|
||||
|
||||
Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) {
|
||||
final mailboxContain = _getMailboxContain(email);
|
||||
final mailboxContain = controller.getMailboxContain(email);
|
||||
return (EmailActionCupertinoActionSheetActionBuilder(
|
||||
const Key('mark_as_spam_or_un_spam_action'),
|
||||
SvgPicture.asset(
|
||||
|
||||
@@ -421,7 +421,7 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
: EmailActionType.markAsRead,
|
||||
_presentationEmail)),
|
||||
const SizedBox(width: 5),
|
||||
if (mailboxContain?.isDrafts == false)
|
||||
if (mailboxContain != null && mailboxContain?.isDrafts == false)
|
||||
... [
|
||||
buildIconWeb(
|
||||
minSize: 18,
|
||||
|
||||
Reference in New Issue
Block a user