Acabando con menus para el administrador y usuario, manegando fallos posible de si administrador borra a si mismo, que manda atras y dice que no puede. Cambio de formulario de crear de alumno para que los keywords tiene un campo tag que ayuda a separar las palabras cuando ponemos comas. De momento no funciona que ,os keywords aparece vacio, queda para areglar el apso de html a controlador de campo renovado

master
vicsash 4 months ago
parent 94183d4ab9
commit d4ec5ea057

@ -0,0 +1,178 @@
package com.example.proyectofinal.controllers;
import com.example.proyectofinal.models.empresas.Alumno;
import com.example.proyectofinal.models.empresas.Ciclo;
import com.example.proyectofinal.models.empresas.Skill;
import com.example.proyectofinal.models.login.Usuario;
import com.example.proyectofinal.servicios.empresa.AlumnoService;
import com.example.proyectofinal.servicios.empresa.CicloService;
import com.example.proyectofinal.servicios.empresa.SkillService;
import com.example.proyectofinal.servicios.user.UsuarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@Controller
public class AdminController {
@Autowired
private UsuarioService usuarioService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private AlumnoService alumnoService;
@Autowired
private CicloService cicloService;
@Autowired
private SkillService skillService;
@GetMapping("/admin/alta_admin_nuevo")
public String showCreateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
model.addAttribute("usuario", new Usuario()); // Add this line
return "admin/usuario/create";
}
@PostMapping("/admin/alta_admin_nuevo")
public String saveNewAdmin(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
usuario.setRol(usuarioService.getRolById(1));
if(usuarioService.getUserByLogInName(usuario.getNombreLogIn()) == null){
usuarioService.createUsuario(usuario.getNombreUsuario(), usuario.getNombreLogIn(), usuario.getEmail(), usuario.getPassword(), usuario.isLogedIn(), usuario.getRol().getId());
return "redirect:/buscador?userCreated=true";
}else {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario ya existe");
}
}
@GetMapping("/api/currentUser")
public ResponseEntity<Usuario> getCurrentUser(Authentication authentication) {
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/editar_usuario")
public String showUpdateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/update";
}
@PostMapping("/admin/update_usuario")
public String updateUser(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(usuario.getId());
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
// Check if the password field is empty
if (usuario.getPassword().isEmpty()) {
// If the password field is empty, keep the original password
usuario.setPassword(existingUser.getPassword());
} else {
// If the password field is not empty, encrypt the new password
String password = usuario.getPassword();
existingUser.setPassword(passwordEncoder.encode(password));
}
usuarioService.saveUser(usuario);
return "redirect:/buscador?userUpdated=true";
}
@GetMapping("/admin/user/{id}")
public ResponseEntity<Usuario> getUser(@PathVariable Long id) {
Usuario usuario = usuarioService.findUserById(id);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/delete_usuario")
public String showDeleteFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/delete";
}
@GetMapping("/admin/delete_usuario/{id}")
public ResponseEntity<String> deleteUser(@PathVariable Long id, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(id);
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
// Get the currently authenticated user
String username = authentication.getName();
Usuario currentUser = usuarioService.findByLogInName(username);
// Check if the user to be deleted is the currently authenticated user
// ...
if (currentUser.getId().equals(id)) {
return ResponseEntity.ok("selfDelete");
}
Usuario user = usuarioService.findUserById(id);
if(user.getRol().getId() == 2){
Alumno alumno = alumnoService.findByEmail(user.getEmail());
System.out.println("TEST DELETING ALUMNO WITH ID: " + alumno.getId()+" AND EMAIL: "+alumno.getCorreo()+" AND NAME: "+alumno.getNombre());
alumnoService.deleteById(alumno.getId());
}
usuarioService.deleteUser(id);
return ResponseEntity.ok("userDeleted");
}
}

