Browse Source

Cambios visuales

pull/2/head
mramirezg 4 months ago
parent
commit
887eaadf81
7 changed files with 159 additions and 59 deletions
  1. BIN
      src/main/bundles/prod.bundle
  2. +84
    -37
      src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java
  3. +19
    -6
      src/main/java/mx/gob/jumapacelaya/models/Ticket.java
  4. +4
    -7
      src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java
  5. +34
    -3
      src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java
  6. +17
    -5
      src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java
  7. +1
    -1
      src/main/resources/application.properties

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


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

@ -48,55 +48,43 @@ public class RedmineClient {
// Si includeClose es true, incluira todos los tikets si no, incluira solo los que estan abiertos
String statusFilter = includeClosed ? "&status_id=*" : "&status_id=open";
String includeJournals = "&include=journals"; // <-- Agregar los journals (comentarios/Notas)
String responseBody = null;
while (true) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + statusFilter + "&offset=" + offset))
.uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + statusFilter + includeJournals + "&offset=" + offset))
.header("Content-Type", "application/json")
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
String responseBody = response.body();
responseBody = response.body();
List<Ticket> pageTickets = parseTickets(responseBody);
tickets.addAll(pageTickets);
if (pageTickets.size() < PAGE_SIZE) {
break;
}
offset += PAGE_SIZE;
} else {
System.err.println("Error en la respuesta: " + response.statusCode());
break;
}
} catch (Exception e) {
e.printStackTrace();
break;
}
}
System.out.println("Total tickets obtenidos: " + tickets.size());
return tickets;
}
//AQUI OBTENGO LOS TICKETS DESDE REDMINE
public List<Ticket> getTicketsAuthor(RedmineUser user) {
List<Ticket> tickets = new ArrayList<>();
HttpClient client = HttpClient.newHttpClient();
int offset = 0;
while (true) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&author_id=" + user.getId() + "&offset=" + offset))
.header("Content-Type", "application/json")
.build();
// **Imprimir los tickets y sus comentarios**
for (Ticket ticket : pageTickets) {
System.out.println("-------------------------------------------------");
System.out.println("Ticket ID: " + ticket.getId());
System.out.println("Asunto: " + ticket.getSubject());
System.out.println("Descripción: " + ticket.getDescription());
System.out.println("Estado: " + ticket.getStatus());
System.out.println("Fecha de creación: " + ticket.getDateCreate());
// Imprimir comentarios si existen
if (ticket.getComments() != null && !ticket.getComments().isEmpty()) {
System.out.println("Comentarios:");
for (String comment : ticket.getComments()) {
System.out.println(" - " + comment);
}
} else {
System.out.println("No hay comentarios.");
}
}
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
String responseBody = response.body();
List<Ticket> pageTickets = parseTickets(responseBody);
tickets.addAll(pageTickets);
if (pageTickets.size() < PAGE_SIZE) {
break;
}
@ -164,9 +152,32 @@ public class RedmineClient {
}
}
List<String> comments = new ArrayList<>();
if (issue.has("journals") && !issue.get("journals").isJsonNull()) {
JsonArray journals = issue.getAsJsonArray("journals");
for (JsonElement journalElement : journals) {
JsonObject journal = journalElement.getAsJsonObject();
if (journal.has("notes") && !journal.get("notes").isJsonNull()) {
String note = journal.get("notes").getAsString();
if (!note.trim().isEmpty()) {
comments.add(note); // Agregar solo comentarios no vacíos
}
}
}
}
if (comments.isEmpty()) {
System.out.println("No hay comentarios para este ticket.");
} else {
System.out.println("Comentarios:");
for (String comment : comments) {
System.out.println(" - " + comment);
}
}
// Agrega el ticket a la lista
tickets.add(new Ticket(id, subject, description, status, date != null ? date.toString() : "", trackerId));
tickets.add(new Ticket(id, subject, description, status, date != null ? date.toString() : "", trackerId, comments));
}
} else {
System.out.println("La respuesta JSON no contiene la clave 'issues'");
@ -178,6 +189,42 @@ public class RedmineClient {
return tickets;
}
//AQUI OBTENGO LOS TICKETS DESDE REDMINE
public List<Ticket> getTicketsAuthor(RedmineUser user) {
List<Ticket> tickets = new ArrayList<>();
HttpClient client = HttpClient.newHttpClient();
int offset = 0;
while (true) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&author_id=" + user.getId() + "&offset=" + offset))
.header("Content-Type", "application/json")
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
String responseBody = response.body();
List<Ticket> pageTickets = parseTickets(responseBody);
tickets.addAll(pageTickets);
if (pageTickets.size() < PAGE_SIZE) {
break;
}
offset += PAGE_SIZE;
} else {
System.err.println("Error en la respuesta: " + response.statusCode());
break;
}
} catch (Exception e) {
e.printStackTrace();
break;
}
}
System.out.println("Total tickets obtenidos: " + tickets.size());
return tickets;
}


