Browse Source

Correcion de errores al enviar el correo y modificacioones en la UI y UX

master
mramirezg 5 months ago
parent
commit
8a0af1abda
9 changed files with 82 additions and 34 deletions
  1. BIN
      src/main/bundles/prod.bundle
  2. +1
    -1
      src/main/java/mx/gob/jumapacelaya/Application.java
  3. +1
    -1
      src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java
  4. +9
    -4
      src/main/java/mx/gob/jumapacelaya/services/EmailService.java
  5. +19
    -12
      src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java
  6. +4
    -1
      src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java
  7. +21
    -6
      src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java
  8. +27
    -8
      src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java
  9. +0
    -1
      src/main/resources/application.properties

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


+ 1
- 1
src/main/java/mx/gob/jumapacelaya/Application.java View File

@ -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) {


+ 1
- 1
src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java View File

@ -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<String, Object> payload = new HashMap<>();
Map<String, Object> issue = new HashMap<>();


+ 9
- 4
src/main/java/mx/gob/jumapacelaya/services/EmailService.java View File

@ -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");


+ 19
- 12
src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java View File

@ -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<Button, Ticket> 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());


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

@ -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");


+ 21
- 6
src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java View File

@ -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
"</body>" +
"</html>";
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);


+ 27
- 8
src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java View File

@ -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<PlanAnual> setupGrid() {
Grid<PlanAnual> 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<PlanAnual> dataView) {
boolean hasItems = dataView.getItemCount() > 0;


+ 0
- 1
src/main/resources/application.properties View File

@ -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

Loading…
Cancel
Save