@ -12,20 +12,26 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.server.ResponseStatusException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@Controller
public class UserController {
@Autowired
private CicloService cicloService;
@Autowired
private SkillService skillService;
@Autowired
private UsuarioService usuarioService;
@ -35,130 +41,7 @@ public class UserController {
@Autowired
private AlumnoService alumnoService;
@Autowired
private CicloService cicloService;
@Autowired
private SkillService skillService;
@GetMapping("/admin/alta_admin_nuevo")
public String showCreateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
model.addAttribute("usuario", new Usuario()); // Add this line
return "admin/usuario/create";
}
@PostMapping("/admin/alta_admin_nuevo")
public String saveNewAdmin(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
usuario.setRol(usuarioService.getRolById(1));
if(usuarioService.getUserByLogInName(usuario.getNombreLogIn()) == null){
usuarioService.createUsuario(usuario.getNombreUsuario(), usuario.getNombreLogIn(), usuario.getEmail(), usuario.getPassword(), usuario.isLogedIn(), usuario.getRol().getId());
return "redirect:/buscador?userCreated=true";
}else {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario ya existe");
}
}
@GetMapping("/api/currentUser")
public ResponseEntity<Usuario> getCurrentUser(Authentication authentication) {
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/editar_usuario")
public String showUpdateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/update";
}
@PostMapping("/admin/update_usuario")
public String updateUser(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(usuario.getId());
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
String password = existingUser.getPassword();
existingUser.setPassword(passwordEncoder.encode(password));
usuarioService.saveUser(usuario);
return "redirect:/buscador?userUpdated=true";
}
@GetMapping("/admin/user/{id}")
public ResponseEntity<Usuario> getUser(@PathVariable Long id) {
Usuario usuario = usuarioService.findUserById(id);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/delete_usuario")
public String showDeleteFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/delete";
}
@GetMapping("/admin/delete_usuario/{id}")
public String deleteUser(@PathVariable Long id, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(id);
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
Usuario user = usuarioService.findUserById(id);
if(user.getRol().getId() == 2){
Alumno alumno = alumnoService.findByEmail(user.getEmail());
System.out.println("TEST DELETING ALUMNO WITH ID: " + alumno.getId()+" AND EMAIL: "+alumno.getCorreo()+" AND NAME: "+alumno.getNombre());
alumnoService.deleteById(alumno.getId());
}
usuarioService.deleteUser(id);
return "redirect:/buscador?userDeleted=true";
}
@GetMapping("/usuario/usuario_update_form")
@GetMapping("/usuario/alu_update_form")
public String showUpdateForm(Model model, Authentication authentication) {
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
@ -172,13 +55,14 @@ public class UserController {
}
@PostMapping("/usuario/update")
@PostMapping("/usuario/alu_update")
public ResponseEntity<String> updateAlumno(Alumno alumno, @RequestParam("ciclo") Long ciclo, @RequestParam("skills") List<Long> skills){
try{
Ciclo cicloEntity = cicloService.findById(ciclo);
Set<Skill> skillEntities = skillService.findAllByIds(skills);
alumno.setCiclo(cicloEntity);
alumno.setSkills(skillEntities);
//System.out.println("TEST UPDATE ALUMNO: "+alumno.getNombre());
alumnoService.save(alumno);
return new ResponseEntity<>("El alumno fue actualizado con exito", HttpStatus.OK);
}catch (Exception e) {
@ -186,6 +70,53 @@ public class UserController {
}
}
@GetMapping("/usuario/usuario_norm_update_form")
public String showUsuarioNormUpdateForm(Model model, Authentication authentication){
String username = authentication.getName();
Usuario users = usuarioService.getUserByLogInName(username);
model.addAttribute("usuario", users);
return "user/update_usuario";
}
@PostMapping("/usuario/update_usuario_normal")
public String updateUserNormal(@ModelAttribute Usuario usuario, Authentication authentication) {
Usuario existingUser = usuarioService.findUserById(usuario.getId());
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
// Check if the password field is empty
if (usuario.getPassword().isEmpty()) {
// If the password field is empty, keep the original password
usuario.setPassword(existingUser.getPassword());
} else {
// If the password field is not empty, encrypt the new password
String password = usuario.getPassword();
existingUser.setPassword(passwordEncoder.encode(password));
}
usuario.setRol(usuarioService.getRolById(2));
//System.out.println("TEST UPDATE USUARIO: "+usuario.getNombreUsuario());
usuarioService.saveUser(usuario);
return "redirect:/buscador?userUpdated=true";
}
@GetMapping("/usuario/info")
public String showUserInfo(Model model, Authentication authentication) {
// Get the current user
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
if(usuario.getRol().getId() ==1){
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Alumno alumno = alumnoService.findByEmail(usuario.getEmail());
model.addAttribute("usuario", usuario);
model.addAttribute("alumno", alumno);
// Return the name of the view
return "user/info_user";
}
}

@ -57,12 +57,13 @@ public class AlumnoController {
@PostMapping("/alumno/save")
public ResponseEntity<String> saveAlumno(Alumno alumno, @RequestParam("ciclo") Long ciclo, @RequestParam("skills") List<Long> skills){
public ResponseEntity<String> saveAlumno(Alumno alumno, @RequestParam("ciclo") Long ciclo, @RequestParam("skills") List<Long> skills, @RequestParam("joinedKeywords") String keywords){
try{
Ciclo cicloEntity = cicloService.findById(ciclo);
Set<Skill> skillEntities = skillService.findAllByIds(skills);
alumno.setCiclo(cicloEntity);
alumno.setSkills(skillEntities);
alumno.setKeywords(keywords); // Set the keywords from the joinedKeywords string
Alumno testIfExist = alumnoService.exists(alumno);
if(testIfExist != null){
return new ResponseEntity<>("El alumno ya existe", HttpStatus.BAD_REQUEST);

@ -10,6 +10,8 @@
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/@yaireo/tagify/dist/tagify.css">
<script src="https://unpkg.com/@yaireo/tagify"></script>
<style>
form {
display: flex;
@ -133,7 +135,7 @@
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="keywords">Keywords</label>
<div class="col-sm-9">
<input type="text" th:field="*{keywords}" class="form-control" id="keywords" title="Introduce keywords">
<input name="tags" id="keywords" placeholder="Introduce keywords">
</div>
</div>
@ -153,6 +155,7 @@
<option th:each="skill : ${skills}" th:value="${skill.id}" th:text="${skill.nombre}"></option>
</select>
</div>
<input type="hidden" id="joinedKeywords" name="joinedKeywords">
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
@ -161,6 +164,8 @@
</div>
</form>
<script>
var input = document.querySelector('input[name=tags]');
new Tagify(input);
$(document).ready(function() {
$('#skills').select2();
});
@ -168,13 +173,21 @@
function goBack() {
window.history.back();
}
$(document).ready(function () {
$(document).ready(function() {
$('#skills').select2();
var tagifyInput = document.querySelector('input[name=tags]');
var tagify = new Tagify(tagifyInput); // Create a new instance of Tagify
$("form").on("submit", function (event) {
event.preventDefault();
var formDataArray = $(this).serializeArray();
var tags = tagify.value.map(function(tagData) { return tagData.value; }); // Use the tagify instance to get the tags
formDataArray.push({name: 'ciclo', value: $('#ciclo').val()});
formDataArray.push({name: 'skills', value: $('#skills').val()});
var joinedKeywords = tags.join(',');
$('#joinedKeywords').val(joinedKeywords);
$.ajax({
url: '/alumno/save',
@ -199,7 +212,6 @@
});
});
});
</script>
</body>
</html>

@ -78,8 +78,12 @@
$.ajax({
url: '/admin/delete_usuario/' + userId,
type: 'get',
success: function() {
success: function(response) {
if (response === 'selfDelete') {
window.location.href = "/buscador?error=selfDelete";
} else if (response === 'userDeleted') {
window.location.href = "/buscador?userDeleted=true";
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error(textStatus, errorThrown);

@ -26,14 +26,11 @@
margin-right: 5px;
width: 120px;
height: 40px;
font-family: Verdana;
font-family: Verdana, Geneva, Tahoma, sans-serif
}
form input[type="submit"], form input[type="button"] {
width: 100px;
}
form input[type="text"]{
width: 75%;
}
form label{
font-size: 20px;
margin-bottom: 10px;
@ -46,6 +43,11 @@
width: 100%;
box-sizing: border-box;
}
input[type="text"], input[type="password"], input[type="email"] {
width: 350px;
height: 25px;
font-size: 15px;
}
</style>
</head>
@ -87,17 +89,29 @@
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="password">Password:</label>
<div class="col-sm-9">
<input type="password" th:field="*{password}" id="password" required class="form-control">
<input type="password" th:field="*{password}" id="password" class="form-control" value="" placeholder="Complete esto solo si desea cambiar la contraseña.">
</div>
</div>
<div class="form-group row">
<div class="col-sm-9 offset-sm-3">
<input type="submit" value="Actualizar Usuario" class="btn btn-primary">
<label class="col-sm-3 col-form-label" for="confirmPassword">Confirm Password:</label>
<div class="col-sm-9">
<input type="password" id="confirmPassword" required class="form-control" value="" placeholder=" Confirmar contraseña" disabled>
</div>
</div>
<input type="hidden" th:field="*{rol}" id="rol">
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
</div>
</form>
<script>
function goBack() {
window.location.href = "/buscador";
}
$(document).ready(function() {
$('#userSelect').trigger('change');
});
@ -117,12 +131,25 @@
$('#nombreLogIn').val(user.nombreLogIn);
$('#email').val(user.email);
$('#password').val(user.password);
$('#rol').val(user.rol.id);
},
error: function(jqXHR, textStatus, errorThrown) {
console.error(textStatus, errorThrown);
}
});
});
$(document).ready(function() {
$('#password, #confirmPassword').on('input', function() {
var password = $('#password').val();
var confirmPassword = $('#confirmPassword').val();
if (password && confirmPassword && password !== confirmPassword) {
$('#confirmPassword').prop('disabled', false);
} else {
$('#confirmPassword').prop('disabled', true);
}
});
});
</script>
</body>
</html>

@ -93,7 +93,7 @@
<div class="modal-content">
<span class="close">&times;</span>
<p onclick="createUser()">Dar alta a nuevo usuario</p>
<p onclick="editUser()">Editar este usuario</p>
<p onclick="editUser()">Editar usuario</p>
<p onclick="deleteUser()">Borrar usuario</p>
</div>
</div>
@ -202,6 +202,15 @@
}
});
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const error = urlParams.get('error');
if (error === 'selfDelete') {
alert('No puedes eliminarte a ti mismo');
}
});
function deleteUser() {
isValidUserId().then(isValid => {
if (isValid) {

@ -72,29 +72,6 @@
#user p {
font-size: 10px; /* Adjust as needed */
}
#info{
position: relative;
margin-left: 50px;
padding: 0px;
background-color: #dddddd;
width: 50px; /* Adjust as needed */
height: 50px; /* Adjust as needed */
display: flex;
flex-direction: column; /* New property */
align-items: center; /* Vertically center the contents */
justify-content: center; /* Horizontally center the contents */
text-align: center; /* Center the text */
}
#info-icon {
width: 22px; /* Adjust as needed */
height: 22px; /* Adjust as needed */
}
#info p {
font-size: 10px; /* Adjust as needed */
}
.modal-content p{
background-color: antiquewhite;
@ -108,10 +85,6 @@
<i class="fas fa-user" id="user-icon"></i>
<p>Usuario</p>
</div>
<div id="info">
<i class="fas fa-info-circle" id="info-icon"></i>
<p>Información</p>
</div>
<h1>PAGINA PRINCIPAL</h1>
<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a>
@ -120,16 +93,9 @@
<div id="userModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<p onclick="editUser()">Editar este usuario</p>
</div>
</div>
<div id="infoModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<p id="userInfo"></p>
<hr id="divider"> <!-- Divider -->
<p id="alumnoInfo"></p>
<p onClick="infoUser()"> Informacio de usuario</p>
<p onclick="editUser()">Editar datos de usuario</p>
<p onclick="editAlu()">Editar datos de Alumno</p>
</div>
</div>
@ -162,65 +128,25 @@
</div>
<script>
//MODAL
// Get the modal
var modal = document.getElementById("userModal");
// Get the button that opens the modal
var btn = document.getElementById("user");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks the button, open the modal
btn.onclick = function() {
modal.style.display = "block";
}
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
modal.style.display = "none";
}
function setupModal(modalId, triggerId, closeClass) {
var modal = document.getElementById(modalId);
var trigger = document.getElementById(triggerId);
var closeBtn = modal.getElementsByClassName(closeClass)[0];
// Get the modals
var userModal = document.getElementById("userModal");
var infoModal = document.getElementById("infoModal");
// Get the buttons that open the modals
var userBtn = document.getElementById("user");
var infoBtn = document.getElementById("info-icon");
// Get the <span> elements that close the modals
var userSpan = userModal.getElementsByClassName("close")[0];
var infoSpan = infoModal.getElementsByClassName("close")[0];
// When the user clicks the buttons, open the modals
userBtn.onclick = function() {
userModal.style.display = "block";
}
infoBtn.onclick = function() {
infoModal.style.display = "block";
trigger.onclick = function() {
modal.style.display = "block";
}
// When the user clicks on <span> (x), close the modals
userSpan.onclick = function() {
userModal.style.display = "none";
}
infoSpan.onclick = function() {
infoModal.style.display = "none";
closeBtn.onclick = function() {
modal.style.display = "none";
}
// When the user clicks anywhere outside of the modals, close them
window.onclick = function(event) {
if (event.target === userModal) {
userModal.style.display = "none";
}
if (event.target === infoModal) {
infoModal.style.display = "none";
}
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target === modal) {
modal.style.display = "none";
}
}
}
function isValidUserId() {
// Return the fetch Promise
@ -238,68 +164,51 @@
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
window.location.href = "/usuario/usuario_update_form"
window.location.href = "/usuario/usuario_norm_update_form"
});
} else {
alert("Id invalido");
}
});
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userUpdated = urlParams.get('userUpdated');
if (userUpdated === 'true') {
alert('Usuario actualizado correctamente');
function editAlu() {
isValidUserId().then(isValid => {
if (isValid) {
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
window.location.href = "/usuario/alu_update_form"
});
} else {
alert("Id invalido");
}
});
}
// Get the info icon and the info modal
var infoIcon = document.getElementById("info-icon");
var infoModal = document.getElementById("infoModal");
// When the user clicks the info icon, open the info modal
infoIcon.onclick = function() {
// Fetch the user's information from the server
function infoUser() {
isValidUserId().then(isValid => {
if (isValid) {
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
// Populate the modal with the user's information
document.getElementById("userInfo").textContent =
"Nombre: " + user.nombre + "\n" +
"Apellido: " + user.apellido + "\n" +
"Correo: " + user.correo;
// Fetch the Alumno information from the server
fetch('/api/alumnoByEmail/' + user.correo)
.then(response => response.json())
.then(alumno => {
// Populate the modal with the Alumno's information
document.getElementById("alumnoInfo").textContent =
"Nombre: " + alumno.nombre + "\n" +
"Apellido: " + alumno.apellido + "\n" +
"Correo: " + alumno.correo;
window.location.href = "/usuario/info"
});
// Display the modal
infoModal.style.display = "block";
} else {
alert("Id invalido");
}
});
}
// When the user clicks on <span> (x), close the modal
document.getElementsByClassName("close")[0].onclick = function() {
infoModal.style.display = "none";
}
setupModal("userModal", "user", "close");
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target === infoModal) {
infoModal.style.display = "none";
}
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userUpdated = urlParams.get('userUpdated');
if (userUpdated === 'true') {
alert('Usuario actualizado correctamente');
}
});
// Get reference to the date picker
var datePicker = document.getElementById('datePicker');

