Skip to content

Commit 3532e3f

Browse files
authored
Merge pull request #14889 from woocommerce/issue/WOOMOB-1465-update-bookings-type-filter-logic
[Bookings] Update type filter logic
2 parents dbfd5b0 + 5abbf62 commit 3532e3f

File tree

10 files changed

+55
-45
lines changed

10 files changed

+55
-45
lines changed
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.woocommerce.android.ui.bookings.filter
22

33
import androidx.annotation.StringRes
4+
import com.woocommerce.android.model.UiString
45

56
/**
67
* UI model simple filter item
78
*/
89
data class BookingFilterListItem(
910
@StringRes val title: Int,
10-
val value: String? = null,
11+
val subtitle: UiString? = null,
12+
val selected: Boolean = false,
1113
val onClick: () -> Unit = {}
1214
)

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
@@ -3,6 +3,8 @@ package com.woocommerce.android.ui.bookings.filter
33
import androidx.annotation.DrawableRes
44
import androidx.annotation.StringRes
55
import com.woocommerce.android.R
6+
import com.woocommerce.android.model.UiString
7+
import com.woocommerce.android.ui.bookings.filter.type.titleRes
68
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingFilters
79
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption
810

@@ -31,34 +33,39 @@ data class BookingFilterListUiState(
3133
val items: List<BookingFilterListItem> = availableBookingFilters().map { page ->
3234
BookingFilterListItem(
3335
title = page.titleRes,
34-
value = page.filterValue,
36+
subtitle = page.filterValue,
3537
onClick = { openPage(page) },
3638
)
3739
}
3840

3941
val currentBookingType: BookingsFilterOption.BookingType
4042
get() = newBookingFilters.getOrDefault<BookingsFilterOption.BookingType>(
4143
initialBookingFilters?.bookingType
42-
) ?: BookingsFilterOption.BookingType.Any
44+
) ?: BookingsFilterOption.BookingType(BookingsFilterOption.BookingType.Type.ANY)
4345

4446
@DrawableRes
4547
val navigationIcon: Int = when (currentPage) {
4648
BookingFilterPage.List -> R.drawable.ic_gridicons_cross_24dp
4749
else -> R.drawable.ic_back_24dp
4850
}
4951

50-
val BookingFilterPage.filterValue: String?
52+
val BookingFilterPage.filterValue: UiString?
5153
get() = when (this) {
5254
BookingFilterPage.Customer -> {
5355
newBookingFilters.getOrDefault<BookingsFilterOption.Customer>(
5456
initialBookingFilters?.customer
55-
)?.customerName
57+
)?.customerName?.let { name -> UiString.UiStringText(name) }
58+
}
59+
60+
BookingFilterPage.BookingType -> {
61+
newBookingFilters.getOrDefault<BookingsFilterOption.BookingType>(
62+
initialBookingFilters?.bookingType
63+
)?.titleRes?.let { res -> UiString.UiStringRes(res) }
5664
}
5765

