refactor: weeks select -> combobox
This commit is contained in:
@@ -20,19 +20,27 @@ import androidx.compose.foundation.shape.RoundedCornerShape
|
|||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Refresh
|
import androidx.compose.material.icons.filled.Refresh
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
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.FilterChip
|
||||||
import androidx.compose.material3.FilterChipDefaults
|
import androidx.compose.material3.FilterChipDefaults
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.OutlinedTextField
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextButton
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.material3.TopAppBar
|
import androidx.compose.material3.TopAppBar
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
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.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -115,7 +123,7 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) {
|
|||||||
}
|
}
|
||||||
HorizontalDivider(Modifier.padding(vertical = 8.dp))
|
HorizontalDivider(Modifier.padding(vertical = 8.dp))
|
||||||
|
|
||||||
WeekChips(
|
WeekSelector(
|
||||||
periods = schedule.periods,
|
periods = schedule.periods,
|
||||||
selectedWeekStart = state.weekStart,
|
selectedWeekStart = state.weekStart,
|
||||||
todayWeekStart = state.todayDate?.let { schedule.periodOf(it)?.weekStart },
|
todayWeekStart = state.todayDate?.let { schedule.periodOf(it)?.weekStart },
|
||||||
@@ -152,39 +160,61 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun WeekChips(
|
private fun WeekSelector(
|
||||||
periods: List<SchedulePeriod>,
|
periods: List<SchedulePeriod>,
|
||||||
selectedWeekStart: LocalDate?,
|
selectedWeekStart: LocalDate?,
|
||||||
todayWeekStart: LocalDate?,
|
todayWeekStart: LocalDate?,
|
||||||
onSelect: (LocalDate) -> Unit
|
onSelect: (LocalDate) -> Unit
|
||||||
) {
|
) {
|
||||||
LazyRow(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
|
val selected = periods.firstOrNull { it.weekStart == selectedWeekStart }
|
||||||
items(periods, key = { it.weekStart.toEpochDay() }) { period ->
|
var expanded by remember { mutableStateOf(false) }
|
||||||
val selected = selectedWeekStart == period.weekStart
|
|
||||||
val isTodayWeek = todayWeekStart == period.weekStart
|
ExposedDropdownMenuBox(
|
||||||
FilterChip(
|
expanded = expanded,
|
||||||
selected = selected,
|
onExpandedChange = { expanded = it }
|
||||||
onClick = { onSelect(period.weekStart) },
|
) {
|
||||||
label = {
|
OutlinedTextField(
|
||||||
Text(
|
value = selected?.let(::weekLabel) ?: "Выберите период",
|
||||||
weekLabel(period),
|
onValueChange = {},
|
||||||
style = MaterialTheme.typography.labelLarge
|
readOnly = true,
|
||||||
)
|
label = { Text("Период") },
|
||||||
},
|
singleLine = true,
|
||||||
modifier = Modifier.padding(vertical = 2.dp),
|
trailingIcon = { TrailingIcon(expanded = expanded) },
|
||||||
border = if (isTodayWeek && !selected) {
|
modifier = Modifier
|
||||||
FilterChipDefaults.filterChipBorder(
|
.fillMaxWidth()
|
||||||
borderColor = MaterialTheme.colorScheme.primary,
|
.menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable, enabled = true)
|
||||||
borderWidth = 1.dp,
|
)
|
||||||
enabled = true,
|
ExposedDropdownMenu(
|
||||||
selected = false
|
expanded = expanded,
|
||||||
)
|
onDismissRequest = { expanded = false }
|
||||||
} else {
|
) {
|
||||||
FilterChipDefaults.filterChipBorder(enabled = true, selected = selected)
|
periods.forEach { period ->
|
||||||
},
|
val isTodayWeek = todayWeekStart == period.weekStart
|
||||||
shape = RoundedCornerShape(8.dp)
|
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)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user