|
|
|
@@ -3,7 +3,9 @@ package agzam.vyatsu.ui.schedule
|
|
|
|
|
import agzam.vyatsu.domain.model.Day
|
|
|
|
|
import agzam.vyatsu.domain.model.SchedulePeriod
|
|
|
|
|
import agzam.vyatsu.domain.model.TimeSlot
|
|
|
|
|
import androidx.compose.foundation.clickable
|
|
|
|
|
import androidx.compose.foundation.layout.Arrangement
|
|
|
|
|
import androidx.compose.foundation.layout.Box
|
|
|
|
|
import androidx.compose.foundation.layout.Column
|
|
|
|
|
import androidx.compose.foundation.layout.Row
|
|
|
|
|
import androidx.compose.foundation.layout.WindowInsets
|
|
|
|
@@ -12,14 +14,18 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
|
|
import androidx.compose.foundation.layout.only
|
|
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
|
|
import androidx.compose.foundation.layout.systemBars
|
|
|
|
|
import androidx.compose.foundation.layout.widthIn
|
|
|
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
|
|
|
import androidx.compose.foundation.lazy.LazyRow
|
|
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
|
|
import androidx.compose.foundation.lazy.itemsIndexed
|
|
|
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
|
|
import androidx.compose.material.icons.filled.ArrowDropDown
|
|
|
|
|
import androidx.compose.material.icons.filled.Refresh
|
|
|
|
|
import androidx.compose.material3.CircularProgressIndicator
|
|
|
|
|
import androidx.compose.material3.DropdownMenu
|
|
|
|
|
import androidx.compose.material3.DropdownMenuItem
|
|
|
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
|
|
|
import androidx.compose.material3.FilterChip
|
|
|
|
|
import androidx.compose.material3.FilterChipDefaults
|
|
|
|
@@ -33,8 +39,12 @@ 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.draw.clip
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
|
import java.time.DayOfWeek
|
|
|
|
|
import java.time.LocalDate
|
|
|
|
@@ -98,10 +108,22 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) {
|
|
|
|
|
val isTodayDay = day.date == state.todayDate
|
|
|
|
|
val dayLabel = if (isTodayDay) "Сегодня " else ""
|
|
|
|
|
|
|
|
|
|
Row(
|
|
|
|
|
Modifier.fillMaxWidth(),
|
|
|
|
|
verticalAlignment = Alignment.CenterVertically
|
|
|
|
|
) {
|
|
|
|
|
Text(
|
|
|
|
|
"$dayLabel${dayName(day.date.dayOfWeek)} · ${day.date.format(FULL_DATE)}",
|
|
|
|
|
style = MaterialTheme.typography.titleMedium
|
|
|
|
|
style = MaterialTheme.typography.titleMedium,
|
|
|
|
|
modifier = Modifier.weight(1f)
|
|
|
|
|
)
|
|
|
|
|
WeekSelector(
|
|
|
|
|
periods = schedule.periods,
|
|
|
|
|
selectedWeekStart = state.weekStart,
|
|
|
|
|
todayWeekStart = state.todayDate?.let { schedule.periodOf(it)?.weekStart },
|
|
|
|
|
onSelect = viewModel::selectWeek
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
Row(
|
|
|
|
|
Modifier.fillMaxWidth(),
|
|
|
|
|
horizontalArrangement = Arrangement.spacedBy(8.dp)
|
|
|
|
@@ -115,15 +137,6 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) {
|
|
|
|
|
}
|
|
|
|
|
HorizontalDivider(Modifier.padding(vertical = 8.dp))
|
|
|
|
|
|
|
|
|
|
WeekChips(
|
|
|
|
|
periods = schedule.periods,
|
|
|
|
|
selectedWeekStart = state.weekStart,
|
|
|
|
|
todayWeekStart = state.todayDate?.let { schedule.periodOf(it)?.weekStart },
|
|
|
|
|
onSelect = viewModel::selectWeek
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
HorizontalDivider(Modifier.padding(vertical = 8.dp))
|
|
|
|
|
|
|
|
|
|
DayChips(
|
|
|
|
|
days = weekDays,
|
|
|
|
|
selectedDate = state.dayDate,
|
|
|
|
@@ -152,42 +165,70 @@ fun ScheduleScreen(viewModel: ScheduleViewModel, onSwitchGroup: () -> Unit) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
|
|
|
@Composable
|
|
|
|
|
private fun WeekChips(
|
|
|
|
|
private fun WeekSelector(
|
|
|
|
|
periods: List<SchedulePeriod>,
|
|
|
|
|
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 selected = periods.firstOrNull { it.weekStart == selectedWeekStart }
|
|
|
|
|
var expanded by remember { mutableStateOf(false) }
|
|
|
|
|
|
|
|
|
|
Box {
|
|
|
|
|
Row(
|
|
|
|
|
modifier = Modifier
|
|
|
|
|
.clip(MaterialTheme.shapes.small)
|
|
|
|
|
.clickable(enabled = true, onClick = { expanded = true })
|
|
|
|
|
.padding(horizontal = 10.dp, vertical = 8.dp),
|
|
|
|
|
verticalAlignment = Alignment.CenterVertically
|
|
|
|
|
) {
|
|
|
|
|
Text(
|
|
|
|
|
selected?.let(::weekLabel) ?: "Период",
|
|
|
|
|
style = MaterialTheme.typography.labelLarge,
|
|
|
|
|
color = MaterialTheme.colorScheme.primary
|
|
|
|
|
)
|
|
|
|
|
Icon(
|
|
|
|
|
imageVector = Icons.Default.ArrowDropDown,
|
|
|
|
|
contentDescription = null,
|
|
|
|
|
tint = MaterialTheme.colorScheme.primary
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
DropdownMenu(
|
|
|
|
|
expanded = expanded,
|
|
|
|
|
onDismissRequest = { expanded = false },
|
|
|
|
|
modifier = Modifier.widthIn(min = 220.dp)
|
|
|
|
|
) {
|
|
|
|
|
periods.forEach { period ->
|
|
|
|
|
val isTodayWeek = todayWeekStart == period.weekStart
|
|
|
|
|
FilterChip(
|
|
|
|
|
selected = selected,
|
|
|
|
|
onClick = { onSelect(period.weekStart) },
|
|
|
|
|
label = {
|
|
|
|
|
DropdownMenuItem(
|
|
|
|
|
text = {
|
|
|
|
|
Text(
|
|
|
|
|
weekLabel(period),
|
|
|
|
|
style = MaterialTheme.typography.labelLarge
|
|
|
|
|
style = MaterialTheme.typography.bodyLarge
|
|
|
|
|
)
|
|
|
|
|
},
|
|
|
|
|
modifier = Modifier.padding(vertical = 2.dp),
|
|
|
|
|
border = if (isTodayWeek && !selected) {
|
|
|
|
|
FilterChipDefaults.filterChipBorder(
|
|
|
|
|
borderColor = MaterialTheme.colorScheme.primary,
|
|
|
|
|
borderWidth = 1.dp,
|
|
|
|
|
enabled = true,
|
|
|
|
|
selected = false
|
|
|
|
|
trailingIcon = if (isTodayWeek) {
|
|
|
|
|
{
|
|
|
|
|
Text(
|
|
|
|
|
"сегодня",
|
|
|
|
|
style = MaterialTheme.typography.labelMedium,
|
|
|
|
|
color = MaterialTheme.colorScheme.primary
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
FilterChipDefaults.filterChipBorder(enabled = true, selected = selected)
|
|
|
|
|
null
|
|
|
|
|
},
|
|
|
|
|
shape = RoundedCornerShape(8.dp)
|
|
|
|
|
onClick = {
|
|
|
|
|
expanded = false
|
|
|
|
|
onSelect(period.weekStart)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
private fun DayChips(
|
|
|
|
|