theme/templates/blocks/block_list/block_list.episodes.html.twig line 1

Open in your IDE?
  1. {# BLOCK LISTA #}
  2. {% if blockscontent %}
  3. {% import 'blocks\\macros.html.twig' as macros %}
  4. <section class="{{ blockSequence|default }} block-list episodes{% if settings.light_mode|default == 1 %} light-mode{% endif %} {{ settings.extra_class|default(null) }}" style="{{ macros.getStyles(settings) }}" {{ macros.getBlockDataAttributes(_context) }}>
  5.     <div class="{% if settings.fullwidth|default(0) != 1 %}container{% else %}w-100{% endif %}">
  6.     {% if settings.carousel|default == '1' or settings.carousel_1175|default == '1' or settings.carousel_600|default == '1' or settings.carousel_480|default == '1' %}
  7.         {% import 'blocks\\block_list\\block_list.default.settings.twig' as slick_settings %}
  8.         <div class="slick-carousel programs-list__carousel" data-slick='{{slick_settings.getSlick_Settings(settings)|replace({"\n":""})}}' style="--block-list-gap:{{ settings.items_gap|default('var(--margin)') }};">
  9.     {% else %}
  10.     {% set temporadas = studio.getVariable('temporadas')|default([]) %}
  11.     {{ studio.setVariable('temporadas', []) }}
  12.     {% set temporadas = temporadas|filter(v => v is not null) %}
  13.     {% set temporadas = temporadas|reduce((carry, item) => item in carry ? carry : carry|merge([item]), []) %}
  14.     {% set temporadas = temporadas|sort %}
  15.         <div class="program__episodes">
  16.             <div class="row justify-content-between align-items-center">
  17.                 <div class="col-12 col-lg-auto ">
  18.                     <h2 class="program__episodes--title mb-2 mb-lg-0">{{fields.title|default}}</h2>
  19.                 </div>
  20.                 <div class="col-12 col-lg-auto">
  21.                     {% if temporadas is not empty %}
  22.                     <div hidden class="select-wrapper w-100">
  23.                         <select name="temporadas" id="cb_temporadas" class="program-custom-select w-100">
  24.                             {% for temporada in temporadas %}
  25.                                 <option value="{{ temporada }}" {% if loop.first %}selected{% endif %}>{{ temporada }}</option>
  26.                             {% endfor %}
  27.                         </select>
  28.                         <i class="fa-solid fa-chevron-down"></i>
  29.                     </div>
  30.                     {% endif %}
  31.                 </div>
  32.             </div>
  33.         </div>
  34. <div class="spinner-container">
  35.   <i class="fas fa-circle-notch spinner"></i>
  36. </div>
  37.         <div hidden id="grid-videos-programas" class="row grid" style="--block-list-gap:{{ settings.items_gap|default('var(--margin)') }}; --block-list-cols:{{settings.column|default('3')}}">
  38.     {% endif %}
  39.         {{ blockscontent|raw }}
  40.         </div>
  41.     </div>
  42.     {% if fields.paginate %}
  43.         <div class="container">
  44.             {% set datapage = paginator.getPaginationData %}
  45.             {% if isajax is defined %}
  46.                 {% if datapage.pageCount > 1 %}
  47.                     <nav>
  48.                         <ul class="pagination">
  49.                             {% if datapage.previous is defined %}
  50.                                 <li class="page-item ajax-paginator" data-page-id="{{ pageid }}" page-id="{{ datapage.previous }}">
  51.                                     <span class="page-link" rel="prev">&laquo;&nbsp;{{ 'label_previous'|trans([], 'KnpPaginatorBundle') }}</span>
  52.                                 </li>
  53.                             {% else %}
  54.                                 <li class="page-item disabled">
  55.                                     <span class="page-link">&laquo;&nbsp;{{ 'label_previous'|trans([], 'KnpPaginatorBundle') }}</span>
  56.                                 </li>
  57.                             {% endif %}
  58.                             {% for i in 1..datapage.pageCount %}
  59.                                 <li class="page-item {% if i == datapage.current %}active{% else %}ajax-paginator" data-page-id="{{ pageid }}" page-id="{{ i }}{% endif %}">
  60.                                     <span class="page-link">{{ i }}</span>
  61.                                 </li>
  62.                             {% endfor %}
  63.                             {% if datapage.next is defined %}
  64.                                 <li class="page-item ajax-paginator" data-page-id="{{ pageid }}" page-id="{{ datapage.next }}">
  65.                                     <span class="page-link" rel="next">{{ 'label_next'|trans([], 'KnpPaginatorBundle') }}&nbsp;&raquo;</span>
  66.                                 </li>
  67.                             {% else %}
  68.                                 <li class="page-item disabled">
  69.                                     <span class="page-link">{{ 'label_next'|trans([], 'KnpPaginatorBundle') }}&nbsp;&raquo;</span>
  70.                                 </li>
  71.                             {% endif %}
  72.                         </ul>
  73.                     </nav>
  74.                 {% endif %}
  75.             {% else %}
  76.                  {{ knp_pagination_render(paginator,'paginator/navigation.pagination.html.twig') }}
  77.             {% endif %}
  78.         </div>
  79.     {% endif %}
  80. </section>
  81. {% endif %}
  82. {# @END BLOCK LISTA #}
  83. {% include 'blocks/block_share_modal/block_share_modal.default.html.twig' %}
  84. <script>
  85.     document.addEventListener('DOMContentLoaded', function() {
  86.         const cb_temporadas = document.getElementById('cb_temporadas');
  87.         const grid = document.getElementById('grid-videos-programas');
  88.         const spinnerContainer = document.querySelector('.spinner-container');
  89.         if(cb_temporadas) {
  90.             // 1️⃣ Pega todas as options
  91.             const options = Array.from(cb_temporadas.options);
  92.             // 2️⃣ Ordena ignorando acentos e maiúsculas/minúsculas
  93.             options.sort((a, b) => {
  94.                 const textA = a.text.trim();
  95.                 const textB = b.text.trim();
  96.                 return textA.localeCompare(textB, 'pt-PT', { sensitivity: 'base' });
  97.             });
  98.             // 3️⃣ Remove todas as opções antigas e reinsere ordenadas
  99.             cb_temporadas.innerHTML = '';
  100.             // 4️⃣ Reinsere as opções ordenadas
  101.             options.forEach(opt => cb_temporadas.add(opt));
  102.             // 5️⃣ Seleciona a primeira opção (padrão) após ordenar
  103.             cb_temporadas.selectedIndex = 0; // Seleciona a primeira opção após ordenar
  104.             // 6️⃣ remove o atributo hidden pai do select
  105.             cb_temporadas.parentElement.removeAttribute('hidden');
  106.         }
  107.         // Remove o spinner e mostra o grid
  108.         spinnerContainer.style.display = 'none';
  109.         grid.removeAttribute('hidden');
  110.     });
  111.     //
  112.     function mostrarTemporada(valor) {
  113.         let temporadas = document.querySelectorAll(".episodes_card");
  114.         temporadas.forEach(function (t) {
  115.         if (t.getAttribute("data-temporada") === valor) {
  116.             t.style.display = "block";
  117.         } else {
  118.             t.style.display = "none";
  119.         }
  120.         });
  121.     }
  122.     document.addEventListener("DOMContentLoaded", function () {
  123.         let select = document.getElementById("cb_temporadas");
  124.         mostrarTemporada(select.value);
  125.     });
  126.     document.getElementById("cb_temporadas").addEventListener("change", function() {
  127.         let temporadaSelecionada = this.value;
  128.         mostrarTemporada(temporadaSelecionada);
  129.     });
  130. </script>