mise en place de calendrier dynamique

This commit is contained in:
sermandm 2025-04-25 17:34:37 +02:00
parent b20dc2e00f
commit a47abaabfd
6 changed files with 143 additions and 101 deletions

View File

@ -2,42 +2,89 @@
namespace App\Controller; namespace App\Controller;
use App\Repository\InterventionRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Annotation\Route;
#[Route('/calendrier')] #[Route('/calendrier')]
class CalendrierController extends AbstractController class CalendrierController extends AbstractController
{ {
#[Route(name: 'app_calendrier_index', methods: ['GET'])] #[Route('/chauffagiste', name: 'app_calendrier_indexChauffagiste')]
public function index(): Response public function indexChauffagiste(InterventionRepository $interventionRepository): Response
{ {
return $this->render('calendrier/index.html.twig', [ // Vérification : seul le chauffagiste connecté peut voir son propre calendrier
'controller_name' => 'CalendrierController', $this->denyAccessUnlessGranted('ROLE_CHAUFFAGISTE');
// Récupérer les interventions du chauffagiste connecté
$interventions = $interventionRepository->findByUser($this->getUser());
// Préparer les événements pour FullCalendar
$events = [];
foreach ($interventions as $intervention) {
$events[] = [
'title' => $intervention->getTitle(),
'start' => $intervention->getStartDate()->format('Y-m-d H:i:s'),
'end' => $intervention->getEndDate()->format('Y-m-d H:i:s'),
'description' => $intervention->getDescription(),
];
}
// Passer les événements à la vue
return $this->render('calendrier/indexChauffagiste.html.twig', [
'events' => json_encode($events),
]); ]);
} }
#[Route('/secretaire', name: 'app_calendrier_indexSecretaire')] #[Route('/secretaire', name: 'app_calendrier_indexSecretaire')]
public function indexSecretaire(): Response public function indexSecretaire(InterventionRepository $interventionRepository): Response
{ {
// Check that only admins and secretaries can view this page // Vérification : seul le secrétaire peut accéder à ce calendrier
$this->denyAccessUnlessGranted('ROLE_SECRETAIRE'); $this->denyAccessUnlessGranted('ROLE_SECRETAIRE');
// Récupérer toutes les interventions de tous les chauffagistes
$interventions = $interventionRepository->findAll();
// Préparer les événements pour FullCalendar
$events = [];
foreach ($interventions as $intervention) {
$events[] = [
'title' => $intervention->getTitle(),
'start' => $intervention->getStartDate()->format('Y-m-d H:i:s'),
'end' => $intervention->getEndDate()->format('Y-m-d H:i:s'),
'description' => $intervention->getDescription(),
];
}
// Passer les événements à la vue
return $this->render('calendrier/indexSecretaire.html.twig', [ return $this->render('calendrier/indexSecretaire.html.twig', [
'controller_name' => 'CalendrierController', 'events' => json_encode($events),
]); ]);
} }
#[Route('/chauffagiste', name: 'app_calendrier_indexChauffagiste')] #[Route('/admin', name: 'app_calendrier_index')]
public function indexChauffagiste(): Response public function indexAdmin(InterventionRepository $interventionRepository): Response
{ {
// Ensure chauffagiste only sees their own calendar // Vérification : seul un admin peut accéder à ce calendrier
if ($this->isGranted('ROLE_CHAUFFAGISTE')) { $this->denyAccessUnlessGranted('ROLE_ADMIN');
// filter logic for individual chauffagiste calendar
// Récupérer toutes les interventions de tous les chauffagistes
$interventions = $interventionRepository->findAll();
// Préparer les événements pour FullCalendar
$events = [];
foreach ($interventions as $intervention) {
$events[] = [
'title' => $intervention->getTitle(),
'start' => $intervention->getStartDate()->format('Y-m-d H:i:s'),
'end' => $intervention->getEndDate()->format('Y-m-d H:i:s'),
'description' => $intervention->getDescription(),
];
} }
return $this->render('calendrier/indexChauffagiste.html.twig', [ // Passer les événements à la vue
'controller_name' => 'CalendrierController', return $this->render('calendrier/index.html.twig', [
'events' => json_encode($events),
]); ]);
} }
} }

