From 94a3838c7ca3a97bdd452c20f55aae7d53597593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B0=D1=88=D0=B8=D0=BD=20=D0=9C=D0=B0=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D0=BC?= Date: Tue, 26 Dec 2023 01:54:34 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D0=BE=D1=87=D0=B5,=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=D0=BE=20=D0=B1=D1=83=D0=B4=D0=B5=D1=82=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20coroutineScope=20=D0=BF=D0=BE=D1=81=D0=BC=D0=BE?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D1=82=D1=8C,=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D0=B8=20=D0=B8=D1=85=20=D0=B2=20ViewModel=20?= =?UTF-8?q?+=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D0=B1=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B4=D0=B5=D0=B7=D0=B8?= =?UTF-8?q?=D0=B3=D0=BD...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../database/entities/composeui/ReportPage.kt | 60 +++++++++---------- .../entities/composeui/ReportViewModel.kt | 46 ++++++++++++++ 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportPage.kt b/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportPage.kt index 180315b..65ac054 100644 --- a/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportPage.kt +++ b/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportPage.kt @@ -31,6 +31,7 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.verticalScroll +import androidx.compose.material.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card @@ -39,6 +40,7 @@ import androidx.compose.material3.DisplayMode import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.rememberDatePickerState @@ -71,6 +73,7 @@ import java.io.IOException import java.io.OutputStream import java.text.ParseException import java.text.SimpleDateFormat +import java.time.Year import java.util.Date import java.util.Locale @@ -78,6 +81,7 @@ import java.util.Locale @Composable fun ReportPage (navController: NavController?, viewModel: ReportViewModel = viewModel(factory = AppViewModelProvider.Factory)) { + val context = LocalContext.current val coroutineScope = rememberCoroutineScope() @@ -86,8 +90,6 @@ fun ReportPage (navController: NavController?, viewModel: ReportViewModel = view val startDateText = remember { mutableStateOf("") } val endDateText = remember { mutableStateOf("") } - // Boolean state to track the visibility of the Card - var cardVisible by remember { mutableStateOf(false) } Column( modifier = Modifier @@ -160,19 +162,7 @@ fun ReportPage (navController: NavController?, viewModel: ReportViewModel = view Button( onClick = { coroutineScope.launch { - val startDate = parseDate(startDateText.value) - val endDate = parseDate(endDateText.value) - - if (startDate != null && endDate != null) { - viewModel.onUpdate( - viewModel.reportPageUiState.reportDetails.copy(startDate = startDate, endDate = endDate) - ) - viewModel.getReport() - // Show the Card with animation - cardVisible = true - } else { - // Handle parsing errors here if necessary - } + viewModel.onButtonClick(startDateText.value, endDateText.value) } }, modifier = Modifier @@ -185,10 +175,33 @@ fun ReportPage (navController: NavController?, viewModel: ReportViewModel = view Text("Сформировать отчет") } + viewModel.errorState?.let { errorMessage -> + AlertDialog( + onDismissRequest = { viewModel.errorState = null }, + title = { Text(text = "Ошибка") }, + text = { Text(errorMessage, color = MaterialTheme.colorScheme.onBackground) }, + buttons = { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + horizontalArrangement = Arrangement.End + ) { + TextButton(onClick = { viewModel.errorState = null }) { + Text("Закрыть", color = MaterialTheme.colorScheme.onBackground) + } + } + }, + modifier = Modifier.padding(16.dp), + backgroundColor = MaterialTheme.colorScheme.background, + contentColor = MaterialTheme.colorScheme.onBackground + ) + } + Spacer(modifier = Modifier.height(8.dp)) // Use AnimatedVisibility to animate the Card visibility - AnimatedVisibility(visible = cardVisible) { + AnimatedVisibility(visible = viewModel.cardVisible) { Card( border = BorderStroke(2.dp, MaterialTheme.colorScheme.onBackground), modifier = Modifier @@ -271,21 +284,6 @@ private fun parseDate(dateString: String): Date? { } } -@Composable -fun RowScope.TableCell( - text: String, - weight: Float -) { - Text( - text = text, - Modifier - .border(1.dp, Color.Black) - .weight(weight) - .padding(8.dp) - ) -} - - @Composable fun TableScreen(reportData: List) { diff --git a/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportViewModel.kt b/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportViewModel.kt index ee5e031..eb82ac2 100644 --- a/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportViewModel.kt +++ b/app/src/main/java/com/example/myapplication/database/entities/composeui/ReportViewModel.kt @@ -6,8 +6,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.example.myapplication.api.item.RestItemRepository import com.example.myapplication.api.report.ReportRemote +import kotlinx.coroutines.launch +import java.text.ParseException import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -19,6 +22,11 @@ class ReportViewModel(private val itemRespository: RestItemRepository): ViewMode var reportResultPageUiState by mutableStateOf(ReportResultPageUiState()) private set + var cardVisible by mutableStateOf(false) + private set + + var errorState by mutableStateOf(null) + fun onUpdate(reportDetails: ReportDetails) { reportPageUiState = ReportPageUiState(reportDetails = reportDetails, isEntryValid = validateInput(reportDetails)) } @@ -45,6 +53,44 @@ class ReportViewModel(private val itemRespository: RestItemRepository): ViewMode suspend fun generatePdfFile(context: Context, fileName: String, reportData: List) { itemRespository.createPdfFile(context, fileName, reportData) } + + fun onButtonClick(startDate: String, endDate: String) { + viewModelScope.launch { + val parsedStartDate = parseDate(startDate) + val parsedEndDate = parseDate(endDate) + + if (validateDates(parsedStartDate, parsedEndDate)) { + updateReportDetails(parsedStartDate, parsedEndDate) + getReport() + cardVisible = true + } else { + Log.d("Ошибка даты", "Неправильно указаны даты или года не являются 4-значными =${startDate}") + errorState = "Ошибка фильтраций: неверно указаны даты" + } + } + } + + private fun validateDates(startDate: Date?, endDate: Date?): Boolean { + return startDate != null && endDate != null && startDate < endDate + } + + private fun updateReportDetails(startDate: Date?, endDate: Date?) { + if (startDate != null && endDate != null) { + onUpdate(reportPageUiState.reportDetails.copy(startDate = startDate, endDate = endDate)) + } + } + + private fun parseDate(dateString: String): Date? { + return try { + // Use SimpleDateFormat or any other method to parse the string into a Date object + // For example: + SimpleDateFormat("yyyy", Locale.getDefault()).parse(dateString) + } catch (e: ParseException) { + // Handle parsing error + null + } + } + } data class ReportDetails(