diff --git a/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart new file mode 100644 index 000000000..025422d7f --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart @@ -0,0 +1,44 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; +import 'package:tmail_ui_user/features/base/mixin/network_connection_mixin.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/quick_search_filter.dart'; + +abstract class BaseMailboxDashBoardView extends GetWidget + with NetworkConnectionMixin, UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin, + AppLoaderMixin { + BaseMailboxDashBoardView({Key? key}) : super(key: key); + + final responsiveUtils = Get.find(); + final imagePaths = Get.find(); + + Widget buildQuickSearchFilterButton( + BuildContext context, QuickSearchFilter filter) { + return Obx(() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: filter.getBackgroundColor(controller.listFilterQuickSearch)), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + SvgPicture.asset( + filter.getIcon(imagePaths, controller.listFilterQuickSearch), + width: 16, + height: 16, + fit: BoxFit.fill), + const SizedBox(width: 4), + Text( + filter.getTitle(context), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: filter.getTextStyle(controller.listFilterQuickSearch), + ) + ])); + }); + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 7410dd774..c483f2b82 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -11,6 +11,7 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; @@ -45,6 +46,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_s import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/quick_search_filter.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; @@ -86,6 +88,7 @@ class MailboxDashBoardController extends ReloadableController { final currentSelectMode = SelectMode.INACTIVE.obs; final filterMessageOption = FilterMessageOption.all.obs; final listEmailSelected = [].obs; + final listFilterQuickSearch = RxList(); SearchQuery? searchQuery; Session? sessionCurrent; @@ -283,6 +286,7 @@ class MailboxDashBoardController extends ReloadableController { searchQuery = SearchQuery.initial(); clearSuggestionSearch(); searchInputController.clear(); + listFilterQuickSearch.clear(); FocusManager.instance.primaryFocus?.unfocus(); } @@ -426,6 +430,8 @@ class MailboxDashBoardController extends ReloadableController { Future> quickSearchEmailsAction(String pattern) async { if (accountId.value != null && selectedMailbox.value != null) { + log('MailboxDashBoardController::quickSearchEmailsAction(): DATE_NOW: ${DateTime.now()}'); + log('MailboxDashBoardController::quickSearchEmailsAction(): DATE: ${DateTime.now().subtract(const Duration(days: 7))}'); return await _quickSearchEmailInteractor.execute( accountId.value!, limit: UnsignedInt(5), @@ -434,6 +440,11 @@ class MailboxDashBoardController extends ReloadableController { ..setIsAscending(false)), filter: EmailFilterCondition( text: pattern, + hasAttachment: listFilterQuickSearch.contains(QuickSearchFilter.hasAttachment) ? true : null, + from: listFilterQuickSearch.contains(QuickSearchFilter.fromMe) ? userProfile.value!.email : null, + after: listFilterQuickSearch.contains(QuickSearchFilter.last7Days) + ? UTCDate(DateTime.now().subtract(const Duration(days: 7))) + : null, inMailbox: selectedMailbox.value!.id), properties: ThreadConstants.propertiesQuickSearch ).then((result) => result.fold( @@ -443,6 +454,14 @@ class MailboxDashBoardController extends ReloadableController { return []; } + void selectQuickSearchFilter(QuickSearchFilter quickSearchFilter) { + if (listFilterQuickSearch.contains(quickSearchFilter)) { + listFilterQuickSearch.remove(quickSearchFilter); + } else { + listFilterQuickSearch.add(quickSearchFilter); + } + } + void composeEmailAction() { if (kIsWeb) { if (dashBoardAction.value is! ComposeEmailAction) { diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 08e0e55a5..624b714a1 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -4,16 +4,13 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; -import 'package:tmail_ui_user/features/base/mixin/network_connection_mixin.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_view_web.dart'; import 'package:tmail_ui_user/features/email/presentation/email_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view_web.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/quick_search_filter.dart'; 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/manage_account/presentation/model/app_setting.dart'; @@ -24,17 +21,14 @@ 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/route_navigation.dart'; -class MailboxDashBoardView extends GetWidget with NetworkConnectionMixin, - UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin, AppLoaderMixin { - - final _responsiveUtils = Get.find(); - final _imagePaths = Get.find(); +class MailboxDashBoardView extends BaseMailboxDashBoardView { MailboxDashBoardView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - if (controller.isDrawerOpen && (_responsiveUtils.isDesktop(context) || _responsiveUtils.isTabletLarge(context))) { + if (controller.isDrawerOpen && (responsiveUtils.isDesktop(context) + || responsiveUtils.isTabletLarge(context))) { WidgetsBinding.instance?.addPostFrameCallback((_) { controller.closeMailboxMenuDrawer(); }); @@ -44,16 +38,16 @@ class MailboxDashBoardView extends GetWidget with Ne key: controller.scaffoldKey, backgroundColor: Colors.white, drawer: ResponsiveWidget( - responsiveUtils: _responsiveUtils, - mobile: SizedBox(child: MailboxView(), width: _responsiveUtils.defaultSizeDrawer), - tablet: SizedBox(child: MailboxView(), width: _responsiveUtils.defaultSizeDrawer), + responsiveUtils: responsiveUtils, + mobile: SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeDrawer), + tablet: SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeDrawer), tabletLarge: const SizedBox.shrink(), desktop: const SizedBox.shrink(), ), - drawerEnableOpenDragGesture: _responsiveUtils.isMobile(context) || _responsiveUtils.isTablet(context), + drawerEnableOpenDragGesture: responsiveUtils.isMobile(context) || responsiveUtils.isTablet(context), body: Stack(children: [ ResponsiveWidget( - responsiveUtils: _responsiveUtils, + responsiveUtils: responsiveUtils, desktop: Column(children: [ Row(children: [ Container(width: 256, color: Colors.white, @@ -64,7 +58,7 @@ class MailboxDashBoardView extends GetWidget with Ne ..setSloganTextAlign(TextAlign.center) ..setSloganTextStyle(const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold)) ..setSizeLogo(24) - ..setLogo(_imagePaths.icLogoTMail)) + ..setLogo(imagePaths.icLogoTMail)) .build(), Obx(() { if (controller.appInformation.value != null) { @@ -87,7 +81,7 @@ class MailboxDashBoardView extends GetWidget with Ne Expanded(child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(child: MailboxView(), width: _responsiveUtils.defaultSizeMenu), + SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu), Expanded(child: _wrapContainerForThreadAndEmail(context)) ], )) @@ -95,7 +89,7 @@ class MailboxDashBoardView extends GetWidget with Ne tabletLarge: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(child: MailboxView(), width: _responsiveUtils.defaultSizeDrawer), + SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeDrawer), Expanded(child: _wrapContainerForThreadAndEmail(context)) ], ), @@ -126,7 +120,7 @@ class MailboxDashBoardView extends GetWidget with Ne } }); case ReadingPane.rightOfInbox: - if (_responsiveUtils.isDesktop(context)) { + if (responsiveUtils.isDesktop(context)) { return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -165,7 +159,7 @@ class MailboxDashBoardView extends GetWidget with Ne ? Expanded(child: _buildSearchForm(context)) : const SizedBox.shrink()), Obx(() => !controller.isSearchActive() - ? (SearchBarView(_imagePaths) + ? (SearchBarView(imagePaths) ..hintTextSearch(AppLocalizations.of(context).search_emails) ..maxSizeWidth(240) ..addOnOpenSearchViewAction(() => controller.enableSearch())) @@ -199,7 +193,7 @@ class MailboxDashBoardView extends GetWidget with Ne Widget _buildListButtonTopBar(BuildContext context) { return Row(children: [ - (ButtonBuilder(_imagePaths.icRefresh) + (ButtonBuilder(imagePaths.icRefresh) ..key(const Key('button_reload_thread')) ..decoration(BoxDecoration( borderRadius: BorderRadius.circular(10), @@ -211,7 +205,7 @@ class MailboxDashBoardView extends GetWidget with Ne ..onPressActionClick(() => controller.dispatchAction(RefreshAllEmailAction()))) .build(), const SizedBox(width: 16), - (ButtonBuilder(_imagePaths.icSelectAll) + (ButtonBuilder(imagePaths.icSelectAll) ..key(const Key('button_select_all')) ..decoration(BoxDecoration( borderRadius: BorderRadius.circular(10), @@ -225,7 +219,7 @@ class MailboxDashBoardView extends GetWidget with Ne ..text(AppLocalizations.of(context).select_all, isVertical: false)) .build(), const SizedBox(width: 16), - (ButtonBuilder(_imagePaths.icMarkAllAsRead) + (ButtonBuilder(imagePaths.icMarkAllAsRead) ..key(const Key('button_mark_all_as_read')) ..decoration(BoxDecoration( borderRadius: BorderRadius.circular(10), @@ -239,7 +233,7 @@ class MailboxDashBoardView extends GetWidget with Ne ..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false)) .build(), const SizedBox(width: 16), - Obx(() => (ButtonBuilder(_imagePaths.icFilterWeb) + Obx(() => (ButtonBuilder(imagePaths.icFilterWeb) ..key(const Key('button_filter_messages')) ..context(context) ..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorButtonHeaderThread)) @@ -257,7 +251,7 @@ class MailboxDashBoardView extends GetWidget with Ne : FontWeight.w500)) ..addIconAction(Padding( padding: const EdgeInsets.only(left: 8), - child: SvgPicture.asset(_imagePaths.icArrowDown, fit: BoxFit.fill))) + child: SvgPicture.asset(imagePaths.icArrowDown, fit: BoxFit.fill))) ..addOnPressActionWithPositionClick((position) => controller.openPopupMenuAction(context, position, popupMenuFilterEmailActionTile(context, controller.filterMessageOption.value, @@ -271,7 +265,7 @@ class MailboxDashBoardView extends GetWidget with Ne Widget _buildListButtonTopBarSearchActive(BuildContext context) { return Row(children: [ - (ButtonBuilder(_imagePaths.icSelectAll) + (ButtonBuilder(imagePaths.icSelectAll) ..key(const Key('button_select_all')) ..decoration(BoxDecoration( borderRadius: BorderRadius.circular(10), @@ -285,7 +279,7 @@ class MailboxDashBoardView extends GetWidget with Ne ..text(AppLocalizations.of(context).select_all, isVertical: false)) .build(), const SizedBox(width: 16), - (ButtonBuilder(_imagePaths.icMarkAllAsRead) + (ButtonBuilder(imagePaths.icMarkAllAsRead) ..key(const Key('button_mark_all_as_read')) ..decoration(BoxDecoration( borderRadius: BorderRadius.circular(10), @@ -304,7 +298,7 @@ class MailboxDashBoardView extends GetWidget with Ne Widget _buildListButtonTopBarSelection(BuildContext context) { return Row(children: [ buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icCloseComposer, color: AppColor.colorTextButton, fit: BoxFit.fill), + icon: SvgPicture.asset(imagePaths.icCloseComposer, color: AppColor.colorTextButton, fit: BoxFit.fill), tooltip: AppLocalizations.of(context).cancel, onTap: () => controller.dispatchAction(CancelSelectionAllEmailAction())), Obx(() => Text( @@ -314,8 +308,8 @@ class MailboxDashBoardView extends GetWidget with Ne Obx(() => buildIconWeb( icon: SvgPicture.asset( controller.listEmailSelected.isAllEmailRead - ? _imagePaths.icRead - : _imagePaths.icUnread, + ? imagePaths.icRead + : imagePaths.icUnread, fit: BoxFit.fill), tooltip: controller.listEmailSelected.isAllEmailRead ? AppLocalizations.of(context).mark_as_unread @@ -329,8 +323,8 @@ class MailboxDashBoardView extends GetWidget with Ne Obx(() => buildIconWeb( icon: SvgPicture.asset( controller.listEmailSelected.isAllEmailStarred - ? _imagePaths.icUnStar - : _imagePaths.icStar, + ? imagePaths.icUnStar + : imagePaths.icStar, fit: BoxFit.fill), tooltip: controller.listEmailSelected.isAllEmailStarred ? AppLocalizations.of(context).un_star @@ -344,7 +338,7 @@ class MailboxDashBoardView extends GetWidget with Ne Obx(() { if (controller.selectedMailbox.value?.isDrafts == false) { return buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill), + icon: SvgPicture.asset(imagePaths.icMove, fit: BoxFit.fill), tooltip: AppLocalizations.of(context).move, onTap: () => controller.dispatchAction( HandleEmailActionTypeAction(context, @@ -359,8 +353,8 @@ class MailboxDashBoardView extends GetWidget with Ne return buildIconWeb( icon: SvgPicture.asset( controller.selectedMailbox.value?.isSpam == true - ? _imagePaths.icNotSpam - : _imagePaths.icSpam, + ? imagePaths.icNotSpam + : imagePaths.icSpam, fit: BoxFit.fill), tooltip: controller.selectedMailbox.value?.isSpam == true ? AppLocalizations.of(context).un_spam @@ -383,7 +377,7 @@ class MailboxDashBoardView extends GetWidget with Ne } }), Obx(() => buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill), + icon: SvgPicture.asset(imagePaths.icDelete, fit: BoxFit.fill), tooltip: controller.selectedMailbox.value?.isTrash == true ? AppLocalizations.of(context).delete_permanently : AppLocalizations.of(context).move_to_trash, @@ -405,7 +399,7 @@ class MailboxDashBoardView extends GetWidget with Ne return Row( children: [ buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icBack, color: AppColor.colorTextButton, fit: BoxFit.fill), + icon: SvgPicture.asset(imagePaths.icBack, color: AppColor.colorTextButton, fit: BoxFit.fill), onTap: () { controller.disableSearch(); controller.dispatchAction(CancelSelectionAllEmailAction()); @@ -422,7 +416,6 @@ class MailboxDashBoardView extends GetWidget with Ne focusNode: controller.searchFocus, textInputAction: TextInputAction.done, onSubmitted: (keyword) { - log('MailboxDashBoardView::_buildSearchForm(): onSubmitted: $keyword'); if (keyword.trim().isNotEmpty) { controller.saveRecentSearch(RecentSearch(keyword, DateTime.now())); } @@ -438,17 +431,16 @@ class MailboxDashBoardView extends GetWidget with Ne labelStyle: const TextStyle(color: AppColor.colorHintSearchBar, fontSize: 17.0) ), leftButton: buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icSearchBar, width: 16, height: 16, fit: BoxFit.fill), + icon: SvgPicture.asset(imagePaths.icSearchBar, width: 16, height: 16, fit: BoxFit.fill), onTap: () { final keyword = controller.searchInputController.text; - log('MailboxDashBoardView::_buildSearchForm(): buttonClick: $keyword'); if (keyword.trim().isNotEmpty) { controller.saveRecentSearch(RecentSearch(keyword, DateTime.now())); } controller.searchEmail(context, keyword); }), - rightButton: buildIconWeb( - icon: SvgPicture.asset(_imagePaths.icComposerClose, width: 18, height: 18, fit: BoxFit.fill), + clearTextButton: buildIconWeb( + icon: SvgPicture.asset(imagePaths.icClearTextSearch, width: 16, height: 16, fit: BoxFit.fill), onTap: () { controller.searchInputController.clear(); controller.clearSearchText(); @@ -458,54 +450,26 @@ class MailboxDashBoardView extends GetWidget with Ne color: Colors.white, borderRadius: const BorderRadius.all(Radius.circular(16)), constraints: BoxConstraints( - maxWidth: _responsiveUtils.isDesktop(context) ? 556 : double.infinity, + maxWidth: responsiveUtils.isDesktop(context) ? 556 : double.infinity, maxHeight: 322), ), - actionButton: Padding( - padding: const EdgeInsets.only(left: 24, top: 24, right: 24, bottom: 20), - child: Row( - children: [ - (ButtonBuilder(_imagePaths.icAttachmentSB) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(const EdgeInsets.only(right: 5)) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..radiusSplash(10) - ..size(16) - ..textStyle(const TextStyle(fontSize: 13, color: AppColor.colorTextButtonHeaderThread)) - ..onPressActionClick(() => {}) - ..text(AppLocalizations.of(context).hasAttachment, isVertical: false)) - .build(), - const SizedBox(width: 8), - (ButtonBuilder(_imagePaths.icCalendarSB) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(const EdgeInsets.only(right: 5)) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..radiusSplash(10) - ..size(16) - ..textStyle(const TextStyle(fontSize: 13, color: AppColor.colorTextButtonHeaderThread)) - ..onPressActionClick(() => {}) - ..text(AppLocalizations.of(context).last7Days, isVertical: false)) - .build(), - const SizedBox(width: 8), - (ButtonBuilder(_imagePaths.icUserSB) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(const EdgeInsets.only(right: 5)) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..radiusSplash(10) - ..size(16) - ..textStyle(const TextStyle(fontSize: 13, color: AppColor.colorTextButtonHeaderThread)) - ..onPressActionClick(() => {}) - ..text(AppLocalizations.of(context).fromMe, isVertical: false)) - .build(), - ], - ), - ), + listActionButton: const [ + QuickSearchFilter.hasAttachment, + QuickSearchFilter.last7Days, + QuickSearchFilter.fromMe, + ], + actionButtonBuilder: (context, filterAction) { + if (filterAction is QuickSearchFilter) { + return buildQuickSearchFilterButton(context, filterAction); + } + return const SizedBox.shrink(); + }, + buttonActionCallback: (filterAction) { + if (filterAction is QuickSearchFilter) { + return controller.selectQuickSearchFilter(filterAction); + } + }, + listActionPadding: const EdgeInsets.only(left: 24, top: 24, right: 24, bottom: 20), titleHeaderRecent: Padding( padding: const EdgeInsets.only(left: 24, right: 24, bottom: 8), child: Text(AppLocalizations.of(context).recent, @@ -518,7 +482,7 @@ class MailboxDashBoardView extends GetWidget with Ne padding: const EdgeInsets.only(bottom: 16), child: loadingWidget, ), - getRecentCallback: (pattern) async { + fetchRecentActionCallback: (pattern) async { return controller.getAllRecentSearchAction(pattern); }, itemRecentBuilder: (context, recent) { diff --git a/lib/features/mailbox_dashboard/presentation/model/quick_search_filter.dart b/lib/features/mailbox_dashboard/presentation/model/quick_search_filter.dart new file mode 100644 index 000000000..e372e72ce --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/model/quick_search_filter.dart @@ -0,0 +1,67 @@ + +import 'package:core/core.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +enum QuickSearchFilter { + hasAttachment, + last7Days, + fromMe +} + +extension QuickSearchFilterExtension on QuickSearchFilter { + + String getTitle(BuildContext context) { + switch(this) { + case QuickSearchFilter.hasAttachment: + return AppLocalizations.of(context).hasAttachment; + case QuickSearchFilter.last7Days: + return AppLocalizations.of(context).last7Days; + case QuickSearchFilter.fromMe: + return AppLocalizations.of(context).fromMe; + } + } + + String getIcon(ImagePaths imagePaths, List listFilter) { + final filterSelected = listFilter.contains(this); + + if (filterSelected) { + return imagePaths.icSelectedSB; + } else { + switch(this) { + case QuickSearchFilter.hasAttachment: + return imagePaths.icAttachmentSB; + case QuickSearchFilter.last7Days: + return imagePaths.icCalendarSB; + case QuickSearchFilter.fromMe: + return imagePaths.icUserSB; + } + } + } + + Color getBackgroundColor(List listFilter) { + final filterSelected = listFilter.contains(this); + + if (filterSelected) { + return AppColor.colorItemEmailSelectedDesktop; + } else { + return AppColor.colorButtonHeaderThread; + } + } + + TextStyle getTextStyle(List listFilter) { + final filterSelected = listFilter.contains(this); + + if (filterSelected) { + return const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: AppColor.colorTextButton); + } else { + return const TextStyle( + fontSize: 13, + fontWeight: FontWeight.normal, + color: AppColor.colorTextButtonHeaderThread); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart index 169847107..fd9386557 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart @@ -26,10 +26,14 @@ class EmailQuickSearchItemTileWidget extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), child: Row( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset( - _presentationEmail.hasStarred ? imagePath.icStar : imagePath.icUnStar, - width: 20, height: 20, fit: BoxFit.fill), + Padding( + padding: const EdgeInsets.only(top: 2), + child: SvgPicture.asset( + _presentationEmail.hasStarred ? imagePath.icStar : imagePath.icUnStar, + width: 18, height: 18, fit: BoxFit.fill), + ), const SizedBox(width: 8), Expanded( child: Column( diff --git a/pubspec.yaml b/pubspec.yaml index 44904e658..ae5a5c1eb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -148,6 +148,8 @@ dependencies: flutter_staggered_grid_view: 0.6.1 + timeago: 3.2.2 + dev_dependencies: flutter_test: sdk: flutter