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