From 8a0af1abdad0dd25a9a77d6a428c0600c3c19318 Mon Sep 17 00:00:00 2001 From: mramirezg Date: Mon, 10 Mar 2025 11:18:13 -0600 Subject: [PATCH] Correcion de errores al enviar el correo y modificacioones en la UI y UX --- src/main/bundles/prod.bundle | Bin 961110 -> 961110 bytes .../java/mx/gob/jumapacelaya/Application.java | 2 +- .../gob/jumapacelaya/api/RedmineClient.java | 2 +- .../jumapacelaya/services/EmailService.java | 13 +++++-- .../mx/gob/jumapacelaya/ui/ActDiariaView.java | 31 ++++++++++------ .../mx/gob/jumapacelaya/ui/MainLayout.java | 5 ++- .../jumapacelaya/ui/MantenimientoView.java | 27 +++++++++++--- .../mx/gob/jumapacelaya/ui/PlanAnualView.java | 35 ++++++++++++++---- src/main/resources/application.properties | 1 - 9 files changed, 82 insertions(+), 34 deletions(-) diff --git a/src/main/bundles/prod.bundle b/src/main/bundles/prod.bundle index 637b26255a1e4bcbe08a775b598c66e3ab33a5c0..73b7fa803d8d85eaf36efbcc09479ac3dad55a72 100644 GIT binary patch delta 710 zcmYk1OK1~O6oz{;nPjY;gD*@&>cU_INf4DnZ4^qhxKXfz;$x_-Rji-}mjy)#2wAu> zpk4%JCN+~s5fwx(ik*U>6~slM6dK%g>87%{C1dLCpsv9CuoL1wItoMIwZ1bf+r`^^gRpvev|e%DAzSo21WSAvrL4T`5Th#Os2xpFyTyYSW{M(i`_ z&llsP-=XqcF)HVZrg;OW`L-$N+p*b$os&@8GV;aN_)rujb@ev`T9AsDgOsJ74Khe| zFAPCf>oa1k#p&|0)2*J3a@py*`Usi&L}YPUT<_T&{-fHGlP_27Q?pPaE*}64xO@a~ z$K_*yPc9z@L_O^cdU`VDad`WCj|brV@;DFJU*$o-&8l`@Rk?!6(P@4NXiw`&@wuLu zH9dJ!)02HZpM!kgX9w`Z=QDspT}Myre5o^e+~6xnCL4Sj5H$EKptq?@x0<^2waFI| Q;nPjY;i+`Ag)P=zak{~LD+9;H0aifb0iq@glR#8C>E(?kf5VCM% zKz#_xOll@SMN|-ZC^iK_D~O9iDKxn0(oJhc5M24@%mZBv^Syh%bKlI;Vt#2cZ;u=| zqT9MG%j)`hYqVnb8|qaWeltw35&_EJ37R2LElGE+fJ8P;@Z@BgzJ+077mbGWG(%<| z3Vwn1BvDv6M~47P>lN1=vPHi`u*CZ@%E~(qG3ugJqO4HI6CyT7udzoNyZ;L}jnfY- zLv!y18rca=HK%qUSWUz;qV021=3QDdk>-4w45>0hTi*Wj`s%!0u3U`RF1+=K5&H!C z^V#^|2UMObM&(@5G_T_{-!bKUCpLR9I0>~aBcE@L4@FT@SAR92wNvqOJ7uY7gKVd| z7lxp#^%*hV;&gf0=~mB1x$N{@euzwcBC@zFuJ>#X|50tp$rmg3$yq27mk$62Ts{K0 z?ea0eN0$!+qMmjJJw2K7IK2Ix#{+PFd7KCAuks+^MpZj6t6ah4=rlh7bf)#B_)JgC znw~ta>B&By&qBWEvjh0<^Jze#uA?V)o(Lw78hi=Kl?I;zv>SW|(A(6dn@wH%(&Y1q Qa;>l}?zi*}t1Z6z7rG50mH+?% diff --git a/src/main/java/mx/gob/jumapacelaya/Application.java b/src/main/java/mx/gob/jumapacelaya/Application.java index 2264041..252db23 100644 --- a/src/main/java/mx/gob/jumapacelaya/Application.java +++ b/src/main/java/mx/gob/jumapacelaya/Application.java @@ -18,7 +18,7 @@ import org.springframework.boot.autoconfigure.validation.ValidationAutoConfigura */ @SpringBootApplication @Theme(value = "sistema-mantenimiento") -@PWA(name = "Aplicacion de Mantenimiento de Equipo de Computo", shortName = "App Mantenimiento de Computo", iconPath = "icons/icon.png") +@PWA(name = "Aplicacion de Mantenimiento de Equipo de Computo", shortName = "Mantenimiento de Computo", iconPath = "icons/icon.png") public class Application implements AppShellConfigurator { public static void main(String[] args) { diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index a3ed7a5..14a5328 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -314,7 +314,7 @@ public class RedmineClient { /*Este metodo sirve para actualizar el estatus de los tickets en este caso se actualiza al estatus TERMINADO */ public void closeTicket(int ticketId, RedmineUser user) throws IOException, InterruptedException { - int closedStatusId = 9; //este es el ID del estado TERMINADO, se debe poner el id a según corresponda + int closedStatusId = 5; //este es el ID del estado TERMINADO, se debe poner el id a según corresponda Map payload = new HashMap<>(); Map issue = new HashMap<>(); diff --git a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java index 098e1d8..d5c675a 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java @@ -1,9 +1,13 @@ package mx.gob.jumapacelaya.services; import com.vaadin.flow.component.notification.Notification; +import jakarta.activation.DataSource; import jakarta.mail.internet.MimeMessage; +import jakarta.mail.util.ByteArrayDataSource; import mx.gob.jumapacelaya.models.Usuario; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.InputStreamResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMailMessage; @@ -11,6 +15,7 @@ import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import java.io.File; +import java.io.InputStream; @Service public class EmailService { @@ -21,16 +26,16 @@ public class EmailService { public void enviarCorreo(String destinatario, String asunto, String cuerpo, String imagePath) { try { MimeMessage mensaje = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(mensaje, true); helper.setTo(destinatario); helper.setSubject(asunto); helper.setFrom("noreply@jumapacelaya.gob.mx"); - helper.setText(cuerpo, true); - File image = new File(imagePath); - helper.addInline("image_id", image); + ClassPathResource imgResource = new ClassPathResource(imagePath); + + helper.addInline("image_id", imgResource); + mailSender.send(mensaje); System.out.println("Correo enviado con imagen exitosamente"); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java index be764f2..bfc8396 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java @@ -9,6 +9,8 @@ import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.Span; +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.FlexComponent; @@ -87,25 +89,26 @@ public class ActDiariaView extends VerticalLayout { //grid.addColumn(ticket -> ticket.tiempoEst(ticket.getTrackerId())).setHeader("Tiempo estimado de atencion").setAutoWidth(false); grid.addComponentColumn(ticket -> { - Button btnVer = new Button("Ver"); + Button btnVer = new Button(new Icon(VaadinIcon.EYE)); btnVer.addClickListener(event -> showDescription(ticket)); + btnVer.getStyle().set("color", "#A02142"); return btnVer; - }).setHeader("Descripcion").setAutoWidth(true); + }).setAutoWidth(true); - //grid.addColumn(buttonTicketComponentRenderer()).setHeader("Realizar").setFlexGrow(0).setAutoWidth(true); + grid.addColumn(buttonTicketComponentRenderer()).setAutoWidth(true); grid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT); grid.getStyle().set("opacity", "0.8"); grid.setAllRowsVisible(false); - grid.setHeight("35em"); + grid.setSizeFull(); // Ajustar tamaño del Grid y Layout - //grid.setSizeFull(); - //setSizeFull(); + grid.setSizeFull(); + setSizeFull(); add(grid); - expand(grid); + //expand(grid); setMargin(false); loadTickets(); @@ -157,13 +160,14 @@ public class ActDiariaView extends VerticalLayout { public ComponentRenderer buttonTicketComponentRenderer() { return new ComponentRenderer<>(ticket -> { - Button button = new Button("Realizar"); + Button button = new Button(new Icon(VaadinIcon.EDIT) ); + button.getStyle().set("color", "#A02142"); button.addClickListener(e -> { RedmineUser currentUser = userService.getRedmineUser(); - if (ticket.getTrackerId() == 16) { + if (ticket.getTrackerId() == 9) { UI.getCurrent().navigate("mantenimiento"); - } else if (ticket.getTrackerId() == 17) { + } else if (ticket.getTrackerId() == 10) { cerrarTicket(ticket, currentUser); } else { Notification.show("El ticket no es de tipo Mantenimiento o Actividad."); @@ -178,7 +182,10 @@ public class ActDiariaView extends VerticalLayout { //Llamar al metodo para cambiar el estado del ticket redmineClient.closeTicket(ticket.getId(), user); Notification.show("El ticket " + ticket.getId() + " se ha cerrado exitosamente.", 3000, Notification.Position.MIDDLE) - .addThemeVariants(NotificationVariant.LUMO_WARNING); + .addThemeVariants(NotificationVariant.LUMO_SUCCESS); + + UI.getCurrent().getPage().executeJs("setTimeout(() => { window.location.reload(); }, 3000);"); + } catch (IOException | InterruptedException e) { e.printStackTrace(); Notification.show("Error al cerrar el ticket " + ticket.getId()); @@ -197,7 +204,7 @@ public class ActDiariaView extends VerticalLayout { textEditor.setValue(ticket.getDescription()); textEditor.setReadOnly(true); - Button closeButton = new Button("Cerrar"); + Button closeButton = new Button("Cerrar", new Icon(VaadinIcon.CLOSE)); closeButton.addThemeVariants(ButtonVariant.LUMO_ERROR); closeButton.addClickListener(e -> dialog.close()); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java b/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java index 199fe11..2898746 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java @@ -42,8 +42,11 @@ public class MainLayout extends AppLayout { String u = securityService.getAuthenticatedUser(); Span usrNameLabel = new Span("Hola " + u); + usrNameLabel.getStyle().set("color", "#691b31"); + usrNameLabel.getStyle().set("font-weight", "bold"); + usrNameLabel.getStyle().set("font-size", "20px"); - Button logoutButton = new Button("Cerrar sesión", event -> { + Button logoutButton = new Button("Cerrar sesión", VaadinIcon.SIGN_OUT.create(),event -> { securityService.logout(); }); logoutButton.addClassName("logout-button"); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java index 022ca4e..02f1908 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java @@ -38,6 +38,7 @@ import mx.gob.jumapacelaya.services.EmailService; import mx.gob.jumapacelaya.services.SecurityService; import mx.gob.jumapacelaya.services.UserService; import org.springframework.beans.factory.annotation.Autowired; +import org.vaadin.lineawesome.LineAwesomeIcon; import java.time.LocalDate; import java.util.*; @@ -184,7 +185,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse this.txtNombreEquipo = new TextField("Nombre del Equipo"); txtNombreEquipo.setRequired(true); - txtNombreEquipo.setReadOnly(true); + //txtNombreEquipo.setReadOnly(true); departamentoLayout.add(area, usuario/*, btnEnviarCorreo*/, txtNombreEquipo); @@ -237,18 +238,26 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse noSerie.setRequired(true); noSerie.setPlaceholder("No. Serie"); noSerie.setSizeFull(); + noSerie.addValueChangeListener(event -> { + String upperCaseValue = event.getValue().toUpperCase(); + noSerie.setValue(upperCaseValue); + }); // Validacion para que este campo solo acepte numeros - noSerie.getElement().executeJs( + /*noSerie.getElement().executeJs( "this.addEventListener('input', function(e) { " + " e.target.value = e.target.value.replace(/[^0-9]/g, '');" + // Solo permite dígitos "});" - ); + );*/ TextField modelo = new TextField(); modelo.setEnabled(false); modelo.setRequired(true); modelo.setPlaceholder("Modelo"); modelo.setSizeFull(); + modelo.addValueChangeListener(event -> { + String upperCaseValue = event.getValue().toUpperCase(); + modelo.setValue(upperCaseValue); + }); TextField placa = new TextField(); placa.setEnabled(false); @@ -340,6 +349,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse if ("Si".equals(event.getValue())) { txtCuales.setEnabled(true); txtCuales.setRequired(true); + txtCuales.setMaxHeight("100px"); } else { txtCuales.setEnabled(false); txtCuales.setRequired(false); @@ -469,9 +479,11 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse private void buttons() { - HorizontalLayout buttonsLayout = new HorizontalLayout(); - Button btnGuardar = new Button("Guardar"); + VerticalLayout buttonsLayout = new VerticalLayout(); + Button btnGuardar = new Button("Guardar", LineAwesomeIcon.SAVE.create()); btnGuardar.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + btnGuardar.addThemeVariants(ButtonVariant.LUMO_LARGE); + btnGuardar.addClickListener(event -> { LocalDate fechaSeleccionada = fecha.getValue(); @@ -658,7 +670,10 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse buttonsLayout.setSizeFull(); buttonsLayout.add(btnGuardar); + buttonsLayout.setAlignItems(Alignment.CENTER); botonesLayout.add(buttonsLayout); + botonesLayout.setSizeFull(); + //botonesLayout.setAlignItems(Alignment.CENTER); } @@ -675,7 +690,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse "" + ""; - String imagePath = "src/main/resources/META-INF/resources/images/imgCorreo/correoMantt.png"; + String imagePath = "META-INF/resources/images/imgCorreo/correoMantt.png"; emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index dde2f19..db20180 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -3,6 +3,7 @@ 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.checkbox.Checkbox; import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; @@ -34,6 +35,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Array; import java.time.LocalDate; +import java.time.Year; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; @@ -137,12 +139,17 @@ 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()); + }); + this.setPadding(false); this.setMargin(false); this.setSpacing(false); this.setSizeFull(); - add(header, gridLayout, uploadLayout); + add(header, chkMostrarTodos, gridLayout, uploadLayout); } @@ -153,22 +160,24 @@ public class PlanAnualView extends VerticalLayout { titulo.addClassName("plan-anual-titulo"); titulo1.addClassName("plan-anual-titulo1"); titulo.setText("Plan Anual de Mantenimiento Preventivo de Equipo de Computo"); - titulo1.setText("2024"); + titulo1.setText(Year.now().toString()); TextField nomenclaturaTxt = new TextField(); nomenclaturaTxt.setValue("FR01-PA-7.1.3-02"); nomenclaturaTxt.setReadOnly(true); nomenclaturaTxt.addClassName("nomenclatura-txt"); + header.setAlignSelf(Alignment.CENTER, titulo, titulo1); headerLayout.add(titulo, titulo1); add(headerLayout); } private Grid setupGrid() { + Grid planAnualGrid = new Grid<>(PlanAnual.class, false); - planAnualGrid.addColumn(PlanAnual :: getNumero).setHeader("No."); + planAnualGrid.addColumn(PlanAnual :: getNumero).setHeader("No.").setSortable(true); planAnualGrid.addColumn(PlanAnual :: getNomEquipo).setHeader("Equipo").setAutoWidth(true); planAnualGrid.addColumn(PlanAnual :: getDepartamento).setHeader("Departamento").setAutoWidth(true); planAnualGrid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT); @@ -187,12 +196,12 @@ 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 especifico - }).setHeader("Fecha Programada").setAutoWidth(true); + }).setHeader("Fecha Programada").setAutoWidth(true).setSortable(true); planAnualGrid.addColumn(planAnual -> { LocalDate fechaMantenimiento = planAnual.getFechaMantenimiento(); return fechaMantenimiento != null ? fechaMantenimiento.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) : ""; // Formato especifico - }).setHeader("Fecha Realizacion").setAutoWidth(true); + }).setHeader("Fecha Realizacion").setAutoWidth(true).setSortable(true); planAnualGrid.addColumn(PlanAnual :: getEstado).setHeader("Estado").setAutoWidth(true); @@ -201,7 +210,8 @@ public class PlanAnualView extends VerticalLayout { planAnualGrid.setItems(databaseService.getPlanAnual()); planAnualGrid.addComponentColumn(planAnual -> { - Button btnRealizar = new Button("Realizar"); + Button btnRealizar = new Button(new Icon(VaadinIcon.EDIT)); + btnRealizar.getStyle().set("color", "#A02142"); btnRealizar.addClickListener(event -> { int idPlananual = planAnual.getNumero(); LocalDate fechaSistema = LocalDate.now(); @@ -220,7 +230,7 @@ public class PlanAnualView extends VerticalLayout { } return btnRealizar; - }).setHeader("Realizado"); + }); planAnualGrid.setItems(databaseService.getPlanAnual()); return planAnualGrid; @@ -344,8 +354,15 @@ public class PlanAnualView extends VerticalLayout { } public boolean test(PlanAnual planAnual) { + if (planAnual == null) { + return false; // Avoid NullPointerException + } + boolean matchesSmt = matches(planAnual.getSmt(), smt); - boolean isNoRealizado = !excludeRealizado || !"REALIZADO".equalsIgnoreCase(planAnual.getEstado()); + boolean isNoRealizado = !excludeRealizado || + (planAnual.getEstado() != null && + !"REALIZADO".equalsIgnoreCase(planAnual.getEstado())); + return matchesSmt && isNoRealizado; } @@ -357,6 +374,8 @@ public class PlanAnualView extends VerticalLayout { } + + //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 dataView) { boolean hasItems = dataView.getItemCount() > 0; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f9f0a3b..4f20e8e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -55,4 +55,3 @@ spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=false spring.mail.properties.mail.smtp.ssl.trust=correo.jumapacelaya.gob.mx -