|
|
@ -4,20 +4,24 @@ 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.checkbox.Checkbox; |
|
|
|
import com.vaadin.flow.component.checkbox.CheckboxGroup; |
|
|
|
import com.vaadin.flow.component.checkbox.CheckboxGroupVariant; |
|
|
|
import com.vaadin.flow.component.datepicker.DatePicker; |
|
|
|
import com.vaadin.flow.component.dependency.CssImport; |
|
|
|
import com.vaadin.flow.component.dialog.Dialog; |
|
|
|
import com.vaadin.flow.component.grid.Grid; |
|
|
|
import com.vaadin.flow.component.grid.GridVariant; |
|
|
|
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; |
|
|
|
import com.vaadin.flow.component.html.*; |
|
|
|
import com.vaadin.flow.component.icon.Icon; |
|
|
|
import com.vaadin.flow.component.icon.VaadinIcon; |
|
|
|
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.popover.Popover; |
|
|
|
import com.vaadin.flow.component.popover.PopoverPosition; |
|
|
|
import com.vaadin.flow.component.radiobutton.RadioButtonGroup; |
|
|
|
import com.vaadin.flow.component.textfield.TextField; |
|
|
|
import com.vaadin.flow.component.upload.Upload; |
|
|
@ -26,29 +30,27 @@ import com.vaadin.flow.data.value.ValueChangeMode; |
|
|
|
import com.vaadin.flow.function.ValueProvider; |
|
|
|
import com.vaadin.flow.router.PageTitle; |
|
|
|
import com.vaadin.flow.router.Route; |
|
|
|
import com.vaadin.flow.server.StreamResource; |
|
|
|
import jakarta.annotation.security.PermitAll; |
|
|
|
import mx.gob.jumapacelaya.models.PlanAnual; |
|
|
|
import mx.gob.jumapacelaya.services.DatabaseService; |
|
|
|
import mx.gob.jumapacelaya.services.ReportService; |
|
|
|
import net.sf.jasperreports.engine.JasperFillManager; |
|
|
|
import net.sf.jasperreports.engine.JasperPrint; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.apache.poi.ss.usermodel.*; |
|
|
|
import org.springframework.core.env.Environment; |
|
|
|
import org.vaadin.lineawesome.LineAwesomeIcon; |
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.*; |
|
|
|
import java.lang.reflect.Array; |
|
|
|
import java.sql.Date; |
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.Year; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.List; |
|
|
|
import java.util.*; |
|
|
|
import java.util.function.Consumer; |
|
|
|
|
|
|
|
import javax.xml.crypto.Data; |
|
|
|
|
|
|
|
import static java.util.regex.Pattern.matches; |
|
|
|
|
|
|
|
@PermitAll |
|
|
|
@PageTitle("Plan Anual de Mantenimiento") |
|
|
|
@Route(value = "/", layout = MainLayout.class) |
|
|
@ -56,20 +58,26 @@ import static java.util.regex.Pattern.matches; |
|
|
|
public class PlanAnualView extends VerticalLayout { |
|
|
|
|
|
|
|
private final Environment env; |
|
|
|
private final ReportService reportService; |
|
|
|
|
|
|
|
HorizontalLayout header = new HorizontalLayout(); |
|
|
|
H4 titulo = new H4(); |
|
|
|
H5 titulo1 = new H5(); |
|
|
|
Button btnInsertar; |
|
|
|
private byte[] fileContent; |
|
|
|
VerticalLayout gridLayout = new VerticalLayout(); |
|
|
|
HorizontalLayout uploadLayout = new HorizontalLayout(); |
|
|
|
HorizontalLayout checkLayout = new HorizontalLayout(); |
|
|
|
HorizontalLayout filtrosLayout = new HorizontalLayout(); |
|
|
|
private final DatabaseService databaseService; |
|
|
|
Grid<PlanAnual> planAnualGrid; |
|
|
|
Button btnColumns; |
|
|
|
Button btnImprimirRpt; |
|
|
|
HorizontalLayout btnImprimirLayout; |
|
|
|
|
|
|
|
public PlanAnualView(DatabaseService databaseService, Environment env) { |
|
|
|
public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService) { |
|
|
|
this.databaseService = databaseService; |
|
|
|
this.env = env; |
|
|
|
this.reportService = reportService; |
|
|
|
|
|
|
|
setupHeader(); |
|
|
|
Grid<PlanAnual> planAnualGrid = setupGrid(); |
|
|
|
|
|
|
@ -93,17 +101,17 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
/*headerRow.getCell(planAnualGrid.getColumnByKey("smtColumnKey")) |
|
|
|
.setComponent(createFilterHeader("S.M.T", planAnualFilter::setSmt));*/ |
|
|
|
|
|
|
|
headerRow.getCell(planAnualGrid.getColumnByKey("equipoColumnKey")) |
|
|
|
headerRow.getCell(planAnualGrid.getColumnByKey("equipo")) |
|
|
|
.setComponent(createFilterHeader("Equipo", planAnualFilter::setEquipo)); |
|
|
|
|
|
|
|
headerRow.getCell(planAnualGrid.getColumnByKey("departamentoColumnKey")) |
|
|
|
headerRow.getCell(planAnualGrid.getColumnByKey("departamento")) |
|
|
|
.setComponent(createFilterHeader("Departamento", planAnualFilter::setDepartamento)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Componente UPLOAD para subir archivos |
|
|
|
MemoryBuffer buffer = new MemoryBuffer(); |
|
|
|
Upload upload = new Upload(buffer); |
|
|
|
Upload upload = new Upload(); |
|
|
|
upload.setAcceptedFileTypes(".xls", ".xlsx"); |
|
|
|
upload.setMaxFiles(1); |
|
|
|
upload.setDropLabel(new com.vaadin.flow.component.html.Span("Arrastra un archivo Excel aquí o selecciona uno")); |
|
|
@ -112,7 +120,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(); |
|
|
@ -141,7 +149,6 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
ntfError.add(notificationLayout); |
|
|
|
|
|
|
|
ntfError.open(); // Abrir la notificación en pantalla |
|
|
|
|
|
|
|
// Ocultar el botón de insertar si hay errores |
|
|
|
btnInsertar.setVisible(false); |
|
|
|
} else { |
|
|
@ -156,36 +163,41 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
btnInsertar = new Button("Insertar archivo", event -> insertarDatos()); |
|
|
|
btnInsertar.setVisible(false); |
|
|
|
|
|
|
|
gridLayout.add(planAnualGrid); |
|
|
|
gridLayout.add(btnImprimirLayout,planAnualGrid); |
|
|
|
gridLayout.setSizeFull(); |
|
|
|
|
|
|
|
uploadLayout.add(upload, btnInsertar); |
|
|
|
toggleLayouts(dataView); |
|
|
|
|
|
|
|
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 realizados".equals(value)) { |
|
|
|
planAnualFilter.setExcludeRealizado(false); |
|
|
|
} |
|
|
|
filtrosLayout.addClassNames("lumo-justify-content-center", "lumo-gap-m", "lumo-padding-s"); |
|
|
|
filtrosLayout.setWidthFull(); |
|
|
|
filtrosLayout.setJustifyContentMode(JustifyContentMode.CENTER); |
|
|
|
|
|
|
|
Button btnPendientes = new Button("Pendientes", VaadinIcon.CLOCK.create()); |
|
|
|
Button btnRealizados = new Button("Realizados", VaadinIcon.CHECK_CIRCLE.create()); |
|
|
|
|
|
|
|
btnPendientes.addClassName("selected-tab"); |
|
|
|
|
|
|
|
btnPendientes.addClickListener(e -> { |
|
|
|
planAnualFilter.setExcludeRealizado(true); |
|
|
|
btnPendientes.addClassName("selected-tab"); |
|
|
|
btnRealizados.removeClassName("selected-tab"); |
|
|
|
}); |
|
|
|
btnRealizados.addClickListener(e -> { |
|
|
|
planAnualFilter.setExcludeRealizado(false); |
|
|
|
btnRealizados.addClassName("selected-tab"); |
|
|
|
btnPendientes.removeClassName("selected-tab"); |
|
|
|
}); |
|
|
|
|
|
|
|
checkLayout = new HorizontalLayout(radioFiltro); |
|
|
|
checkLayout.setWidthFull(); |
|
|
|
checkLayout.setMargin(false); |
|
|
|
checkLayout.setSpacing(true); |
|
|
|
checkLayout.setJustifyContentMode(JustifyContentMode.CENTER); |
|
|
|
filtrosLayout.add(btnPendientes, btnRealizados); |
|
|
|
|
|
|
|
|
|
|
|
this.setPadding(false); |
|
|
|
this.setMargin(false); |
|
|
|
this.setSpacing(false); |
|
|
|
this.setSizeFull(); |
|
|
|
add(header, checkLayout, gridLayout, uploadLayout); |
|
|
|
add(filtrosLayout, gridLayout, uploadLayout); |
|
|
|
} |
|
|
|
|
|
|
|
private void setupHeader() { |
|
|
@ -202,17 +214,17 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
nomenclaturaTxt.setReadOnly(true); |
|
|
|
nomenclaturaTxt.addClassName("nomenclatura-txt"); |
|
|
|
|
|
|
|
header.setAlignSelf(Alignment.CENTER, titulo, titulo1); |
|
|
|
headerLayout.add(titulo, titulo1); |
|
|
|
headerLayout.setAlignItems(Alignment.CENTER); |
|
|
|
add(headerLayout); |
|
|
|
} |
|
|
|
|
|
|
|
private Grid<PlanAnual> setupGrid() { |
|
|
|
|
|
|
|
Grid<PlanAnual> planAnualGrid = new Grid<>(PlanAnual.class, false); |
|
|
|
private Grid<PlanAnual> setupGrid() { |
|
|
|
|
|
|
|
planAnualGrid = new Grid<>(PlanAnual.class, false); |
|
|
|
planAnualGrid.addColumn((ValueProvider<PlanAnual, Integer>) PlanAnual::getNumero) |
|
|
|
.setHeader("No.").setSortable(true); |
|
|
|
.setHeader("No.").setSortable(true).setAutoWidth(true).setFrozen(true); |
|
|
|
|
|
|
|
// Botón condicional |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> { |
|
|
@ -254,55 +266,106 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
} |
|
|
|
|
|
|
|
return btn; |
|
|
|
}); |
|
|
|
}).setAutoWidth(true).setFrozen(true); |
|
|
|
|
|
|
|
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getNomEquipo) |
|
|
|
.setHeader("Equipo").setAutoWidth(true).setKey("equipoColumnKey"); |
|
|
|
.setHeader("Equipo").setAutoWidth(true).setKey("equipo"); |
|
|
|
|
|
|
|
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getDepartamento) |
|
|
|
.setHeader("Departamento").setAutoWidth(true).setKey("departamentoColumnKey"); |
|
|
|
|
|
|
|
planAnualGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT); |
|
|
|
planAnualGrid.addThemeVariants(GridVariant.LUMO_ROW_STRIPES); |
|
|
|
|
|
|
|
.setHeader("Departamento").setAutoWidth(true).setKey("departamento"); |
|
|
|
|
|
|
|
planAnualGrid.addColumn(planAnual -> { |
|
|
|
String mesPlaneado = planAnual.getMesplaneado(); |
|
|
|
return mesPlaneado != null ? mesPlaneado.toUpperCase() : "N/A"; |
|
|
|
}).setHeader("Mes Planeado").setAutoWidth(true); |
|
|
|
}).setHeader("Mes Planeado").setAutoWidth(true).setKey("mesplaneado"); |
|
|
|
|
|
|
|
// 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); |
|
|
|
}).setHeader("Fecha Programada").setAutoWidth(true).setSortable(true).setKey("fechaProgramada"); |
|
|
|
|
|
|
|
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); |
|
|
|
}).setHeader("Fecha Realización").setAutoWidth(true).setSortable(true).setKey("fechaMantenimiento"); |
|
|
|
|
|
|
|
|
|
|
|
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getEstado) |
|
|
|
.setHeader("Estado").setAutoWidth(true); |
|
|
|
.setHeader("Estado").setAutoWidth(true).setKey("estado"); |
|
|
|
|
|
|
|
planAnualGrid.addColumn((ValueProvider<PlanAnual, String>) PlanAnual::getSituacion) |
|
|
|
.setHeader("Situación").setAutoWidth(true); |
|
|
|
.setHeader("Situación").setAutoWidth(true).setKey("situacion"); |
|
|
|
|
|
|
|
/*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");*/ |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMonitor())).setHeader("Monitor").setKey("monitor"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isTeclado())).setHeader("Teclado").setKey("teclado"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMouse())).setHeader("Mouse").setKey("mouse"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isRegulador())).setHeader("Regulador").setKey("regulador"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isCpu())).setHeader("CPU").setKey("cpu"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isImpresora())).setHeader("Impresora").setKey("impresora"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isMiniPrint())).setHeader("MiniPrint").setKey("miniprint"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isLaptop())).setHeader("Laptop").setKey("laptop"); |
|
|
|
planAnualGrid.addComponentColumn(planAnual -> getIcon(planAnual.isEscaner())).setHeader("Escáner").setKey("escaner"); |
|
|
|
|
|
|
|
planAnualGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT); |
|
|
|
planAnualGrid.addThemeVariants(GridVariant.LUMO_ROW_STRIPES); |
|
|
|
|
|
|
|
|
|
|
|
btnColumns = new Button(VaadinIcon.GRID_H.create()); |
|
|
|
btnColumns.addThemeVariants(ButtonVariant.LUMO_ICON); |
|
|
|
btnColumns.setAriaLabel("Show/Hide Columns"); |
|
|
|
btnColumns.setTooltipText("Show/Hide Columns"); |
|
|
|
|
|
|
|
btnImprimirRpt = new Button(VaadinIcon.PRINT.create()); |
|
|
|
btnImprimirRpt.addClickListener(event -> sacarReporte()); |
|
|
|
btnImprimirRpt.setTooltipText("Imprimir reporte"); |
|
|
|
btnImprimirLayout = new HorizontalLayout(btnColumns, btnImprimirRpt); |
|
|
|
|
|
|
|
HorizontalLayout columnSelectorLayout = new HorizontalLayout(); |
|
|
|
columnSelectorLayout.setAlignItems(Alignment.END); |
|
|
|
|
|
|
|
Popover popover = new Popover(); |
|
|
|
popover.setModal(true); |
|
|
|
popover.setBackdropVisible(true); |
|
|
|
popover.setPosition(PopoverPosition.BOTTOM_END); |
|
|
|
popover.setTarget(btnColumns); |
|
|
|
|
|
|
|
Div heading = new Div("Ver/Ocultar columnas"); |
|
|
|
heading.getStyle().set("font-weight", "600"); |
|
|
|
heading.getStyle().set("padding", "var(--lumo-space-xs)"); |
|
|
|
|
|
|
|
List<String> columns = List.of("equipo", "departamento", "mesplaneado", "fechaProgramada", |
|
|
|
"fechaMantenimiento", "estado", "situacion", "monitor", "teclado", "mouse", "regulador", |
|
|
|
"cpu", "impresora", "miniprint", "laptop", "escaner"); |
|
|
|
|
|
|
|
CheckboxGroup<String> chkColumns = new CheckboxGroup<>(); |
|
|
|
chkColumns.addThemeVariants(CheckboxGroupVariant.LUMO_VERTICAL); |
|
|
|
chkColumns.setItems(columns); |
|
|
|
chkColumns.setItemLabelGenerator((item) -> { |
|
|
|
String label = StringUtils |
|
|
|
.join(StringUtils.splitByCharacterTypeCamelCase(item), " "); |
|
|
|
return StringUtils.capitalize(label.toLowerCase()); |
|
|
|
}); |
|
|
|
chkColumns.addValueChangeListener((e) -> { |
|
|
|
columns.forEach((key) -> { |
|
|
|
Grid.Column<?> col = planAnualGrid.getColumnByKey(key); |
|
|
|
if (col != null) { |
|
|
|
col.setVisible(e.getValue().contains(key)); |
|
|
|
} else { |
|
|
|
System.out.println("Columna no encontrada para key: " + key); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
Set<String> defaultColumns = Set.of("equipo", "departamento", "mesplaneado", |
|
|
|
"fechaProgramada", "fechaMantenimiento", "estado", "situacion"); |
|
|
|
chkColumns.setValue(defaultColumns); |
|
|
|
|
|
|
|
popover.add(heading, chkColumns); |
|
|
|
// Cargar datos |
|
|
|
planAnualGrid.setItems(databaseService.getPlanAnual()); |
|
|
|
return planAnualGrid; |
|
|
@ -471,4 +534,78 @@ public class PlanAnualView extends VerticalLayout { |
|
|
|
gridLayout.setVisible(hasItems); |
|
|
|
uploadLayout.setVisible(!hasItems); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void sacarReporte() { |
|
|
|
Dialog dialog = new Dialog(); |
|
|
|
dialog.setHeaderTitle("Seleccione la fecha de inicio y fin"); |
|
|
|
|
|
|
|
DatePicker.DatePickerI18n i18n = new DatePicker.DatePickerI18n() |
|
|
|
.setWeekdays(List.of("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sabado")) |
|
|
|
.setWeekdaysShort(List.of("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb")) |
|
|
|
.setMonthNames(List.of("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) |
|
|
|
.setFirstDayOfWeek(1) |
|
|
|
.setToday("Hoy") |
|
|
|
.setCancel("Cancelar") |
|
|
|
.setDateFormat("dd/MM/yyyy"); |
|
|
|
|
|
|
|
DatePicker fechaInicio = new DatePicker("Fecha de inicio:"); |
|
|
|
fechaInicio.setRequired(true); |
|
|
|
fechaInicio.setI18n(i18n); |
|
|
|
|
|
|
|
DatePicker fechaFin = new DatePicker("Fecha de fin:"); |
|
|
|
fechaFin.setRequired(true); |
|
|
|
fechaFin.setI18n(i18n); |
|
|
|
|
|
|
|
|
|
|
|
Button btnGenerar = new Button("Generar", VaadinIcon.PRINT.create()); |
|
|
|
btnGenerar.addThemeVariants(ButtonVariant.LUMO_PRIMARY); |
|
|
|
btnGenerar.addClickListener(e -> { |
|
|
|
if (fechaInicio.getValue() == null || fechaFin.getValue() == null) { |
|
|
|
Notification.show("Por favor, seleccione ambas fechas.", 3000, Notification.Position.MIDDLE) |
|
|
|
.addThemeVariants(NotificationVariant.LUMO_ERROR); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
LocalDate inicio = fechaInicio.getValue(); |
|
|
|
LocalDate fin = fechaFin.getValue(); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
// Prepara los parámetros para el reporte |
|
|
|
Map<String, Object> parametros = new HashMap<>(); |
|
|
|
parametros.put("FECHAINICIO", java.sql.Date.valueOf(inicio)); |
|
|
|
parametros.put("FECHAFIN", java.sql.Date.valueOf(fin)); |
|
|
|
|
|
|
|
// Genera el PDF |
|
|
|
byte[] pdf = reportService.generarReporte("mantenimientoFechas", parametros); |
|
|
|
|
|
|
|
// Creando el recurso de descarga |
|
|
|
StreamResource resource = new StreamResource("reporte.pdf", () -> new ByteArrayInputStream(pdf)); |
|
|
|
Anchor downloadLink = new Anchor(resource, "Descargar Reporte"); |
|
|
|
downloadLink.setTarget("_blank"); |
|
|
|
downloadLink.setId("descargar-reporte-link"); |
|
|
|
add(downloadLink); |
|
|
|
|
|
|
|
getUI().ifPresent(ui -> |
|
|
|
ui.getPage().executeJs("document.getElementById('descargar-reporte-link').click();") |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception ex) { |
|
|
|
Notification.show("Error al genrar el reporte: " + ex.getMessage(), 5000, Notification.Position.MIDDLE) |
|
|
|
.addThemeVariants(NotificationVariant.LUMO_ERROR); |
|
|
|
ex.printStackTrace(); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
Button btnCancelar = new Button("Cancelar", VaadinIcon.CLOSE_CIRCLE.create(), e -> dialog.close()); |
|
|
|
dialog.getFooter().add(btnCancelar); |
|
|
|
dialog.getFooter().add(btnGenerar); |
|
|
|
|
|
|
|
HorizontalLayout fechasLayout = new HorizontalLayout(fechaInicio, fechaFin); |
|
|
|
dialog.add(fechasLayout); |
|
|
|
|
|
|
|
dialog.open(); |
|
|
|
} |
|
|
|
} |