TW-4308 Add labels for several messages part 2 (#4431)

Add ChooseLabelModal, delegate, and update label UI components

Wire add-labels action across Thread, Search, and Dashboard
This commit is contained in:
Dat Dang
2026-04-15 14:25:37 +07:00
committed by GitHub
parent 77c2ef745f
commit 6fc88f780c
20 changed files with 560 additions and 83 deletions
@@ -17,12 +17,18 @@ extension HandlePressEmailSelectionActionExtension on SearchEmailController {
EmailSelectionActionType type,
List<PresentationEmail> emails,
Map<MailboxId, PresentationMailbox> mapMailboxById,
bool isLabelAvailable,
) {
final emailActionType = type.toEmailActionType();
if (emailActionType != null) {
handleSelectionEmailAction(emailActionType, emails);
} else if (type == EmailSelectionActionType.moreAction) {
_showMoreActionMenu(context, emails, mapMailboxById);
_showMoreActionMenu(
context,
emails,
mapMailboxById,
isLabelAvailable,
);
} else if (type == EmailSelectionActionType.selectAll) {
_showSelectAllEmails();
}
@@ -31,6 +37,7 @@ extension HandlePressEmailSelectionActionExtension on SearchEmailController {
List<EmailSelectionActionType> _createEmailSelectionActionTypes(
List<PresentationEmail> emails,
Map<MailboxId, PresentationMailbox> mapMailboxById,
bool isLabelAvailable,
) {
return <EmailSelectionActionType>[
if (emails.isAllEmailRead)
@@ -42,6 +49,8 @@ extension HandlePressEmailSelectionActionExtension on SearchEmailController {
else
EmailSelectionActionType.markAsStarred,
EmailSelectionActionType.moveToFolder,
if (isLabelAvailable)
EmailSelectionActionType.labelAs,
if (emails.isDeletePermanentlyDisabled(mapMailboxById))
EmailSelectionActionType.moveToTrash,
if (emails.isMarkAsSpamEnabled(mapMailboxById))
@@ -59,10 +68,12 @@ extension HandlePressEmailSelectionActionExtension on SearchEmailController {
BuildContext context,
List<PresentationEmail> emails,
Map<MailboxId, PresentationMailbox> mapMailboxById,
bool isLabelAvailable,
) async {
final emailActions = _createEmailSelectionActionTypes(
emails,
mapMailboxById,
isLabelAvailable,
).emailActionTypes;
final contextMenuActions = emailActions
@@ -41,6 +41,8 @@ import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action
import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/labels/presentation/delegates/add_list_label_to_list_emails_delegate.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart';
import 'package:tmail_ui_user/features/labels/presentation/mixin/label_sub_menu_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
@@ -1061,6 +1063,14 @@ class SearchEmailController extends BaseController
cancelSelectionMode();
unSpamSelectedMultipleEmail(listEmails);
break;
case EmailActionType.labelAs:
Get.find<AddListLabelToListEmailsDelegate>().openChooseLabelModal(
selectedEmails: listEmails,
imagePaths: imagePaths,
onCancel: cancelSelectionMode,
onSync: mailboxDashBoardController.syncListLabelForListEmail,
);
break;
default:
break;
}
@@ -85,6 +85,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
if (controller.selectionMode.value == SelectMode.ACTIVE) {
final mapMailboxById = controller.mailboxDashBoardController.mapMailboxById;
final selectedEmails = controller.listResultSearch.listEmailSelected;
final isLabelAvailable =
controller.mailboxDashBoardController.isLabelAvailable;
final actionTypes = _createEmailSelectionActionTypes(
mapMailboxById,
@@ -104,6 +106,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
type,
emails,
mapMailboxById,
isLabelAvailable,
),
);
} else {