@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Informacion usuario</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<style>
.logout-button {
position: fixed;
top: 0px;
right: 0px;
background-color: red;
color: white;
border: none;
text-decoration: none;
font-size: 20px;
padding: 0px;
margin: 0px;
border-radius: 0;
display: flex;
justify-content: center;
align-items: center;
width: 40px;
height: 40px;
}
h1 {
text-align: center;
text-decoration: underline;
background-color: #007BFF;
font-family: Verdana, Geneva, Tahoma, sans-serif;
font-size: 50px;
color: white;
margin-top: 0;
margin-left: 0;
margin-right: 0;
padding-top: 0;
padding-left: 0;
padding-right: 0;
width: 100%;
position: fixed;
top: 0;
}
.card {
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
transition: 0.3s;
width: 40%;
margin: auto;
margin-top: 2rem; /* Add this line to create space at the top */
margin-bottom: 2rem;
padding: 2rem;
border-radius: 5px;
background-color: #fff;
}
form {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
max-width: none;
margin: auto;
padding: 25px;
margin-top: 100px;
}
.scrollable-list {
height: 50px; /* Adjust as needed */
overflow-y: auto;
}
body {
margin: 0;
padding: 0;
}
.edit-buttons {
display: flex;
justify-content: center;
margin-top: 20px;
}
</style>
</head>
<body>
<h1>
<i class="fas fa-arrow-left" onclick="arrowBack()" style="cursor:pointer;"></i>
INFORMACION
<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a>
</h1>
<div class="card">
<h2>Usuario</h2>
<h5 class="card-title">Nombre Usuario:</h5>
<p class="card-text"><span th:text="${usuario.nombreUsuario}"></span></p>
<h5 class="card-title">Nombre LogIn:</h5>
<p class="card-text"><span th:text="${usuario.nombreLogIn}"></span></p>
<h5 class="card-title">Email:</h5>
<p class="card-text"><span th:text="${usuario.email}"></span></p>
<div class="edit-buttons">
<button type="button" onclick="location.href='/usuario/usuario_norm_update_form'">Edit Usuario</button>
</div>
</div>
<div class="card">
<h2>Alumno Information</h2>
<h5 class="card-title">Nombre:</h5>
<p class="card-text"><span th:text="${alumno.nombre}"></span></p>
<h5 class="card-title">Apellido:</h5>
<p class="card-text"><span th:text="${alumno.apellido}"></span></p>
<h5 class="card-title">Apellido2:</h5>
<p class="card-text"><span th:text="${alumno.apellido2}"></span></p>
<h5 class="card-title">Fecha Nacimiento:</h5>
<p class="card-text"><span th:text="${alumno.fechaNacimiento}"></span></p>
<h5 class="card-title">Genero:</h5>
<p class="card-text"><span th:text="${alumno.genero}"></span></p>
<h5 class="card-title">NIA:</h5>
<p class="card-text"><span th:text="${alumno.nia}"></span></p>
<h5 class="card-title">DNI:</h5>
<p class="card-text"><span th:text="${alumno.dni}"></span></p>
<h5 class="card-title">Correo:</h5>
<p class="card-text"><span th:text="${alumno.correo}"></span></p>
<h5 class="card-title">Correo2:</h5>
<p class="card-text"><span th:text="${alumno.correo2}"></span></p>
<h5 class="card-title">Nacionalidad:</h5>
<p class="card-text"><span th:text="${alumno.nacionalidad}"></span></p>
<h5 class="card-title">Keywords:</h5>
<p class="card-text"><span th:text="${alumno.keywords}"></span></p>
<h5 class="card-title">Ciclo:</h5>
<p class="card-text"><span th:text="${alumno.ciclo.nombre}"></span></p>
<h5 class="card-title">Skills:</h5>
<div class="scrollable-list">
<ul class="list-group">
<li class="list-group-item" th:each="skill : ${alumno.skills}" th:text="${skill.nombre}"></li>
</ul>
</div>
<div class="edit-buttons">
<button type="button" onclick="location.href='/usuario/alu_update_form'">Edit Alumno</button>
</div>
</div>
<script>
function arrowBack() {
window.history.back();
}
</script>
</body>
</html>

