TF-4358 Remove mail in trash by default in search result (#4361)
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<DestinationPickerController>
|
||||
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<DestinationPickerController>
|
||||
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) {
|
||||
|
||||
+104
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
-24
@@ -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<DateTime>();
|
||||
final endDate = Rxn<DateTime>();
|
||||
final sortOrderType = SearchEmailFilter.defaultSortOrder.obs;
|
||||
final selectedFolderName = Rxn<String>();
|
||||
final destinationMailboxSelected = Rxn<PresentationMailbox>();
|
||||
final selectedLabel = Rxn<Label>();
|
||||
|
||||
final GlobalKey<TagsEditorState> keyFromEmailTagEditor = GlobalKey<TagsEditorState>();
|
||||
@@ -64,8 +62,6 @@ class AdvancedFilterController extends BaseController {
|
||||
final focusManager = InputFieldFocusManager.initial();
|
||||
late SearchEmailFilter _memorySearchFilter;
|
||||
|
||||
PresentationMailbox? _destinationMailboxSelected;
|
||||
|
||||
late Worker _dashboardActionWorker;
|
||||
|
||||
@override
|
||||
@@ -103,7 +99,7 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
@visibleForTesting
|
||||
void setDestinationMailboxSelected(PresentationMailbox? presentationMailbox) {
|
||||
_destinationMailboxSelected = presentationMailbox;
|
||||
destinationMailboxSelected.value = presentationMailbox;
|
||||
}
|
||||
|
||||
@visibleForTesting
|
||||
@@ -173,7 +169,7 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
final sortOrderTypeOption = Some(sortOrderType.value);
|
||||
|
||||
final mailboxOption = optionOf(_destinationMailboxSelected);
|
||||
final mailboxOption = optionOf(destinationMailboxSelected.value);
|
||||
|
||||
final subjectOption = option(
|
||||
subjectFilterInputController.text.trim().isNotEmpty,
|
||||
@@ -228,7 +224,7 @@ class AdvancedFilterController extends BaseController {
|
||||
accountId,
|
||||
MailboxActions.select,
|
||||
session,
|
||||
mailboxIdSelected: _destinationMailboxSelected?.id
|
||||
mailboxIdSelected: destinationMailboxSelected.value?.id
|
||||
);
|
||||
|
||||
final destinationMailbox = PlatformInfo.isWeb
|
||||
@@ -239,12 +235,8 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
if (destinationMailbox is! PresentationMailbox) return;
|
||||
|
||||
_destinationMailboxSelected = destinationMailbox;
|
||||
final mailboxName = context.mounted
|
||||
? _destinationMailboxSelected?.getDisplayName(context)
|
||||
: _destinationMailboxSelected?.name?.name;
|
||||
selectedFolderName.value = StringConvert.writeNullToEmpty(mailboxName);
|
||||
_updateMemorySearchFilter(mailboxOption: optionOf(_destinationMailboxSelected));
|
||||
destinationMailboxSelected.value = destinationMailbox;
|
||||
_updateMemorySearchFilter(mailboxOption: optionOf(destinationMailbox));
|
||||
}
|
||||
|
||||
void applyAdvancedSearchFilter() {
|
||||
@@ -290,7 +282,7 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
sortOrderType.value = _memorySearchFilter.sortOrderType;
|
||||
|
||||
_destinationMailboxSelected = _memorySearchFilter.mailbox;
|
||||
destinationMailboxSelected.value = _memorySearchFilter.mailbox;
|
||||
|
||||
hasAttachment.value = _memorySearchFilter.hasAttachment;
|
||||
|
||||
@@ -320,13 +312,6 @@ class AdvancedFilterController extends BaseController {
|
||||
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||
}
|
||||
|
||||
if (context != null) {
|
||||
selectedFolderName.value = _memorySearchFilter.mailbox == null
|
||||
? AppLocalizations.of(context).allFolders
|
||||
: StringConvert.writeNullToEmpty(
|
||||
_memorySearchFilter.mailbox?.getDisplayName(context));
|
||||
}
|
||||
|
||||
selectedLabel.value = _memorySearchFilter.label;
|
||||
}
|
||||
|
||||
@@ -493,10 +478,9 @@ class AdvancedFilterController extends BaseController {
|
||||
isUnread.value = false;
|
||||
isStarred.value = false;
|
||||
hasEvents.value = false;
|
||||
selectedFolderName.value = null;
|
||||
destinationMailboxSelected.value = null;
|
||||
listFromEmailAddress.clear();
|
||||
listToEmailAddress.clear();
|
||||
_destinationMailboxSelected = null;
|
||||
selectedLabel.value = null;
|
||||
}
|
||||
|
||||
|
||||
+9
-6
@@ -976,6 +976,14 @@ class MailboxDashBoardController extends ReloadableController
|
||||
?? mapDefaultMailboxIdByRole[PresentationMailbox.roleSpam];
|
||||
}
|
||||
|
||||
Set<MailboxId>? get trashSpamMailboxIds {
|
||||
final ids = mapMailboxById.entries
|
||||
.where((entry) => entry.value.isTrash || entry.value.isSpam)
|
||||
.map((entry) => entry.key)
|
||||
.toSet();
|
||||
return ids.isEmpty ? null : ids;
|
||||
}
|
||||
|
||||
void setMapDefaultMailboxIdByRole(Map<Role, MailboxId> newMapMailboxId) {
|
||||
mapDefaultMailboxIdByRole = newMapMailboxId;
|
||||
}
|
||||
@@ -2300,12 +2308,7 @@ class MailboxDashBoardController extends ReloadableController
|
||||
|
||||
if (destinationMailbox is! PresentationMailbox) return;
|
||||
|
||||
searchController.updateFilterEmail(
|
||||
mailboxOption: destinationMailbox.id == PresentationMailbox.unifiedMailbox.id
|
||||
? const None()
|
||||
: Some(destinationMailbox)
|
||||
);
|
||||
|
||||
searchController.updateFilterEmail(mailboxOption: Some(destinationMailbox));
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ enum QuickSearchFilter {
|
||||
case QuickSearchFilter.from:
|
||||
return AppLocalizations.of(context).from_email_address_prefix;
|
||||
case QuickSearchFilter.folder:
|
||||
return mailbox?.getDisplayName(context) ?? AppLocalizations.of(context).all;
|
||||
return mailbox?.getFolderNameForQuickSearch(AppLocalizations.of(context)) ?? AppLocalizations.of(context).allEmail;
|
||||
case QuickSearchFilter.to:
|
||||
return AppLocalizations.of(context).to_email_address_prefix;
|
||||
case QuickSearchFilter.starred:
|
||||
|
||||
@@ -8,14 +8,16 @@ import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator
|
||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:labels/model/label.dart';
|
||||
import 'package:model/email/prefix_email_address.dart';
|
||||
import 'package:model/extensions/email_filter_condition_extension.dart';
|
||||
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
class SearchEmailFilter with EquatableMixin, OptionParamMixin {
|
||||
|
||||
@@ -109,13 +111,15 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
|
||||
}
|
||||
|
||||
Filter? mappingToEmailFilterCondition({
|
||||
EmailFilterCondition? moreFilterCondition
|
||||
EmailFilterCondition? moreFilterCondition,
|
||||
Set<MailboxId>? trashSpamMailboxIds,
|
||||
}) {
|
||||
final emailEmailFilterConditionShared = EmailFilterCondition(
|
||||
text: text?.value.trim().isNotEmpty == true
|
||||
? text?.value.trim()
|
||||
: null,
|
||||
inMailbox: mailbox?.mailboxId,
|
||||
inMailbox: _getInMailboxField(),
|
||||
inMailboxOtherThan: _getInMailboxOtherThanField(trashSpamMailboxIds),
|
||||
after: emailReceiveTimeType.getAfterDate(startDate),
|
||||
hasAttachment: !hasAttachment ? null : hasAttachment,
|
||||
subject: subject?.trim().isNotEmpty == true
|
||||
@@ -209,7 +213,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
|
||||
notKeyword.isNotEmpty ||
|
||||
emailReceiveTimeType != EmailReceiveTimeType.allTime ||
|
||||
sortOrderType != SearchEmailFilter.defaultSortOrder ||
|
||||
(mailbox != null && mailbox?.id != PresentationMailbox.unifiedMailbox.id) ||
|
||||
(mailbox != null && mailbox?.isUnifiedMailbox != true) ||
|
||||
label != null ||
|
||||
hasAttachment ||
|
||||
unread;
|
||||
@@ -224,11 +228,30 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
|
||||
notKeyword.isEmpty &&
|
||||
emailReceiveTimeType == EmailReceiveTimeType.allTime &&
|
||||
sortOrderType == SearchEmailFilter.defaultSortOrder &&
|
||||
(mailbox == null || mailbox?.id == PresentationMailbox.unifiedMailbox.id) &&
|
||||
(mailbox == null || mailbox?.isUnifiedMailbox == true) &&
|
||||
label == null &&
|
||||
!hasAttachment &&
|
||||
!unread;
|
||||
|
||||
String getMailboxName(AppLocalizations appLocalizations) {
|
||||
if (mailbox == null) return appLocalizations.allEmail;
|
||||
return mailbox!.getFolderNameForQuickSearch(appLocalizations);
|
||||
}
|
||||
|
||||
MailboxId? _getInMailboxField() {
|
||||
if (mailbox != null && mailbox?.isUnifiedMailbox != true) {
|
||||
return mailbox?.id;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Set<MailboxId>? _getInMailboxOtherThanField(Set<MailboxId>? trashSpamMailboxIds) {
|
||||
if (mailbox == null || mailbox?.isAllEmail == true) {
|
||||
return trashSpamMailboxIds;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
from,
|
||||
|
||||
+2
-2
@@ -5,6 +5,7 @@ import 'package:tmail_ui_user/features/base/widget/default_field/default_autocom
|
||||
import 'package:tmail_ui_user/features/base/widget/default_field/default_button_arrow_down_field_with_tab_key_widget.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/default_field/default_date_drop_down_field_widget.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/default_field/default_input_field_with_tab_key_widget.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/advanced_search/update_label_in_advanced_search_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart';
|
||||
@@ -113,8 +114,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController> {
|
||||
AdvancedSearchFieldWidget(
|
||||
filterField: FilterField.mailBox,
|
||||
child: Obx(() => DefaultButtonArrowDownFieldWithTabKeyWidget(
|
||||
text: controller.selectedFolderName.value ??
|
||||
AppLocalizations.of(context).allFolders,
|
||||
text: controller.destinationMailboxSelected.value?.getFolderNameForQuickSearch(appLocalizations) ?? appLocalizations.allEmail,
|
||||
iconArrowDown: controller.imagePaths.icDropDown,
|
||||
currentFocusNode: controller.focusManager.mailboxFieldFocusNode,
|
||||
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||
|
||||
@@ -367,7 +367,9 @@ class SearchEmailController extends BaseController
|
||||
limit: limit,
|
||||
position: searchEmailFilter.value.position,
|
||||
sort: searchEmailFilter.value.sortOrderType.getSortOrder().toNullable(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||
).last;
|
||||
|
||||
@@ -439,7 +441,9 @@ class SearchEmailController extends BaseController
|
||||
accountId,
|
||||
limit: UnsignedInt(5),
|
||||
sort: searchEmailFilter.value.sortOrderType.getSortOrder().toNullable(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session, accountId))
|
||||
.then((result) => result.fold(
|
||||
(failure) => <PresentationEmail>[],
|
||||
@@ -505,7 +509,9 @@ class SearchEmailController extends BaseController
|
||||
limit: ThreadConstants.defaultLimit,
|
||||
position: searchEmailFilter.value.position,
|
||||
sort: searchEmailFilter.value.sortOrderType.getSortOrder().toNullable(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||
));
|
||||
}
|
||||
@@ -563,7 +569,9 @@ class SearchEmailController extends BaseController
|
||||
limit: ThreadConstants.defaultLimit,
|
||||
sort: searchEmailFilter.value.sortOrderType.getSortOrder().toNullable(),
|
||||
position: searchEmailFilter.value.position,
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(),
|
||||
filter: searchEmailFilter.value.mappingToEmailFilterCondition(
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(session!, accountId!),
|
||||
lastEmailId: lastEmail.id
|
||||
));
|
||||
@@ -721,11 +729,7 @@ class SearchEmailController extends BaseController
|
||||
|
||||
if (destinationMailbox is! PresentationMailbox) return;
|
||||
|
||||
_updateSimpleSearchFilter(
|
||||
mailboxOption: destinationMailbox.id == PresentationMailbox.unifiedMailbox.id
|
||||
? const None()
|
||||
: Some(destinationMailbox)
|
||||
);
|
||||
_updateSimpleSearchFilter(mailboxOption: Some(destinationMailbox));
|
||||
|
||||
_searchEmailAction();
|
||||
}
|
||||
|
||||
@@ -774,6 +774,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
sort: _searchEmailFilter.sortOrderType.getSortOrder().toNullable(),
|
||||
filter: _searchEmailFilter.mappingToEmailFilterCondition(
|
||||
moreFilterCondition: getFilterCondition(),
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(
|
||||
_session!,
|
||||
@@ -1145,7 +1146,8 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
position: _searchEmailFilter.position,
|
||||
sort: _searchEmailFilter.sortOrderType.getSortOrder().toNullable(),
|
||||
filter: _searchEmailFilter.mappingToEmailFilterCondition(
|
||||
moreFilterCondition: getFilterCondition()
|
||||
moreFilterCondition: getFilterCondition(),
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||
needRefreshSearchState: needRefreshSearchState
|
||||
@@ -1231,7 +1233,8 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
sort: _searchEmailFilter.sortOrderType.getSortOrder().toNullable(),
|
||||
position: _searchEmailFilter.position,
|
||||
filter: _searchEmailFilter.mappingToEmailFilterCondition(
|
||||
moreFilterCondition: getFilterCondition()
|
||||
moreFilterCondition: getFilterCondition(),
|
||||
trashSpamMailboxIds: mailboxDashBoardController.trashSpamMailboxIds,
|
||||
),
|
||||
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
|
||||
lastEmailId: lastEmail?.id
|
||||
|
||||
Reference in New Issue
Block a user