From 165bc1c0dfd6461ade174a3c94983815ed80e6d1 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 14:36:14 +0700 Subject: [PATCH 01/45] update fluxc --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ce02a55b13e..bb926db336c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -86,7 +86,7 @@ stripe-terminal = '3.7.1' tinder-statemachine = '0.2.0' wiremock = '2.26.3' wordpress-aztec = 'v2.1.4' -wordpress-fluxc = 'trunk-7cb493915ef7e0ee6eff1a4ca3b9872e178ee73e' +wordpress-fluxc = 'trunk-242d0b6392f790dcb19f3a52bfa87138f9cc8127' wordpress-login = '1.19.0' wordpress-libaddressinput = '0.0.2' wordpress-mediapicker = '0.3.1' From 88b462c048a6da3e33f8121d01d64338e08579f6 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 14:46:46 +0700 Subject: [PATCH 02/45] Start event handling for when update status menu item is tapped. --- .../android/ui/orders/list/OrderListFragment.kt | 10 +++++++++- .../android/ui/orders/list/OrderListViewModel.kt | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index b2794d2b095..4f6ea8fa206 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -604,6 +604,10 @@ class OrderListFragment : is OrderListViewModel.OrderListEvent.RetryLoadingOrders -> refreshOrders() is OrderListViewModel.OrderListEvent.OpenOrderCreationWithSimplePaymentsMigration -> openOrderCreationFragment(indicateSimplePaymentsMigration = true) + is OrderListViewModel.OrderListEvent.ShowUpdateStatusDialog -> { + showBulkUpdateStatusDialog(event.orderIds) + } + else -> event.isHandled = false } } @@ -700,6 +704,10 @@ class OrderListFragment : } } + private fun showBulkUpdateStatusDialog(productsIds: List) { + TODO() + } + private fun handleListState(orderListState: OrderListViewModel.ViewState.OrderListState) { when (orderListState) { OrderListViewModel.ViewState.OrderListState.Selecting -> { @@ -1145,7 +1153,7 @@ class OrderListFragment : override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_orderlist_update_status -> { - // todo: implement bulk update status + viewModel.onBulkUpdateStatusClicked(tracker?.selection?.toList().orEmpty()) true } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index 1f64d19e0d2..6ac0d650927 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -916,6 +916,10 @@ class OrderListViewModel @Inject constructor( ) } + fun onBulkUpdateStatusClicked(orderIds: List) { + triggerEvent(OrderListEvent.ShowUpdateStatusDialog(orderIds)) + } + sealed class OrderListEvent : Event() { data class ShowErrorSnack(@StringRes val messageRes: Int) : OrderListEvent() object ShowOrderFilters : OrderListEvent() @@ -950,6 +954,8 @@ class OrderListViewModel @Inject constructor( data object RetryLoadingOrders : OrderListEvent() data object OpenOrderCreationWithSimplePaymentsMigration : OrderListEvent() + + data class ShowUpdateStatusDialog(val orderIds: List) : OrderListEvent() } @Parcelize From 1ad498cb1e9c4915f32d879af16a03f4ad9ee0b9 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 15:21:12 +0700 Subject: [PATCH 03/45] Add logic to display the order status selector dialog --- .../ui/orders/list/OrderListFragment.kt | 17 ++++++-- .../ui/orders/list/OrderListViewModel.kt | 40 +++++++++++++++++-- .../main/res/navigation/nav_graph_main.xml | 19 +++++++++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index 4f6ea8fa206..e48549ad222 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -49,6 +49,7 @@ import com.woocommerce.android.extensions.windowSizeClass import com.woocommerce.android.model.FeatureFeedbackSettings import com.woocommerce.android.model.FeatureFeedbackSettings.Feature.SIMPLE_PAYMENTS_AND_ORDER_CREATION import com.woocommerce.android.model.FeatureFeedbackSettings.FeedbackState +import com.woocommerce.android.model.Order import com.woocommerce.android.support.help.HelpOrigin import com.woocommerce.android.support.requests.SupportRequestFormActivity import com.woocommerce.android.tools.SelectedSite @@ -605,7 +606,7 @@ class OrderListFragment : is OrderListViewModel.OrderListEvent.OpenOrderCreationWithSimplePaymentsMigration -> openOrderCreationFragment(indicateSimplePaymentsMigration = true) is OrderListViewModel.OrderListEvent.ShowUpdateStatusDialog -> { - showBulkUpdateStatusDialog(event.orderIds) + showBulkUpdateStatusDialog(event.currentStatus, event.orderStatusList) } else -> event.isHandled = false @@ -704,8 +705,16 @@ class OrderListFragment : } } - private fun showBulkUpdateStatusDialog(productsIds: List) { - TODO() + private fun showBulkUpdateStatusDialog( + currentStatus: String, + orderStatusList: Array + ) { + findNavController().navigateSafely( + OrderListFragmentDirections.actionOrderListFragmentToOrdersListStatusSelectorDialog( + currentStatus, + orderStatusList + ) + ) } private fun handleListState(orderListState: OrderListViewModel.ViewState.OrderListState) { @@ -1153,7 +1162,7 @@ class OrderListFragment : override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_orderlist_update_status -> { - viewModel.onBulkUpdateStatusClicked(tracker?.selection?.toList().orEmpty()) + viewModel.onBulkUpdateStatusClicked() true } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index 6ac0d650927..3a2ace741c3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -32,7 +32,9 @@ import com.woocommerce.android.extensions.NotificationReceivedEvent import com.woocommerce.android.extensions.WindowSizeClass import com.woocommerce.android.extensions.filter import com.woocommerce.android.extensions.filterNotNull +import com.woocommerce.android.extensions.runWithContext import com.woocommerce.android.model.FeatureFeedbackSettings +import com.woocommerce.android.model.Order import com.woocommerce.android.model.RequestResult.SUCCESS import com.woocommerce.android.network.ConnectionChangeReceiver.ConnectionChangeEvent import com.woocommerce.android.notifications.NotificationChannelType @@ -916,8 +918,19 @@ class OrderListViewModel @Inject constructor( ) } - fun onBulkUpdateStatusClicked(orderIds: List) { - triggerEvent(OrderListEvent.ShowUpdateStatusDialog(orderIds)) + fun onBulkUpdateStatusClicked() { + launch(dispatchers.io) { + orderDetailRepository + .getOrderStatusOptions().toTypedArray() + .runWithContext(dispatchers.main) { + triggerEvent( + OrderListEvent.ShowUpdateStatusDialog( + currentStatus = "", // Intentionally set as empty string to show no status selected + orderStatusList = it + ) + ) + } + } } sealed class OrderListEvent : Event() { @@ -955,7 +968,28 @@ class OrderListViewModel @Inject constructor( data object OpenOrderCreationWithSimplePaymentsMigration : OrderListEvent() - data class ShowUpdateStatusDialog(val orderIds: List) : OrderListEvent() + data class ShowUpdateStatusDialog( + val currentStatus: String, + val orderStatusList: Array + ) : OrderListEvent() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as ShowUpdateStatusDialog + + if (currentStatus != other.currentStatus) return false + if (!orderStatusList.contentEquals(other.orderStatusList)) return false + + return true + } + + override fun hashCode(): Int { + var result = currentStatus.hashCode() + result = 31 * result + orderStatusList.contentHashCode() + return result + } + } } @Parcelize diff --git a/WooCommerce/src/main/res/navigation/nav_graph_main.xml b/WooCommerce/src/main/res/navigation/nav_graph_main.xml index 82fe1dfdc84..f76e6a8f752 100644 --- a/WooCommerce/src/main/res/navigation/nav_graph_main.xml +++ b/WooCommerce/src/main/res/navigation/nav_graph_main.xml @@ -156,6 +156,14 @@ + + + + + + From 7d61ae37ebefb0f2d1e246a34f1636ea5864b8bc Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 15:33:04 +0700 Subject: [PATCH 04/45] Start handling result from order status selector --- .../android/ui/orders/list/OrderListFragment.kt | 8 ++++++++ .../android/ui/orders/list/OrderListViewModel.kt | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index e48549ad222..4c9daf3da42 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -41,6 +41,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_ORDER_ID import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_START_PAYMENT_FLOW import com.woocommerce.android.databinding.FragmentOrderListBinding import com.woocommerce.android.extensions.WindowSizeClass +import com.woocommerce.android.extensions.handleDialogResult import com.woocommerce.android.extensions.handleResult import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.extensions.pinFabAboveBottomNavigationBar @@ -70,6 +71,7 @@ import com.woocommerce.android.ui.orders.OrdersCommunicationViewModel import com.woocommerce.android.ui.orders.creation.CodeScannerStatus import com.woocommerce.android.ui.orders.creation.GoogleBarcodeFormatMapper.BarcodeFormat import com.woocommerce.android.ui.orders.creation.OrderCreateEditViewModel +import com.woocommerce.android.ui.orders.details.OrderStatusSelectorDialog import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowErrorSnack import com.woocommerce.android.ui.orders.list.OrderListViewModel.OrderListEvent.ShowOrderFilters import com.woocommerce.android.ui.products.MutableMultipleSelectionPredicate @@ -811,6 +813,12 @@ class OrderListFragment : openSpecificOrder(it, true) } } + handleDialogResult( + key = OrderStatusSelectorDialog.KEY_ORDER_STATUS_RESULT, + entryId = R.id.orders, + ) { + viewModel.onBulkOrderStatusChanged(Order.Status.fromValue(it.newStatus)) + } } private fun showOrderFilters() { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index 3a2ace741c3..4e9966f03c2 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -933,6 +933,10 @@ class OrderListViewModel @Inject constructor( } } + fun onBulkOrderStatusChanged(newStatus: Order.Status) { + TODO() // Do API call + } + sealed class OrderListEvent : Event() { data class ShowErrorSnack(@StringRes val messageRes: Int) : OrderListEvent() object ShowOrderFilters : OrderListEvent() From 0bc0fd0e1f11f8d8885bfb0163bf574c3056ba25 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 15:48:34 +0700 Subject: [PATCH 05/45] Start status order update handling in view model and repository --- .../ui/orders/list/OrderListFragment.kt | 5 ++++- .../ui/orders/list/OrderListRepository.kt | 4 ++++ .../ui/orders/list/OrderListViewModel.kt | 20 +++++++++++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index 4c9daf3da42..020dbcbe903 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -817,7 +817,10 @@ class OrderListFragment : key = OrderStatusSelectorDialog.KEY_ORDER_STATUS_RESULT, entryId = R.id.orders, ) { - viewModel.onBulkOrderStatusChanged(Order.Status.fromValue(it.newStatus)) + viewModel.onBulkOrderStatusChanged( + orderIds = tracker?.selection?.toList() ?: emptyList(), + newStatus = Order.Status.fromValue(it.newStatus) + ) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt index 6eeac878046..7082825d7ec 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt @@ -177,4 +177,8 @@ class OrderListRepository @Inject constructor( continuationOrderStatus.continueWith(RequestResult.SUCCESS) } } + + fun bulkUpdateOrderStatus(orderIds: List, newStatus: Order.Status) { + TODO() + } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index 4e9966f03c2..da65bb96c14 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagedList import com.google.android.material.snackbar.Snackbar import com.woocommerce.android.AppPrefsWrapper +import com.woocommerce.android.BuildConfig import com.woocommerce.android.FeedbackPrefs import com.woocommerce.android.R import com.woocommerce.android.analytics.AnalyticsEvent @@ -60,6 +61,7 @@ import com.woocommerce.android.util.CoroutineDispatchers import com.woocommerce.android.util.DateUtils import com.woocommerce.android.util.ThrottleLiveData import com.woocommerce.android.util.WooLog +import com.woocommerce.android.util.WooLog.T.ORDERS import com.woocommerce.android.viewmodel.LiveDataDelegate import com.woocommerce.android.viewmodel.MultiLiveEvent.Event import com.woocommerce.android.viewmodel.ResourceProvider @@ -933,8 +935,22 @@ class OrderListViewModel @Inject constructor( } } - fun onBulkOrderStatusChanged(newStatus: Order.Status) { - TODO() // Do API call + fun onBulkOrderStatusChanged(orderIds: List, newStatus: Order.Status) { + if (orderIds.isEmpty()) { + val errorMessage = "Trying to bulk update order status but order Ids list is empty" + if (BuildConfig.DEBUG) { + throw IllegalStateException(errorMessage) + } else { + WooLog.e(ORDERS, errorMessage) + } + } else { + launch { + orderListRepository.bulkUpdateOrderStatus( + orderIds = orderIds, + newStatus = newStatus + ) + } + } } sealed class OrderListEvent : Event() { From d314d562727d673761b1d6464e9efe0b72eb37cd Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 16:07:28 +0700 Subject: [PATCH 06/45] Connect repository and viewmodel for bulk updating order status --- .../ui/orders/list/OrderListRepository.kt | 16 ++++++++++++++-- .../android/ui/orders/list/OrderListViewModel.kt | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt index 7082825d7ec..7bb3dc65e17 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListRepository.kt @@ -178,7 +178,19 @@ class OrderListRepository @Inject constructor( } } - fun bulkUpdateOrderStatus(orderIds: List, newStatus: Order.Status) { - TODO() + suspend fun bulkUpdateOrderStatus(orderIds: List, newStatus: Order.Status): Result { + val result = orderStore.batchUpdateOrdersStatus( + site = selectedSite.get(), + orderIds = orderIds, + newStatus = WCOrderStatusModel(statusKey = newStatus.value) + ) + + // todo update temporary handling + return if (result.isError) { + WooLog.e(ORDERS, "Error bulk updating order status: ${result.error.message}") + Result.failure(WooException(result.error)) + } else { + Result.success(Unit) + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index da65bb96c14..bcc2764af18 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -944,12 +944,17 @@ class OrderListViewModel @Inject constructor( WooLog.e(ORDERS, errorMessage) } } else { + // todo show loading state launch { - orderListRepository.bulkUpdateOrderStatus( + val result = orderListRepository.bulkUpdateOrderStatus( orderIds = orderIds, newStatus = newStatus ) + + // todo show success/error snackbar + // todo make sure order list is refreshed } + // todo remove loading state, remove multi selection state } } From 65e431dd812c7540e12f288caedd15e405d283d0 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Wed, 18 Dec 2024 16:17:19 +0700 Subject: [PATCH 07/45] Add generic result handling. --- .../android/ui/orders/list/OrderListFragment.kt | 2 ++ .../android/ui/orders/list/OrderListViewModel.kt | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt index 020dbcbe903..0f68c6062a3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListFragment.kt @@ -611,6 +611,8 @@ class OrderListFragment : showBulkUpdateStatusDialog(event.currentStatus, event.orderStatusList) } + is MultiLiveEvent.Event.ShowSnackbar -> uiMessageResolver.showSnack(event.message) + else -> event.isHandled = false } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index bcc2764af18..2c806776c19 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -951,7 +951,13 @@ class OrderListViewModel @Inject constructor( newStatus = newStatus ) - // todo show success/error snackbar + // todo add proper handling for success and failure state + if (result.isFailure) { + triggerEvent(Event.ShowSnackbar(R.string.error_generic)) + } else { + triggerEvent(Event.ShowSnackbar(R.string.order_status_updated)) + } + // todo make sure order list is refreshed } // todo remove loading state, remove multi selection state From 7d20139fd27745914d5278cf8ee1caff157076e3 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Fri, 20 Dec 2024 08:24:38 +0700 Subject: [PATCH 08/45] Reload after getting successful result, and exit selection mode whether success or fails. --- .../android/ui/orders/list/OrderListViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index 2c806776c19..a86a0b29041 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -955,12 +955,12 @@ class OrderListViewModel @Inject constructor( if (result.isFailure) { triggerEvent(Event.ShowSnackbar(R.string.error_generic)) } else { + fetchOrdersAndOrderDependencies() triggerEvent(Event.ShowSnackbar(R.string.order_status_updated)) } - - // todo make sure order list is refreshed + exitSelectionMode() } - // todo remove loading state, remove multi selection state + // todo remove loading state } } From 6d91065a47ec2472a3555e2802cdca4c161521c2 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Tue, 24 Dec 2024 13:40:34 +0700 Subject: [PATCH 09/45] Refactor status selector dialog to disable "Apply" button if no item is selected, which can happen on bulk order update. --- .../orders/details/OrderStatusSelectorDialog.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderStatusSelectorDialog.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderStatusSelectorDialog.kt index aa452839e41..a374fefa6cd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderStatusSelectorDialog.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderStatusSelectorDialog.kt @@ -38,11 +38,16 @@ class OrderStatusSelectorDialog : DialogFragment() { val selectedIndex = getCurrentOrderStatusIndex() - return MaterialAlertDialogBuilder(requireActivity()) + val dialog = MaterialAlertDialogBuilder(requireActivity()) .setTitle(resources.getString(R.string.orderstatus_select_status)) .setCancelable(true) - .setSingleChoiceItems(orderStatusList.map { it.label }.toTypedArray(), selectedIndex) { _, which -> + .setSingleChoiceItems(orderStatusList.map { it.label }.toTypedArray(), selectedIndex) { dialog, which -> selectedOrderStatus = orderStatusList[which].statusKey + + // Casting to `AlertDialog` as `MaterialAlertDialogBuilder` creates it. + (dialog as? androidx.appcompat.app.AlertDialog)?.getButton(Dialog.BUTTON_POSITIVE)?.isEnabled = + selectedOrderStatus.isNotEmpty() + AnalyticsTracker.track( AnalyticsEvent.FILTER_ORDERS_BY_STATUS_DIALOG_OPTION_SELECTED, mapOf("status" to selectedOrderStatus) @@ -68,6 +73,12 @@ class OrderStatusSelectorDialog : DialogFragment() { dialog.dismiss() } .create() + + dialog.setOnShowListener { + dialog.getButton(Dialog.BUTTON_POSITIVE).isEnabled = selectedOrderStatus.isNotEmpty() + } + + return dialog } override fun onResume() { From c021d6b497b9d27dcac022762eea3126dd1821e3 Mon Sep 17 00:00:00 2001 From: Hafiz Rahman Date: Tue, 24 Dec 2024 14:10:51 +0700 Subject: [PATCH 10/45] Add proper success message for bulk update order status. --- .../woocommerce/android/ui/orders/list/OrderListViewModel.kt | 3 +-- WooCommerce/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt index a86a0b29041..55e07fdece6 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/list/OrderListViewModel.kt @@ -951,12 +951,11 @@ class OrderListViewModel @Inject constructor( newStatus = newStatus ) - // todo add proper handling for success and failure state if (result.isFailure) { triggerEvent(Event.ShowSnackbar(R.string.error_generic)) } else { fetchOrdersAndOrderDependencies() - triggerEvent(Event.ShowSnackbar(R.string.order_status_updated)) + triggerEvent(Event.ShowSnackbar(R.string.orderlist_bulk_update_status_updated)) } exitSelectionMode() } diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index f4648c0bf3f..34b31747b8a 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -605,6 +605,7 @@ %d orders selected %d order selected Update status + Status updated!