TF-933 Add search filter by mailbox in new search view for mobile/tablet
This commit is contained in:
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
class SimpleSearchFilter with EquatableMixin {
|
||||
final Set<String> from;
|
||||
final SearchQuery? text;
|
||||
final PresentationMailbox? mailbox;
|
||||
final EmailReceiveTimeType emailReceiveTimeType;
|
||||
final bool hasAttachment;
|
||||
final UTCDate? before;
|
||||
@@ -21,13 +22,15 @@ class SimpleSearchFilter with EquatableMixin {
|
||||
bool? hasAttachment,
|
||||
this.text,
|
||||
this.before,
|
||||
this.mailbox,
|
||||
}) : from = from ?? <String>{},
|
||||
hasAttachment = hasAttachment ?? false,
|
||||
emailReceiveTimeType =emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
|
||||
emailReceiveTimeType = emailReceiveTimeType ?? EmailReceiveTimeType.allTime;
|
||||
|
||||
SimpleSearchFilter copyWith({
|
||||
Set<String>? from,
|
||||
SearchQuery? text,
|
||||
PresentationMailbox? mailbox,
|
||||
EmailReceiveTimeType? emailReceiveTimeType,
|
||||
bool? hasAttachment,
|
||||
UTCDate? before,
|
||||
@@ -35,6 +38,7 @@ class SimpleSearchFilter with EquatableMixin {
|
||||
return SimpleSearchFilter(
|
||||
from: from ?? this.from,
|
||||
text: text ?? this.text,
|
||||
mailbox: mailbox ?? this.mailbox,
|
||||
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType,
|
||||
hasAttachment: hasAttachment ?? this.hasAttachment,
|
||||
before: before ?? this.before,
|
||||
@@ -46,6 +50,7 @@ class SimpleSearchFilter with EquatableMixin {
|
||||
text: text?.value.trim().isNotEmpty == true
|
||||
? text?.value
|
||||
: null,
|
||||
inMailbox: mailbox?.id,
|
||||
after: emailReceiveTimeType.toUTCDate(),
|
||||
hasAttachment: hasAttachment == false ? null : hasAttachment,
|
||||
before: before,
|
||||
@@ -66,18 +71,34 @@ class SimpleSearchFilter with EquatableMixin {
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [from, text, emailReceiveTimeType, hasAttachment, before];
|
||||
List<Object?> get props => [from, text, mailbox, emailReceiveTimeType, hasAttachment, before];
|
||||
}
|
||||
|
||||
extension SearchEmailFilterExtension on SimpleSearchFilter {
|
||||
|
||||
SimpleSearchFilter toSimpleSearchFilter({UTCDate? newBefore}) {
|
||||
SimpleSearchFilter toSimpleSearchFilterByBefore({UTCDate? newBefore}) {
|
||||
return SimpleSearchFilter(
|
||||
from: from,
|
||||
text: text,
|
||||
mailbox: mailbox,
|
||||
emailReceiveTimeType: emailReceiveTimeType,
|
||||
hasAttachment: hasAttachment,
|
||||
before: newBefore,
|
||||
);
|
||||
}
|
||||
|
||||
SimpleSearchFilter toSimpleSearchFilterByMailbox({PresentationMailbox? newMailbox}) {
|
||||
return SimpleSearchFilter(
|
||||
from: from,
|
||||
text: text,
|
||||
mailbox: newMailbox,
|
||||
emailReceiveTimeType: emailReceiveTimeType,
|
||||
hasAttachment: hasAttachment,
|
||||
before: before,
|
||||
);
|
||||
}
|
||||
|
||||
bool get searchFilterByMailboxApplied => mailbox != null;
|
||||
|
||||
String get mailboxName => mailbox?.name?.name ?? '';
|
||||
}
|
||||
@@ -14,11 +14,13 @@ import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.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';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_all_recent_search_latest_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_search_email_state.dart';
|
||||
@@ -197,7 +199,7 @@ class SearchEmailController extends BaseController
|
||||
final limit = listResultSearch.isNotEmpty
|
||||
? UnsignedInt(listResultSearch.length)
|
||||
: ThreadConstants.defaultLimit;
|
||||
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilter(newBefore: null);
|
||||
simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByBefore(newBefore: null);
|
||||
|
||||
consumeState(_refreshChangesSearchEmailInteractor.execute(
|
||||
accountId!,
|
||||
@@ -353,6 +355,9 @@ class SearchEmailController extends BaseController
|
||||
}
|
||||
|
||||
bool checkQuickSearchFilterSelected(QuickSearchFilter filter) {
|
||||
log('SearchEmailController::checkQuickSearchFilterSelected(): filter: $filter');
|
||||
log('SearchEmailController::checkQuickSearchFilterSelected(): simpleSearchFilter: ${simpleSearchFilter.value.from}');
|
||||
log('SearchEmailController::checkQuickSearchFilterSelected(): userProfile: ${userProfile!.email}');
|
||||
switch (filter) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
return simpleSearchFilter.value.hasAttachment == true;
|
||||
@@ -370,7 +375,7 @@ class SearchEmailController extends BaseController
|
||||
|
||||
void _selectQuickSearchFilter(QuickSearchFilter filter) {
|
||||
final filterSelected = checkQuickSearchFilterSelected(filter);
|
||||
|
||||
log('SearchEmailController::_selectQuickSearchFilter(): filterSelected: $filterSelected');
|
||||
switch (filter) {
|
||||
case QuickSearchFilter.hasAttachment:
|
||||
_updateSimpleSearchFilter(hasAttachment: !filterSelected);
|
||||
@@ -389,6 +394,7 @@ class SearchEmailController extends BaseController
|
||||
filterSelected
|
||||
? simpleSearchFilter.value.from.removeWhere((e) => e == userProfile!.email)
|
||||
: simpleSearchFilter.value.from.add(userProfile!.email);
|
||||
log('SearchEmailController::_selectQuickSearchFilter(): from: ${simpleSearchFilter.value.from}');
|
||||
_updateSimpleSearchFilter(from: simpleSearchFilter.value.from);
|
||||
}
|
||||
break;
|
||||
@@ -415,9 +421,30 @@ class SearchEmailController extends BaseController
|
||||
_searchEmailAction(context);
|
||||
}
|
||||
|
||||
void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async {
|
||||
final destinationMailbox = await push(
|
||||
AppRoutes.DESTINATION_PICKER,
|
||||
arguments: DestinationPickerArguments(
|
||||
mailboxDashBoardController.accountId.value!,
|
||||
MailboxActions.select,
|
||||
mailboxIdSelected: mailbox?.id));
|
||||
|
||||
if (destinationMailbox is PresentationMailbox) {
|
||||
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox
|
||||
? null
|
||||
: destinationMailbox;
|
||||
if (mailbox?.id != mailboxSelected?.id) {
|
||||
simpleSearchFilter.value = simpleSearchFilter.value
|
||||
.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected);
|
||||
_searchEmailAction(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _updateSimpleSearchFilter({
|
||||
Set<String>? from,
|
||||
SearchQuery? text,
|
||||
PresentationMailbox? mailbox,
|
||||
EmailReceiveTimeType? emailReceiveTimeType,
|
||||
bool? hasAttachment,
|
||||
UTCDate? before,
|
||||
@@ -425,10 +452,12 @@ class SearchEmailController extends BaseController
|
||||
simpleSearchFilter.value = simpleSearchFilter.value.copyWith(
|
||||
from: from,
|
||||
text: text,
|
||||
mailbox: mailbox,
|
||||
emailReceiveTimeType: emailReceiveTimeType,
|
||||
hasAttachment: hasAttachment,
|
||||
before: before,
|
||||
);
|
||||
simpleSearchFilter.refresh();
|
||||
}
|
||||
|
||||
void onTextSearchChange(String text) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:core/presentation/utils/style_utils.dart';
|
||||
import 'package:core/presentation/views/background/background_widget_builder.dart';
|
||||
import 'package:core/presentation/views/button/icon_button_web.dart';
|
||||
import 'package:core/presentation/views/text/text_field_builder.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:core/utils/build_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
@@ -19,6 +20,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart';
|
||||
import 'package:tmail_ui_user/features/search/presentation/model/search_more_state.dart';
|
||||
import 'package:tmail_ui_user/features/search/presentation/model/simple_search_filter.dart';
|
||||
import 'package:tmail_ui_user/features/search/presentation/search_email_controller.dart';
|
||||
import 'package:tmail_ui_user/features/search/presentation/utils/search_email_utils.dart';
|
||||
import 'package:tmail_ui_user/features/search/presentation/widgets/app_bar_selection_mode.dart';
|
||||
@@ -158,14 +160,16 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
margin: SearchEmailUtils.getMarginSearchFilterButton(context, _responsiveUtils),
|
||||
padding: SearchEmailUtils.getPaddingSearchFilterButton(context, _responsiveUtils),
|
||||
height: 60,
|
||||
child: ListView.builder(
|
||||
child: ListView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: QuickSearchFilter.values.length,
|
||||
itemBuilder: (context, index) {
|
||||
return _buildQuickSearchFilterButton(
|
||||
context,
|
||||
QuickSearchFilter.values[index]);
|
||||
}
|
||||
children: [
|
||||
...[
|
||||
QuickSearchFilter.fromMe,
|
||||
QuickSearchFilter.hasAttachment,
|
||||
QuickSearchFilter.last7Days
|
||||
].map((filter) => _buildQuickSearchFilterButton(context, filter)),
|
||||
_buildSearchFilterByMailboxButton(context),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -173,7 +177,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
Widget _buildQuickSearchFilterButton(BuildContext context, QuickSearchFilter filter) {
|
||||
return Obx(() {
|
||||
final filterSelected = controller.checkQuickSearchFilterSelected(filter);
|
||||
|
||||
log('SearchEmailView::_buildQuickSearchFilterButton(): filterSelected: $filterSelected');
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(right: 8),
|
||||
child: InkWell(
|
||||
@@ -505,4 +509,58 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
: const SizedBox.shrink();
|
||||
}));
|
||||
}
|
||||
|
||||
Widget _buildSearchFilterByMailboxButton(BuildContext context) {
|
||||
return Obx(() {
|
||||
final filterSelected = controller.simpleSearchFilter.value.searchFilterByMailboxApplied;
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(right: 8),
|
||||
child: InkWell(
|
||||
onTap: () => controller.selectMailboxForSearchFilter(
|
||||
context,
|
||||
controller.simpleSearchFilter.value.mailbox),
|
||||
borderRadius: const BorderRadius.all(Radius.circular(10)),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
color: filterSelected
|
||||
? AppColor.colorItemEmailSelectedDesktop
|
||||
: AppColor.colorButtonHeaderThread),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
||||
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
|
||||
SvgPicture.asset(
|
||||
filterSelected ? _imagePaths.icSelectedSB : _imagePaths.icFolderMailbox,
|
||||
width: 16,
|
||||
height: 16,
|
||||
fit: BoxFit.fill),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
filterSelected
|
||||
? controller.simpleSearchFilter.value.mailboxName
|
||||
: AppLocalizations.of(context).mailbox,
|
||||
maxLines: 1,
|
||||
overflow: CommonTextStyle.defaultTextOverFlow,
|
||||
softWrap: CommonTextStyle.defaultSoftWrap,
|
||||
style: filterSelected
|
||||
? const TextStyle(
|
||||
fontSize: 13,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: AppColor.colorTextButton)
|
||||
: const TextStyle(
|
||||
fontSize: 13,
|
||||
fontWeight: FontWeight.normal,
|
||||
color: AppColor.colorTextButtonHeaderThread)
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
SvgPicture.asset(
|
||||
_imagePaths.icChevronDown,
|
||||
width: 16,
|
||||
height: 16,
|
||||
fit: BoxFit.fill),
|
||||
])
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user