From c2a9cfb7e758166e1d25c008264576bbebd81501 Mon Sep 17 00:00:00 2001 From: Agzamus Date: Thu, 3 Sep 2026 23:16:57 +0300 Subject: [PATCH] refactor: weeks select -> combobox --- .../vyatsu/ui/schedule/ScheduleScreen.kt | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt b/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt index 2d20e04..0b564c1 100644 --- a/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt +++ b/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt @@ -20,19 +20,27 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.CircularProgressIndicator +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.TrailingIcon import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState 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.unit.dp @@ -115,7 +123,7 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) { } HorizontalDivider(Modifier.padding(vertical = 8.dp)) - WeekChips( + WeekSelector( periods = schedule.periods, selectedWeekStart = state.weekStart, todayWeekStart = state.todayDate?.let { schedule.periodOf(it)?.weekStart }, @@ -152,39 +160,61 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) { } } +@OptIn(ExperimentalMaterial3Api::class) @Composable -private fun WeekChips( +private fun WeekSelector( periods: List, selectedWeekStart: LocalDate?, todayWeekStart: LocalDate?, onSelect: (LocalDate) -> Unit ) { - LazyRow(horizontalArrangement = Arrangement.spacedBy(6.dp)) { - items(periods, key = { it.weekStart.toEpochDay() }) { period -> - val selected = selectedWeekStart == period.weekStart - val isTodayWeek = todayWeekStart == period.weekStart - FilterChip( - selected = selected, - onClick = { onSelect(period.weekStart) }, - label = { - Text( - weekLabel(period), - style = MaterialTheme.typography.labelLarge - ) - }, - modifier = Modifier.padding(vertical = 2.dp), - border = if (isTodayWeek && !selected) { - FilterChipDefaults.filterChipBorder( - borderColor = MaterialTheme.colorScheme.primary, - borderWidth = 1.dp, - enabled = true, - selected = false - ) - } else { - FilterChipDefaults.filterChipBorder(enabled = true, selected = selected) - }, - shape = RoundedCornerShape(8.dp) - ) + val selected = periods.firstOrNull { it.weekStart == selectedWeekStart } + var expanded by remember { mutableStateOf(false) } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = it } + ) { + OutlinedTextField( + value = selected?.let(::weekLabel) ?: "Выберите период", + onValueChange = {}, + readOnly = true, + label = { Text("Период") }, + singleLine = true, + trailingIcon = { TrailingIcon(expanded = expanded) }, + modifier = Modifier + .fillMaxWidth() + .menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable, enabled = true) + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + periods.forEach { period -> + val isTodayWeek = todayWeekStart == period.weekStart + DropdownMenuItem( + text = { + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + weekLabel(period), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.weight(1f) + ) + if (isTodayWeek) { + Text( + "сегодня", + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.primary + ) + } + } + }, + onClick = { + expanded = false + onSelect(period.weekStart) + } + ) + } } } }