templates/public/events/_filters.html.twig line 1

  1. <aside class="filters-panel">
  2.     <div class="filters-panel__header">
  3.         <h3>Búsqueda</h3>
  4.     </div>
  5.     <form method="get" class="filters-form">
  6.         <input type="hidden" name="view" value="{{ view|default('list') }}">
  7.         <div class="filter-field filter-field--text">
  8.             <label class="filter-label" for="filter-query">Nombre del curso</label>
  9.             <input class="filter-control filter-control--text" id="filter-query" type="text" name="q" value="{{ search }}">
  10.         </div>
  11.         <div class="filter-field filter-field--select">
  12.             <label class="filter-label" for="filter-modalidad">Modalidad</label>
  13.             <select class="filter-control filter-control--select" id="filter-modalidad" name="modalidad">
  14.                 <option value="">Todas</option>
  15.                 {% for m in modalidades %}
  16.                     <option value="{{ m.id }}"
  17.                         {{ modalidad and modalidad.id == m.id ? 'selected' : '' }}>
  18.                         {{ m.label }}
  19.                     </option>
  20.                 {% endfor %}
  21.             </select>
  22.         </div>
  23.         <div class="filter-field filter-field--select">
  24.             <label class="filter-label" for="filter-area-tematica">Área Temática</label>
  25.             <select class="filter-control filter-control--select" id="filter-area-tematica" name="areaTematica">
  26.                 <option value="">Todas</option>
  27.                 {% for a in areasTematicas %}
  28.                     <option value="{{ a.id }}"
  29.                         {{ areaTematica and areaTematica.id == a.id ? 'selected' : '' }}>
  30.                         {{ a.label }}
  31.                     </option>
  32.                 {% endfor %}
  33.             </select>
  34.         </div>
  35.         <div class="filter-field filter-field--text">
  36.             <label class="filter-label" for="filter-code">Código</label>
  37.             <input class="filter-control filter-control--text" id="filter-code" type="text" name="code" value="{{ code }}">
  38.         </div>
  39.         <div class="filter-field filter-field--dates">
  40.             <label class="filter-label" for="filter-start-from">Fecha de inicio</label>
  41.             <div class="double-field">
  42.                 <input class="filter-control filter-control--date" id="filter-start-from" type="date" name="start_from" value="{{ start_from }}" aria-label="Fecha de inicio desde">
  43.                 <input class="filter-control filter-control--date" id="filter-start-to" type="date" name="start_to" value="{{ start_to }}" aria-label="Fecha de inicio hasta">
  44.             </div>
  45.         </div>
  46.         <div class="filter-field filter-field--range">
  47.             <label class="filter-label" for="rangeMin">Duración (horas)</label>
  48.             <div class="range-values">
  49.                 <span id="minVal"></span>
  50.                 <span>–</span>
  51.                 <span id="maxVal"></span>
  52.             </div>
  53.             <div class="range-slider">
  54.                 <div class="range-track"></div>
  55.                 <input type="range"
  56.                     id="rangeMin"
  57.                     name="durationFrom"
  58.                     min="{{ hoursRange.minHours }}"
  59.                     max="{{ hoursRange.maxHours }}"
  60.                     value="{{ app.request.get('durationFrom') ?? hoursRange.minHours }}"
  61.                     aria-label="Duración mínima">
  62.                 <input type="range"
  63.                     id="rangeMax"
  64.                     name="durationTo"
  65.                     min="{{ hoursRange.minHours }}"
  66.                     max="{{ hoursRange.maxHours }}"
  67.                     value="{{ app.request.get('durationTo') ?? hoursRange.maxHours }}"
  68.                     aria-label="Duración máxima">
  69.             </div>
  70.         </div>
  71.         <div class="filter-field filter-field--checkbox">
  72.             <div class="checkbox-filter">
  73.                 <input class="filter-checkbox"
  74.                     id="filter-open-inscription"
  75.                     type="checkbox"
  76.                     name="open_inscription"
  77.                     value="1"
  78.                     {{ app.request.get('open_inscription') ? 'checked' : '' }}>
  79.                 <label class="checkbox-filter__text" for="filter-open-inscription">Solo cursos con inscripción abierta</label>
  80.             </div>
  81.         </div>
  82.         <div class="filter-buttons filter-actions">
  83.             <button type="submit" class="btn-apply filter-button filter-button--primary">Buscar</button>
  84.             <a href="{{ path('public_events') }}" class="btn-clear filter-button filter-button--secondary">Limpiar</a>
  85.         </div>
  86.     </form>
  87. </aside>
  88. <script>
  89.     const rangeMin = document.getElementById("rangeMin");
  90.     const rangeMax = document.getElementById("rangeMax");
  91.     const rangeTrack = document.querySelector(".range-track");
  92.     const minVal = document.getElementById("minVal");
  93.     const maxVal = document.getElementById("maxVal");
  94.     const minGap = 0;
  95.     const sliderMin = parseInt(rangeMin.min);
  96.     const sliderMax = parseInt(rangeMin.max);
  97.     function updateRange() {
  98.         let minValue = parseInt(rangeMin.value);
  99.         let maxValue = parseInt(rangeMax.value);
  100.         if (maxValue - minValue <= minGap) {
  101.             if (event?.target === rangeMin) {
  102.                 rangeMin.value = maxValue - minGap;
  103.                 minValue = rangeMin.value;
  104.             } else {
  105.                 rangeMax.value = minValue + minGap;
  106.                 maxValue = rangeMax.value;
  107.             }
  108.         }
  109.         minVal.textContent = minValue + ' h';
  110.         maxVal.textContent = maxValue + ' h';
  111.         const percent1 = ((minValue - sliderMin) / (sliderMax - sliderMin)) * 100;
  112.         const percent2 = ((maxValue - sliderMin) / (sliderMax - sliderMin)) * 100;
  113.         rangeTrack.style.background =
  114.             `linear-gradient(to right,
  115.             #dbe3e9 ${percent1}%,
  116.             var(--color-primary) ${percent1}%,
  117.             var(--color-primary) ${percent2}%,
  118.             #dbe3e9 ${percent2}%)`;
  119.     }
  120.     rangeMin.addEventListener("input", updateRange);
  121.     rangeMax.addEventListener("input", updateRange);
  122.     updateRange();
  123. </script>