diff --git a/env.file b/env.file index 71638e979..a66dad48f 100644 --- a/env.file +++ b/env.file @@ -1,3 +1,3 @@ -SERVER_URL=http://localhost +SERVER_URL=https://jmap.upn.integration-open-paas.org DOMAIN_REDIRECT_URL=http://localhost:3000 WEB_OIDC_CLIENT_ID=teammail-web \ No newline at end of file diff --git a/lib/features/login/domain/usecases/check_oidc_is_available_interactor.dart b/lib/features/login/domain/usecases/check_oidc_is_available_interactor.dart index 29797f37e..89872ec78 100644 --- a/lib/features/login/domain/usecases/check_oidc_is_available_interactor.dart +++ b/lib/features/login/domain/usecases/check_oidc_is_available_interactor.dart @@ -13,7 +13,7 @@ class CheckOIDCIsAvailableInteractor { try { final result = await _oidcRepository.checkOIDCIsAvailable(oidcRequest); log('CheckOIDCIsAvailableInteractor::execute(): result: $result'); - return Right(CheckOIDCIsAvailableSuccess(result)); + return Left(CheckOIDCIsAvailableFailure('aaaa')); } catch (e) { log('CheckOIDCIsAvailableInteractor::execute(): ERROR: $e'); return Left(CheckOIDCIsAvailableFailure(e)); 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 e59ec31fb..2fa72f0e6 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -73,11 +73,6 @@ class AdvancedFilterController extends BaseController { hasAttachment.value = _searchEmailFilter.hasAttachment; } - @override - void onInit() { - super.onInit(); - // TODO: implement onDone - } @override void onDone() { // TODO: implement onDone 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 index 7f7187795..f8ea6b238 100644 --- 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 @@ -1,5 +1,4 @@ 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'; @@ -7,8 +6,8 @@ import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixi 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'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/drop_down_button_filter_widget.dart'; class AdvancedSearchInputForm extends GetWidget with PopupContextMenuActionMixin { @@ -16,8 +15,8 @@ class AdvancedSearchInputForm extends GetWidget Key? key, }) : super(key: key); - final ImagePaths imagePaths = Get.find(); - final ResponsiveUtils responsiveUtils = Get.find(); + final ImagePaths _imagePaths = Get.find(); + final ResponsiveUtils _responsiveUtils = Get.find(); @override Widget build(BuildContext context) { @@ -57,46 +56,19 @@ class AdvancedSearchInputForm extends GetWidget advancedSearchFilterField: AdvancedSearchFilterField.mailBox, isSelectFormList: true, ), - // _buildFilterField( - // textEditingController: controller.dateFilterInputController, - // context: context, - // advancedSearchFilterField: AdvancedSearchFilterField.date, - // isSelectFormList: true, - // onTap: () { - // openContextMenuAction( - // context, - // _buildEmailReceiveTimeTypeActionTiles(context), - // ); - // }, - // ), - _buildEmailReceiveTimeTypeDropDownButton(), - _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, - ), - ), - ], + _buildFilterField( + textEditingController: controller.dateFilterInputController, + context: context, + advancedSearchFilterField: AdvancedSearchFilterField.date, + isSelectFormList: true, + onTap: () { + openContextMenuAction( + context, + _buildEmailReceiveTimeTypeActionTiles(context), + ); + }, ), + const AdvancedSearchFilterFormBottomView() ], ), ); @@ -107,7 +79,21 @@ class AdvancedSearchInputForm extends GetWidget .map( (e) => Material( child: PopupMenuItem( - child: Text(e.getTitle(context)), + child: Row(children: [ + const SizedBox(width: 12), + Expanded( + child: Text(e.getTitle(context), + style: const TextStyle( + fontSize: 15, + color: Colors.black, + fontWeight: FontWeight.w500))), + if (e == + controller.dateFilterSelectedFormAdvancedSearch.value) ...[ + const SizedBox(width: 12), + SvgPicture.asset(_imagePaths.icFilterSelected, + width: 16, height: 16, fit: BoxFit.fill), + ] + ]), onTap: () { controller.dateFilterSelectedFormAdvancedSearch.value = e; controller.dateFilterInputController.text = e.getTitle(context); @@ -127,7 +113,7 @@ class AdvancedSearchInputForm extends GetWidget }) { final child = [ SizedBox( - width: responsiveUtils.isMobile(context) ? null : 112, + width: _responsiveUtils.isMobile(context) ? null : 112, child: Text( advancedSearchFilterField.getTitle(context), style: const TextStyle( @@ -137,7 +123,7 @@ class AdvancedSearchInputForm extends GetWidget ), ), const Padding(padding: EdgeInsets.all(4)), - responsiveUtils.isMobile(context) + _responsiveUtils.isMobile(context) ? _buildTextField( isSelectFormList: isSelectFormList, onTap: onTap, @@ -146,7 +132,7 @@ class AdvancedSearchInputForm extends GetWidget textEditingController: textEditingController, ) : Expanded( - child: _buildTextField( + child: _buildTextFieldFilterForWeb( isSelectFormList: isSelectFormList, onTap: onTap, context: context, @@ -157,147 +143,75 @@ class AdvancedSearchInputForm extends GetWidget ]; return Padding( padding: const EdgeInsets.symmetric(vertical: 8), - child: responsiveUtils.isMobile(context) + child: _responsiveUtils.isMobile(context) ? Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: child, ) - : Row(children: child), + : SizedBox(height: 44, child: Row(children: child)), ); } + Widget _buildTextFieldFilterForWeb({ + required BuildContext context, + required AdvancedSearchFilterField advancedSearchFilterField, + required TextEditingController textEditingController, + VoidCallback? onTap, + bool isSelectFormList = false, + }) { + switch (advancedSearchFilterField) { + case AdvancedSearchFilterField.date: + return const DateDropDownButton(); + default: + return _buildTextField( + isSelectFormList: isSelectFormList, + onTap: onTap, + context: context, + advancedSearchFilterField: advancedSearchFilterField, + textEditingController: textEditingController, + ); + } + } + 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), + return TextField( + controller: textEditingController, + readOnly: isSelectFormList, + onTap: onTap, + decoration: InputDecoration( + filled: true, + fillColor: AppColor.loginTextFieldBackgroundColor, + contentPadding: const EdgeInsets.only( + right: 8, + left: 12, ), - ), - ); - } - - 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, - )), - ], + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10), + ), ), - 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, + 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, ), ); } diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart new file mode 100644 index 000000000..5678deb53 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form_bottom_view.dart @@ -0,0 +1,94 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +class AdvancedSearchFilterFormBottomView + extends GetWidget { + const AdvancedSearchFilterFormBottomView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final ResponsiveUtils _responsiveUtils = Get.find(); + + return Padding( + padding: EdgeInsets.only(top: _responsiveUtils.isMobile(context) ? 8 : 20), + child: Column( + children: [ + if (_responsiveUtils.isMobile(context)) + _buildCheckboxHasAttachment(context), + Row( + mainAxisAlignment: _responsiveUtils.isMobile(context) + ? MainAxisAlignment.spaceEvenly + : MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.max, + children: [ + if (!_responsiveUtils.isMobile(context)) + Expanded(child: _buildCheckboxHasAttachment(context)), + _buildButton( + onAction: () { + controller.cleanSearchFilter(); + }, + colorButton: AppColor.primaryColor.withOpacity(0.14), + colorText: AppColor.primaryColor, + text: AppLocalizations.of(context).clearFilter, + ), + const SizedBox(width: 12), + _buildButton( + onAction: () { + controller.applyAdvancedSearchFilter(context); + popBack(); + }, + colorButton: AppColor.primaryColor, + colorText: AppColor.primaryLightColor, + text: AppLocalizations.of(context).search, + ), + ], + ), + ], + ), + ); + } + + 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( + constraints: const BoxConstraints(maxWidth: 154), + 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), + ), + ), + ); + } +} diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart index 7055294ed..3fefce21f 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_overlay.dart @@ -7,20 +7,23 @@ class AdvancedSearchFilterOverlay extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - width: 660, - height: 558, - padding: const EdgeInsets.all(32), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), - boxShadow: const [ - BoxShadow( - color: AppColor.colorShadowBgContentEmail, - spreadRadius: 1, blurRadius: 1, offset: Offset(0, 0.5)), - ] + return Padding( + padding: const EdgeInsets.only(top: 8), + child: Container( + width: 660, + height: 558, + padding: const EdgeInsets.all(32), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: const [ + BoxShadow( + color: AppColor.colorShadowBgContentEmail, + spreadRadius: 1, blurRadius: 1, offset: Offset(0, 0.5)), + ] + ), + child: AdvancedSearchInputForm(), ), - child: AdvancedSearchInputForm(), ); } } diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/drop_down_button_filter_widget.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/drop_down_button_filter_widget.dart new file mode 100644 index 000000000..d7b40b6f1 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/drop_down_button_filter_widget.dart @@ -0,0 +1,105 @@ +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:jmap_dart_client/jmap/mail/mailbox/mailbox.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/email_receive_time_type.dart'; + +class DateDropDownButton extends GetWidget { + const DateDropDownButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Obx( + () => _buildDropDownButton( + items: EmailReceiveTimeType.values, + itemSelected: controller.dateFilterSelectedFormAdvancedSearch.value, + context: context, + onChanged: (item) { + controller.dateFilterSelectedFormAdvancedSearch.value = item!; + }, + ), + ); + } +} + +class MailBoxDropDownButton extends StatelessWidget { + const MailBoxDropDownButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} + + +Widget _buildDropDownButton({ + required List items, + required T itemSelected, + required BuildContext context, + required Function(T?)? onChanged, +}) { + final ImagePaths _imagePaths = Get.find(); + + return DropdownButtonHideUnderline( + child: DropdownButton2( + isExpanded: true, + items: items + .map((item) => DropdownMenuItem( + value: item, + child: Text( + StringConvert.writeNullToEmpty(_getTextItemDropdown( + item: item, + context: context, + )), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.normal, + color: Colors.black), + maxLines: 1, + overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis, + ), + )) + .toList(), + value: itemSelected, + onChanged: onChanged, + 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: AppColor.primaryColor.withOpacity(0.12), + 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, + ), + ); +} + +String? _getTextItemDropdown( + {required T item, required BuildContext context}) { + if (item is EmailReceiveTimeType) { + return item.getTitle(context); + } + + if (item is Mailbox) { + return item.name?.name; + } + + return null; +} 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 index 9796d41c6..9dd9bf9fa 100644 --- 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 @@ -1,6 +1,5 @@ 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'; diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 50ca707f4..797b5d459 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -1,5 +1,6 @@ import 'package:core/core.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/model.dart'; @@ -10,6 +11,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/advanced_search_filter_overlay.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'; @@ -181,153 +183,167 @@ class ThreadView extends GetWidget with AppLoaderMixin, borderRadius: BorderRadius.all(Radius.circular(10)), color: AppColor.colorBgSearchBar), height: 45, - child: QuickSearchInputForm( - textFieldConfiguration: QuickSearchTextFieldConfiguration( - controller: controller.searchController.searchInputController, - autofocus: true, - focusNode: controller.searchController.searchFocus, - textInputAction: TextInputAction.done, - onSubmitted: (keyword) { - if (keyword.trim().isNotEmpty) { - controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); - } - controller.mailboxDashBoardController.searchEmail(context, keyword); - }, - decoration: InputDecoration( - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - contentPadding: EdgeInsets.zero, - hintText: AppLocalizations.of(context).search_mail, - hintStyle: const TextStyle( - color: AppColor.colorHintSearchBar, - fontSize: 17.0), - labelStyle: const TextStyle( - color: AppColor.colorHintSearchBar, - fontSize: 17.0) - ), - leftButton: buildIconWeb( - icon: SvgPicture.asset( - _imagePaths.icSearchBar, - width: 16, - height: 16, - fit: BoxFit.fill), - onTap: () { - final keyword = controller.currentTextSearch; - if (keyword.trim().isNotEmpty) { - controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); - } - controller.mailboxDashBoardController.searchEmail(context, keyword); - }), - clearTextButton: buildIconWeb( - icon: SvgPicture.asset( - _imagePaths.icClearTextSearch, - width: 16, - height: 16, - fit: BoxFit.fill), - onTap: () { - controller.clearTextSearch(); - }), - rightButton: IconOpenAdvancedSearchWidget(context) + child: PortalTarget( + visible: controller.searchController.isAdvancedSearchViewOpen.isTrue, + anchor: const Aligned( + follower: Alignment.topLeft, + target: Alignment.bottomLeft, + widthFactor: 1, + backup: Aligned( + follower: Alignment.bottomLeft, + target: Alignment.topLeft, + widthFactor: 1, ), - suggestionsBoxDecoration: const QuickSearchSuggestionsBoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.all(Radius.circular(16)), - ), - debounceDuration: const Duration(milliseconds: 500), - hideSuggestionsBox: _responsiveUtils.isScreenWithShortestSide(context), - listActionButton: const [ - QuickSearchFilter.hasAttachment, - QuickSearchFilter.last7Days, - QuickSearchFilter.fromMe, - ], - actionButtonBuilder: (context, filterAction) { - if (filterAction is QuickSearchFilter) { - return _buildQuickSearchFilterButtonSuggestionBox( - context, - filterAction); - } - return const SizedBox.shrink(); - }, - buttonActionCallback: (filterAction) { - if (filterAction is QuickSearchFilter) { - controller.mailboxDashBoardController.selectQuickSearchFilter( - quickSearchFilter: filterAction, - fromSuggestionBox: true, - ); - } - }, - listActionPadding: const EdgeInsets.only( - left: 24, - top: 24, - right: 24, - bottom: 16), - titleHeaderRecent: Padding( - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), - child: Text(AppLocalizations.of(context).recent, - style: const TextStyle(fontSize: 13.0, - color: AppColor.colorTextButtonHeaderThread, - fontWeight: FontWeight.w500) - ) - ), - buttonShowAllResult: (context, keyword) { - if (keyword is String) { - return InkWell( - onTap: () { + ), + portalFollower: _responsiveUtils.isMobile(context) ? const SizedBox.shrink() : const AdvancedSearchFilterOverlay(), + child: QuickSearchInputForm( + textFieldConfiguration: QuickSearchTextFieldConfiguration( + controller: controller.searchController.searchInputController, + autofocus: true, + focusNode: controller.searchController.searchFocus, + textInputAction: TextInputAction.done, + onSubmitted: (keyword) { if (keyword.trim().isNotEmpty) { controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); } controller.mailboxDashBoardController.searchEmail(context, keyword); }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), - child: Row(children: [ - Text(AppLocalizations.of(context).showingResultsFor, - style: const TextStyle(fontSize: 13.0, - color: AppColor.colorTextButtonHeaderThread, - fontWeight: FontWeight.w500) - ), - const SizedBox(width: 4), - Expanded(child: Text('"$keyword"', - style: const TextStyle( - fontSize: 13.0, - color: Colors.black, - fontWeight: FontWeight.w500))) - ]) + decoration: InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + contentPadding: EdgeInsets.zero, + hintText: AppLocalizations.of(context).search_mail, + hintStyle: const TextStyle( + color: AppColor.colorHintSearchBar, + fontSize: 17.0), + labelStyle: const TextStyle( + color: AppColor.colorHintSearchBar, + fontSize: 17.0) ), - ); - } else { + leftButton: buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icSearchBar, + width: 16, + height: 16, + fit: BoxFit.fill), + onTap: () { + final keyword = controller.currentTextSearch; + if (keyword.trim().isNotEmpty) { + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); + } + controller.mailboxDashBoardController.searchEmail(context, keyword); + }), + clearTextButton: buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icClearTextSearch, + width: 16, + height: 16, + fit: BoxFit.fill), + onTap: () { + controller.clearTextSearch(); + }), + rightButton: IconOpenAdvancedSearchWidget(context) + ), + suggestionsBoxDecoration: const QuickSearchSuggestionsBoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(16)), + ), + debounceDuration: const Duration(milliseconds: 500), + hideSuggestionsBox: _responsiveUtils.isScreenWithShortestSide(context), + listActionButton: const [ + QuickSearchFilter.hasAttachment, + QuickSearchFilter.last7Days, + QuickSearchFilter.fromMe, + ], + actionButtonBuilder: (context, filterAction) { + if (filterAction is QuickSearchFilter) { + return _buildQuickSearchFilterButtonSuggestionBox( + context, + filterAction); + } return const SizedBox.shrink(); - } - }, - loadingBuilder: (context) => Padding( - padding: const EdgeInsets.only(bottom: 16), - child: loadingWidget, - ), - fetchRecentActionCallback: (pattern) async { - return controller.searchController.getAllRecentSearchAction(pattern); - }, - itemRecentBuilder: (context, recent) { - return RecentSearchItemTileWidget(recent); - }, - onRecentSelected: (recent) { - controller.searchController.updateTextSearch(recent.value); - controller.mailboxDashBoardController.searchEmail(context, recent.value); - }, - suggestionsCallback: (pattern) async { - return controller.mailboxDashBoardController.quickSearchEmails(); - }, - itemBuilder: (context, email) { - return EmailQuickSearchItemTileWidget( - email, - controller.currentMailbox); - }, - onSuggestionSelected: (presentationEmail) async { - controller.pressEmailAction( - context, - EmailActionType.preview, - presentationEmail); - }), + }, + buttonActionCallback: (filterAction) { + if (filterAction is QuickSearchFilter) { + controller.searchController.selectQuickSearchFilter( + quickSearchFilter: filterAction, + fromSuggestionBox: true, + ); + } + }, + listActionPadding: const EdgeInsets.only( + left: 24, + top: 24, + right: 24, + bottom: 16), + titleHeaderRecent: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), + child: Text(AppLocalizations.of(context).recent, + style: const TextStyle(fontSize: 13.0, + color: AppColor.colorTextButtonHeaderThread, + fontWeight: FontWeight.w500) + ) + ), + buttonShowAllResult: (context, keyword) { + if (keyword is String) { + return InkWell( + onTap: () { + if (keyword.trim().isNotEmpty) { + controller.searchController.saveRecentSearch(RecentSearch.now(keyword)); + } + controller.mailboxDashBoardController.searchEmail(context, keyword); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), + child: Row(children: [ + Text(AppLocalizations.of(context).showingResultsFor, + style: const TextStyle(fontSize: 13.0, + color: AppColor.colorTextButtonHeaderThread, + fontWeight: FontWeight.w500) + ), + const SizedBox(width: 4), + Expanded(child: Text('"$keyword"', + style: const TextStyle( + fontSize: 13.0, + color: Colors.black, + fontWeight: FontWeight.w500))) + ]) + ), + ); + } else { + return const SizedBox.shrink(); + } + }, + loadingBuilder: (context) => Padding( + padding: const EdgeInsets.only(bottom: 16), + child: loadingWidget, + ), + fetchRecentActionCallback: (pattern) async { + return controller.searchController.getAllRecentSearchAction(pattern); + }, + itemRecentBuilder: (context, recent) { + return RecentSearchItemTileWidget(recent); + }, + onRecentSelected: (recent) { + controller.searchController.updateTextSearch(recent.value); + controller.mailboxDashBoardController.searchEmail(context, recent.value); + }, + suggestionsCallback: (pattern) async { + return controller.searchController.quickSearchEmails(); + }, + itemBuilder: (context, email) { + return EmailQuickSearchItemTileWidget( + email, + controller.currentMailbox); + }, + onSuggestionSelected: (presentationEmail) async { + controller.pressEmailAction( + context, + EmailActionType.preview, + presentationEmail); + }), + ), )), const SizedBox(width: 16), ]