Coverage Summary for Class: SurferDropdownKt (com.georgeci.moneysurfer.uikit.components)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| SurferDropdownKt |
100%
(1/1)
|
66.7%
(6/9)
|
66.7%
(12/18)
|
75.9%
(22/29)
|
81%
(440/543)
|
package com.georgeci.moneysurfer.uikit.components
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuAnchorType
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun <T> SurferDropdown(
items: List<T>,
selected: T?,
label: String,
itemName: (T) -> String,
onItemSelected: (T) -> Unit,
modifier: Modifier = Modifier,
) {
val expanded = remember { mutableStateOf(false) }
ExposedDropdownMenuBox(
expanded = expanded.value,
onExpandedChange = { expanded.value = it },
modifier = modifier,
) {
OutlinedTextField(
value = selected?.let(itemName).orEmpty(),
onValueChange = {},
readOnly = true,
label = { Text(label) },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded.value) },
modifier = Modifier
.fillMaxWidth()
.menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable),
)
ExposedDropdownMenu(
expanded = expanded.value,
onDismissRequest = { expanded.value = false },
) {
items.forEach { item ->
DropdownMenuItem(
text = { Text(itemName(item)) },
onClick = {
onItemSelected(item)
expanded.value = false
},
)
}
}
}
}