Skip to content

Commit c68fa9f

Browse files
committed
Merge branch 'trunk' into woomob-1447-woo-poslocal-catalog-handle-manual-sync-errors-in-pos
# Conflicts: # WooCommerce/src/test/kotlin/com/woocommerce/android/ui/woopos/settings/details/localcatalog/WooPosSettingsLocalCatalogViewModelTest.kt
2 parents d80f074 + 319c3a7 commit c68fa9f

File tree

48 files changed

+5831
-1238
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

+5831
-1238
lines changed

Add_WooPosEmptyScreen_component_and_refactor_empty_list_handling.patch

Lines changed: 0 additions & 558 deletions
This file was deleted.

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.woocommerce.android.ui.bookings.compose.BookingPaymentDetailsModel
1212
import com.woocommerce.android.ui.bookings.compose.BookingStaffMemberStatus
1313
import com.woocommerce.android.ui.bookings.compose.BookingStatus
1414
import com.woocommerce.android.ui.bookings.compose.BookingSummaryModel
15+
import com.woocommerce.android.ui.bookings.details.AttendanceUpdateStatus
1516
import com.woocommerce.android.ui.bookings.details.CancelStatus
1617
import com.woocommerce.android.ui.bookings.list.BookingListItem
1718
import com.woocommerce.android.util.CurrencyFormatter
@@ -45,20 +46,21 @@ class BookingMapper @Inject constructor(
4546
private val timeRangeFormatter: DateTimeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
4647
.withZone(ZoneOffset.UTC)
4748

48-
fun Booking.toBookingSummaryModel(): BookingSummaryModel {
49+
fun Booking.toBookingSummaryModel(attendanceUpdateStatus: AttendanceUpdateStatus): BookingSummaryModel {
4950
return BookingSummaryModel(
5051
date = summaryDateFormatter.format(start),
5152
name = order.productInfo?.name ?: "-",
5253
customerName = order.customerInfo?.fullName(),
53-
attendanceStatus = BookingAttendanceStatus.BOOKED,
54-
status = status.toUiModel(order.status, order.paymentInfo?.paymentMethodId)
54+
status = status.toUiModel(order.status, order.paymentInfo?.paymentMethodId),
55+
attendanceStatus = attendanceStatus.toUiModel(),
56+
attendanceUpdateStatus = attendanceUpdateStatus,
5557
)
5658
}
5759

5860
fun Booking.toListItem(): BookingListItem {
5961
return BookingListItem(
6062
id = id.value,
61-
summary = toBookingSummaryModel()
63+
summary = toBookingSummaryModel(AttendanceUpdateStatus.Idle)
6264
)
6365
}
6466

@@ -125,6 +127,13 @@ class BookingMapper @Inject constructor(
125127
}
126128
}
127129

130+
private fun BookingEntity.AttendanceStatus.toUiModel(): BookingAttendanceStatus? = when (this) {
131+
BookingEntity.AttendanceStatus.Booked -> BookingAttendanceStatus.Booked
132+
BookingEntity.AttendanceStatus.CheckedIn -> BookingAttendanceStatus.CheckedIn
133+
BookingEntity.AttendanceStatus.NoShow -> BookingAttendanceStatus.NoShow
134+
is BookingEntity.AttendanceStatus.Unknown -> null
135+
}
136+
128137
private fun BookingCustomerInfo.fullName(): String? {
129138
return "${billingFirstName.orEmpty()} ${billingLastName.orEmpty()}".trim().ifEmpty { null }
130139
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,22 @@ class BookingsRepository @Inject constructor(
101101
}
102102
}
103103

104+
suspend fun updateAttendanceStatus(
105+
bookingId: Long,
106+
attendanceStatus: BookingEntity.AttendanceStatus,
107+
): Result<Unit> {
108+
val result = bookingsStore.updateAttendanceStatus(
109+
site = selectedSite.get(),
110+
bookingId = bookingId,
111+
attendanceStatus = attendanceStatus
112+
)
113+
return if (result.isError) {
114+
Result.failure(WooException(result.error))
115+
} else {
116+
Result.success(Unit)
117+
}
118+
}
119+
104120
data class FetchResult(
105121
val bookings: List<Booking>,
106122
val hasMorePages: Boolean

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

Lines changed: 67 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,35 @@ import androidx.compose.foundation.layout.Column
88
import androidx.compose.foundation.layout.Row
99
import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.layout.size
1112
import androidx.compose.material3.HorizontalDivider
1213
import androidx.compose.material3.Icon
1314
import androidx.compose.material3.MaterialTheme
1415
import androidx.compose.material3.Text
1516
import androidx.compose.runtime.Composable
17+
import androidx.compose.runtime.getValue
18+
import androidx.compose.runtime.mutableStateOf
19+
import androidx.compose.runtime.remember
20+
import androidx.compose.runtime.setValue
1621
import androidx.compose.ui.Alignment
1722
import androidx.compose.ui.Modifier
23+
import androidx.compose.ui.layout.onSizeChanged
24+
import androidx.compose.ui.platform.LocalDensity
1825
import androidx.compose.ui.res.painterResource
1926
import androidx.compose.ui.res.stringResource
2027
import androidx.compose.ui.text.style.TextOverflow
28+
import androidx.compose.ui.unit.DpSize
2129
import androidx.compose.ui.unit.dp
2230
import com.woocommerce.android.R
31+
import com.woocommerce.android.ui.bookings.details.AttendanceUpdateStatus
32+
import com.woocommerce.android.ui.compose.animations.SkeletonView
2333
import com.woocommerce.android.ui.compose.preview.LightDarkThemePreviews
2434
import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
2535

2636
@Composable
2737
fun BookingAttendanceSection(
28-
status: BookingAttendanceStatus,
38+
status: BookingAttendanceStatus?,
39+
attendanceUpdateStatus: AttendanceUpdateStatus,
2940
onClick: () -> Unit,
3041
modifier: Modifier = Modifier,
3142
) {
@@ -37,8 +48,11 @@ fun BookingAttendanceSection(
3748
HorizontalDivider(thickness = 0.5.dp)
3849
AttendanceRow(
3950
label = R.string.booking_attendance_label_status,
51+
attendanceUpdateStatus = attendanceUpdateStatus,
4052
value = status.text(),
41-
modifier = Modifier.clickable { onClick() }
53+
modifier = Modifier.clickable {
54+
if (attendanceUpdateStatus == AttendanceUpdateStatus.Idle) onClick()
55+
}
4256
)
4357
HorizontalDivider(thickness = 0.5.dp)
4458
}
@@ -54,9 +68,12 @@ fun BookingAttendanceSection(
5468
@Composable
5569
private fun AttendanceRow(
5670
@StringRes label: Int,
71+
attendanceUpdateStatus: AttendanceUpdateStatus,
5772
value: String,
5873
modifier: Modifier = Modifier,
5974
) {
75+
val density = LocalDensity.current
76+
var skeletonSize by remember { mutableStateOf(DpSize.Zero) }
6077
Column(modifier = modifier) {
6178
Row(
6279
verticalAlignment = Alignment.CenterVertically,
@@ -66,20 +83,39 @@ private fun AttendanceRow(
6683
.padding(horizontal = 16.dp, vertical = 12.dp)
6784
) {
6885
BookingDetailsLabel(label)
69-
Row(verticalAlignment = Alignment.CenterVertically) {
70-
Text(
71-
text = value,
72-
style = MaterialTheme.typography.labelLarge,
73-
color = MaterialTheme.colorScheme.onSurfaceVariant,
74-
maxLines = 1,
75-
overflow = TextOverflow.Ellipsis
76-
)
77-
Icon(
78-
painter = painterResource(id = R.drawable.ic_arrow_right),
79-
contentDescription = null,
80-
tint = MaterialTheme.colorScheme.surfaceVariant,
81-
modifier = Modifier.padding(start = 8.dp)
82-
)
86+
when (attendanceUpdateStatus) {
87+
AttendanceUpdateStatus.InProgress -> {
88+
SkeletonView(
89+
modifier = Modifier
90+
.size(skeletonSize)
91+
)
92+
}
93+
94+
AttendanceUpdateStatus.Idle -> {
95+
Row(
96+
verticalAlignment = Alignment.CenterVertically,
97+
modifier = Modifier
98+
.onSizeChanged {
99+
with(density) {
100+
skeletonSize = DpSize(it.width.toDp(), it.height.toDp())
101+
}
102+
}
103+
) {
104+
Text(
105+
text = value,
106+
style = MaterialTheme.typography.labelLarge,
107+
color = MaterialTheme.colorScheme.onSurfaceVariant,
108+
maxLines = 1,
109+
overflow = TextOverflow.Ellipsis
110+
)
111+
Icon(
112+
painter = painterResource(id = R.drawable.ic_arrow_right),
113+
contentDescription = null,
114+
tint = MaterialTheme.colorScheme.surfaceVariant,
115+
modifier = Modifier.padding(start = 8.dp)
116+
)
117+
}
118+
}
83119
}
84120
}
85121
}
@@ -90,7 +126,21 @@ private fun AttendanceRow(
90126
private fun BookingAttendanceSectionPreview() {
91127
WooThemeWithBackground {
92128
BookingAttendanceSection(
93-
status = BookingAttendanceStatus.BOOKED,
129+
status = BookingAttendanceStatus.Booked,
130+
attendanceUpdateStatus = AttendanceUpdateStatus.Idle,
131+
onClick = {},
132+
modifier = Modifier.fillMaxWidth()
133+
)
134+
}
135+
}
136+
137+
@LightDarkThemePreviews
138+
@Composable
139+
private fun BookingAttendanceSectionInProgressPreview() {
140+
WooThemeWithBackground {
141+
BookingAttendanceSection(
142+
status = BookingAttendanceStatus.Booked,
143+
attendanceUpdateStatus = AttendanceUpdateStatus.InProgress,
94144
onClick = {},
95145
modifier = Modifier.fillMaxWidth()
96146
)

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ private fun BookingAttendanceStatusSelection(
7171
modifier = Modifier.padding(bottom = 22.dp)
7272
)
7373
listOf(
74-
BookingAttendanceStatus.BOOKED,
75-
BookingAttendanceStatus.CHECKED_IN,
76-
BookingAttendanceStatus.NO_SHOW,
74+
BookingAttendanceStatus.Booked,
75+
BookingAttendanceStatus.CheckedIn,
76+
BookingAttendanceStatus.NoShow,
7777
).forEachIndexed { index, status ->
7878
AttendanceStatusRow(
7979
status = status,
@@ -122,17 +122,17 @@ private fun AttendanceStatusRow(
122122

123123
@Composable
124124
private fun BookingAttendanceStatus.description(): String = when (this) {
125-
BookingAttendanceStatus.BOOKED -> R.string.booking_attendance_status_booked_desc
126-
BookingAttendanceStatus.CHECKED_IN -> R.string.booking_attendance_status_checked_in_desc
127-
BookingAttendanceStatus.NO_SHOW -> R.string.booking_attendance_status_no_show_desc
125+
BookingAttendanceStatus.Booked -> R.string.booking_attendance_status_booked_desc
126+
BookingAttendanceStatus.CheckedIn -> R.string.booking_attendance_status_checked_in_desc
127+
BookingAttendanceStatus.NoShow -> R.string.booking_attendance_status_no_show_desc
128128
else -> null
129129
}?.let { stringResource(it) } ?: ""
130130

131131
private val BookingAttendanceStatus.iconRes: Int?
132132
get() = when (this) {
133-
BookingAttendanceStatus.BOOKED -> R.drawable.ic_attendance_booked
134-
BookingAttendanceStatus.CHECKED_IN -> R.drawable.ic_attendance_checked_in
135-
BookingAttendanceStatus.NO_SHOW -> R.drawable.ic_attendance_no_show
133+
BookingAttendanceStatus.Booked -> R.drawable.ic_attendance_booked
134+
BookingAttendanceStatus.CheckedIn -> R.drawable.ic_attendance_checked_in
135+
BookingAttendanceStatus.NoShow -> R.drawable.ic_attendance_no_show
136136
else -> null
137137
}
138138

@@ -151,7 +151,7 @@ private fun BookingAttendanceStatusBottomSheetPreview() {
151151
private fun AttendanceStatusRowPreview() {
152152
WooThemeWithBackground {
153153
AttendanceStatusRow(
154-
status = BookingAttendanceStatus.CHECKED_IN,
154+
status = BookingAttendanceStatus.CheckedIn,
155155
onClick = {}
156156
)
157157
}

0 commit comments

Comments
 (0)