@@ -27,24 +27,37 @@ import androidx.compose.foundation.layout.padding
27
27
import androidx.compose.foundation.lazy.grid.GridCells
28
28
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
29
29
import androidx.compose.foundation.lazy.grid.items
30
+ import androidx.compose.foundation.text.input.TextFieldLineLimits
31
+ import androidx.compose.foundation.text.input.rememberTextFieldState
32
+ import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd
30
33
import androidx.compose.material3.Card as MaterialCard
31
34
import androidx.compose.material3.CenterAlignedTopAppBar
32
35
import androidx.compose.material3.CircularProgressIndicator
36
+ import androidx.compose.material3.DropdownMenuItem
33
37
import androidx.compose.material3.ExperimentalMaterial3Api
38
+ import androidx.compose.material3.ExposedDropdownMenuAnchorType
39
+ import androidx.compose.material3.ExposedDropdownMenuBox
40
+ import androidx.compose.material3.ExposedDropdownMenuDefaults
34
41
import androidx.compose.material3.Icon
35
42
import androidx.compose.material3.IconButton
36
43
import androidx.compose.material3.MaterialTheme
44
+ import androidx.compose.material3.ModalBottomSheet
37
45
import androidx.compose.material3.Scaffold
38
46
import androidx.compose.material3.SnackbarHost
39
47
import androidx.compose.material3.SnackbarHostState
40
48
import androidx.compose.material3.Text
49
+ import androidx.compose.material3.TextField
41
50
import androidx.compose.material3.TopAppBarDefaults
51
+ import androidx.compose.material3.rememberModalBottomSheetState
42
52
import androidx.compose.material3.rememberTopAppBarState
43
53
import androidx.compose.runtime.Composable
44
54
import androidx.compose.runtime.CompositionLocalProvider
45
55
import androidx.compose.runtime.LaunchedEffect
46
56
import androidx.compose.runtime.getValue
57
+ import androidx.compose.runtime.mutableStateOf
47
58
import androidx.compose.runtime.remember
59
+ import androidx.compose.runtime.rememberCoroutineScope
60
+ import androidx.compose.runtime.setValue
48
61
import androidx.compose.ui.Modifier
49
62
import androidx.compose.ui.graphics.Color
50
63
import androidx.compose.ui.input.nestedscroll.nestedScroll
@@ -78,6 +91,9 @@ fun CardsScreen(
78
91
snackbarHostState : SnackbarHostState = remember { SnackbarHostState () },
79
92
) {
80
93
val scaffoldBehavior = TopAppBarDefaults .pinnedScrollBehavior(rememberTopAppBarState())
94
+ val sheetState = rememberModalBottomSheetState()
95
+ val scope = rememberCoroutineScope()
96
+ var showBottomSheet by remember { mutableStateOf(false ) }
81
97
AppTheme {
82
98
Scaffold (
83
99
modifier = modifier
@@ -94,7 +110,7 @@ fun CardsScreen(
94
110
)
95
111
},
96
112
actions = {
97
- IconButton (onClick = { /* TODO */ }) {
113
+ IconButton (onClick = { showBottomSheet = true }) {
98
114
Icon (
99
115
imageVector = PtpIcons .Rounded .FilterList ,
100
116
contentDescription = stringResource(R .string.card_list_filters),
@@ -123,6 +139,20 @@ fun CardsScreen(
123
139
viewModel.snackbarMessageShown()
124
140
}
125
141
}
142
+
143
+ if (showBottomSheet) {
144
+ ModalBottomSheet (
145
+ onDismissRequest = {
146
+ showBottomSheet = false
147
+ },
148
+ sheetState = sheetState,
149
+ ) {
150
+ FilterContent (
151
+ currentFilter = uiState.filter,
152
+ viewModel::setFiltering,
153
+ )
154
+ }
155
+ }
126
156
}
127
157
}
128
158
}
@@ -149,6 +179,59 @@ private fun CardsContent(
149
179
}
150
180
}
151
181
182
+ @OptIn(ExperimentalMaterial3Api ::class )
183
+ @Composable
184
+ fun FilterContent (
185
+ currentFilter : CardsFilterType ,
186
+ onFilterChange : (CardsFilterType ) -> Unit ,
187
+ modifier : Modifier = Modifier ,
188
+ ) {
189
+ Column (
190
+ modifier = modifier
191
+ .fillMaxWidth()
192
+ .padding(horizontal = 16 .dp, vertical = 24 .dp),
193
+ ) {
194
+ // dropdown for set?
195
+ val options = CardsFilterType .entries
196
+ var expanded by remember { mutableStateOf(false ) }
197
+ val textFieldState = rememberTextFieldState(currentFilter.name)
198
+ ExposedDropdownMenuBox (
199
+ expanded = expanded,
200
+ onExpandedChange = { expanded = it },
201
+ modifier = Modifier .fillMaxWidth(),
202
+ ) {
203
+ TextField (
204
+ modifier = Modifier
205
+ .menuAnchor(ExposedDropdownMenuAnchorType .PrimaryNotEditable )
206
+ .fillMaxWidth(),
207
+ state = textFieldState,
208
+ readOnly = true ,
209
+ lineLimits = TextFieldLineLimits .SingleLine ,
210
+ label = {
211
+ Text (" Set" )
212
+ },
213
+ )
214
+ ExposedDropdownMenu (
215
+ expanded = expanded,
216
+ onDismissRequest = { expanded = false },
217
+ ) {
218
+ options.forEach { option ->
219
+ val label = stringResource(option.titleResId)
220
+ DropdownMenuItem (
221
+ text = { Text (label, style = MaterialTheme .typography.bodyLarge) },
222
+ onClick = {
223
+ textFieldState.setTextAndPlaceCursorAtEnd(label)
224
+ expanded = false
225
+ onFilterChange(option)
226
+ },
227
+ contentPadding = ExposedDropdownMenuDefaults .ItemContentPadding ,
228
+ )
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+
152
235
@Composable
153
236
private fun CardsList (
154
237
cards : ImmutableList <Card >,
0 commit comments