Články - Tiskový servis
Všechny články
Při zpracování šablony došlo k chybě.
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@7264064"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: json = jsonFactoryUtil.createJSONObje... [in template "GLOBAL_MACROS" in function "getDocumentUrlFromJsonText" at line 706, column 13] - Reached through: @global.printImgFromJsonText w="200" ... [in template "COMMON_MACROS" in macro "printArticlePreview" at line 2084, column 25] - Reached through: @macros.printArticlePreview data [in template "20097#20123#10261171" at line 338, column 29] ----
1<#include "${templatesPath}/COMMON_SETUP" />
2
3<#assign
4 temaVocabulary = global.getVocabulary(groupId, vocabularyName.TEMA)!""
5
6 categories = macros.prepareCategoriesHlavniTematickaOblast()
7
8 structClanek = macros.structClanek
9 structClanekBM = macros.structClanekBM
10 <#-- nevyhladava sa, len kvoli ziskaniu odkazu z CLANEK_BM na Metropolitan -->
11 structMetropolitan = macros.structMetropolitan
12 structTiskovaZprava = macros.structTiskovaZprava
13
14 structures = [
15 {
16 "name": "Aktualita",
17 "structureId": structClanek?has_content?then(structClanek.getStructureId(), ""),
18 "slug": requestParamValue.TYP_CLANEK
19 },
20 {
21 "name": "Článek z Brněnského metropolitanu",
22 "structureId": structClanekBM?has_content?then(structClanekBM.getStructureId(), ""),
23 "slug": requestParamValue.TYP_CLANEK_BM
24 },
25 {
26 "name": "Tisková zpráva",
27 "structureId": structTiskovaZprava?has_content?then(structTiskovaZprava.getStructureId(), ""),
28 "slug": requestParamValue.TYP_TISKOVA_ZPRAVA
29 }
30 ]
31
32 kategorieParamName = requestParamName.KATEGORIE
33 typObsahuParamName = requestParamName.TYP
34
35 selectedKategorie = getSelectedObjects(kategorieParamName, categories)
36 selectedTypObsahu = getSelectedObjects(typObsahuParamName, structures)
37/>
38
39<#assign
40 pagerSpec = {
41 "preserveParamNames": [ kategorieParamName, typObsahuParamName ]
42 }
43
44 pager = global.initPager(pagerSpec)
45
46 <#-- ak su nejake vybrane typy obsahu (selectedTypObsahu), pouzi tie, inak pouzi vsetky povolene (structures) -->
47 selectedClassTypeIds = (selectedTypObsahu?size gt 0)?then(selectedTypObsahu?map(x -> x.structureId), structures?map(x -> x.structureId))
48 anyCategoryIds = selectedKategorie?map(x -> x.id)
49 <#-- filtruju sa obsahy s kategoriou s danym nazvom jak zo slovnika HLAVNI_TEMATICKA_OBLAST, tak TEMA -->
50 anyTemaCategoryIds = selectedKategorie
51 ?map(x -> global.getCategoryByNormalizedName(temaVocabulary, x.slug))
52 ?drop_while(x -> !x?has_content)
53 ?map(x -> x.getCategoryId())
54 anyCategoryIds += anyTemaCategoryIds
55
56 spec = {
57 "classTypeIds": selectedClassTypeIds,
58 "orderByCol1": orderByCol.PUBLISH_DATE,
59 "orderByType1": orderByType.DESC,
60 "orderByCol2": orderByCol.TITLE,
61 "orderByType2": orderByType.ASC,
62 "start": pager.startIndex,
63 "end": pager.endIndex,
64 "anyCategoryIds": anyCategoryIds
65 }
66
67 <#-- TODO upravit tak aby sa nevolalo 2x getJAAssetEntryQuery -->
68 <#-- + miesto toho pouzit getJournalArticleListWithQuery ? -->
69 entries = global.getJAEntriesFromAEQ(spec)
70
71 total = AssetEntryLocalService.getEntriesCount(global.getJAAssetEntryQuery(spec))
72
73 pager = global.updatePager(pager, total)
74/>
75
76<div class="bno-layout bno-layout--ratio-1-3">
77 <#-- DESKTOPOVA VERZE FILTRU -->
78 <aside class="bno-layout__col u-hide--tablet">
79 <fieldset>
80 <legend>Témata</legend>
81 <div class="bno-form-control bno-form-control--custom">
82 <ul class="bno-form-group">
83 <#list categories as category>
84 <#assign randomId = stringUtil.randomId() />
85 <li class="bno-form-group__item">
86 <input
87 id="${randomId}"
88 class="bno-form-control__checkbox js-filter-add"
89 type="checkbox"
90 name="temata"
91 data-slug="${category.slug}"
92 aria-required="false"
93 aria-disabled="false"
94 ${isCategorySelected(kategorieParamName,category.slug)?then('checked','')}
95 >
96 <label class="bno-form-control__label" for="${randomId}">
97 ${category.name}
98 <#-- TODO number? -->
99 <#-- <span>(18)</span> -->
100 </label>
101 <span class="bno-form-control__indicator"></span>
102 </li>
103 </#list>
104 </ul>
105 </div>
106 </fieldset>
107
108 <fieldset>
109 <div class="bno-accordion bno-accordion--no-inner-offset bno-accordion--noborder" role="list">
110 <button
111 id="bno-accordion-header-0"
112 class="bno-accordion__header bno-accordion__header--noborder bno-accordion__header--no-inner-offset is-expanded"
113 role="listitem"
114 aria-expanded="true"
115 aria-controls="bno-accordion-content-0"
116 >
117 <legend>Typ obsahu</legend>
118 <span class="bno-icon bno-icon--arrow-narrow bno-icon--16x16" aria-hidden="true"></span>
119 </button>
120 <div
121 class="bno-accordion__content bno-accordion__content--no-inner-offset bno-accordion__content--noborder"
122 id="bno-accordion-content-0"
123 aria-labelledby="bno-accordion-header-0"
124 aria-hidden="false"
125 style="min-height: 117px; height: auto; visibility: visible; overflow: initial;"
126 >
127 <div class="bno-accordion__content-inner">
128 <div class="bno-form-control bno-form-control--custom">
129 <ul class="bno-form-group">
130 <#list structures as structure>
131 <#assign randomId = stringUtil.randomId() />
132 <li class="bno-form-group__item">
133 <input
134 id="${randomId}"
135 class="bno-form-control__checkbox js-filter-add"
136 type="checkbox"
137 name="typy-obsahu"
138 data-slug="${structure.slug}"
139 aria-required="false"
140 aria-disabled="false"
141 ${isCategorySelected(typObsahuParamName,structure.slug)?then('checked','')}
142 >
143 <label class="bno-form-control__label" for="${randomId}">
144 ${structure.name}
145 </label>
146 <span class="bno-form-control__indicator"></span>
147 </li>
148 </#list>
149 </ul>
150 </div>
151 </div>
152 </div>
153 </div>
154 </fieldset>
155 </aside>
156 <section class="bno-layout__col">
157 <#-- MOBILNI VERZE FILTRU -->
158 <button
159 class="bno-button bno-button--secondary bno-button--medium bno-button--spread-max u-hide-from--tablet bno-modal__trigger u-mb--32"
160 data-id="modal-01"
161 >
162 Filtrovat výsledky
163 <#-- <span class="u-text--badge">3</span> -->
164 </button>
165 <div id="modal-01" class="bno-modal bno-modal--max">
166 <div class="bno-modal__content">
167 <div class="bno-modal__header">
168 <h2>Filtry</h2>
169 </div>
170 <div class="bno-modal__content-inner">
171 <fieldset>
172 <legend>Témata</legend>
173 <div class="bno-form-control bno-form-control--custom">
174 <ul class="bno-form-group">
175 <#list categories as category>
176 <#assign randomId = stringUtil.randomId() />
177 <li class="bno-form-group__item">
178 <input
179 id="${randomId}"
180 class="bno-form-control__checkbox js-filter-add"
181 type="checkbox"
182 name="temata"
183 data-slug="${category.slug}"
184 aria-required="false"
185 aria-disabled="false"
186 ${isCategorySelected(kategorieParamName,category.slug)?then('checked','')}
187 >
188 <label class="bno-form-control__label" for="${randomId}">
189 ${category.name}
190 <#-- <span>(18)</span> -->
191 </label>
192 <span class="bno-form-control__indicator"></span>
193 </li>
194 </#list>
195 </ul>
196 </div>
197 </fieldset>
198 <fieldset>
199 <div class="bno-accordion bno-accordion--no-inner-offset bno-accordion--noborder" role="list">
200 <button
201 id="bno-accordion-header-2"
202 class="bno-accordion__header bno-accordion__header--no-inner-offset bno-accordion__header--noborder"
203 role="listitem"
204 aria-expanded="false"
205 aria-controls="bno-accordion-content-2"
206 >
207 <legend>Typ obsahu</legend>
208 <span class="bno-icon bno-icon--arrow-narrow bno-icon--16x16" aria-hidden="true"></span>
209 </button>
210 <div
211 class="bno-accordion__content bno-accordion__content--no-inner-offset bno-accordion__content--noborder"
212 id="bno-accordion-content-2"
213 aria-labelledby="bno-accordion-header-2"
214 >
215 <div class="bno-accordion__content-inner">
216 <div class="bno-form-control bno-form-control--custom">
217 <ul class="bno-form-group">
218 <#list structures as structure>
219 <#assign randomId = stringUtil.randomId() />
220 <li class="bno-form-group__item">
221 <input
222 id="${randomId}"
223 class="bno-form-control__checkbox js-filter-add"
224 type="checkbox"
225 name="typy-obsahu"
226 data-slug="${structure.slug}"
227 aria-required="false"
228 aria-disabled="false"
229 ${isCategorySelected(typObsahuParamName,structure.slug)?then('checked','')}
230 >
231 <label class="bno-form-control__label" for="${randomId}">
232 ${structure.name}
233 </label>
234 <span class="bno-form-control__indicator"></span>
235 </li>
236 </#list>
237 </ul>
238 </div>
239 </div>
240 </div>
241 </div>
242 </fieldset>
243 </div>
244 <div class="bno-modal__footer">
245 <#-- TODO?
246 - Aby zde mohlo byt tlacitko Zobrazit vysledky, museli bychom zmenit chovani stranky.
247 - Nesmela by se prenacist po kazde zmene stavu checkboxu.
248 - a) Cekat s reloadem (a tedy novym hledanim) az po kliknuti na tento button. Do te doby nereagovat na zmeny stavu checkboxu.
249 - b) Zajistit plynulejsi chod bez hard-reload.
250 - Volat sluzbu pres API?
251 - Predelat na FE app?
252 -->
253 <#-- <button class="bno-button bno-button--primary bno-button--medium bno-button--spread-max">
254 <span>
255 Zobrazit výsledky
256 (39)
257 </span>
258 </button> -->
259 <button class="bno-button bno-button--grey-dark bno-button--medium bno-button--spread-max js-filter-reset">
260 <span>Zrušit filtry</span>
261 </button>
262 </div>
263 <button
264 class="bno-button bno-modal__close"
265 aria-labelledby="modal-close"
266 >
267 <span id="modal-close" class="bno-button__label u-sr-only">
268 Zavřít modální okno
269 </span>
270 </button>
271 </div>
272 <div class="bno-modal__backdrop"></div>
273 </div>
274
275 <#-- VYBRANE FILTRY -->
276 <#if selectedKategorie?size gt 0 || selectedTypObsahu?size gt 0>
277 <section class="u-mb--32" aria-label="Použité filtry">
278 <div class="bno-flexbox bno-flexbox--gap-8">
279 <span class="u-mt--10">Filtry:</span>
280 <div class="bno-tab-links bno-tab-links--filter u-mt--unset u-mb--unset">
281 <ul class="bno-list--plain bno-tab-links__holder" role="menubar" aria-label="Upřesnění vyhledávání">
282 <#list selectedKategorie as category>
283 <li class="bno-tab-links__item" role="menuitem">
284 <button
285 class="bno-button bno-button--grey bno-button--medium js-filter-remove"
286 aria-label="Zrušit filtr Rozhovory"
287 data-slug="${category.slug}"
288 name="temata"
289 >
290 <span>${category.name}</span>
291 <span class="bno-icon bno-icon--cross bno-icon--14x14" aria-hidden="true"></span>
292 </button>
293 </li>
294 </#list>
295 <#list selectedTypObsahu as structure>
296 <li class="bno-tab-links__item" role="menuitem">
297 <button
298 class="bno-button bno-button--grey bno-button--medium js-filter-remove"
299 aria-label="Zrušit filtr Rozhovory"
300 data-slug="${structure.slug}"
301 name="typy-obsahu"
302 >
303 <span>${structure.name}</span>
304 <span class="bno-icon bno-icon--cross bno-icon--14x14" aria-hidden="true"></span>
305 </button>
306 </li>
307 </#list>
308 <li class="bno-tab-links__item" role="menuitem">
309 <button
310 class="bno-button bno-button--grey-dark bno-button--medium js-filter-reset"
311 aria-label="Zrušit všechny filtry"
312 >
313 <span>Zrušit filtry</span>
314 </button>
315 </li>
316 </ul>
317 </div>
318 </div>
319 </section>
320 </#if>
321
322 <#-- VYSLEDKY -->
323 <#if total gt 0>
324 <ul class="bno-list--plain">
325 <#-- entries - smes ze struktur Clanek, ClanekBm, TZ -->
326 <#list entries as curEntry>
327 <#if curEntry.getAssetRenderer()??>
328 <#--
329 Note: funkce prepareDataClanek() je pro Clanky a ClankyBm, ale zde je pouzitelna i pro TZ,
330 nebot vraci properties, ktere jsou spolecne a potrebne pro zdejsi vypis:
331 title, url, displayDate, perex, categoriesHlavniTematickaOblast
332 -->
333 <#assign
334 data = macros.prepareDataClanek(curEntry, "")
335 />
336
337 <li>
338 <@macros.printArticlePreview data />
339 </li>
340 </#if>
341 </#list>
342 </ul>
343
344 <@global.printPagination pager />
345 <#else>
346 <p>Nebyly nalezeny žádné záznamy.</p>
347 </#if>
348 </section>
349</div>
350
351<script>
352 let kategorie = [
353 <#list selectedKategorie as kategorie>
354 '${kategorie.slug}'<#sep>,</#sep>
355 </#list>
356 ];
357
358 let typObsahu = [
359 <#list selectedTypObsahu as typObsahu>
360 '${typObsahu.slug}'<#sep>,</#sep>
361 </#list>
362 ];
363
364 function addToFilter(list, slug) {
365 const index = list.indexOf(slug);
366
367 if (index < 0) {
368 list.push(slug);
369
370 filter();
371 }
372 }
373
374 function removeFromFilter(list, slug) {
375 const index = list.indexOf(slug);
376
377 if (index >= 0) {
378 list.splice(index, 1);
379
380 filter();
381 }
382 }
383
384 function resetFilter() {
385 kategorie = [];
386 typObsahu = [];
387
388 filter();
389 }
390
391 const kategorieButtons = document.querySelectorAll('[name="temata"].js-filter-add');
392 kategorieButtons.forEach((item) => {
393 item.onclick = function() {
394 if (this.checked) {
395 addToFilter(kategorie, this.dataset.slug);
396 } else {
397 removeFromFilter(kategorie, this.dataset.slug);
398 }
399 };
400 });
401
402 const selectedKategorieButtons = document.querySelectorAll('[name="temata"].js-filter-remove');
403 selectedKategorieButtons.forEach((item) => {
404 item.onclick = function() {
405 removeFromFilter(kategorie, this.dataset.slug);
406 };
407 });
408
409 const typObsahuButtons = document.querySelectorAll('[name="typy-obsahu"].js-filter-add');
410 typObsahuButtons.forEach((item) => {
411 item.onclick = function() {
412 if (this.checked) {
413 addToFilter(typObsahu, this.dataset.slug);
414 } else {
415 removeFromFilter(typObsahu, this.dataset.slug);
416 }
417 };
418 });
419
420 const selectedTypObsahuButtons = document.querySelectorAll('[name="typy-obsahu"].js-filter-remove');
421 selectedTypObsahuButtons.forEach((item) => {
422 item.onclick = function() {
423 removeFromFilter(typObsahu, this.dataset.slug);
424 };
425 });
426
427 const resetButtons = document.querySelectorAll('.js-filter-reset');
428 resetButtons.forEach((item) => {
429 item.onclick = function() {
430 resetFilter();
431 };
432 });
433
434 function filter() {
435 var kategorieQuery = kategorie.join('&${kategorieParamName}=');
436
437 if (kategorieQuery.length > 0) {
438 kategorieQuery = '${kategorieParamName}=' + kategorieQuery;
439 }
440
441 var typObsahuQuery = typObsahu.join('&${typObsahuParamName}=');
442
443 if (typObsahuQuery.length > 0) {
444 typObsahuQuery = '${typObsahuParamName}=' + typObsahuQuery;
445 }
446
447 const query = [kategorieQuery, typObsahuQuery].join('&');
448
449 window.location = encodeURI("?" + query);
450 }
451</script>
452
453<#--
454 Funkce vrati seznam objektu, ktere byli zvolene na zaklade hodnot URL parametru paramName
455-->
456<#function getSelectedObjects paramName objectList>
457 <#assign selected = [] />
458
459 <#if paramName?has_content && objectList?size gt 0>
460 <#assign selectedValues = request.getParameterValues(paramName)![] />
461
462 <#list selectedValues as selectedValue>
463 <#assign filteredValues = objectList?filter(x -> x.slug?string == selectedValue)![] />
464
465 <#if filteredValues?size gt 0>
466 <#-- slug musi byt unikatny, preto sa najde maximalne jedna polozka -->
467 <#assign selected += [ filteredValues?first ] />
468 </#if>
469 </#list>
470
471 <#assign selected = selected?sort_by("slug") />
472 </#if>
473
474 <#return selected />
475</#function>
476
477<#function isCategorySelected paramName="" slug="">
478 <#assign isSelected = false />
479
480 <#if paramName?has_content && slug?has_content>
481 <#assign
482 selectedValues = request.getParameterValues(paramName)![]
483 isSelected = selectedValues?seq_contains(slug)
484 />
485 </#if>
486
487 <#return isSelected />
488</#function>
489
490<style>
491 .smb-theme fieldset {
492 border: none;
493 margin: unset;
494 padding: unset;
495 }
496
497 .smb-theme legend {
498 font-size: 14px;
499 font-weight: 600;
500 }
501</style>