mise en place de calendrier dynamique
This commit is contained in:
parent
b20dc2e00f
commit
a47abaabfd
@ -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),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
|
||||||
|
@ -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 %}
|
@ -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 %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user