Skip to content

Commit be15797

Browse files
committed
Merge branch 'trunk' into woomob-1697-disable-cellular-data-toggle-in-local-catalog-settings-in
2 parents 7f36fe3 + 5cf8fcb commit be15797

File tree

48 files changed

+858
-305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+858
-305
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
23.8
66
-----
77
- [*] Optimized POS Local Catalog Settings screen [https://github.com/woocommerce/woocommerce-android/pull/14971]
8+
- [Internal][Woo POS] Improve detection and handling of deleted products during checkout [https://github.com/woocommerce/woocommerce-android/pull/14981]
89

910
23.7
1011
-----

WooCommerce/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ fladle {
2626
devices = [
2727
["model": "MediumPhone.arm", "version": "35"]
2828
]
29+
30+
additionalTestApks = [
31+
"- test: ${rootProject.projectDir}/libs/fluxc-plugin/build/outputs/apk/androidTest/debug/fluxc-plugin-debug-androidTest.apk".toString()
32+
]
2933
localResultsDir = "$rootDir/build/instrumented-tests"
3034

3135
useOrchestrator = true

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/BookingsRepository.kt

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import kotlinx.coroutines.CoroutineScope
77
import kotlinx.coroutines.async
88
import kotlinx.coroutines.flow.Flow
99
import kotlinx.coroutines.flow.flowOf
10+
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingFilters
1011
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingUpdatePayload
11-
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption
1212
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsOrderOption
1313
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsStore
1414
import org.wordpress.android.fluxc.persistence.entity.BookingEntity
@@ -24,7 +24,7 @@ class BookingsRepository @Inject constructor(
2424
page: Int,
2525
perPage: Int,
2626
query: String? = null,
27-
filters: List<BookingsFilterOption> = emptyList(),
27+
filters: BookingFilters? = null,
2828
order: BookingsOrderOption
2929
): Result<FetchResult> {
3030
val result = bookingsStore.fetchBookings(
@@ -51,7 +51,7 @@ class BookingsRepository @Inject constructor(
5151

5252
fun observeBookings(
5353
limit: Int? = null,
54-
filters: List<BookingsFilterOption> = emptyList(),
54+
filters: BookingFilters? = null,
5555
order: BookingsOrderOption
5656
): Flow<List<Booking>> =
5757
bookingsStore.observeBookings(
@@ -61,6 +61,8 @@ class BookingsRepository @Inject constructor(
6161
order = order
6262
)
6363

64+
fun observeBookingsCount(): Flow<Long> = bookingsStore.observeBookingCount(site = selectedSite.get())
65+
6466
fun observeBooking(bookingId: Long): Flow<Booking?> =
6567
bookingsStore.observeBooking(
6668
site = selectedSite.get(),
@@ -88,6 +90,19 @@ class BookingsRepository @Inject constructor(
8890
}
8991
}
9092

93+
suspend fun fetchResources(): Result<Unit> {
94+
val result = bookingsStore.fetchResources(site = selectedSite.get())
95+
return if (result.isError) {
96+
Result.failure(WooException(result.error))
97+
} else {
98+
Result.success(Unit)
99+
}
100+
}
101+
102+
suspend fun getResource(
103+
resourceId: Long
104+
): BookingResource? = bookingsStore.getResource(site = selectedSite.get(), resourceId = resourceId)
105+
91106
suspend fun fetchResource(
92107
resourceId: Long
93108
): Result<Unit> {
@@ -113,6 +128,9 @@ class BookingsRepository @Inject constructor(
113128
}
114129
}
115130

131+
fun observeResources(): Flow<List<BookingResource>> =
132+
bookingsStore.observeResources(site = selectedSite.get())
133+
116134
suspend fun updateAttendanceStatus(
117135
bookingId: Long,
118136
attendanceStatus: BookingEntity.AttendanceStatus,

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingFilterListItem.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.woocommerce.android.ui.bookings.filter
22

3-
import androidx.annotation.StringRes
43
import com.woocommerce.android.model.UiString
54

65
/**
76
* UI model simple filter item
87
*/
98
data class BookingFilterListItem(
10-
@StringRes val title: Int,
9+
val title: UiString,
1110
val value: UiString? = null,
1211
val selected: Boolean = false,
1312
val onClick: () -> Unit = {}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingFilterListScreen.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import androidx.navigation.compose.rememberNavController
3030
import com.woocommerce.android.R
3131
import com.woocommerce.android.ui.bookings.filter.attendancestatus.BookingAttendanceStatusFilterRoute
3232
import com.woocommerce.android.ui.bookings.filter.customer.BookingCustomerFilterPage
33-
import com.woocommerce.android.ui.bookings.filter.datetime.DateTimeFilterPage
33+
import com.woocommerce.android.ui.bookings.filter.datetime.DateTimeFilterRoute
34+
import com.woocommerce.android.ui.bookings.filter.teammember.BookingTeamMemberFilterRoute
3435
import com.woocommerce.android.ui.bookings.filter.type.BookingTypeFilterRoute
3536
import com.woocommerce.android.ui.compose.Render
3637
import com.woocommerce.android.ui.compose.component.Toolbar
@@ -130,7 +131,17 @@ private fun FiltersNavHost(
130131
composable(BookingFilterPage.List.route) {
131132
BookingFilterRootPage(state.items)
132133
}
134+
composable(BookingFilterPage.DateTime.route) {
135+
DateTimeFilterRoute(
136+
initialRange = state.updatedBookingFilters.dateRange
137+
) { dateRange ->
138+
state.onUpdateFilterOption(dateRange)
139+
}
140+
}
133141
composable(BookingFilterPage.TeamMember.route) {
142+
BookingTeamMemberFilterRoute(initialTeamMembers = state.updatedBookingFilters.teamMembers) { teamMember ->
143+
state.onUpdateFilterOption(teamMember)
144+
}
134145
}
135146
composable(BookingFilterPage.BookingType.route) {
136147
BookingTypeFilterRoute(initialType = state.updatedBookingFilters.bookingType) { type ->
@@ -160,9 +171,6 @@ private fun FiltersNavHost(
160171
state.onClose()
161172
}
162173
}
163-
composable(BookingFilterPage.DateTime.route) {
164-
DateTimeFilterPage()
165-
}
166174
composable(BookingFilterPage.Location.route) {
167175
}
168176
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingFilterListUiState.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ enum class BookingFilterPage {
3232
data class BookingFilterListUiState(
3333
val initialBookingFilters: BookingFilters = BookingFilters(),
3434
val updatedBookingFilters: BookingFilters = initialBookingFilters,
35+
val selectedFilterValues: SelectedFilterValues = SelectedFilterValues(),
3536
val currentPage: BookingFilterPage = BookingFilterPage.List,
3637
val dialogState: DialogState? = null,
3738
val onClose: () -> Unit = {},
@@ -40,15 +41,15 @@ data class BookingFilterListUiState(
4041
val onUpdateFilterOption: (BookingsFilterOption) -> Unit = {},
4142
val onClear: () -> Unit = {},
4243
) {
44+
data class SelectedFilterValues(val teamMemberValue: String? = null)
4345

4446
val items: List<BookingFilterListItem> = availableBookingFilters().map { page ->
4547
BookingFilterListItem(
46-
title = page.titleRes,
48+
title = UiString.UiStringRes(page.titleRes),
4749
value = page.filterValue,
4850
onClick = { openPage(page) },
4951
)
5052
}
51-
5253
val updatedBookingFiltersCount = updatedBookingFilters.enabledFiltersCount
5354

5455
val showClearButton: Boolean
@@ -62,6 +63,7 @@ data class BookingFilterListUiState(
6263

6364
val BookingFilterPage.filterValue: UiString
6465
get() = when (this) {
66+
BookingFilterPage.TeamMember -> selectedFilterValues.teamMemberValue?.let { UiString.UiStringText(it) }
6567
BookingFilterPage.BookingType -> {
6668
updatedBookingFilters.bookingType?.titleRes?.let { UiString.UiStringRes(it) }
6769
}
@@ -80,10 +82,15 @@ data class BookingFilterListUiState(
8082
UiString.UiStringText(name)
8183
}
8284

85+
BookingFilterPage.DateTime -> {
86+
updatedBookingFilters.dateRange?.let {
87+
UiString.UiStringRes(R.string.bookings_filter_date_filter_value)
88+
}
89+
}
90+
8391
BookingFilterPage.TeamMember,
8492
BookingFilterPage.ServiceEvent,
8593
BookingFilterPage.PaymentStatus,
86-
BookingFilterPage.DateTime,
8794
BookingFilterPage.Location,
8895
BookingFilterPage.List -> null
8996
} ?: UiString.UiStringRes(R.string.bookings_filter_default)
@@ -103,7 +110,7 @@ data class BookingFilterListUiState(
103110

104111
val BookingFilterPage.titleRes: Int
105112
@StringRes get() = when (this) {
106-
BookingFilterPage.TeamMember -> R.string.bookings_filter_title_team_member
113+
BookingFilterPage.TeamMember -> R.string.bookings_filter_title_member
107114
BookingFilterPage.AttendanceStatus -> R.string.bookings_filter_title_attendance_status
108115
BookingFilterPage.PaymentStatus -> R.string.bookings_filter_title_payment_status
109116
BookingFilterPage.BookingType -> R.string.bookings_filter_title_type
@@ -133,7 +140,7 @@ fun BookingFilters.updateFilterOption(bookingsFilterOption: BookingsFilterOption
133140
when (bookingsFilterOption) {
134141
is BookingsFilterOption.DateRange -> copy(dateRange = bookingsFilterOption)
135142
is BookingsFilterOption.Customer -> copy(customer = bookingsFilterOption)
136-
is BookingsFilterOption.TeamMember -> copy(teamMember = bookingsFilterOption)
143+
is BookingsFilterOption.TeamMembers -> copy(teamMembers = bookingsFilterOption)
137144
is BookingsFilterOption.AttendanceStatuses -> copy(attendanceStatuses = bookingsFilterOption)
138145
is BookingsFilterOption.PaymentStatus -> copy(paymentStatus = bookingsFilterOption)
139146
is BookingsFilterOption.BookingType -> copy(bookingType = bookingsFilterOption)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingFilterListViewModel.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ import androidx.lifecycle.SavedStateHandle
44
import androidx.lifecycle.asLiveData
55
import com.woocommerce.android.R
66
import com.woocommerce.android.model.UiString
7+
import com.woocommerce.android.ui.bookings.BookingsRepository
78
import com.woocommerce.android.ui.bookings.filter.data.BookingFilterRepository
89
import com.woocommerce.android.ui.compose.DialogState
910
import com.woocommerce.android.viewmodel.MultiLiveEvent
1011
import com.woocommerce.android.viewmodel.ScopedViewModel
1112
import dagger.hilt.android.lifecycle.HiltViewModel
1213
import kotlinx.coroutines.flow.MutableStateFlow
14+
import kotlinx.coroutines.flow.distinctUntilChanged
1315
import kotlinx.coroutines.flow.firstOrNull
16+
import kotlinx.coroutines.flow.map
1417
import kotlinx.coroutines.flow.update
1518
import kotlinx.coroutines.launch
1619
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingFilters
@@ -21,6 +24,7 @@ import javax.inject.Inject
2124
class BookingFilterListViewModel @Inject constructor(
2225
savedStateHandle: SavedStateHandle,
2326
private val bookingFilterRepository: BookingFilterRepository,
27+
private val bookingsRepository: BookingsRepository,
2428
) : ScopedViewModel(savedStateHandle) {
2529

2630
private val _uiState = MutableStateFlow(
@@ -36,6 +40,7 @@ class BookingFilterListViewModel @Inject constructor(
3640

3741
init {
3842
getBookingFilter()
43+
observeSelectedTeamMembers()
3944
}
4045

4146
private fun onOpenPage(page: BookingFilterPage) {
@@ -66,6 +71,26 @@ class BookingFilterListViewModel @Inject constructor(
6671
}
6772
}
6873

74+
private fun observeSelectedTeamMembers() {
75+
launch {
76+
_uiState
77+
.map { state -> state.updatedBookingFilters.teamMembers.values.map { it.value } }
78+
.distinctUntilChanged()
79+
.collect { ids ->
80+
val teamMemberValue = when {
81+
ids.isEmpty() -> null
82+
ids.size == 1 -> bookingsRepository.getResource(ids.first())?.name
83+
else -> ids.size.toString()
84+
}
85+
_uiState.update { current ->
86+
current.copy(
87+
selectedFilterValues = current.selectedFilterValues.copy(teamMemberValue = teamMemberValue)
88+
)
89+
}
90+
}
91+
}
92+
}
93+
6994
private fun onClose() {
7095
if (_uiState.value.currentPage != BookingFilterPage.List) {
7196
_uiState.update { current ->

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingFilterRootPage.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.compose.foundation.lazy.items
1111
import androidx.compose.material3.HorizontalDivider
1212
import androidx.compose.runtime.Composable
1313
import androidx.compose.ui.Modifier
14-
import androidx.compose.ui.res.stringResource
1514
import androidx.compose.ui.unit.dp
1615
import com.woocommerce.android.ui.compose.component.WCListItemWithInlineSubtitle
1716
import com.woocommerce.android.ui.compose.component.getText
@@ -33,7 +32,7 @@ fun BookingFilterRootPage(
3332
private fun BookingFilterListRow(item: BookingFilterListItem) {
3433
Column(modifier = Modifier.fillMaxWidth()) {
3534
WCListItemWithInlineSubtitle(
36-
text = stringResource(item.title),
35+
text = item.title.getText(),
3736
subtitle = item.value?.getText().orEmpty(),
3837
modifier = Modifier
3938
.defaultMinSize(minHeight = 64.dp)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/BookingsFilterSelectionPage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import androidx.compose.runtime.Composable
1717
import androidx.compose.ui.Alignment
1818
import androidx.compose.ui.Modifier
1919
import androidx.compose.ui.res.painterResource
20-
import androidx.compose.ui.res.stringResource
2120
import androidx.compose.ui.text.style.TextOverflow
2221
import androidx.compose.ui.unit.dp
2322
import com.woocommerce.android.R
23+
import com.woocommerce.android.ui.compose.component.getText
2424

2525
@Composable
2626
fun BookingsFilterSelectionPage(
@@ -30,7 +30,7 @@ fun BookingsFilterSelectionPage(
3030
LazyColumn(modifier = modifier) {
3131
items(items) { item ->
3232
SelectionRow(
33-
text = stringResource(item.title),
33+
text = item.title.getText(),
3434
selected = item.selected,
3535
onClick = { item.onClick() }
3636
)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/bookings/filter/attendancestatus/BookingAttendanceStatusFilterUiState.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.woocommerce.android.ui.bookings.filter.attendancestatus
22

33
import androidx.annotation.StringRes
44
import com.woocommerce.android.R
5+
import com.woocommerce.android.model.UiString
56
import com.woocommerce.android.ui.bookings.filter.BookingFilterListItem
67
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption.AttendanceStatuses
78
import org.wordpress.android.fluxc.persistence.entity.BookingEntity.AttendanceStatus
@@ -12,7 +13,7 @@ data class BookingAttendanceStatusFilterUiState(
1213
) {
1314
val items: List<BookingFilterListItem> = availableAttendanceStatuses().map { status ->
1415
BookingFilterListItem(
15-
title = status.titleRes,
16+
title = UiString.UiStringRes(status.titleRes),
1617
selected = isSelected(status),
1718
onClick = { onStatusSelected(status) }
1819
)

0 commit comments

Comments
 (0)