From 7884b7e37414a673c8583b940f4f2ae465b2a6c4 Mon Sep 17 00:00:00 2001 From: Pedro Javier Date: Mon, 3 Aug 2026 13:31:26 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adir=20filtros=20en=20listado=20SAIS=20y?= =?UTF-8?q?=20eliminar=20SAIS=20Disponibles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/saipp/data/SaiRepository.kt | 23 ----- .../com/example/saipp/ui/AppNavigation.kt | 5 - .../ui/management/AvailableSaiListScreen.kt | 97 ------------------- .../example/saipp/ui/management/HomeScreen.kt | 17 ---- .../saipp/ui/management/SaiListScreen.kt | 45 ++++++++- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 41 insertions(+), 148 deletions(-) delete mode 100644 app/src/main/java/com/example/saipp/ui/management/AvailableSaiListScreen.kt diff --git a/app/src/main/java/com/example/saipp/data/SaiRepository.kt b/app/src/main/java/com/example/saipp/data/SaiRepository.kt index 41ebeac..f55ef6c 100644 --- a/app/src/main/java/com/example/saipp/data/SaiRepository.kt +++ b/app/src/main/java/com/example/saipp/data/SaiRepository.kt @@ -36,29 +36,6 @@ class SaiRepository { } } - suspend fun getAvailable(): Result> = withContext(Dispatchers.IO) { - val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error")) - try { - val sql = "SELECT id_sai, ns, modelo, estado FROM SAIs WHERE estado = 'Disponible'" - val statement = connection.prepareStatement(sql) - val resultSet = statement.executeQuery() - val sais = mutableListOf() - while (resultSet.next()) { - sais.add(Sai( - id = resultSet.getInt("id_sai"), - ns = resultSet.getString("ns"), - modelo = resultSet.getString("modelo"), - estado = resultSet.getString("estado") - )) - } - Result.success(sais) - } catch (e: SQLException) { - Result.failure(e) - } finally { - connection.close() - } - } - suspend fun isNsRegistered(ns: String): Result = withContext(Dispatchers.IO) { val connection = MariaDbConnection.getConnection() ?: return@withContext Result.failure(Exception("db_connection_error")) try { diff --git a/app/src/main/java/com/example/saipp/ui/AppNavigation.kt b/app/src/main/java/com/example/saipp/ui/AppNavigation.kt index 6fa3d45..f6cb8c4 100644 --- a/app/src/main/java/com/example/saipp/ui/AppNavigation.kt +++ b/app/src/main/java/com/example/saipp/ui/AppNavigation.kt @@ -33,7 +33,6 @@ sealed class Screen(val route: String) { object EditAssignment : Screen("edit_assignment/{assignmentId}") { fun createRoute(id: Int) = "edit_assignment/$id" } - object AvailableSaiList : Screen("available_sai_list") object QuickInfo : Screen("quick_info") } @@ -48,7 +47,6 @@ fun AppNavigation() { onNavigateToBatteries = { navController.navigate(Screen.BatteryList.route) }, onNavigateToPeople = { navController.navigate(Screen.PersonList.route) }, onNavigateToAssignments = { navController.navigate(Screen.AssignmentList.route) }, - onNavigateToAvailableSais = { navController.navigate(Screen.AvailableSaiList.route) }, onNavigateToQuickInfo = { navController.navigate(Screen.QuickInfo.route) } ) } @@ -136,9 +134,6 @@ fun AppNavigation() { val id = backStackEntry.arguments?.getInt("assignmentId") ?: 0 EditAssignmentScreen(assignmentId = id, onNavigateBack = { navController.popBackStack() }) } - composable(Screen.AvailableSaiList.route) { - AvailableSaiListScreen(onNavigateBack = { navController.popBackStack() }) - } composable(Screen.QuickInfo.route) { QuickInfoScreen(onNavigateBack = { navController.popBackStack() }) } diff --git a/app/src/main/java/com/example/saipp/ui/management/AvailableSaiListScreen.kt b/app/src/main/java/com/example/saipp/ui/management/AvailableSaiListScreen.kt deleted file mode 100644 index 878f57d..0000000 --- a/app/src/main/java/com/example/saipp/ui/management/AvailableSaiListScreen.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.example.saipp.ui.management - -import android.widget.Toast -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.example.saipp.R -import com.example.saipp.data.SaiRepository -import com.example.saipp.data.model.Sai -import com.example.saipp.ui.SearchBar -import kotlinx.coroutines.launch - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun AvailableSaiListScreen( - onNavigateBack: () -> Unit -) { - val context = LocalContext.current - val scope = rememberCoroutineScope() - val repository = remember { SaiRepository() } - var sais by remember { mutableStateOf>(emptyList()) } - var isLoading by remember { mutableStateOf(true) } - var searchQuery by remember { mutableStateOf("") } - - fun loadSais() { - scope.launch { - isLoading = true - repository.getAvailable() - .onSuccess { sais = it } - .onFailure { Toast.makeText(context, "Error: ${it.message}", Toast.LENGTH_SHORT).show() } - isLoading = false - } - } - - LaunchedEffect(Unit) { - loadSais() - } - - val filteredSais = remember(sais, searchQuery) { - sais.filter { - it.ns.contains(searchQuery, ignoreCase = true) || - (it.modelo?.contains(searchQuery, ignoreCase = true) ?: false) - } - } - - Scaffold( - topBar = { - TopAppBar( - title = { Text(stringResource(R.string.menu_available_sais)) }, - navigationIcon = { - IconButton(onClick = onNavigateBack) { - Icon(Icons.Default.ArrowBack, contentDescription = "Atrás") - } - } - ) - } - ) { padding -> - Column(modifier = Modifier.fillMaxSize().padding(padding)) { - SearchBar( - query = searchQuery, - onQueryChange = { searchQuery = it }, - modifier = Modifier.padding(16.dp) - ) - - if (isLoading) { - Box(modifier = Modifier.weight(1f).fillMaxWidth(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() - } - } else { - if (filteredSais.isEmpty()) { - Box(modifier = Modifier.weight(1f).fillMaxWidth(), contentAlignment = Alignment.Center) { - Text("No hay SAIs disponibles") - } - } else { - LazyColumn(modifier = Modifier.weight(1f).fillMaxWidth()) { - items(filteredSais) { sai -> - ListItem( - headlineContent = { Text("NS: ${sai.ns}") }, - supportingContent = { Text("Modelo: ${sai.modelo ?: "N/A"}") } - ) - HorizontalDivider() - } - } - } - } - } - } -} diff --git a/app/src/main/java/com/example/saipp/ui/management/HomeScreen.kt b/app/src/main/java/com/example/saipp/ui/management/HomeScreen.kt index a562a6c..c96b6c7 100644 --- a/app/src/main/java/com/example/saipp/ui/management/HomeScreen.kt +++ b/app/src/main/java/com/example/saipp/ui/management/HomeScreen.kt @@ -23,7 +23,6 @@ fun HomeScreen( onNavigateToBatteries: () -> Unit, onNavigateToPeople: () -> Unit, onNavigateToAssignments: () -> Unit, - onNavigateToAvailableSais: () -> Unit, onNavigateToQuickInfo: () -> Unit ) { var connectionStatus by remember { mutableStateOf?>(null) } @@ -123,22 +122,6 @@ fun HomeScreen( ) } } - - Spacer(modifier = Modifier.height(16.dp)) - - Button( - onClick = onNavigateToAvailableSais, - modifier = Modifier.fillMaxWidth().height(56.dp), - shape = MaterialTheme.shapes.medium, - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.secondaryContainer, - contentColor = MaterialTheme.colorScheme.onSecondaryContainer - ) - ) { - Icon(Icons.Default.CheckCircle, contentDescription = null) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = stringResource(R.string.menu_available_sais), style = MaterialTheme.typography.titleMedium) - } Spacer(modifier = Modifier.height(16.dp)) } diff --git a/app/src/main/java/com/example/saipp/ui/management/SaiListScreen.kt b/app/src/main/java/com/example/saipp/ui/management/SaiListScreen.kt index 02242da..360c584 100644 --- a/app/src/main/java/com/example/saipp/ui/management/SaiListScreen.kt +++ b/app/src/main/java/com/example/saipp/ui/management/SaiListScreen.kt @@ -1,9 +1,11 @@ package com.example.saipp.ui.management import android.widget.Toast +import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.material3.* @@ -12,12 +14,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.saipp.data.SaiRepository import com.example.saipp.data.model.Sai import com.example.saipp.ui.SearchBar import com.example.saipp.ui.ScannerDialog import com.example.saipp.ui.DeleteConfirmDialog +import com.example.saipp.R import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @@ -36,6 +40,9 @@ fun SaiListScreen( var searchQuery by remember { mutableStateOf("") } var showQuickScanner by remember { mutableStateOf(false) } + var selectedStatusFilter by remember { mutableStateOf("Todos") } + val statusOptions = listOf("Todos", "Disponible", "Asignado", "En reparación", "Baja") + var saiToDelete by remember { mutableStateOf(null) } fun loadSais() { @@ -52,10 +59,14 @@ fun SaiListScreen( loadSais() } - val filteredSais = remember(sais, searchQuery) { - sais.filter { - it.ns.contains(searchQuery, ignoreCase = true) || - (it.modelo?.contains(searchQuery, ignoreCase = true) ?: false) + val filteredSais = remember(sais, searchQuery, selectedStatusFilter) { + sais.filter { sai -> + val matchesSearch = sai.ns.contains(searchQuery, ignoreCase = true) || + (sai.modelo?.contains(searchQuery, ignoreCase = true) ?: false) + + val matchesStatus = if (selectedStatusFilter == "Todos") true else sai.estado == selectedStatusFilter + + matchesSearch && matchesStatus } } @@ -80,10 +91,34 @@ fun SaiListScreen( SearchBar( query = searchQuery, onQueryChange = { searchQuery = it }, - modifier = Modifier.padding(16.dp), + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp), onScanClick = { showQuickScanner = true } ) + // Status Filter Chips + Row( + modifier = Modifier + .fillMaxWidth() + .horizontalScroll(rememberScrollState()) + .padding(horizontal = 16.dp, vertical = 4.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + statusOptions.forEach { status -> + FilterChip( + selected = selectedStatusFilter == status, + onClick = { selectedStatusFilter = status }, + label = { + Text( + if (status == "Todos") stringResource(R.string.filter_all) else status + ) + }, + leadingIcon = if (selectedStatusFilter == status) { + { Icon(Icons.Default.Check, contentDescription = null, modifier = Modifier.size(16.dp)) } + } else null + ) + } + } + if (showQuickScanner) { ScannerDialog( onDismiss = { showQuickScanner = false }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d01f184..96c3e71 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Dar de Baja Reactivar Ocultar personal de baja + Todos Estado General SAIs @@ -53,7 +54,6 @@ Gestión de Baterías Gestión de Personas Gestion SAI - Persona - SAIs Disponibles Persona Fecha Asignación (DD-MM-AAAA)