From 262573b71eac550b94802052a2242452349c00bf Mon Sep 17 00:00:00 2001 From: drnal Date: Fri, 5 Dec 2025 18:52:09 +0700 Subject: [PATCH] Add bookscreen --- .../work/ui/screen/NavigationGraph.kt | 17 +- .../work/ui/screen/book/BookScreen.kt | 172 ++++++++++++++++++ .../work/ui/screen/book/BookViewModel.java | 6 + app/src/main/res/values/colors.xml | 1 + 4 files changed, 191 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/screen/book/BookViewModel.java diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt index 1d26087..7b1377e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt @@ -15,6 +15,7 @@ import ru.myitschool.work.ui.nav.AuthScreenDestination import ru.myitschool.work.ui.nav.BookScreenDestination import ru.myitschool.work.ui.nav.MainScreenDestination import ru.myitschool.work.ui.screen.auth.AuthScreen +import ru.myitschool.work.ui.screen.book.BookScreen @Composable fun AppNavHost( @@ -39,11 +40,17 @@ fun AppNavHost( } } composable { - Box( - contentAlignment = Alignment.Center - ) { - Text(text = "Hello") - } + BookScreen( + selectedDateIndex = 0, + onDateClick = {}, + //selectedPlaceIndex = null, + //onPlaceSelect = {}, + error = null, + isEmpty = false, + onRefresh = {}, + onBack = { navController.popBackStack() }, + onBook = {} + ) } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt new file mode 100644 index 0000000..6c47300 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookScreen.kt @@ -0,0 +1,172 @@ +package ru.myitschool.work.ui.screen.book + +import android.R +import androidx.annotation.ColorRes +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.horizontalScroll +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.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.selection.selectable +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CheckboxDefaults.colors +import androidx.compose.material3.RadioButton +import androidx.compose.material3.RadioButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.graphics.Color +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavController +import ru.myitschool.work.core.TestIds +import ru.myitschool.work.ui.nav.MainScreenDestination +import ru.myitschool.work.ui.screen.auth.AuthState +import ru.myitschool.work.ui.screen.auth.AuthViewModel + +@Composable +fun BookScreen( + dates: List = listOf("19.04", "20.04", "21.04", "22.04"), + selectedDateIndex: Int, + onDateClick: (Int) -> Unit, + + places: List = listOf( +"Рабочее место у окна", +"Переговорная комната №1", +"Коворкинг A" +), + myColor: Color = Color(0xFF0090FF), + error: String?, + isEmpty: Boolean, + onRefresh: () -> Unit, + onBack: () -> Unit, + onBook: () -> Unit +) { + // Локальное состояние выбранного места + var selectedPlaceIndex by remember { mutableStateOf(null) } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp) + ) { + + Button( + modifier = Modifier.testTag(TestIds.Book.BACK_BUTTON), + onClick = onBack, + colors = ButtonDefaults.buttonColors( containerColor = myColor ), + ) + {Text("Назад")} + + // Горизонтальные даты + Row( + modifier = Modifier + .horizontalScroll(rememberScrollState()) + .padding(top = 16.dp) + ) { + dates.forEachIndexed { index, date -> + Box( + modifier = Modifier + .width(60.dp) + .height(40.dp) + .border( + width = 2.dp, + color = if (index == selectedDateIndex) myColor else Color.LightGray, + shape = RoundedCornerShape(6.dp) + ) + .background(Color.White, RoundedCornerShape(6.dp)) + .clickable { onDateClick(index) } + .padding(8.dp) + ) { + Text( + text = date, + modifier = Modifier.align(Alignment.Center), + textAlign = TextAlign.Center + ) + } + Spacer(modifier = Modifier.width(8.dp)) + } + } + + Spacer(Modifier.height(20.dp)) + + // Места + Column { + places.forEachIndexed { index, place -> + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Text(place) + + RadioButton( + selected = selectedPlaceIndex == index, + onClick = { selectedPlaceIndex = index }, + colors = RadioButtonDefaults.colors( + selectedColor = myColor, + unselectedColor = Color.Gray + ) + ) + } + } + } + + if (error != null) { + Text( + text = error, + color = Color.Red, + modifier = Modifier.padding(top = 8.dp).testTag(TestIds.Book.ERROR) + ) + } + + if (isEmpty) { + Text( + text = "Всё забронировано", + modifier = Modifier.padding(top = 12.dp).testTag(TestIds.Book.EMPTY) + ) + Button( + onClick = onRefresh, + modifier = Modifier.padding(top = 12.dp).testTag(TestIds.Book.REFRESH_BUTTON), + colors = ButtonDefaults.buttonColors( containerColor = myColor ) + + ) { + Text("Обновить") + } + } + + Button( + onClick = onBook, + modifier = Modifier + .fillMaxWidth() + .padding(top = 20.dp), + colors = ButtonDefaults.buttonColors( containerColor = myColor ) + + ) { + Text("Забронировать") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/book/BookViewModel.java b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookViewModel.java new file mode 100644 index 0000000..f22f49a --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/screen/book/BookViewModel.java @@ -0,0 +1,6 @@ +package ru.myitschool.work.ui.screen.book; + +import android.app.Application; + +class BookViewModel { +} diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..60d5536 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,4 +7,5 @@ #FF018786 #FF000000 #FFFFFFFF + #517DFF \ No newline at end of file