TF-997 Custom date ranges in search

This commit is contained in:
dab246
2022-10-05 22:59:44 +07:00
committed by Dat H. Pham
parent a363435de2
commit 796a0fdba7
11 changed files with 369 additions and 32 deletions
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
enum EmailReceiveTimeType {
@@ -8,9 +9,10 @@ enum EmailReceiveTimeType {
last7Days,
last30Days,
last6Months,
lastYear;
lastYear,
customRange;
String getTitle(BuildContext context) {
String getTitle(BuildContext context, {DateTime? startDate, DateTime? endDate}) {
switch(this) {
case EmailReceiveTimeType.allTime:
return AppLocalizations.of(context).allTime;
@@ -22,6 +24,16 @@ enum EmailReceiveTimeType {
return AppLocalizations.of(context).last6Months;
case EmailReceiveTimeType.lastYear:
return AppLocalizations.of(context).lastYears;
case EmailReceiveTimeType.customRange:
if (startDate != null && endDate != null) {
final startDateString = startDate.formatDate(pattern: 'yyyy-dd-MM');
final endDateString = endDate.formatDate(pattern: 'yyyy-dd-MM');
return AppLocalizations.of(context).dateRangeAdvancedSearchFilter(
startDateString,
endDateString);
} else {
return AppLocalizations.of(context).customRange;
}
}
}
@@ -30,13 +42,23 @@ enum EmailReceiveTimeType {
case EmailReceiveTimeType.allTime:
return null;
case EmailReceiveTimeType.last7Days:
return UTCDate(DateTime.now().subtract(const Duration(days: 7)));
final today = DateTime.now();
final last7Days = today.subtract(const Duration(days: 7));
return last7Days.toUTCDate();
case EmailReceiveTimeType.last30Days:
return UTCDate(DateTime.now().subtract(const Duration(days: 30)));
final today = DateTime.now();
final last30Days = today.subtract(const Duration(days: 30));
return last30Days.toUTCDate();
case EmailReceiveTimeType.last6Months:
return UTCDate(DateTime.now().subtract(const Duration(days: 180)));
final today = DateTime.now();
final last6months = DateTime(today.year, today.month - 6, today.day);
return last6months.toUTCDate();
case EmailReceiveTimeType.lastYear:
return UTCDate(DateTime.now().subtract(const Duration(days: 365)));
final today = DateTime.now();
final lastYear = DateTime(today.year - 1, today.month, today.day);
return lastYear.toUTCDate();
case EmailReceiveTimeType.customRange:
return null;
}
}
}
@@ -17,6 +17,8 @@ class SearchEmailFilter {
final EmailReceiveTimeType emailReceiveTimeType;
final bool hasAttachment;
final UTCDate? before;
final UTCDate? startDate;
final UTCDate? endDate;
SearchEmailFilter({
Set<String>? from,
@@ -28,6 +30,8 @@ class SearchEmailFilter {
Set<String>? notKeyword,
this.mailbox,
this.before,
this.startDate,
this.endDate,
}) : from = from ?? <String>{},
to = to ?? <String>{},
notKeyword = notKeyword ?? <String>{},
@@ -45,6 +49,8 @@ class SearchEmailFilter {
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
UTCDate? before,
UTCDate? startDate,
UTCDate? endDate,
}) {
return SearchEmailFilter(
from: from ?? this.from,
@@ -56,6 +62,8 @@ class SearchEmailFilter {
emailReceiveTimeType: emailReceiveTimeType ?? this.emailReceiveTimeType,
hasAttachment: hasAttachment ?? this.hasAttachment,
before: before ?? this.before,
startDate: startDate ?? this.startDate,
endDate: endDate ?? this.endDate,
);
}
@@ -67,10 +75,14 @@ class SearchEmailFilter {
inMailbox: mailbox == PresentationMailbox.unifiedMailbox
? null
: mailbox?.id,
after: emailReceiveTimeType.toUTCDate(),
after: emailReceiveTimeType == EmailReceiveTimeType.customRange
? startDate
: emailReceiveTimeType.toUTCDate(),
hasAttachment: hasAttachment == false ? null : hasAttachment,
subject: subject,
before: before,
before: emailReceiveTimeType == EmailReceiveTimeType.customRange
? endDate
: before,
);
final listEmailCondition = {
@@ -113,4 +125,20 @@ extension SearchEmailFilterExtension on SearchEmailFilter {
before: newBefore,
);
}
SearchEmailFilter withDateRange({UTCDate? startDate, UTCDate? endDate}) {
return SearchEmailFilter(
from: from,
to: to,
text: text,
subject: subject,
notKeyword: notKeyword,
mailbox: mailbox,
emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment,
before: before,
startDate: startDate,
endDate: endDate,
);
}
}