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),
]
])
),
)
);
}
}