TF-1063 Disable search email when open mailbox
This commit is contained in:
@@ -239,8 +239,10 @@ class MailboxController extends BaseMailboxController {
|
||||
});
|
||||
|
||||
dashboardActionWorker = ever(mailboxDashBoardController.dashBoardAction, (action) {
|
||||
if(action is DashBoardAction) {
|
||||
if(action is ClearSearchEmailAction) {
|
||||
if (action is ClearSearchEmailAction) {
|
||||
_switchBackToMailboxDefault();
|
||||
} else if (action is SelectMailboxDefaultAction) {
|
||||
if (mailboxDashBoardController.selectedMailbox.value == null) {
|
||||
_switchBackToMailboxDefault();
|
||||
}
|
||||
}
|
||||
@@ -369,9 +371,7 @@ class MailboxController extends BaseMailboxController {
|
||||
mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected);
|
||||
mailboxDashBoardController.clearSelectedEmail();
|
||||
|
||||
if (mailboxDashBoardController.searchController.isSearchActive()) {
|
||||
mailboxDashBoardController.searchController.disableSearch();
|
||||
}
|
||||
_disableAllSearchEmail();
|
||||
|
||||
if (_responsiveUtils.hasLeftMenuDrawerActive(context)) {
|
||||
mailboxDashBoardController.closeMailboxMenuDrawer();
|
||||
@@ -380,6 +380,11 @@ class MailboxController extends BaseMailboxController {
|
||||
}
|
||||
}
|
||||
|
||||
void _disableAllSearchEmail() {
|
||||
mailboxDashBoardController.dispatchAction(ClearAllFieldOfAdvancedSearchAction());
|
||||
mailboxDashBoardController.searchController.disableAllSearchEmail();
|
||||
}
|
||||
|
||||
void openMailbox(
|
||||
BuildContext context,
|
||||
PresentationMailbox presentationMailboxSelected
|
||||
|
||||
@@ -72,14 +72,6 @@ class OpenEmailDetailedFromSuggestionQuickSearchAction extends DashBoardAction {
|
||||
List<Object?> get props => [presentationEmail];
|
||||
}
|
||||
|
||||
class DisableSearchEmailAction extends DashBoardAction {
|
||||
|
||||
DisableSearchEmailAction();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class StartSearchEmailAction extends DashBoardAction {
|
||||
|
||||
StartSearchEmailAction();
|
||||
@@ -101,6 +93,20 @@ class EmptyTrashAction extends DashBoardAction {
|
||||
class ClearSearchEmailAction extends DashBoardAction {
|
||||
ClearSearchEmailAction();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class ClearAllFieldOfAdvancedSearchAction extends DashBoardAction {
|
||||
ClearAllFieldOfAdvancedSearchAction();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class SelectMailboxDefaultAction extends DashBoardAction {
|
||||
SelectMailboxDefaultAction();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
+54
-3
@@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete
|
||||
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.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/search_controller.dart';
|
||||
@@ -62,6 +63,14 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
DateTime? get endDate => _endDate;
|
||||
|
||||
late Worker _dashboardActionWorker;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_registerWorkerListener();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
if (!BuildUtils.isWeb) {
|
||||
@@ -80,7 +89,7 @@ class AdvancedFilterController extends BaseController {
|
||||
}
|
||||
|
||||
void cleanSearchFilter(BuildContext context) {
|
||||
searchController.cleanSearchFilter();
|
||||
searchController.clearSearchFilter();
|
||||
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
|
||||
clearDateRangeOfFilter();
|
||||
subjectFilterInputController.text = '';
|
||||
@@ -88,7 +97,7 @@ class AdvancedFilterController extends BaseController {
|
||||
notKeyWordFilterInputController.text = '';
|
||||
dateFilterInputController.text = '';
|
||||
hasAttachment.value = false;
|
||||
searchController.isAdvancedSearchHasApply.value = false;
|
||||
searchController.deactivateAdvancedSearch();
|
||||
searchController.isAdvancedSearchViewOpen.toggle();
|
||||
_mailboxDashBoardController.searchEmail(
|
||||
context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
|
||||
@@ -167,7 +176,11 @@ class AdvancedFilterController extends BaseController {
|
||||
|
||||
void applyAdvancedSearchFilter(BuildContext context) {
|
||||
_updateFilterEmailFromAdvancedSearchView();
|
||||
searchController.isAdvancedSearchHasApply.value = isAdvancedSearchHasApplied;
|
||||
if (isAdvancedSearchHasApplied) {
|
||||
searchController.activateAdvancedSearch();
|
||||
} else {
|
||||
searchController.deactivateAdvancedSearch();
|
||||
}
|
||||
if (!isAdvancedSearchHasApplied) {
|
||||
final newSearchEmailFilter = searchController.searchEmailFilter.value.clearBeforeDate();
|
||||
searchController.searchEmailFilter.value = newSearchEmailFilter;
|
||||
@@ -357,6 +370,43 @@ class AdvancedFilterController extends BaseController {
|
||||
endDate: _endDate.toUTCDate());
|
||||
}
|
||||
|
||||
void _resetAllToOriginalValue() {
|
||||
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
|
||||
hasAttachment.value = false;
|
||||
lastTextForm.value = '';
|
||||
lastTextTo.value = '';
|
||||
_startDate = null;
|
||||
_endDate = null;
|
||||
}
|
||||
|
||||
void _clearAllTextFieldInput() {
|
||||
subjectFilterInputController.clear();
|
||||
hasKeyWordFilterInputController.clear();
|
||||
notKeyWordFilterInputController.clear();
|
||||
dateFilterInputController.clear();
|
||||
mailBoxFilterInputController.clear();
|
||||
}
|
||||
|
||||
void _registerWorkerListener() {
|
||||
_dashboardActionWorker = ever(
|
||||
_mailboxDashBoardController.dashBoardAction,
|
||||
(action) {
|
||||
if (action is ClearAllFieldOfAdvancedSearchAction) {
|
||||
_handleClearAllFieldOfAdvancedSearch();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
void _unregisterWorkerListener() {
|
||||
_dashboardActionWorker.dispose();
|
||||
}
|
||||
|
||||
void _handleClearAllFieldOfAdvancedSearch() {
|
||||
_resetAllToOriginalValue();
|
||||
_clearAllTextFieldInput();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
focusManager.dispose();
|
||||
@@ -365,6 +415,7 @@ class AdvancedFilterController extends BaseController {
|
||||
notKeyWordFilterInputController.dispose();
|
||||
mailBoxFilterInputController.dispose();
|
||||
dateFilterInputController.dispose();
|
||||
_unregisterWorkerListener();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -426,7 +426,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
|
||||
void clearSearchEmail() {
|
||||
dispatchAction(ClearSearchEmailAction());
|
||||
searchController.disableSearch();
|
||||
searchController.disableSimpleSearch();
|
||||
}
|
||||
|
||||
void _unSelectedMailbox() {
|
||||
@@ -1009,7 +1009,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
dashboardRoute.value = route;
|
||||
|
||||
if (dashboardRoute.value == DashboardRoutes.searchEmail) {
|
||||
searchController.enableSearch();
|
||||
searchController.activateSimpleSearch();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1200,6 +1200,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
}
|
||||
|
||||
void selectQuickSearchFilterAction(QuickSearchFilter filter) {
|
||||
log('MailboxDashBoardController::selectQuickSearchFilterAction(): filter: $filter');
|
||||
selectQuickSearchFilter(quickSearchFilter: filter);
|
||||
dispatchAction(StartSearchEmailAction());
|
||||
}
|
||||
|
||||
@@ -34,17 +34,12 @@ class SearchController extends BaseController {
|
||||
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
|
||||
|
||||
final searchInputController = TextEditingController();
|
||||
final searchEmailFilter = SearchEmailFilter().obs;
|
||||
final searchEmailFilter = SearchEmailFilter.initial().obs;
|
||||
final searchState = SearchState.initial().obs;
|
||||
final isAdvancedSearchViewOpen = false.obs;
|
||||
final isAdvancedSearchHasApply = false.obs;
|
||||
final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs;
|
||||
final mailboxFilterSelectedFormAdvancedSearch = Rxn<PresentationMailbox>();
|
||||
final hasAttachment = false.obs;
|
||||
final emailReceiveTimeType = Rxn<EmailReceiveTimeType>();
|
||||
final searchIsActive = RxBool(false);
|
||||
|
||||
SearchEmailFilter get searchEmailFilterValue => searchEmailFilter.value;
|
||||
final simpleSearchIsActivated = RxBool(false);
|
||||
final advancedSearchIsActivated = RxBool(false);
|
||||
|
||||
SearchQuery? get searchQuery => searchEmailFilter.value.text;
|
||||
|
||||
@@ -66,8 +61,8 @@ class SearchController extends BaseController {
|
||||
isAdvancedSearchViewOpen.toggle();
|
||||
}
|
||||
|
||||
cleanSearchFilter() {
|
||||
searchEmailFilter.value = SearchEmailFilter();
|
||||
void clearSearchFilter() {
|
||||
searchEmailFilter.value = SearchEmailFilter.initial();
|
||||
}
|
||||
|
||||
void selectQuickSearchFilter({
|
||||
@@ -145,6 +140,7 @@ class SearchController extends BaseController {
|
||||
startDate: startDate,
|
||||
endDate: endDate,
|
||||
);
|
||||
searchEmailFilter.refresh();
|
||||
}
|
||||
|
||||
void _registerSearchFocusListener() {
|
||||
@@ -152,10 +148,10 @@ class SearchController extends BaseController {
|
||||
final hasFocus = searchFocus.hasFocus;
|
||||
final query = searchEmailFilter.value.text?.value;
|
||||
log('SearchController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query');
|
||||
if (!hasFocus && (query == null || query.isEmpty) && isAdvancedSearchHasApply.isFalse) {
|
||||
if (!hasFocus && (query == null || query.isEmpty) && advancedSearchIsActivated.isFalse) {
|
||||
updateFilterEmail(text: SearchQuery.initial());
|
||||
searchInputController.clear();
|
||||
cleanSearchFilter();
|
||||
clearSearchFilter();
|
||||
searchFocus.unfocus();
|
||||
}
|
||||
});
|
||||
@@ -164,19 +160,16 @@ class SearchController extends BaseController {
|
||||
bool isSearchActive() =>
|
||||
searchState.value.searchStatus == SearchStatus.ACTIVE;
|
||||
|
||||
bool isAdvanceSearchActive() => isAdvancedSearchHasApply.isTrue;
|
||||
|
||||
bool get isSearchEmailRunning => isSearchActive() || isAdvanceSearchActive();
|
||||
bool get isSearchEmailRunning => simpleSearchIsActivated.isTrue || advancedSearchIsActivated.isTrue;
|
||||
|
||||
void enableSearch() {
|
||||
searchState.value = searchState.value.enableSearchState();
|
||||
}
|
||||
|
||||
void disableSearch() {
|
||||
searchState.value = searchState.value.disableSearchState();
|
||||
void disableSimpleSearch() {
|
||||
updateFilterEmail(text: SearchQuery.initial());
|
||||
searchInputController.clear();
|
||||
searchFocus.unfocus();
|
||||
_clearAllTextInputSimpleSearch();
|
||||
hideSimpleSearchFormView();
|
||||
}
|
||||
|
||||
void clearTextSearch() {
|
||||
@@ -237,6 +230,46 @@ class SearchController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void activateSimpleSearch() {
|
||||
simpleSearchIsActivated.value = true;
|
||||
}
|
||||
|
||||
void deactivateSimpleSearch() {
|
||||
simpleSearchIsActivated.value = false;
|
||||
}
|
||||
|
||||
void activateAdvancedSearch() {
|
||||
advancedSearchIsActivated.value = true;
|
||||
}
|
||||
|
||||
void deactivateAdvancedSearch() {
|
||||
advancedSearchIsActivated.value = false;
|
||||
}
|
||||
|
||||
void hideAdvancedSearchFormView() {
|
||||
isAdvancedSearchViewOpen.value = false;
|
||||
}
|
||||
|
||||
void hideSimpleSearchFormView() {
|
||||
searchState.value = searchState.value.disableSearchState();
|
||||
}
|
||||
|
||||
void _clearAllTextInputSimpleSearch() {
|
||||
searchInputController.clear();
|
||||
searchFocus.unfocus();
|
||||
emailReceiveTimeType.value = null;
|
||||
}
|
||||
|
||||
void disableAllSearchEmail() {
|
||||
_clearAllTextInputSimpleSearch();
|
||||
deactivateSimpleSearch();
|
||||
hideSimpleSearchFormView();
|
||||
|
||||
clearSearchFilter();
|
||||
deactivateAdvancedSearch();
|
||||
hideAdvancedSearchFormView();
|
||||
}
|
||||
|
||||
@override
|
||||
void onDone() {}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/filter/filter_operator.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/filter/operator/logic_filter_operator.dart';
|
||||
@@ -7,7 +8,7 @@ import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
|
||||
class SearchEmailFilter {
|
||||
class SearchEmailFilter with EquatableMixin {
|
||||
final Set<String> from;
|
||||
final Set<String> to;
|
||||
final SearchQuery? text;
|
||||
@@ -20,6 +21,8 @@ class SearchEmailFilter {
|
||||
final UTCDate? startDate;
|
||||
final UTCDate? endDate;
|
||||
|
||||
factory SearchEmailFilter.initial() => SearchEmailFilter();
|
||||
|
||||
SearchEmailFilter({
|
||||
Set<String>? from,
|
||||
Set<String>? to,
|
||||
@@ -108,6 +111,21 @@ class SearchEmailFilter {
|
||||
? LogicFilterOperator(Operator.AND, listEmailCondition)
|
||||
: null;
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
from,
|
||||
to,
|
||||
text,
|
||||
subject,
|
||||
notKeyword,
|
||||
mailbox,
|
||||
emailReceiveTimeType,
|
||||
hasAttachment,
|
||||
before,
|
||||
startDate,
|
||||
endDate
|
||||
];
|
||||
}
|
||||
|
||||
extension SearchEmailFilterExtension on SearchEmailFilter {
|
||||
|
||||
+2
-2
@@ -28,13 +28,13 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
|
||||
minSize: 40,
|
||||
iconPadding: const EdgeInsets.only(right: 2),
|
||||
icon: SvgPicture.asset(_imagePaths.icFilterAdvanced,
|
||||
color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.isAdvancedSearchHasApply.isTrue
|
||||
color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue
|
||||
? AppColor.colorFilterMessageEnabled
|
||||
: AppColor.colorFilterMessageDisabled,
|
||||
width: 16,
|
||||
height: 16),
|
||||
onTap: () {
|
||||
if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.isAdvancedSearchHasApply.isFalse){
|
||||
if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.advancedSearchIsActivated.isFalse){
|
||||
advancedFilterController.initSearchFilterField(context);
|
||||
}
|
||||
searchController.showAdvancedFilterView(_parentContext);
|
||||
|
||||
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/quick_sear
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.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/quick_search_filter.dart';
|
||||
@@ -583,7 +584,8 @@ class SearchEmailController extends BaseController
|
||||
clearAllTextInputSearchForm();
|
||||
clearAllResultSearch();
|
||||
FocusScope.of(context).unfocus();
|
||||
mailboxDashBoardController.searchController.disableSearch();
|
||||
mailboxDashBoardController.searchController.disableAllSearchEmail();
|
||||
mailboxDashBoardController.dispatchAction(SelectMailboxDefaultAction());
|
||||
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
|
||||
SearchEmailBindings().disposeBindings();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@ import 'package:tmail_ui_user/features/search/presentation/widgets/email_receive
|
||||
import 'package:tmail_ui_user/features/search/presentation/widgets/email_receive_time_cupertino_action_sheet_action_builder.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
|
||||
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
|
||||
@@ -425,9 +424,9 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
context,
|
||||
listPresentationEmail[index],
|
||||
controller.selectionMode.value,
|
||||
SearchStatus.ACTIVE,
|
||||
controller.searchQuery,
|
||||
controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id,
|
||||
isSearchEmailRunning: true,
|
||||
padding: SearchEmailUtils.getPaddingSearchResultList(context, _responsiveUtils),
|
||||
paddingDivider: SearchEmailUtils.getPaddingDividerSearchResultList(context, _responsiveUtils),
|
||||
mailboxCurrent: listPresentationEmail[index].findMailboxContain(
|
||||
|
||||
@@ -14,7 +14,6 @@ import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:model/mailbox/select_mode.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
|
||||
|
||||
typedef OnPressEmailActionClick = void Function(EmailActionType, PresentationEmail);
|
||||
typedef OnMoreActionClick = void Function(PresentationEmail, RelativeRect?);
|
||||
@@ -25,11 +24,10 @@ mixin BaseEmailItemTile {
|
||||
final imagePaths = Get.find<ImagePaths>();
|
||||
|
||||
Widget buildMailboxContain(
|
||||
SearchStatus state,
|
||||
bool advancedSearchActivated,
|
||||
PresentationEmail email
|
||||
bool isSearchEmailRunning,
|
||||
PresentationEmail email
|
||||
) {
|
||||
if (hasMailboxLabel(state, advancedSearchActivated, email)) {
|
||||
if (hasMailboxLabel(isSearchEmailRunning, email)) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.only(left: 8),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
@@ -55,8 +53,9 @@ mixin BaseEmailItemTile {
|
||||
}
|
||||
}
|
||||
|
||||
bool isSearchEnabled(SearchStatus state, bool advancedSearchActivated, SearchQuery? query) =>
|
||||
(state == SearchStatus.ACTIVE || advancedSearchActivated) && query?.value.isNotEmpty == true;
|
||||
bool isSearchEnabled(bool isSearchEmailRunning, SearchQuery? query) {
|
||||
return isSearchEmailRunning && query?.value.isNotEmpty == true;
|
||||
}
|
||||
|
||||
FontWeight buildFontForReadEmail(PresentationEmail email) =>
|
||||
!email.hasRead ? FontWeight.w600 : FontWeight.normal;
|
||||
@@ -64,8 +63,8 @@ mixin BaseEmailItemTile {
|
||||
Color buildTextColorForReadEmail(PresentationEmail email) =>
|
||||
email.hasRead ? AppColor.colorContentEmail : AppColor.colorNameEmail;
|
||||
|
||||
bool hasMailboxLabel(SearchStatus state, bool advancedSearchActivated, PresentationEmail email) {
|
||||
return (state == SearchStatus.ACTIVE || advancedSearchActivated) && email.mailboxName.isNotEmpty;
|
||||
bool hasMailboxLabel(bool isSearchEmailRunning, PresentationEmail email) {
|
||||
return isSearchEmailRunning && email.mailboxName.isNotEmpty;
|
||||
}
|
||||
|
||||
String informationSender(PresentationEmail email, PresentationMailbox? mailbox) {
|
||||
@@ -79,11 +78,10 @@ mixin BaseEmailItemTile {
|
||||
Widget buildInformationSender(
|
||||
PresentationEmail email,
|
||||
PresentationMailbox? mailbox,
|
||||
SearchStatus state,
|
||||
bool advancedSearchActivated,
|
||||
bool isSearchEmailRunning,
|
||||
SearchQuery? query
|
||||
) {
|
||||
if (isSearchEnabled(state, advancedSearchActivated, query)) {
|
||||
if (isSearchEnabled(isSearchEmailRunning, query)) {
|
||||
return RichTextBuilder(
|
||||
informationSender(email, mailbox),
|
||||
query?.value ?? '',
|
||||
@@ -113,12 +111,11 @@ mixin BaseEmailItemTile {
|
||||
}
|
||||
|
||||
Widget buildEmailTitle(
|
||||
PresentationEmail email,
|
||||
SearchStatus state,
|
||||
bool advancedSearchActivated,
|
||||
SearchQuery? query
|
||||
PresentationEmail email,
|
||||
bool isSearchEmailRunning,
|
||||
SearchQuery? query
|
||||
) {
|
||||
if (isSearchEnabled(state, advancedSearchActivated, query)) {
|
||||
if (isSearchEnabled(isSearchEmailRunning, query)) {
|
||||
return RichTextBuilder(
|
||||
email.getEmailTitle(),
|
||||
query?.value ?? '',
|
||||
@@ -147,12 +144,11 @@ mixin BaseEmailItemTile {
|
||||
}
|
||||
|
||||
Widget buildEmailPartialContent(
|
||||
PresentationEmail email,
|
||||
SearchStatus state,
|
||||
bool advancedSearchActivated,
|
||||
SearchQuery? query
|
||||
PresentationEmail email,
|
||||
bool isSearchEmailRunning,
|
||||
SearchQuery? query
|
||||
) {
|
||||
if (isSearchEnabled(state, advancedSearchActivated, query)) {
|
||||
if (isSearchEnabled(isSearchEmailRunning, query)) {
|
||||
return RichTextBuilder(
|
||||
email.getPartialContent(),
|
||||
query?.value ?? '',
|
||||
|
||||
@@ -243,7 +243,6 @@ class ThreadController extends BaseController {
|
||||
if (_currentMailboxId != mailbox.id) {
|
||||
_currentMailboxId = mailbox.id;
|
||||
_resetToOriginalValue();
|
||||
disableSearch();
|
||||
_getAllEmail();
|
||||
}
|
||||
} else if (mailbox == null) { // disable current mailbox when search active
|
||||
@@ -292,9 +291,6 @@ class ThreadController extends BaseController {
|
||||
action.presentationEmail,
|
||||
mailboxContain: mailboxContain);
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is DisableSearchEmailAction) {
|
||||
closeSearchEmailAction();
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is StartSearchEmailAction) {
|
||||
_searchEmail();
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
@@ -639,7 +635,7 @@ class ThreadController extends BaseController {
|
||||
message: newFilterOption.getMessageToast(context),
|
||||
icon: newFilterOption.getIconToast(_imagePaths));
|
||||
|
||||
if (isSearchActive() || searchController.isAdvancedSearchHasApply.isTrue) {
|
||||
if (isSearchActive() || searchController.advancedSearchIsActivated.isTrue) {
|
||||
_searchEmail(filterMessageOption: _getFilterCondition());
|
||||
} else {
|
||||
refreshAllEmail();
|
||||
@@ -926,34 +922,16 @@ class ThreadController extends BaseController {
|
||||
|
||||
bool isSearchActive() => searchController.isSearchActive();
|
||||
|
||||
bool isAdvanceSearchActive() => searchController.isAdvanceSearchActive();
|
||||
|
||||
|
||||
bool get isAllSearchInActive => !searchController.isSearchActive() &&
|
||||
searchController.isAdvancedSearchViewOpen.isFalse;
|
||||
|
||||
void enableSearch(BuildContext context) {
|
||||
searchController.enableSearch();
|
||||
}
|
||||
|
||||
void disableSearch() {
|
||||
searchController.searchIsActive.value = false;
|
||||
searchController.disableSearch();
|
||||
}
|
||||
|
||||
void closeSearchEmailAction() {
|
||||
disableSearch();
|
||||
cancelSelectEmail();
|
||||
refreshAllEmail();
|
||||
}
|
||||
|
||||
void clearTextSearch() {
|
||||
searchController.clearTextSearch();
|
||||
}
|
||||
|
||||
void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) {
|
||||
if (_accountId != null && searchQuery != null) {
|
||||
searchController.searchIsActive.value = true;
|
||||
searchController.activateSimpleSearch();
|
||||
|
||||
filterMessageOption = EmailFilterCondition(
|
||||
notKeyword: filterMessageOption?.notKeyword,
|
||||
|
||||
@@ -84,22 +84,15 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
}
|
||||
|
||||
Widget _buildSearchBarView(BuildContext context) {
|
||||
return Obx(() {
|
||||
if (!controller.searchController.isSearchActive()) {
|
||||
return Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
|
||||
margin: const EdgeInsets.only(
|
||||
bottom: !BuildUtils.isWeb ? 16 : 0),
|
||||
child: SearchBarView(_imagePaths,
|
||||
hintTextSearch: AppLocalizations.of(context).search_emails,
|
||||
onOpenSearchViewAction: () => controller.goToSearchView()));
|
||||
} else {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
});
|
||||
return Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
|
||||
margin: const EdgeInsets.only(bottom: !BuildUtils.isWeb ? 16 : 0),
|
||||
child: SearchBarView(_imagePaths,
|
||||
hintTextSearch: AppLocalizations.of(context).search_emails,
|
||||
onOpenSearchViewAction: controller.goToSearchView));
|
||||
}
|
||||
|
||||
Widget _buildVacationNotificationMessage(BuildContext context) {
|
||||
@@ -251,7 +244,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
return Obx(() => controller.viewState.value.fold(
|
||||
(failure) => const SizedBox.shrink(),
|
||||
(success) {
|
||||
if (controller.isSearchActive() || controller.isAdvanceSearchActive()) {
|
||||
if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) {
|
||||
return success is SearchingState
|
||||
? Padding(padding: const EdgeInsets.symmetric(vertical: 16), child: loadingWidget)
|
||||
: const SizedBox.shrink();
|
||||
@@ -318,7 +311,7 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
&& !controller.isLoadingMore
|
||||
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent
|
||||
) {
|
||||
if (controller.isSearchActive() || controller.isAdvanceSearchActive()) {
|
||||
if (controller.isSearchActive() || controller.searchController.advancedSearchIsActivated.isTrue) {
|
||||
controller.searchMoreEmails();
|
||||
} else {
|
||||
controller.loadMoreEmails();
|
||||
@@ -341,13 +334,12 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
context,
|
||||
listPresentationEmail[index],
|
||||
controller.mailboxDashBoardController.currentSelectMode.value,
|
||||
controller.searchController.searchState.value.searchStatus,
|
||||
controller.searchQuery,
|
||||
controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id,
|
||||
mailboxCurrent: controller.searchController.isSearchEmailRunning
|
||||
? listPresentationEmail[index].findMailboxContain(controller.mailboxDashBoardController.mapMailboxById)
|
||||
: controller.currentMailbox,
|
||||
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue)
|
||||
isSearchEmailRunning: controller.searchController.isSearchEmailRunning)
|
||||
..addOnPressEmailActionClick((action, email) =>
|
||||
controller.pressEmailAction(
|
||||
context,
|
||||
@@ -358,22 +350,22 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
|
||||
: controller.currentMailbox))
|
||||
..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context)
|
||||
? controller.openContextMenuAction(context, _contextMenuActionTile(context, email))
|
||||
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))))
|
||||
.build(),
|
||||
: controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))
|
||||
).build(),
|
||||
feedback: _buildFeedBackWidget(context),
|
||||
childWhenDragging: (EmailTileBuilder(
|
||||
context,
|
||||
listPresentationEmail[index],
|
||||
controller.mailboxDashBoardController.currentSelectMode.value,
|
||||
controller.searchController.searchState.value.searchStatus,
|
||||
controller.searchQuery,
|
||||
controller.mailboxDashBoardController.selectedEmail.value?.id == listPresentationEmail[index].id,
|
||||
mailboxCurrent: controller.searchController.isSearchEmailRunning
|
||||
? listPresentationEmail[index].findMailboxContain(
|
||||
controller.mailboxDashBoardController.mapMailboxById)
|
||||
: controller.currentMailbox,
|
||||
advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue, isDrag: true))
|
||||
.build(),
|
||||
isSearchEmailRunning: controller.searchController.isSearchEmailRunning,
|
||||
isDrag: true)
|
||||
).build(),
|
||||
dragAnchorStrategy: pointerDragAnchorStrategy,
|
||||
onDragStarted: () {
|
||||
controller.calculateDragValue(listPresentationEmail[index]);
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:model/mailbox/select_mode.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
|
||||
|
||||
class EmailTileBuilder with BaseEmailItemTile {
|
||||
|
||||
@@ -12,9 +14,8 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
final BuildContext _context;
|
||||
final SelectMode _selectModeAll;
|
||||
final PresentationMailbox? mailboxCurrent;
|
||||
final SearchStatus _searchStatus;
|
||||
final SearchQuery? _searchQuery;
|
||||
final bool advancedSearchActivated;
|
||||
final bool isSearchEmailRunning;
|
||||
final EdgeInsets? padding;
|
||||
final EdgeInsets? paddingDivider;
|
||||
final bool isDrag;
|
||||
@@ -26,11 +27,10 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
this._context,
|
||||
this._presentationEmail,
|
||||
this._selectModeAll,
|
||||
this._searchStatus,
|
||||
this._searchQuery,
|
||||
this._isShowingEmailContent,
|
||||
{
|
||||
this.advancedSearchActivated = false,
|
||||
this.isSearchEmailRunning = false,
|
||||
this.mailboxCurrent,
|
||||
this.padding,
|
||||
this.paddingDivider,
|
||||
@@ -82,11 +82,10 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
height: 9,
|
||||
fit: BoxFit.fill)),
|
||||
Expanded(child: buildInformationSender(
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery)),
|
||||
if (_presentationEmail.hasAttachment == true)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -107,14 +106,12 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Expanded(child: buildEmailTitle(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery)),
|
||||
buildMailboxContain(
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_presentationEmail),
|
||||
isSearchEmailRunning,
|
||||
_presentationEmail),
|
||||
if (_presentationEmail.hasStarred)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -126,10 +123,9 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
padding: const EdgeInsets.only(top: 6),
|
||||
child: Row(children: [
|
||||
Expanded(child: buildEmailPartialContent(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery)),
|
||||
])
|
||||
),
|
||||
],
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:core/presentation/extensions/color_extension.dart';
|
||||
import 'package:core/presentation/views/button/icon_button_web.dart';
|
||||
import 'package:core/presentation/views/responsive/responsive_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:model/mailbox/select_mode.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
class EmailTileBuilder with BaseEmailItemTile {
|
||||
@@ -14,9 +18,8 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
final BuildContext _context;
|
||||
final SelectMode _selectModeAll;
|
||||
final PresentationMailbox? mailboxCurrent;
|
||||
final SearchStatus _searchStatus;
|
||||
final SearchQuery? _searchQuery;
|
||||
final bool advancedSearchActivated;
|
||||
final bool isSearchEmailRunning;
|
||||
final EdgeInsets? padding;
|
||||
final EdgeInsets? paddingDivider;
|
||||
final bool isDrag;
|
||||
@@ -32,11 +35,10 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
this._context,
|
||||
this._presentationEmail,
|
||||
this._selectModeAll,
|
||||
this._searchStatus,
|
||||
this._searchQuery,
|
||||
this._isShowingEmailContent,
|
||||
{
|
||||
this.advancedSearchActivated = false,
|
||||
this.isSearchEmailRunning = false,
|
||||
this.mailboxCurrent,
|
||||
this.padding,
|
||||
this.paddingDivider,
|
||||
@@ -137,11 +139,11 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
height: 9,
|
||||
fit: BoxFit.fill)),
|
||||
Expanded(child: buildInformationSender(
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
if (_presentationEmail.hasAttachment == true)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -160,14 +162,14 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Expanded(child: buildEmailTitle(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
buildMailboxContain(
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_presentationEmail),
|
||||
isSearchEmailRunning,
|
||||
_presentationEmail
|
||||
),
|
||||
if (_presentationEmail.hasStarred)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -178,10 +180,10 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
const SizedBox(height: 8),
|
||||
Row(children: [
|
||||
Expanded(child: buildEmailPartialContent(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
]),
|
||||
]),
|
||||
)
|
||||
@@ -233,11 +235,11 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
height: 9,
|
||||
fit: BoxFit.fill)),
|
||||
Expanded(child: buildInformationSender(
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
if (isHoverItem)
|
||||
const SizedBox(width: 120)
|
||||
else
|
||||
@@ -248,14 +250,14 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Expanded(child: buildEmailTitle(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
buildMailboxContain(
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_presentationEmail),
|
||||
isSearchEmailRunning,
|
||||
_presentationEmail
|
||||
),
|
||||
if (_presentationEmail.hasStarred)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -266,10 +268,10 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
const SizedBox(height: 8),
|
||||
Row(children: [
|
||||
Expanded(child: buildEmailPartialContent(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
]),
|
||||
]),
|
||||
if (_selectModeAll == SelectMode.INACTIVE)
|
||||
@@ -354,11 +356,11 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
SizedBox(
|
||||
width: 160,
|
||||
child: buildInformationSender(
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
_presentationEmail,
|
||||
mailboxCurrent,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
const SizedBox(width: 24),
|
||||
Expanded(child: _buildSubjectAndContent()),
|
||||
const SizedBox(width: 16),
|
||||
@@ -476,9 +478,9 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
Widget _buildDateTimeForDesktopScreen() {
|
||||
return Row(children: [
|
||||
buildMailboxContain(
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_presentationEmail),
|
||||
isSearchEmailRunning,
|
||||
_presentationEmail
|
||||
),
|
||||
if (_presentationEmail.hasAttachment == true)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8),
|
||||
@@ -508,19 +510,19 @@ class EmailTileBuilder with BaseEmailItemTile {
|
||||
return Row(children: [
|
||||
if (_presentationEmail.getEmailTitle().isNotEmpty)
|
||||
Container(
|
||||
constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2),
|
||||
padding: const EdgeInsets.only(right: 12),
|
||||
child: buildEmailTitle(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery)),
|
||||
Expanded(child: Container(
|
||||
child: buildEmailPartialContent(
|
||||
constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2),
|
||||
padding: const EdgeInsets.only(right: 12),
|
||||
child: buildEmailTitle(
|
||||
_presentationEmail,
|
||||
_searchStatus,
|
||||
advancedSearchActivated,
|
||||
_searchQuery))
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
)),
|
||||
Expanded(child: Container(
|
||||
child: buildEmailPartialContent(
|
||||
_presentationEmail,
|
||||
isSearchEmailRunning,
|
||||
_searchQuery
|
||||
))
|
||||
),
|
||||
]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user