From 7c3391b2b248e4c8cdacd4ab30606fa4be4172b8 Mon Sep 17 00:00:00 2001 From: Hicham Boushaba Date: Fri, 10 May 2024 16:05:30 +0100 Subject: [PATCH] Introduce a common component to use as header of the filterable cards --- .../DashboardFilterableCardHeader.kt | 129 ++++++++++++++++++ WooCommerce/src/main/res/values/strings.xml | 2 + 2 files changed, 131 insertions(+) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/DashboardFilterableCardHeader.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/DashboardFilterableCardHeader.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/DashboardFilterableCardHeader.kt new file mode 100644 index 00000000000..bb2621d15a8 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/dashboard/DashboardFilterableCardHeader.kt @@ -0,0 +1,129 @@ +package com.woocommerce.android.ui.dashboard + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.ContentAlpha +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.FilterList +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.woocommerce.android.R +import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground + +@Composable +fun DashboardFilterableCardHeader( + title: String, + currentFilter: T, + filterList: List, + onFilterSelected: (T) -> Unit, + modifier: Modifier = Modifier, + mapper: @Composable (T) -> String = { it.toString() } +) { + Row( + horizontalArrangement = Arrangement.spacedBy(dimensionResource(id = R.dimen.minor_100)), + verticalAlignment = Alignment.CenterVertically, + modifier = modifier.padding( + start = dimensionResource(id = R.dimen.major_100) + ) + ) { + Text( + text = title, + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onSurface + ) + + Text( + text = mapper(currentFilter), + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium) + ) + + Spacer(modifier = Modifier.weight(1f)) + + Box { + var isMenuExpanded by remember { mutableStateOf(false) } + IconButton( + onClick = { isMenuExpanded = true } + ) { + Icon( + imageVector = Icons.Default.FilterList, + contentDescription = stringResource( + id = R.string.dashboard_filter_menu_content_description + ), + tint = MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium) + ) + } + + DropdownMenu( + expanded = isMenuExpanded, + onDismissRequest = { isMenuExpanded = false }, + modifier = Modifier + .defaultMinSize(minWidth = 250.dp) + ) { + filterList.forEach { + DropdownMenuItem( + onClick = { + onFilterSelected(it) + isMenuExpanded = false + } + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.minor_100)) + ) { + Text(text = mapper(it)) + Spacer(modifier = Modifier.weight(1f)) + if (currentFilter == it) { + Icon( + imageVector = Icons.Default.Check, + contentDescription = stringResource(id = androidx.compose.ui.R.string.selected), + tint = MaterialTheme.colors.primary + ) + } else { + Spacer(modifier = Modifier.size(dimensionResource(R.dimen.image_minor_50))) + } + } + } + } + } + } + } +} + +@Composable +@Preview +private fun DashboardFilterableCardHeaderPreview() { + val filters = remember { + listOf("Filter 1", "Filter 2", "Filter 3") + } + var currentFilter by remember { mutableStateOf("Filter 1") } + WooThemeWithBackground { + DashboardFilterableCardHeader( + title = "Title", + currentFilter = currentFilter, + filterList = filters, + onFilterSelected = { currentFilter = it }, + modifier = Modifier + ) + } +} diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 9c8e9495bb2..1aa7cfaea3d 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -371,6 +371,7 @@ Months Years Change date range button + Open filter dropdown Visitors Orders @@ -417,6 +418,7 @@ Unable to load data contact support.]]> + Status