TF-3002 [WEB] Apply new design for SearchFilterButton

This commit is contained in:
dab246
2024-09-16 13:20:43 +07:00
committed by Dat H. Pham
parent 5cb6541ef6
commit 34c9c0cd0e
14 changed files with 345 additions and 230 deletions
@@ -397,7 +397,7 @@ class AdvancedFilterController extends BaseController {
);
} else if (action is ClearDateRangeToAdvancedSearch) {
_updateDateRangeTime(action.receiveTime);
} else if (action is StartSearchEmailAction && action.filter == QuickSearchFilter.fromMe) {
} else if (action is StartSearchEmailAction && action.filter == QuickSearchFilter.from) {
_updateFromField();
} else if (action is SearchEmailByFromFieldsAction) {
searchController.clearSearchFilter();
@@ -1575,17 +1575,6 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
_getAllIdentities();
}
void selectQuickSearchFilter(QuickSearchFilter filter) {
return searchController.selectQuickSearchFilter(filter);
}
void selectQuickSearchFilterFrom(EmailAddress fromEmailFilter) {
return searchController.selectQuickSearchFilter(
QuickSearchFilter.fromMe,
fromEmailFilter: fromEmailFilter
);
}
void addFilterToSuggestionForm(QuickSearchFilter filter) {
searchController.addFilterToSuggestionForm(filter);
}
@@ -1667,24 +1656,26 @@ class MailboxDashBoardController extends ReloadableController with UserSettingPo
}
}
void selectQuickSearchFilterAction(QuickSearchFilter filter) async {
log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter');
if (filter == QuickSearchFilter.fromMe) {
if (accountId.value == null || sessionCurrent == null) {
logError('MailboxDashBoardController::selectQuickSearchFilterAction(): accountId or sessionCurrent is null');
}
final listContactSelected = searchController.searchEmailFilter.value.from;
final arguments = ContactArguments(accountId.value!, sessionCurrent!, listContactSelected);
void selectHasAttachmentSearchFilter() {
searchController.updateFilterEmail(hasAttachment: true);
dispatchAction(StartSearchEmailAction());
}
final newContact = await DialogRouter.pushGeneralDialog(routeName: AppRoutes.contact, arguments: arguments);
Future<void> selectFromSearchFilter() async {
if (accountId.value == null || sessionCurrent == null) return;
if (newContact is EmailAddress) {
selectQuickSearchFilterFrom(newContact);
dispatchAction(StartSearchEmailAction(filter: filter));
}
} else {
selectQuickSearchFilter(filter);
dispatchAction(StartSearchEmailAction(filter: filter));
final contactArgument = ContactArguments(
accountId.value!,
sessionCurrent!,
searchController.searchEmailFilter.value.from);
final newContact = await DialogRouter.pushGeneralDialog(
routeName: AppRoutes.contact,
arguments: contactArgument);
if (newContact is EmailAddress) {
searchController.updateFilterEmail(fromOption: Some({newContact.emailAddress}));
dispatchAction(StartSearchEmailAction(filter: QuickSearchFilter.from));
}
}
@@ -11,7 +11,6 @@ import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
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:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
@@ -71,32 +70,6 @@ class SearchController extends BaseController with DateRangePickerMixin {
searchEmailFilter.value = SearchEmailFilter.initial();
}
void selectQuickSearchFilter(
QuickSearchFilter quickSearchFilter,
{EmailAddress? fromEmailFilter}
) {
final isFilterSelected = quickSearchFilter.isSelected(searchEmailFilter.value);
switch (quickSearchFilter) {
case QuickSearchFilter.hasAttachment:
updateFilterEmail(hasAttachment: !isFilterSelected);
return;
case QuickSearchFilter.last7Days:
updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
return;
case QuickSearchFilter.fromMe:
if (fromEmailFilter != null) {
final newListEmailAddress = (fromEmailFilter.email != null && fromEmailFilter.email!.isNotEmpty)
? <String>{fromEmailFilter.email!}
: <String>{};
updateFilterEmail(fromOption: Some(newListEmailAddress));
}
return;
case QuickSearchFilter.sortBy:
return;
}
}
void addFilterToSuggestionForm(QuickSearchFilter filter) {
if (listFilterOnSuggestionForm.contains(filter)) {
listFilterOnSuggestionForm.remove(filter);
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
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/navigation_bar/navigation_bar_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recover_deleted_message_loading_banner_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.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/top_bar_thread_selection.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
@@ -36,7 +37,6 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/banner_delete
import 'package:tmail_ui_user/features/thread/presentation/widgets/banner_empty_trash_widget.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_banner/spam_report_banner_web_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxDashBoardView extends BaseMailboxDashBoardView {
@@ -460,24 +460,23 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
});
}
bool supportListButtonQuickSearchFilter(BuildContext context) {
return controller.searchController.isSearchEmailRunning
&& controller.dashboardRoute.value == DashboardRoutes.thread;
}
Widget _buildListButtonQuickSearchFilter(BuildContext context) {
return Obx(() {
if (supportListButtonQuickSearchFilter(context)) {
if (controller.searchController.isSearchEmailRunning &&
controller.dashboardRoute.value == DashboardRoutes.thread) {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 16, top: 8),
child: Row(
children: [
...QuickSearchFilter.values
.where((filter) => filter != QuickSearchFilter.sortBy)
.map((filter) => _buildQuickSearchFilterButton(context, filter)),
const Spacer(),
_buildQuickSearchFilterButton(context, QuickSearchFilter.sortBy)
]
_buildQuickSearchFilterButton(context, QuickSearchFilter.from),
const SizedBox(width: 8),
_buildQuickSearchFilterButton(context, QuickSearchFilter.dateTime),
const SizedBox(width: 8),
_buildQuickSearchFilterButton(context, QuickSearchFilter.hasAttachment),
const Spacer(),
_buildQuickSearchFilterButton(context, QuickSearchFilter.sortBy),
const SizedBox(width: 8),
]
),
);
} else {
@@ -488,87 +487,64 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Widget _buildQuickSearchFilterButton(
BuildContext context,
QuickSearchFilter filter
QuickSearchFilter searchFilter
) {
return Obx(() {
final isFilterSelected = filter.isSelected(
controller.searchController.searchEmailFilter.value,
);
final searchEmailFilter = controller.searchController.searchEmailFilter.value;
final sortOrderType = controller.searchController.sortOrderFiltered.value;
final listAddressOfFrom = controller.searchController.searchEmailFilter.value.from;
final userName = controller.sessionCurrent?.username;
final startDate = controller.searchController.startDateFiltered;
final endDate = controller.searchController.endDateFiltered;
final receiveTimeType = controller.searchController.receiveTimeFiltered;
return Padding(
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: InkWell(
onTap: () {
if (!filter.isTapOpenPopupMenu()) {
controller.selectQuickSearchFilterAction(filter);
}
},
onTapDown: (detail) {
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,
);
final isSelected = searchFilter.isSelected(
context,
searchEmailFilter,
sortOrderType);
switch(filter) {
case QuickSearchFilter.last7Days:
_openPopupMenuDateFilter(context, position);
break;
case QuickSearchFilter.sortBy:
_openPopupMenuSortFilter(context, position);
break;
default:
break;
}
},
borderRadius: const BorderRadius.all(Radius.circular(10)),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: filter.getBackgroundColor(isFilterSelected: isFilterSelected)),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset(
filter.getIcon(controller.imagePaths, isFilterSelected: isFilterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
const SizedBox(width: 4),
Text(
filter == QuickSearchFilter.fromMe
? _getQuickSearchFilterFromTitle(context)
: filter.getTitle(
context,
receiveTimeType: controller.searchController.receiveTimeFiltered,
startDate: controller.searchController.startDateFiltered,
endDate: controller.searchController.endDateFiltered,
sortOrderType: controller.searchController.sortOrderFiltered.value,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: filter.getTextStyle(isFilterSelected: isFilterSelected),
),
if (filter == QuickSearchFilter.last7Days || filter == QuickSearchFilter.fromMe)
... [
const SizedBox(width: 4),
SvgPicture.asset(
controller.imagePaths.icChevronDown,
width: 16,
height: 16,
fit: BoxFit.fill),
]
])),
),
return SearchFilterButton(
searchFilter: searchFilter,
imagePaths: controller.imagePaths,
isSelected: isSelected,
receiveTimeType: receiveTimeType,
startDate: startDate,
endDate: endDate,
sortOrderType: sortOrderType,
listAddressOfFrom: listAddressOfFrom,
userName: userName,
onSelectSearchFilterAction: _onSelectSearchFilterAction,
);
});
}
void _onSelectSearchFilterAction(
BuildContext context,
QuickSearchFilter searchFilter,
{RelativeRect? buttonPosition}
) async {
switch(searchFilter) {
case QuickSearchFilter.dateTime:
if (buttonPosition != null) {
_openPopupMenuDateFilter(context, buttonPosition);
}
break;
case QuickSearchFilter.sortBy:
if (buttonPosition != null) {
_openPopupMenuSortFilter(context, buttonPosition);
}
break;
case QuickSearchFilter.from:
controller.selectFromSearchFilter();
break;
case QuickSearchFilter.hasAttachment:
controller.selectHasAttachmentSearchFilter();
break;
default:
break;
}
}
List<PopupMenuEntry> popupMenuEmailReceiveTimeType(
BuildContext context,
EmailReceiveTimeType? receiveTimeSelected,
@@ -666,18 +642,4 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
),
);
}
String _getQuickSearchFilterFromTitle(BuildContext context) {
final searchEmailFilterFromFiled = controller.searchController.searchEmailFilter.value.from;
if (searchEmailFilterFromFiled.length == 1) {
if (searchEmailFilterFromFiled.first == controller.sessionCurrent?.username.value &&
controller.sessionCurrent?.username.value.isNotEmpty == true) {
return QuickSearchFilter.fromMe.getTitle(context);
} else {
return '${AppLocalizations.of(context).from_email_address_prefix} ${searchEmailFilterFromFiled.first}';
}
} else {
return AppLocalizations.of(context).from_email_address_prefix;
}
}
}
@@ -2,6 +2,7 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/cupertino.dart';
import 'package:jmap_dart_client/jmap/core/user_name.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';
@@ -11,7 +12,9 @@ enum QuickSearchFilter {
hasAttachment,
last7Days,
fromMe,
sortBy;
sortBy,
dateTime,
from;
String getName(BuildContext context) {
switch(this) {
@@ -23,6 +26,12 @@ enum QuickSearchFilter {
return AppLocalizations.of(context).fromMe;
case QuickSearchFilter.sortBy:
return AppLocalizations.of(context).sortBy;
case QuickSearchFilter.dateTime:
return AppLocalizations.of(context).allTime;
case QuickSearchFilter.from:
return AppLocalizations.of(context).from_email_address_prefix;
default:
return '';
}
}
@@ -32,74 +41,109 @@ enum QuickSearchFilter {
EmailSortOrderType? sortOrderType,
DateTime? startDate,
DateTime? endDate,
Set<String>? listAddressOfFrom,
UserName? userName
}) {
switch(this) {
case QuickSearchFilter.hasAttachment:
return AppLocalizations.of(context).hasAttachment;
case QuickSearchFilter.last7Days:
return receiveTimeType?.getTitle(context, startDate: startDate, endDate: endDate)
?? AppLocalizations.of(context).allTime;
return AppLocalizations.of(context).last7Days;
case QuickSearchFilter.fromMe:
return AppLocalizations.of(context).fromMe;
case QuickSearchFilter.sortBy:
return sortOrderType?.getTitle(context)
?? AppLocalizations.of(context).mostRecent;
case QuickSearchFilter.dateTime:
return receiveTimeType?.getTitle(
context,
startDate: startDate,
endDate: endDate
) ?? AppLocalizations.of(context).allTime;
case QuickSearchFilter.from:
if (listAddressOfFrom?.length != 1) {
return AppLocalizations.of(context).from_email_address_prefix;
}
if (userName?.value.isNotEmpty == true && listAddressOfFrom?.first == userName?.value) {
return AppLocalizations.of(context).fromMe;
} else {
return '${AppLocalizations.of(context).from_email_address_prefix} ${listAddressOfFrom?.first}';
}
default:
return '';
}
}
String getIcon(ImagePaths imagePaths, {required bool isFilterSelected}) {
if (isFilterSelected) {
return imagePaths.icSelectedSB;
} else {
switch(this) {
case QuickSearchFilter.hasAttachment:
return imagePaths.icAttachmentSB;
case QuickSearchFilter.last7Days:
return imagePaths.icCalendarSB;
case QuickSearchFilter.fromMe:
return imagePaths.icUserSB;
case QuickSearchFilter.sortBy:
return imagePaths.icFilterSB;
}
String getIcon(ImagePaths imagePaths, {bool isSelected = false}) {
switch(this) {
case QuickSearchFilter.hasAttachment:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icAttachmentSB;
case QuickSearchFilter.last7Days:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icCalendarSB;
case QuickSearchFilter.fromMe:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icUserSB;
case QuickSearchFilter.sortBy:
return imagePaths.icFilterSB;
case QuickSearchFilter.dateTime:
return imagePaths.icCalendarSB;
case QuickSearchFilter.from:
return imagePaths.icUserSB;
}
}
Color getBackgroundColor({required bool isFilterSelected}) {
Color getBackgroundColor({bool isFilterSelected = false}) {
if (isFilterSelected) {
return AppColor.colorItemEmailSelectedDesktop;
return AppColor.primaryColor.withOpacity(0.06);
} else {
return AppColor.colorButtonHeaderThread;
return AppColor.colorSearchFilterButton;
}
}
TextStyle getTextStyle({required bool isFilterSelected}) {
Color getSuggestionBackgroundColor({bool isFilterSelected = false}) {
if (isFilterSelected) {
return const TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500,
color: AppColor.colorTextButton);
return AppColor.primaryColor.withOpacity(0.06);
} else {
return const TextStyle(
fontSize: 13,
fontWeight: FontWeight.normal,
color: AppColor.colorTextButtonHeaderThread);
return AppColor.colorSuggestionSearchFilterButton.withOpacity(0.6);
}
}
Color getIconColor({bool isSelected = false}) {
if (isSelected) {
return AppColor.primaryColor;
} else {
return AppColor.colorTextBody;
}
}
bool isApplied(List<QuickSearchFilter> listFilter) => listFilter.contains(this);
bool isSelected(SearchEmailFilter filter) {
bool isSelected(
BuildContext context,
SearchEmailFilter searchFilter,
EmailSortOrderType sortOrderType
) {
switch (this) {
case QuickSearchFilter.hasAttachment:
return filter.hasAttachment == true;
return searchFilter.hasAttachment;
case QuickSearchFilter.last7Days:
return true;
case QuickSearchFilter.fromMe:
return filter.from.length == 1;
return searchFilter.from.length == 1;
case QuickSearchFilter.sortBy:
return true;
return sortOrderType != EmailSortOrderType.mostRecent;
case QuickSearchFilter.dateTime:
return searchFilter.emailReceiveTimeType != EmailReceiveTimeType.allTime;
case QuickSearchFilter.from:
return searchFilter.from.isNotEmpty;
}
}
bool isTapOpenPopupMenu() => this == QuickSearchFilter.last7Days || this == QuickSearchFilter.sortBy;
bool isOnTapWithPositionActionSupported() =>
this == QuickSearchFilter.dateTime || this == QuickSearchFilter.sortBy;
bool isArrowDownIconSupported() =>
this == QuickSearchFilter.dateTime ||
this == QuickSearchFilter.from ||
this == QuickSearchFilter.sortBy;
}
@@ -0,0 +1,17 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
class SearchFilterButtonStyle {
static const double iconSize = 16;
static const double deleteIconSize = 10;
static const double spaceSize = 4;
static const EdgeInsetsGeometry buttonPadding = EdgeInsets.symmetric(horizontal: 12, vertical: 8);
static const EdgeInsetsGeometry elementPadding = EdgeInsetsDirectional.only(start: 8);
static const BorderRadius borderRadius = BorderRadius.all(Radius.circular(10));
static const TextStyle titleStyle = TextStyle(
fontSize: 13,
fontWeight: FontWeight.normal,
color: AppColor.colorTextButtonHeaderThread);
}
@@ -0,0 +1,133 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:jmap_dart_client/jmap/core/user_name.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/styles/search_filter_button_style.dart';
typedef OnSelectSearchFilterAction = Function(
BuildContext context,
QuickSearchFilter searchFilter,
{RelativeRect? buttonPosition});
class SearchFilterButton extends StatelessWidget {
final QuickSearchFilter searchFilter;
final bool isSelected;
final ImagePaths imagePaths;
final EmailReceiveTimeType? receiveTimeType;
final EmailSortOrderType? sortOrderType;
final DateTime? startDate;
final DateTime? endDate;
final Set<String>? listAddressOfFrom;
final UserName? userName;
final Color? backgroundColor;
final OnSelectSearchFilterAction? onSelectSearchFilterAction;
const SearchFilterButton({
super.key,
required this.searchFilter,
required this.imagePaths,
this.isSelected = false,
this.receiveTimeType,
this.sortOrderType,
this.startDate,
this.endDate,
this.listAddressOfFrom,
this.userName,
this.backgroundColor,
this.onSelectSearchFilterAction,
});
@override
Widget build(BuildContext context) {
final childItem = Container(
decoration: BoxDecoration(
borderRadius: SearchFilterButtonStyle.borderRadius,
color: backgroundColor ?? searchFilter.getBackgroundColor(isFilterSelected: isSelected)),
padding: SearchFilterButtonStyle.buttonPadding,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
SvgPicture.asset(
searchFilter.getIcon(imagePaths, isSelected: isSelected),
width: SearchFilterButtonStyle.iconSize,
height: SearchFilterButtonStyle.iconSize,
colorFilter: searchFilter.getIconColor(isSelected: isSelected).asFilter(),
fit: BoxFit.fill),
const SizedBox(width: SearchFilterButtonStyle.spaceSize),
Text(
searchFilter.getTitle(
context,
receiveTimeType: receiveTimeType,
startDate: startDate,
endDate: startDate,
sortOrderType: sortOrderType,
listAddressOfFrom: listAddressOfFrom,
userName: userName),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: SearchFilterButtonStyle.titleStyle,
),
if (searchFilter.isArrowDownIconSupported())
Padding(
padding: SearchFilterButtonStyle.elementPadding,
child: SvgPicture.asset(
imagePaths.icDropDown,
width: SearchFilterButtonStyle.iconSize,
height: SearchFilterButtonStyle.iconSize,
colorFilter: AppColor.colorTextBody.asFilter(),
fit: BoxFit.fill),
),
if (isSelected)
TMailButtonWidget.fromIcon(
icon: imagePaths.icDeleteSelection,
iconSize: SearchFilterButtonStyle.deleteIconSize,
iconColor: AppColor.colorTextBody,
padding: EdgeInsets.zero,
backgroundColor: Colors.transparent,
margin: SearchFilterButtonStyle.elementPadding,
),
]
)
);
if (onSelectSearchFilterAction != null) {
return Material(
type: MaterialType.transparency,
child: InkWell(
onTap: searchFilter.isOnTapWithPositionActionSupported()
? null
: () => _onTapAction(context),
onTapDown: searchFilter.isOnTapWithPositionActionSupported()
? (details) => _onTapDownAction(context, details)
: null,
borderRadius: SearchFilterButtonStyle.borderRadius,
child: childItem),
);
} else {
return childItem;
}
}
void _onTapAction(BuildContext context) {
onSelectSearchFilterAction?.call(context, searchFilter);
}
void _onTapDownAction(BuildContext context, TapDownDetails details) {
final screenSize = MediaQuery.sizeOf(context);
final offset = details.globalPosition;
final position = RelativeRect.fromLTRB(
offset.dx,
offset.dy,
screenSize.width - offset.dx,
screenSize.height - offset.dy);
onSelectSearchFilterAction?.call(context, searchFilter, buttonPosition: position);
}
}
@@ -1,7 +1,6 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/icon_button_web.dart';
import 'package:core/presentation/views/quick_search/quick_search_input_form.dart';
import 'package:core/utils/direction_utils.dart';
@@ -23,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ad
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/contact_quick_search_item.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/email_quick_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/quick_search/recent_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_filters/search_filter_button.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
@@ -65,9 +65,13 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
borderRadius: BorderRadius.all(Radius.circular(16)),
),
debounceDuration: const Duration(milliseconds: 300),
listActionButton: QuickSearchFilter.values,
listActionButton: const [
QuickSearchFilter.hasAttachment,
QuickSearchFilter.last7Days,
QuickSearchFilter.fromMe,
],
actionButtonBuilder: (context, filterAction) {
if (filterAction is QuickSearchFilter && filterAction != QuickSearchFilter.sortBy) {
if (filterAction is QuickSearchFilter) {
return buildListButtonForQuickSearchForm(context, filterAction);
} else {
return const SizedBox.shrink();
@@ -217,34 +221,15 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
);
}
Widget buildListButtonForQuickSearchForm(BuildContext context, QuickSearchFilter filter) {
Widget buildListButtonForQuickSearchForm(BuildContext context, QuickSearchFilter searchFilter) {
return Obx(() {
final isFilterSelected = filter.isApplied(_searchController.listFilterOnSuggestionForm);
final isSelected = searchFilter.isApplied(_searchController.listFilterOnSuggestionForm);
return Chip(
labelPadding: const EdgeInsetsDirectional.only(
top: 2,
bottom: 2,
end: 10,
),
label: Text(
filter.getName(context),
maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
style: filter.getTextStyle(isFilterSelected: isFilterSelected),
),
avatar: SvgPicture.asset(
filter.getIcon(_imagePaths, isFilterSelected: isFilterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
labelStyle: filter.getTextStyle(isFilterSelected: isFilterSelected),
backgroundColor: filter.getBackgroundColor(isFilterSelected: isFilterSelected),
shape: RoundedRectangleBorder(
borderRadius: const BorderRadius.all(Radius.circular(10)),
side: BorderSide(color: filter.getBackgroundColor(isFilterSelected: isFilterSelected)),
),
return SearchFilterButton(
searchFilter: searchFilter,
imagePaths: _imagePaths,
isSelected: isSelected,
backgroundColor: searchFilter.getSuggestionBackgroundColor(isFilterSelected: isSelected),
);
});
}
@@ -257,7 +257,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset(
filter.getIcon(controller.imagePaths, isFilterSelected: filterSelected),
filter.getIcon(controller.imagePaths, isSelected: filterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
@@ -273,7 +273,10 @@ class SearchEmailView extends GetWidget<SearchEmailController>
maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
style: filter.getTextStyle(isFilterSelected: filterSelected),
style: const TextStyle(
fontSize: 13,
fontWeight: FontWeight.normal,
color: AppColor.colorTextButtonHeaderThread),
),
if (filter == QuickSearchFilter.last7Days || filter == QuickSearchFilter.sortBy)
... [