des trucs
This commit is contained in:
@@ -44,7 +44,6 @@ class AdminController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
//Gestion des utilisateurs
|
||||
#[Route('/admin/user', name: 'app_adminUser')]
|
||||
public function adminUser(TokenStorageInterface $tokenStorage): Response
|
||||
{
|
||||
@@ -59,68 +58,56 @@ class AdminController extends AbstractController
|
||||
#[Route('/admin/user/disable/{id}', name: 'app_adminUserDisable')]
|
||||
public function disableParticipant(string $id, ParticipantRepository $participantRepository, EntityManagerInterface $entityManager): RedirectResponse
|
||||
{
|
||||
// Récupérer le participant à partir de l'id
|
||||
$participant = $participantRepository->find($id);
|
||||
|
||||
// Vérifier si le participant existe
|
||||
if (!$participant) {
|
||||
$this->addFlash('error', 'Le participant demandé n\'existe pas.');
|
||||
return $this->redirectToRoute('app_adminUser'); // Redirigez vers une liste ou une autre page
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
}
|
||||
|
||||
// Désactiver le participant (par exemple, définir une propriété "isActive" à false)
|
||||
if ($participant->isActif()){
|
||||
$participant->setActif(false);
|
||||
}else{
|
||||
$participant->setActif(true);
|
||||
}
|
||||
|
||||
// Sauvegarder la modification en base de données
|
||||
$entityManager->persist($participant);
|
||||
$entityManager->flush();
|
||||
|
||||
// Ajouter un message de succès et rediriger
|
||||
$this->addFlash('success', 'Participant désactivé avec succès.');
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
}
|
||||
#[Route('/admin/user/delete/{id}', name: 'app_adminUserDelete')]
|
||||
public function deleteUser(string $id, ParticipantRepository $participantRepository, EntityManagerInterface $entityManager): RedirectResponse
|
||||
{
|
||||
// Récupérer l'utilisateur ou le participant à partir de l'id
|
||||
$participant = $participantRepository->find($id);
|
||||
|
||||
// Vérifier si l'utilisateur existe
|
||||
if (!$participant) {
|
||||
$this->addFlash('error', 'L\'utilisateur demandé n\'existe pas.');
|
||||
return $this->redirectToRoute('app_adminUser'); // Redirigez vers une liste ou une autre page
|
||||
}
|
||||
|
||||
// Supprimer l'utilisateur
|
||||
$entityManager->remove($participant);
|
||||
$entityManager->flush();
|
||||
|
||||
// Ajouter un message de succès et rediriger
|
||||
$this->addFlash('success', 'Utilisateur supprimé avec succès.');
|
||||
return $this->redirectToRoute('app_adminUser'); // Redirigez vers la liste des utilisateurs
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
}
|
||||
#[Route('/admin/user/add', name: 'app_adminUserAdd', methods: ['POST'])]
|
||||
public function userAdd(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator): Response
|
||||
{
|
||||
try {
|
||||
// Récupérer les données envoyées par le formulaire
|
||||
$nom = $request->request->get('nom');
|
||||
$prenom = $request->request->get('prenom');
|
||||
$pseudo = $request->request->get('pseudo');
|
||||
$telephone = $request->request->get('phone');
|
||||
$mail = $request->request->get('mail');
|
||||
|
||||
// Vérifier que les champs ne sont pas vides
|
||||
if (!$mail || !$pseudo) {
|
||||
$this->addFlash('error', 'Tous les champs sont requis.');
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
}
|
||||
|
||||
// Vérifier que le mail est valide avec une regex
|
||||
if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
|
||||
$this->addFlash('error', 'L\'adresse e-mail n\'est pas valide.');
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
@@ -140,10 +127,8 @@ class AdminController extends AbstractController
|
||||
|
||||
$entityManager->persist($participant);
|
||||
|
||||
// Générer un token unique
|
||||
$token = bin2hex(random_bytes(32));
|
||||
|
||||
// Enregistrer le token dans la base de données
|
||||
$passwordResetToken = new PasswordResetToken();
|
||||
$passwordResetToken->setToken($token)
|
||||
->setEmail($participant->getEmail())
|
||||
@@ -152,14 +137,12 @@ class AdminController extends AbstractController
|
||||
$entityManager->persist($passwordResetToken);
|
||||
$entityManager->flush();
|
||||
|
||||
// Générer un lien de réinitialisation
|
||||
$resetLink = $urlGenerator->generate(
|
||||
'app_password_reset',
|
||||
['token' => $token],
|
||||
UrlGeneratorInterface::ABSOLUTE_URL
|
||||
);
|
||||
|
||||
// Envoyer un email de notification
|
||||
$email = (new Email())
|
||||
->from('contact@sortir.com')
|
||||
->to($participant->getEmail())
|
||||
@@ -205,10 +188,8 @@ class AdminController extends AbstractController
|
||||
$participant->setPending(true);
|
||||
$em->persist($participant);
|
||||
|
||||
// Générer un token unique
|
||||
$token = bin2hex(random_bytes(32));
|
||||
|
||||
// Enregistrer le token dans la base de données
|
||||
$passwordResetToken = new PasswordResetToken();
|
||||
$passwordResetToken->setToken($token)
|
||||
->setEmail($participant->getEmail())
|
||||
@@ -216,14 +197,12 @@ class AdminController extends AbstractController
|
||||
|
||||
$em->persist($passwordResetToken);
|
||||
|
||||
// Générer un lien de réinitialisation
|
||||
$resetLink = $urlGenerator->generate(
|
||||
'app_password_reset',
|
||||
['token' => $token],
|
||||
UrlGeneratorInterface::ABSOLUTE_URL
|
||||
);
|
||||
|
||||
// Envoyer un email de notification
|
||||
$email = (new Email())
|
||||
->from('contact@sortir.com')
|
||||
->to($participant->getEmail())
|
||||
@@ -252,7 +231,6 @@ class AdminController extends AbstractController
|
||||
// $participants = $participantRepository->findAll();
|
||||
$userList = $request->request->all('userList');
|
||||
if (empty($userList)) {
|
||||
// Aucun utilisateur sélectionné
|
||||
$this->addFlash('warning', 'Veuillez sélectionner au moins un utilisateur.');
|
||||
return $this->redirectToRoute('app_adminUser');
|
||||
}
|
||||
@@ -279,7 +257,6 @@ class AdminController extends AbstractController
|
||||
return $response;
|
||||
}
|
||||
|
||||
//Gestion des sites
|
||||
#[Route('/admin/site', name: 'app_adminSite')]
|
||||
public function adminSite(SiteRepository $siteRepository, TokenStorageInterface $tokenStorage): Response
|
||||
{
|
||||
@@ -295,19 +272,15 @@ class AdminController extends AbstractController
|
||||
public function adminSiteAdd(Request $request, EntityManagerInterface $entityManager): Response
|
||||
{
|
||||
try {
|
||||
// Récupérer les données envoyées par le formulaire
|
||||
$nom = $request->request->get('nom');
|
||||
|
||||
// Vérifier que les champs ne sont pas vides
|
||||
if (!$nom) {
|
||||
return new Response('Tous les champs sont requis.', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
// Créer une nouvelle entité City et définir ses propriétés
|
||||
$site = new Site();
|
||||
$site->setNom($nom);
|
||||
|
||||
// Enregistrer la ville dans la base de données
|
||||
$entityManager->persist($site);
|
||||
$entityManager->flush();
|
||||
$this->addFlash('success', "Site ajouté !");
|
||||
@@ -320,17 +293,13 @@ class AdminController extends AbstractController
|
||||
#[Route('/admin/site/delete/{id}', name: 'app_adminSiteDelete')]
|
||||
public function adminSiteDelete(string $id, SiteRepository $siteRepository, EntityManagerInterface $entityManager): RedirectResponse
|
||||
{
|
||||
// Récupérer la ville à supprimer
|
||||
$site = $siteRepository->find($id);
|
||||
|
||||
// Vérifier si la ville existe
|
||||
if (!$site) {
|
||||
// Si la ville n'existe pas, rediriger avec un message d'erreur
|
||||
$this->addFlash('error', 'Le site demandée n\'existe pas.');
|
||||
return $this->redirectToRoute('app_adminSite'); // Rediriger vers la liste des villes
|
||||
}
|
||||
|
||||
// Supprimer la ville
|
||||
$entityManager->remove($site);
|
||||
$entityManager->flush();
|
||||
|
||||
|
||||
@@ -20,10 +20,8 @@ class LoginController extends AbstractController
|
||||
return $this->redirectToRoute('home'); // Redirection pour utilisateurs connectés
|
||||
}
|
||||
|
||||
// get the login error if there is one
|
||||
$error = $authenticationUtils->getLastAuthenticationError();
|
||||
|
||||
// last username entered by the user
|
||||
$lastUsername = $authenticationUtils->getLastUsername();
|
||||
$user = new Participant();
|
||||
$formUser = $this->createForm(RegistrationFormType::class, $user);
|
||||
@@ -38,7 +36,6 @@ class LoginController extends AbstractController
|
||||
#[Route(path: '/logout', name: 'app_logout')]
|
||||
public function logout(Security $security): ?Response
|
||||
{
|
||||
// throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
|
||||
return $security->logout(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ class MainController extends AbstractController
|
||||
#[Route('/', name: 'home')]
|
||||
public function home(SortieRepository $sortieRepository, TokenStorageInterface $tokenStorage,): Response
|
||||
{
|
||||
// Récupérer les 5 dernières sorties
|
||||
$latestSorties = $sortieRepository->findBy([], ['dateHeureDebut' => 'DESC'], 5);
|
||||
$dateLimit = new \DateTime();
|
||||
$dateLimit->modify('-30 days'); // Date limite = il y a 30 jours
|
||||
|
||||
@@ -30,16 +30,13 @@ class PasswordResetController extends AbstractController
|
||||
try{
|
||||
$email = $request->request->get('email');
|
||||
|
||||
// Vérifier si l'email est valide
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$this->addFlash('error', 'Adresse e-mail invalide.');
|
||||
return $this->redirectToRoute('app_login');
|
||||
}
|
||||
|
||||
// Générer un token unique
|
||||
$token = bin2hex(random_bytes(32));
|
||||
|
||||
// Enregistrer le token dans la base de données
|
||||
$passwordResetToken = new PasswordResetToken();
|
||||
$passwordResetToken->setToken($token)
|
||||
->setEmail($email)
|
||||
@@ -55,7 +52,6 @@ class PasswordResetController extends AbstractController
|
||||
UrlGeneratorInterface::ABSOLUTE_URL
|
||||
);
|
||||
|
||||
// Envoyer l'email avec le lien
|
||||
$email = (new Email())
|
||||
->from('contact@sortir.com')
|
||||
->to($email)
|
||||
@@ -79,7 +75,6 @@ class PasswordResetController extends AbstractController
|
||||
Request $request,
|
||||
EntityManagerInterface $entityManager,
|
||||
): Response {
|
||||
// Vérifier si le token existe
|
||||
$repository = $entityManager->getRepository(PasswordResetToken::class);
|
||||
$passwordResetToken = $repository->findOneBy(['token' => $token]);
|
||||
|
||||
@@ -88,14 +83,11 @@ class PasswordResetController extends AbstractController
|
||||
return $this->redirectToRoute('app_login');
|
||||
}
|
||||
|
||||
// Si la requête est POST, traiter le nouveau mot de passe
|
||||
if ($request->isMethod('POST')) {
|
||||
$newPassword = $request->request->get('password');
|
||||
$newPasswordConfirm = $request->request->get('passwordConfirm');
|
||||
|
||||
// Vérifier si les mots de passe sont identiques
|
||||
if ($newPassword !== $newPasswordConfirm) {
|
||||
// Les mots de passe ne correspondent pas
|
||||
$this->addFlash('error', 'Les mots de passe ne correspondent pas.');
|
||||
return $this->redirectToRoute('app_password_reset'); // Vous pouvez rediriger vers la page de réinitialisation
|
||||
}
|
||||
@@ -105,7 +97,6 @@ class PasswordResetController extends AbstractController
|
||||
return $this->redirectToRoute('app_password_reset', ['token' => $token]);
|
||||
}
|
||||
|
||||
// Récupérer l'utilisateur et mettre à jour le mot de passe
|
||||
$user = $entityManager->getRepository(Participant::class)->findOneBy(['email' => $passwordResetToken->getEmail()]);
|
||||
$user->setPassword(password_hash($newPassword, PASSWORD_BCRYPT));
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ class RegistrationController extends AbstractController
|
||||
/** @var string $plainPassword */
|
||||
$plainPassword = $form->get('plainPassword')->getData();
|
||||
|
||||
// encode the plain password
|
||||
$user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword));
|
||||
$user->setRoles(['ROLE_USER']);
|
||||
$user->setActif(false);
|
||||
@@ -47,7 +46,6 @@ class RegistrationController extends AbstractController
|
||||
return $this->redirectToRoute('app_register');
|
||||
}
|
||||
|
||||
// do anything else you need here, like send an email
|
||||
|
||||
return $this->render('main/inscription.html.twig', ['fullName' => $fullName]);
|
||||
// return $security->login($user, 'form_login', 'main');
|
||||
|
||||
@@ -33,7 +33,6 @@ class SortieController extends AbstractController
|
||||
$token = $tokenStorage->getToken();
|
||||
$userConnect = $token?->getUser();
|
||||
|
||||
// Récupérer les paramètres de filtre
|
||||
$search = $request->query->get('search', '');
|
||||
$siteId = $request->query->get('site', '');
|
||||
$startDate = $request->query->get('start_date', '');
|
||||
@@ -43,7 +42,6 @@ class SortieController extends AbstractController
|
||||
$nonInscrit = $request->query->get('non_inscrit', false);
|
||||
$passees = $request->query->get('passees', false);
|
||||
|
||||
// Recherche par nom de sortie
|
||||
$sorties = $sortieRepository->findWithFilters($search, $siteId, $startDate, $endDate, $organisateur, $inscrit, $nonInscrit, $passees, $userConnect);
|
||||
|
||||
return $this->render('sortie/list.html.twig', [
|
||||
@@ -81,20 +79,17 @@ class SortieController extends AbstractController
|
||||
return $this->redirectToRoute('sortie_create');
|
||||
}
|
||||
|
||||
// Vérifier le participant (organisateur)
|
||||
$participant = $participantRepository->find($userConnect->getIdParticipant());
|
||||
if (!$participant) {
|
||||
$this->addFlash('error', 'Impossible de trouver votre profil.');
|
||||
return $this->redirectToRoute('sortie_create');
|
||||
}
|
||||
|
||||
// Gérer l'image (upload)
|
||||
$imageFile = $form->get('imageFile')->getData();
|
||||
if ($imageFile) {
|
||||
$sortie->setImageFile($imageFile);
|
||||
}
|
||||
|
||||
// Définir les relations et l'état initial
|
||||
$etat = $etatRepository->findOneBy(['libelle' => 'Créée']);
|
||||
if (!$etat) {
|
||||
$this->addFlash('error', 'Erreur interne : état introuvable.');
|
||||
@@ -235,13 +230,11 @@ class SortieController extends AbstractController
|
||||
$sortie->setLieu($lieu);
|
||||
}
|
||||
|
||||
// Gestion du fichier image
|
||||
$imageFile = $form->get('imageFile')->getData();
|
||||
if ($imageFile) {
|
||||
$sortie->setImageFile($imageFile);
|
||||
}
|
||||
|
||||
// Sauvegarde des modifications
|
||||
$entityManager->flush();
|
||||
|
||||
$this->addFlash('success', 'Les modifications ont été enregistrées.');
|
||||
|
||||
@@ -23,12 +23,10 @@ class UserProfileListener implements EventSubscriberInterface
|
||||
{
|
||||
$token = $this->tokenStorage->getToken();
|
||||
|
||||
// Vérifie si l'utilisateur est connecté
|
||||
if ($token && $token->getUser()) {
|
||||
$profile = $token->getUser(); // Récupère l'utilisateur connecté
|
||||
$profile = $token->getUser();
|
||||
$event->getRequest()->attributes->set('profile', $profile);
|
||||
|
||||
// Ajoute 'profile' à toutes les vues Twig
|
||||
$this->twig->addGlobal('profile', $profile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Modale pour ajouter une ville -->
|
||||
<div id="resetModal" class="fixed inset-0 z-50 hidden bg-gray-900 bg-opacity-50">
|
||||
<div class="flex justify-center items-center min-h-screen">
|
||||
<div class="bg-white p-6 rounded shadow-md w-1/3">
|
||||
@@ -61,12 +60,10 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Ouvrir la modale
|
||||
document.getElementById('openModal').addEventListener('click', function() {
|
||||
document.getElementById('resetModal').classList.remove('hidden');
|
||||
});
|
||||
|
||||
// Fermer la modale
|
||||
document.getElementById('closeModal').addEventListener('click', function() {
|
||||
document.getElementById('resetModal').classList.add('hidden');
|
||||
});
|
||||
|
||||
@@ -14,13 +14,11 @@
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<nav class="flex justify-between items-center py-4 px-6 shadow-md bg-gradient-to-r from-[#2A8D57] via-[#008167] to-[#1B5667]">
|
||||
<!-- Logo et Titre -->
|
||||
<a href="/" class="flex items-center space-x-3">
|
||||
<img src="{{ asset('img/logo.svg') }}" alt="Logo" class="h-10">
|
||||
<h3 class="text-3xl text-white font-bold">Sortie</h3>
|
||||
</a>
|
||||
|
||||
<!-- Navigation principale -->
|
||||
<ul class="hidden md:flex space-x-6 text-white font-medium">
|
||||
<li>
|
||||
<a href="{{ path('home') }}"
|
||||
@@ -42,7 +40,6 @@
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Profil utilisateur -->
|
||||
<div class="relative">
|
||||
{% if app.user %}
|
||||
<button id="profile-menu" class="flex items-center space-x-2 focus:outline-none">
|
||||
@@ -69,7 +66,6 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Menu mobile -->
|
||||
<button id="mobile-menu-button" class="md:hidden text-white focus:outline-none">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
@@ -77,7 +73,6 @@
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
<!-- Menu mobile (hidden par défaut) -->
|
||||
<div id="mobile-menu" class="hidden bg-gradient-to-r from-[#2A8D57] via-[#008167] to-[#1B5667] text-white py-4 md:hidden">
|
||||
<ul class="space-y-4 px-6">
|
||||
<li><a href="{{ path('home') }}" class="block hover:text-gray-200">Accueil</a></li>
|
||||
@@ -89,9 +84,7 @@
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
// Toggle menu pour mobile
|
||||
const mobileMenuButton = document.getElementById('mobile-menu-button');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
|
||||
@@ -99,7 +92,6 @@
|
||||
mobileMenu.classList.toggle('hidden');
|
||||
});
|
||||
|
||||
// Toggle menu déroulant pour le profil
|
||||
const profileMenuButton = document.getElementById('profile-menu');
|
||||
const dropdown = document.getElementById('dropdown');
|
||||
|
||||
@@ -109,7 +101,6 @@
|
||||
dropdown.classList.toggle('hidden');
|
||||
});
|
||||
|
||||
// Fermer le menu lorsqu'on clique ailleurs
|
||||
document.addEventListener('click', (event) => {
|
||||
if (!dropdown.classList.contains('hidden')) {
|
||||
const isClickInsideMenu = dropdown.contains(event.target) || profileMenuButton.contains(event.target);
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<style>
|
||||
.swiper-container {
|
||||
width: 100%;
|
||||
height: 500px; /* Ajustez selon vos besoins */
|
||||
height: 500px;
|
||||
}
|
||||
|
||||
.swiper-slide {
|
||||
@@ -56,7 +56,7 @@
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet-active {
|
||||
background: #16a34a; /* Vert plus foncé pour le point actif */
|
||||
background: #16a34a;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
@@ -65,7 +65,6 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="container mx-auto py-10">
|
||||
<!-- Section carrousel -->
|
||||
<h2 class="text-4xl font-bold text-center mb-8">Dernières sorties</h2>
|
||||
<div class="w-full relative">
|
||||
<div class="swiper default-carousel swiper-container">
|
||||
@@ -99,7 +98,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section des événements terminés -->
|
||||
<div class="mt-12">
|
||||
<h2 class="text-3xl font-bold text-center mb-6">Événements terminés</h2>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
@@ -123,7 +121,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Inclure les fichiers JavaScript Swiper -->
|
||||
{% block javascripts %}
|
||||
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
|
||||
<script>
|
||||
|
||||
@@ -31,17 +31,14 @@
|
||||
<div class="container mx-auto p-4 sm:p-6 bg-gray-50 rounded-lg shadow-lg mt-4 sm:mt-6">
|
||||
<h1 class="text-2xl sm:text-3xl font-bold text-center text-gray-800 mb-6 sm:mb-8">🎉 Liste des sorties</h1>
|
||||
|
||||
<!-- Formulaire de recherche -->
|
||||
<form method="GET" action="{{ path('home') }}" class="bg-white rounded-lg shadow-md p-4 mb-6">
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6">
|
||||
<!-- Recherche -->
|
||||
<div>
|
||||
<label for="search" class="block text-sm font-medium text-gray-700">🔍 Recherche</label>
|
||||
<input type="text" name="search" id="search" value="{{ app.request.query.get('search', '') }}"
|
||||
class="block w-full mt-2 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
|
||||
placeholder="Nom de la sortie">
|
||||
</div>
|
||||
<!-- Site -->
|
||||
<div>
|
||||
<label for="site" class="block text-sm font-medium text-gray-700">📍 Site</label>
|
||||
<select name="site" id="site" class="block w-full mt-2 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm">
|
||||
@@ -53,13 +50,11 @@
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<!-- Date de début -->
|
||||
<div>
|
||||
<label for="start_date" class="block text-sm font-medium text-gray-700">📅 Date de début</label>
|
||||
<input type="date" name="start_date" id="start_date" value="{{ app.request.query.get('start_date', '') }}"
|
||||
class="block w-full mt-2 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm">
|
||||
</div>
|
||||
<!-- Date de fin -->
|
||||
<div>
|
||||
<label for="end_date" class="block text-sm font-medium text-gray-700">📅 Date de fin</label>
|
||||
<input type="date" name="end_date" id="end_date" value="{{ app.request.query.get('end_date', '') }}"
|
||||
@@ -67,7 +62,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Options supplémentaires -->
|
||||
<div class="mt-4 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<div class="flex items-center">
|
||||
<input type="checkbox" name="organisateur" id="organisateur" value="1"
|
||||
@@ -95,7 +89,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bouton de filtrage -->
|
||||
<div class="mt-6 flex justify-end">
|
||||
<button type="submit" class="btnPrimary">
|
||||
🔎 Filtrer
|
||||
@@ -103,7 +96,6 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Liste des sorties -->
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 sm:gap-6">
|
||||
<a href="/sortie/creates" class="hidden sm:block">
|
||||
<div class="bg-white rounded-lg shadow-md p-4 text-center">
|
||||
|
||||
Reference in New Issue
Block a user