From c5eb4a011dd07d55e341a89ace94211b3769bb18 Mon Sep 17 00:00:00 2001 From: Dat Vu Date: Thu, 16 Apr 2026 15:45:45 +0700 Subject: [PATCH] Cherry pick commit fix issue #4292 to master (#4454) * Add folder info when open mail list from Label (cherry picked from commit de0bb4ee02030ca90126766a8713a6826d791acd) * Add unit test for `hasMailboxLabel` function in BaseEmailItemTile mixin (cherry picked from commit 18f8d1847acccd6f95006b93903f0caa6c0408df) * TF-4292 Add E2E test for test case `Add folder info when open mail list from Label` on mobile (cherry picked from commit 1c209e333510db161522e4449ad7fb2e5d28399f) --- ...info_when_open_mail_from_tag_scenario.dart | 57 +++++++ ...der_info_when_open_mail_from_tag_test.dart | 9 + .../presentation/base_mailbox_view.dart | 5 +- .../presentation_mailbox_extension.dart | 4 +- .../email/presentation/search_email_view.dart | 5 + .../mixin/base_email_item_tile.dart | 16 +- .../thread/presentation/thread_view.dart | 154 +++++++++--------- ...esktop_list_email_action_hover_widget.dart | 25 ++- .../widgets/email_tile_builder.dart | 13 +- .../widgets/email_tile_web_builder.dart | 15 +- .../web_tablet_body_email_item_widget.dart | 25 ++- .../presentation_mailbox_extension.dart | 2 + .../widgets/base_email_item_tile_test.dart | 65 ++++++++ 13 files changed, 288 insertions(+), 107 deletions(-) create mode 100644 integration_test/scenarios/labels/display_folder_info_when_open_mail_from_tag_scenario.dart create mode 100644 integration_test/tests/labels/display_folder_info_when_open_mail_from_tag_test.dart create mode 100644 test/features/thread/presentation/widgets/base_email_item_tile_test.dart diff --git a/integration_test/scenarios/labels/display_folder_info_when_open_mail_from_tag_scenario.dart b/integration_test/scenarios/labels/display_folder_info_when_open_mail_from_tag_scenario.dart new file mode 100644 index 000000000..27894389b --- /dev/null +++ b/integration_test/scenarios/labels/display_folder_info_when_open_mail_from_tag_scenario.dart @@ -0,0 +1,57 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:labels/labels.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/labels/label_list_view.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +import '../../base/base_test_scenario.dart'; +import '../../mixin/provisioning_label_scenario_mixin.dart'; +import '../../robots/label_robot.dart'; +import '../../robots/thread_robot.dart'; + +class DisplayFolderInfoWhenOpenMailFromTagScenario extends BaseTestScenario + with ProvisioningLabelScenarioMixin { + const DisplayFolderInfoWhenOpenMailFromTagScenario(super.$); + + @override + Future runTestLogic() async { + const emailUser = String.fromEnvironment('BASIC_AUTH_EMAIL'); + if (emailUser.isEmpty) { + fail('Missing --dart-define=BASIC_AUTH_EMAIL for this integration scenario'); + } + + final threadRobot = ThreadRobot($); + final labelRobot = LabelRobot($); + + final labels = await provisionLabelsByDisplayNames( + ['Tag 1'], + ); + await $.pumpAndSettle(); + expect(labels, isNotEmpty, reason: 'Provisioning label "Tag 1" failed'); + final newLabel = labels.first; + + await provisionEmail( + buildEmailsForLabel( + label: newLabel, + toEmail: emailUser, + count: 2, + ), + requestReadReceipt: false, + folderLocationRole: PresentationMailbox.roleTrash, + ); + await $.pumpAndSettle(duration: const Duration(seconds: 2)); + + await threadRobot.openMailbox(); + await _expectLabelListViewVisible(); + + await labelRobot.openLabelByName(newLabel.safeDisplayName); + await _expectFolderInfoDisplayed(); + } + + Future _expectLabelListViewVisible() => + expectViewVisible($(LabelListView)); + + Future _expectFolderInfoDisplayed() async { + await expectViewVisible($(AppLocalizations().trashMailboxDisplayName)); + } +} diff --git a/integration_test/tests/labels/display_folder_info_when_open_mail_from_tag_test.dart b/integration_test/tests/labels/display_folder_info_when_open_mail_from_tag_test.dart new file mode 100644 index 000000000..389d8a2ef --- /dev/null +++ b/integration_test/tests/labels/display_folder_info_when_open_mail_from_tag_test.dart @@ -0,0 +1,9 @@ +import '../../base/test_base.dart'; +import '../../scenarios/labels/display_folder_info_when_open_mail_from_tag_scenario.dart'; + +void main() { + TestBase().runPatrolTest( + description: 'Should display folder info when open mail list from tag', + scenarioBuilder: ($) => DisplayFolderInfoWhenOpenMailFromTagScenario($), + ); +} diff --git a/lib/features/mailbox/presentation/base_mailbox_view.dart b/lib/features/mailbox/presentation/base_mailbox_view.dart index ac93efb92..ea48cee61 100644 --- a/lib/features/mailbox/presentation/base_mailbox_view.dart +++ b/lib/features/mailbox/presentation/base_mailbox_view.dart @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/labels/presentation/models/label_action_t import 'package:tmail_ui_user/features/mailbox/presentation/extensions/handle_label_action_type_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/open_app_grid_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/toggle_expand_folders_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; @@ -406,8 +407,8 @@ abstract class BaseMailboxView extends GetWidget final selectedMailbox = dashboardController.selectedMailbox.value; Id? labelIdSelected; - if (selectedMailbox is PresentationLabelMailbox) { - labelIdSelected = selectedMailbox.id.id; + if (selectedMailbox?.isLabelMailbox == true) { + labelIdSelected = selectedMailbox?.labelId; } if (isLabelAvailable) { diff --git a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart index e8c0af208..3c2466c61 100644 --- a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart +++ b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart @@ -17,7 +17,7 @@ import 'package:tmail_ui_user/main/routes/route_utils.dart'; extension PresentationMailboxExtension on PresentationMailbox { String getDisplayName(BuildContext context) { - if (this is PresentationLabelMailbox) { + if (isLabelMailbox) { return (this as PresentationLabelMailbox).label.safeDisplayName; } @@ -52,7 +52,7 @@ extension PresentationMailboxExtension on PresentationMailbox { } String getDisplayNameWithoutContext(AppLocalizations appLocalizations) { - if (this is PresentationLabelMailbox) { + if (isLabelMailbox) { return (this as PresentationLabelMailbox).label.safeDisplayName; } diff --git a/lib/features/search/email/presentation/search_email_view.dart b/lib/features/search/email/presentation/search_email_view.dart index 980efe8f1..8cbf9fab8 100644 --- a/lib/features/search/email/presentation/search_email_view.dart +++ b/lib/features/search/email/presentation/search_email_view.dart @@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/base/widget/keyboard/keyboard_handler_wra import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/presentation_email_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_ai_needs_action_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart'; @@ -770,6 +771,9 @@ class SearchEmailView extends GetWidget final listLabels = dashboardController.labelController.labels; + final isLabelMailboxOpened = + dashboardController.selectedMailbox.value?.isLabelMailbox == true; + List