Skip to content
Snippets Groups Projects
Commit 4eca093b authored by Paul Cancel's avatar Paul Cancel
Browse files

Fin de l implementation

parent f644317a
No related branches found
No related tags found
No related merge requests found
Showing
with 357 additions and 54 deletions
MCD.JPG 0 → 100644
MCD.JPG

28.9 KiB

......@@ -6,11 +6,11 @@ import java.util.Arrays;
public class Config {
public static final int MAX_GENERATIONS = 1;
public static final ArrayList<String> WEEK_DAYS = new ArrayList<>(Arrays.asList("MONDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"));
public static final int SLOT_DURATION = 11;
public static final ArrayList<String> WEEK_DAYS = new ArrayList<>(Arrays.asList("WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"));
public static final int SLOT_DURATION = 60;
public static final double DAY_START = 8;
public static final double DAY_END = 17;
public static final int MAX_PEOPLE = 3000;
public static final int MAX_PEOPLE = 30;
public static ArrayList<Time> createTimeSlots() {
ArrayList<Time> timeSlots = new ArrayList<>();
......
......@@ -58,10 +58,6 @@ public class AdminController {
@RequestMapping(value = "admin/dashboard", method = RequestMethod.GET)
private String adminDashboard(@AuthenticationPrincipal UserDetails details, Model model) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
model.addAttribute("currentUser", user);
......@@ -73,12 +69,9 @@ public class AdminController {
@RequestParam(defaultValue = "1") int page,
@RequestParam(required = false) String search,
Model model) {
if (details == null || !details.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
return "redirect:/public/login";
}
int pageSize = 10;
int pageSize = 5;
List<User> allUsers = search != null && !search.trim().isEmpty()
? ur.findByNameContainingOrSurnameContainingOrUsernameContaining(search, search, search)
: ur.findAll();
......@@ -105,17 +98,20 @@ public class AdminController {
private String requestsList(@AuthenticationPrincipal UserDetails details,
@RequestParam(defaultValue = "1") int page,
@RequestParam(required = false) String search,
@RequestParam(required = false) Boolean filter,
Model model) {
if (details == null || !details.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
return "redirect:/public/login";
}
int pageSize = 10;
int pageSize = 5;
List<Request> allRequests = search != null && !search.trim().isEmpty()
? rr.findByReasonContainingOrDescriptionContaining(search, search)
: rr.findAll();
if (filter != null && filter) {
allRequests = allRequests.stream()
.filter(req -> !rs.hasMeeting(req))
.collect(Collectors.toList());
}
int start = (page - 1) * pageSize;
int end = Math.min(start + pageSize, allRequests.size());
List<Request> requests = allRequests.subList(start, end);
......@@ -128,29 +124,40 @@ public class AdminController {
model.addAttribute("currentPage", page);
model.addAttribute("totalPages", (int) Math.ceil(allRequests.size() / (double) pageSize));
model.addAttribute("currentUser", ur.findByUsername(details.getUsername()).get());
model.addAttribute("filter", filter);
return "admin/requests";
}
@RequestMapping(value = "admin/requests/validate/{rno}", method = RequestMethod.POST)
private String validateRequest(@PathVariable int rno, @AuthenticationPrincipal UserDetails details) {
if (details == null || !details.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
return "redirect:/public/login";
}
private String validateRequest(@PathVariable int rno, @AuthenticationPrincipal UserDetails details,
@RequestParam(defaultValue = "1") int page,
@RequestParam(required = false) String search,
@RequestParam(required = false) Boolean filter) {
Optional<Request> requestOpt = rr.findById(rno);
if (requestOpt.isPresent()) {
Request request = requestOpt.get();
User user = request.getUser();
Meeting meeting = new Meeting();
meeting.setRequest(request);
meeting.setUser(request.getUser());
meeting.setUser(user);
if(user.getUsername().endsWith("@univ-lille.fr")) {
us.sendValidationMeeting(user, meeting);
}
mr.save(meeting);
}
return "redirect:/admin/requests";
String redirectUrl = String.format("redirect:/admin/requests?page=%d", page);
if (search != null) {
redirectUrl += "&search=" + search;
}
if (filter != null) {
redirectUrl += "&filter=" + filter;
}
return redirectUrl;
}
@RequestMapping(value = "admin/meetings", method = RequestMethod.GET)
......@@ -163,7 +170,7 @@ public class AdminController {
return "redirect:/public/login";
}
int pageSize = 10;
int pageSize = 5;
List<Meeting> allMeetings = search != null && !search.trim().isEmpty()
? mr.findByRequestReasonContainingOrRequestDescriptionContaining(search, search)
: mr.findAll();
......
......@@ -5,11 +5,15 @@ import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import fr.but.infoetu.meetingplannr.pojo.User;
import fr.but.infoetu.meetingplannr.repository.UserRepository;
......@@ -17,6 +21,7 @@ import fr.but.infoetu.meetingplannr.service.UserService;
import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import java.time.LocalDateTime;
import java.util.Optional;
@Controller
......@@ -28,6 +33,12 @@ public class PublicController {
@Autowired
private UserService userService;
@Autowired
private JavaMailSender mailSender;
@Autowired
private PasswordEncoder passwordEncoder;
@RequestMapping(value = "public/login", method = RequestMethod.GET)
public String loginForm() {
if (isAuthenticated()) {
......@@ -66,6 +77,60 @@ public class PublicController {
return "redirect:/user/listeAction";
}
@RequestMapping(value = "public/password_change", method = RequestMethod.GET)
public String passwordChangeForm() {
return "public/passwordChange";
}
@RequestMapping(value = "public/perform_password_change", method = RequestMethod.POST)
public String performPasswordChange(@RequestParam("email") String email, @RequestParam("newPassword") String newPassword, Model model) {
Optional<User> userOpt = ur.findByUsername(email);
if (!userOpt.isPresent()) {
model.addAttribute("errorMessage", "Email not found.");
return "public/passwordChange";
}
User user = userOpt.get();
if(!user.getUsername().endsWith("@univ-lille.fr")) {
model.addAttribute("errorMessage", "Le mot de passe ne peut pas être modifié car l'adresse email n'appartient pas à l'université de Lille");
return "public/login";
}
userService.sendPasswordVerificationEmail(user, newPassword);
model.addAttribute("successMessage", "Un email de vérification a été envoyé à " + email + ".");
return "public/passwordChange";
}
@RequestMapping(value = "public/verify_password_change", method = RequestMethod.GET)
public String verifyPasswordChange(@RequestParam("token") String token, @RequestParam("password") String password, Model model) {
Optional<User> userOpt = ur.findByVerificationToken(token);
if (!userOpt.isPresent()) {
model.addAttribute("errorMessage", "Token invalide ou expiré.");
return "public/passwordChange";
}
User user = userOpt.get();
if (user.getTokenExpiration().isBefore(LocalDateTime.now())) {
model.addAttribute("errorMessage", "Le token a expiré.");
return "public/passwordChange";
}
System.out.println("Password: " + password);
user.setPassword(passwordEncoder.encode(password));
user.setVerificationToken(null);
user.setTokenExpiration(null);
ur.save(user);
return "redirect:/public/login";
}
private boolean isAuthenticated() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication != null &&
......
......@@ -3,7 +3,9 @@ package fr.but.infoetu.meetingplannr.controller;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
......@@ -214,12 +216,40 @@ public class UserController {
}
@RequestMapping(value = "user/calendar", method = RequestMethod.GET)
private String calendar(@AuthenticationPrincipal UserDetails details, Model model) {
private String calendar(@AuthenticationPrincipal UserDetails details, Model model, HttpServletRequest request) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
model.addAttribute("currentUser", user);
String monthParam = request.getParameter("month");
String yearParam = request.getParameter("year");
LocalDate today = LocalDate.now();
LocalDate currentDate;
if (monthParam != null && yearParam != null) {
currentDate = LocalDate.of(Integer.parseInt(yearParam), Integer.parseInt(monthParam), 1);
} else {
currentDate = LocalDate.now().withDayOfMonth(1);
}
LocalDate date = currentDate;
int month = date.getMonthValue();
Map<LocalDate, List<Meeting>> meetingsByDate = new HashMap<>();
while (date.getMonthValue() == month) {
List<Meeting> meetingsForDay = mr.findByRequestDate(date);
meetingsByDate.put(date, meetingsForDay);
date = date.plusDays(1);
}
model.addAttribute("meetingsByDate", meetingsByDate);
model.addAttribute("currentDate", currentDate);
model.addAttribute("previousMonth", currentDate.minusMonths(1));
model.addAttribute("nextMonth", currentDate.plusMonths(1));
model.addAttribute("today", today);
return "user/calendar";
}
......
package fr.but.infoetu.meetingplannr.pojo;
import java.time.LocalDate;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
......@@ -36,6 +37,8 @@ import java.util.Collections;
@Table(name = "users")
public class User implements UserDetails {
private static final String REQUIRED = "est obligatoire";
private String verificationToken;
private LocalDateTime tokenExpiration;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "users_uno_seq")
......
......@@ -13,4 +13,6 @@ public interface UserRepository extends JpaRepository<User, Integer>{
List<User> findByNameContainingOrSurnameContainingOrUsernameContaining(String search, String search2,
String search3);
Optional<User> findByVerificationToken(String token);
}
......@@ -20,7 +20,6 @@ public class RequestService {
}
public boolean hasMeeting(Request request){
System.err.println(mr.existsByRequest(request));
return mr.existsByRequest(request);
}
}
package fr.but.infoetu.meetingplannr.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.UUID;
import fr.but.infoetu.meetingplannr.pojo.Meeting;
import fr.but.infoetu.meetingplannr.pojo.User;
import fr.but.infoetu.meetingplannr.repository.UserRepository;
import jakarta.mail.internet.MimeMessage;
@Service
public class UserService {
......@@ -18,6 +23,8 @@ public class UserService {
private PasswordEncoder passwordEncoder;
@Autowired
private UserRepository userRepository;
@Autowired
JavaMailSender sender;
private final String UPLOAD_DIR = "src/main/resources/static/uploads/";
......@@ -30,6 +37,25 @@ public class UserService {
public void banUser(Integer uno) {
User user = userRepository.findById(uno)
.orElseThrow(() -> new RuntimeException("Utilisateur non trouvé"));
if (user.getUsername().endsWith("@univ-lille.fr")) {
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
try {
helper.setFrom("paul.cancel.etu@univ-lille.fr");
helper.setTo(user.getUsername());
helper.setSubject("Compte banni");
helper.setText("Votre compte : " + user.getUsername() + " a été banni le " + java.time.LocalDate.now());
sender.send(message);
} catch (jakarta.mail.MessagingException e) {
throw new RuntimeException("Erreur lors de l'envoi de l'email", e);
}
}
if ("ROLE_ADMIN".equals(user.getAuthority())) {
throw new RuntimeException("Impossible de bannir un administrateur");
}
user.setEnabled(false);
userRepository.save(user);
}
......@@ -43,4 +69,51 @@ public class UserService {
return fileName;
}
public void sendPasswordVerificationEmail(User user, String newPassword) {
String token = UUID.randomUUID().toString();
user.setVerificationToken(token);
user.setTokenExpiration(LocalDateTime.now().plusHours(1));
userRepository.save(user);
String verificationUrl = "http://localhost:8080/meetingplannr/public/verify_password_change?token=" + token + "&password=" + newPassword;
String emailContent = "Bonjour,\n\nCliquez sur le lien suivant pour confirmer votre changement de mot de passe :\n"
+ verificationUrl;
MimeMessage message = sender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom("paul.cancel.etu@univ-lille.fr");
helper.setTo(user.getUsername());
helper.setSubject("Vérification du changement de mot de passe");
helper.setText(emailContent);
sender.send(message);
} catch (jakarta.mail.MessagingException e) {
throw new RuntimeException("Erreur lors de l'envoi de l'email", e);
}
}
public void sendValidationMeeting(User user, Meeting meeting){
String emailContent = "Bonjour " + user.getName() + " ,\n\nVotre demande de rendez-vous a été validée.\n\n"
+ "Date : " + meeting.getRequest().getDate() + "\n"
+ "Heure : " + meeting.getRequest().getTime() + "\n"
+ "Nombre de personnes : " + meeting.getRequest().getNumberOfPeople() + "\n"
+ "Raison : " + meeting.getRequest().getReason() + "\n"
+ "Description : " + meeting.getRequest().getDescription() + "\n\n"
+ "Cordialement,\n\n"
+ "L'équipe MeetingPlannr";
MimeMessage message = sender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom("paul.cancel.etu@univ-lille.fr");
helper.setTo(user.getUsername());
helper.setSubject("Rendez-vous validé");
helper.setText(emailContent);
sender.send(message);
} catch (jakarta.mail.MessagingException e) {
throw new RuntimeException("Erreur lors de l'envoi de l'email", e);
}
}
}
......@@ -26,8 +26,12 @@ logging.level.org.springframework.jdbc=TRACE
spring.security.filter.order=10
server.servlet.session.timeout=30m
logging.level.org.springframework.mail=DEBUG
spring.mail.host=smtp.univ-lille.fr
spring.mail.port=587
spring.mail.username=paul.cancel.etu
spring.mail.password=meetingplannr
spring.mail.username=paul.cancel.etu@univ-lille.fr
# mettre : export MAIL_PASSWORD="password" pour linux ou $env:MAIL_PASSWORD="password"
spring.mail.password=${MAIL_PASSWORD}
spring.mail.properties.mail.smtp.starttls.enable=true
\ No newline at end of file
......@@ -2,7 +2,7 @@ DROP SEQUENCE IF EXISTS users_uno_seq;
CREATE SEQUENCE users_uno_seq START WITH 1;
-- password: password123
INSERT INTO users (uno, username, name, surname, phone_number, birthdate, password, authority, enabled) VALUES (nextval('users_uno_seq'), 'john.doe@example.com', 'John', 'Doe', '0612345678', '1990-05-15', '$2a$12$o0C1lgpgzoxPrE64DHda6O0DEDqQznVxqXb5y6gzWne3BP4nZMWrC', 'ROLE_USER', true);
INSERT INTO users (uno, username, name, surname, phone_number, birthdate, password, authority, enabled) VALUES (nextval('users_uno_seq'), 'paul.cancel.etu@univ-lille.fr', 'John', 'Doe', '0612345678', '1990-05-15', '$2a$12$o0C1lgpgzoxPrE64DHda6O0DEDqQznVxqXb5y6gzWne3BP4nZMWrC', 'ROLE_USER', true);
-- password: securepwd
INSERT INTO users (uno, username, name, surname, phone_number, birthdate, password, authority, enabled) VALUES (nextval('users_uno_seq'), 'jane.smith@example.com', 'Jane', 'Smith', '0698765432', '1985-08-22', '$2a$12$9DmwZZv31epkRx6kUOCeueYRCrlAUyV1J0iB6eienUWRKT3ozpLGu', 'ROLE_USER', true);
......@@ -22,15 +22,51 @@ INSERT INTO users (uno, username, name, surname, phone_number, birthdate, passwo
-- password: noemiegoat
INSERT INTO users (uno, username, name, surname, phone_number, birthdate, password, authority, enabled) VALUES (nextval('users_uno_seq'), 'theo.vienne@net.fr', 'Theo', 'Vienne', '0619515793', '2000-08-31', '$2a$12$XWqr1MGt9oSxRm2YfEMQle4QWq9r9QcpSXDcOgsEzEQTqtLRdBgcC', 'ROLE_ADMIN', true);
-- Modifications des INSERT de requests pour inclure l'heure
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Rendez-vous pour discussion projet', 'Discussion des objectifs du projet', 6, '09:00', '2024-01-15', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Point d''avancement mensuel', 'Revue mensuelle des progrès', 6, '14:30', '2024-02-20', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de planification', 'Planification des prochaines étapes', 6, '10:00', '2024-03-10', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Bilan trimestriel', 'Evaluation des résultats du trimestre', 6, '15:00', '2024-04-05', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Session de développement', 'Session de codage en équipe', 6, '11:30', '2024-05-18', 2);
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Rendez-vous pour discussion projet'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Point d''avancement mensuel'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Réunion de planification'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Bilan trimestriel'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Session de développement'));
\ No newline at end of file
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Rendez-vous pour discussion projet', 'Discussion des objectifs du projet', 6, '09:00', '2025-01-25', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Point d''avancement mensuel', 'Revue mensuelle des progrès', 6, '14:00', '2025-01-24', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de planification', 'Planification des prochaines étapes', 6, '10:00', '2025-01-25', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Bilan trimestriel', 'Evaluation des résultats du trimestre', 6, '15:00', '2025-01-29', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Session de développement', 'Session de codage en équipe', 6, '11:00', '2025-01-24', 2);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de brainstorming', 'Session de brainstorming pour nouvelles idées', 3, '09:00', '2025-01-25', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Atelier de formation', 'Formation sur les nouvelles technologies', 4, '16:00', '2025-01-25', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de coordination', 'Coordination des équipes de projet', 2, '11:00', '2025-01-25', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Déjeuner d équipe', 'Déjeuner pour renforcer l esprit d équipe', 7, '12:00', '2025-01-25', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de lancement', 'Lancement du nouveau projet', 2, '09:00', '2025-01-23', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de suivi', 'Suivi des tâches en cours', 3, '10:00', '2025-01-23', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de clôture', 'Clôture du projet en cours', 4, '11:00', '2025-01-23', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de feedback', 'Retour d''expérience sur le projet', 5, '14:00', '2025-01-23', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de coordination', 'Coordination des équipes', 6, '15:00', '2025-01-23', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion', 'Planification des tâches', 7, '16:00', '2025-01-23', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de brainstorming', 'Brainstorming pour nouvelles idées', 2, '09:00', '2025-01-26', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de formation', 'Formation sur les nouvelles technologies', 3, '10:00', '2025-01-26', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de développement', 'Développement de nouvelles fonctionnalités', 4, '11:00', '2025-01-26', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de revue', 'Revue des progrès', 5, '14:00', '2025-01-26', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de stratégie', 'Stratégie pour le prochain trimestre', 1, '15:00', '2025-01-26', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de bilan', 'Bilan des résultats', 1, '16:00', '2025-01-26', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de lancement', 'Lancement du nouveau produit', 2, '09:00', '2025-01-27', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de suivi', 'Suivi des ventes', 3, '10:00', '2025-01-27', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de clôture', 'Clôture du trimestre', 4, '11:00', '2025-01-27', 6);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de feedback', 'Retour d''expérience des clients', 5, '14:00', '2025-01-27', 3);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de coordination', 'Coordination des équipes de vente', 6, '15:00', '2025-01-27', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de planification', 'Planification des ventes', 7, '16:00', '2025-01-27', 5);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de brainstorming', 'Brainstorming pour nouvelles stratégies', 2, '09:00', '2025-01-28', 4);
INSERT INTO requests (reason, description, uno, time, date, number_of_people) VALUES ('Réunion de formation', 'Formation sur les techniques de vente', 3, '10:00', '2025-01-28', 6);
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Rendez-vous pour discussion projet' AND date = '2025-01-25'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Point d''avancement mensuel' AND date = '2025-01-24'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Réunion de planification' AND date = '2025-01-25'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Bilan trimestriel' AND date = '2025-01-29'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Session de développement' AND date = '2025-01-24'));
INSERT INTO meetings (uno, rno) VALUES (2, (SELECT rno FROM requests WHERE reason = 'Réunion de lancement' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (3, (SELECT rno FROM requests WHERE reason = 'Réunion de suivi' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (4, (SELECT rno FROM requests WHERE reason = 'Réunion de clôture' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (5, (SELECT rno FROM requests WHERE reason = 'Réunion de feedback' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (6, (SELECT rno FROM requests WHERE reason = 'Réunion de coordination' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (7, (SELECT rno FROM requests WHERE reason = 'Réunion' AND date = '2025-01-23'));
INSERT INTO meetings (uno, rno) VALUES (2, (SELECT rno FROM requests WHERE reason = 'Réunion de brainstorming' AND date = '2025-01-26'));
INSERT INTO meetings (uno, rno) VALUES (3, (SELECT rno FROM requests WHERE reason = 'Réunion de formation' AND date = '2025-01-26'));
INSERT INTO meetings (uno, rno) VALUES (4, (SELECT rno FROM requests WHERE reason = 'Réunion de développement' AND date = '2025-01-26'));
INSERT INTO meetings (uno, rno) VALUES (5, (SELECT rno FROM requests WHERE reason = 'Réunion de revue' AND date = '2025-01-26'));
\ No newline at end of file
header.title=Meeting Planner
header.title=MeetingPlannr
header.subtitle=Organize your meetings easily
footer.copyright=© 2023 Meeting Planner. All rights reserved.
......@@ -48,6 +48,7 @@ meeting.new.description=Description
meeting.new.numberOfPeople=Number of People
meeting.new.submit=Submit
meeting.new.return=Return to Calendar
meeting.new.occupied=Occupied
actions.page.title=Actions
actions.greeting=Hello
......@@ -110,6 +111,8 @@ admin.requests.validated=Validated
admin.requests.validate=Validate
admin.requests.no.found=No requests found
admin.requests.return=Return to Dashboard
admin.requests.filter.button=Filter
admin.requests.filter.active=Filtered
admin.meetings.page.title=Meeting Management
admin.meetings.title=Manage Meetings
admin.meetings.search.placeholder=Search meetings...
......@@ -130,3 +133,9 @@ admin.dashboard.users=Manage Users
admin.dashboard.requests=Manage Requests
admin.dashboard.meetings=Manage Meetings
admin.dashboard.return=Return to User Actions
password.change.title=Forgot Password
password.change.email=Email
password.change.submit=Submit
password.change.error=Error processing your request. Please try again.
password.change.newPassword=New Password
header.title=Meeting Planner
header.title=MeetingPlannr
header.subtitle=Organize your meetings easily
footer.copyright=© 2023 Meeting Planner. All rights reserved.
......@@ -48,6 +48,7 @@ meeting.new.description=Description
meeting.new.numberOfPeople=Number of People
meeting.new.submit=Submit
meeting.new.return=Return to Calendar
meeting.new.occupied=Occupied
actions.page.title=Actions
actions.greeting=Hello
......@@ -110,6 +111,8 @@ admin.requests.validated=Validated
admin.requests.validate=Validate
admin.requests.no.found=No requests found
admin.requests.return=Return to Dashboard
admin.requests.filter.button=Filter
admin.requests.filter.active=Filtered
admin.meetings.page.title=Meeting Management
admin.meetings.title=Manage Meetings
admin.meetings.search.placeholder=Search meetings...
......@@ -130,3 +133,9 @@ admin.dashboard.users=Manage Users
admin.dashboard.requests=Manage Requests
admin.dashboard.meetings=Manage Meetings
admin.dashboard.return=Return to User Actions
password.change.title=Forgot Password
password.change.email=Email
password.change.submit=Submit
password.change.error=Error processing your request. Please try again.
password.change.newPassword=New Password
header.title=Planificador de Reuniones
header.title=MeetingPlannr
header.subtitle=Organiza tus reuniones fácilmente
footer.copyright=© 2023 Planificador de Reuniones. Todos los derechos reservados.
......@@ -10,7 +10,7 @@ register.phone=Número de teléfono
register.birthdate=Fecha de nacimiento
register.password=Contraseña
register.submit=Enviar
register.login=¿Ya tienes una cuenta? Inicia sesión aquí
register.login=Iniciar sesión
login.title=Iniciar sesión
login.email=Correo electrónico
login.password=Contraseña
......@@ -18,6 +18,12 @@ login.submit=Iniciar sesión
login.register=Regístrate aquí
login.error=Nombre de usuario o contraseña inválidos
password.change.title=Olvidé mi contraseña
password.change.email=Correo electrónico
password.change.submit=Enviar
password.change.error=Error al procesar tu solicitud. Por favor, inténtalo de nuevo.
password.change.newPassword=Nueva contraseña
profile.page.title=Perfil
profile.title=Tu Perfil
profile.picture=Foto de Perfil
......@@ -48,6 +54,7 @@ meeting.new.description=Descripción
meeting.new.numberOfPeople=Número de Personas
meeting.new.submit=Enviar
meeting.new.return=Volver al Calendario
meeting.new.occupied=Ocupado
actions.page.title=Acciones
actions.greeting=Hola
......@@ -108,6 +115,8 @@ admin.requests.date.time=Fecha y Hora
admin.requests.requester=Solicitante
admin.requests.validated=Validada
admin.requests.validate=Validar
admin.requests.filter.button=Filtrar
admin.requests.filter.active=Filtrado
admin.requests.no.found=No se encontraron solicitudes
admin.requests.return=Volver al Panel de Control
admin.meetings.page.title=Gestión de Reuniones
......
header.title=Planificateur de Réunions
header.title=MeetingPlannr
header.subtitle=Organisez vos réunions facilement
footer.copyright=© 2023 Planificateur de Réunions. Tous droits réservés.
......@@ -48,6 +48,7 @@ meeting.new.description=Description
meeting.new.numberOfPeople=Nombre de Personnes
meeting.new.submit=Soumettre
meeting.new.return=Retour au Calendrier
meeting.new.occupied=Occupé
actions.page.title=Actions
actions.greeting=Bonjour
......@@ -110,6 +111,8 @@ admin.requests.validated=Validée
admin.requests.validate=Valider
admin.requests.no.found=Aucune demande trouvée
admin.requests.return=Retour au Tableau de Bord
admin.requests.filter.button=Filtrer
admin.requests.filter.active=Filtré
admin.meetings.page.title=Gestion des Réunions
admin.meetings.title=Gérer les Réunions
admin.meetings.search.placeholder=Rechercher des réunions...
......@@ -130,3 +133,9 @@ admin.dashboard.users=Gérer les Utilisateurs
admin.dashboard.requests=Gérer les Demandes
admin.dashboard.meetings=Gérer les Réunions
admin.dashboard.return=Retour aux Actions Utilisateur
password.change.title=Mot de passe oublié
password.change.email=Email
password.change.submit=Soumettre
password.change.error=Erreur lors du traitement de votre demande. Veuillez réessayer.
password.change.newPassword=Nouveau mot de passe
......@@ -60,6 +60,7 @@ h1, h2 {
text-align: center;
border: 1px solid #ddd;
min-height: 80px;
transition: background-color 0.3s ease;
}
.weekend {
......@@ -154,6 +155,21 @@ button.back:hover {
background-color: #0056b3;
}
button.filter {
background-color: #ffc107;
}
button.filter:hover {
background-color: #e0a800;
}
button.filter.active {
background-color: #28a745;
}
button.filter.active:hover {
background-color: #218838;
}
/* Formulaires */
.form-container, .container {
......@@ -609,3 +625,32 @@ button.back:hover {
.language-switcher span {
color: rgba(255, 255, 255, 0.5);
}
/* Styles pour la pagination */
.pagination {
margin: 20px 0;
display: flex;
justify-content: center;
gap: 10px;
}
.pagination-link {
padding: 10px 15px;
border: 1px solid #ddd;
border-radius: 4px;
background: white;
color: #007bff;
text-decoration: none;
transition: background-color 0.3s, color 0.3s;
}
.pagination-link:hover {
background-color: #007bff;
color: white;
}
.pagination-link.active {
background-color: #007bff;
color: white;
font-weight: bold;
}
src/main/resources/static/uploads/logo.jpg

9.62 KiB

......@@ -62,7 +62,7 @@
for (int i = 1; i <= totalPages; i++) {
%>
<a href="?page=<%= i %>&search=${param.search}"
class="<%= i == currentPage ? "active" : "" %>">
class="pagination-link <%= i == currentPage ? "active" : "" %>">
<%= i %>
</a>
<%
......
......@@ -18,6 +18,9 @@
<input type="text" name="search" placeholder="<spring:message code="admin.requests.search.placeholder"/>"
value="${param.search}">
<button type="submit" class="back"><spring:message code="admin.requests.search.button"/></button>
<button type="submit" name="filter" value="${param.filter == 'true' ? 'false' : 'true'}" class="filter ${param.filter == 'true' ? 'active' : ''}">
<spring:message code="${param.filter == 'true' ? 'admin.requests.filter.active' : 'admin.requests.filter.button'}"/>
</button>
</form>
<div class="users-list">
......@@ -37,7 +40,7 @@
%>
<span class="banned-status"><spring:message code="admin.requests.validated"/></span>
<% } else { %>
<form action="${pageContext.request.contextPath}/admin/requests/validate/<%= req.getRno() %>" method="post" style="display: inline;">
<form action="${pageContext.request.contextPath}/admin/requests/validate/<%= req.getRno() %>?page=${param.page}&search=${param.search}&filter=${param.filter}" method="post" style="display: inline;">
<button type="submit" class="submit"><spring:message code="admin.requests.validate"/></button>
</form>
<% } %>
......@@ -59,8 +62,8 @@
int currentPage = (Integer) request.getAttribute("currentPage");
for (int i = 1; i <= totalPages; i++) {
%>
<a href="?page=<%= i %>&search=${param.search}"
class="<%= i == currentPage ? "active" : "" %>">
<a href="?page=<%= i %>&search=${param.search}&filter=${param.filter}"
class="pagination-link <%= i == currentPage ? "active" : "" %>">
<%= i %>
</a>
<%
......
......@@ -63,7 +63,7 @@
for (int i = 1; i <= totalPages; i++) {
%>
<a href="?page=<%= i %>&search=${param.search}"
class="<%= i == currentPage ? "active" : "" %>">
class="pagination-link <%= i == currentPage ? "active" : "" %>">
<%= i %>
</a>
<%
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment