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;
use App\Repository\InterventionRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/calendrier')]
class CalendrierController extends AbstractController
{
#[Route(name: 'app_calendrier_index', methods: ['GET'])]
public function index(): Response
#[Route('/chauffagiste', name: 'app_calendrier_indexChauffagiste')]
public function indexChauffagiste(InterventionRepository $interventionRepository): Response
{
return $this->render('calendrier/index.html.twig', [
'controller_name' => 'CalendrierController',
// Vérification : seul le chauffagiste connecté peut voir son propre calendrier
$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')]
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');
// 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', [
'controller_name' => 'CalendrierController',
'events' => json_encode($events),
]);
}
#[Route('/chauffagiste', name: 'app_calendrier_indexChauffagiste')]
public function indexChauffagiste(): Response
#[Route('/admin', name: 'app_calendrier_index')]
public function indexAdmin(InterventionRepository $interventionRepository): Response
{
// Ensure chauffagiste only sees their own calendar
if ($this->isGranted('ROLE_CHAUFFAGISTE')) {
// filter logic for individual chauffagiste calendar
// Vérification : seul un admin peut accéder à ce calendrier
$this->denyAccessUnlessGranted('ROLE_ADMIN');
// 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', [
'controller_name' => 'CalendrierController',
// Passer les événements à la vue
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\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/user")
*/
class UserController extends AbstractController
final class UserController extends AbstractController
{
/**
* @Route("/", name="app_user_index", methods={"GET"})
*/
// Route pour afficher tous les utilisateurs
#[Route('/user', name: 'app_user_index', methods: ['GET'])]
public function index(UserRepository $userRepository): Response
{
return $this->render('user/index.html.twig', [
@ -25,16 +23,20 @@ class UserController extends AbstractController
]);
}
/**
* @Route("/new", name="app_user_new", methods={"GET", "POST"})
*/
public function new(Request $request, EntityManagerInterface $entityManager): Response
// Route pour créer un nouvel utilisateur
#[Route('/user/new', name: 'app_user_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager, UserPasswordHasherInterface $passwordHasher): Response
{
$user = new Utilisateur();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
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->flush();
@ -47,9 +49,8 @@ class UserController extends AbstractController
]);
}
/**
* @Route("/{id}", name="app_user_show", methods={"GET"})
*/
// Route pour afficher un utilisateur spécifique
#[Route('/user/{id}', name: 'app_user_show', methods: ['GET'])]
public function show(Utilisateur $user): Response
{
return $this->render('user/show.html.twig', [
@ -57,9 +58,8 @@ class UserController extends AbstractController
]);
}
/**
* @Route("/{id}/edit", name="app_user_edit", methods={"GET", "POST"})
*/
// Route pour modifier un utilisateur spécifique
#[Route('/user/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
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
@ -90,9 +90,8 @@ class UserController extends AbstractController
]);
}
/**
* @Route("/{id}", name="app_user_delete", methods={"POST"})
*/
// Route pour supprimer un utilisateur spécifique
#[Route('/user/{id}', name: 'app_user_delete', methods: ['POST'])]
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

View File

@ -74,6 +74,10 @@
}
</style>
{% 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>
<body>

View File

@ -1,57 +1,23 @@
<!DOCTYPE html>
<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 %}
{% extends 'base.html.twig' %}
{% block title %}Calendrier des interventions{% endblock %}
{% block body %}
<h1>📅 Calendrier des 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 %}
</head>
<body>
<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">
<img class="logoEmail" src="{{ asset('styles/image/LogoHegreConfort_SansFond.png') }}">
</div>
</div>
<div class="main-content">
<div class="calendar-header" style="gap: 50px">
<div class="day-header">Mo</div>
<div class="day-header">Tu</div>
<div class="day-header">We</div>
<div class="day-header">Th</div>
<div class="day-header">Fr</div>
<div class="day-header">Sa</div>
<div class="day-header">Su</div>
</div>
<div class="calendar-title">Calendar</div>
</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' %}
{% block title %}Hello CalendrierController!{% endblock %}
{% block title %}Calendrier des interventions{% endblock %}
{% block body %}
<style>
.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>
<h1>📅 Calendrier des interventions</h1>
<div class="example-wrapper">
<h1>Hello {{ controller_name }}! ✅</h1>
<div id="calendar"></div>
This friendly message is coming from:
<ul>
<li>Your controller at <code>/home/allarda@stsio.lan/Test/HegreEtConfort/src/Controller/CalendrierController.php</code></li>
<li>Your template at <code>/home/allarda@stsio.lan/Test/HegreEtConfort/templates/calendrier/index.html.twig</code></li>
</ul>
</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 %}