TF-933 Update new position all button QuickSearchFilter on Web Desktop

This commit is contained in:
dab246
2022-09-15 18:42:16 +07:00
committed by Dat H. Pham
parent 3c0eac12ac
commit 0fb78cef5e
7 changed files with 204 additions and 161 deletions
@@ -76,6 +76,14 @@ class DisableSearchEmailAction extends DashBoardAction {
DisableSearchEmailAction();
@override
List<Object?> get props => [];
}
class StartSearchEmailAction extends DashBoardAction {
StartSearchEmailAction();
@override
List<Object?> get props => [];
}
@@ -43,6 +43,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.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';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart';
@@ -54,7 +55,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/account
import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
@@ -366,7 +366,7 @@ class MailboxDashBoardController extends ReloadableController {
void searchEmail(BuildContext context, String value) {
searchController.updateFilterEmail(text: SearchQuery(value));
dispatchState(Right(SearchEmailNewQuery(searchController.searchEmailFilter.value.text ?? SearchQuery.initial())));
dispatchAction(StartSearchEmailAction());
FocusScope.of(context).unfocus();
if (_searchInsideEmailDetailedViewIsActive(context)) {
_closeEmailDetailedView();
@@ -659,6 +659,27 @@ class MailboxDashBoardController extends ReloadableController {
}
}
void selectQuickSearchFilterAction(QuickSearchFilter filter) {
selectQuickSearchFilter(quickSearchFilter: filter);
dispatchAction(StartSearchEmailAction());
}
void selectReceiveTimeQuickSearchFilter(EmailReceiveTimeType? emailReceiveTimeType) {
popBack();
if (emailReceiveTimeType != null) {
searchController.updateFilterEmail(emailReceiveTimeType: emailReceiveTimeType);
} else {
searchController.updateFilterEmail(emailReceiveTimeType: EmailReceiveTimeType.allTime);
}
searchController.setEmailReceiveTimeType(emailReceiveTimeType);
searchController.updateFilterEmail();
if (searchController.searchQuery == null){
searchController.updateFilterEmail(text: SearchQuery.initial());
}
dispatchAction(StartSearchEmailAction());
}
@override
void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream();
@@ -42,8 +42,11 @@ class SearchController extends BaseController {
final mailboxFilterSelectedFormAdvancedSearch = Rxn<PresentationMailbox>();
final hasAttachment = false.obs;
final emailReceiveTimeType = Rxn<EmailReceiveTimeType>();
final searchIsActive = RxBool(false);
get searchEmailFilterValue => searchEmailFilter.value;
SearchEmailFilter get searchEmailFilterValue => searchEmailFilter.value;
SearchQuery? get searchQuery => searchEmailFilter.value.text;
FocusNode searchFocus = FocusNode();
@@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/das
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/composer_overlay_state.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';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart';
@@ -95,17 +96,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
children: [
SizedBox(child: MailboxView(), width: responsiveUtils.defaultSizeMenu),
Expanded(child: Column(children: [
Obx(() {
if (controller.vacationResponse.value?.vacationResponderIsValid == true) {
return VacationNotificationMessageWidget(
margin: const EdgeInsets.only(top: 16, right: 16),
vacationResponse: controller.vacationResponse.value!,
actionGotoVacationSetting: () => controller.goToVacationSetting(),
actionEndNow: () => controller.disableVacationResponder());
} else {
return const SizedBox.shrink();
}
}),
_buildVacationNotificationMessage(context),
_buildListButtonQuickSearchFilter(context),
_buildMarkAsMailboxReadLoading(context),
Expanded(child: Obx(() {
switch(controller.routePath.value) {
@@ -681,4 +673,164 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
}
});
}
Widget _buildVacationNotificationMessage(BuildContext context) {
return Obx(() {
if (controller.vacationResponse.value?.vacationResponderIsValid == true) {
return VacationNotificationMessageWidget(
margin: const EdgeInsets.only(top: 16, right: 16),
vacationResponse: controller.vacationResponse.value!,
actionGotoVacationSetting: () => controller.goToVacationSetting(),
actionEndNow: () => controller.disableVacationResponder());
} else {
return const SizedBox.shrink();
}
});
}
bool supportListButtonQuickSearchFilter(BuildContext context) {
return controller.searchController.isSearchActive()
&& controller.searchController.searchIsActive.isTrue
&& responsiveUtils.isWebDesktop(context);
}
Widget _buildListButtonQuickSearchFilter(BuildContext context) {
return Obx(() {
if (supportListButtonQuickSearchFilter(context)) {
return Padding(
padding: const EdgeInsets.only(right: 16, top: 16),
child: Row(
children: QuickSearchFilter.values
.map((filter) => _buildQuickSearchFilterButton(context, filter))
.toList()),
);
} else {
return const SizedBox.shrink();
}
});
}
Widget _buildQuickSearchFilterButton(
BuildContext context,
QuickSearchFilter filter
) {
return Obx(() {
final quickSearchFilterSelected = controller.checkQuickSearchFilterSelected(
quickSearchFilter: filter,
);
return Padding(
padding: const EdgeInsets.only(right: 8),
child: InkWell(
onTap: () {
if (filter != QuickSearchFilter.last7Days) {
controller.selectQuickSearchFilterAction(filter);
}
},
onTapDown: (detail) {
if (filter == QuickSearchFilter.last7Days) {
final screenSize = MediaQuery.of(context).size;
final offset = detail.globalPosition;
final position = RelativeRect.fromLTRB(
offset.dx,
offset.dy,
screenSize.width - offset.dx,
screenSize.height - offset.dy,
);
controller.openPopupMenuAction(context, position,
popupMenuEmailReceiveTimeType(context,
controller.searchController.emailReceiveTimeType.value,
(receiveTime) => controller.selectReceiveTimeQuickSearchFilter(receiveTime)));
}
},
borderRadius: const BorderRadius.all(Radius.circular(10)),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected)),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset(
filter.getIcon(
imagePaths,
quickSearchFilterSelected: quickSearchFilterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
const SizedBox(width: 4),
Text(
filter.getTitle(
context,
receiveTimeType: controller.searchController.emailReceiveTimeType.value),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: filter.getTextStyle(
quickSearchFilterSelected: quickSearchFilterSelected),
),
if (filter == QuickSearchFilter.last7Days)
... [
const SizedBox(width: 4),
SvgPicture.asset(
imagePaths.icChevronDown,
width: 16,
height: 16,
fit: BoxFit.fill),
]
])),
),
);
});
}
List<PopupMenuEntry> popupMenuEmailReceiveTimeType(
BuildContext context,
EmailReceiveTimeType? receiveTimeSelected,
Function(EmailReceiveTimeType?)? onCallBack
) {
return EmailReceiveTimeType.values
.map((timeType) => PopupMenuItem(
padding: EdgeInsets.zero,
child: _receiveTimeTileAction(
context,
receiveTimeSelected,
timeType,
onCallBack)))
.toList();
}
Widget _receiveTimeTileAction(
BuildContext context,
EmailReceiveTimeType? receiveTimeSelected,
EmailReceiveTimeType receiveTimeType,
Function(EmailReceiveTimeType?)? onCallBack
) {
return InkWell(
onTap: () => onCallBack?.call(receiveTimeType == receiveTimeSelected
? null
: receiveTimeType),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: SizedBox(
width: 320,
child: Row(children: [
Expanded(child: Text(
receiveTimeType.getTitle(context),
style: const TextStyle(
fontSize: 17,
color: Colors.black,
fontWeight: FontWeight.normal))),
if (receiveTimeType == receiveTimeSelected)
...[
const SizedBox(width: 12),
SvgPicture.asset(
imagePaths.icFilterSelected,
width: 24,
height: 24,
fit: BoxFit.fill),
]
])
),
)
);
}
}
@@ -1,7 +1,6 @@
import 'package:core/core.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
class SearchingState extends UIState {
@@ -11,15 +10,6 @@ class SearchingState extends UIState {
List<Object> get props => [];
}
class SearchEmailNewQuery extends UIState {
final SearchQuery searchQuery;
SearchEmailNewQuery(this.searchQuery);
@override
List<Object> get props => [searchQuery];
}
class SearchEmailSuccess extends UIState {
final List<PresentationEmail> emailList;
@@ -94,7 +94,6 @@ class ThreadController extends BaseController {
final MoveToMailboxInteractor _moveToMailboxInteractor;
final emailList = <PresentationEmail>[].obs;
final searchIsActive = RxBool(false);
bool canLoadMore = true;
bool canSearchMore = true;
@@ -279,6 +278,9 @@ class ThreadController extends BaseController {
} else if (action is DisableSearchEmailAction) {
closeSearchEmailAction();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is StartSearchEmailAction) {
_searchEmail();
mailboxDashBoardController.clearDashBoardAction();
}
}
});
@@ -286,10 +288,7 @@ class ThreadController extends BaseController {
viewStateWorker = ever(mailboxDashBoardController.viewState, (viewState) {
if (viewState is Either) {
viewState.map((success) {
if (success is SearchEmailNewQuery){
mailboxDashBoardController.clearState();
_searchEmail();
} else if (success is MarkAsEmailReadSuccess) {
if (success is MarkAsEmailReadSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
} else if (success is MoveToMailboxSuccess) {
_refreshEmailChanges(currentEmailState: success.currentEmailState);
@@ -842,7 +841,7 @@ class ThreadController extends BaseController {
}
void disableSearch() {
searchIsActive.value = false;
searchController.searchIsActive.value = false;
searchController.disableSearch();
}
@@ -858,7 +857,7 @@ class ThreadController extends BaseController {
void _searchEmail({UnsignedInt? limit, EmailFilterCondition? filterMessageOption}) {
if (_accountId != null && searchQuery != null) {
searchIsActive.value = true;
searchController.searchIsActive.value = true;
if(searchController.isAdvancedSearchHasApply.isFalse){
searchController.updateFilterEmail(mailbox: currentMailbox);
@@ -10,7 +10,6 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_c
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.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';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart';
@@ -66,7 +65,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
_buildVacationNotificationMessage(context),
],
_buildEmptyTrashButton(context),
_buildListButtonQuickSearchFilter(context),
if (!_responsiveUtils.isDesktop(context))
_buildMarkAsMailboxReadLoading(context),
_buildLoadingView(),
@@ -701,134 +699,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
];
}
bool supportListButtonQuickSearchFilter(BuildContext context) {
return controller.isSearchActive()
&& controller.searchIsActive.isTrue
&& _responsiveUtils.isWebDesktop(context);
}
Widget _buildListButtonQuickSearchFilter(BuildContext context) {
return Obx(() {
if (supportListButtonQuickSearchFilter(context)) {
return Padding(
padding: EdgeInsets.only(
left: _responsiveUtils.isWebDesktop(context) ? 32 : 16,
right: _responsiveUtils.isWebDesktop(context) ? 20 : 16,
bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16,
top: _responsiveUtils.isWebDesktop(context) ? 16 : 0),
child: Row(
children: QuickSearchFilter.values
.map((filter) => _buildQuickSearchFilterButton(context, filter))
.toList()),
);
} else {
return const SizedBox.shrink();
}
});
}
Widget _buildQuickSearchFilterButton(
BuildContext context, QuickSearchFilter filter) {
return Obx(() {
final quickSearchFilterSelected = controller.mailboxDashBoardController.checkQuickSearchFilterSelected(
quickSearchFilter: filter,
);
return Padding(
padding: const EdgeInsets.only(right: 8),
child: InkWell(
onTap: () {
if (filter != QuickSearchFilter.last7Days) {
controller.selectQuickSearchFilter(filter);
}
},
onTapDown: (detail) {
if (filter == QuickSearchFilter.last7Days) {
final screenSize = MediaQuery.of(context).size;
final offset = detail.globalPosition;
final position = RelativeRect.fromLTRB(
offset.dx,
offset.dy,
screenSize.width - offset.dx,
screenSize.height - offset.dy,
);
controller.openPopupReceiveTimeQuickSearchFilter(context, position,
popupMenuEmailReceiveTimeType(context,
controller.searchController.emailReceiveTimeType.value,
(receiveTime) => controller.selectReceiveTimeQuickSearchFilter(receiveTime)));
}
},
borderRadius: const BorderRadius.all(Radius.circular(10)),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected)),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
SvgPicture.asset(
filter.getIcon(_imagePaths, quickSearchFilterSelected: quickSearchFilterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
const SizedBox(width: 4),
Text(
filter.getTitle(context, receiveTimeType: controller.searchController.emailReceiveTimeType.value),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: filter.getTextStyle(quickSearchFilterSelected: quickSearchFilterSelected),
),
if (filter == QuickSearchFilter.last7Days)
... [
const SizedBox(width: 4),
SvgPicture.asset(
_imagePaths.icChevronDown,
width: 16,
height: 16,
fit: BoxFit.fill),
]
])),
),
);
});
}
List<PopupMenuEntry> popupMenuEmailReceiveTimeType(BuildContext context,
EmailReceiveTimeType? receiveTimeSelected, Function(EmailReceiveTimeType?)? onCallBack) {
return EmailReceiveTimeType.values
.map((timeType) => PopupMenuItem(
padding: EdgeInsets.zero,
child: _receiveTimeTileAction(context, receiveTimeSelected, timeType, onCallBack)))
.toList();
}
Widget _receiveTimeTileAction(
BuildContext context,
EmailReceiveTimeType? receiveTimeSelected,
EmailReceiveTimeType receiveTimeType,
Function(EmailReceiveTimeType?)? onCallBack
) {
return InkWell(
onTap: () => onCallBack?.call(receiveTimeType == receiveTimeSelected
? null
: receiveTimeType),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: SizedBox(
width: 320,
child: Row(children: [
Expanded(child: Text(
receiveTimeType.getTitle(context),
style: const TextStyle(fontSize: 17, color: Colors.black, fontWeight: FontWeight.normal))),
if (receiveTimeType == receiveTimeSelected)
const SizedBox(width: 12),
if (receiveTimeType == receiveTimeSelected)
SvgPicture.asset(_imagePaths.icFilterSelected, width: 24, height: 24, fit: BoxFit.fill),
])
),
)
);
}
Widget _buildQuickSearchFilterButtonSuggestionBox(
BuildContext context, QuickSearchFilter filter) {
return Obx(() {