templates/trajet/chercherResultats.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% import 'partials/avatar.html.twig' as avatar %}
  3. {% block title %}Résultats de recherche
  4. {% endblock %}
  5. {% block stylesheets %}{% endblock %}
  6. {% block body %}
  7. <div class="container py-5">
  8.     <div class="row">
  9.         {# Bouton pour mobile #}
  10.         <div class="d-lg-none text-center shadow-sm rounded py-1 mb-3">
  11.             <button class="btn btn-outline-secondary btn-sm" data-bs-toggle="offcanvas"
  12.                 data-bs-target="#offcanvasRecherche">
  13.                 <strong>{{ depart }}
  14.                     →
  15.                     {{ arrivee }}
  16.                     |
  17.                     {{ dateTrajetFr }}</strong>
  18.                 <span class="text-end">
  19.                     <i class="bi bi-pencil"></i>
  20.                 </span>
  21.             </button>
  22.         </div>
  23.         {# === FORMULAIRE INLINE POUR DESKTOP === #}
  24.         <form method="GET" id="form-recherche" action="{{ path('app_chercher') }}"
  25.             class="d-none d-lg-flex gap-2 align-items-center bg-white p-3 shadow-sm rounded mb-4">
  26.             <div class="input-group">
  27.                 <span class="input-group-text text-vert">
  28.                     <i class="bi bi-geo-fill"></i>
  29.                 </span>
  30.                 <div class="form-floating">
  31.                     <select id="select_departureD" name="select_departure" class="form-select villages"
  32.                         data-current="{{ depart }}" required>
  33.                         <option value="{{ depart }}" selected>{{ depart }}</option>
  34.                     </select>
  35.                     <label for="select_departureD">Village de départ</label>
  36.                 </div>
  37.             </div>
  38.             <div class="input-group">
  39.                 <span class="input-group-text text-vert">
  40.                     <i class="bi bi-flag-fill"></i>
  41.                 </span>
  42.                 <div class="form-floating">
  43.                     <select id="select_arrivalD" name="select_arrival" class="form-select villages"
  44.                         data-current="{{ arrivee }}" required>
  45.                         <option value="{{ arrivee }}" selected>{{ arrivee }}</option>
  46.                     </select>
  47.                     <label for="select_arrivalD">Village d'arrivée</label>
  48.                 </div>
  49.             </div>
  50.             <div class="input-group">
  51.                 <span class="input-group-text text-vert">
  52.                     <i class="bi bi-calendar2-event-fill"></i>
  53.                 </span>
  54.                 <div class="form-floating">
  55.                     <input type="text" id="date_trajetD" class="form-control dateDepart" name="date_trajet"
  56.                         value="{{ dateTrajet }}" placeholder="Date du trajet" required>
  57.                     <label for="date_trajetD">Date du trajet</label>
  58.                 </div>
  59.             </div>
  60.             <div class="input-group">
  61.                 <span class="input-group-text text-vert">
  62.                     <i class="bi bi-person-fill"></i>
  63.                 </span>
  64.                 <div class="form-floating">
  65.                     <select class="form-select" id="floatingSelectGridD" name="places_min">
  66.                         {% for i in 1..8 %}
  67.                         <option value="{{ i }}" {% if i==places %} selected {% endif %}>{{ i }}</option>
  68.                         {% endfor %}
  69.                     </select>
  70.                     <label for="floatingSelectGridD">Passager(s)</label>
  71.                 </div>
  72.             </div>
  73.             <button type="submit" class="btn btn-orange btn-lg">Rechercher</button>
  74.         </form>
  75.         {# === OFFCANVAS POUR MOBILE === #}
  76.         <div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasRecherche" style="height: 60vh;">
  77.             <div class="offcanvas-header">
  78.                 <h5 class="offcanvas-title">Modifier la recherche</h5>
  79.                 <button type="button" class="btn-close" data-bs-dismiss="offcanvas"></button>
  80.             </div>
  81.             <div class="offcanvas-body">
  82.                 <form method="GET" action="{{ path('app_chercher') }}" class="d-flex flex-column gap-3">
  83.                     <div class="input-group">
  84.                         <span class="input-group-text text-vert">
  85.                             <i class="bi bi-geo-fill"></i>
  86.                         </span>
  87.                         <div class="form-floating">
  88.                             <select id="select_departure" name="select_departure" class="form-select villages"
  89.                                 data-current="{{ depart }}" required>
  90.                                 <option value="{{ depart }}" selected>{{ depart }}</option>
  91.                             </select>
  92.                             <label for="select_departure">Village de départ</label>
  93.                         </div>
  94.                     </div>
  95.                     <div class="input-group">
  96.                         <span class="input-group-text text-vert">
  97.                             <i class="bi bi-flag-fill"></i>
  98.                         </span>
  99.                         <div class="form-floating">
  100.                             <select id="select_arrival" name="select_arrival" class="form-select villages"
  101.                                 data-current="{{ arrivee }}" required>
  102.                                 <option value="{{ arrivee }}" selected>{{ arrivee }}</option>
  103.                             </select>
  104.                             <label for="select_arrival">Village d'arrivée</label>
  105.                         </div>
  106.                     </div>
  107.                     <div class="input-group">
  108.                         <span class="input-group-text text-vert">
  109.                             <i class="bi bi-calendar2-event-fill"></i>
  110.                         </span>
  111.                         <div class="form-floating">
  112.                             <input type="text" id="date_trajet" class="form-control dateDepart" name="date_trajet"
  113.                                 value="{{ dateTrajet }}" placeholder="Date du trajet" required>
  114.                             <label for="date_trajet">Date du trajet</label>
  115.                         </div>
  116.                     </div>
  117.                     <div class="input-group">
  118.                         <span class="input-group-text text-vert">
  119.                             <i class="bi bi-person-fill"></i>
  120.                         </span>
  121.                         <div class="form-floating">
  122.                             <select class="form-select" id="floatingSelectGrid" name="places_min">
  123.                                 {% for i in 1..8 %}
  124.                                 <option value="{{ i }}" {% if i==places %} selected {% endif %}>{{ i }}</option>
  125.                                 {% endfor %}
  126.                             </select>
  127.                             <label for="floatingSelectGrid">Passager(s)</label>
  128.                         </div>
  129.                     </div>
  130.                     <button type="submit" class="btn btn-orange w-100">Rechercher</button>
  131.                 </form>
  132.             </div>
  133.         </div>
  134.     </div>
  135.     <div class="row">
  136.         {# Colonne gauche : Filtres (visible seulement en desktop) #}
  137.         <div class="col-md-3 d-none d-md-block bg-light border-end" style="min-height: 70vh; position: sticky; top: 0;">
  138.             <div class="p-3">
  139.                 <h5 class="fw-bold">Filtres</h5>
  140.                 <p class="text-muted">Aucun filtre disponible</p>
  141.             </div>
  142.         </div>
  143.         {# Colonne droite : Résultats #}
  144.         <div class="col-md-9 col-12">
  145.             <div class="d-md-none p-3 text-end">
  146.                 <button id="filter-btn" class="btn btn-outline-secondary btn-sm">
  147.                     <i class="bi bi-funnel"></i>
  148.                     Filtrer
  149.                 </button>
  150.             </div>
  151.             <div class="p-3">
  152.                 {# Les onglets #}
  153.                 <ul class="nav nav-tabs mb-4" id="resultTabs" role="tablist">
  154.                     <li class="nav-item" role="presentation">
  155.                         <button class="nav-link active fw-bold" id="trajets-exacts-tab" data-bs-toggle="tab"
  156.                             data-bs-target="#trajets-exacts" type="button" role="tab">
  157.                             <i class="bi bi-car-front"></i> Résultats • {{ trajets|length }}
  158.                         </button>
  159.                     </li>
  160.                     <li class="nav-item" role="presentation">
  161.                         <button class="nav-link fw-bold" id="trajets-autres-tab" data-bs-toggle="tab"
  162.                             data-bs-target="#trajets-autres" type="button" role="tab">
  163.                             <i class="bi bi-car-front"></i> Autres départs • {{ autresTrajets|length }}
  164.                         </button>
  165.                     </li>
  166.                 </ul>
  167.                 <div class="tab-content">
  168.                     <div class="tab-pane fade show active" id="trajets-exacts" role="tabpanel"
  169.                         aria-labelledby="trajets-exacts-tab">
  170.                         <p>
  171.                             <small>Résultat(s) pour
  172.                                 <b>{{ depart }}
  173.                                     →
  174.                                     {{ arrivee }}</b>
  175.                             </small>
  176.                             <small class="small-sm">
  177.                                 | le
  178.                                 {{ dateTrajetFr }}</small>
  179.                         </p>
  180.                         {# Bloc déjà existant : résultats exacts #}
  181.                         {% include 'partials/_resultats_trajets.html.twig' with { trajets: trajets, depart: depart,
  182.                         arrivee: arrivee, places: places } %}
  183.                     </div>
  184.                     <div class="tab-pane fade" id="trajets-autres" role="tabpanel" aria-labelledby="trajets-autres-tab">
  185.                         <p>
  186.                             <small>Résultat(s) pour
  187.                                 <b> Autres départs
  188.                                     →
  189.                                     {{ arrivee }}</b>
  190.                             </small>
  191.                             <small class="small-sm">
  192.                                 | le
  193.                                 {{ dateTrajetFr }}</small>
  194.                         </p>
  195.                         {# On réutilise temporairement les mêmes trajets pour tester visuellement #}
  196.                         {% include 'partials/_resultats_trajets.html.twig' with { trajets: autresTrajets, depart:
  197.                         depart, arrivee: arrivee, places: places } %}
  198.                     </div>
  199.                 </div>
  200.             </div>
  201.         </div>
  202.     </div>
  203. </div>
  204. {% endblock %}
  205. {% block javascripts %}
  206. <script>
  207.     document.addEventListener('DOMContentLoaded', function () {
  208.         document.querySelectorAll('.trajet-passe').forEach(function (el) {
  209.             el.addEventListener('click', function (e) {
  210.                 e.preventDefault();
  211.                 Swal.fire({
  212.                     icon: 'info',
  213.                     title: 'Trajet déjà commencé',
  214.                     text: 'Ce trajet a déjà débuté aujourd\'hui et ne peut plus être réservé.',
  215.                     confirmButtonText: 'Ok',
  216.                     confirmButtonColor: '#ff6f00'
  217.                 });
  218.             });
  219.         });
  220.     });
  221. </script>
  222. <script>
  223.     document.getElementById('filter-btn').addEventListener('click', function () {
  224.         Swal.fire({
  225.             icon: 'info',
  226.             title: 'Aucun filtre disponible',
  227.             text: 'Les filtres seront bientôt disponibles.',
  228.             confirmButtonText: 'Ok',
  229.             confirmButtonColor: '#ff6f00'
  230.         });
  231.     });
  232. </script>
  233. {% endblock %}