From 772d51608e3741b1e4e084286bbba90276b66575 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Thu, 20 Oct 2022 18:05:20 +0700 Subject: [PATCH] TF-1083: add drag multiple mail --- .../presentation/thread_controller.dart | 13 +++ .../thread/presentation/thread_view.dart | 93 ++++++++++--------- lib/l10n/intl_messages.arb | 10 ++ lib/main/localizations/app_localizations.dart | 8 ++ 4 files changed, 80 insertions(+), 44 deletions(-) diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 6f1d14dea..26696049e 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -95,6 +95,7 @@ class ThreadController extends BaseController { final MoveToMailboxInteractor _moveToMailboxInteractor; final emailList = [].obs; + final listEmailDrag = [].obs; bool canLoadMore = true; bool canSearchMore = true; @@ -1390,4 +1391,16 @@ class ThreadController extends BaseController { SearchEmailBindings().dependencies(); mailboxDashBoardController.dispatchRoute(AppRoutes.SEARCH_EMAIL); } + + void calculateDragValue(PresentationEmail? currentPresentationEmail) { + if(currentPresentationEmail != null) { + if(mailboxDashBoardController.listEmailSelected.contains(currentPresentationEmail)){ + listEmailDrag.clear(); + listEmailDrag.addAll(mailboxDashBoardController.listEmailSelected); + } else { + listEmailDrag.clear(); + listEmailDrag.add(currentPresentationEmail); + } + } + } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 68546561e..b399e0583 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -332,52 +332,55 @@ class ThreadView extends GetWidget with AppLoaderMixin, key: const PageStorageKey('list_presentation_email_in_threads'), itemExtent: _getItemExtent(context), itemCount: listPresentationEmail.length, - itemBuilder: (context, index) => - Draggable>( - data: [listPresentationEmail[index]], - child: Obx(() => (EmailTileBuilder( + itemBuilder: (context, index) { + return Draggable>( + data: controller.listEmailDrag, + child: (EmailTileBuilder( + context, + listPresentationEmail[index], + controller.mailboxDashBoardController.currentSelectMode.value, + controller.searchController.searchState.value.searchStatus, + controller.searchQuery, + mailboxCurrent: controller.searchController.isSearchEmailRunning + ? listPresentationEmail[index].findMailboxContain( + controller.mailboxDashBoardController.mapMailboxById) + : controller.currentMailbox, + advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue) + ..addOnPressEmailActionClick((action, email) => + controller.pressEmailAction( + context, + action, + email, + mailboxContain: controller.searchController.isSearchEmailRunning + ? email.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById) + : controller.currentMailbox)) + ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) + ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) + : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))) + .build(), + feedback: _buildFeedBackWidget(context), + childWhenDragging: (EmailTileBuilder( context, listPresentationEmail[index], controller.mailboxDashBoardController.currentSelectMode.value, controller.searchController.searchState.value.searchStatus, controller.searchQuery, mailboxCurrent: controller.searchController.isSearchEmailRunning - ? listPresentationEmail[index].findMailboxContain( - controller.mailboxDashBoardController.mapMailboxById) - : controller.currentMailbox, - advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue) - ..addOnPressEmailActionClick((action, email) => - controller.pressEmailAction( - context, - action, - email, - mailboxContain: controller.searchController.isSearchEmailRunning - ? email.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById) - : controller.currentMailbox)) - ..addOnMoreActionClick((email, position) => _responsiveUtils.isMobile(context) - ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) - : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email)))) - .build()), - feedback: _buildFeedBackWidget(), - childWhenDragging: (EmailTileBuilder( - context, - listPresentationEmail[index], - controller.mailboxDashBoardController.currentSelectMode.value, - controller.searchController.searchState.value.searchStatus, - controller.searchQuery, - mailboxCurrent: controller.searchController.isSearchEmailRunning - ? listPresentationEmail[index].findMailboxContain( - controller.mailboxDashBoardController.mapMailboxById) - : controller.currentMailbox, - advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue, - isDrag: true)) - .build(), - dragAnchorStrategy: pointerDragAnchorStrategy, - )) + ? listPresentationEmail[index].findMailboxContain( + controller.mailboxDashBoardController.mapMailboxById) + : controller.currentMailbox, + advancedSearchActivated: controller.searchController.isAdvancedSearchHasApply.isTrue, isDrag: true)) + .build(), + dragAnchorStrategy: pointerDragAnchorStrategy, + onDragStarted: () { + controller.calculateDragValue(listPresentationEmail[index]); + }, + ); + }) ); } - Widget _buildFeedBackWidget() { + Widget _buildFeedBackWidget(BuildContext context) { return SizedBox( height: 60, child: Material( @@ -395,14 +398,16 @@ class ThreadView extends GetWidget with AppLoaderMixin, color: Colors.white, ), const SizedBox(width: 10), - const Text( - 'Move 1 conversation', - overflow: TextOverflow.clip, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + Obx( + () => Text( + AppLocalizations.of(context).moveConversation(controller.listEmailDrag.length), + overflow: TextOverflow.clip, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + maxLines: 1, ), - maxLines: 1, ), ], ), diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 1edcd578b..5ac6cbe41 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -2373,5 +2373,15 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "moveConversation": "Move {numberOfConversation} conversation", + "@moveConversation": { + "type": "text", + "placeholders_order": [ + "numberOfConversation" + ], + "placeholders": { + "numberOfConversation": {} + } } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 6345a7d9c..be5e2aa44 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2447,4 +2447,12 @@ class AppLocalizations { 'A read receipt has been sent.', name: 'toastMessageSendReceiptSuccess'); } + + String moveConversation(int numberOfConversation) { + return Intl.message( + 'Move $numberOfConversation conversation', + name: 'moveConversation', + args: [numberOfConversation] + ); + } } \ No newline at end of file