diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java index 52968ae..acdc1a1 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java @@ -60,7 +60,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse private final ComboBox tipoMantt; private final ComboBox area; private final ComboBox usuario; - private final TextField nombreEquipo; + private final TextField txtNombreEquipo; private final UserService userService; private final EmailService emailService; private RadioButtonGroup formaGroup; @@ -178,11 +178,12 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse - this.nombreEquipo = new TextField("Nombre del Equipo"); - nombreEquipo.setRequired(true); + this.txtNombreEquipo = new TextField("Nombre del Equipo"); + txtNombreEquipo.setRequired(true); + txtNombreEquipo.setReadOnly(true); - departamentoLayout.add(area, usuario, nombreEquipo); + departamentoLayout.add(area, usuario, txtNombreEquipo); departamentoLayout.setWidthFull(); createHardwareSection(databaseService); @@ -457,7 +458,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse // Obtener el empleado y el equipo Usuario usuarioSeleccionado = usuario.getValue(); String empleadoId = usuarioSeleccionado != null ? usuarioSeleccionado.getEmpleadoId().toString() : null; - String equipoId = nombreEquipo.getValue(); + String equipoId = txtNombreEquipo.getValue(); // AQUI SE MANEJA LA OPCION SELECCIONADA EN LA FORMA DE MANTENIMIENTO (REMOTA o MANUAL) String formaSeleccionada = formaGroup.getValue(); @@ -611,7 +612,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse tipoMantt.clear(); area.clear(); usuario.clear(); - nombreEquipo.clear(); + txtNombreEquipo.clear(); formaGroup.clear(); actualizaciones.clear(); masActualizacionesGroup.clear(); @@ -663,6 +664,10 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse ? beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("id").stream().findFirst().orElse(null) : null; + String equipoParam = beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("nomEquipo") != null + ? beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("nomEquipo").stream().findFirst().orElse(null) + : null; + if (fechaParam != null) { try { LocalDate fechaActual = LocalDate.parse(fechaParam); @@ -704,5 +709,13 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse } else { txtPlananualID.setValue("Sin ID"); // O un valor por defecto si no hay ID } + + + // Establecemos el valor del campo de texto Nombre de Equipo con el parametro que viene en la url + if (equipoParam != null) { + txtNombreEquipo.setValue(equipoParam); + } else { + txtNombreEquipo.setValue("Sin nombre"); + } } } diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index bc24607..ce593fe 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -1,9 +1,12 @@ package mx.gob.jumapacelaya.ui; +import com.vaadin.flow.component.Component; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.grid.HeaderRow; +import com.vaadin.flow.component.grid.dataview.GridListDataView; import com.vaadin.flow.component.html.H4; import com.vaadin.flow.component.html.H5; import com.vaadin.flow.component.html.Span; @@ -16,6 +19,7 @@ import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.component.upload.Upload; import com.vaadin.flow.component.upload.receivers.MemoryBuffer; +import com.vaadin.flow.data.value.ValueChangeMode; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import jakarta.annotation.security.PermitAll; @@ -33,6 +37,9 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.Consumer; + +import static java.util.regex.Pattern.matches; @PermitAll @PageTitle("Plan Anual de Mantenimiento") @@ -51,6 +58,18 @@ public class PlanAnualView extends VerticalLayout { setupHeader(); Grid planAnualGrid = setupGrid(); + // Obtenemos la lista de items y establecemos un GridListDataView para gestionar los datos + List planAnualItems = databaseService.getPlanAnual(); + GridListDataView dataView = planAnualGrid.setItems(planAnualItems); + + // Se crea el filtro para el grid. + PlanAnualFilter planAnualFilter = new PlanAnualFilter(dataView); + + + HeaderRow headerRow = planAnualGrid.appendHeaderRow(); + headerRow.getCell(planAnualGrid.getColumnByKey("smtColumnKey")) + .setComponent(createFilterHeader("S.M.T", planAnualFilter::setSmt)); + // Componente UPLOAD para subir archivos MemoryBuffer buffer = new MemoryBuffer(); @@ -158,17 +177,19 @@ public class PlanAnualView extends VerticalLayout { planAnualGrid.addColumn(planAnual -> { LocalDate fechaProgramada = planAnual.getFechaProgramada(); - return fechaProgramada != null ? fechaProgramada.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "No programada"; // Formato deseado + return fechaProgramada != null ? fechaProgramada.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "No programada"; // Formato especifico }).setHeader("Fecha Programada").setAutoWidth(true); planAnualGrid.addColumn(planAnual -> { LocalDate fechaMantenimiento = planAnual.getFechaMantenimiento(); - return fechaMantenimiento != null ? fechaMantenimiento.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : ""; // Formato deseado + return fechaMantenimiento != null ? fechaMantenimiento.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : ""; // Formato especifico }).setHeader("Fecha Realizacion").setAutoWidth(true); planAnualGrid.addColumn(PlanAnual :: getEstado).setHeader("Estado").setAutoWidth(true); - planAnualGrid.addColumn(PlanAnual :: getSmt).setHeader("S.M.T").setAutoWidth(true); + Grid.Column smtColumn = planAnualGrid.addColumn(PlanAnual::getSmt).setHeader("S.M.T").setKey("smtColumnKey"); + + planAnualGrid.setItems(databaseService.getPlanAnual()); planAnualGrid.addComponentColumn(planAnual -> { Button btnRealizar = new Button("Realizar"); @@ -176,8 +197,15 @@ public class PlanAnualView extends VerticalLayout { int idPlananual = planAnual.getNumero(); LocalDate fechaSistema = LocalDate.now(); String fechaStr = fechaSistema.toString(); - btnRealizar.getUI().ifPresent(ui -> ui.navigate("mantenimiento?id=" + idPlananual + "&fecha=" + fechaStr + "&tipo=1")); + String nomEquipo = planAnual.getNomEquipo(); + btnRealizar.getUI().ifPresent(ui -> ui.navigate("mantenimiento?id=" + idPlananual + "&fecha=" + fechaStr + "&tipo=1" + "&nomEquipo=" + nomEquipo)); }); + + // Deshabilitar el boton si el estado no es pendiente + if (!"PENDIENTE".equalsIgnoreCase(planAnual.getEstado())) { + btnRealizar.setVisible(false); + } + return btnRealizar; }).setHeader("Realizado").setAutoWidth(true); @@ -248,6 +276,7 @@ public class PlanAnualView extends VerticalLayout { + // Valida que haya un archivo cargado en el UPLOAD y si si, llama al metodo para insertar el archivo en la base de datos private void insertarDatos() { if (fileContent == null) { Notification.show("Error: No hay archivo cargado.").addThemeVariants(NotificationVariant.LUMO_ERROR); @@ -263,4 +292,47 @@ public class PlanAnualView extends VerticalLayout { .addThemeVariants(NotificationVariant.LUMO_ERROR); } } + + + + private static Component createFilterHeader(String labelText, Consumer filterChangeConsumer) { + TextField textField = new TextField(); + textField.setPlaceholder("Buscar..."); + textField.setValueChangeMode(ValueChangeMode.EAGER); + textField.setClearButtonVisible(true); + textField.setWidthFull(); + textField.addValueChangeListener(event -> filterChangeConsumer.accept(event.getValue())); + + VerticalLayout layout = new VerticalLayout(textField); + layout.setSpacing(false); + layout.setPadding(false); + return layout; + } + + + private static class PlanAnualFilter { + private final GridListDataView dataView; + private String smt; + + public PlanAnualFilter(GridListDataView dataView) { + this.dataView = dataView; + this.dataView.addFilter(this::test); + } + + public void setSmt(String smt) { + this.smt = smt; + this.dataView.refreshAll(); + } + + public boolean test(PlanAnual planAnual) { + boolean matchesSmt = matches(planAnual.getSmt(), smt); + return matchesSmt; + } + + + private boolean matches(String value, String searchTerm) { + return searchTerm == null || searchTerm.isEmpty() + || value.toLowerCase().contains(searchTerm.toLowerCase()); + } + } }