diff --git a/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java b/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java index b2d8e25..de20891 100644 --- a/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java +++ b/src/main/java/com/imprimelibros/erp/config/SecurityConfig.java @@ -103,7 +103,7 @@ public class SecurityConfig { .loginProcessingUrl("/login") .usernameParameter("username") .passwordParameter("password") - .defaultSuccessUrl("/", true) + .defaultSuccessUrl("/", false) .failureUrl("/login?error") // útil para diagnosticar ) diff --git a/src/main/java/com/imprimelibros/erp/users/User.java b/src/main/java/com/imprimelibros/erp/users/User.java index c437c1f..eb6f2e6 100644 --- a/src/main/java/com/imprimelibros/erp/users/User.java +++ b/src/main/java/com/imprimelibros/erp/users/User.java @@ -35,7 +35,7 @@ public class User { @Column(name = "enabled") private boolean enabled; - @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set roles = new java.util.HashSet<>(); diff --git a/src/main/java/com/imprimelibros/erp/users/UserController.java b/src/main/java/com/imprimelibros/erp/users/UserController.java index 9319a7a..41dc15a 100644 --- a/src/main/java/com/imprimelibros/erp/users/UserController.java +++ b/src/main/java/com/imprimelibros/erp/users/UserController.java @@ -1,6 +1,7 @@ package com.imprimelibros.erp.users; import com.imprimelibros.erp.datatables.DataTablesResponse; +import com.imprimelibros.erp.i18n.TranslationService; import com.imprimelibros.erp.users.validation.UserForm; import jakarta.servlet.http.HttpServletRequest; @@ -22,7 +23,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import com.imprimelibros.erp.datatables.DataTablesRequest; @@ -32,7 +32,6 @@ import com.imprimelibros.erp.datatables.DataTable; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import java.util.List; import java.util.Locale; @@ -51,19 +50,35 @@ public class UserController { private MessageSource messageSource; private Sanitizer sanitizer; private PasswordEncoder passwordEncoder; + private TranslationService translationService; public UserController(UserDao repo, UserService userService, MessageSource messageSource, Sanitizer sanitizer, - PasswordEncoder passwordEncoder, RoleDao roleRepo) { + PasswordEncoder passwordEncoder, RoleDao roleRepo, TranslationService translationService) { this.repo = repo; this.messageSource = messageSource; this.sanitizer = sanitizer; this.roleRepo = roleRepo; this.passwordEncoder = passwordEncoder; + this.translationService = translationService; } @GetMapping public String list(Model model, Authentication authentication, Locale locale) { + List keys = List.of( + "usuarios.delete.title", + "usuarios.delete.text", + "usuarios.eliminar", + "usuarios.delete.button", + "app.yes", + "app.cancelar", + "usuarios.delete.ok.title", + "usuarios.delete.ok.text" + ); + + Map translations = translationService.getTranslations(locale, keys); + model.addAttribute("languageBundle", translations); + return "imprimelibros/users/users-list"; } @@ -79,7 +94,7 @@ public class UserController { // Si 'role' es relación, sácalo de aquí: List searchable = List.of("fullName", "userName", "enabled", "rolesConcat"); // <- busca por roles de // verdad - List orderable = List.of("fullName", "userName", "enabled", "roleRank"); // <- permite ordenar por estas + List orderable = List.of("id", "fullName", "userName", "enabled", "roleRank"); // <- permite ordenar por estas // columnas Specification base = (root, query, cb) -> cb.conjunction(); diff --git a/src/main/resources/i18n/users_es.properties b/src/main/resources/i18n/users_es.properties index e4eb19a..15db8e9 100644 --- a/src/main/resources/i18n/users_es.properties +++ b/src/main/resources/i18n/users_es.properties @@ -46,4 +46,9 @@ usuarios.error.delete-self=No se puede eliminar a sí mismo. usuarios.exito.creado=Usuario creado con éxito. usuarios.exito.actualizado=Usuario actualizado con éxito. -usuarios.exito.eliminado=Usuario eliminado con éxito. \ No newline at end of file +usuarios.exito.eliminado=Usuario eliminado con éxito. +usuarios.delete.title=Eliminar usuario +usuarios.delete.button=Si, ELIMINAR +usuarios.delete.text=¿Está seguro de que desea eliminar al usuario?
Esta acción no se puede deshacer. +usuarios.delete.ok.title=Usuario eliminado +usuarios.delete.ok.text=El usuario ha sido eliminado con éxito. \ No newline at end of file diff --git a/src/main/resources/static/assets/js/pages/imprimelibros/users/list.js b/src/main/resources/static/assets/js/pages/imprimelibros/users/list.js index 8c45210..3e1096c 100644 --- a/src/main/resources/static/assets/js/pages/imprimelibros/users/list.js +++ b/src/main/resources/static/assets/js/pages/imprimelibros/users/list.js @@ -84,13 +84,17 @@ $(() => { const id = $(this).data('id'); Swal.fire({ - title: '¿Eliminar usuario?', - text: 'Esta acción no se puede deshacer.', + title: window.languageBundle.get(['usuarios.delete.title']) || 'Eliminar usuario', + html: window.languageBundle.get(['usuarios.delete.text']) || 'Esta acción no se puede deshacer.', icon: 'warning', showCancelButton: true, - confirmButtonText: 'Sí, eliminar', - cancelButtonText: 'Cancelar', - reverseButtons: true + buttonsStyling: false, + customClass: { + confirmButton: 'btn btn-danger w-xs mt-2', + cancelButton: 'btn btn-light w-xs mt-2' + }, + confirmButtonText: window.languageBundle.get(['usuarios.delete.button']) || 'Eliminar', + cancelButtonText: window.languageBundle.get(['app.cancelar']) || 'Cancelar', }).then((result) => { if (!result.isConfirmed) return; @@ -98,7 +102,14 @@ $(() => { url: '/users/' + id, type: 'DELETE', success: function () { - Swal.fire({ icon: 'success', title: 'Eliminado', timer: 1200, showConfirmButton: false }); + Swal.fire({ + icon: 'success', title: window.languageBundle.get(['usuarios.delete.ok.title']) || 'Eliminado', + text: window.languageBundle.get(['usuarios.delete.ok.text']) || 'El usuario ha sido eliminado con éxito.', + showConfirmButton: true, + customClass: { + confirmButton: 'btn btn-secondary w-xs mt-2', + }, + }); $('#users-datatable').DataTable().ajax.reload(null, false); }, error: function (xhr) { diff --git a/src/main/resources/templates/imprimelibros/users/users-list.html b/src/main/resources/templates/imprimelibros/users/users-list.html index 14bc033..89f4ae1 100644 --- a/src/main/resources/templates/imprimelibros/users/users-list.html +++ b/src/main/resources/templates/imprimelibros/users/users-list.html @@ -85,6 +85,9 @@ +