diff --git a/assets/images/ic_all_email.svg b/assets/images/ic_all_email.svg new file mode 100644 index 000000000..be4cd956b --- /dev/null +++ b/assets/images/ic_all_email.svg @@ -0,0 +1,5 @@ + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 445a597f4..fc47c61f4 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -281,6 +281,7 @@ class ImagePaths { String get icLabel => _getImagePath('ic_label.svg'); String get icColorPicker => _getImagePath('ic_color_picker.svg'); String get icThumbsUp => _getImagePath('ic_thumbs_up.svg'); + String get icAllEmail => _getImagePath('ic_all_email.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/lib/features/base/model/filter_filter.dart b/lib/features/base/model/filter_filter.dart index 672a4498c..0692ec7e0 100644 --- a/lib/features/base/model/filter_filter.dart +++ b/lib/features/base/model/filter_filter.dart @@ -35,7 +35,7 @@ enum FilterField { case FilterField.notKeyword: return appLocalizations.doesNotHave; case FilterField.mailBox: - return appLocalizations.folder; + return appLocalizations.search; case FilterField.date: return appLocalizations.date; case FilterField.sortBy: diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index 1f67631d9..e534f3562 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -332,7 +332,8 @@ class DestinationPickerController extends BaseMailboxController { } mailboxDestination.value = presentationMailbox; if (presentationMailbox == null || - presentationMailbox.id == PresentationMailbox.unifiedMailbox.id) { + presentationMailbox.id == PresentationMailbox.unifiedMailbox.id || + presentationMailbox.id == PresentationMailbox.allEmailTrashAndSpamFolder.id) { unAllSelectedMailboxNode(); } else { if (mailboxNode != null) { diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index eec4ab2dc..666c1bc5f 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -21,15 +21,15 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart'; +import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/destination_picker_folder_item.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_category_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_item_widget.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/create_mailbox_name_input_decoration_builder.dart'; @@ -272,16 +272,28 @@ class DestinationPickerView extends GetWidget actions, mailboxIdSelected) : const SizedBox.shrink()), + if (actions == MailboxActions.select) + ...[ + const Padding( + padding: EdgeInsetsDirectional.only(start: 16, end: 16, bottom: 8), + child: Divider(color: AppColor.colorDividerMailbox, height: 1), + ), + _buildAllEmailTrashAndSpamFolderWidget(context, mailboxIdSelected), + const Padding( + padding: EdgeInsetsDirectional.symmetric(horizontal: 16, vertical: 8), + child: Divider(color: AppColor.colorDividerMailbox, height: 1), + ), + ], Obx(() { if (controller.personalMailboxIsNotEmpty) { return Column( mainAxisSize: MainAxisSize.min, children: [ - const Divider( - color: AppColor.colorDividerMailbox, - height: 1, - ), - const SizedBox(height: 8), + if (actions != MailboxActions.select) + const Padding( + padding: EdgeInsetsDirectional.only(bottom: 8), + child: Divider(color: AppColor.colorDividerMailbox, height: 1), + ), _buildMailboxCategory( context, MailboxCategories.personalFolders, @@ -494,81 +506,56 @@ class DestinationPickerView extends GetWidget MailboxActions? actions, MailboxId? mailboxIdSelected ) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: () { - if (mailboxIdSelected != null - && mailboxIdSelected != PresentationMailbox.unifiedMailbox.id - ) { - controller.selectMailboxAction(PresentationMailbox.unifiedMailbox); - controller.dispatchSelectMailboxDestination(context); - } - }, - customBorder: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular( - PlatformInfo.isWeb - ? MailboxItemWidgetStyles.borderRadius - : MailboxItemWidgetStyles.mobileBorderRadius, - )), - ), - hoverColor: AppColor.colorMailboxHovered, - child: Obx(() => Container( - padding: const EdgeInsetsDirectional.symmetric( - horizontal: MailboxItemWidgetStyles.itemPadding, - ), - color: controller.mailboxDestination.value == PresentationMailbox.unifiedMailbox - ? AppColor.colorItemSelected - : Colors.transparent, - height: PlatformInfo.isWeb - ? MailboxItemWidgetStyles.height - : MailboxItemWidgetStyles.mobileHeight, - child: Row(children: [ - SvgPicture.asset( - controller.imagePaths.icFolderMailbox, - width: MailboxIconWidgetStyles.iconSize, - height: MailboxIconWidgetStyles.iconSize, - fit: BoxFit.fill - ), - const SizedBox( - width: MailboxItemWidgetStyles.labelIconSpace, - ), - Expanded(child: Text( - AppLocalizations.of(context).allFolders, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: ThemeUtils.textStyleInter500(), - )), - const SizedBox( - width: MailboxItemWidgetStyles.labelIconSpace, - ), - if (_validateDisplaySelectedIcon( - actions: actions, - mailboxIdSelected: mailboxIdSelected - )) - SvgPicture.asset( - actions == MailboxActions.create - ? controller.imagePaths.icSelectedSB - : controller.imagePaths.icFilterSelected, - width: MailboxIconWidgetStyles.iconSize, - height: MailboxIconWidgetStyles.iconSize, - fit: BoxFit.fill - ) - ]) - )), - ), - ), - ); + final appLocalizations = AppLocalizations.of(context); + final folderName = actions == MailboxActions.select + ? appLocalizations.allEmail + : appLocalizations.allFolders; + final folderIcon = actions == MailboxActions.select + ? controller.imagePaths.icAllEmail + : controller.imagePaths.icFolderMailbox; + final isAllEmailIdSelected = mailboxIdSelected == null || + mailboxIdSelected == PresentationMailbox.unifiedMailbox.id; + final isDesktop = controller.responsiveUtils.isDesktop(context); + return Obx(() { + final isSelected = controller.mailboxDestination.value?.isAllEmail == true || isAllEmailIdSelected; + return DestinationPickerFolderItem( + text: folderName, + folderIcon: folderIcon, + selectedIcon: controller.imagePaths.icSelectedSB, + isDesktop: isDesktop, + isSelected: isSelected, + margin: const EdgeInsets.symmetric(horizontal: 16), + onTap: () { + if (!isSelected) { + controller.selectMailboxAction(PresentationMailbox.unifiedMailbox); + controller.dispatchSelectMailboxDestination(context); + } + }, + ); + }); } - bool _validateDisplaySelectedIcon({ - MailboxActions? actions, - MailboxId? mailboxIdSelected - }) { - return (actions == MailboxActions.select || actions == MailboxActions.create) - && (mailboxIdSelected == null || mailboxIdSelected == PresentationMailbox.unifiedMailbox.id); + Widget _buildAllEmailTrashAndSpamFolderWidget(BuildContext context, MailboxId? mailboxIdSelected) { + final isMailboxIdSelected = mailboxIdSelected == PresentationMailbox.allEmailTrashAndSpamFolder.id; + final isDesktop = controller.responsiveUtils.isDesktop(context); + final folderName = AppLocalizations.of(context).allEmailTrashAndSpam; + return Obx(() { + final isSelected = controller.mailboxDestination.value?.isAllEmailTrashAndSpamFolder == true || isMailboxIdSelected; + return DestinationPickerFolderItem( + text: folderName, + folderIcon: controller.imagePaths.icMoveFolderContent, + selectedIcon: controller.imagePaths.icSelectedSB, + isSelected: isSelected, + isDesktop: isDesktop, + margin: const EdgeInsets.symmetric(horizontal: 16), + onTap: () { + if (!isSelected) { + controller.selectMailboxAction(PresentationMailbox.allEmailTrashAndSpamFolder); + controller.dispatchSelectMailboxDestination(context); + } + }, + ); + }); } void _handleOpenMailboxNodeClick(MailboxNode mailboxNode) { diff --git a/lib/features/destination_picker/presentation/widgets/destination_picker_folder_item.dart b/lib/features/destination_picker/presentation/widgets/destination_picker_folder_item.dart new file mode 100644 index 000000000..5ba9ea493 --- /dev/null +++ b/lib/features/destination_picker/presentation/widgets/destination_picker_folder_item.dart @@ -0,0 +1,104 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/utils/theme_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.dart'; + +class DestinationPickerFolderItem extends StatelessWidget { + final bool isSelected; + final bool isDesktop; + final String text; + final String folderIcon; + final String selectedIcon; + final EdgeInsetsGeometry? margin; + final VoidCallback onTap; + + const DestinationPickerFolderItem({ + super.key, + required this.isSelected, + required this.isDesktop, + required this.text, + required this.folderIcon, + required this.selectedIcon, + required this.onTap, + this.margin, + }); + + @override + Widget build(BuildContext context) { + final folderIconWidget = SvgPicture.asset( + folderIcon, + width: MailboxIconWidgetStyles.iconSize, + height: MailboxIconWidgetStyles.iconSize, + colorFilter: AppColor.primaryLinShare.asFilter(), + fit: BoxFit.fill, + ); + + final displayNameWidget = Text( + text, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: _displayNameTextStyle, + ); + + final selectedIconWidget = SvgPicture.asset( + selectedIcon, + width: MailboxIconWidgetStyles.iconSize, + height: MailboxIconWidgetStyles.iconSize, + fit: BoxFit.fill, + ); + + final itemHeight = isDesktop + ? MailboxItemWidgetStyles.height + : MailboxItemWidgetStyles.mobileHeight; + + final borderRadius = BorderRadius.all(Radius.circular( + isDesktop + ? MailboxItemWidgetStyles.borderRadius + : MailboxItemWidgetStyles.mobileBorderRadius, + )); + + Widget itemWidget = Material( + type: MaterialType.transparency, + child: InkWell( + onTap: onTap, + customBorder: RoundedRectangleBorder(borderRadius: borderRadius), + hoverColor: AppColor.colorMailboxHovered, + child: Container( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: MailboxItemWidgetStyles.itemPadding, + ), + height: itemHeight, + child: Row( + children: [ + folderIconWidget, + const SizedBox(width: MailboxItemWidgetStyles.labelIconSpace), + Expanded(child: displayNameWidget), + if (isSelected) ...[ + const SizedBox(width: MailboxItemWidgetStyles.labelIconSpace), + selectedIconWidget, + ], + ], + ), + ), + ), + ); + + if (margin != null) { + itemWidget = Padding(padding: margin!, child: itemWidget); + } + + return itemWidget; + } + + TextStyle get _displayNameTextStyle { + if (isSelected) { + return ThemeUtils.textStyleInter700(fontSize: 14); + } else { + return isDesktop + ? ThemeUtils.textStyleBodyBody3(color: Colors.black) + : ThemeUtils.textStyleInter500(); + } + } +} diff --git a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart index fdcbd68ee..e8c0af208 100644 --- a/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart +++ b/lib/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart @@ -172,4 +172,20 @@ extension PresentationMailboxExtension on PresentationMailbox { isLabelMailbox ? (this as PresentationLabelMailbox).label.id : null; MailboxId? get browserRouteMailboxId => isLabelMailbox ? null : mailboxId; + + bool get isAllEmailTrashAndSpamFolder => id == PresentationMailbox.allEmailTrashAndSpamFolder.id; + + bool get isAllEmail => id == PresentationMailbox.unifiedMailbox.id; + + bool get isUnifiedMailbox => isAllEmail || isAllEmailTrashAndSpamFolder; + + String getFolderNameForQuickSearch(AppLocalizations appLocalizations) { + if (isAllEmailTrashAndSpamFolder) { + return appLocalizations.allEmailTrashAndSpam; + } else if (isAllEmail) { + return appLocalizations.allEmail; + } else { + return getDisplayNameWithoutContext(appLocalizations); + } + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 1b95e2869..3ae9b701a 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -13,7 +13,6 @@ import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_st import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/input_field_focus_manager.dart'; @@ -25,7 +24,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/dialog_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -41,7 +39,7 @@ class AdvancedFilterController extends BaseController { final startDate = Rxn(); final endDate = Rxn(); final sortOrderType = SearchEmailFilter.defaultSortOrder.obs; - final selectedFolderName = Rxn(); + final destinationMailboxSelected = Rxn(); final selectedLabel = Rxn