Č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>