TF-933 GoTo new Search View on Tablet/Mobile of Web version

This commit is contained in:
dab246
2022-09-19 15:59:28 +07:00
committed by Dat H. Pham
parent eb615a7584
commit 79d47fbab3
3 changed files with 53 additions and 289 deletions
@@ -708,14 +708,14 @@ class EmailController extends BaseController with AppLoaderMixin {
void closeEmailView(BuildContext context) { void closeEmailView(BuildContext context) {
mailboxDashBoardController.clearSelectedEmail(); mailboxDashBoardController.clearSelectedEmail();
if (BuildUtils.isWeb) { if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD); if (responsiveUtils.isWebDesktop(context)) {
} else {
if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
mailboxDashBoardController.dispatchRoute(AppRoutes.SEARCH_EMAIL);
} else {
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD); mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
} else {
mailboxDashBoardController.dispatchRoute(AppRoutes.SEARCH_EMAIL);
} }
} else {
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
} }
} }
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/se
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/top_bar_thread_selection.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/top_bar_thread_selection.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/features/search/presentation/search_email_view.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -156,21 +157,42 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
)) ))
]), ]),
), ),
tabletLarge: Row( tabletLarge: Obx(() {
crossAxisAlignment: CrossAxisAlignment.start, switch(controller.routePath.value) {
children: [ case AppRoutes.SEARCH_EMAIL:
SizedBox( return SearchEmailView();
width: ResponsiveUtils.defaultSizeLeftMenuMobile, case AppRoutes.EMAIL:
child: ThreadView()), return controller.searchController.isSearchEmailRunning
Expanded(child: EmailView()), ? EmailView()
], : Row(
), crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()),
Expanded(child: EmailView()),
],
);
default:
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: ResponsiveUtils.defaultSizeLeftMenuMobile,
child: ThreadView()),
Expanded(child: EmailView()),
],
);
}
}),
mobile: Obx(() { mobile: Obx(() {
switch(controller.routePath.value) { switch(controller.routePath.value) {
case AppRoutes.THREAD: case AppRoutes.THREAD:
return ThreadView(); return ThreadView();
case AppRoutes.EMAIL: case AppRoutes.EMAIL:
return EmailView(); return EmailView();
case AppRoutes.SEARCH_EMAIL:
return SearchEmailView();
default: default:
return ThreadView(); return ThreadView();
} }
+16 -274
View File
@@ -8,16 +8,10 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; 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/mixin/filter_email_popup_menu_mixin.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/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/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.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/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/domain/state/search_more_email_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
@@ -89,35 +83,22 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
} }
Widget _buildSearchBarView(BuildContext context) { Widget _buildSearchBarView(BuildContext context) {
if (BuildUtils.isWeb) { return Obx(() {
return Obx(() => Container( if (!controller.searchController.isSearchActive()) {
color: Colors.white, return Container(
padding: EdgeInsets.symmetric( color: Colors.white,
horizontal: 16, padding: EdgeInsets.symmetric(
vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0), horizontal: 16,
margin: const EdgeInsets.only( vertical: _responsiveUtils.isWebNotDesktop(context) ? 8 : 0),
bottom: !BuildUtils.isWeb ? 16 : 0), margin: const EdgeInsets.only(
child: !controller.isSearchActive() bottom: !BuildUtils.isWeb ? 16 : 0),
? _buildSearchFormInActive(context) child: SearchBarView(_imagePaths,
: _buildSearchFormActive(context))); hintTextSearch: AppLocalizations.of(context).search_emails,
} else { onOpenSearchViewAction: () => controller.goToSearchView()));
return Obx(() { } else {
if (!controller.searchController.isSearchActive()) { 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()));
} else {
return const SizedBox.shrink();
}
});
}
} }
Widget _buildVacationNotificationMessage(BuildContext context) { Widget _buildVacationNotificationMessage(BuildContext context) {
@@ -162,215 +143,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
}); });
} }
Widget _buildSearchFormInActive(BuildContext context) {
return PortalTarget(
visible: controller.searchController.isAdvancedSearchViewOpen.isTrue,
portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => controller.searchController.selectOpenAdvanceSearch()),
child: PortalTarget(
visible: controller.searchController.isAdvancedSearchViewOpen.isTrue,
anchor: const Aligned(
follower: Alignment.topLeft,
target: Alignment.bottomLeft,
widthFactor: 1,
backup: Aligned(
follower: Alignment.topLeft,
target: Alignment.bottomLeft,
widthFactor: 1,
),
),
portalFollower: _responsiveUtils.isMobile(context)
? const SizedBox.shrink()
: const AdvancedSearchFilterOverlay(),
child: SearchBarView(
_imagePaths,
heightSearchBar: 45,
hintTextSearch: AppLocalizations.of(context).search_emails,
onOpenSearchViewAction: () => controller.enableSearch(context),
),
),
);
}
Widget _buildSearchFormActive(BuildContext context) {
return Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(16)),
color: AppColor.colorBgSearchBar),
height: 45,
child: PortalTarget(
visible: controller.searchController.isAdvancedSearchViewOpen.isTrue,
portalFollower: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => controller.searchController.selectOpenAdvanceSearch()),
child: PortalTarget(
visible: controller.searchController.isAdvancedSearchViewOpen.isTrue,
anchor: const Aligned(
follower: Alignment.topLeft,
target: Alignment.bottomLeft,
widthFactor: 1,
backup: Aligned(
follower: Alignment.topLeft,
target: Alignment.bottomLeft,
widthFactor: 1,
),
),
portalFollower: _responsiveUtils.isMobile(context)
? const SizedBox.shrink()
: const AdvancedSearchFilterOverlay(),
child: QuickSearchInputForm<PresentationEmail, RecentSearch>(
maxHeight: 45,
suggestionsBoxVerticalOffset: 0.0,
textFieldConfiguration: QuickSearchTextFieldConfiguration(
controller: controller.searchController.searchInputController,
autofocus: true,
enabled: controller.searchController.isAdvancedSearchViewOpen.isFalse,
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();
}),
),
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, right: 24, top: 20, bottom: 12),
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 {
controller.searchController.updateFilterEmail(text: SearchQuery(pattern));
return controller.mailboxDashBoardController.quickSearchEmails();
},
itemBuilder: (context, email) {
return EmailQuickSearchItemTileWidget(
email,
controller.currentMailbox);
},
onSuggestionSelected: (presentationEmail) async {
controller.pressEmailAction(
context,
EmailActionType.preview,
presentationEmail);
}),
),
),
);
}
Widget _buildAppBarNormal(BuildContext context) { Widget _buildAppBarNormal(BuildContext context) {
return Obx(() { return Obx(() {
return AppBarThreadWidgetBuilder( return AppBarThreadWidgetBuilder(
@@ -713,36 +485,6 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
]; ];
} }
Widget _buildQuickSearchFilterButtonSuggestionBox(
BuildContext context, QuickSearchFilter filter) {
return Obx(() {
final quickSearchFilterSelected = controller.mailboxDashBoardController.checkQuickSearchFilterSelected(
quickSearchFilter: filter,
);
return Chip(
labelPadding: const EdgeInsets.only(top: 2, bottom: 2, right: 10),
label: Text(
filter.getTitle(context),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: filter.getTextStyle(quickSearchFilterSelected: quickSearchFilterSelected),
),
avatar: SvgPicture.asset(
filter.getIcon(_imagePaths, quickSearchFilterSelected: quickSearchFilterSelected),
width: 16,
height: 16,
fit: BoxFit.fill),
labelStyle: filter.getTextStyle(quickSearchFilterSelected: quickSearchFilterSelected),
backgroundColor: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: BorderSide(color: filter.getBackgroundColor(quickSearchFilterSelected: quickSearchFilterSelected)),
),
);
});
}
Widget _buildMarkAsMailboxReadLoading(BuildContext context) { Widget _buildMarkAsMailboxReadLoading(BuildContext context) {
return Obx(() { return Obx(() {
final viewState = controller.mailboxDashBoardController.viewStateMarkAsReadMailbox.value; final viewState = controller.mailboxDashBoardController.viewStateMarkAsReadMailbox.value;