1<style>
2.results-list-formacio {
3 background: #fff;
4 border: 1px solid #CC5D27;
5 border-radius: 10px 30px 10px 10px;
6 display: flex;
7 flex-wrap: wrap;
8 padding: 20px;
9 padding-right: 40px;
10 position: relative;
11 row-gap: 20px;
12 transition: all 0.3s;
13 -webkit-transition: all 0.3s;
14}
15
16.select-label {
17 font-size: 1.5em;
18 /* Tamaño similar al de un h3 */
19 font-weight: bold;
20 /* Negrita */
21 margin-bottom: 10px;
22 /* Espacio debajo del label */
23 display: block;
24 /* Asegura que el label esté en su propia línea */
25}
26
27.result-info-formacio {
28 column-gap: 20px;
29 display: flex;
30 flex: 100%;
31}
32
33.load-more-btn {
34 background-color: #CC5D27;
35 color: #fff;
36 padding: 10px 20px;
37 border-radius: 5px;
38 text-decoration: none;
39 display: inline-block;
40 margin-top: 20px;
41}
42</style>
43<#if entries?has_content>
44 <#assign categoryList=[] />
45 <!-- Recorremos todas las entradas para obtener sus categorías -->
46 <#list entries as entry>
47 <#assign categories=entry.getCategories()![] />
48 <#if categories?has_content>
49 <#list categories as category>
50 <!-- Si la categoría no está en la lista, la agregamos -->
51 <#if category.getName() != "Enlaces" && category.getName() != "Beques" && category.getName() != "Altres idiomes" && category.getName() != "Accés a la universitat" && category.getName() != "Català" && category.getName() != "Castellà" && category.getName() != "Anglès" && !(categoryList?seq_contains(category.getName()))>
52 <#assign categoryList=categoryList + [category.getName()] />
53 </#if>
54 </#list>
55 </#if>
56 </#list>
57 <#assign idioma = themeDisplay.getLocale().language />
58 <#assign entriesSize=entries?size />
59 <#assign selectLabel = "Escull una opció: " />
60 <#assign select = "Seleccionar" />
61 <#assign nonAvailableCategories = "No hi ha categories disponibles" />
62 <#assign enlaces = "Enllaços" />
63 <#assign masEnlaces = "Veure més enllaços" />
64 <#assign de = "de" />
65 <#if idioma == "es">
66 <#assign selectLabel = "Escoge una opción: " />
67 <#assign nonAvailableCategories = "No hay categorías disponibles" />
68 <#assign enlaces = "Enlaces" />
69 <#assign masEnlaces = "Ver más enlaces" />
70 <#elseif idioma == "en">
71 <#assign selectLabel = "Choose an option: " />
72 <#assign nonAvailableCategories = "No categories available" />
73 <#assign select = "Select" />
74 <#assign enlaces = "Links" />
75 <#assign masEnlaces = "See more links" />
76 <#assign de = "of" />
77 </#if>
78 <!-- Mostrar el select con las categorías obtenidas -->
79 <div class="wrapper medium mb-2">
80 <div class="results-list-formacio d-flex justify-content-center align-items-center">
81 <label for="categorySelect" class="select-label mr-2 pt-2">${selectLabel}</label>
82 <select id="categorySelect">
83 <option value="">${select}</option>
84 <#if categoryList?has_content>
85 <#list categoryList as categoryName>
86 <option value="${categoryName}">
87 ${categoryName}
88 </option>
89 </#list>
90 <#else>
91 <option value="">${nonAvailableCategories}</option>
92 </#if>
93 </select>
94 </div>
95 </div>
96 <!-- Mostrar las entradas -->
97 <div class="wrapper medium">
98 <h3 class="title-form-enlace" id="title-form-enlace"></h3>
99 <ul id="entries-list">
100 <#list entries as curEntry>
101 <#assign assetRenderer=curEntry.getAssetRenderer() />
102 <#assign assetObject=assetRenderer.getAssetObject() />
103 <#assign categories=curEntry.getCategories()![] />
104 <#assign entryCategoryNames=[] />
105 <#list categories as category>
106 <#assign entryCategoryNames=entryCategoryNames + [category.getName()] />
107 </#list>
108 <#assign conditionalStyle="display:block;" />
109 <#if (curEntry?counter>= 5)>
110 <#assign conditionalStyle="display:none;" />
111 </#if>
112 <li class="my-4 entry" style="display:none" data-categories="${entryCategoryNames?join(',')}">
113 <#if assetObject.getArticleId()??>
114 <@liferay_journal["journal-article"]
115 articleId=assetObject.getArticleId()
116 ddmTemplateKey="161002"
117 groupId=assetObject.getGroupId() />
118 </#if>
119 </li>
120 </#list>
121 </ul>
122 <div class="centered small-padding-bottom loadMoreBtn" style="display:none;">
123 <a href="javascript:void(0);" class="button lm-button-white" style="width: 100%">${masEnlaces}</a>
124 </div>
125 </div>
126</#if>
127<script>
128document.addEventListener('DOMContentLoaded', function() {
129 let maxEntriesToShow = 5;
130 let currentCategory = '';
131 const entries = document.querySelectorAll('.entry');
132 const loadMoreButton = document.querySelector('.loadMoreBtn');
133 const titleElement = document.querySelector('.title-form-enlace');
134 const categorySelect = document.getElementById('categorySelect');
135
136 // Función para filtrar y mostrar las entradas según la categoría seleccionada
137 function filterEntriesByCategory() {
138 const selectedCategory = categorySelect.value.toLowerCase();
139 currentCategory = selectedCategory;
140 let matchingEntries = [];
141
142 // Ocultar todas las entradas inicialmente
143 entries.forEach(entry => entry.style.display = 'none');
144
145 // Filtrar las entradas que coinciden con la categoría seleccionada
146 entries.forEach(entry => {
147 const entryCategories = entry.getAttribute('data-categories').split(',');
148 if (entryCategories.some(category => category.toLowerCase() === selectedCategory)) {
149 matchingEntries.push(entry);
150 }
151 });
152
153 // Mostrar solo las primeras 5 entradas de la categoría seleccionada
154 matchingEntries.slice(0, maxEntriesToShow).forEach(entry => entry.style.display = 'block');
155
156 // Actualizar el título con el conteo de entradas visibles
157 titleElement.innerText = '${enlaces} (' + Math.min(maxEntriesToShow, matchingEntries.length) + ' ${de} ' + matchingEntries.length + ')';
158
159 // Mostrar u ocultar el título
160 titleElement.style.display = matchingEntries.length > 0 ? 'block' : 'none';
161
162 // Mostrar u ocultar el botón "Ver más"
163 loadMoreButton.style.display = matchingEntries.length > maxEntriesToShow ? 'block' : 'none';
164 }
165
166 // Evento para cargar más entradas al hacer clic en "Ver más"
167 loadMoreButton.addEventListener('click', function() {
168 const matchingEntries = Array.from(entries).filter(entry => {
169 const entryCategories = entry.getAttribute('data-categories').split(',');
170 return entryCategories.some(category => category.toLowerCase() === currentCategory);
171 });
172
173 // Mostrar las siguientes 5 entradas de la categoría seleccionada
174 const newEntriesToShow = maxEntriesToShow + 5;
175 matchingEntries.slice(maxEntriesToShow, newEntriesToShow).forEach(entry => entry.style.display = 'block');
176
177 // Actualizar el conteo
178 maxEntriesToShow = newEntriesToShow;
179 titleElement.innerText = '${enlaces} (' + Math.min(maxEntriesToShow, matchingEntries.length) + ' ${de} ' + matchingEntries.length + ')';
180
181 // Ocultar el botón si ya se han mostrado todas las entradas
182 if (maxEntriesToShow >= matchingEntries.length) {
183 loadMoreButton.style.display = 'none';
184 }
185 });
186
187 // Inicializar el filtro cuando cambia la selección del select
188 categorySelect.addEventListener('change', function() {
189 maxEntriesToShow = 5;
190 filterEntriesByCategory();
191 });
192
193 // Inicializar el filtro al cargar la página
194 filterEntriesByCategory();
195});
196</script>