conflit resolved

This commit is contained in:
jleroy2023
2024-11-20 16:05:58 +01:00
5 changed files with 89 additions and 31 deletions

View File

@@ -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 = '<option value="">Sélectionnez un lieu</option>';
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 = '<option value="">Sélectionnez un lieu</option>';
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 {

View File

@@ -4,8 +4,9 @@ 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;
@@ -17,29 +18,75 @@ use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInt
class SortieController extends AbstractController
{
#[Route('/creates', name: 'create', methods: ['GET', 'POST'])]
public function create(Request $request, EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage): 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');
}
$token = $tokenStorage->getToken();
$userConnect = $token?->getUser();
return $this->render('sortie/create.html.twig', [
'profile' => $userConnect,
'form' => $form->createView(),
]);
}
}

View File

@@ -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)]

View File

@@ -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'],
]);
}

View File

@@ -2,6 +2,7 @@
{% block head %}
<head>
<meta charset="UTF-8">
<title>Liste des sorties</title>
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
@@ -9,24 +10,24 @@
{% endblock %}
{% block content %}
<div class="container mt-4">
<div class="row">
<div class="container mx-auto p-4">
<h1 class="text-2xl font-bold mb-6 text-center">Liste des sorties</h1>
<div class="grid grid-cols-1 sm:grid-cols-3 lg:grid-cols-6 gap-6">
{% for sortie in sorties %}
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">{{ sortie.nom }}</h5>
<p class="card-text">
<strong>Date de début :</strong> {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}<br>
<strong>Durée :</strong> {{ sortie.duree }} minutes<br>
<strong>Inscriptions max :</strong> {{ sortie.nbInscriptionsMax }}<br>
<strong>Infos :</strong> {{ sortie.infosSortie }}
</p>
<a href="#" class="btn btn-primary btn-sm">Voir plus</a>
</div>
<div class="bg-white rounded-lg shadow-md p-4">
<h2 class="text-lg font-semibold">{{ sortie.nom }}</h2>
<p class="mt-2 text-gray-600">
<strong>Date de début :</strong> {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}<br>
<strong>Durée :</strong> {{ sortie.duree }} minutes<br>
<strong>Inscriptions max :</strong> {{ sortie.nbInscriptionsMax }}<br>
<strong>Infos :</strong> {{ sortie.infosSortie }}
</p>
<div class="mt-4 flex justify-end">
<a href="#" class="text-blue-500 hover:text-blue-700 font-medium">Voir plus</a>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
{% endblock %}