View File

@ -9,15 +9,13 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
/** final class UserController extends AbstractController
* @Route("/user")
*/
class UserController extends AbstractController
{ {
/** // Route pour afficher tous les utilisateurs
* @Route("/", name="app_user_index", methods={"GET"}) #[Route('/user', name: 'app_user_index', methods: ['GET'])]
*/
public function index(UserRepository $userRepository): Response public function index(UserRepository $userRepository): Response
{ {
return $this->render('user/index.html.twig', [ return $this->render('user/index.html.twig', [
@ -25,16 +23,20 @@ class UserController extends AbstractController
]); ]);
} }
/** // Route pour créer un nouvel utilisateur
* @Route("/new", name="app_user_new", methods={"GET", "POST"}) #[Route('/user/new', name: 'app_user_new', methods: ['GET', 'POST'])]
*/ public function new(Request $request, EntityManagerInterface $entityManager, UserPasswordHasherInterface $passwordHasher): Response
public function new(Request $request, EntityManagerInterface $entityManager): Response
{ {
$user = new Utilisateur(); $user = new Utilisateur();
$form = $this->createForm(UserType::class, $user); $form = $this->createForm(UserType::class, $user);
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
// Hash du mot de passe
$plainPassword = $form->get('plainPassword')->getData();
$hashedPassword = $passwordHasher->hashPassword($user, $plainPassword);
$user->setPassword($hashedPassword);
$entityManager->persist($user); $entityManager->persist($user);
$entityManager->flush(); $entityManager->flush();
@ -47,9 +49,8 @@ class UserController extends AbstractController
]); ]);
} }
/** // Route pour afficher un utilisateur spécifique
* @Route("/{id}", name="app_user_show", methods={"GET"}) #[Route('/user/{id}', name: 'app_user_show', methods: ['GET'])]
*/
public function show(Utilisateur $user): Response public function show(Utilisateur $user): Response
{ {
return $this->render('user/show.html.twig', [ return $this->render('user/show.html.twig', [
@ -57,9 +58,8 @@ class UserController extends AbstractController
]); ]);
} }
/** // Route pour modifier un utilisateur spécifique
* @Route("/{id}/edit", name="app_user_edit", methods={"GET", "POST"}) #[Route('/user/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
*/
public function edit(Request $request, Utilisateur $user, EntityManagerInterface $entityManager): Response public function edit(Request $request, Utilisateur $user, EntityManagerInterface $entityManager): Response
{ {
// Si l'utilisateur est un secrétaire et qu'il essaie de modifier un autre secrétaire // Si l'utilisateur est un secrétaire et qu'il essaie de modifier un autre secrétaire
@ -90,9 +90,8 @@ class UserController extends AbstractController
]); ]);
} }
/** // Route pour supprimer un utilisateur spécifique
* @Route("/{id}", name="app_user_delete", methods={"POST"}) #[Route('/user/{id}', name: 'app_user_delete', methods: ['POST'])]
*/
public function delete(Request $request, Utilisateur $user, EntityManagerInterface $entityManager): Response public function delete(Request $request, Utilisateur $user, EntityManagerInterface $entityManager): Response
{ {
// Si l'utilisateur est un secrétaire et qu'il essaie de supprimer un autre secrétaire // Si l'utilisateur est un secrétaire et qu'il essaie de supprimer un autre secrétaire

View File

@ -74,6 +74,10 @@
} }
</style> </style>
{% block stylesheets %}{% endblock %} {% block stylesheets %}{% endblock %}
<!-- FullCalendar pour faire un calendrier dynamique -->
<link href="https://cdn.jsdelivr.net/npm/fullcalendar@5.10.1/main.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.10.1/main.min.js"></script>
</head> </head>
<body> <body>

