Browse Source

Se agrego un boton en el dialog de las descripciones que muestra los comentarios que se han hecho en el ticket

pull/3/head
mramirezg 4 months ago
parent
commit
5a40585bb4
5 changed files with 98 additions and 63 deletions
  1. +40
    -46
      src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java
  2. +0
    -4
      src/main/java/mx/gob/jumapacelaya/models/Journals.java
  3. +1
    -1
      src/main/java/mx/gob/jumapacelaya/models/Ticket.java
  4. +20
    -11
      src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java
  5. +37
    -1
      src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java

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

@ -48,13 +48,11 @@ 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 + includeJournals + "&offset=" + offset))
.uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + statusFilter + "&offset=" + offset))
.header("Content-Type", "application/json")
.build();
@ -65,26 +63,6 @@ public class RedmineClient {
List<Ticket> pageTickets = parseTickets(responseBody);
tickets.addAll(pageTickets);
// **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.");
}
}
if (pageTickets.size() < PAGE_SIZE) {
break;
}
@ -152,32 +130,10 @@ 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, comments));
tickets.add(new Ticket(id, subject, description, status, date != null ? date.toString() : "", trackerId));
}
} else {
System.out.println("La respuesta JSON no contiene la clave 'issues'");
@ -486,4 +442,42 @@ public class RedmineClient {
return null;
}
}
public List<String> getTicketComments(int ticketId, RedmineUser user) {
List<String> comments = new ArrayList<>();
HttpClient client = HttpClient.newHttpClient();
String url = REDMINE_URL + "/issues/" + ticketId + ".json?include=journals&key=" + user.getKey();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
String responseBody = response.body();
JsonObject jsonResponse = JsonParser.parseString(responseBody).getAsJsonObject();
JsonArray journals = jsonResponse.getAsJsonObject("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().trim();
if (!note.isEmpty()) {
comments.add(note);
}
}
}
} else {
System.err.println("Error en la respuesta al obtener los comentarios: " + response.statusCode());
}
} catch (Exception e) {
e.printStackTrace();
}
return comments;
}
}

+ 0
- 4
src/main/java/mx/gob/jumapacelaya/models/Journals.java View File

@ -1,4 +0,0 @@
package mx.gob.jumapacelaya.models;
public class Journals {
}

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

@ -21,7 +21,7 @@ public class Ticket {
public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId, List<String> comments) {
public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId) {
this.id = id;
this.subject = subject;
this.description = description;


+ 20
- 11
src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java View File

@ -101,6 +101,7 @@ public class AllTicketsView extends VerticalLayout {
textEditor.setValue(ticket.getDescription());
textEditor.setReadOnly(true);
Button verNotas = new Button("Comentarios");
verNotas.addClickListener(event -> showComents(ticket));
@ -120,25 +121,33 @@ public class AllTicketsView extends VerticalLayout {
private void showComents(Ticket ticket) {
Dialog comentDialog = new Dialog();
comentDialog.getElement().setAttribute("arial-label", "Add note");
comentDialog.getElement().setAttribute("arial-label", "Comentarios del ticket");
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
}
layout.setPadding(true);
layout.setSpacing(true);
// Obtenemos los comentarios desde Proyman
List<String> comentarios = redmineClient.getTicketComments(ticket.getId(), userService.getRedmineUser());
if (comentarios != null && !comentarios.isEmpty()) {
for (String comentario : comentarios) {
Span commentSpan = new Span(comentario);
commentSpan.getElement().getStyle().set("background", "#f1f1f1");
commentSpan.getElement().getStyle().set("padding", "10px");
commentSpan.getElement().getStyle().set("border-radius", "5px");
layout.add(commentSpan);
}
} else {
layout.add(new Span("No hay comentarios disponibles.")); // Mensaje si no hay comentarios
layout.add(new Span("No hay comentarios para este ticket."));
}
Button closeButton = new Button("Cerrar", event -> comentDialog.close());
closeButton.addThemeVariants(ButtonVariant.LUMO_ERROR);
layout.add(closeButton);
comentDialog.add(layout);
comentDialog.open();
}


+ 37
- 1
src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java View File

@ -105,11 +105,14 @@ public class MisTicketsView 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);
@ -119,6 +122,39 @@ public class MisTicketsView extends VerticalLayout {
dialog.open();
}
private void showComents(Ticket ticket) {
Dialog comentDialog = new Dialog();
comentDialog.getElement().setAttribute("arial-label", "Comentarios del ticket");
comentDialog.setMaxHeight("500px");
comentDialog.setMaxWidth("1100px");
VerticalLayout layout = new VerticalLayout();
layout.setPadding(true);
layout.setSpacing(true);
// Obtenemos los comentarios desde Proyman
List<String> comentarios = redmineClient.getTicketComments(ticket.getId(), userService.getRedmineUser());
if (comentarios != null && !comentarios.isEmpty()) {
for (String comentario : comentarios) {
Span commentSpan = new Span(comentario);
commentSpan.getElement().getStyle().set("background", "#f1f1f1");
commentSpan.getElement().getStyle().set("padding", "10px");
commentSpan.getElement().getStyle().set("border-radius", "5px");
layout.add(commentSpan);
}
} else {
layout.add(new Span("No hay comentarios para este ticket."));
}
Button closeButton = new Button("Cerrar", event -> comentDialog.close());
closeButton.addThemeVariants(ButtonVariant.LUMO_ERROR);
layout.add(closeButton);
comentDialog.add(layout);
comentDialog.open();
}
private void loadTickets() {
try {
List<Ticket> tickets = redmineClient.getTicketsAuthor(userService.getRedmineUser());


Loading…
Cancel
Save