Use common FilterField & EmailReceiveTimeType objects for the entire app
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -0,0 +1,104 @@
|
|||||||
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
|
enum FilterField {
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
cc,
|
||||||
|
bcc,
|
||||||
|
replyTo,
|
||||||
|
subject,
|
||||||
|
hasKeyword,
|
||||||
|
notKeyword,
|
||||||
|
mailBox,
|
||||||
|
date,
|
||||||
|
sortBy,
|
||||||
|
hasAttachment,
|
||||||
|
deletionDate,
|
||||||
|
receptionDate,
|
||||||
|
recoverSubject,
|
||||||
|
recipients,
|
||||||
|
sender;
|
||||||
|
|
||||||
|
String getTitle(AppLocalizations appLocalizations) {
|
||||||
|
switch (this) {
|
||||||
|
case FilterField.from:
|
||||||
|
return appLocalizations.from_email_address_prefix;
|
||||||
|
case FilterField.to:
|
||||||
|
return appLocalizations.to_email_address_prefix;
|
||||||
|
case FilterField.subject:
|
||||||
|
case FilterField.recoverSubject:
|
||||||
|
return appLocalizations.subject;
|
||||||
|
case FilterField.hasKeyword:
|
||||||
|
return appLocalizations.hasTheWords;
|
||||||
|
case FilterField.notKeyword:
|
||||||
|
return appLocalizations.doesNotHave;
|
||||||
|
case FilterField.mailBox:
|
||||||
|
return appLocalizations.folder;
|
||||||
|
case FilterField.date:
|
||||||
|
return appLocalizations.date;
|
||||||
|
case FilterField.sortBy:
|
||||||
|
return appLocalizations.sortBy;
|
||||||
|
case FilterField.hasAttachment:
|
||||||
|
return appLocalizations.hasAttachment;
|
||||||
|
case FilterField.deletionDate:
|
||||||
|
return appLocalizations.deletionDate;
|
||||||
|
case FilterField.receptionDate:
|
||||||
|
return appLocalizations.receptionDate;
|
||||||
|
case FilterField.recipients:
|
||||||
|
return appLocalizations.headerRecipients;
|
||||||
|
case FilterField.sender:
|
||||||
|
return appLocalizations.sender;
|
||||||
|
default:
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getHintText(AppLocalizations appLocalizations) {
|
||||||
|
switch (this) {
|
||||||
|
case FilterField.from:
|
||||||
|
case FilterField.to:
|
||||||
|
return appLocalizations.nameOrEmailAddress;
|
||||||
|
case FilterField.subject:
|
||||||
|
return appLocalizations.enterASubject;
|
||||||
|
case FilterField.hasKeyword:
|
||||||
|
case FilterField.notKeyword:
|
||||||
|
return appLocalizations.enterSomeSuggestions;
|
||||||
|
case FilterField.mailBox:
|
||||||
|
return appLocalizations.allFolders;
|
||||||
|
case FilterField.date:
|
||||||
|
return appLocalizations.allTime;
|
||||||
|
case FilterField.sortBy:
|
||||||
|
return appLocalizations.mostRecent;
|
||||||
|
case FilterField.hasAttachment:
|
||||||
|
return appLocalizations.hasAttachment;
|
||||||
|
case FilterField.recoverSubject:
|
||||||
|
return appLocalizations.enterSubjectKeywords;
|
||||||
|
case FilterField.recipients:
|
||||||
|
case FilterField.sender:
|
||||||
|
return appLocalizations.addAnEmailAddress;
|
||||||
|
default:
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<EmailReceiveTimeType> getSupportedTimeTypes(
|
||||||
|
DateTime restorationHorizon,
|
||||||
|
) {
|
||||||
|
switch (this) {
|
||||||
|
case FilterField.deletionDate:
|
||||||
|
final supportedTypes = EmailReceiveTimeType
|
||||||
|
.valuesForRecoverDeletionDateField
|
||||||
|
.where((type) => restorationHorizon
|
||||||
|
.subtract(const Duration(seconds: 2)) // to allow "15 days" if restorationHorizon is exactly 15
|
||||||
|
.isBefore(type.toOldestUTCDate()!.value))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
return [...supportedTypes, EmailReceiveTimeType.customRange];
|
||||||
|
case FilterField.receptionDate:
|
||||||
|
return EmailReceiveTimeType.valuesForRecoverReceptionDateDateField;
|
||||||
|
default:
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
extension PrefixEmailAddressExtension on PrefixEmailAddress {
|
extension PrefixEmailAddressExtension on PrefixEmailAddress {
|
||||||
@@ -35,4 +36,19 @@ extension PrefixEmailAddressExtension on PrefixEmailAddress {
|
|||||||
return email.from?.toList() ?? List.empty();
|
return email.from?.toList() ?? List.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FilterField get filterField {
|
||||||
|
switch(this) {
|
||||||
|
case PrefixEmailAddress.from:
|
||||||
|
return FilterField.from;
|
||||||
|
case PrefixEmailAddress.to:
|
||||||
|
return FilterField.to;
|
||||||
|
case PrefixEmailAddress.cc:
|
||||||
|
return FilterField.cc;
|
||||||
|
case PrefixEmailAddress.bcc:
|
||||||
|
return FilterField.bcc;
|
||||||
|
case PrefixEmailAddress.replyTo:
|
||||||
|
return FilterField.replyTo;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+6
-6
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
import 'package:model/email/prefix_email_address.dart';
|
|
||||||
import 'package:model/mailbox/expand_mode.dart';
|
import 'package:model/mailbox/expand_mode.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
||||||
|
|
||||||
@@ -30,20 +30,20 @@ extension RemoveDraggableEmailAddressBetweenRecipientFieldsExtension on Composer
|
|||||||
required ComposerController controller,
|
required ComposerController controller,
|
||||||
required DraggableEmailAddress draggableEmailAddress,
|
required DraggableEmailAddress draggableEmailAddress,
|
||||||
}) {
|
}) {
|
||||||
switch(draggableEmailAddress.prefix) {
|
switch(draggableEmailAddress.filterField) {
|
||||||
case PrefixEmailAddress.to:
|
case FilterField.to:
|
||||||
controller.listToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
controller.listToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
controller.toAddressExpandMode.value = ExpandMode.EXPAND;
|
controller.toAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
case PrefixEmailAddress.cc:
|
case FilterField.cc:
|
||||||
controller.listCcEmailAddress.remove(draggableEmailAddress.emailAddress);
|
controller.listCcEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
controller.ccAddressExpandMode.value = ExpandMode.EXPAND;
|
controller.ccAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
case PrefixEmailAddress.bcc:
|
case FilterField.bcc:
|
||||||
controller.listBccEmailAddress.remove(draggableEmailAddress.emailAddress);
|
controller.listBccEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
controller.bccAddressExpandMode.value = ExpandMode.EXPAND;
|
controller.bccAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
case PrefixEmailAddress.replyTo:
|
case FilterField.replyTo:
|
||||||
controller.listReplyToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
controller.listReplyToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
controller.replyToAddressExpandMode.value = ExpandMode.EXPAND;
|
controller.replyToAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
import 'package:model/email/prefix_email_address.dart';
|
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
|
||||||
|
|
||||||
class DraggableEmailAddress with EquatableMixin {
|
class DraggableEmailAddress with EquatableMixin {
|
||||||
final EmailAddress emailAddress;
|
final EmailAddress emailAddress;
|
||||||
final PrefixEmailAddress prefix;
|
final FilterField filterField;
|
||||||
final String? composerId;
|
final String? composerId;
|
||||||
|
|
||||||
DraggableEmailAddress({
|
DraggableEmailAddress({
|
||||||
required this.emailAddress,
|
required this.emailAddress,
|
||||||
required this.prefix,
|
required this.filterField,
|
||||||
this.composerId,
|
this.composerId,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [emailAddress, prefix, composerId];
|
List<Object?> get props => [emailAddress, filterField, composerId];
|
||||||
}
|
}
|
||||||
@@ -594,7 +594,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
|
|||||||
) {
|
) {
|
||||||
log('_RecipientComposerWidgetState::_handleAcceptDraggableEmailAddressAction: $draggableEmailAddress');
|
log('_RecipientComposerWidgetState::_handleAcceptDraggableEmailAddressAction: $draggableEmailAddress');
|
||||||
if (draggableEmailAddress.composerId == widget.composerId) {
|
if (draggableEmailAddress.composerId == widget.composerId) {
|
||||||
if (draggableEmailAddress.prefix != widget.prefix) {
|
if (draggableEmailAddress.filterField != widget.prefix.filterField) {
|
||||||
if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) {
|
if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) {
|
||||||
stateSetter(() {
|
stateSetter(() {
|
||||||
_currentListEmailAddress.add(draggableEmailAddress.emailAddress);
|
_currentListEmailAddress.add(draggableEmailAddress.emailAddress);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
|||||||
import 'package:model/email/prefix_email_address.dart';
|
import 'package:model/email/prefix_email_address.dart';
|
||||||
import 'package:model/extensions/email_address_extension.dart';
|
import 'package:model/extensions/email_address_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/card_with_smart_interaction_overlay_view.dart';
|
import 'package:tmail_ui_user/features/base/widget/card_with_smart_interaction_overlay_view.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/email_address_action_type.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/email_address_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/styles/recipient_tag_item_widget_style.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/styles/recipient_tag_item_widget_style.dart';
|
||||||
@@ -137,7 +138,7 @@ class RecipientTagItemWidget extends StatelessWidget {
|
|||||||
tagWidget = Draggable<DraggableEmailAddress>(
|
tagWidget = Draggable<DraggableEmailAddress>(
|
||||||
data: DraggableEmailAddress(
|
data: DraggableEmailAddress(
|
||||||
emailAddress: currentEmailAddress,
|
emailAddress: currentEmailAddress,
|
||||||
prefix: prefix,
|
filterField: prefix.filterField,
|
||||||
composerId: composerId,
|
composerId: composerId,
|
||||||
),
|
),
|
||||||
feedback: DraggableRecipientTagWidget(emailAddress: currentEmailAddress),
|
feedback: DraggableRecipientTagWidget(emailAddress: currentEmailAddress),
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
|
||||||
import 'package:core/presentation/utils/theme_utils.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_time_type.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|
||||||
|
|
||||||
enum EmailRecoveryField {
|
|
||||||
deletionDate,
|
|
||||||
receptionDate,
|
|
||||||
subject,
|
|
||||||
recipients,
|
|
||||||
sender;
|
|
||||||
|
|
||||||
String getTitle(BuildContext context) {
|
|
||||||
switch (this) {
|
|
||||||
case EmailRecoveryField.deletionDate:
|
|
||||||
return AppLocalizations.of(context).deletionDate;
|
|
||||||
case EmailRecoveryField.receptionDate:
|
|
||||||
return AppLocalizations.of(context).receptionDate;
|
|
||||||
case EmailRecoveryField.subject:
|
|
||||||
return AppLocalizations.of(context).subject;
|
|
||||||
case EmailRecoveryField.recipients:
|
|
||||||
return AppLocalizations.of(context).headerRecipients;
|
|
||||||
case EmailRecoveryField.sender:
|
|
||||||
return AppLocalizations.of(context).sender;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String getHintText(BuildContext context) {
|
|
||||||
switch (this) {
|
|
||||||
case EmailRecoveryField.deletionDate:
|
|
||||||
return AppLocalizations.of(context).last7Days;
|
|
||||||
case EmailRecoveryField.receptionDate:
|
|
||||||
return AppLocalizations.of(context).allTime;
|
|
||||||
case EmailRecoveryField.subject:
|
|
||||||
return AppLocalizations.of(context).enterSomeSuggestions;
|
|
||||||
case EmailRecoveryField.recipients:
|
|
||||||
return AppLocalizations.of(context).addRecipientButton;
|
|
||||||
case EmailRecoveryField.sender:
|
|
||||||
return AppLocalizations.of(context).addSender;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<EmailRecoveryTimeType> getSupportedTimeTypes(DateTime restorationHorizon) {
|
|
||||||
switch (this) {
|
|
||||||
case EmailRecoveryField.deletionDate:
|
|
||||||
final supportedTypes = [
|
|
||||||
EmailRecoveryTimeType.last7Days,
|
|
||||||
EmailRecoveryTimeType.last15Days,
|
|
||||||
EmailRecoveryTimeType.last30Days,
|
|
||||||
EmailRecoveryTimeType.last6Months,
|
|
||||||
EmailRecoveryTimeType.last1Year,
|
|
||||||
].where((type) => restorationHorizon
|
|
||||||
.subtract(const Duration(seconds: 2)) // to allow "15 days" if restorationHorizon is exactly 15
|
|
||||||
.isBefore(type.toOldestUTCDate()!.value)).toList();
|
|
||||||
|
|
||||||
return [...supportedTypes, EmailRecoveryTimeType.customRange];
|
|
||||||
case EmailRecoveryField.receptionDate:
|
|
||||||
return [
|
|
||||||
EmailRecoveryTimeType.allTime,
|
|
||||||
EmailRecoveryTimeType.last7Days,
|
|
||||||
EmailRecoveryTimeType.last30Days,
|
|
||||||
EmailRecoveryTimeType.last6Months,
|
|
||||||
EmailRecoveryTimeType.lastYear,
|
|
||||||
EmailRecoveryTimeType.customRange,
|
|
||||||
];
|
|
||||||
default:
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextStyle getTitleTextStyle() {
|
|
||||||
return ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 14,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
color: AppColor.colorContentEmail,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextStyle getHintTextStyle() {
|
|
||||||
final Color color;
|
|
||||||
switch (this) {
|
|
||||||
case EmailRecoveryField.deletionDate:
|
|
||||||
case EmailRecoveryField.receptionDate:
|
|
||||||
color = Colors.black;
|
|
||||||
break;
|
|
||||||
case EmailRecoveryField.subject:
|
|
||||||
case EmailRecoveryField.recipients:
|
|
||||||
case EmailRecoveryField.sender:
|
|
||||||
color = AppColor.colorHintSearchBar;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 16,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
color: color,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|
||||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
|
||||||
|
|
||||||
enum EmailRecoveryTimeType {
|
|
||||||
allTime,
|
|
||||||
last7Days,
|
|
||||||
last15Days,
|
|
||||||
last30Days,
|
|
||||||
last6Months,
|
|
||||||
last1Year,
|
|
||||||
lastYear,
|
|
||||||
customRange;
|
|
||||||
|
|
||||||
String getTitle(BuildContext context, {DateTime? startDate, DateTime? endDate}) {
|
|
||||||
switch(this) {
|
|
||||||
case EmailRecoveryTimeType.allTime:
|
|
||||||
return AppLocalizations.of(context).allTime;
|
|
||||||
case EmailRecoveryTimeType.last7Days:
|
|
||||||
return AppLocalizations.of(context).last7Days;
|
|
||||||
case EmailRecoveryTimeType.last15Days:
|
|
||||||
return AppLocalizations.of(context).last15Days;
|
|
||||||
case EmailRecoveryTimeType.last30Days:
|
|
||||||
return AppLocalizations.of(context).last30Days;
|
|
||||||
case EmailRecoveryTimeType.last6Months:
|
|
||||||
return AppLocalizations.of(context).last6Months;
|
|
||||||
case EmailRecoveryTimeType.last1Year:
|
|
||||||
return AppLocalizations.of(context).last1Year;
|
|
||||||
case EmailRecoveryTimeType.lastYear:
|
|
||||||
return AppLocalizations.of(context).lastYears;
|
|
||||||
case EmailRecoveryTimeType.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UTCDate? toOldestUTCDate() {
|
|
||||||
switch(this) {
|
|
||||||
case EmailRecoveryTimeType.last7Days:
|
|
||||||
final today = DateTime.now();
|
|
||||||
final last7Days = today.subtract(const Duration(days: 7));
|
|
||||||
return last7Days.toUTCDate();
|
|
||||||
case EmailRecoveryTimeType.last15Days:
|
|
||||||
final today = DateTime.now();
|
|
||||||
final last15Days = today.subtract(const Duration(days: 15));
|
|
||||||
return last15Days.toUTCDate();
|
|
||||||
case EmailRecoveryTimeType.last30Days:
|
|
||||||
final today = DateTime.now();
|
|
||||||
final last30Days = today.subtract(const Duration(days: 30));
|
|
||||||
return last30Days.toUTCDate();
|
|
||||||
case EmailRecoveryTimeType.last6Months:
|
|
||||||
final today = DateTime.now();
|
|
||||||
final last6months = DateTime(today.year, today.month - 6, today.day);
|
|
||||||
return last6months.toUTCDate();
|
|
||||||
case EmailRecoveryTimeType.last1Year:
|
|
||||||
case EmailRecoveryTimeType.lastYear:
|
|
||||||
final today = DateTime.now();
|
|
||||||
final lastYear = DateTime(today.year - 1, today.month, today.day);
|
|
||||||
return lastYear.toUTCDate();
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UTCDate? toLatestUTCDate() {
|
|
||||||
switch(this) {
|
|
||||||
case EmailRecoveryTimeType.last7Days:
|
|
||||||
case EmailRecoveryTimeType.last15Days:
|
|
||||||
case EmailRecoveryTimeType.last30Days:
|
|
||||||
case EmailRecoveryTimeType.last6Months:
|
|
||||||
case EmailRecoveryTimeType.last1Year:
|
|
||||||
case EmailRecoveryTimeType.lastYear:
|
|
||||||
final today = DateTime.now();
|
|
||||||
return today.toUTCDate();
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UTCDate? getAfterDate(UTCDate? startDate) {
|
|
||||||
if (startDate != null) {
|
|
||||||
return startDate;
|
|
||||||
} else {
|
|
||||||
return toOldestUTCDate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UTCDate? getBeforeDate(UTCDate? endDate) {
|
|
||||||
if (endDate != null) {
|
|
||||||
return endDate;
|
|
||||||
} else {
|
|
||||||
return toLatestUTCDate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+14
-14
@@ -18,7 +18,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/das
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/input_field_focus_manager.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/input_field_focus_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search;
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
|
import 'package:tmail_ui_user/features/base/model/filter_filter.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_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/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
||||||
@@ -359,14 +359,14 @@ class AdvancedFilterController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void showFullEmailAddress(AdvancedSearchFilterField field) {
|
void showFullEmailAddress(FilterField field) {
|
||||||
FocusManager.instance.primaryFocus?.unfocus();
|
FocusManager.instance.primaryFocus?.unfocus();
|
||||||
|
|
||||||
switch(field) {
|
switch(field) {
|
||||||
case AdvancedSearchFilterField.from:
|
case FilterField.from:
|
||||||
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
fromAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
case AdvancedSearchFilterField.to:
|
case FilterField.to:
|
||||||
toAddressExpandMode.value = ExpandMode.EXPAND;
|
toAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -375,18 +375,18 @@ class AdvancedFilterController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateListEmailAddress(
|
void updateListEmailAddress(
|
||||||
AdvancedSearchFilterField field,
|
FilterField field,
|
||||||
List<EmailAddress> listEmailAddress,
|
List<EmailAddress> listEmailAddress,
|
||||||
) {
|
) {
|
||||||
switch(field) {
|
switch(field) {
|
||||||
case AdvancedSearchFilterField.from:
|
case FilterField.from:
|
||||||
listFromEmailAddress = List.from(listEmailAddress);
|
listFromEmailAddress = List.from(listEmailAddress);
|
||||||
_updateMemorySearchFilter(
|
_updateMemorySearchFilter(
|
||||||
fromOption: option(
|
fromOption: option(
|
||||||
listFromEmailAddress.isNotEmpty,
|
listFromEmailAddress.isNotEmpty,
|
||||||
listFromEmailAddress.asSetAddress()));
|
listFromEmailAddress.asSetAddress()));
|
||||||
break;
|
break;
|
||||||
case AdvancedSearchFilterField.to:
|
case FilterField.to:
|
||||||
listToEmailAddress = List.from(listEmailAddress);
|
listToEmailAddress = List.from(listEmailAddress);
|
||||||
_updateMemorySearchFilter(
|
_updateMemorySearchFilter(
|
||||||
toOption: option(
|
toOption: option(
|
||||||
@@ -526,19 +526,19 @@ class AdvancedFilterController extends BaseController {
|
|||||||
_updateMemorySearchFilter(hasAttachmentOption: Some(hasAttachment.value));
|
_updateMemorySearchFilter(hasAttachmentOption: Some(hasAttachment.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
void onTextChanged(AdvancedSearchFilterField filterField, String value) {
|
void onTextChanged(FilterField filterField, String value) {
|
||||||
switch (filterField) {
|
switch (filterField) {
|
||||||
case AdvancedSearchFilterField.subject:
|
case FilterField.subject:
|
||||||
final subjectOption = option(value.trim().isNotEmpty, value.trim());
|
final subjectOption = option(value.trim().isNotEmpty, value.trim());
|
||||||
_updateMemorySearchFilter(subjectOption: subjectOption);
|
_updateMemorySearchFilter(subjectOption: subjectOption);
|
||||||
break;
|
break;
|
||||||
case AdvancedSearchFilterField.hasKeyword:
|
case FilterField.hasKeyword:
|
||||||
final textOption = option(
|
final textOption = option(
|
||||||
value.trim().isNotEmpty,
|
value.trim().isNotEmpty,
|
||||||
SearchQuery(value.trim()));
|
SearchQuery(value.trim()));
|
||||||
_updateMemorySearchFilter(textOption: textOption);
|
_updateMemorySearchFilter(textOption: textOption);
|
||||||
break;
|
break;
|
||||||
case AdvancedSearchFilterField.notKeyword:
|
case FilterField.notKeyword:
|
||||||
final notKeywordsOption = option(
|
final notKeywordsOption = option(
|
||||||
value.trim().isNotEmpty,
|
value.trim().isNotEmpty,
|
||||||
value.trim().split(',').map((value) => value.trim()).toSet());
|
value.trim().split(',').map((value) => value.trim()).toSet());
|
||||||
@@ -551,8 +551,8 @@ class AdvancedFilterController extends BaseController {
|
|||||||
|
|
||||||
void removeDraggableEmailAddress(DraggableEmailAddress draggableEmailAddress) {
|
void removeDraggableEmailAddress(DraggableEmailAddress draggableEmailAddress) {
|
||||||
log('AdvancedFilterController::removeDraggableEmailAddress:removeDraggableEmailAddress: $draggableEmailAddress');
|
log('AdvancedFilterController::removeDraggableEmailAddress:removeDraggableEmailAddress: $draggableEmailAddress');
|
||||||
switch(draggableEmailAddress.prefix) {
|
switch(draggableEmailAddress.filterField) {
|
||||||
case PrefixEmailAddress.to:
|
case FilterField.to:
|
||||||
listToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
listToEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
_updateMemorySearchFilter(
|
_updateMemorySearchFilter(
|
||||||
toOption: option(
|
toOption: option(
|
||||||
@@ -563,7 +563,7 @@ class AdvancedFilterController extends BaseController {
|
|||||||
toAddressExpandMode.value = ExpandMode.EXPAND;
|
toAddressExpandMode.value = ExpandMode.EXPAND;
|
||||||
toAddressExpandMode.refresh();
|
toAddressExpandMode.refresh();
|
||||||
break;
|
break;
|
||||||
case PrefixEmailAddress.from:
|
case FilterField.from:
|
||||||
listFromEmailAddress.remove(draggableEmailAddress.emailAddress);
|
listFromEmailAddress.remove(draggableEmailAddress.emailAddress);
|
||||||
_updateMemorySearchFilter(
|
_updateMemorySearchFilter(
|
||||||
fromOption: option(
|
fromOption: option(
|
||||||
|
|||||||
@@ -818,7 +818,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _openPopupMenuDateFilter(BuildContext context, RelativeRect position) {
|
void _openPopupMenuDateFilter(BuildContext context, RelativeRect position) {
|
||||||
final popupMenuItems = EmailReceiveTimeType.values.map((timeType) {
|
final popupMenuItems = EmailReceiveTimeType.valuesForSearch.map((timeType) {
|
||||||
return PopupMenuItem(
|
return PopupMenuItem(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
child: PopupMenuItemActionWidget(
|
child: PopupMenuItemActionWidget(
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
import 'package:core/core.dart';
|
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:model/email/prefix_email_address.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|
||||||
|
|
||||||
enum AdvancedSearchFilterField {
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
subject,
|
|
||||||
hasKeyword,
|
|
||||||
notKeyword,
|
|
||||||
mailBox,
|
|
||||||
date,
|
|
||||||
sortBy,
|
|
||||||
hasAttachment;
|
|
||||||
|
|
||||||
String getTitle(BuildContext context) {
|
|
||||||
switch (this) {
|
|
||||||
case AdvancedSearchFilterField.from:
|
|
||||||
return AppLocalizations.of(context).from_email_address_prefix;
|
|
||||||
case AdvancedSearchFilterField.to:
|
|
||||||
return AppLocalizations.of(context).to_email_address_prefix;
|
|
||||||
case AdvancedSearchFilterField.subject:
|
|
||||||
return AppLocalizations.of(context).subject;
|
|
||||||
case AdvancedSearchFilterField.hasKeyword:
|
|
||||||
return AppLocalizations.of(context).hasTheWords;
|
|
||||||
case AdvancedSearchFilterField.notKeyword:
|
|
||||||
return AppLocalizations.of(context).doesNotHave;
|
|
||||||
case AdvancedSearchFilterField.mailBox:
|
|
||||||
return AppLocalizations.of(context).folder;
|
|
||||||
case AdvancedSearchFilterField.date:
|
|
||||||
return AppLocalizations.of(context).date;
|
|
||||||
case AdvancedSearchFilterField.sortBy:
|
|
||||||
return AppLocalizations.of(context).sortBy;
|
|
||||||
case AdvancedSearchFilterField.hasAttachment:
|
|
||||||
return AppLocalizations.of(context).hasAttachment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String getHintText(BuildContext context) {
|
|
||||||
switch (this) {
|
|
||||||
case AdvancedSearchFilterField.from:
|
|
||||||
case AdvancedSearchFilterField.to:
|
|
||||||
return AppLocalizations.of(context).nameOrEmailAddress;
|
|
||||||
case AdvancedSearchFilterField.subject:
|
|
||||||
return AppLocalizations.of(context).enterASubject;
|
|
||||||
case AdvancedSearchFilterField.hasKeyword:
|
|
||||||
case AdvancedSearchFilterField.notKeyword:
|
|
||||||
return AppLocalizations.of(context).enterSomeSuggestions;
|
|
||||||
case AdvancedSearchFilterField.mailBox:
|
|
||||||
return AppLocalizations.of(context).allFolders;
|
|
||||||
case AdvancedSearchFilterField.date:
|
|
||||||
return AppLocalizations.of(context).allTime;
|
|
||||||
case AdvancedSearchFilterField.sortBy:
|
|
||||||
return AppLocalizations.of(context).mostRecent;
|
|
||||||
case AdvancedSearchFilterField.hasAttachment:
|
|
||||||
return AppLocalizations.of(context).hasAttachment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextStyle getTitleTextStyle() {
|
|
||||||
return ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 14,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
color: AppColor.colorContentEmail);
|
|
||||||
}
|
|
||||||
|
|
||||||
PrefixEmailAddress getPrefixEmailAddress() {
|
|
||||||
switch (this) {
|
|
||||||
case AdvancedSearchFilterField.from:
|
|
||||||
return PrefixEmailAddress.from;
|
|
||||||
case AdvancedSearchFilterField.to:
|
|
||||||
return PrefixEmailAddress.to;
|
|
||||||
default:
|
|
||||||
return PrefixEmailAddress.cc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextStyle getHintTextStyle() {
|
|
||||||
return ThemeUtils.defaultTextStyleInterFont.copyWith(
|
|
||||||
fontSize: 16,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
color: AppColor.colorHintSearchBar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -7,11 +7,39 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
|||||||
enum EmailReceiveTimeType {
|
enum EmailReceiveTimeType {
|
||||||
allTime,
|
allTime,
|
||||||
last7Days,
|
last7Days,
|
||||||
|
last15Days,
|
||||||
last30Days,
|
last30Days,
|
||||||
last6Months,
|
last6Months,
|
||||||
|
last1Year,
|
||||||
lastYear,
|
lastYear,
|
||||||
customRange;
|
customRange;
|
||||||
|
|
||||||
|
static List<EmailReceiveTimeType> get valuesForSearch => [
|
||||||
|
allTime,
|
||||||
|
last7Days,
|
||||||
|
last30Days,
|
||||||
|
last6Months,
|
||||||
|
lastYear,
|
||||||
|
customRange,
|
||||||
|
];
|
||||||
|
|
||||||
|
static List<EmailReceiveTimeType> get valuesForRecoverDeletionDateField => [
|
||||||
|
last7Days,
|
||||||
|
last15Days,
|
||||||
|
last30Days,
|
||||||
|
last6Months,
|
||||||
|
last1Year,
|
||||||
|
];
|
||||||
|
|
||||||
|
static List<EmailReceiveTimeType> get valuesForRecoverReceptionDateDateField => [
|
||||||
|
allTime,
|
||||||
|
last7Days,
|
||||||
|
last30Days,
|
||||||
|
last6Months,
|
||||||
|
lastYear,
|
||||||
|
customRange,
|
||||||
|
];
|
||||||
|
|
||||||
String getTitle(BuildContext context, {DateTime? startDate, DateTime? endDate}) {
|
String getTitle(BuildContext context, {DateTime? startDate, DateTime? endDate}) {
|
||||||
return getTitleByAppLocalizations(
|
return getTitleByAppLocalizations(
|
||||||
AppLocalizations.of(context),
|
AppLocalizations.of(context),
|
||||||
@@ -32,10 +60,14 @@ enum EmailReceiveTimeType {
|
|||||||
return appLocalizations.allTime;
|
return appLocalizations.allTime;
|
||||||
case EmailReceiveTimeType.last7Days:
|
case EmailReceiveTimeType.last7Days:
|
||||||
return appLocalizations.last7Days;
|
return appLocalizations.last7Days;
|
||||||
|
case EmailReceiveTimeType.last15Days:
|
||||||
|
return appLocalizations.last15Days;
|
||||||
case EmailReceiveTimeType.last30Days:
|
case EmailReceiveTimeType.last30Days:
|
||||||
return appLocalizations.last30Days;
|
return appLocalizations.last30Days;
|
||||||
case EmailReceiveTimeType.last6Months:
|
case EmailReceiveTimeType.last6Months:
|
||||||
return appLocalizations.last6Months;
|
return appLocalizations.last6Months;
|
||||||
|
case EmailReceiveTimeType.last1Year:
|
||||||
|
return appLocalizations.last1Year;
|
||||||
case EmailReceiveTimeType.lastYear:
|
case EmailReceiveTimeType.lastYear:
|
||||||
return appLocalizations.lastYears;
|
return appLocalizations.lastYears;
|
||||||
case EmailReceiveTimeType.customRange:
|
case EmailReceiveTimeType.customRange:
|
||||||
@@ -58,6 +90,10 @@ enum EmailReceiveTimeType {
|
|||||||
final today = DateTime.now();
|
final today = DateTime.now();
|
||||||
final last7Days = today.subtract(const Duration(days: 7));
|
final last7Days = today.subtract(const Duration(days: 7));
|
||||||
return last7Days.toUTCDate();
|
return last7Days.toUTCDate();
|
||||||
|
case EmailReceiveTimeType.last15Days:
|
||||||
|
final today = DateTime.now();
|
||||||
|
final last15Days = today.subtract(const Duration(days: 15));
|
||||||
|
return last15Days.toUTCDate();
|
||||||
case EmailReceiveTimeType.last30Days:
|
case EmailReceiveTimeType.last30Days:
|
||||||
final today = DateTime.now();
|
final today = DateTime.now();
|
||||||
final last30Days = today.subtract(const Duration(days: 30));
|
final last30Days = today.subtract(const Duration(days: 30));
|
||||||
@@ -66,6 +102,7 @@ enum EmailReceiveTimeType {
|
|||||||
final today = DateTime.now();
|
final today = DateTime.now();
|
||||||
final last6months = DateTime(today.year, today.month - 6, today.day);
|
final last6months = DateTime(today.year, today.month - 6, today.day);
|
||||||
return last6months.toUTCDate();
|
return last6months.toUTCDate();
|
||||||
|
case EmailReceiveTimeType.last1Year:
|
||||||
case EmailReceiveTimeType.lastYear:
|
case EmailReceiveTimeType.lastYear:
|
||||||
final today = DateTime.now();
|
final today = DateTime.now();
|
||||||
final lastYear = DateTime(today.year - 1, today.month, today.day);
|
final lastYear = DateTime(today.year - 1, today.month, today.day);
|
||||||
@@ -78,8 +115,10 @@ enum EmailReceiveTimeType {
|
|||||||
UTCDate? toLatestUTCDate() {
|
UTCDate? toLatestUTCDate() {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case EmailReceiveTimeType.last7Days:
|
case EmailReceiveTimeType.last7Days:
|
||||||
|
case EmailReceiveTimeType.last15Days:
|
||||||
case EmailReceiveTimeType.last30Days:
|
case EmailReceiveTimeType.last30Days:
|
||||||
case EmailReceiveTimeType.last6Months:
|
case EmailReceiveTimeType.last6Months:
|
||||||
|
case EmailReceiveTimeType.last1Year:
|
||||||
case EmailReceiveTimeType.lastYear:
|
case EmailReceiveTimeType.lastYear:
|
||||||
return DateTime.now().toUTCDate();
|
return DateTime.now().toUTCDate();
|
||||||
default:
|
default:
|
||||||
|
|||||||
+35
-33
@@ -6,11 +6,11 @@ import 'package:get/get.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart';
|
import 'package:tmail_ui_user/features/base/widget/popup_item_no_icon_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
|
import 'package:tmail_ui_user/features/base/model/filter_filter.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_receive_time_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/advanced_search_input_form_style.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/advanced_search_input_form_style.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/date_drop_down_button.dart';
|
import 'package:tmail_ui_user/features/base/widget/default_field/date_drop_down_button.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/label_advanced_search_field_widget.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/label_advanced_search_field_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/sort_by_drop_down_button.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart';
|
||||||
@@ -29,7 +29,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Obx(() => TextFieldAutocompleteEmailAddressWeb(
|
Obx(() => TextFieldAutocompleteEmailAddressWeb(
|
||||||
field: AdvancedSearchFilterField.from,
|
field: FilterField.from,
|
||||||
listEmailAddress: controller.listFromEmailAddress,
|
listEmailAddress: controller.listFromEmailAddress,
|
||||||
expandMode: controller.fromAddressExpandMode.value,
|
expandMode: controller.fromAddressExpandMode.value,
|
||||||
minInputLengthAutocomplete: controller
|
minInputLengthAutocomplete: controller
|
||||||
@@ -47,7 +47,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
)),
|
)),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
Obx(() => TextFieldAutocompleteEmailAddressWeb(
|
Obx(() => TextFieldAutocompleteEmailAddressWeb(
|
||||||
field: AdvancedSearchFilterField.to,
|
field: FilterField.to,
|
||||||
listEmailAddress: controller.listToEmailAddress,
|
listEmailAddress: controller.listToEmailAddress,
|
||||||
expandMode: controller.toAddressExpandMode.value,
|
expandMode: controller.toAddressExpandMode.value,
|
||||||
minInputLengthAutocomplete: controller
|
minInputLengthAutocomplete: controller
|
||||||
@@ -67,11 +67,11 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
textEditingController: controller.subjectFilterInputController,
|
textEditingController: controller.subjectFilterInputController,
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.subject,
|
filterField: FilterField.subject,
|
||||||
currentFocusNode: controller.focusManager.subjectFieldFocusNode,
|
currentFocusNode: controller.focusManager.subjectFieldFocusNode,
|
||||||
nextFocusNode: controller.focusManager.hasKeywordFieldFocusNode,
|
nextFocusNode: controller.focusManager.hasKeywordFieldFocusNode,
|
||||||
onTextChange: (value) => controller.onTextChanged(
|
onTextChange: (value) => controller.onTextChanged(
|
||||||
AdvancedSearchFilterField.subject,
|
FilterField.subject,
|
||||||
value
|
value
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -79,11 +79,11 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
textEditingController: controller.hasKeyWordFilterInputController,
|
textEditingController: controller.hasKeyWordFilterInputController,
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.hasKeyword,
|
filterField: FilterField.hasKeyword,
|
||||||
currentFocusNode: controller.focusManager.hasKeywordFieldFocusNode,
|
currentFocusNode: controller.focusManager.hasKeywordFieldFocusNode,
|
||||||
nextFocusNode: controller.focusManager.notKeywordFieldFocusNode,
|
nextFocusNode: controller.focusManager.notKeywordFieldFocusNode,
|
||||||
onTextChange: (value) => controller.onTextChanged(
|
onTextChange: (value) => controller.onTextChanged(
|
||||||
AdvancedSearchFilterField.hasKeyword,
|
FilterField.hasKeyword,
|
||||||
value
|
value
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -91,11 +91,11 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
textEditingController: controller.notKeyWordFilterInputController,
|
textEditingController: controller.notKeyWordFilterInputController,
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.notKeyword,
|
filterField: FilterField.notKeyword,
|
||||||
currentFocusNode: controller.focusManager.notKeywordFieldFocusNode,
|
currentFocusNode: controller.focusManager.notKeywordFieldFocusNode,
|
||||||
nextFocusNode: controller.focusManager.mailboxFieldFocusNode,
|
nextFocusNode: controller.focusManager.mailboxFieldFocusNode,
|
||||||
onTextChange: (value) => controller.onTextChanged(
|
onTextChange: (value) => controller.onTextChanged(
|
||||||
AdvancedSearchFilterField.notKeyword,
|
FilterField.notKeyword,
|
||||||
value
|
value
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -103,7 +103,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
textEditingController: controller.mailBoxFilterInputController,
|
textEditingController: controller.mailBoxFilterInputController,
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.mailBox,
|
filterField: FilterField.mailBox,
|
||||||
isSelectFormList: true,
|
isSelectFormList: true,
|
||||||
currentFocusNode: controller.focusManager.mailboxFieldFocusNode,
|
currentFocusNode: controller.focusManager.mailboxFieldFocusNode,
|
||||||
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||||
@@ -114,7 +114,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
Row(children: [
|
Row(children: [
|
||||||
Expanded(child: _buildFilterField(
|
Expanded(child: _buildFilterField(
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.date,
|
filterField: FilterField.date,
|
||||||
isSelectFormList: true,
|
isSelectFormList: true,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
openContextMenuAction(
|
openContextMenuAction(
|
||||||
@@ -151,7 +151,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
_buildFilterField(
|
_buildFilterField(
|
||||||
context: context,
|
context: context,
|
||||||
advancedSearchFilterField: AdvancedSearchFilterField.sortBy
|
filterField: FilterField.sortBy
|
||||||
),
|
),
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 24),
|
||||||
AdvancedSearchFilterFormBottomView(focusManager: controller.focusManager)
|
AdvancedSearchFilterFormBottomView(focusManager: controller.focusManager)
|
||||||
@@ -161,7 +161,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Widget> _buildEmailReceiveTimeTypeActionTiles(BuildContext context) {
|
List<Widget> _buildEmailReceiveTimeTypeActionTiles(BuildContext context) {
|
||||||
return EmailReceiveTimeType.values
|
return EmailReceiveTimeType.valuesForSearch
|
||||||
.map((receiveTime) => PopupMenuItem(
|
.map((receiveTime) => PopupMenuItem(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
child: PopupItemNoIconWidget(
|
child: PopupItemNoIconWidget(
|
||||||
@@ -176,7 +176,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
|
|
||||||
Widget _buildFilterField({
|
Widget _buildFilterField({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required AdvancedSearchFilterField advancedSearchFilterField,
|
required FilterField filterField,
|
||||||
TextEditingController? textEditingController,
|
TextEditingController? textEditingController,
|
||||||
VoidCallback? onTap,
|
VoidCallback? onTap,
|
||||||
bool isSelectFormList = false,
|
bool isSelectFormList = false,
|
||||||
@@ -189,7 +189,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: _isVerticalArrange(context) ? null : 112,
|
width: _isVerticalArrange(context) ? null : 112,
|
||||||
child: LabelAdvancedSearchFieldWidget(
|
child: LabelAdvancedSearchFieldWidget(
|
||||||
name: advancedSearchFilterField.getTitle(context),
|
name: filterField.getTitle(AppLocalizations.of(context)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (_isVerticalArrange(context))
|
if (_isVerticalArrange(context))
|
||||||
@@ -204,20 +204,21 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
mouseCursor: mouseCursor,
|
mouseCursor: mouseCursor,
|
||||||
currentFocusNode: currentFocusNode,
|
currentFocusNode: currentFocusNode,
|
||||||
nextFocusNode: nextFocusNode,
|
nextFocusNode: nextFocusNode,
|
||||||
advancedSearchFilterField: advancedSearchFilterField,
|
filterField: filterField,
|
||||||
textEditingController: textEditingController,
|
textEditingController: textEditingController,
|
||||||
onTextChange: onTextChange,
|
onTextChange: onTextChange,
|
||||||
)
|
)
|
||||||
else if (controller.responsiveUtils.landscapeTabletSupported(context))
|
else if (controller.responsiveUtils.landscapeTabletSupported(context))
|
||||||
if (advancedSearchFilterField == AdvancedSearchFilterField.date)
|
if (filterField == FilterField.date)
|
||||||
Obx(() => DateDropDownButton(
|
Obx(() => DateDropDownButton(
|
||||||
controller.imagePaths,
|
imagePaths: controller.imagePaths,
|
||||||
|
receiveTimeTypes: EmailReceiveTimeType.valuesForSearch,
|
||||||
startDate: controller.startDate.value,
|
startDate: controller.startDate.value,
|
||||||
endDate: controller.endDate.value,
|
endDate: controller.endDate.value,
|
||||||
receiveTimeSelected: controller.receiveTimeType.value,
|
receiveTimeTypeSelected: controller.receiveTimeType.value,
|
||||||
onReceiveTimeSelected: (receiveTime) => controller.updateReceiveDateSearchFilter(context, receiveTime),
|
onReceiveTimeSelected: (receiveTime) => controller.updateReceiveDateSearchFilter(context, receiveTime),
|
||||||
))
|
))
|
||||||
else if (advancedSearchFilterField == AdvancedSearchFilterField.sortBy)
|
else if (filterField == FilterField.sortBy)
|
||||||
Obx(() => SortByDropDownButton(
|
Obx(() => SortByDropDownButton(
|
||||||
imagePaths: controller.imagePaths,
|
imagePaths: controller.imagePaths,
|
||||||
sortOrderSelected: controller.sortOrderType.value,
|
sortOrderSelected: controller.sortOrderType.value,
|
||||||
@@ -231,7 +232,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
mouseCursor: mouseCursor,
|
mouseCursor: mouseCursor,
|
||||||
currentFocusNode: currentFocusNode,
|
currentFocusNode: currentFocusNode,
|
||||||
nextFocusNode: nextFocusNode,
|
nextFocusNode: nextFocusNode,
|
||||||
advancedSearchFilterField: advancedSearchFilterField,
|
filterField: filterField,
|
||||||
textEditingController: textEditingController,
|
textEditingController: textEditingController,
|
||||||
onTextChange: onTextChange,
|
onTextChange: onTextChange,
|
||||||
)
|
)
|
||||||
@@ -244,7 +245,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
mouseCursor: mouseCursor,
|
mouseCursor: mouseCursor,
|
||||||
currentFocusNode: currentFocusNode,
|
currentFocusNode: currentFocusNode,
|
||||||
nextFocusNode: nextFocusNode,
|
nextFocusNode: nextFocusNode,
|
||||||
advancedSearchFilterField: advancedSearchFilterField,
|
filterField: filterField,
|
||||||
textEditingController: textEditingController,
|
textEditingController: textEditingController,
|
||||||
onTextChange: onTextChange,
|
onTextChange: onTextChange,
|
||||||
),
|
),
|
||||||
@@ -269,7 +270,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
|
|
||||||
Widget _buildTextFieldFilterForWeb({
|
Widget _buildTextFieldFilterForWeb({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required AdvancedSearchFilterField advancedSearchFilterField,
|
required FilterField filterField,
|
||||||
TextEditingController? textEditingController,
|
TextEditingController? textEditingController,
|
||||||
VoidCallback? onTap,
|
VoidCallback? onTap,
|
||||||
bool isSelectFormList = false,
|
bool isSelectFormList = false,
|
||||||
@@ -278,16 +279,17 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
FocusNode? nextFocusNode,
|
FocusNode? nextFocusNode,
|
||||||
ValueChanged<String>? onTextChange,
|
ValueChanged<String>? onTextChange,
|
||||||
}) {
|
}) {
|
||||||
switch (advancedSearchFilterField) {
|
switch (filterField) {
|
||||||
case AdvancedSearchFilterField.date:
|
case FilterField.date:
|
||||||
return Obx(() => DateDropDownButton(
|
return Obx(() => DateDropDownButton(
|
||||||
controller.imagePaths,
|
imagePaths: controller.imagePaths,
|
||||||
|
receiveTimeTypes: EmailReceiveTimeType.valuesForSearch,
|
||||||
startDate: controller.startDate.value,
|
startDate: controller.startDate.value,
|
||||||
endDate: controller.endDate.value,
|
endDate: controller.endDate.value,
|
||||||
receiveTimeSelected: controller.receiveTimeType.value,
|
receiveTimeTypeSelected: controller.receiveTimeType.value,
|
||||||
onReceiveTimeSelected: (receiveTime) => controller.updateReceiveDateSearchFilter(context, receiveTime),
|
onReceiveTimeSelected: (receiveTime) => controller.updateReceiveDateSearchFilter(context, receiveTime),
|
||||||
));
|
));
|
||||||
case AdvancedSearchFilterField.sortBy:
|
case FilterField.sortBy:
|
||||||
return Obx(() => SortByDropDownButton(
|
return Obx(() => SortByDropDownButton(
|
||||||
imagePaths: controller.imagePaths,
|
imagePaths: controller.imagePaths,
|
||||||
sortOrderSelected: controller.sortOrderType.value,
|
sortOrderSelected: controller.sortOrderType.value,
|
||||||
@@ -301,7 +303,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
mouseCursor: mouseCursor,
|
mouseCursor: mouseCursor,
|
||||||
currentFocusNode: currentFocusNode,
|
currentFocusNode: currentFocusNode,
|
||||||
nextFocusNode: nextFocusNode,
|
nextFocusNode: nextFocusNode,
|
||||||
advancedSearchFilterField: advancedSearchFilterField,
|
filterField: filterField,
|
||||||
textEditingController: textEditingController,
|
textEditingController: textEditingController,
|
||||||
onTextChange: onTextChange,
|
onTextChange: onTextChange,
|
||||||
);
|
);
|
||||||
@@ -310,7 +312,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
|
|
||||||
Widget _buildTextField({
|
Widget _buildTextField({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
required AdvancedSearchFilterField advancedSearchFilterField,
|
required FilterField filterField,
|
||||||
TextEditingController? textEditingController,
|
TextEditingController? textEditingController,
|
||||||
VoidCallback? onTap,
|
VoidCallback? onTap,
|
||||||
bool isSelectFormList = false,
|
bool isSelectFormList = false,
|
||||||
@@ -378,9 +380,9 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
|
|||||||
color: AppColor.primaryColor,
|
color: AppColor.primaryColor,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
hintText: advancedSearchFilterField.getHintText(context),
|
hintText: filterField.getHintText(AppLocalizations.of(context)),
|
||||||
hintStyle: ThemeUtils.textStyleBodyBody3(
|
hintStyle: ThemeUtils.textStyleBodyBody3(
|
||||||
color: advancedSearchFilterField == AdvancedSearchFilterField.mailBox
|
color: filterField == FilterField.mailBox
|
||||||
? Colors.black
|
? Colors.black
|
||||||
: AppColor.m3Tertiary,
|
: AppColor.m3Tertiary,
|
||||||
),
|
),
|
||||||
|
|||||||
+12
-10
@@ -13,26 +13,27 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
|||||||
import 'package:model/extensions/email_address_extension.dart';
|
import 'package:model/extensions/email_address_extension.dart';
|
||||||
import 'package:model/mailbox/expand_mode.dart';
|
import 'package:model/mailbox/expand_mode.dart';
|
||||||
import 'package:super_tag_editor/tag_editor.dart';
|
import 'package:super_tag_editor/tag_editor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/widget/default_field/default_autocomplete_tag_item_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/suggestion_email_address.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/suggestion_email_address.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_suggestion_item_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
|
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/advanced_search_input_form_style.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/advanced_search_input_form_style.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/text_field_autocomplete_email_address_web_style.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/text_field_autocomplete_email_address_web_style.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/autocomplete_tag_item_widget_web.dart';
|
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/label_advanced_search_field_widget.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/label_advanced_search_field_widget.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||||
|
|
||||||
typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String word, {int? limit});
|
typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String word, {int? limit});
|
||||||
typedef OnUpdateListEmailAddressAction = void Function(AdvancedSearchFilterField field, List<EmailAddress> newData);
|
typedef OnUpdateListEmailAddressAction = void Function(FilterField field, List<EmailAddress> newData);
|
||||||
typedef OnDeleteEmailAddressTypeAction = void Function(AdvancedSearchFilterField field);
|
typedef OnDeleteEmailAddressTypeAction = void Function(FilterField field);
|
||||||
typedef OnShowFullListEmailAddressAction = void Function(AdvancedSearchFilterField field);
|
typedef OnShowFullListEmailAddressAction = void Function(FilterField field);
|
||||||
typedef OnDeleteTagAction = void Function(EmailAddress emailAddress);
|
typedef OnDeleteTagAction = void Function(EmailAddress emailAddress);
|
||||||
|
|
||||||
class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
class TextFieldAutocompleteEmailAddressWeb extends StatefulWidget {
|
||||||
|
|
||||||
final AdvancedSearchFilterField field;
|
final FilterField field;
|
||||||
final List<EmailAddress> listEmailAddress;
|
final List<EmailAddress> listEmailAddress;
|
||||||
final ExpandMode expandMode;
|
final ExpandMode expandMode;
|
||||||
final FocusNode? focusNode;
|
final FocusNode? focusNode;
|
||||||
@@ -106,7 +107,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: TextFieldAutoCompleteEmailAddressWebStyles.fieldTitleWidth,
|
width: TextFieldAutoCompleteEmailAddressWebStyles.fieldTitleWidth,
|
||||||
child: LabelAdvancedSearchFieldWidget(
|
child: LabelAdvancedSearchFieldWidget(
|
||||||
name: widget.field.getTitle(context),
|
name: widget.field.getTitle(AppLocalizations.of(context)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: TextFieldAutoCompleteEmailAddressWebStyles.space),
|
const SizedBox(width: TextFieldAutoCompleteEmailAddressWebStyles.space),
|
||||||
@@ -147,7 +148,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
),
|
),
|
||||||
fillColor: TextFieldAutoCompleteEmailAddressWebStyles.textInputFillColor,
|
fillColor: TextFieldAutoCompleteEmailAddressWebStyles.textInputFillColor,
|
||||||
border: TextFieldAutoCompleteEmailAddressWebStyles.textInputBorder,
|
border: TextFieldAutoCompleteEmailAddressWebStyles.textInputBorder,
|
||||||
hintText: widget.field.getHintText(context),
|
hintText: widget.field.getHintText(AppLocalizations.of(context)),
|
||||||
hintStyle: TextFieldAutoCompleteEmailAddressWebStyles.textInputHintStyle,
|
hintStyle: TextFieldAutoCompleteEmailAddressWebStyles.textInputHintStyle,
|
||||||
isDense: true,
|
isDense: true,
|
||||||
contentPadding: _currentListEmailAddress.isNotEmpty
|
contentPadding: _currentListEmailAddress.isNotEmpty
|
||||||
@@ -181,7 +182,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
tagBuilder: (context, index) {
|
tagBuilder: (context, index) {
|
||||||
final currentEmailAddress = _currentListEmailAddress.elementAt(index);
|
final currentEmailAddress = _currentListEmailAddress.elementAt(index);
|
||||||
final isLatestEmail = currentEmailAddress == _currentListEmailAddress.last;
|
final isLatestEmail = currentEmailAddress == _currentListEmailAddress.last;
|
||||||
return AutoCompleteTagItemWidgetWeb(
|
return DefaultAutocompleteTagItemWidget(
|
||||||
field: widget.field,
|
field: widget.field,
|
||||||
currentEmailAddress: currentEmailAddress,
|
currentEmailAddress: currentEmailAddress,
|
||||||
currentListEmailAddress: _currentListEmailAddress,
|
currentListEmailAddress: _currentListEmailAddress,
|
||||||
@@ -189,6 +190,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
isLatestEmail: isLatestEmail,
|
isLatestEmail: isLatestEmail,
|
||||||
isCollapsed: _isCollapse,
|
isCollapsed: _isCollapse,
|
||||||
isLatestTagFocused: _lastTagFocused,
|
isLatestTagFocused: _lastTagFocused,
|
||||||
|
iconClose: _imagePaths.icClose,
|
||||||
onDeleteTagAction: (emailAddress) => _handleDeleteTagAction.call(emailAddress, setState),
|
onDeleteTagAction: (emailAddress) => _handleDeleteTagAction.call(emailAddress, setState),
|
||||||
onShowFullAction: widget.onShowFullListEmailAddressAction,
|
onShowFullAction: widget.onShowFullListEmailAddressAction,
|
||||||
);
|
);
|
||||||
@@ -389,7 +391,7 @@ class _TextFieldAutocompleteEmailAddressWebState extends State<TextFieldAutocomp
|
|||||||
StateSetter stateSetter
|
StateSetter stateSetter
|
||||||
) {
|
) {
|
||||||
log('_TextFieldAutocompleteEmailAddressWebState::_handleAcceptDraggableEmailAddressAction:draggableEmailAddress = $draggableEmailAddress');
|
log('_TextFieldAutocompleteEmailAddressWebState::_handleAcceptDraggableEmailAddressAction:draggableEmailAddress = $draggableEmailAddress');
|
||||||
if (draggableEmailAddress.prefix != widget.field.getPrefixEmailAddress()) {
|
if (draggableEmailAddress.filterField != widget.field) {
|
||||||
if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) {
|
if (!_currentListEmailAddress.contains(draggableEmailAddress.emailAddress)) {
|
||||||
stateSetter(() {
|
stateSetter(() {
|
||||||
_currentListEmailAddress.add(draggableEmailAddress.emailAddress);
|
_currentListEmailAddress.add(draggableEmailAddress.emailAddress);
|
||||||
|
|||||||
@@ -346,7 +346,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _openPopupMenuDateFilter(BuildContext context, RelativeRect position) {
|
void _openPopupMenuDateFilter(BuildContext context, RelativeRect position) {
|
||||||
final popupMenuItems = EmailReceiveTimeType.values.map((timeType) {
|
final popupMenuItems = EmailReceiveTimeType.valuesForSearch.map((timeType) {
|
||||||
return PopupMenuItem(
|
return PopupMenuItem(
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
child: PopupMenuItemActionWidget(
|
child: PopupMenuItemActionWidget(
|
||||||
@@ -371,7 +371,7 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _openContextMenuDateFilter(BuildContext context) {
|
void _openContextMenuDateFilter(BuildContext context) {
|
||||||
final contextMenuActions = EmailReceiveTimeType.values.map((timeType) {
|
final contextMenuActions = EmailReceiveTimeType.valuesForSearch.map((timeType) {
|
||||||
return ContextItemReceiveTimeTypeAction(
|
return ContextItemReceiveTimeTypeAction(
|
||||||
timeType,
|
timeType,
|
||||||
controller.emailReceiveTimeType.value,
|
controller.emailReceiveTimeType.value,
|
||||||
|
|||||||
+14
-14
@@ -23,7 +23,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_re
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
|
import 'package:tmail_ui_user/features/base/model/filter_filter.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_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/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
||||||
@@ -225,10 +225,10 @@ void main() {
|
|||||||
group('onTextChanged::test', () {
|
group('onTextChanged::test', () {
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for subject\n'
|
'SHOULD update memory search filter for subject\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField is Subject',
|
'WHEN onTextChanged called with FilterField is Subject',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterField = AdvancedSearchFilterField.subject;
|
const filterField = FilterField.subject;
|
||||||
const value = 'Subject';
|
const value = 'Subject';
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -242,10 +242,10 @@ void main() {
|
|||||||
|
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for text\n'
|
'SHOULD update memory search filter for text\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField is hasKeyword',
|
'WHEN onTextChanged called with FilterField is hasKeyword',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterField = AdvancedSearchFilterField.hasKeyword;
|
const filterField = FilterField.hasKeyword;
|
||||||
const value = 'keyword';
|
const value = 'keyword';
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -259,10 +259,10 @@ void main() {
|
|||||||
|
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for notKeyword\n'
|
'SHOULD update memory search filter for notKeyword\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField is notKeyword',
|
'WHEN onTextChanged called with FilterField is notKeyword',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterField = AdvancedSearchFilterField.notKeyword;
|
const filterField = FilterField.notKeyword;
|
||||||
const value = 'keyword1,keyword2';
|
const value = 'keyword1,keyword2';
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -276,10 +276,10 @@ void main() {
|
|||||||
|
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for subject is null\n'
|
'SHOULD update memory search filter for subject is null\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField is subject',
|
'WHEN onTextChanged called with FilterField is subject',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterField = AdvancedSearchFilterField.subject;
|
const filterField = FilterField.subject;
|
||||||
const value = ' ';
|
const value = ' ';
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -293,10 +293,10 @@ void main() {
|
|||||||
|
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for notKeyword is empty values\n'
|
'SHOULD update memory search filter for notKeyword is empty values\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField is notKeyword',
|
'WHEN onTextChanged called with FilterField is notKeyword',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterField = AdvancedSearchFilterField.notKeyword;
|
const filterField = FilterField.notKeyword;
|
||||||
const value = ' ';
|
const value = ' ';
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
@@ -310,11 +310,11 @@ void main() {
|
|||||||
|
|
||||||
test(
|
test(
|
||||||
'SHOULD update memory search filter for subject and notKeyword is empty values\n'
|
'SHOULD update memory search filter for subject and notKeyword is empty values\n'
|
||||||
'WHEN onTextChanged called with AdvancedSearchFilterField are subject and notKeyword',
|
'WHEN onTextChanged called with FilterField are subject and notKeyword',
|
||||||
() {
|
() {
|
||||||
// Arrange
|
// Arrange
|
||||||
const filterFieldSubject = AdvancedSearchFilterField.subject;
|
const filterFieldSubject = FilterField.subject;
|
||||||
const filterFieldNotKeyword = AdvancedSearchFilterField.notKeyword;
|
const filterFieldNotKeyword = FilterField.notKeyword;
|
||||||
const validSubject = 'Subject';
|
const validSubject = 'Subject';
|
||||||
const emptyNotKeyword = ' ';
|
const emptyNotKeyword = ' ';
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -71,7 +71,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
|
|||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart';
|
import 'package:tmail_ui_user/features/base/model/filter_filter.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_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/email_sort_order_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
|
||||||
@@ -490,8 +490,8 @@ void main() {
|
|||||||
when(context.mounted).thenReturn(true);
|
when(context.mounted).thenReturn(true);
|
||||||
|
|
||||||
// expect query in advanced filter controller update as expected
|
// expect query in advanced filter controller update as expected
|
||||||
advancedFilterController.updateListEmailAddress(AdvancedSearchFilterField.from, [fromEmailAddress]);
|
advancedFilterController.updateListEmailAddress(FilterField.from, [fromEmailAddress]);
|
||||||
advancedFilterController.updateListEmailAddress(AdvancedSearchFilterField.to, [toEmailAddress]);
|
advancedFilterController.updateListEmailAddress(FilterField.to, [toEmailAddress]);
|
||||||
advancedFilterController.subjectFilterInputController.text = emailSubject;
|
advancedFilterController.subjectFilterInputController.text = emailSubject;
|
||||||
advancedFilterController.hasKeyWordFilterInputController.text = emailContainsWord;
|
advancedFilterController.hasKeyWordFilterInputController.text = emailContainsWord;
|
||||||
advancedFilterController.notKeyWordFilterInputController.text = emailNotContainsWord;
|
advancedFilterController.notKeyWordFilterInputController.text = emailNotContainsWord;
|
||||||
|
|||||||
Reference in New Issue
Block a user