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:collection/collection.dart';
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_date_range_picker/multiple_view_date_range_picker.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
@@ -19,7 +20,9 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.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/search_email_filter.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
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';
@@ -45,12 +48,20 @@ class AdvancedFilterController extends BaseController {
final SearchController searchController = Get.find<SearchController>();
final MailboxDashBoardController _mailboxDashBoardController =
Get.find<MailboxDashBoardController>();
final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>();
SearchEmailFilter get searchEmailFilter =>
searchController.searchEmailFilter.value;
final focusManager = InputFieldFocusManager.initial();
DateTime? _startDate, _endDate;
DateTime? get startDate => _startDate;
DateTime? get endDate => _endDate;
@override
void onReady() {
if (!BuildUtils.isWeb) {
@@ -71,6 +82,7 @@ class AdvancedFilterController extends BaseController {
void cleanSearchFilter(BuildContext context) {
searchController.cleanSearchFilter();
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
clearDateRangeOfFilter();
subjectFilterInputController.text = '';
hasKeyWordFilterInputController.text = '';
notKeyWordFilterInputController.text = '';
@@ -117,6 +129,8 @@ class AdvancedFilterController extends BaseController {
StringConvert.writeEmptyToNull(subjectFilterInputController.text),
emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value,
hasAttachment: hasAttachment.value,
endDate: _endDate.toUTCDate(),
startDate: _startDate.toUTCDate()
);
}
@@ -227,7 +241,10 @@ class AdvancedFilterController extends BaseController {
notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(
searchEmailFilter.notKeyword.firstOrNull);
dateFilterInputController.text = StringConvert.writeNullToEmpty(
searchEmailFilter.emailReceiveTimeType.getTitle(context));
searchEmailFilter.emailReceiveTimeType.getTitle(
context,
startDate: _startDate,
endDate: _endDate));
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(searchEmailFilter.mailbox?.name?.name);
dateFilterSelectedFormAdvancedSearch.value =
@@ -235,6 +252,91 @@ class AdvancedFilterController extends BaseController {
hasAttachment.value = searchEmailFilter.hasAttachment;
}
void selectDateRange(BuildContext context) {
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black54,
pageBuilder: (context, animation, secondaryAnimation) {
return Dialog(
elevation: 0,
backgroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0)),
child: MultipleViewDateRangePicker(
confirmText: AppLocalizations.of(context).setDate,
cancelText: AppLocalizations.of(context).cancel,
last7daysTitle: AppLocalizations.of(context).last7Days,
last30daysTitle: AppLocalizations.of(context).last30Days,
last6monthsTitle: AppLocalizations.of(context).last6Months,
lastYearTitle: AppLocalizations.of(context).lastYears,
startDate: _startDate,
endDate: _endDate,
setDateActionCallback: ({startDate, endDate}) {
_handleSelectDateRangeResult(context, startDate, endDate);
},
)
);
}
);
}
void _handleSelectDateRangeResult(
BuildContext context,
DateTime? startDate,
DateTime? endDate
) {
log('AdvancedFilterController::_handleSelectDateRangeResult(): startDate: $startDate');
log('AdvancedFilterController::_handleSelectDateRangeResult(): endDate: $endDate');
if (startDate == null) {
_appToast.showToastWithIcon(
context,
textColor: Colors.black,
message: AppLocalizations.of(context).toastMessageErrorWhenSelectStartDateIsEmpty,
icon: _imagePaths.icNotConnection);
return;
}
if (endDate == null) {
_appToast.showToastWithIcon(
context,
textColor: Colors.black,
message: AppLocalizations.of(context).toastMessageErrorWhenSelectEndDateIsEmpty,
icon: _imagePaths.icNotConnection);
return;
}
if (endDate.isBefore(startDate)) {
_appToast.showToastWithIcon(
context,
textColor: Colors.black,
message: AppLocalizations.of(context).toastMessageErrorWhenSelectDateIsInValid,
icon: _imagePaths.icNotConnection);
return;
}
_startDate = startDate;
_endDate = endDate;
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.customRange;
dateFilterInputController.text = EmailReceiveTimeType.customRange.getTitle(
context,
startDate: startDate,
endDate: endDate);
dateFilterSelectedFormAdvancedSearch.refresh();
popBack();
}
void clearDateRangeOfFilter() {
_startDate = null;
_endDate = null;
searchController.searchEmailFilter.value =
searchController.searchEmailFilter.value.withDateRange(
startDate: _startDate.toUTCDate(),
endDate: _endDate.toUTCDate());
}
@override
void onClose() {
focusManager.dispose();
@@ -129,6 +129,8 @@ class SearchController extends BaseController {
EmailReceiveTimeType? emailReceiveTimeType,
bool? hasAttachment,
UTCDate? before,
UTCDate? startDate,
UTCDate? endDate,
}) {
searchEmailFilter.value = searchEmailFilter.value.copyWith(
from: from,
@@ -140,6 +142,8 @@ class SearchController extends BaseController {
emailReceiveTimeType: emailReceiveTimeType,
hasAttachment: hasAttachment,
before: before,
startDate: startDate,
endDate: endDate,
);
}