TF-1063 Disable search email when open mailbox

This commit is contained in:
dab246
2022-11-03 01:24:27 +07:00
committed by Dat H. Pham
parent 95721008c1
commit 46fa9b3006
14 changed files with 275 additions and 196 deletions
@@ -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 => [];
}
@@ -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();
}
@@ -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 {
@@ -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
))
),
]);
});