Добавил роль, добавил UI ограничения по ролям

This commit is contained in:
Кашин Максим 2023-12-24 18:39:23 +04:00
parent 54ee3a0a18
commit 3fe3d41253
4 changed files with 115 additions and 70 deletions

View File

@ -64,27 +64,30 @@ fun BikeList(
Scaffold( Scaffold(
topBar = {}, topBar = {},
floatingActionButton = { floatingActionButton = {
Box( if(getUser?.role == "admin") {
contentAlignment = Alignment.Center Box(
) { contentAlignment = Alignment.Center
FloatingActionButton(
onClick = {
val route = Screen.BikeEdit.route.replace("{id}", 0.toString())
navController.navigate(route)
},
modifier = Modifier.fillMaxWidth(0.92f).align(Alignment.BottomCenter),
containerColor = MaterialTheme.colorScheme.primary
) { ) {
Icon( FloatingActionButton(
Icons.Filled.Add, onClick = {
"Добавить", val route = Screen.BikeEdit.route.replace("{id}", 0.toString())
tint = MaterialTheme.colorScheme.onPrimary navController.navigate(route)
) },
modifier = Modifier.fillMaxWidth(0.92f).align(Alignment.BottomCenter),
containerColor = MaterialTheme.colorScheme.primary
) {
Icon(
Icons.Filled.Add,
"Добавить",
tint = MaterialTheme.colorScheme.onPrimary
)
}
} }
} }
} }
) { innerPadding -> ) { innerPadding ->
BikeList( BikeList(
currentUserViewModel = currentUserViewModel,
modifier = Modifier modifier = Modifier
.padding(innerPadding) .padding(innerPadding)
.fillMaxSize(), .fillMaxSize(),
@ -115,8 +118,11 @@ private fun BikeList(
pagingBike: LazyPagingItems<Bike>, pagingBike: LazyPagingItems<Bike>,
onClick: (uid: Int) -> Unit, onClick: (uid: Int) -> Unit,
onDeleteClick: (bike: Bike) -> Unit, onDeleteClick: (bike: Bike) -> Unit,
onEditClick: (bike: Int) -> Unit onEditClick: (bike: Int) -> Unit,
currentUserViewModel: CurrentUserViewModel = viewModel(factory = AppViewModelProvider.Factory)
) { ) {
var getUser by remember { mutableStateOf(currentUserViewModel.user) }
Column( Column(
modifier = modifier modifier = modifier
) { ) {
@ -124,12 +130,13 @@ private fun BikeList(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(all = 10.dp) .padding(all = 10.dp)
.padding(bottom = 72.dp) // Добавим отступ внизу .then(if (getUser?.role == "admin") Modifier.padding(bottom = 72.dp) else Modifier)
) { ) {
items(pagingBike.itemCount) { index -> items(pagingBike.itemCount) { index ->
val bike = pagingBike[index] val bike = pagingBike[index]
if (bike != null) { if (bike != null) {
BikeListItem( BikeListItem(
currentUserViewModel = currentUserViewModel,
bike = bike, bike = bike,
modifier = Modifier modifier = Modifier
.padding(vertical = 7.dp) .padding(vertical = 7.dp)
@ -151,21 +158,24 @@ private fun BikeList(
@Composable @Composable
private fun BikeListItem( private fun BikeListItem(
currentUserViewModel: CurrentUserViewModel = viewModel(factory = AppViewModelProvider.Factory),
bike: Bike, bike: Bike,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onDeleteClick: (bike: Bike) -> Unit, onDeleteClick: (bike: Bike) -> Unit,
onClick: (uid: Int) -> Unit, onClick: (uid: Int) -> Unit,
onEditClick: (bike: Int) -> Unit onEditClick: (bike: Int) -> Unit
) { ) {
var getUser by remember { mutableStateOf(currentUserViewModel.user) }
var isExpanded by remember { mutableStateOf(false) } // Состояние для определения, раскрыта ли дополнительная информация о велосипеде var isExpanded by remember { mutableStateOf(false) } // Состояние для определения, раскрыта ли дополнительная информация о велосипеде
Box( Box(
modifier = modifier modifier = modifier
.clip(RoundedCornerShape(8.dp)) .clip(RoundedCornerShape(8.dp))
//.background(Color.White)
.shadow(4.dp) .shadow(4.dp)
.padding(8.dp) .padding(8.dp)
.clickable { isExpanded = !isExpanded } // Добавляем обработчик нажатия для раскрытия/скрытия дополнительной информации .clickable {
isExpanded = !isExpanded
} // Добавляем обработчик нажатия для раскрытия/скрытия дополнительной информации
) { ) {
Column(Modifier.padding(8.dp)) { Column(Modifier.padding(8.dp)) {
Row( Row(
@ -177,7 +187,10 @@ private fun BikeListItem(
modifier = Modifier modifier = Modifier
.size(90.dp) .size(90.dp)
.padding(4.dp) .padding(4.dp)
.border(width = 1.dp, color = MaterialTheme.colorScheme.secondary) // Добавляем рамку .border(
width = 1.dp,
color = MaterialTheme.colorScheme.secondary
) // Добавляем рамку
) { ) {
Image( Image(
bitmap = BitmapFactory.decodeByteArray( bitmap = BitmapFactory.decodeByteArray(
@ -197,16 +210,19 @@ private fun BikeListItem(
) )
// Добавляем пустое пространство для разделения текста и кнопок // Добавляем пустое пространство для разделения текста и кнопок
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
IconButton( if (getUser?.role == "admin") {
onClick = { onEditClick(bike.uid) }, IconButton(
modifier = Modifier.size(24.dp) onClick = { onEditClick(bike.uid) },
) { modifier = Modifier.size(24.dp)
Icon( ) {
imageVector = Icons.Default.Edit, Icon(
contentDescription = "Редактировать", imageVector = Icons.Default.Edit,
tint = MaterialTheme.colorScheme.secondary, contentDescription = "Редактировать",
) tint = MaterialTheme.colorScheme.secondary,
)
}
} }
IconButton( IconButton(
onClick = { onClick(bike.uid) }, onClick = { onClick(bike.uid) },
@ -218,15 +234,17 @@ private fun BikeListItem(
tint = MaterialTheme.colorScheme.secondary, tint = MaterialTheme.colorScheme.secondary,
) )
} }
IconButton( if (getUser?.role == "admin") {
onClick = { onDeleteClick(bike) }, IconButton(
modifier = Modifier.size(24.dp) onClick = { onDeleteClick(bike) },
) { modifier = Modifier.size(24.dp)
Icon( ) {
imageVector = Icons.Default.Delete, Icon(
contentDescription = "Удалить", imageVector = Icons.Default.Delete,
tint = MaterialTheme.colorScheme.secondary, contentDescription = "Удалить",
) tint = MaterialTheme.colorScheme.secondary,
)
}
} }
} }
AnimatedVisibility(visible = isExpanded) { // Анимированная видимость для дополнительной информации AnimatedVisibility(visible = isExpanded) { // Анимированная видимость для дополнительной информации

View File

@ -20,6 +20,10 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
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.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
@ -39,6 +43,8 @@ fun BikeView(
viewModel: BikeViewModel = viewModel(factory = AppViewModelProvider.Factory), viewModel: BikeViewModel = viewModel(factory = AppViewModelProvider.Factory),
currentUserViewModel: CurrentUserViewModel = viewModel(factory = AppViewModelProvider.Factory) currentUserViewModel: CurrentUserViewModel = viewModel(factory = AppViewModelProvider.Factory)
) { ) {
var getUser by remember { mutableStateOf(currentUserViewModel.user) }
val bikeUiState = viewModel.bikeUiState val bikeUiState = viewModel.bikeUiState
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
@ -119,21 +125,22 @@ fun BikeView(
.weight(1f) // Занимает доступное пространство .weight(1f) // Занимает доступное пространство
.padding(top = 8.dp, bottom = 8.dp) .padding(top = 8.dp, bottom = 8.dp)
) )
if (getUser?.role == "admin") {
IconButton( IconButton(
onClick = { onClick = {
val route = Screen.ItemEdit.route.replace("{id}", 0.toString()) val route = Screen.ItemEdit.route.replace("{id}", 0.toString())
.replace( .replace(
"{bikeId}", "{bikeId}",
bikeUiState.bikeWithItems?.bike?.uid.toString() bikeUiState.bikeWithItems?.bike?.uid.toString()
) )
navController.navigate(route) navController.navigate(route)
}
) {
Icon(
imageVector = Icons.Filled.Add,
contentDescription = "Добавить сеанс",
)
} }
) {
Icon(
imageVector = Icons.Filled.Add,
contentDescription = "Добавить сеанс",
)
} }
} }
if (bikeUiState.bikeWithItems != null) { if (bikeUiState.bikeWithItems != null) {

View File

@ -52,7 +52,7 @@ fun ItemList(
val bikeWithItems = bikeWithItemsViewModel.bikeUiState.bikeWithItems!! val bikeWithItems = bikeWithItemsViewModel.bikeUiState.bikeWithItems!!
var getUser by remember { mutableStateOf(currentUserViewModel.user) } var getUser by remember { mutableStateOf(currentUserViewModel.user) }
Log.d("Пожалуйста, работай","${getUser?.uid}") Log.d("Пожалуйста, работай", "${getUser?.uid}")
LazyColumn { LazyColumn {
if (bikeWithItems.items.isEmpty()) { if (bikeWithItems.items.isEmpty()) {
@ -73,7 +73,7 @@ fun ItemList(
val dateFormatter = DateTimeFormatter.ofPattern("yyyy") val dateFormatter = DateTimeFormatter.ofPattern("yyyy")
val formattedDate = dateFormatter.format(item.dateTime) val formattedDate = dateFormatter.format(item.dateTime)
Column { Column {
/* Text( /* Text(
text = formattedDate, text = formattedDate,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,
)*/ )*/
@ -118,7 +118,12 @@ fun ItemList(
onClick = { onClick = {
coroutineScope.launch { coroutineScope.launch {
if (item.availableCount != 0) { if (item.availableCount != 0) {
getUser?.uid?.let { viewModel.addItemInCart(userId = it,itemId = item.uid) } getUser?.uid?.let {
viewModel.addItemInCart(
userId = it,
itemId = item.uid
)
}
} }
} }
}, },
@ -130,20 +135,22 @@ fun ItemList(
tint = MaterialTheme.colorScheme.onPrimary tint = MaterialTheme.colorScheme.onPrimary
) )
} }
IconButton( if (getUser?.role == "admin") {
onClick = { IconButton(
coroutineScope.launch { onClick = {
viewModel.deleteItem(item = item) coroutineScope.launch {
bikeWithItemsViewModel.refreshState() viewModel.deleteItem(item = item)
} bikeWithItemsViewModel.refreshState()
}, }
) { },
Icon( ) {
imageVector = Icons.Default.Delete, Icon(
contentDescription = null, imageVector = Icons.Default.Delete,
modifier = Modifier.size(24.dp), contentDescription = null,
tint = MaterialTheme.colorScheme.onPrimary modifier = Modifier.size(24.dp),
) tint = MaterialTheme.colorScheme.onPrimary
)
}
} }
} }
} }

View File

@ -148,6 +148,19 @@
"bikeId": 3 "bikeId": 3
} }
] ]
},
{
"id": 11,
"userId": 10,
"items": [
{
"id": 6,
"dateTime": 2020,
"frozenWeight": 23.6,
"count": 1,
"bikeId": 3
}
]
} }
], ],
"items": [ "items": [
@ -57774,7 +57787,7 @@
}, },
{ {
"id": 3, "id": 3,
"name": "не велосипед ", "name": "не велосипед 5",
"description": "очень дорогие вложении с уважением Александр и я не могу найти в интернете и я не могу найти в интернете и я не смогу быть у вас есть вопросы пишите ", "description": "очень дорогие вложении с уважением Александр и я не могу найти в интернете и я не могу найти в интернете и я не смогу быть у вас есть вопросы пишите ",
"image": [ "image": [
-1, -1,