@ -28,14 +28,11 @@
margin-right: 5px;
width: 120px;
height: 40px;
font-family: Verdana;
font-family: Verdana, Geneva, Tahoma, sans-serif
}
form input[type="submit"], form input[type="button"] {
width: 100px;
}
form input[type="text"]{
width: 75%;
}
form label{
font-size: 20px;
margin-bottom: 10px;
@ -48,12 +45,17 @@
width: 100%;
box-sizing: border-box;
}
input[type="text"], input[type="password"], input[type="email"] {
width: 350px;
height: 25px;
font-size: 15px;
}
</style>
</head>
<body>
<h1>Editar datos de Alumno<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<form th:action="@{/alumno/update}" method="post" enctype="multipart/form-data" th:object="${alumno}">
<form th:action="@{/usuario/alu_update}" method="post" enctype="multipart/form-data" th:object="${alumno}">
<input type="hidden" th:field="*{id}"/>
<div class="p-3">
<div class ="form-group row">
@ -167,7 +169,7 @@
});
function goBack() {
window.history.back();
window.location.href = "/buscador";
}
$(document).ready(function () {
$("form").on("submit", function (event) {

@ -0,0 +1,117 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Editar Usuario</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<style>
form {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
max-width: none;
margin: auto;
padding: 25px;
margin-top: 100px;
}
.btn {
margin-top: 25px;
margin-right: 5px;
width: 120px;
height: 40px;
font-family: Verdana, Geneva, Tahoma, sans-serif
}
form input[type="submit"], form input[type="button"] {
width: 100px;
}
form label{
font-size: 20px;
margin-bottom: 10px;
font-family: Verdana, Geneva, Tahoma, sans-serif;
}
body, h1 {
margin: 0;
padding: 0;
width: 100%;
box-sizing: border-box;
}
input[type="text"], input[type="password"], input[type="email"] {
width: 350px;
height: 25px;
font-size: 15px;
}
</style>
</head>
<body>
<h1>Editar Usuario</h1>
<form th:action="@{/usuario/update_usuario_normal}" th:object="${usuario}" method="post">
<input type="hidden" th:field="*{id}" id="userId">
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreUsuario}" id="nombreUsuario" required class="form-control">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreLogIn">Login Name:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreLogIn}" id="nombreLogIn" required class="form-control">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="email">Email:</label>
<div class="col-sm-9">
<input type="email" th:field="*{email}" id="email" required class="form-control">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="password">Password:</label>
<div class="col-sm-9">
<input type="password" th:field="*{password}" id="password" class="form-control" value="" placeholder="Complete esto solo si desea cambiar la contraseña.">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="confirmPassword">Confirm Password:</label>
<div class="col-sm-9">
<input type="password" id="confirmPassword" required class="form-control" value="" placeholder=" Confirmar contraseña" disabled>
</div>
</div>
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
</div>
</form>
<script>
function goBack() {
window.location.href = "/buscador";
}
$(document).ready(function() {
$('#password, #confirmPassword').on('input', function() {
var password = $('#password').val();
var confirmPassword = $('#confirmPassword').val();
if (password && confirmPassword && password !== confirmPassword) {
$('#confirmPassword').prop('disabled', false);
} else {
$('#confirmPassword').prop('disabled', true);
}
});
});
</script>
</body>
</html>
Loading…
Cancel
Save

Powered by INFORMATICA.FP.EDU.ES.