diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index 7cf4061..fdf682f 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -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 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 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 getTicketComments(int ticketId, RedmineUser user) { + List 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 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; + } + } diff --git a/src/main/java/mx/gob/jumapacelaya/models/Journals.java b/src/main/java/mx/gob/jumapacelaya/models/Journals.java deleted file mode 100644 index b6d0824..0000000 --- a/src/main/java/mx/gob/jumapacelaya/models/Journals.java +++ /dev/null @@ -1,4 +0,0 @@ -package mx.gob.jumapacelaya.models; - -public class Journals { -} diff --git a/src/main/java/mx/gob/jumapacelaya/models/Ticket.java b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java index bf2c073..cc825f7 100644 --- a/src/main/java/mx/gob/jumapacelaya/models/Ticket.java +++ b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java @@ -21,7 +21,7 @@ public class Ticket { - public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId, List comments) { + public Ticket(int id, String subject, String description, String status, String dateCreate, Integer trackerId) { this.id = id; this.subject = subject; this.description = description; diff --git a/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java b/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java index 72fca9f..c75c9cd 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java @@ -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 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 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(); } diff --git a/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java b/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java index 9b4f294..5ef122c 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java @@ -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 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 tickets = redmineClient.getTicketsAuthor(userService.getRedmineUser());