Add BotonDTO class and update home page to use button fragments for dynamic button rendering

This commit is contained in:
jon ander 2025-04-11 17:54:32 +02:00
parent 37afb26f59
commit b56442d48b
6 changed files with 126 additions and 17 deletions

View File

@ -1,5 +1,6 @@
package com.ieslamar.GestionInventario;
import com.ieslamar.GestionInventario.dto.BotonDTO;
import com.ieslamar.GestionInventario.entities.Role;
import com.ieslamar.GestionInventario.services.UserService;
import org.springframework.boot.CommandLineRunner;
@ -16,6 +17,11 @@ public class DataInitializer {
// userService.registerUser("user", "user123", Role.USER.name(), "user123@ejemplo.com",null);
// };
// }
// public static void test(){
// BotonDTO boton1 = new BotonDTO("Inventario", "/Inventario/management");
// boton1.isRequireAdmin();
//
// }
}

View File

@ -1,6 +1,7 @@
package com.ieslamar.GestionInventario.controllers;
import com.ieslamar.GestionInventario.dto.BotonDTO;
import com.ieslamar.GestionInventario.entities.User;
import com.ieslamar.GestionInventario.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
@ -28,6 +29,11 @@ public class UserController {
@GetMapping("/home")
public String homePage(Model model) {
List<BotonDTO> botones = List.of(
new BotonDTO("Inventario", "/Inventario/management", false, null),
new BotonDTO("Gestión", "/Inventario/management", true, "button_salir")
);
model.addAttribute("buttons", botones);
return "home"; // Retorna la vista home.html
}

View File

@ -0,0 +1,74 @@
package com.ieslamar.GestionInventario.dto;
import lombok.Getter;
import lombok.Setter;
public class BotonDTO {
private String texto;
private String url;
private boolean requireAdmin;
private String cssClass;
public BotonDTO(String texto, String url) {
this(texto, url, false, null);
}
public BotonDTO(String texto, String url, boolean requireAdmin) {
this(texto, url, requireAdmin, null);
}
public BotonDTO(String texto, String url, String cssClass) {
this(texto, url, false, cssClass);
}
public BotonDTO(String texto, String url, boolean requireAdmin, String cssClass) {
this.texto = texto;
this.url = url;
this.requireAdmin = requireAdmin;
this.cssClass = cssClass;
}
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isRequireAdmin() {
return requireAdmin;
}
public void setRequireAdmin(boolean requireAdmin) {
this.requireAdmin = requireAdmin;
}
public String getCssClass() {
return cssClass;
}
public void setCssClass(String cssClass) {
this.cssClass = cssClass;
}
@Override
public String toString() {
return "BotonDTO{" +
"texto='" + texto + '\'' +
", url='" + url + '\'' +
", requireAdmin=" + requireAdmin +
", cssClass='" + cssClass + '\'' +
'}';
}
}

View File

@ -0,0 +1,28 @@
<!-- fragments/buttons.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<body>
<div th:fragment="buttonList(buttons)">
<div class="container1">
<div th:each="button : ${buttons}">
<div th:utext="${button.isRequireAdmin()}"></div>
</div>
</div>
</div>
</body>
</html>
<!-- <div th:if="${!button.isRequireAdmin()}">-->
<!-- <a th:href="@{${button.getUrl()}}">-->
<!-- <button th:class="${button.getCssClass()}" th:text="${button.getTexto()}"></button>-->
<!-- </a>-->
<!-- </div>-->
<!-- <div th:if="${button.isRequireAdmin()}">-->
<!-- <div sec:authorize="hasRole('ADMIN')">-->
<!-- <a th:href="@{${button.getUrl()}}">-->
<!-- <button th:class="${button.getCssClass()}" th:text="${button.getTexto()}"></button>-->
<!-- </a>-->
<!-- </div>-->
<!-- </div>-->

View File

@ -1,27 +1,22 @@
<!DOCTYPE html>
<html lang="es" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<html lang="es" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<title>Home</title>
<link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
<h2>Bienvenido a Gestión de Inventario</h2>
<div class="container1">
<a href="/Inventario/management">
<button>Inventario</button>
</a>
<!-- Botón visible solo para Administradores -->
<div sec:authorize="hasRole('ADMIN')">
<a href="/Inventario/management">
<button>Gestión</button>
</a>
</div>
<!-- Formulario de Logout (POST) -->
<form th:action="@{/logout}" method="post">
<button class="button_salir" type="submit">Cerrar Sesión</button>
<!-- Token CSRF (obligatorio) -->
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
</form>
<div th:each="button : ${buttons}">
<div th:utext="${button.isRequireAdmin()}"></div>
</div>
<!-- Reemplaza los botones por el fragmento reutilizable -->
<div th:replace="fragments/buttons :: buttonList(buttons)"></div>
<!-- Formulario de Logout (estático y fuera del fragmento) -->
<form th:action="@{/logout}" method="post">
<button class="button_salir" type="submit">Cerrar Sesión</button>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
</form>
</body>
</html>