TF-4066 Display Unread, Starred in list quick search button in dashboard view

This commit is contained in:
dab246
2025-09-26 18:12:27 +07:00
committed by Dat H. Pham
parent efc2d80efc
commit d05904229b
9 changed files with 92 additions and 10 deletions
@@ -224,7 +224,6 @@ extension AppColor on Color {
static const colorFilterMessageButton = Color(0xFFEBEDF0);
static const colorFilterMessageIcon = Color(0xFF686E76);
static const colorFilterMessageTitle = Color(0xFF686E76);
static const colorStarredSearchFilterIcon = Color(0xFFFFCC00);
static const colorMobileSearchFilterButton = Color(0xFFEBEDF0);
static const colorContactViewClearFilterButton = Color(0x001C3D0D);
static const steelGrayA540 = Color(0xFF55687D);
@@ -119,6 +119,7 @@ class AdvancedFilterController extends BaseController {
Option<PresentationMailbox>? mailboxOption,
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
Option<bool>? hasAttachmentOption,
Option<bool>? unreadOption,
Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption,
@@ -134,6 +135,7 @@ class AdvancedFilterController extends BaseController {
mailboxOption: mailboxOption,
emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
hasAttachmentOption: hasAttachmentOption,
unreadOption: unreadOption,
beforeOption: beforeOption,
startDateOption: startDateOption,
endDateOption: endDateOption,
@@ -125,6 +125,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/notify_thread_detail_setting_updated.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/reopen_composer_cache_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/select_search_filter_action_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart';
@@ -2240,6 +2241,12 @@ class MailboxDashBoardController extends ReloadableController
case QuickSearchFilter.folder:
_deleteFolderSearchFilter();
break;
case QuickSearchFilter.starred:
deleteStarredSearchFilter();
break;
case QuickSearchFilter.unread:
deleteUnreadSearchFilter();
break;
default:
break;
}
@@ -183,6 +183,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
Option<PresentationMailbox>? mailboxOption,
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
Option<bool>? hasAttachmentOption,
Option<bool>? unreadOption,
Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption,
@@ -199,6 +200,7 @@ class SearchController extends BaseController with DateRangePickerMixin {
mailboxOption: mailboxOption,
emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
hasAttachmentOption: hasAttachmentOption,
unreadOption: unreadOption,
beforeOption: beforeOption,
startDateOption: startDateOption,
endDateOption: endDateOption,
@@ -220,6 +222,10 @@ class SearchController extends BaseController with DateRangePickerMixin {
Set<String> get listAddressOfFromFiltered => searchEmailFilter.value.from;
Set<String> get listHasKeywordFiltered => searchEmailFilter.value.hasKeyword;
bool get unreadFiltered => searchEmailFilter.value.unread;
EmailSortOrderType get sortOrderFiltered => searchEmailFilter.value.sortOrderType;
bool isSearchActive() =>
@@ -0,0 +1,38 @@
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
extension SelectSearchFilterActionExtension on MailboxDashBoardController {
void selectStarredSearchFilter() {
final listHasKeywordFiltered = searchController.listHasKeywordFiltered;
if (!listHasKeywordFiltered.contains(KeyWordIdentifier.emailFlagged.value)) {
listHasKeywordFiltered.add(KeyWordIdentifier.emailFlagged.value);
}
searchController.updateFilterEmail(
hasKeywordOption: Some(listHasKeywordFiltered),
);
dispatchAction(StartSearchEmailAction());
}
void selectUnreadSearchFilter() {
searchController.updateFilterEmail(unreadOption: const Some(true));
dispatchAction(StartSearchEmailAction());
}
void deleteStarredSearchFilter() {
final listHasKeywordFiltered = searchController.listHasKeywordFiltered;
if (listHasKeywordFiltered.contains(KeyWordIdentifier.emailFlagged.value)) {
listHasKeywordFiltered.remove(KeyWordIdentifier.emailFlagged.value);
}
searchController.updateFilterEmail(
hasKeywordOption: Some(listHasKeywordFiltered),
);
dispatchAction(StartSearchEmailAction());
}
void deleteUnreadSearchFilter() {
searchController.updateFilterEmail(unreadOption: const None());
dispatchAction(StartSearchEmailAction());
}
}
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/extensions/session_extension.dart';
import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.dart';
@@ -22,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailb
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_open_context_menu_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_profile_setting_action_type_click_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/select_search_filter_action_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/profile_setting/profile_setting_action_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
@@ -455,13 +457,14 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.colorFilterMessageButton.withValues(alpha: 0.6),
shadowColor: Colors.transparent,
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8),
padding: const EdgeInsetsDirectional.symmetric(horizontal: 12),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
),
elevation: 0.0,
foregroundColor: AppColor.colorTextButtonHeaderThread,
maximumSize: const Size.fromWidth(250),
fixedSize: const Size.fromHeight(34),
textStyle: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 13,
fontWeight: FontWeight.normal,
@@ -663,6 +666,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
_buildQuickSearchFilterButton(context, QuickSearchFilter.dateTime),
MailboxDashboardViewWebStyle.searchFilterSizeBoxMargin,
_buildQuickSearchFilterButton(context, QuickSearchFilter.hasAttachment),
MailboxDashboardViewWebStyle.searchFilterSizeBoxMargin,
_buildQuickSearchFilterButton(context, QuickSearchFilter.starred),
MailboxDashboardViewWebStyle.searchFilterSizeBoxMargin,
_buildQuickSearchFilterButton(context, QuickSearchFilter.unread),
],
),
),
@@ -713,6 +720,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
final receiveTimeType = controller.searchController.receiveTimeFiltered;
final mailbox = controller.searchController.mailboxFiltered;
final listAddressOfTo = controller.searchController.listAddressOfToFiltered;
final listHasKeywordFiltered = controller.searchController.listHasKeywordFiltered;
final unreadFiltered = controller.searchController.unreadFiltered;
final isSelected = searchFilter.isSelected(
context,
@@ -730,7 +739,9 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
startDate != null ||
endDate != null ||
receiveTimeType != EmailReceiveTimeType.allTime ||
mailbox != null;
mailbox != null ||
listHasKeywordFiltered.contains(KeyWordIdentifier.emailFlagged.value) ||
unreadFiltered;
return SearchFilterButton(
key: Key('${searchFilter.name}_search_filter_button'),
@@ -790,6 +801,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
case QuickSearchFilter.folder:
controller.selectFolderSearchFilter();
break;
case QuickSearchFilter.starred:
controller.selectStarredSearchFilter();
break;
case QuickSearchFilter.unread:
controller.selectUnreadSearchFilter();
break;
default:
break;
}
@@ -17,6 +17,7 @@ enum QuickSearchFilter {
last7Days,
fromMe,
starred,
unread,
sortBy,
dateTime,
from,
@@ -58,6 +59,8 @@ enum QuickSearchFilter {
return AppLocalizations.of(context).to_email_address_prefix;
case QuickSearchFilter.starred:
return AppLocalizations.of(context).starred;
case QuickSearchFilter.unread:
return AppLocalizations.of(context).unread;
}
}
@@ -80,7 +83,9 @@ enum QuickSearchFilter {
case QuickSearchFilter.folder:
return imagePaths.icFolderMailbox;
case QuickSearchFilter.starred:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icStar;
return isSelected ? imagePaths.icSelectedSB : imagePaths.icUnStar;
case QuickSearchFilter.unread:
return isSelected ? imagePaths.icSelectedSB : imagePaths.icUnread;
}
}
@@ -112,11 +117,7 @@ enum QuickSearchFilter {
if (isSelected) {
return AppColor.primaryColor;
} else {
if (this == QuickSearchFilter.starred) {
return AppColor.colorStarredSearchFilterIcon;
} else {
return AppColor.colorSearchFilterIcon;
}
return AppColor.colorSearchFilterIcon;
}
}
@@ -149,6 +150,8 @@ enum QuickSearchFilter {
return searchFilter.mailbox != null;
case QuickSearchFilter.starred:
return searchFilter.hasKeyword.contains(KeyWordIdentifier.emailFlagged.value) == true;
case QuickSearchFilter.unread:
return searchFilter.unread;
}
}
@@ -29,6 +29,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
final PresentationMailbox? mailbox;
final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment;
final bool unread;
final UTCDate? before;
final UTCDate? startDate;
final UTCDate? endDate;
@@ -52,6 +53,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Set<String>? to,
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
bool? unread,
Set<String>? notKeyword,
Set<String>? hasKeyword,
EmailSortOrderType? sortOrderType,
@@ -60,6 +62,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
notKeyword = notKeyword ?? <String>{},
hasKeyword = hasKeyword ?? <String>{},
hasAttachment = hasAttachment ?? false,
unread = unread ?? false,
emailReceiveTimeType =
emailReceiveTimeType ?? EmailReceiveTimeType.allTime,
sortOrderType = sortOrderType ?? defaultSortOrder;
@@ -74,6 +77,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
Option<PresentationMailbox>? mailboxOption,
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
Option<bool>? hasAttachmentOption,
Option<bool>? unreadOption,
Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption,
@@ -90,6 +94,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
mailbox: getOptionParam(mailboxOption, mailbox),
emailReceiveTimeType: getOptionParam(emailReceiveTimeTypeOption, emailReceiveTimeType),
hasAttachment: getOptionParam(hasAttachmentOption, hasAttachment),
unread: getOptionParam(unreadOption, unread),
before: getOptionParam(beforeOption, before),
startDate: getOptionParam(startDateOption, startDate),
endDate: getOptionParam(endDateOption, endDate),
@@ -118,6 +123,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
hasKeyword: hasKeyword.length == 1
? hasKeyword.first
: null,
notKeyword: unread ? KeyWordIdentifier.emailSeen.value : null,
);
final listEmailCondition = {
@@ -197,7 +203,8 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
emailReceiveTimeType != EmailReceiveTimeType.allTime ||
sortOrderType != SearchEmailFilter.defaultSortOrder ||
(mailbox != null && mailbox?.id != PresentationMailbox.unifiedMailbox.id) ||
hasAttachment;
hasAttachment ||
unread;
bool get isContainFlagged => hasKeyword.contains(KeyWordIdentifier.emailFlagged.value);
@@ -212,6 +219,7 @@ class SearchEmailFilter with EquatableMixin, OptionParamMixin {
mailbox,
emailReceiveTimeType,
hasAttachment,
unread,
before,
startDate,
endDate,
@@ -769,6 +769,7 @@ class SearchEmailController extends BaseController
Option<PresentationMailbox>? mailboxOption,
Option<EmailReceiveTimeType>? emailReceiveTimeTypeOption,
Option<bool>? hasAttachmentOption,
Option<bool>? unreadOption,
Option<UTCDate>? beforeOption,
Option<UTCDate>? startDateOption,
Option<UTCDate>? endDateOption,
@@ -783,6 +784,7 @@ class SearchEmailController extends BaseController
mailboxOption: mailboxOption,
emailReceiveTimeTypeOption: emailReceiveTimeTypeOption,
hasAttachmentOption: hasAttachmentOption,
unreadOption: unreadOption,
beforeOption: beforeOption,
startDateOption: startDateOption,
endDateOption: endDateOption,