View File

@ -1,57 +1,23 @@
<!DOCTYPE html> {% extends 'base.html.twig' %}
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Authentification{% endblock %}</title>
<link href="{{ asset('styles/css/calendrier.css') }}" rel="stylesheet">
{% block stylesheets %}
{% endblock %}
</head>
<body> {% block title %}Calendrier des interventions{% endblock %}
<div class="sidebar">
<div class="sidebar-button">
<img class="logoEmail" src="{{ asset('styles/image/6.png') }}">
</div>
<div class="sidebar-button">
<img class="logoEmail" src="{{ asset('styles/image/3.png') }}">
</div>
<a href="{{ path('app_intervention_new') }}">
<button>Create Intervention</button>
</a>
<div class="sidebar-button">
<img class="logoEmail" src="{{ asset('styles/image/4.png') }}">
</div>
<span>Choose heating engineer</span>
<div class="sidebar-button">
<img class="logoEmail" src="{{ asset('styles/image/5.png') }}">
</div>
<span>Modify Intervention</span>
<div class="sidebar-button">
<img class="logoEmail" src="{{ asset('styles/image/7.png') }}">
</div>
<span>Surname Name</span>
<div class="sidebar-button"> {% block body %}
<img class="logoEmail" src="{{ asset('styles/image/LogoHegreConfort_SansFond.png') }}"> <h1>📅 Calendrier des interventions</h1>
</div>
<div id="calendar"></div>
</div> <script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
<div class="main-content"> var calendar = new FullCalendar.Calendar(calendarEl, {
<div class="calendar-header" style="gap: 50px"> initialView: 'dayGridMonth',
<div class="day-header">Mo</div> events: {{ events | raw }},
<div class="day-header">Tu</div> eventClick: function(info) {
<div class="day-header">We</div> alert('Intervention : ' + info.event.title + '\n' + info.event.extendedProps.description);
<div class="day-header">Th</div> }
<div class="day-header">Fr</div> });
<div class="day-header">Sa</div> calendar.render();
<div class="day-header">Su</div> });
</div> </script>
<div class="calendar-title">Calendar</div> {% endblock %}
</div>
</body>
</html>

View File

@ -0,0 +1,23 @@
{% extends 'base.html.twig' %}
{% block title %}Mon calendrier d'interventions{% endblock %}
{% block body %}
<h1>📅 Mon calendrier d'interventions</h1>
<div id="calendar"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
events: {{ events | raw }},
eventClick: function(info) {
alert('Intervention : ' + info.event.title + '\n' + info.event.extendedProps.description);
}
});
calendar.render();
});
</script>
{% endblock %}

View File

@ -1,20 +1,23 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block title %}Hello CalendrierController!{% endblock %} {% block title %}Calendrier des interventions{% endblock %}
{% block body %} {% block body %}
<style> <h1>📅 Calendrier des interventions</h1>
.example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
.example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
</style>
<div class="example-wrapper"> <div id="calendar"></div>
<h1>Hello {{ controller_name }}! ✅</h1>
This friendly message is coming from: <script>
<ul> document.addEventListener('DOMContentLoaded', function() {
<li>Your controller at <code>/home/allarda@stsio.lan/Test/HegreEtConfort/src/Controller/CalendrierController.php</code></li> var calendarEl = document.getElementById('calendar');
<li>Your template at <code>/home/allarda@stsio.lan/Test/HegreEtConfort/templates/calendrier/index.html.twig</code></li> var calendar = new FullCalendar.Calendar(calendarEl, {
</ul> initialView: 'dayGridMonth',
</div> events: {{ events | raw }},
eventClick: function(info) {
alert('Intervention : ' + info.event.title + '\n' + info.event.extendedProps.description);
}
});
calendar.render();
});
</script>
{% endblock %} {% endblock %}