5866
BookingFilterPage.DateTime,
5967
BookingFilterPage.Location,
6068
BookingFilterPage.AttendanceStatus,
61-
BookingFilterPage.BookingType,
6269
BookingFilterPage.PaymentStatus,
6370
BookingFilterPage.ServiceEvent,
6471
BookingFilterPage.TeamMember,

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,8 @@ class BookingFilterListViewModel @Inject constructor(
4242

4343
private fun onUpdateFilterOption(option: BookingsFilterOption) {
4444
_uiState.update { current ->
45-
val filtered = when (option) {
46-
is BookingsFilterOption.BookingType -> {
47-
current.newBookingFilters.filterNot { it is BookingsFilterOption.BookingType }
48-
}
49-
50-
else -> current.newBookingFilters.filterNot { it::class == option::class }
51-
}
5245
current.copy(
53-
newBookingFilters = filtered
46+
newBookingFilters = current.newBookingFilters.filterNot { it::class == option::class }
5447
.plus(option)
5548
.toSet()
5649
)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.ui.res.stringResource
1515
import androidx.compose.ui.unit.dp
1616
import com.woocommerce.android.R
1717
import com.woocommerce.android.ui.compose.component.WCListItemWithInlineSubtitle
18+
import com.woocommerce.android.ui.compose.component.getText
1819

1920
@Composable
2021
fun BookingFilterRootPage(
@@ -34,7 +35,7 @@ private fun BookingFilterListRow(item: BookingFilterListItem) {
3435
Column(modifier = Modifier.fillMaxWidth()) {
3536
WCListItemWithInlineSubtitle(
3637
text = stringResource(item.title),
37-
subtitle = item.value ?: stringResource(id = R.string.bookings_filter_default),
38+
subtitle = item.subtitle?.getText() ?: stringResource(id = R.string.bookings_filter_default),
3839
modifier = Modifier
3940
.defaultMinSize(minHeight = 64.dp)
4041
.clickable { item.onClick() }

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ import com.woocommerce.android.R
2525
@Composable
2626
fun SingleChoiceFilterPage(
2727
items: List<BookingFilterListItem>,
28-
selectedValue: String?,
2928
modifier: Modifier = Modifier,
3029
) {
3130
LazyColumn(modifier = modifier) {
3231
items(items) { item ->
3332
SingleChoiceRow(
3433
text = stringResource(item.title),
35-
selected = item.value == selectedValue,
34+
selected = item.selected,
3635
onClick = { item.onClick() }
3736
)
3837
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class BookingFilterRepository @Inject constructor(
2424
private val selectedSite: SelectedSite,
2525
) {
2626
// Keys are built per-site to keep selections isolated across sites
27+
private fun bookingTypeKey(siteId: Int) = stringPreferencesKey("bfilters_${siteId}_booking_type")
2728
private fun customerIdKey(siteId: Int) = longPreferencesKey("bfilters_${siteId}_customer_id")
2829
private fun customerNameKey(siteId: Int) = stringPreferencesKey("bfilters_${siteId}_customer_name")
2930
private fun dateBeforeKey(siteId: Int) = longPreferencesKey("bfilters_${siteId}_date_before")
@@ -34,6 +35,7 @@ class BookingFilterRepository @Inject constructor(
3435
val bookingFiltersFlow: Flow<BookingFilters> = siteIdFlow.flatMapLatest { siteId ->
3536
dataStore.data.map { prefs ->
3637
BookingFilters(
38+
bookingType = prefs.getBookingType(siteId),
3739
customer = prefs.getCustomerValue(siteId),
3840
dateRange = prefs.getDateRangeValue(siteId)
3941
)
@@ -43,6 +45,16 @@ class BookingFilterRepository @Inject constructor(
4345
suspend fun save(bookingFilters: BookingFilters) {
4446
val siteId = selectedSite.getSelectedSiteId()
4547
dataStore.edit { prefs ->
48+
// Booking type
49+
val bookingTypeKey = bookingTypeKey(siteId)
50+
val bookingType = bookingFilters.bookingType
51+
if (bookingType != null) {
52+
prefs[bookingTypeKey] = bookingType.value.name
53+
} else {
54+
// Clear if not provided
55+
prefs.remove(bookingTypeKey)
56+
}
57+
4658
// Customer
4759
val customerIdKey = customerIdKey(siteId)
4860
val customerNameKey = customerNameKey(siteId)
@@ -77,6 +89,12 @@ class BookingFilterRepository @Inject constructor(
7789
}
7890
}
7991

92+
private fun Preferences.getBookingType(siteId: Int): BookingsFilterOption.BookingType? {
93+
val stored = this[bookingTypeKey(siteId)] ?: return null
94+
val type = runCatching { BookingsFilterOption.BookingType.Type.valueOf(stored) }.getOrNull()
95+
return type?.let { BookingsFilterOption.BookingType(value = it) }
96+
}
97+
8098
private fun Preferences.getCustomerValue(siteId: Int): BookingsFilterOption.Customer? {
8199
val customerId = this[customerIdKey(siteId)]
82100
val customerName = this[customerNameKey(siteId)]

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,5 @@ fun BookingTypeFilterRoute(
2222

2323
@Composable
2424
fun BookingTypeFilterPage(state: BookingTypeFilterUiState) {
25-
SingleChoiceFilterPage(
26-
items = state.items,
27-
selectedValue = state.selectedType.filterValue,
28-
)
25+
SingleChoiceFilterPage(items = state.items)
2926
}

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

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,27 @@ import com.woocommerce.android.ui.bookings.filter.BookingFilterListItem
66
import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption.BookingType
77

88
data class BookingTypeFilterUiState(
9-
val selectedType: BookingType = BookingType.Any,
9+
val selectedType: BookingType = BookingType(BookingType.Type.ANY),
1010
val onTypeSelected: (BookingType) -> Unit = {},
1111
) {
1212
val items: List<BookingFilterListItem> = availableBookingTypes().map { type ->
1313
BookingFilterListItem(
1414
title = type.titleRes,
15-
value = type.filterValue,
15+
selected = type == selectedType,
1616
onClick = { onTypeSelected(type) }
1717
)
1818
}
1919

20-
val BookingType.titleRes: Int
21-
@StringRes get() = when (this) {
22-
BookingType.Any -> R.string.bookings_filter_default
23-
BookingType.Service -> R.string.bookings_filter_type_service
24-
BookingType.Event -> R.string.bookings_filter_type_event
25-
}
26-
2720
private fun availableBookingTypes(): List<BookingType> = listOf(
28-
BookingType.Any,
29-
BookingType.Service,
30-
BookingType.Event,
21+
BookingType(BookingType.Type.ANY),
22+
BookingType(BookingType.Type.SERVICE),
23+
BookingType(BookingType.Type.EVENT),
3124
)
3225
}
3326

34-
val BookingType.filterValue: String?
35-
// TODO Update this with actual endpoint values
36-
get() = when (this) {
37-
BookingType.Service -> "service"
38-
BookingType.Event -> "event"
39-
BookingType.Any -> null
27+
val BookingType.titleRes: Int
28+
@StringRes get() = when (this.value) {
29+
BookingType.Type.ANY -> R.string.bookings_filter_default
30+
BookingType.Type.SERVICE -> R.string.bookings_filter_type_service
31+
BookingType.Type.EVENT -> R.string.bookings_filter_type_event
4032
}

libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsFilterOption.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ sealed interface BookingsFilterOption {
99

1010
object PaymentStatus : BookingsFilterOption
1111

12-
sealed interface BookingType : BookingsFilterOption {
13-
object Any : BookingType
14-
object Service : BookingType
15-
object Event : BookingType
12+
data class BookingType(val value: Type) : BookingsFilterOption {
13+
enum class Type { ANY, SERVICE, EVENT }
1614
}
1715

1816
data class Customer(val customerId: Long, val customerName: String) : BookingsFilterOption
@@ -45,7 +43,7 @@ data class BookingFilters(
4543
if (teamMember != null) count++
4644
if (attendanceStatus != null) count++
4745
if (paymentStatus != null) count++
48-
if (bookingType != null) count++
46+
if (bookingType != null && bookingType.value != BookingsFilterOption.BookingType.Type.ANY) count++
4947
if (location != null) count++
5048
if (serviceEvent != null) count++
5149
return count

libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsRestClient.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,10 @@ class BookingsRestClient @Inject constructor(
109109
BookingsFilterOption.TeamMember -> TODO()
110110
BookingsFilterOption.AttendanceStatus -> TODO()
111111
BookingsFilterOption.PaymentStatus -> TODO()
112-
is BookingsFilterOption.BookingType -> TODO()
112+
is BookingsFilterOption.BookingType -> {
113+
// TODO add query for booking type filtering
114+
}
115+
113116
is BookingsFilterOption.Customer -> set("customer", filter.customerId.toString())
114117

115118
BookingsFilterOption.Location -> TODO()

0 commit comments

Comments
 (0)