TF-1709 Add quick sort filter to mailbox dashboard

(cherry picked from commit 7a50bebfd102887a10b425976993ae56fcff6c7f)
This commit is contained in:
hieubt
2023-11-11 00:40:57 +07:00
committed by Dat Vu
parent cf953f8404
commit f0713f3789
2 changed files with 61 additions and 5 deletions
@@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailb
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.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_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/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart';
@@ -536,9 +537,14 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
if (supportListButtonQuickSearchFilter(context)) { if (supportListButtonQuickSearchFilter(context)) {
return Padding( return Padding(
padding: const EdgeInsetsDirectional.only(end: 16, top: 8), padding: const EdgeInsetsDirectional.only(end: 16, top: 8),
child: Row(children: QuickSearchFilter.values child: Row(
.map((filter) => _buildQuickSearchFilterButton(context, filter)) children: [
.toList() ...QuickSearchFilter.values
.where((filter) => filter != QuickSearchFilter.sortBy)
.map((filter) => _buildQuickSearchFilterButton(context, filter)),
const Spacer(),
_buildQuickSearchFilterButton(context, QuickSearchFilter.sortBy)
]
), ),
); );
} else { } else {
@@ -588,6 +594,25 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
) )
); );
} }
if (filter == QuickSearchFilter.sortBy) {
final screenSize = MediaQuery.of(context).size;
final offset = detail.globalPosition;
final position = RelativeRect.fromLTRB(
offset.dx,
offset.dy,
screenSize.width - offset.dx,
screenSize.height - offset.dy,
);
controller.openPopupMenuAction(
context,
position,
popupMenuEmailSortOrderType(
context,
controller.searchController.sortOrderFiltered.value,
onCallBack: (sortOrder) => controller.selectSortOrderQuickSearchFilter(context, sortOrder)
)
);
}
}, },
borderRadius: const BorderRadius.all(Radius.circular(10)), borderRadius: const BorderRadius.all(Radius.circular(10)),
child: Container( child: Container(
@@ -607,7 +632,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
context, context,
receiveTimeType: controller.searchController.receiveTimeFiltered, receiveTimeType: controller.searchController.receiveTimeFiltered,
startDate: controller.searchController.startDateFiltered, startDate: controller.searchController.startDateFiltered,
endDate: controller.searchController.endDateFiltered endDate: controller.searchController.endDateFiltered,
sortOrderType: controller.searchController.sortOrderFiltered.value,
), ),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@@ -646,6 +672,24 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
.toList(); .toList();
} }
List<PopupMenuEntry> popupMenuEmailSortOrderType(
BuildContext context,
EmailSortOrderType? sortOrderSelected,
{Function(EmailSortOrderType)? onCallBack}
) {
return EmailSortOrderType.values
.map((sortType) => PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupItemNoIconWidget(
sortType.getTitle(context),
svgIconSelected: imagePaths.icFilterSelected,
maxWidth: 332,
isSelected: sortOrderSelected == sortType,
onCallbackAction: () => onCallBack?.call(sortType),
)))
.toList();
}
Widget _buildComposerButton(BuildContext context) { Widget _buildComposerButton(BuildContext context) {
return Container( return Container(
padding: const EdgeInsetsDirectional.only( padding: const EdgeInsetsDirectional.only(
@@ -4,13 +4,15 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:model/user/user_profile.dart'; import 'package:model/user/user_profile.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_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/mailbox_dashboard/presentation/model/search/search_email_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum QuickSearchFilter { enum QuickSearchFilter {
hasAttachment, hasAttachment,
last7Days, last7Days,
fromMe; fromMe,
sortBy;
String getName(BuildContext context) { String getName(BuildContext context) {
switch(this) { switch(this) {
@@ -20,12 +22,15 @@ enum QuickSearchFilter {
return AppLocalizations.of(context).last7Days; return AppLocalizations.of(context).last7Days;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
return AppLocalizations.of(context).fromMe; return AppLocalizations.of(context).fromMe;
case QuickSearchFilter.sortBy:
return AppLocalizations.of(context).sortBy;
} }
} }
String getTitle( String getTitle(
BuildContext context, { BuildContext context, {
EmailReceiveTimeType? receiveTimeType, EmailReceiveTimeType? receiveTimeType,
EmailSortOrderType? sortOrderType,
DateTime? startDate, DateTime? startDate,
DateTime? endDate, DateTime? endDate,
}) { }) {
@@ -37,6 +42,9 @@ enum QuickSearchFilter {
?? AppLocalizations.of(context).allTime; ?? AppLocalizations.of(context).allTime;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
return AppLocalizations.of(context).fromMe; return AppLocalizations.of(context).fromMe;
case QuickSearchFilter.sortBy:
return sortOrderType?.getTitle(context)
?? AppLocalizations.of(context).mostRecent;
} }
} }
@@ -51,6 +59,8 @@ enum QuickSearchFilter {
return imagePaths.icCalendarSB; return imagePaths.icCalendarSB;
case QuickSearchFilter.fromMe: case QuickSearchFilter.fromMe:
return imagePaths.icUserSB; return imagePaths.icUserSB;
case QuickSearchFilter.sortBy:
return imagePaths.icFilterSB;
} }
} }
} }
@@ -89,6 +99,8 @@ enum QuickSearchFilter {
return userProfile != null && return userProfile != null &&
filter.from.contains(userProfile.email) && filter.from.contains(userProfile.email) &&
filter.from.length == 1; filter.from.length == 1;
case QuickSearchFilter.sortBy:
return true;
} }
} }
} }