Browse Source

Se cambio la organizacion de las columnas del plan anual y tambien se agregaron mas filtros para ver si estan realizados o pendientes y para buscar por departamento o equipo

master
mramirezg 2 months ago
parent
commit
cc99963b92
6 changed files with 156 additions and 124 deletions
  1. BIN
      src/main/bundles/dev.bundle
  2. BIN
      src/main/bundles/prod.bundle
  3. +0
    -1
      src/main/frontend/themes/sistema-mantenimiento/styles.css
  4. +0
    -1
      src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java
  5. +2
    -2
      src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java
  6. +154
    -120
      src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java

BIN
src/main/bundles/dev.bundle View File


BIN
src/main/bundles/prod.bundle View File


+ 0
- 1
src/main/frontend/themes/sistema-mantenimiento/styles.css View File

@ -10,7 +10,6 @@
/* Estilos para el encabezado */
.header-content {
background-color: #bc955b;
height: 64px;
display: flex;
align-items: center;


+ 0
- 1
src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java View File

@ -7,7 +7,6 @@ import org.springframework.security.core.Authentication;
import org.springframework.cglib.core.Local;
import org.springframework.security.core.context.SecurityContextHolder;
import org.vaadin.lineawesome.LineAwesomeIcon;
import com.nimbusds.jose.proc.SecurityContext;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;


+ 2
- 2
src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java View File

@ -73,7 +73,7 @@ public class MainLayout extends AppLayout {
headerLayout.getStyle().set("background-color", "#DDC9A3");
Image imgLogo = new Image("images/900X160.png", "Logo");
imgLogo.setWidth("300px");;
imgLogo.setWidthFull();
headerLayout.add(imgLogo);
@ -104,6 +104,6 @@ public class MainLayout extends AppLayout {
@Override
protected void afterNavigation() {
super.afterNavigation();
viewTitle.setText("Sistema de Mantenimiento de Hardware");
viewTitle.setText("Mantenimiento de Hardware");
}
}

+ 154
- 120
src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java View File

@ -18,6 +18,7 @@ import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.radiobutton.RadioButtonGroup;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.component.upload.Upload;
import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
@ -59,25 +60,35 @@ public class PlanAnualView extends VerticalLayout {
private byte[] fileContent;
VerticalLayout gridLayout = new VerticalLayout();
HorizontalLayout uploadLayout = new HorizontalLayout();
HorizontalLayout checkLayout = new HorizontalLayout();
public PlanAnualView() {
setupHeader();
Grid<PlanAnual> planAnualGrid = setupGrid();
// Obtenemos la lista de items y establecemos un GridListDataView para gestionar los datos
// Obtenemos la lista de items y establecemos un GridListDataView para gestionar
// los datos
List<PlanAnual> planAnualItems = databaseService.getPlanAnual();
GridListDataView<PlanAnual> dataView = planAnualGrid.setItems(planAnualItems);
// Se crea el filtro para el grid.
PlanAnualFilter planAnualFilter = new PlanAnualFilter(dataView);
planAnualFilter.setExcludeRealizado(true);
HeaderRow headerRow = planAnualGrid.appendHeaderRow();
headerRow.getCell(planAnualGrid.getColumnByKey("smtColumnKey"))
.setComponent(createFilterHeader("S.M.T", planAnualFilter::setSmt));
.setComponent(createFilterHeader("S.M.T", planAnualFilter::setSmt));
headerRow.getCell(planAnualGrid.getColumnByKey("equipoColumnKey"))
.setComponent(createFilterHeader("Equipo", planAnualFilter::setEquipo));
headerRow.getCell(planAnualGrid.getColumnByKey("departamentoColumnKey"))
.setComponent(createFilterHeader("Departamento", planAnualFilter::setDepartamento));
// Componente UPLOAD para subir archivos
MemoryBuffer buffer = new MemoryBuffer();
Upload upload = new Upload(buffer);
@ -89,7 +100,7 @@ public class PlanAnualView extends VerticalLayout {
try {
// Almacena el contenido del archivo en un arreglo de bytes
try (InputStream inputStream = buffer.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
inputStream.transferTo(byteArrayOutputStream);
fileContent = byteArrayOutputStream.toByteArray();
@ -117,7 +128,6 @@ public class PlanAnualView extends VerticalLayout {
HorizontalLayout notificationLayout = new HorizontalLayout(errorMessage, closeButton);
ntfError.add(notificationLayout);
ntfError.open(); // Abrir la notificación en pantalla
// Ocultar el botón de insertar si hay errores
@ -140,21 +150,32 @@ public class PlanAnualView extends VerticalLayout {
uploadLayout.add(upload, btnInsertar);
toggleLayouts(dataView);
Checkbox chkMostrarTodos = new Checkbox("Mostrar todos los registros");
chkMostrarTodos.addValueChangeListener(event -> {
planAnualFilter.setExcludeRealizado(!event.getValue());
RadioButtonGroup<String> radioFiltro = new RadioButtonGroup<>();
radioFiltro.setItems("Ver realizados", "Ver pendientes");
radioFiltro.setValue("Ver pendientes");
radioFiltro.addValueChangeListener(event -> {
String value = event.getValue();
if ("Ver pendientes".equals(value)) {
planAnualFilter.setExcludeRealizado(true);
} else if ("Ver solo hechos".equals(value)) {
planAnualFilter.setExcludeRealizado(false);
}
});
chkMostrarTodos.setValue(true);
checkLayout = new HorizontalLayout(radioFiltro);
checkLayout.setWidthFull();
checkLayout.setMargin(false);
checkLayout.setSpacing(true);
checkLayout.setJustifyContentMode(JustifyContentMode.CENTER);
this.setPadding(false);
this.setMargin(false);
this.setSpacing(false);
this.setSizeFull();
add(header, chkMostrarTodos, gridLayout, uploadLayout);
add(header, checkLayout, gridLayout, uploadLayout);
}
private void setupHeader() {
VerticalLayout headerLayout = new VerticalLayout();
headerLayout.addClassName("plan-anual-header");
@ -169,7 +190,6 @@ public class PlanAnualView extends VerticalLayout {
nomenclaturaTxt.setReadOnly(true);
nomenclaturaTxt.addClassName("nomenclatura-txt");
header.setAlignSelf(Alignment.CENTER, titulo, titulo1);
headerLayout.add(titulo, titulo1);
add(headerLayout);
@ -177,99 +197,98 @@ public class PlanAnualView extends VerticalLayout {
private Grid<PlanAnual> setupGrid() {
Grid<PlanAnual> planAnualGrid = new Grid<>(PlanAnual.class, false);
planAnualGrid.addColumn((ValueProvider<PlanAnual, Integer>) PlanAnual::getNumero)
.setHeader("No.").setSortable(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getNomEquipo)
.setHeader("Equipo").setAutoWidth(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getDepartamento)
.setHeader("Departamento").setAutoWidth(true);
planAnualGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT);
// Iconos en columnas booleanas
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMonitor())).setHeader("Monitor");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isTeclado())).setHeader("Teclado");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMouse())).setHeader("Mouse");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isRegulador())).setHeader("Regulador");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isCpu())).setHeader("CPU");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isImpresora())).setHeader("Impresora");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMiniPrint())).setHeader("MiniPrint");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isLaptop())).setHeader("Laptop");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isEscaner())).setHeader("Escáner");
// Fechas formateadas
planAnualGrid.addColumn(planAnual -> {
LocalDate fecha = planAnual.getFechaProgramada();
return fecha != null ? fecha.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "No programada";
}).setHeader("Fecha Programada").setAutoWidth(true).setSortable(true);
planAnualGrid.addColumn(planAnual -> {
LocalDate fecha = planAnual.getFechaMantenimiento();
return fecha != null ? fecha.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "";
}).setHeader("Fecha Realización").setAutoWidth(true).setSortable(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getEstado)
.setHeader("Estado").setAutoWidth(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getSmt)
.setHeader("S.M.T").setKey("smtColumnKey");
// Botón condicional
planAnualGrid.addComponentColumn(planAnual -> {
String estado = planAnual.getEstado();
Button btn;
if ("PENDIENTE".equalsIgnoreCase(estado)) {
btn = new Button(new Icon(VaadinIcon.EDIT));
btn.setTooltipText("Realizar mantenimiento");
btn.getStyle().set("color", "#A02142");
btn.addClickListener(event -> {
int idPlananual = planAnual.getNumero();
LocalDate fechaSistema = LocalDate.now();
String nomEquipo = planAnual.getNomEquipo();
String departamento = planAnual.getDepartamento();
btn.getUI().ifPresent(ui -> ui.navigate(
"mantenimiento?id=" + idPlananual +
"&fecha=" + fechaSistema +
"&tipo=1" +
"&nomEquipo=" + nomEquipo +
"&departamento=" + departamento
));
});
} else if ("REALIZADO".equalsIgnoreCase(estado)) {
btn = new Button(new Icon(VaadinIcon.EYE));
btn.setTooltipText("Ver detalles");
btn.getStyle().set("color", "#A02142");
btn.addClickListener(event -> {
int idPlananual = planAnual.getNumero();
btn.getUI().ifPresent(ui -> ui.navigate(
"detalles?id=" + idPlananual
));
});
} else {
btn = new Button("N/A");
btn.setEnabled(false);
}
return btn;
});
// Cargar datos
planAnualGrid.setItems(databaseService.getPlanAnual());
return planAnualGrid;
}
Grid<PlanAnual> planAnualGrid = new Grid<>(PlanAnual.class, false);
planAnualGrid.addColumn((ValueProvider<PlanAnual, Integer>) PlanAnual::getNumero)
.setHeader("No.").setSortable(true);
// Botón condicional
planAnualGrid.addComponentColumn(planAnual -> {
String estado = planAnual.getEstado();
Button btn;
if ("PENDIENTE".equalsIgnoreCase(estado)) {
btn = new Button(new Icon(VaadinIcon.EDIT));
btn.setTooltipText("Realizar mantenimiento");
btn.getStyle().set("color", "#A02142");
btn.addClickListener(event -> {
int idPlananual = planAnual.getNumero();
LocalDate fechaSistema = LocalDate.now();
String nomEquipo = planAnual.getNomEquipo();
String departamento = planAnual.getDepartamento();
btn.getUI().ifPresent(ui -> ui.navigate(
"mantenimiento?id=" + idPlananual +
"&fecha=" + fechaSistema +
"&tipo=1" +
"&nomEquipo=" + nomEquipo +
"&departamento=" + departamento));
});
} else if ("REALIZADO".equalsIgnoreCase(estado)) {
btn = new Button(new Icon(VaadinIcon.EYE));
btn.setTooltipText("Ver detalles");
btn.getStyle().set("color", "#A02142");
btn.addClickListener(event -> {
int idPlananual = planAnual.getNumero();
btn.getUI().ifPresent(ui -> ui.navigate(
"detalles?id=" + idPlananual));
});
} else {
btn = new Button("N/A");
btn.setEnabled(false);
}
return btn;
});
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getNomEquipo)
.setHeader("Equipo").setAutoWidth(true).setKey("equipoColumnKey");
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getDepartamento)
.setHeader("Departamento").setAutoWidth(true).setKey("departamentoColumnKey");
planAnualGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT);
// Fechas formateadas
planAnualGrid.addColumn(planAnual -> {
LocalDate fecha = planAnual.getFechaProgramada();
return fecha != null ? fecha.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "No programada";
}).setHeader("Fecha Programada").setAutoWidth(true).setSortable(true);
planAnualGrid.addColumn(planAnual -> {
LocalDate fecha = planAnual.getFechaMantenimiento();
return fecha != null ? fecha.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : "";
}).setHeader("Fecha Realización").setAutoWidth(true).setSortable(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getEstado)
.setHeader("Estado").setAutoWidth(true);
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getSmt)
.setHeader("S.M.T").setKey("smtColumnKey");
// Iconos en columnas booleanas
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMonitor())).setHeader("Monitor");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isTeclado())).setHeader("Teclado");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMouse())).setHeader("Mouse");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isRegulador())).setHeader("Regulador");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isCpu())).setHeader("CPU");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isImpresora())).setHeader("Impresora");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMiniPrint())).setHeader("MiniPrint");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isLaptop())).setHeader("Laptop");
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isEscaner())).setHeader("Escáner");
// Cargar datos
planAnualGrid.setItems(databaseService.getPlanAnual());
return planAnualGrid;
}
/* (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * SUSTITUIR VALORES BOOLEANOS POR UN ICONO (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * */
/*
* ( ͡° ͜ʖ ͡°). * SUSTITUIR VALORES BOOLEANOS POR UN ICONO ( ͡° ͜ʖ
* ͡°). *
*/
private Icon getIcon(boolean value) {
if (value) {
return new Icon(VaadinIcon.CHECK_CIRCLE);
@ -278,8 +297,10 @@ public class PlanAnualView extends VerticalLayout {
}
}
/* (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * METODO PARA VALIDAR QUE EL ARCHIOVO TENGA LA ESTRUCTURA CORRECTA (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * */
/*
* ( ͡° ͜ʖ ͡°). * METODO PARA VALIDAR QUE EL ARCHIOVO TENGA LA ESTRUCTURA
* CORRECTA ( ͡° ͜ʖ ͡°). *
*/
private List<String> validarExcel(InputStream inputStream) throws IOException {
List<String> errores = new ArrayList<>();
Workbook workbook = WorkbookFactory.create(inputStream);
@ -329,9 +350,8 @@ public class PlanAnualView extends VerticalLayout {
return errores;
}
// Valida que haya un archivo cargado en el UPLOAD y si si, llama al metodo para insertar el archivo en la base de datos
// 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);
@ -348,8 +368,6 @@ public class PlanAnualView extends VerticalLayout {
}
}
private static Component createFilterHeader(String labelText, Consumer<String> filterChangeConsumer) {
TextField textField = new TextField();
textField.setPlaceholder("Buscar...");
@ -364,10 +382,11 @@ public class PlanAnualView extends VerticalLayout {
return layout;
}
private static class PlanAnualFilter {
private final GridListDataView<PlanAnual> dataView;
private final GridListDataView<PlanAnual> dataView;
private String smt;
private String equipo;
private String departamento;
private boolean excludeRealizado = true;
public PlanAnualFilter(GridListDataView<PlanAnual> dataView) {
@ -380,6 +399,16 @@ public class PlanAnualView extends VerticalLayout {
this.dataView.refreshAll();
}
public void setEquipo(String equipo) {
this.equipo = equipo;
this.dataView.refreshAll();
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
this.dataView.refreshAll();
}
public void setExcludeRealizado(boolean excludeRealizado) {
this.excludeRealizado = excludeRealizado;
this.dataView.refreshAll();
@ -391,23 +420,28 @@ public class PlanAnualView extends VerticalLayout {
}
boolean matchesSmt = matches(planAnual.getSmt(), smt);
boolean isNoRealizado = !excludeRealizado ||
(planAnual.getEstado() != null &&
!"REALIZADO".equalsIgnoreCase(planAnual.getEstado()));
return matchesSmt && isNoRealizado;
boolean matchesEquipo = matches(planAnual.getNomEquipo(), equipo);
boolean matchesDepartamento = matches(planAnual.getDepartamento(), departamento);
if (excludeRealizado) {
// Mostrar solo los pendientes
return matchesSmt && matchesEquipo && matchesDepartamento
&& (planAnual.getEstado() == null || !"REALIZADO".equalsIgnoreCase(planAnual.getEstado()));
} else {
// Mostrar solo realizados
return matchesSmt && matchesEquipo && matchesDepartamento
&& "REALIZADO".equalsIgnoreCase(planAnual.getEstado());
}
}
private boolean matches(String value, String searchTerm) {
return searchTerm == null || searchTerm.isEmpty()
|| value.toLowerCase().contains(searchTerm.toLowerCase());
}
}
//Aqui validamos que haya registros en el plan anual y si no hay muestra el upload para cargar un nuevo plan anual
// Aqui validamos que haya registros en el plan anual y si no hay muestra el
// upload para cargar un nuevo plan anual
private void toggleLayouts(GridListDataView<PlanAnual> dataView) {
boolean hasItems = dataView.getItemCount() > 0;


Loading…
Cancel
Save