From 5b238e1210491c3ef4cacc5d104a5fd40b794114 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 26 Mar 2026 14:13:33 +0700 Subject: [PATCH 1/2] TF-4392 [Team Mailbox] Delete emails within the team mailbox trash --- .../lib/extensions/presentation_mailbox_extension.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/model/lib/extensions/presentation_mailbox_extension.dart b/model/lib/extensions/presentation_mailbox_extension.dart index 2a35c1a3d5..b8213119a2 100644 --- a/model/lib/extensions/presentation_mailbox_extension.dart +++ b/model/lib/extensions/presentation_mailbox_extension.dart @@ -40,7 +40,15 @@ extension PresentationMailboxExtension on PresentationMailbox { bool get isVirtualFolder => isFavorite || isActionRequired; - bool get isTrash => role == PresentationMailbox.roleTrash; + bool get isTrash { + if (isPersonal) { + return role == PresentationMailbox.roleTrash; + } else { + return isChildOfTeamMailboxes && + name?.name.toLowerCase() == + PresentationMailbox.trashRole.toLowerCase(); + } + } bool get isDrafts => role == PresentationMailbox.roleDrafts; From fd13b5b25be0835abbab19af4dbd089ea23b09d8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 26 Mar 2026 16:13:49 +0700 Subject: [PATCH 2/2] TF-4392 [Team Mailbox] Empty the team mailbox trash --- .../mixin/mailbox_action_handler_mixin.dart | 10 ++---- .../presentation/mailbox_controller.dart | 3 +- .../mixin/mailbox_widget_mixin.dart | 4 ++- .../mailbox_dashboard_controller.dart | 31 ++++++++++--------- .../presentation_mailbox_extension.dart | 9 ++++-- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index 92b5dfd43f..6cb101ddb8 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -68,10 +68,7 @@ mixin MailboxActionHandlerMixin { ..onConfirmAction(AppLocalizations.of(context).delete, () { popBack(); if (mailbox.countTotalEmails > 0) { - dashboardController.emptyTrashFolderAction( - trashFolderId: mailbox.id, - totalEmails: mailbox.countTotalEmails - ); + dashboardController.emptyTrashFolderAction(trashMailbox: mailbox); } else { appToast.showToastWarningMessage( context, @@ -92,10 +89,7 @@ mixin MailboxActionHandlerMixin { onConfirmAction: () { popBack(); if (mailbox.countTotalEmails > 0) { - dashboardController.emptyTrashFolderAction( - trashFolderId: mailbox.id, - totalEmails: mailbox.countTotalEmails - ); + dashboardController.emptyTrashFolderAction(trashMailbox: mailbox); } else { appToast.showToastWarningMessage( context, diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index f6a834455e..82a872aec6 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1600,8 +1600,7 @@ class MailboxController extends BaseMailboxController log('MailboxController::emptyMailboxAction:presentationMailbox: ${presentationMailbox.name}'); if (presentationMailbox.isTrash) { mailboxDashBoardController.emptyTrashFolderAction( - trashFolderId: presentationMailbox.id, - totalEmails: presentationMailbox.countTotalEmails + trashMailbox: presentationMailbox, ); } else if (presentationMailbox.isSpam) { mailboxDashBoardController.emptySpamFolderAction( diff --git a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart index ac7c396a54..146ae56528 100644 --- a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart +++ b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart @@ -93,7 +93,9 @@ mixin MailboxWidgetMixin { if (mailbox.isSubscribedMailbox) MailboxActions.disableMailbox else - MailboxActions.enableMailbox + MailboxActions.enableMailbox, + if (mailbox.isTrash && mailbox.myRights?.mayRemoveItems == true) + MailboxActions.emptyTrash, ]; } diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 5608f3ab0f..2086410d67 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1832,41 +1832,40 @@ class MailboxDashBoardController extends ReloadableController void emptyTrashFolderAction({ Function? onCancelSelectionEmail, - MailboxId? trashFolderId, - int totalEmails = 0, + PresentationMailbox? trashMailbox, }) { onCancelSelectionEmail?.call(); - final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; + final trashFolder = trashMailbox + ?? (selectedMailbox.value?.isTrash == true ? selectedMailbox.value : null) + ?? mapMailboxById[mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]]; final accountId = this.accountId.value; + final session = sessionCurrent; - if (accountId == null || sessionCurrent == null) { + if (accountId == null || session == null) { consumeState(Stream.value(Left(EmptyTrashFolderFailure(NotFoundSessionException())))); return; } - if (trashMailboxId == null) { + if (trashFolder == null) { consumeState(Stream.value(Left(EmptyTrashFolderFailure(NotFoundMailboxException())))); return; } - if (CapabilityIdentifier.jmapMailboxClear.isSupported(sessionCurrent!, accountId)) { + if (CapabilityIdentifier.jmapMailboxClear.isSupported(session, accountId) && + trashFolder.isTrashTeamMailbox != true) { clearMailbox( - sessionCurrent!, + session, accountId, - trashMailboxId, + trashFolder.id, PresentationMailbox.roleTrash, ); } else { - final totalEmailsInTrash = totalEmails == 0 - ? mapMailboxById[trashMailboxId]?.countTotalEmails ?? 0 - : totalEmails; - consumeState(_emptyTrashFolderInteractor.execute( - sessionCurrent!, + session, accountId, - trashMailboxId, - totalEmailsInTrash, + trashFolder.id, + trashFolder.countTotalEmails, progressStateController, )); } @@ -2397,6 +2396,7 @@ class MailboxDashBoardController extends ReloadableController ) { return mailbox != null && mailbox.isTrash && + mailbox.myRights?.mayRemoveItems == true && mailbox.countTotalEmails > 0 && !searchController.isSearchActive() && responsiveUtils.isWebDesktop(context); @@ -2408,6 +2408,7 @@ class MailboxDashBoardController extends ReloadableController ) { return mailbox != null && mailbox.isTrash && + mailbox.myRights?.mayRemoveItems == true && mailbox.countTotalEmails > 0 && !searchController.isSearchActive() && !responsiveUtils.isWebDesktop(context); diff --git a/model/lib/extensions/presentation_mailbox_extension.dart b/model/lib/extensions/presentation_mailbox_extension.dart index b8213119a2..dc21751aa5 100644 --- a/model/lib/extensions/presentation_mailbox_extension.dart +++ b/model/lib/extensions/presentation_mailbox_extension.dart @@ -44,12 +44,15 @@ extension PresentationMailboxExtension on PresentationMailbox { if (isPersonal) { return role == PresentationMailbox.roleTrash; } else { - return isChildOfTeamMailboxes && - name?.name.toLowerCase() == - PresentationMailbox.trashRole.toLowerCase(); + return isTrashTeamMailbox; } } + bool get isTrashTeamMailbox { + return isChildOfTeamMailboxes && + name?.name.toLowerCase() == PresentationMailbox.trashRole.toLowerCase(); + } + bool get isDrafts => role == PresentationMailbox.roleDrafts; bool get isTemplates => role == PresentationMailbox.roleTemplates;