diff --git a/tests/cypress/e2e/dashboard.cy.js b/tests/cypress/e2e/dashboard.cy.js index 5a54380..316da4b 100644 --- a/tests/cypress/e2e/dashboard.cy.js +++ b/tests/cypress/e2e/dashboard.cy.js @@ -32,7 +32,7 @@ describe("Role-based button functionality", () => { cy.visitWithToken("/dashboard"); cy.get("#btnParcelControl").contains("Control de paquetería").click(); - cy.url().should("include", "/parcelControl"); + cy.url().should("include", "/packages"); cy.visitWithToken("/dashboard"); }); }); @@ -62,7 +62,7 @@ describe("Role-based button functionality", () => { cy.visitWithToken("/dashboard"); cy.get("#btnParcelControl").contains("Control de paquetería").click(); - cy.url().should("include", "/parcelControl"); + cy.url().should("include", "/packages"); }); }); diff --git a/tests/cypress/e2e/packages.cy.js b/tests/cypress/e2e/packages.cy.js new file mode 100644 index 0000000..f52c5f9 --- /dev/null +++ b/tests/cypress/e2e/packages.cy.js @@ -0,0 +1,51 @@ +describe("Packages Table", () => { + beforeEach(() => { + cy.intercept("GET", "/packages", { + statusCode: 200, + body: { + message: "OK", + packages: [ + { + id: 1, + service: "Delivery", + receivedAt: "2023-12-20 14:00:00", + confirmedAt: null, + address: "Fake Street 123", + statusName: "confirmar", + }, + ], + }, + }).as("getPackages"); + + cy.visitWithToken("/packages"); + }); + + it("should display the packages table with confirmation buttons", () => { + cy.wait("@getPackages"); + cy.get("#packageTable").should("exist"); + cy.get('[data-cy="btnConfirm"]').should("exist"); + cy.get("#packageTable tr").then(($rows) => { + const numRows = $rows.length; + cy.get('[data-cy="btnConfirm"]').should("have.length", numRows); + }); + }); + + it("should display an empty table with an error message when the API request fails", () => { + cy.intercept("GET", "/packages", { + statusCode: 500, + body: { message: "Internal Server Error" }, + }).as("getPackagesError"); + + cy.visitWithToken("/packages"); + cy.wait("@getPackagesError"); + + cy.get("#packageTable").should("exist"); + cy.get("#packageTable tr").should("have.length", 0); + }); + + it("should display a confirmation button for each package", () => { + cy.wait("@getPackages"); + cy.get("#packageTable").should("exist"); + cy.get('[data-cy="btnConfirm"]').should("exist"); + }); +}); diff --git a/views/dashboard/blocks/parcelControlbutton.html b/views/dashboard/blocks/parcelControlbutton.html index 4a4d503..5ee724f 100644 --- a/views/dashboard/blocks/parcelControlbutton.html +++ b/views/dashboard/blocks/parcelControlbutton.html @@ -4,7 +4,7 @@ id="btnParcelControl" class="btn btn-primary btn-lg me-3" style="width: 150px; height: 150px" - onclick="navigateTo('/parcelControl')" + onclick="navigateTo('/packages')" > local_shipping
Control de paquetería diff --git a/views/packages/assets/index.js b/views/packages/assets/index.js new file mode 100644 index 0000000..8cc0ed4 --- /dev/null +++ b/views/packages/assets/index.js @@ -0,0 +1,101 @@ +async function fetchPackages() { + try { + return await apiRequest("GET", "packages"); + } catch (error) { + console.error("Error al cargar paquetes:", error); + return null; + } +} + +function createCell(textContent) { + const cell = document.createElement("td"); + cell.textContent = textContent; + return cell; +} + +function formatDate(dateString) { + const date = new Date(dateString); + return date.toLocaleString(); +} + +function createActionsCell(pkg) { + const actionsCell = document.createElement("td"); + + const confirmButton = createConfirmButton(pkg.id); + actionsCell.appendChild(confirmButton); + + return actionsCell; +} + +function createPackageRow(pkg) { + const row = document.createElement("tr"); + + const serviceCell = createCell(pkg.service); + const receivedCell = createCell(formatDate(pkg.receivedAt)); + const confirmationCell = createCell(formatDate(pkg.confirmedAt)); + const addressCell = createCell(pkg.address); + const statusCell = createCell(pkg.statusName); + const actionsCell = createActionsCell(pkg); + + row.appendChild(serviceCell); + row.appendChild(receivedCell); + row.appendChild(confirmationCell); + row.appendChild(addressCell); + row.appendChild(statusCell); + row.appendChild(actionsCell); + + return row; +} + +function createConfirmButton(pkg) { + const confirmButton = document.createElement("button"); + confirmButton.className = "btn btn-outline-success btn-sm"; + confirmButton.title = "Confirmar Entrega"; + confirmButton.setAttribute("data-cy", "btnConfirm"); + confirmButton.setAttribute("data-package-id", pkg.id); + + const confirmIcon = document.createElement("span"); + confirmIcon.className = "material-symbols-outlined"; + confirmIcon.textContent = "check_circle"; + confirmButton.appendChild(confirmIcon); + + confirmButton.onclick = async () => { + try { + const response = await apiRequest("POST", `packages/${pkg.id}/confirm`); + if (response.success) { + alert("Entrega confirmada."); + await loadPackagesTable(); + } else { + alert("No se pudo confirmar la entrega."); + } + } catch (error) { + console.error("Error al confirmar entrega ", error); + } + }; + + return confirmButton; +} + +async function loadPackagesTable() { + try { + const response = await fetchPackages(); + + const packageTable = document.getElementById("packageTable"); + packageTable.innerHTML = ""; + + response.data.packages.forEach((pkg) => { + const row = createPackageRow(pkg); + packageTable.appendChild(row); + }); + } catch (error) { + console.error("Error al cargar la tabla de paquetes ", error); + } +} + +document.getElementById("registerPackage").addEventListener("click", () => { + window.location.href = "/packages/register.html"; +}); + +window.addEventListener("load", async () => { + await loadPackagesTable(); +}); diff --git a/views/packages/index.html b/views/packages/index.html new file mode 100644 index 0000000..69d908c --- /dev/null +++ b/views/packages/index.html @@ -0,0 +1,26 @@ +
+
+
+

Lista de Entregas

+ + + + + + + + + + + + + + + +
ServicioFecha y Hora de RecibidoFecha y Hora de ConfirmadoDirecciónEstatusAcciones
+
+
+
+