diff --git a/assets/js/lieu.js b/assets/js/lieu.js index 27721b9..8c87c81 100644 --- a/assets/js/lieu.js +++ b/assets/js/lieu.js @@ -8,9 +8,11 @@ document.addEventListener('DOMContentLoaded', function () { const longitudeLabel = document.getElementById('longitude-value'); if (villeSelect && lieuSelect) { + // Listener pour la ville villeSelect.addEventListener('change', function () { const villeId = villeSelect.value; + // Réinitialisation des options de lieu lieuSelect.innerHTML = ''; lieuSelect.disabled = true; @@ -23,12 +25,13 @@ document.addEventListener('DOMContentLoaded', function () { return response.json(); }) .then(data => { + // Mise à jour des options dans le menu déroulant lieuSelect.innerHTML = ''; data.forEach(lieu => { const option = document.createElement('option'); - option.value = lieu.id; - option.textContent = lieu.nom; - option.dataset.details = JSON.stringify(lieu); + option.value = lieu.id; // ID pour soumettre au backend + option.textContent = lieu.nom; // Nom affiché + option.dataset.details = JSON.stringify(lieu); // Stocker les détails pour affichage lieuSelect.appendChild(option); }); @@ -40,20 +43,27 @@ document.addEventListener('DOMContentLoaded', function () { } }); + // Listener pour le lieu lieuSelect.addEventListener('change', function () { const selectedOption = lieuSelect.options[lieuSelect.selectedIndex]; if (selectedOption && selectedOption.dataset.details) { const lieuDetails = JSON.parse(selectedOption.dataset.details); + // Mise à jour des labels avec les détails du lieu sélectionné rueLabel.textContent = lieuDetails.rue || 'Non renseignée'; codePostalLabel.textContent = lieuDetails.codePostal || 'Non renseigné'; latitudeLabel.textContent = lieuDetails.latitude || 'Non renseignée'; longitudeLabel.textContent = lieuDetails.longitude || 'Non renseignée'; + + console.log('Lieu sélectionné:', lieuDetails); } else { + // Réinitialisation des labels si aucun lieu n'est sélectionné rueLabel.textContent = 'Renseigner avec le lieu'; codePostalLabel.textContent = 'Renseigner avec le lieu'; latitudeLabel.textContent = 'Renseigner avec le lieu'; longitudeLabel.textContent = 'Renseigner avec le lieu'; + + console.log('Aucun lieu sélectionné.'); } }); } else { diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 430ff71..394659a 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -25,6 +25,10 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException; class AdminController extends AbstractController { + private ParticipantRepository $participantRepository; + public function __construct(ParticipantRepository $participantRepository){ + $this->participantRepository = $participantRepository; + } #[Route('/admin', name: 'app_admin')] public function index(TokenStorageInterface $tokenStorage): Response { @@ -38,13 +42,14 @@ class AdminController extends AbstractController //Gestion des utilisateurs #[Route('/admin/user', name: 'app_adminUser')] - public function adminUser(ParticipantRepository $participantRepository, TokenStorageInterface $tokenStorage): Response + public function adminUser(TokenStorageInterface $tokenStorage): Response { $token = $tokenStorage->getToken(); $userConnect = $token?->getUser(); + $participants = $this->participantRepository->findAll(); return $this->render('admin/user.html.twig', [ 'profile' => $userConnect, - 'participants' => $participantRepository->findAll(), + 'participants' => $participants, 'controller_name' => 'AdminController', ]); } diff --git a/src/Controller/SortieController.php b/src/Controller/SortieController.php index 33f0aa1..2c4afb1 100644 --- a/src/Controller/SortieController.php +++ b/src/Controller/SortieController.php @@ -4,39 +4,89 @@ namespace App\Controller; use App\Entity\Sortie; use App\Form\SortieType; +use App\Repository\EtatRepository; use App\Repository\LieuRepository; -use App\Repository\VilleRepository; +use App\Repository\ParticipantRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; #[Route('/sortie', name: 'sortie_')] class SortieController extends AbstractController { #[Route('/creates', name: 'create', methods: ['GET', 'POST'])] - public function create(Request $request, EntityManagerInterface $entityManager): Response - { + public function create( + Request $request, + EntityManagerInterface $entityManager, + TokenStorageInterface $tokenStorage, + LieuRepository $lieuRepository, + ParticipantRepository $participantRepository, + EtatRepository $etatRepository // Ajout du repository pour les états + ): Response { $sortie = new Sortie(); - // Créez le formulaire sans options spéciales + // Récupérer l'utilisateur connecté + $token = $tokenStorage->getToken(); + $userConnect = $token?->getUser(); + + if (!$userConnect) { + $this->addFlash('error', 'Vous devez être connecté pour créer une sortie.'); + return $this->redirectToRoute('app_login'); + } + + // Créer le formulaire $form = $this->createForm(SortieType::class, $sortie); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - // Sauvegarde dans la base de données + // Récupérer l'ID du lieu depuis le formulaire + $lieuId = $form->get('lieu')->getData(); + $lieu = $lieuRepository->find($lieuId); + + if (!$lieu) { + $this->addFlash('error', 'Le lieu sélectionné est invalide.'); + return $this->redirectToRoute('sortie_create'); + } + + // Associer le lieu à la sortie + $sortie->setLieu($lieu); + + // Associer le site à partir de l'utilisateur connecté + $participant = $participantRepository->find($userConnect->getIdParticipant()); + + if (!$participant) { + $this->addFlash('error', 'Impossible de déterminer le site de l\'utilisateur.'); + return $this->redirectToRoute('sortie_create'); + } + + $sortie->setSite($participant->getSite()); + $sortie->setParticipant($participant); + + // Récupérer l'état "en création" avec l'ID donné + $etat = $etatRepository->find('019349ba-38ca-7a39-93c3-62f046671525'); + if (!$etat) { + $this->addFlash('error', 'État non trouvé.'); + return $this->redirectToRoute('sortie_create'); + } + + // Associer l'état à la sortie + $sortie->setEtat($etat); + + // Sauvegarder la sortie $entityManager->persist($sortie); $entityManager->flush(); $this->addFlash('success', 'La sortie a été créée avec succès.'); - return $this->redirectToRoute('sortie_create'); + return $this->redirectToRoute('home'); } return $this->render('sortie/create.html.twig', [ + 'profile' => $userConnect, 'form' => $form->createView(), ]); } - } diff --git a/src/Entity/Sortie.php b/src/Entity/Sortie.php index 3479552..0b7e2d7 100644 --- a/src/Entity/Sortie.php +++ b/src/Entity/Sortie.php @@ -18,13 +18,13 @@ class Sortie #[ORM\Column(length: 255)] private ?string $nom = null; - #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] private ?\DateTimeInterface $dateHeureDebut = null; #[ORM\Column(nullable: true)] private ?int $duree = null; - #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] private ?\DateTimeInterface $dateLimiteInscription = null; #[ORM\Column(nullable: true)] diff --git a/src/Form/SortieType.php b/src/Form/SortieType.php index efc3f92..8746166 100644 --- a/src/Form/SortieType.php +++ b/src/Form/SortieType.php @@ -64,8 +64,8 @@ class SortieType extends AbstractType 'class' => Lieu::class, 'choice_label' => 'nom', 'label' => 'Lieu', - 'placeholder' => 'Sélectionnez une ville d\'abord', - 'choices' => [], + 'placeholder' => 'Sélectionnez un lieu', + 'required' => true, 'attr' => ['id' => 'lieu-select'], ]); } diff --git a/src/Repository/ParticipantRepository.php b/src/Repository/ParticipantRepository.php index 4c69fdf..140933d 100644 --- a/src/Repository/ParticipantRepository.php +++ b/src/Repository/ParticipantRepository.php @@ -4,6 +4,7 @@ namespace App\Repository; use App\Entity\Participant; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\ORM\Tools\Pagination\Paginator; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; @@ -33,6 +34,16 @@ class ParticipantRepository extends ServiceEntityRepository return $newProfile; } + public function getAll(): Paginator + { + $qb = $this->createQueryBuilder('p') + ->addSelect('site') + ->leftJoin('p.site', 'site') + ->getQuery(); + return new Paginator($qb); + } + + // /** // * @return Participant[] Returns an array of Participant objects // */ diff --git a/templates/admin/user.html.twig b/templates/admin/user.html.twig index ad4f743..51e1233 100644 --- a/templates/admin/user.html.twig +++ b/templates/admin/user.html.twig @@ -49,6 +49,7 @@ Nom Prénom Pseudo + Site Téléphone Email Administrateur @@ -64,6 +65,7 @@ {{ participant.nom }} {{ participant.prenom }} {{ participant.pseudo }} + {{ participant.site ? participant.site.nom : "N/A" }} {{ participant.telephone }} {{ participant.email }} @@ -91,6 +93,7 @@ + {# Tableau user en attente #}
diff --git a/templates/main/index.html.twig b/templates/main/index.html.twig index ffce41d..33729f3 100644 --- a/templates/main/index.html.twig +++ b/templates/main/index.html.twig @@ -2,6 +2,7 @@ {% block head %} + Liste des sorties {% block stylesheets %} {{ encore_entry_link_tags('app') }} {% endblock %} @@ -9,24 +10,24 @@ {% endblock %} {% block content %} -
-
+
+

Liste des sorties

+ +
{% for sortie in sorties %} -
-
-
-
{{ sortie.nom }}
-

- Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
- Durée : {{ sortie.duree }} minutes
- Inscriptions max : {{ sortie.nbInscriptionsMax }}
- Infos : {{ sortie.infosSortie }} -

- Voir plus -
+
+

{{ sortie.nom }}

+

+ Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
+ Durée : {{ sortie.duree }} minutes
+ Inscriptions max : {{ sortie.nbInscriptionsMax }}
+ Infos : {{ sortie.infosSortie }} +

+
{% endfor %}
-{% endblock %} \ No newline at end of file +{% endblock %}