diff --git a/tests/cypress/e2e/roles.permissions.cy.js b/tests/cypress/e2e/roles.permissions.cy.js new file mode 100644 index 0000000..f4bc634 --- /dev/null +++ b/tests/cypress/e2e/roles.permissions.cy.js @@ -0,0 +1,45 @@ +describe("Permissions Page", () => { + beforeEach(() => { + var id = 123; + + cy.intercept("GET", "/roles/123/nodes", { + body: { + message: "OK", + permissions: { + Usuarios: ["Crear", "Editar", "Eliminar"], + Roles: ["Asignar", "Modificar"], + }, + }, + }).as("getPermissions"); + + cy.intercept("POST", "/roles/123/nodes").as("savePermissions"); + + cy.visitWithToken(`/roles/permissions/?id=${id}`); + }); + + it("should load and display permissions", () => { + cy.wait("@getPermissions"); + + cy.get("#permissionsTable").should("be.visible"); + cy.contains("Usuarios").should("exist"); + cy.contains("Crear").should("exist"); + cy.contains("Editar").should("exist"); + cy.contains("Eliminar").should("exist"); + cy.contains("Roles").should("exist"); + cy.contains("Asignar").should("exist"); + cy.contains("Modificar").should("exist"); + }); + + it("should have checkboxes for permissions", () => { + cy.get("input[type='checkbox']").should("have.length", 5); + }); + + it("should allow selecting permissions", () => { + cy.get("input[type='checkbox']").first().check().should("be.checked"); + cy.get("input[type='checkbox']").eq(1).uncheck().should("not.be.checked"); + }); + + it("should have save button disabled initially", () => { + cy.get("#savePermissions").should("be.disabled"); + }); +}); diff --git a/views/roles/assets/permissions.js b/views/roles/assets/permissions.js new file mode 100644 index 0000000..b55e54a --- /dev/null +++ b/views/roles/assets/permissions.js @@ -0,0 +1,77 @@ +async function fetchPermissions(roleId) { + try { + const response = await apiRequest("GET", `roles/${roleId}/nodes`); + + return response.data; + } catch (error) { + console.error("Error al cargar permisos:", error); + return null; + } +} + +function createPermissionsTable(permissions) { + const permissionsTable = document.getElementById("permissionsTable"); + + Object.entries(permissions).forEach(([category, permissionList]) => { + const categoryRow = document.createElement("tr"); + const categoryCell = document.createElement("td"); + categoryCell.colSpan = 2; + categoryCell.textContent = category; + categoryCell.style.fontWeight = "bold"; + categoryRow.appendChild(categoryCell); + permissionsTable.appendChild(categoryRow); + + permissionList.forEach((permission) => { + const permissionRow = document.createElement("tr"); + + const permissionCell = document.createElement("td"); + permissionCell.textContent = permission; + + const checkboxCell = document.createElement("td"); + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.dataset.permissionName = permission; + checkboxCell.appendChild(checkbox); + + permissionRow.appendChild(permissionCell); + permissionRow.appendChild(checkboxCell); + permissionsTable.appendChild(permissionRow); + }); + }); +} + +async function savePermissions(roleId) { + const checkboxes = document.querySelectorAll("input[type='checkbox']"); + const updatedPermissions = Array.from(checkboxes).map((checkbox) => ({ + permission: checkbox.dataset.permissionName, + enabled: checkbox.checked, + })); + + try { + await apiRequest("POST", `roles/${roleId}/nodes`, updatedPermissions); + + alert("Permisos guardados con éxito."); + } catch (error) { + console.error("Error al guardar permisos:", error); + alert("Hubo un error al guardar los permisos."); + } +} + +window.addEventListener("load", async () => { + const urlParams = new URLSearchParams(window.location.search); + const roleId = urlParams.get("id"); + + const permissionsData = await fetchPermissions(roleId); + + if (permissionsData && permissionsData.message === "OK") { + createPermissionsTable(permissionsData.permissions); + } else { + alert(permissionsData?.message || "Error al cargar los permisos."); + } +}); + +document + .getElementById("savePermissions") + .addEventListener("click", async () => { + await savePermissions(roleId); + }); diff --git a/views/roles/permissions.html b/views/roles/permissions.html new file mode 100644 index 0000000..f9f5075 --- /dev/null +++ b/views/roles/permissions.html @@ -0,0 +1,20 @@ +
| Permisos | +
|---|