From e5977aa0da581da274fbdd8d20d50d61fe3757dd Mon Sep 17 00:00:00 2001 From: ManhNT Date: Sat, 25 Jun 2022 23:14:29 +0700 Subject: [PATCH] create advanced search mobile UI --- assets/images/ic_close_advanced_search.svg | 4 + ..._filter_web.svg => ic_filter_advanced.svg} | 0 core/lib/core.dart | 1 + .../presentation/resources/image_paths.dart | 3 +- .../full_screen_action_sheet_builder.dart | 72 +++++ .../advanced_filter_controller.dart | 20 ++ .../controller/search_controller.dart | 11 + .../mailbox_dashboard_bindings.dart | 2 + .../mailbox_dashboard_view_web.dart | 6 +- .../advanced_search_filter_bottom_sheet.dart | 31 ++ .../advanced_search_filter_form.dart | 296 ++++++++++++++++++ .../icon_open_advanced_search_widget.dart | 36 +++ .../thread/presentation/thread_view.dart | 4 +- lib/l10n/intl_messages.arb | 14 +- lib/main/localizations/app_localizations.dart | 13 +- 15 files changed, 496 insertions(+), 17 deletions(-) create mode 100644 assets/images/ic_close_advanced_search.svg rename assets/images/{ic_filter_web.svg => ic_filter_advanced.svg} (100%) create mode 100644 core/lib/presentation/views/bottom_popup/full_screen_action_sheet_builder.dart create mode 100644 lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.dart create mode 100644 lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart create mode 100644 lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart diff --git a/assets/images/ic_close_advanced_search.svg b/assets/images/ic_close_advanced_search.svg new file mode 100644 index 000000000..f5c33a4af --- /dev/null +++ b/assets/images/ic_close_advanced_search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/ic_filter_web.svg b/assets/images/ic_filter_advanced.svg similarity index 100% rename from assets/images/ic_filter_web.svg rename to assets/images/ic_filter_advanced.svg diff --git a/core/lib/core.dart b/core/lib/core.dart index 1de8bb826..3a1acc5d6 100644 --- a/core/lib/core.dart +++ b/core/lib/core.dart @@ -70,6 +70,7 @@ export 'presentation/views/tab_bar/custom_tab_indicator.dart'; export 'presentation/views/quick_search/quick_search_input_form.dart'; export 'presentation/views/toast/toast_position.dart'; export 'presentation/views/toast/tmail_toast.dart'; +export 'presentation/views/bottom_popup/full_screen_action_sheet_builder.dart'; // Resources export 'presentation/resources/assets_paths.dart'; diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 826b4ea70..1167830b4 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -75,7 +75,7 @@ class ImagePaths { String get icSendMobile => _getImagePath('ic_send_mobile.svg'); String get icSendDisable => _getImagePath('ic_send_disable.svg'); String get icArrowDown => _getImagePath('ic_arrow_down.svg'); - String get icFilterWeb => _getImagePath('ic_filter_web.svg'); + String get icFilterAdvanced => _getImagePath('ic_filter_advanced.svg'); String get icMarkAllAsRead => _getImagePath('ic_mark_all_as_read.svg'); String get icRefresh => _getImagePath('ic_refresh.svg'); String get icSelectAll => _getImagePath('ic_select_all.svg'); @@ -125,6 +125,7 @@ class ImagePaths { String get icFilePdf => _getImagePath('ic_file_pdf.svg'); String get icFilePptx => _getImagePath('ic_file_pptx.svg'); String get icFileEPup => _getImagePath('ic_file_epup.svg'); + String get icCloseAdvancedSearch => _getImagePath('ic_close_advanced_search.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/core/lib/presentation/views/bottom_popup/full_screen_action_sheet_builder.dart b/core/lib/presentation/views/bottom_popup/full_screen_action_sheet_builder.dart new file mode 100644 index 000000000..6d9ed5f45 --- /dev/null +++ b/core/lib/presentation/views/bottom_popup/full_screen_action_sheet_builder.dart @@ -0,0 +1,72 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; + +typedef OnCloseActionClick = Function(); + +class FullScreenActionSheetBuilder { + final BuildContext context; + final Widget child; + + final Widget? titleWidget; + final Widget? cancelWidget; + OnCloseActionClick? onCloseActionClick; + late double _statusBarHeight = MediaQuery.of(context).padding.top; + + FullScreenActionSheetBuilder({ + required this.context, + required this.child, + this.titleWidget, + this.cancelWidget, + this.onCloseActionClick, + }); + + Future show() { + return showModalBottomSheet( + context: context, + isScrollControlled: true, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + backgroundColor: Colors.transparent, + enableDrag: false, + builder: (context) => PointerInterceptor(child: _buildBody(context)), + ); + } + + Widget _buildBody(BuildContext context) { + return SafeArea( + top: true, + bottom: false, + left: false, + right: false, + child: GestureDetector( + onTap: () => {}, + child: Padding( + padding: EdgeInsets.only(top: _statusBarHeight), + child: ClipRRect( + borderRadius: BorderRadius.only( + topRight: Radius.circular(14), + topLeft: Radius.circular(14), + ), + child: Scaffold( + appBar: AppBar( + leading: SizedBox.shrink(), + title: titleWidget, + centerTitle: true, + actions: [ + GestureDetector( + child: cancelWidget, + onTapDown: (_) { + onCloseActionClick?.call(); + Get.back(); + }, + ) + ], + ), + body: child, + ), + )), + ), + ); + } +} diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 4c05750d5..e59ec31fb 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -36,7 +36,27 @@ class AdvancedFilterController extends BaseController { _searchController.cleanSearchFilter(); } + void _updateFilterEmailFromAdvancedSearchView() { + if (fromFilterInputController.text.isNotEmpty) { + _searchEmailFilter.from.add(fromFilterInputController.text); + } + if (toFilterInputController.text.isNotEmpty) { + _searchEmailFilter.to.add(toFilterInputController.text); + } + _searchController.searchEmailFilter.value = _searchEmailFilter.copyWith( + subject: StringConvert.writeEmptyToNull(subjectFilterInputController.text), + hasKeyword: Wrapped.value( + StringConvert.writeEmptyToNull(hasKeyWordFilterInputController.text)), + notKeyword: Wrapped.value( + StringConvert.writeNullToEmpty(notKeyWordFilterInputController.text)), + mailbox: mailboxFilterSelectedFormAdvancedSearch.value, + emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value, + hasAttachment: hasAttachment.value, + ); + } + applyAdvancedSearchFilter(BuildContext context){ + _updateFilterEmailFromAdvancedSearchView(); _mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(_searchEmailFilter.text?.value)); } diff --git a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart index 2daae5fac..e62a3cf72 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/search_controller.dart @@ -19,6 +19,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_re 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/model/search/search_email_filter.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; @@ -29,6 +30,8 @@ class SearchController extends BaseController { final SaveRecentSearchInteractor _saveRecentSearchInteractor; final GetAllRecentSearchLatestInteractor _getAllRecentSearchLatestInteractor; + final ResponsiveUtils _responsiveUtils = Get.find(); + final searchInputController = TextEditingController(); final searchEmailFilter = SearchEmailFilter().obs; final searchState = SearchState.initial().obs; @@ -216,6 +219,14 @@ class SearchController extends BaseController { emailReceiveTimeType.value = receiveTimeType; } + showAdvancedFilterView(BuildContext context) async { + selectOpenAdvanceSearch(); + if (_responsiveUtils.isMobile(context)) { + await showAdvancedSearchFilterBottomSheet(context); + selectOpenAdvanceSearch(); + } + } + @override void onDone() {} diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index 8f5de6a15..6b9b57ea2 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -52,6 +52,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/mark_as 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/remove_email_drafts_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/controller/advanced_filter_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; @@ -89,6 +90,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), )); + Get.put(AdvancedFilterController()); } @override diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 2d7397dcc..b4abbc19a 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailb 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/quick_search_filter.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/app_setting.dart'; @@ -235,7 +236,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false)) .build(), const SizedBox(width: 16), - Obx(() => (ButtonBuilder(imagePaths.icFilterWeb) + Obx(() => (ButtonBuilder(imagePaths.icFilterAdvanced) ..key(const Key('button_filter_messages')) ..context(context) ..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorButtonHeaderThread)) @@ -461,7 +462,8 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { fit: BoxFit.fill), onTap: () { searchController.clearTextSearch(); - }) + }), + rightButton: IconOpenAdvancedSearchWidget(context) ), suggestionsBoxDecoration: QuickSearchSuggestionsBoxDecoration( color: Colors.white, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.dart new file mode 100644 index 000000000..01fb6feee --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_bottom_sheet.dart @@ -0,0 +1,31 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +Future showAdvancedSearchFilterBottomSheet(BuildContext context) async { + final ImagePaths _imagePaths = Get.find(); + + await FullScreenActionSheetBuilder( + context: context, + child: AdvancedSearchInputForm(), + cancelWidget: Padding( + padding: const EdgeInsets.only(right: 16), + child: SvgPicture.asset( + _imagePaths.icCloseAdvancedSearch, + color: AppColor.colorHintSearchBar, + width: 24, + height: 24, + ), + ), + titleWidget: Text( + AppLocalizations.of(context).advancedSearch, + style: const TextStyle( + fontSize: 20, + color: AppColor.colorNameEmail, + ), + ), + ).show(); +} diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart new file mode 100644 index 000000000..e3669c2ef --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart @@ -0,0 +1,296 @@ +import 'package:core/core.dart'; +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/advanced_search_filter.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +class AdvancedSearchInputForm extends GetWidget + with PopupContextMenuActionMixin { + AdvancedSearchInputForm({ + Key? key, + }) : super(key: key); + + final ImagePaths imagePaths = Get.find(); + final ResponsiveUtils responsiveUtils = Get.find(); + + @override + Widget build(BuildContext context) { + controller.initSearchFilterField(context); + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 12), + child: Material( + color: Colors.white, + child: Column( + children: [ + _buildFilterField( + textEditingController: controller.fromFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.form, + ), + _buildFilterField( + textEditingController: controller.toFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.to, + ), + _buildFilterField( + textEditingController: controller.subjectFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.subject, + ), + _buildFilterField( + textEditingController: controller.hasKeyWordFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.hasKeyword, + ), + _buildFilterField( + textEditingController: controller.notKeyWordFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.notKeyword, + ), + _buildFilterField( + textEditingController: controller.mailBoxFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.mailBox, + isSelectFormList: true, + ), + _buildFilterField( + textEditingController: controller.dateFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.date, + isSelectFormList: true, + onTap: () { + openContextMenuAction( + context, + _buildEmailReceiveTimeTypeActionTiles(context), + ); + }, + ) , + _buildCheckboxHasAttachment(context), + Row( + children: [ + Expanded( + child: _buildButton( + onAction: () { + controller.cleanSearchFilter(); + }, + colorButton: AppColor.primaryColor.withOpacity(0.14), + colorText: AppColor.primaryColor, + text: AppLocalizations.of(context).clearFilter, + ), + ), + const SizedBox(width: 12), + Expanded( + child: _buildButton( + onAction: () { + controller.applyAdvancedSearchFilter(context); + popBack(); + }, + colorButton: AppColor.primaryColor, + colorText: AppColor.primaryLightColor, + text: AppLocalizations.of(context).search, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + List _buildEmailReceiveTimeTypeActionTiles(BuildContext context) { + return EmailReceiveTimeType.values + .map( + (e) => Material( + child: PopupMenuItem( + child: Text(e.getTitle(context)), + onTap: () { + controller.dateFilterSelectedFormAdvancedSearch.value = e; + controller.dateFilterInputController.text = e.getTitle(context); + }, + ), + ), + ) + .toList(); + } + + Widget _buildFilterField({ + required BuildContext context, + required AdvancedSearchFilterField advancedSearchFilterField, + required TextEditingController textEditingController, + VoidCallback? onTap, + bool isSelectFormList = false, + }) { + final child = [ + SizedBox( + width: responsiveUtils.isMobile(context) ? null : 112, + child: Text( + advancedSearchFilterField.getTitle(context), + style: const TextStyle( + fontSize: 14, + color: AppColor.colorContentEmail, + ), + ), + ), + const Padding(padding: EdgeInsets.all(4)), + responsiveUtils.isMobile(context) + ? _buildTextField( + isSelectFormList: isSelectFormList, + onTap: onTap, + context: context, + advancedSearchFilterField: advancedSearchFilterField, + textEditingController: textEditingController, + ) : Expanded( + child: _buildTextField( + isSelectFormList: isSelectFormList, + onTap: onTap, + context: context, + advancedSearchFilterField: advancedSearchFilterField, + textEditingController: textEditingController, + ), + ) + ]; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: responsiveUtils.isMobile(context) + ? Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: child, + ) + : Row(children: child), + ); + } + + Widget _buildTextField({ + required BuildContext context, + required AdvancedSearchFilterField advancedSearchFilterField, + required TextEditingController textEditingController, + VoidCallback? onTap, + bool isSelectFormList = false, + }) => + TextField( + controller: textEditingController, + readOnly: isSelectFormList, + onTap: onTap, + decoration: InputDecoration( + filled: true, + fillColor: AppColor.loginTextFieldBackgroundColor, + contentPadding: const EdgeInsets.only( + right: 8, + left: 12, + ), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10), + ), + ), + hintText: advancedSearchFilterField.getHintText(context), + hintStyle: const TextStyle( + fontSize: 14, + color: AppColor.colorHintSearchBar, + ), + suffixIconConstraints: + const BoxConstraints(minHeight: 24, minWidth: 24), + suffixIcon: isSelectFormList + ? buildIconWeb( + icon: SvgPicture.asset( + imagePaths.icDropDown, + ), + ) + : null), + ); + + Widget _buildCheckboxHasAttachment(BuildContext context) { + return Obx( + ()=> CheckboxListTile( + contentPadding: EdgeInsets.zero, + controlAffinity: ListTileControlAffinity.leading, + value: controller.hasAttachment.value, + onChanged: (value) { + controller.hasAttachment.value = value ?? false; + }, + title: Text(AppLocalizations.of(context).hasAttachment), + ), + ); + } + + Widget _buildButton({ + required Color colorButton, + required Color colorText, + required String text, + required VoidCallback onAction, + }) { + return InkWell( + onTap: onAction, + onTapDown: (_) { + onAction.call(); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 16), + alignment: Alignment.center, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: colorButton), + child: Text( + text, + style: TextStyle(fontSize: 17, color: colorText), + ), + ), + ); + } + + Widget _buildEmailReceiveTimeTypeDropDownButton(){ + return DropdownButtonHideUnderline( + child: DropdownButton2( + isExpanded: true, + hint: Row( + children: [ + Expanded(child: Text(controller.dateFilterSelectedFormAdvancedSearch.value.name, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, color: Colors.black), + maxLines: 1, + overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis, + )), + ], + ), + items: EmailReceiveTimeType.values.map((item) => DropdownMenuItem( + value: item, + child: Text( + item.name, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.normal, color: Colors.black), + maxLines: 1, + overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis, + ), + )).toList(), + value: controller.dateFilterSelectedFormAdvancedSearch.value, + onChanged: (item) { + controller.dateFilterSelectedFormAdvancedSearch.value = item!; + }, + icon: SvgPicture.asset(imagePaths.icDropDown), + buttonPadding: const EdgeInsets.symmetric(horizontal: 12), + buttonDecoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + border: Border.all(color: AppColor.colorInputBorderCreateMailbox, width: 0.5), + color: AppColor.colorInputBackgroundCreateMailbox), + itemHeight: 44, + buttonHeight: 44, + selectedItemHighlightColor: Colors.black12, + itemPadding: const EdgeInsets.symmetric(horizontal: 12), + dropdownMaxHeight: 200, + dropdownDecoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white), + dropdownElevation: 4, + scrollbarRadius: const Radius.circular(40), + scrollbarThickness: 6, + ), + ); + } +} diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart new file mode 100644 index 000000000..d9b1e6989 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/icon_open_advanced_search_widget.dart @@ -0,0 +1,36 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/button/icon_button_web.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; + +class IconOpenAdvancedSearchWidget extends StatelessWidget { + IconOpenAdvancedSearchWidget( + this._parentContext, { + Key? key, + }) : super(key: key); + + final _imagePaths = Get.find(); + final _responsiveUtils = Get.find(); + final controller = Get.find(); + final BuildContext _parentContext; + + @override + Widget build(BuildContext context) { + return Obx( + () => buildIconWeb( + minSize: 0, + iconPadding: const EdgeInsets.only(right: 8), + icon: SvgPicture.asset(_imagePaths.icFilterAdvanced, + color: controller.isAdvancedSearchViewOpen.isTrue + ? AppColor.colorFilterMessageEnabled + : AppColor.colorFilterMessageDisabled, + width: 16, + height: 16), + onTap: _responsiveUtils.isMobile(context) ? () {controller.showAdvancedFilterView(_parentContext);} : null), + ); + } +} diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 4162108bd..50ca707f4 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_sea 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/icon_open_advanced_search_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; @@ -226,7 +227,8 @@ class ThreadView extends GetWidget with AppLoaderMixin, fit: BoxFit.fill), onTap: () { controller.clearTextSearch(); - }) + }), + rightButton: IconOpenAdvancedSearchWidget(context) ), suggestionsBoxDecoration: const QuickSearchSuggestionsBoxDecoration( color: Colors.white, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index edde0249c..3c9154991 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-06-24T14:16:53.170960", + "@@last_modified": "2022-06-25T22:39:15.113430", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -1324,12 +1324,6 @@ "placeholders_order": [], "placeholders": {} }, - "anyTime": "Any time", - "@anyTime": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "last30Days": "Last 30 days", "@last30Days": { "type": "text", @@ -1495,5 +1489,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "advancedSearch": "Advanced search", + "@advancedSearch": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 1512eb466..389459f37 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -1357,12 +1357,6 @@ class AppLocalizations { name: 'showingResultsFor'); } - String get anyTime { - return Intl.message( - 'Any time', - name: 'anyTime'); - } - String get last30Days { return Intl.message( 'Last 30 days', @@ -1537,4 +1531,11 @@ class AppLocalizations { name: 'clearFilter', ); } + + String get advancedSearch { + return Intl.message( + 'Advanced search', + name: 'advancedSearch', + ); + } } \ No newline at end of file