+ 19
- 6
src/main/java/mx/gob/jumapacelaya/models/Ticket.java View File

@ -4,6 +4,7 @@ package mx.gob.jumapacelaya.models;
import java.sql.Date;
import java.time.LocalDate;
import java.util.List;
public class Ticket {
@ -15,9 +16,12 @@ public class Ticket {
private LocalDate dateCreate;
private User author;
private Integer trackerId;
private List<String> comments;
public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId) {
public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId, List<String> comments) {
this.id = id;
this.subject = subject;
this.description = description;
@ -25,6 +29,7 @@ public class Ticket {
this.dateCreate = LocalDate.parse(dateCreate);
this.author = author;
this.trackerId = trackerId;
this.comments = comments;
}
public int getId() {
@ -86,18 +91,26 @@ public class Ticket {
}
switch (trackerId) {
case 1,3,4,7:
case 5,7,8,11,12:
return "1-2 dias Max";
case 2,12:
case 2,14,16:
return "2 hrs Max";
case 5:
case 10:
return "5 dias aprox.";
case 8,11:
case 15:
return "2-6 hrs Max";
case 9,10:
case 6,13:
return "2 hrs Max";
default:
return "N/A";
}
}
public List<String> getComments() {
return comments;
}
public void setComments(List<String> comments) {
this.comments = comments;
}
}

+ 4
- 7
src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java View File

@ -31,10 +31,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Route(value = "", layout = MainLayout.class)
@PermitAll
@ -159,13 +156,13 @@ public class CrearnuevoTicketView extends VerticalLayout {
tipoTickets.setPlaceholder("Seleccione un tipo de ticket");
Map<String, RedmineClient.TicketType> ticketTypesMap = api.getTicketTypes();
Set<String> ticketTypesSet = Set.of("Acceso/Permiso/Bajas", "Soporte de Software", "Capacitacion de Software",
/*Set<String> ticketTypesSet = Set.of("Acceso/Permiso/Bajas", "Soporte de Software", "Capacitacion de Software",
"Configuracion de Software", "Digitalizacion GIS", "Documento", "Funcionalidad", "Reporte",
"Mantenimiento Correctivo", "Desarrollo de Software", "Actividad","Entrega de Consumibles","Instalación/Configuracion GIS");
List<String> filteredTicketTypes = ticketTypesMap.keySet().stream()
.filter(ticketTypesSet::contains)
.collect(Collectors.toList());
tipoTickets.setItems(filteredTicketTypes);
.collect(Collectors.toList());*/
tipoTickets.setItems(ticketTypesMap.keySet());
tipoTickets.addValueChangeListener(event -> {
String selectedType = event.getValue();
@ -240,7 +237,7 @@ public class CrearnuevoTicketView extends VerticalLayout {
issueDetails.put("project_id", "soporte-tecnico-t-i");
issueDetails.put("subject", asunto.getValue());
String areaValue = area.getValue().trim();
String descriptionCompleta = descripcion.getValue() + ("Area: " + areaValue + "\n\n"); // Concatenamos el valor del campo Area a la descripcion del ticket
String descriptionCompleta = descripcion.getValue() + (" \n" + " Area: " + areaValue + "\n\n"); // Concatenamos el valor del campo Area a la descripcion del ticket
issueDetails.put("description", descriptionCompleta);
issueDetails.put("tracker_id", selectedTrackerId);


+ 34
- 3
src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java View File

@ -6,6 +6,8 @@ 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.html.Span;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
@ -63,9 +65,10 @@ public class AllTicketsView 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("Ver", new Icon(VaadinIcon.EYE));
btnVer.setTooltipText("Ver descripción");
btnVer.addClickListener(event -> showDescription(ticket));
btnVer.getStyle().set("color", "#691b31");
btnVer.getStyle().set("color", "#A02142");
return btnVer;
}).setHeader("Descripcion").setAutoWidth(true);
@ -98,11 +101,14 @@ public class AllTicketsView extends VerticalLayout {
textEditor.setValue(ticket.getDescription());
textEditor.setReadOnly(true);
Button verNotas = new Button("Comentarios");
verNotas.addClickListener(event -> showComents(ticket));
Button closeButton = new Button("Cerrar");
closeButton.addThemeVariants(ButtonVariant.LUMO_ERROR);
closeButton.addClickListener(e -> dialog.close());
HorizontalLayout buttonLayout = new HorizontalLayout(closeButton);
HorizontalLayout buttonLayout = new HorizontalLayout(verNotas, closeButton);
buttonLayout.setWidthFull();
buttonLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.END);
buttonLayout.add(closeButton);
@ -112,6 +118,31 @@ public class AllTicketsView extends VerticalLayout {
dialog.open();
}
private void showComents(Ticket ticket) {
Dialog comentDialog = new Dialog();
comentDialog.getElement().setAttribute("arial-label", "Add note");
comentDialog.setMaxHeight("500px");
comentDialog.setMaxWidth("1100px");
VerticalLayout layout = new VerticalLayout();
List<String> comments = ticket.getComments(); // Obtiene los comentarios
boolean hasComments = comments != null && !comments.isEmpty();
if (hasComments) {
for (String comment : comments) {
if (comment != null && !comment.trim().isEmpty()) {
layout.add(new Span(comment)); // Agrega cada comentario
}
}
} else {
layout.add(new Span("No hay comentarios disponibles.")); // Mensaje si no hay comentarios
}
comentDialog.add(layout);
comentDialog.open();
}
private void loadTickets() {
try {
List<Ticket> tickets = redmineClient.getTickets(userService.getRedmineUser(), true);


+ 17
- 5
src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java View File

@ -6,6 +6,8 @@ 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.html.Span;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
@ -68,9 +70,10 @@ public class MisTicketsView 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("Ver", new Icon(VaadinIcon.EYE));
btnVer.setTooltipText("Ver descripción");
btnVer.addClickListener(event -> showDescription(ticket));
btnVer.getStyle().set("color", "#691b31");
btnVer.getStyle().set("color", "#A02142");
return btnVer;
}).setHeader("Descripcion").setAutoWidth(true);
@ -132,13 +135,22 @@ public class MisTicketsView extends VerticalLayout {
Span span = new Span(ticket.getStatus());
switch (ticket.getStatus().toLowerCase()) {
case "análisis":
span.getElement().getStyle().set("color","purple");
span.getElement().getStyle().set("color","orange");
break;
case "desarrollo":
span.getElement().getStyle().set("color","green");
span.getElement().getStyle().set("color","blue");
break;
case "rechazada":
span.getElement().getStyle().set("color","red");
break;
case "cerrada":
span.getElement().getStyle().set("color","grey");
break;
case "solicitado":
span.getElement().getStyle().set("color","purple");
break;
default:
span.getElement().getStyle().set("color","blue");
span.getElement().getStyle().set("color","green");
break;
}
return span;


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

@ -19,7 +19,7 @@ spring.ldap.password=Dr3na$134%4guA
########PRODUCTIVO#################################
redmine.url=https://proyman.jumapacelaya.gob.mx/
redmine.api_key=98158784609a110b3f9e837ac961d73b9ec58271
redmine.api_key=69be2a5df9bacce02722f566fdf0731d728a1b86
########LOCAL######################################


Loading…
Cancel
Save