Trasimeno cycle route
An error occurred while processing the template.
The following has evaluated to null or missing:
==> firstImage.getFile [in template "20099#20135#5861246" at line 989, column 69]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign relativeImageUrl = firstImage... [in template "20099#20135#5861246" at line 989, column 41]
----
1<#--
2Template ID: 5861247
3Template Key: 5861246
4Type: display
5Mode: None
6-->
7
8<style>
9 .link-list .link-container:last-child {
10 border-bottom: 4px solid #395a3e;
11 }
12 .link-sidebar-1 .link .label {
13 font-size: 1.1rem;
14 }
15</style>
16
17<#assign structureService = serviceLocator.findService("it.inera.structure.service.StructureService")>
18<#assign dlAppServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")/>
19<#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()>
20<#assign itinerarioStructureId = structureService.getStructureItinerarioId()>
21
22<#assign segmentoStructureKey = structureService.getStructureSegmentoKey()>
23<#assign segmentoStructureId = structureService.getStructureSegmentoId()>
24
25<#assign elasticService = serviceLocator.findService("it.inera.elastic.service.ElasticService")>
26<#assign journalArticleId = .vars['reserved-article-id'].data/>
27
28<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
29<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
30<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
31
32<#-- GESTIONE RALATED ASSETS IMPORTS-->
33<#assign journalArticleConverter = serviceLocator.findService("it.inera.journalarticleconverter.service.JournalArticleConverter")>
34<#assign searchService = serviceLocator.findService("it.inera.structure.search.service.SearchService")>
35<#-- FINE GESTIONE RALATED ASSETS IMPORTS-->
36
37<#assign vocabularyIdUmbria = structureService.getVocabularyIdByVocabularyName("Vocabolario Umbria") >
38
39<#assign isGroupUmbria = structureService.isGroupUmbria(themeDisplay)>
40
41<#assign latitude = "" >
42<#assign longitude = "" >
43<#if coordinate_principali.getData()?has_content>
44 <#assign coordinatePrincipaliJson = coordinate_principali.getData()?eval_json >
45 <#if coordinatePrincipaliJson.lat?has_content >
46 <#assign latitude = (coordinatePrincipaliJson.lat?c)!"" >
47 </#if>
48 <#if coordinatePrincipaliJson.longitude?has_content >
49 <#assign longitude = (coordinatePrincipaliJson.lng?c)!"" >
50 </#if>
51</#if>
52
53<#function createTranslatedFilters>
54
55 <#assign arr = jsonFactoryUtil.createJSONArray() />
56
57 <#assign o1 = jsonFactoryUtil.createJSONObject() />
58 <#assign o1 = o1.put("label", languageUtil.get(locale, "label.for.noleggi")) />
59 <#assign o1 = o1.put("value", "rental") />
60 <#assign o1 = o1.put("icon", "${themeDisplay.getPathThemeImages()}/icons/meccanico-simple.svg") />
61 <#assign arr = arr.put(o1) />
62
63 <#assign o2 = jsonFactoryUtil.createJSONObject() />
64 <#assign o2 = o2.put("label", languageUtil.get(locale, "label.attrattori")) />
65 <#assign o2 = o2.put("value", "attrattore") />
66 <#assign o2 = o2.put("icon", "${themeDisplay.getPathThemeImages()}/icons/binocle.svg") />
67 <#assign arr = arr.put(o2) />
68
69 <#assign o3 = jsonFactoryUtil.createJSONObject() />
70 <#assign o3 = o3.put("label", languageUtil.get(locale, "label.for.hotel")) />
71 <#assign o3 = o3.put("value", "accommodation") />
72 <#assign o3 = o3.put("icon", "${themeDisplay.getPathThemeImages()}/icons/hotel-simple.svg") />
73 <#assign arr = arr.put(o3) />
74
75 <#assign o4 = jsonFactoryUtil.createJSONObject() />
76 <#assign o4 = o4.put("label", languageUtil.get(locale, "label.for.Ristoranti")) />
77 <#assign o4 = o4.put("value", "restaurant") />
78 <#assign o4 = o4.put("icon", "${themeDisplay.getPathThemeImages()}/icons/restaurants.svg") />
79 <#assign arr = arr.put(o4) />
80
81 <#assign o5 = jsonFactoryUtil.createJSONObject() />
82 <#assign o5 = o5.put("label", languageUtil.get(locale, "label.informazioni.utili")) />
83 <#assign o5 = o5.put("value", "info") />
84 <#assign o5 = o5.put("icon", "${themeDisplay.getPathThemeImages()}/icons/infos.svg") />
85 <#assign arr = arr.put(o5) />
86
87 <#return arr>
88</#function>
89
90<#assign filtersJson = createTranslatedFilters().toString() />
91
92<#assign currentArticle = journalArticleLocalService.getArticle(groupId, journalArticleId) />
93<#assign currentObject = journalArticleConverter.getItinerario(currentArticle, locale)>
94<#assign relatedAssets = currentObject.getDirectRelatedAssets()>
95
96<#assign segmentsList = []/>
97<#list relatedAssets![] as asset>
98 <#if asset.getDDMStructureKey() != segmentoStructureKey?string> <#continue> </#if>
99
100 <#assign segmentData = {
101 "segmento": (journalArticleConverter.getSegmento(asset, locale))!,
102 "articleId": asset.getArticleId(),
103 "resourcePrimKey": asset.getResourcePrimKey()?c
104 }>
105 <#assign segmentsList += [segmentData]>
106</#list>
107
108<#-- LanguageId -->
109<#assign lang = "it"/>
110<#if themeDisplay.getLanguageId()?contains("_")>
111 <#assign lang = themeDisplay.getLanguageId()?split("_")[0]/>
112<#else>
113 <#assign lang = themeDisplay.getLanguageId()/>
114</#if>
115
116<#-- GESTIONE RALATED ASSETS VALORIZZAZIONE ARRAY-->
117
118<#assign currentArticleResourcePrimKey = currentArticle.getResourcePrimKey() />
119<#assign currentArticleAssetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", currentArticleResourcePrimKey) />
120<#assign currentArticleAssetEntryId = currentArticleAssetEntry.getEntryId() />
121
122<#assign assetRenderer = currentArticleAssetEntry.getAssetRenderer() />
123<#assign assetObject = assetRenderer.getAssetObject() />
124<#assign categoryList = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", assetObject.resourcePrimKey) />
125
126<#assign vocabularyIdTerritori = structureService.getVocabularyIdByVocabularyName("Territori") >
127<#assign municipalityNames = [] >
128<#assign municipalityNamesString = "" >
129<#assign territoryNameString = "" >
130
131<#list categoryList as category>
132 <#if vocabularyIdTerritori == category.getVocabularyId() >
133 <#assign municipalityName = category.getTitle(themeDisplay.getLanguageId()) >
134
135 <#assign childCategories = assetCategoryLocalService.getChildCategories(category.getCategoryId()) >
136 <#if childCategories?has_content>
137 <#assign territoryNameString = category.getTitle(themeDisplay.getLanguageId())>
138 <#list childCategories as curChildCategory>
139 <#assign municipalityNameC = curChildCategory.getTitle(themeDisplay.getLanguageId()) >
140 <#if curChildCategory?counter != 1 || municipalityNamesString?has_content>
141 <#assign municipalityNamesString = municipalityNamesString + "," + municipalityNameC>
142 <#else>
143 <#assign municipalityNamesString = municipalityNamesString + municipalityNameC>
144 </#if>
145 <#assign municipalityNames = municipalityNames + [municipalityNameC]>
146 </#list>
147 <#else>
148 <#assign municipalityNames = municipalityNames + [municipalityName]>
149 <#if municipalityNamesString?has_content>
150 <#assign municipalityNamesString = municipalityNamesString + "," + municipalityName>
151 <#else>
152 <#assign municipalityNamesString = municipalityNamesString + municipalityName>
153 </#if>
154 </#if>
155 </#if>
156</#list>
157
158<#assign isgu = structureService.isGroupUmbria(themeDisplay)>
159<#assign sitiESottositiCategories = "">
160<#if !isgu>
161 <#assign sitiESottositiCategories = structureService.getSiteCategoryIdsByVocabularyName(themeDisplay, "Siti-e-sottositi") >
162</#if>
163
164<#if isgu>
165 <#assign results = elasticService.getRelatedArticlesOrderByPriority(themeDisplay, latitude, longitude, distanza.getData(), itinerarioStructureKey, itinerarioStructureId?c, locale, "6", null , null, journalArticleId, null, null, null) />
166<#else>
167 <#assign results = elasticService.getRelatedArticlesOrderByPriority(themeDisplay, latitude, longitude, distanza.getData(), itinerarioStructureKey, itinerarioStructureId?c, locale, "6", null , sitiESottositiCategories, journalArticleId, null, null, null) />
168</#if>
169
170<#-- per categoria -->
171<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
172<#assign vocabularyName = "Vocabolario Umbria"/>
173<#assign specificVocabulary = assetVocabularyLocalService.getGroupVocabulary(themeDisplay.getCompany().getGroupId(), vocabularyName)/>
174<#if validator.isNotNull(specificVocabulary)>
175 <#assign cats = specificVocabulary.getCategories()/>
176</#if>
177
178<#assign assetRenderer = currentArticleAssetEntry.getAssetRenderer() />
179<#assign assetObject = assetRenderer.getAssetObject() />
180<#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", assetObject.resourcePrimKey)![] />
181
182<#assign tomBaseImagePath = propsUtil.get("tom.base.image.url") />
183
184<div class="container-fluid">
185 <div class="row">
186 <div class="header-block header-under-nav header-block-image-layer header-block-1 header-block-image-main header-block-tagged">
187 <#if ((immagine_banner.getData())!)?has_content>
188 <img class="bg" src="${immagine_banner.getData()}"
189 data-fileentryid="${immagine_banner.getAttribute("fileEntryId")!immagine_banner.getAttribute("classPK")!""}"
190 alt="${testo_alternativo_immagine_banner.getData()!}">
191 </#if>
192 <div class="container title title-main">
193 <#assign titleCategory = "">
194 <#assign titleParentCategory = "">
195 <#list categoryList as category>
196 <#if vocabularyIdUmbria != category.getVocabularyId()> <#continue> </#if>
197
198 <#assign titleCategory = category.getTitle(themeDisplay.getLocale())>
199 <#assign parentCategoryId = category.getParentCategoryId()>
200 <#if parentCategoryId?? && parentCategoryId?has_content && parentCategoryId != 0>
201 <#assign pc = assetCategoryLocalService.getCategory(parentCategoryId) >
202 <#if pc?? && pc?has_content>
203 <#assign titleParentCategory = pc.getTitle("it_IT")>
204 </#if>
205 </#if>
206 <#if (titleCategory!)?has_content>
207 <span class="hidden" id="tagmanager_init_pagegroup">${titleParentCategory}</span>
208 <span class="hidden" id="tagmanager_init_pagecategory">${titleCategory}</span>
209 <div class="badge badge-light badge-uppercase">
210 ${titleCategory}
211 </div>
212 </#if>
213 </#list>
214 <h1 class="title-1 text-weight-300 margin-top-em-0 margin-bottom-em-0">
215 ${titolo.getData()}
216 </h1>
217 </div>
218 </div>
219 </div>
220</div>
221
222<#assign validDatiTecnici = [] />
223<#list dati_tecnici_chiaveFieldSet.getSiblings()![] as datoTecnico>
224 <#if ((datoTecnico.dati_tecnici_valore.getData())!)?has_content>
225 <#assign validDatiTecnici = validDatiTecnici + [datoTecnico] />
226 </#if>
227</#list>
228
229<#assign itemCount = validDatiTecnici?size />
230
231<div class="bg-white">
232 <#if validDatiTecnici?has_content>
233 <div class="container bridge bridge-top">
234 <div class="card-bar card-bar-1 card-bar-dark">
235 <div class="card-row">
236 <#list validDatiTecnici as datoTecnico>
237 <div class="col-${(itemCount > 3)?then(4?c, (12 / itemCount)?c)}">
238 <div class="card card-horizontal card-3">
239 <div class="card-row">
240 <div class="card-icon card-item-first">
241 <#if ((datoTecnico.dati_tecnici_icona.getData())!)?has_content>
242 <i class="fas ${datoTecnico.dati_tecnici_icona.getData()}"></i>
243 </#if>
244 </div>
245 <div class="card-body">
246 <div class="card-subtitle title-6">
247 ${(datoTecnico.dati_tecnici_chiave.getData())!}
248 </div>
249 <div class="card-title">
250 ${(datoTecnico.dati_tecnici_valore.getData())!}
251 </div>
252 </div>
253 </div>
254 </div>
255 </div>
256 </#list>
257 </div>
258 </div>
259 </div>
260 </#if>
261 <article class="container padding-bottom-em-0">
262 <div class="row padding-bottom-em-4">
263 <#if isGroupUmbria>
264 <div class="col-12">
265 <#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
266 <a href="${currentUrl}" data-id="${journalArticleId}"
267 class="link link-tripplanner link-tripplanner-1 link-tripplanner-extended link-tripplanner-top-right margin-right-em-1 padding-right-rem-1" data-tom="false">
268 <i class="far fa-heart text-red"></i>
269 <i class="fas fa-heart text-red" style="display:none"></i>
270 <span class="label hidden display-inline-lg">
271 <@liferay.language key="label.aggiungi.al.mio.viaggio" />
272 </span>
273 </a>
274 <div class="hidden infos">
275 <div class="hidden" id="tagmanager_item_">
276 <span id="tagmanager_item_id">${currentArticleAssetEntryId}</span>
277 <span id="tagmanager_item_category">${titleCategory}</span>
278 <span id="tagmanager_item_name">${titolo.getData()}</span>
279 <span id="tagmanager_item_list_name">${titleCategory}</span>
280 <span id="tagmanager_item_list_id"></span>
281 <span id="tagmanager_item_brand">${titleParentCategory}</span>
282 <span id="tagmanager_index">1</span>
283 </div>
284 </div>
285 </div>
286 </#if>
287 <div class="col-12 col-md-8">
288 <div class="text-block text-block-left d-flex flex-column">
289 <div class="title-4 padding-bottom-em-1">
290 ${sottotitolo.getData()}
291 </div>
292 <div class="text-block-expandable">
293 <div class="text">
294 ${descrizione.getData()}
295 </div>
296 </div>
297 <div class="margin-top-em-2 btn btn-flat btn-red btn-default btn-small btn-text-block-expand show-more" data-showmore="<@liferay.language key="label.mostra.tutto" />" data-showless="<@liferay.language key="label.mostra.meno" />">
298 <@liferay.language key="label.mostra.tutto" />
299 </div>
300 </div>
301 </div>
302
303 <#assign downloadItems = [] />
304 <#if file_tecniciFieldSet.getSiblings()?has_content
305 && (file_tecniciFieldSet.getSiblings()?first.file.getData())??
306 && file_tecniciFieldSet.getSiblings()?first.file.getData()?has_content>
307 <#list file_tecniciFieldSet.getSiblings() as cur_file_tecnici>
308 <#if ((cur_file_tecnici.file.getData())!)?has_content >
309 <#assign rawUrl = cur_file_tecnici.file.getData()?trim />
310 <#if rawUrl?has_content>
311 <#assign urlNoQuery = (rawUrl?keep_before("?"))!rawUrl />
312 <#assign ext = (urlNoQuery?lower_case?keep_after_last(".")?keep_before("/"))!"" />
313 <#assign label = "File" />
314 <#if cur_file_tecnici.file_tecnici.getData()??>
315 <#assign label = cur_file_tecnici.file_tecnici.getData() />
316 </#if>
317 <#assign downloadItems = downloadItems + [{"url": rawUrl, "label": label}] />
318 </#if>
319 </#if>
320 </#list>
321 </#if>
322 <#assign gpxFilesList = [] />
323 <#assign gpxFileEntryIds = [] />
324 <#assign gpxFilesListWithWaypoints = [] />
325
326 <#-- Aggiunta di tutti i gpx di segmento scaricabili -->
327 <#list segmentsList![] as segmentData>
328 <#assign segmento = segmentData.segmento>
329 <#assign gpxSegmento = segmento.getGpxSegmento()! />
330 <#if (gpxSegmento.getPublicUrl())!?has_content>
331 <#assign rawUrl = gpxSegmento.getPublicUrl()?trim />
332 <#if rawUrl?has_content>
333 <#assign urlNoQuery = (rawUrl?keep_before("?"))!rawUrl />
334 <#assign ext = "" />
335 <#if (gpxSegmento.getExtension())!?has_content>
336 <#assign ext = gpxSegmento.getExtension() />
337 <#else>
338 <#assign ext = (urlNoQuery?lower_case?keep_after_last(".")?keep_before("/"))!"" />
339 </#if>
340 <#if ext == "gpx">
341 <#assign label = "File GPX"/>
342 <#if (segmento.getNomeGpxSegmento()!)?has_content>
343 <#assign label = segmento.getNomeGpxSegmento() />
344 </#if>
345 <#if (segmento.getTitolo()!)?has_content>
346 <#assign label = segmento.getTitolo() />
347 </#if>
348
349 <#assign gpxFileEntryId = ""/>
350
351 <#assign gpxFilesListWithWaypoints += [{"gpxfile": rawUrl, "infoDiv": label}] />
352 <#assign gpxFilesList += [{"gpxfile": rawUrl, "infoDiv": "#segment-${segmentData_index + 1}"}] />
353
354 <#if gpxSegmento.getFileEntryId()??>
355 <#assign gpxFileEntryId = gpxSegmento.getFileEntryId() />
356 <#assign gpxFileEntryIds += [gpxFileEntryId] />
357 <#elseif gpxSegmento.getClassPK()??>
358 <#-- Se non c'è fileEntryId ma c'è classPK, uso quello -->
359 <#assign gpxFileEntryId = gpxSegmento.getClassPK() />
360 <#assign gpxFileEntryIds += [gpxFileEntryId] />
361 </#if>
362 </#if>
363 </#if>
364 </#if>
365 </#list>
366 <#if downloadItems?size gt 0 || gpxFilesListWithWaypoints?size gt 0>
367 <aside class="col-12 col-md-4 margin-top-em-3 margin-top-md-em-0">
368 <div class="text-block text-block-1">
369 <div class="link-sidebar link-sidebar-1">
370 <div class="title" style="border-top: 4px solid #395a3e; margin-top: 40px; padding-top: 1.5rem;">
371 <@liferay.language key="label.download"/>
372 </div>
373 <ul class="link-list">
374 <#list downloadItems![] as item>
375 <li class="link-container">
376 <a class="link" href="${item.url}">
377 <i class="fas fa-angle-right"></i>
378 <span class="label">
379 ${item.label}
380 </span>
381 </a>
382 </li>
383 </#list>
384
385 <#list gpxFilesListWithWaypoints![] as gpxFile>
386 <li class="link-container">
387 <a class="link" href="${gpxFile.gpxfile}" download>
388 <i class="fas fa-angle-right"></i>
389 <span class="label">${gpxFile.infoDiv}</span>
390 </a>
391 </li>
392 </#list>
393 </ul>
394 </div>
395 </div>
396
397 <#-- Link contenuto accessibile per link tra le 2 ciclovie -->
398 <#attempt>
399 <#assign linkContenutoAccessibile = "" />
400 <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("link_card_contenuto_accessibile")?has_content>
401 <#assign linkContAccessibile = currentArticle.getExpandoBridge().getAttribute("link_card_contenuto_accessibile") />
402 <#list linkContAccessibile?keys as key>
403 <#if key == locale>
404 <#assign linkContenutoAccessibile = linkContAccessibile?values[key_index] />
405 </#if>
406 </#list>
407 </#if>
408
409 <#assign titoloContenutoAccessibile = "" />
410 <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("titolo_card_contenuto_accessibile")?has_content>
411 <#assign titoloContAccessibile = currentArticle.getExpandoBridge().getAttribute("titolo_card_contenuto_accessibile") />
412 <#list titoloContAccessibile?keys as key>
413 <#if key == locale>
414 <#assign titoloContenutoAccessibile = titoloContAccessibile?values[key_index] />
415 </#if>
416 </#list>
417 </#if>
418
419 <#assign sottotitoloContenutoAccessibile = "" />
420 <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("sottotitolo_card_contenuto_accessibile")?has_content>
421 <#assign sottotitoloContAccessibile = currentArticle.getExpandoBridge().getAttribute("sottotitolo_card_contenuto_accessibile") />
422 <#list sottotitoloContAccessibile?keys as key>
423 <#if key == locale>
424 <#assign sottotitoloContenutoAccessibile = sottotitoloContAccessibile?values[key_index] />
425 </#if>
426 </#list>
427 </#if>
428
429 <#assign immagineContenutoAccessibile = "" />
430 <#if currentArticle.getExpandoBridge()?? && currentArticle.getExpandoBridge().getAttribute("immagine_card_contenuto_accessibile")?has_content>
431 <#assign immagineContenutoAccessibile = currentArticle.getExpandoBridge().getAttribute("immagine_card_contenuto_accessibile") />
432 </#if>
433
434 <#if linkContenutoAccessibile?has_content && titoloContenutoAccessibile?has_content && immagineContenutoAccessibile?has_content >
435 <div class="card card-horizontal card-event-1 card-event-default">
436 <a class="card-link" href="${linkContenutoAccessibile}" aria-label="${titoloContenutoAccessibile}"></a>
437 <span class="card-row">
438 <span class="card-image aspect-ratio card-item-first">
439 <img class="aspect-ratio-item aspect-ratio-item-center-ceil aspect-ratio-item-fluid bike-card" src="${immagineContenutoAccessibile}" alt="${titoloContenutoAccessibile}">
440 </span>
441 <span class="card-body">
442 <div class="row">
443 <div class="col-12"><span class="card-title" style="font-size:20px;">${titoloContenutoAccessibile}</span></div>
444 <#if sottotitoloContenutoAccessibile?has_content>
445 <div class="col-12"><span class="card-subtitle title-6">${sottotitoloContenutoAccessibile}</span></div>
446 </#if>
447 </div>
448 </span>
449 </span>
450 </div>
451 </#if>
452 <#recover>
453 </#attempt>
454 </aside>
455 </#if>
456 </div>
457 </article>
458</div>
459
460<#if ((accessibilita.getData())!)?has_content>
461<div class="bg-white">
462 <div class="container">
463 <div class="row">
464 <div class="col-12 col-md-8">
465 <div class="text-block text-block-left">
466 <div class="text">
467 <strong><@liferay.language key="label.accessibilita" /></strong>
468 ${accessibilita.getData()}
469 </div>
470 </div>
471 </div>
472 </div>
473 </div>
474</div>
475</#if>
476
477<#if ((sicurezza.getData())!)?has_content>
478<div class="bg-white">
479 <div class="container">
480 <div class="row">
481 <div class="col-12 col-md-8">
482 <div class="text-block text-block-left">
483 <div class="text">
484 <strong><@liferay.language key="label.sicurezza" /></strong>
485 ${sicurezza.getData()}
486 </div>
487 </div>
488 </div>
489 </div>
490 </div>
491</div>
492</#if>
493
494
495<#-- Chiamata API per informazioni utili -->
496<#assign baseUrl = structureService.getSiteBaseUrl(themeDisplay)>
497<#if baseUrl?ends_with("/")>
498 <#assign baseUrl = baseUrl?remove_ending("/")>
499</#if>
500
501<#assign apiPath = "/o/itinerary/useful-informations">
502<#assign queryParams = "?group-id=${groupId}&article-id=${journalArticleId}&language-id=${themeDisplay.getLanguageId()}">
503<#assign fullBaseUrl = themeDisplay.getPortalURL()>
504<#assign fullApiUrl = apiPath + queryParams>
505<#assign apiGpxPath = "/o/itinerary/gpx-poi">
506
507<div class="container-fluid margin-bottom-em-2">
508 <div class="row row-mappa">
509 <div class="info-fullscreen-toggle">
510 <button class="btn btn-info-toggle" aria-label="nascondi / mostra info mappa">
511 <div class="arrow-container"><i class="fa-solid fa-chevron-left"></i></div>
512 </button>
513 </div>
514 <div class="col-12 col-md-5 col-colmap border scrollable sidebar-map-view" style="padding-left: 30px; padding-right:30px;">
515 <div class="text-block text-block-left pt-0 h-100" id="global-track">
516 <div class="title-4 padding-bottom-em-1 text-center text-md-left padding-top-em-1">
517 <@liferay.language key="label.dettagli.tecnici.percorso"/>
518 </div>
519
520 <#list dati_tecnici_chiaveFieldSet.getSiblings()![] as datiTecnici>
521 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
522 <#if ((datiTecnici.dati_tecnici_chiave.getData())!)?has_content && datiTecnici.getData() != "null">
523 <div class="text font-weight-bold text-capitalize">${datiTecnici.dati_tecnici_chiave.getData()}</div>
524 </#if>
525 <#if ((datiTecnici.dati_tecnici_valore.getData())!)?has_content && datiTecnici.dati_tecnici_valore.getData() != "null">
526 <div class="text text-right">${datiTecnici.dati_tecnici_valore.getData()}</div>
527 </#if>
528 </div>
529 <hr>
530 </#list>
531
532 <div class="stages-itinerary mb-3">
533 <div class="title-4 padding-bottom-em-1 text-center text-md-left padding-top-em-1">
534 <@liferay.language key="label.segmenti.percorso"/>
535 </div>
536
537 <#list segmentsList![] as segmentData>
538 <#assign segmento = segmentData.segmento>
539 <div class="stage-itinerary" data-stage-more="segment-${segmentData_index + 1}">
540 <div class="mb-2 itinerary-stage">
541 <div class="itinerary-sidebar flex-row justify-content-between">
542 <div class="marker p-0">
543 <div class="marker-label text-red">
544 <#if ((segmento.getTitolo())!)?has_content>
545 ${segmento.getTitolo()}
546 </#if>
547 </div>
548 </div>
549 </div>
550 </div>
551 <#-- Controlli immagine -->
552 <#assign noLogoUrl = fullBaseUrl + baseUrl + "/o/umbria-theme/images/loghi/logo_no_image.png" />
553 <#assign imgAltText = "" />
554
555 <#if ((segmento.getImmagineCopertina().getImmagineCopertina().getPublicUrl())!)?has_content>
556 <#assign immagineCopertinaSet = segmento.getImmagineCopertina()>
557 <#assign imgAltText = "Immagine senza titolo">
558 <#if immagineCopertinaSet.getTestoAlternativoCopertina()?has_content>
559 <#assign imgAltText = immagineCopertinaSet.getTestoAlternativoCopertina()>
560 <#elseif immagineCopertinaSet.getDescrizioneImmagine()?has_content>
561 <#assign imgAltText = "Immagine: " + immagineCopertinaSet.getDescrizioneImmagine()>
562 </#if>
563 </#if>
564
565 <div class="cover">
566 <img class="cover-img"
567 src="${(immagineCopertinaSet.getImmagineCopertina().getPublicUrl())!noLogoUrl}"
568 data-fileentryid="${(immagineCopertinaSet.getImmagineCopertina().getFileEntryId())!(immagineCopertinaSet.getImmagineCopertina().getClassPK())!""}"
569 alt="${imgAltText}">
570 </div>
571
572 <#-- Descrizione breve -->
573 <div class="stage-infos mt-2">
574 <div class="text margin-right-em-1">
575 <#if segmento.getDescrizioneBreve()?has_content>
576 ${segmento.getDescrizioneBreve()}
577 </#if>
578 </div>
579 </div>
580 <div class="margin-top-em-2 btn btn-flat btn-red btn-default btn-small">
581 <@liferay.language key="label.mostra.tutto" />
582 </div>
583 </div>
584 <hr>
585 </#list>
586
587 </div>
588 </div>
589 <#if segmentsList?has_content>
590 <#list segmentsList as segmentData>
591 <#assign segmento = segmentData.segmento>
592 <#assign segmentResourcePrimKey = segmentData.resourcePrimKey />
593 <#assign segmentArticleId = segmentData.articleId>
594 <div class="div-more" id="segment-${segmentData_index + 1}" >
595 <div class="d-flex justify-content-between">
596 <button class="btn mt-2 pl-0 d-flex btn-back" aria-label="indietro"><svg class="svg-inline--fa fa-arrow-left mr-3" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-left" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"></path></svg><!-- <i class="fa-solid fa-arrow-left mr-3"></i> Font Awesome fontawesome.com --><@liferay.language key="label.torna.al.percorso"/></button>
597 </div>
598
599 <div class="text-block text-block-left pt-0">
600 <div class="title-4 padding-bottom-em-1 text-center padding-top-em-1">
601 <#if segmento.getTitolo()?has_content>
602 ${segmento.getTitolo()}
603 </#if>
604 </div>
605 <div class="text padding-bottom-em-1 font-weight-bold text-center">
606 <@liferay.language key="label.dettagli.tecnici.segmento"/>
607 </div>
608 <#-- Tempi di percorrenza -->
609 <#if segmento.getTempoPercorrenzaChiave()?has_content>
610
611 <#assign showSection = true>
612 <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza>
613 <#if !(tempoPercorrenza.getTempoPercorrenzaChiave()?has_content
614 && tempoPercorrenza.getTempoPercorrenzaValore()?has_content
615 && tempoPercorrenza.getTempoPercorrenzaIcona()?has_content)>
616 <#assign showSection = false>
617 </#if>
618 </#list>
619
620 <#if showSection>
621 <div class="overflow-auto">
622 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
623 <div class="text font-weight-bold"><@liferay.language key="label.tempo.percorrenza"/></div>
624 <div class="d-flex flex-justify-content-start pl-xl-3">
625 <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza>
626 <button class="p-1 rounded align-middle hover-overlay pl-md-0 pl-xl-1 border-0" aria-label="mostra durata percorso A piedi">
627 <div class="btn button-durata" data-divapertura="div-but-${tempoPercorrenza_index}">
628 <i class="${tempoPercorrenza.getTempoPercorrenzaIcona()}"></i>
629 </div>
630 </button>
631 </#list>
632 </div>
633 </div>
634
635 <#list segmento.getTempoPercorrenzaChiave() as tempoPercorrenza>
636 <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row hideTime" id="div-but-${tempoPercorrenza_index}">
637 <div class="text">${tempoPercorrenza.getTempoPercorrenzaChiave()}</div>
638 <div class="text">${tempoPercorrenza.getTempoPercorrenzaValore()}</div>
639 </div>
640 </#list>
641 </div>
642 <hr>
643 </#if>
644
645 </#if>
646 <#-- Caratteristiche tecniche -->
647 <#if segmento.getCaratteristicheTecniche()?has_content>
648
649 <#list segmento.getCaratteristicheTecniche() as caratteristichePrimoLivello>
650 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
651 <div class="text font-weight-bold">
652 <#if caratteristichePrimoLivello.getChiavePrimoLivello()?has_content && caratteristichePrimoLivello.getChiavePrimoLivello() != "null">
653 ${caratteristichePrimoLivello.getChiavePrimoLivello()}
654 </#if>
655 </div>
656
657 <div class="text text-right">
658 <#if caratteristichePrimoLivello.getValorePrimoLivello()?has_content && caratteristichePrimoLivello.getValorePrimoLivello() != "null">
659 ${caratteristichePrimoLivello.getValorePrimoLivello()}
660 </#if>
661 </div>
662 </div>
663
664 <#-- Lista puntata per chiave-valore di secondo livello -->
665 <#-- Chiave secondo livello (ripetibile) -->
666 <#if caratteristichePrimoLivello.getCaratteristicheTecnicheSecondoLivello()?has_content>
667 <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
668 <ul>
669 <#list caratteristichePrimoLivello.getCaratteristicheTecnicheSecondoLivello() as caratteristicheSecondoLivello>
670 <#if caratteristicheSecondoLivello.getChiaveSecondoLivello()?has_content && caratteristicheSecondoLivello.getChiaveSecondoLivello() != "null">
671 <li>
672 <div class="text">
673 ${caratteristicheSecondoLivello.getChiaveSecondoLivello()}
674 <#if caratteristicheSecondoLivello.getValoreSecondoLivello()?has_content && caratteristicheSecondoLivello.getValoreSecondoLivello() != "null">
675 : ${caratteristicheSecondoLivello.getValoreSecondoLivello()}
676 </#if>
677 </div>
678 </li>
679 </#if>
680 </#list>
681 </ul>
682 <hr>
683 </div>
684 </#if>
685 </#list>
686
687 <#-- GRAFICO DISLIVELLO ESTRATTO DAL GPX -->
688 <#if segmento.getMostraAltimetriaSegmento() == true>
689 <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
690 <canvas id="segment-${segmentData_index + 1}-elevationChart" width="400" height="200"></canvas>
691 </div>
692 <#else>
693 <div class="d-none flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
694 <canvas id="segment-${segmentData_index + 1}-elevationChart" width="400" height="200"></canvas>
695 </div>
696 </#if>
697 <#-- DATA ULTIMO AGGIORNAMENTO -->
698 <#if segmento.getDataUltimoAggiornamento()?has_content>
699 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
700 <div class="text font-weight-bold">
701 <@liferay.language key="label.data.ultimo.aggiornamento"/>
702 </div>
703 <div class="text text-right">
704 ${segmento.getDataUltimoAggiornamento()?string("dd MMM yyyy")}
705 </div>
706 </div>
707 <hr>
708 </#if>
709
710 </#if>
711
712 <#-- Difficolta lungo il percorso -->
713 <#if segmento.getAccessibilitaDifficolta()?has_content>
714 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
715 <div class="text font-weight-bold"><@liferay.language key="label.difficolta.lungo.segmento"/></div>
716 </div>
717 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
718 <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
719 ${segmento.getAccessibilitaDifficolta()}
720 </div>
721 </div>
722 <hr>
723 </#if>
724
725 <#-- Video -->
726 <#if ((segmento.getVideo().getPublicUrl())!)?has_content>
727 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
728 <div class="text font-weight-bold lineheight-2-5">
729 <@liferay.language key="label.video.guida"/>
730 </div>
731 <div class="text text-right">
732 <button class="btn modalvideo font-1-5rem" aria-label="apri video tappa"
733 data-toggle="modal" data-target="#modalvideocontainer"
734 data-urlvideo="${segmento.getVideo().getPublicUrl()}">
735 <i class="fas fa-play"></i>
736 </button>
737 </div>
738 </div>
739 <hr>
740 </#if>
741
742 <#-- Audio -->
743 <#if ((segmento.getAudio().getPublicUrl())!)?has_content>
744 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
745 <div class="text font-weight-bold"><@liferay.language key="label.audio.descrizione"/></div>
746 <div class="text text-right">
747 <audio controls preload="none">
748 <source src="${segmento.getAudio().getPublicUrl()}" type="audio/ogg">
749 <source src="${segmento.getAudio().getPublicUrl()}" type="audio/mpeg">
750 </audio>
751 </div>
752 </div>
753 <hr>
754 </#if>
755 <#if segmento.getImmagine()?has_content >
756 <div>
757 <div class="text font-weight-bold">
758 <@liferay.language key="label.foto"/>
759 </div>
760 <div class="photo-carousel"
761 data-config-img-ajax="{"url":"/o/itinerary/img-tappa?languageId=${themeDisplay.languageId}&articleId=${segmentArticleId}&groupId=${groupId}&resourcePrimKey=${segmentData.resourcePrimKey}","container":"#carosel-segment-${segmentData_index + 1}","template":"#template-imgs-tappa","data":{"tappa":"segment-${segmentData_index + 1}"},"append":true}">
762 <div class="carousel-container transparent little-carousel">
763 <div id="carosel-segment-${segmentData_index + 1}"
764 class="tns-carousel tns-carousel-default tns-controlpreload"
765 data-tns-config="{"loop":false,"items":2,"responsive":{"768":{"items":3},"991":{"items":4}}}">
766 </div>
767 </div>
768 </div>
769 </div>
770 <hr>
771 </#if>
772 <#-- Note caratteristiche tecniche -->
773 <#if segmento.getNoteCaratteristicheTecniche()?has_content>
774 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
775 <div class="text font-weight-bold pb-4"><@liferay.language key="label.note.caratteristiche.tecniche"/></div>
776 </div>
777 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
778 <div class="flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
779 <div class="text">
780 ${segmento.getNoteCaratteristicheTecniche()}
781 </div>
782 </div>
783 </div>
784 <hr>
785 </#if>
786
787 <#if (segmento.getDescrizioneBreve()?has_content)
788 || ((segmento.getDescrizione()?has_content))>
789 <div class="d-flex flex-justify-content-between flex-column flex-sm-row flex-md-column flex-xl-row">
790 <div class="text font-weight-bold pb-4"><@liferay.language key="label.descrizione"/></div>
791 </div>
792 <div class="pb-4d d-flex flex-column">
793 <#if (segmento.getDescrizioneBreve()?has_content)>
794 <div class="summary">
795 <div class="text">${segmento.getDescrizioneBreve()}</div>
796 </div>
797 </#if>
798 <#if ((segmento.getDescrizione()?has_content))>
799 <div class="d-none descrizione">
800 <div class="text">${segmento.getDescrizione()}</div>
801 </div>
802 </#if>
803 <#if segmento.getDescrizione()?has_content>
804 <div class="margin-top-em-2 mx-auto btn btn-flat btn-big btn-green more">
805 <div class="text"><@liferay.language key="label.mostra.tutto"/></div>
806 </div>
807 <div class="margin-top-em-2 mx-auto btn btn-flat btn-big d-none btn-green less">
808 <div class="text"><@liferay.language key="label.mostra.meno"/></div>
809 </div>
810 </#if>
811 </div>
812 <hr>
813 </#if>
814 <div>
815 <div class="container-infosnew">
816 <div class="event-button" data-ajax-button="{"method":"get","url":"${fullApiUrl}","container":"#results-segment-${segmentData_index + 1}","preload":true,"template":"#template-points","pageParam":"page","current_segment":"segment-${segmentData_index + 1}","page":0,"append":true,"__class":""}" data-page="1" style="display: none;"> </div>
817 </div>
818 <div class="resultsHandlebarsSec" id="results-segment-${segmentData_index + 1}"></div> </div>
819 </div>
820 </div>
821 </#list>
822 </#if>
823 </div>
824 <script id="template-points" type="text/x-handlebars-template">
825 {{#if_ContentObj this.segments_points this.segment}}
826 <div class="d-flex justify-content-between align-items-center pb-4">
827 <div class="text font-weight-bold"><@liferay.language key="label.informazioni.utili"/></div>
828 <div class="div-filters">
829 <div class="container-switch d-flex align-items-center">
830 <label class="form-check-label me-2" for="marker-switch">
831 <@liferay.language key="label.mostra.su.mappa"/>
832 </label>
833 <div class="form-check form-switch">
834 <input class="marker-switch form-check-input" type="checkbox" role="switch" data-divparent="{{this.segment}}">
835 </div>
836 </div>
837 </div>
838</div>
839{{/if_ContentObj}}
840{{#each this.segments_points as | point |}}
841{{#each_Condition point.data ../this.segment}}
842<div class="div">
843 <div class="row m-0">
844 <div class="d-flex flex-row w-100">
845 <div class="col-2 col-sm-4 col-lg-2">
846 <div class="iconinfo text-center" style="line-height:1"><i class="fa-2xl font-3rem {{this.info.icon}}"></i></div>
847 </div>
848 <div class="col-8 col-sm-6 col-lg-9 padding-left-lg-em-0 pl-4">
849 <div class="ml-2">
850 <div class="itinerary-sidebar flex-row">
851 <div class="marker-label text-red font-weight-bold">{{this.info.title}}</div>
852 </div>{{#each this.data}}
853 {{#if (eq this.idsezione ../../this.segment) }}
854 {{#if this.coordinates}}
855 <div>
856 <div class="itinerary-stage" id="{{this.id}}" data-popup-url="{{this.url}}" data-icon-marker="{{../this.info.icon}}" data-type="{{this.type}}" data-parent-tappa="{{this.idsezione}}" data-coords="[{"lat":"{{this.coordinates.lat}}","lng":"{{this.coordinates.lng}}"}]" data-title="{{this.name}}" data-altri-data="data-altri-data">
857 <div class="name-place">{{this.name}}</div>
858 </div>
859 </div>{{else}}
860 <div>
861 <div class="itinerary-stage-nomarker" id="{{this.id}}">
862 <div class="name-place">{{this.name}}</div>
863 </div>
864 </div>{{/if}}
865 {{/if}}
866 {{/each}}
867 </div>
868 </div>
869 </div>
870 </div>
871</div>
872<hr/>{{/each_Condition}}
873{{/each}}
874 </script>
875
876
877 <#assign gpxJson = "[" />
878 <#list gpxFilesList as gpxFile>
879 <#assign gpxJson += '{"gpxfile":"${gpxFile.gpxfile}", "infoDiv":"${gpxFile.infoDiv}"}' />
880 <#if gpxFile_has_next>
881 <#assign gpxJson += "," />
882 </#if>
883 </#list>
884 <#assign gpxJson += "]" />
885
886 <#-- Converti l'array in stringa JSON -->
887 <#assign gpxFileEntryIdsJson = "[" />
888 <#list gpxFileEntryIds as id>
889 <#assign gpxFileEntryIdsJson += id?c /><#-- ?c converte in stringa -->
890 <#if id_has_next>
891 <#assign gpxFileEntryIdsJson += "," />
892 </#if>
893 </#list>
894 <#assign gpxFileEntryIdsJson += "]" />
895
896 <div class="col-12 col-md-7 col-map map-align p-0">
897 <div class="sidebar">
898 <div class="map map-container map-view">
899 <div class="map-content">
900 <div id="map-handlebarsplus"
901 class="leaflet-interactive-map map-summary-itinerary map-itinerary-gpx leaflet-container leaflet-touch leaflet-fade-anim leaflet-touch-zoom"
902 data-kml=""
903 data-gpx='${gpxJson}'
904 data-idgpx='${gpxFileEntryIdsJson}'
905 data-gpxglobal="${(gpx_globale.getData())!""}"
906 data-config="{"otherTemplate":false,"isItinerary":true,"clustering":true,"multiLayer":true,"customFilters":true,"filters":${filtersJson?html},"dataAjaxpoint":{"groupId":"${groupId}"},"ajaxpointutl":"${apiGpxPath}","articleId":"${journalArticleId}"}">
907 </div>
908 </div>
909 </div>
910 </div>
911 </div>
912 </div>
913</div>
914
915<#if ((descrizione_immagineFieldSet.getSiblings()[0].immagine.getData())!)?has_content>
916<div class="bg-white">
917 <div class="carousel-container carousel-no-ctrl transparent margin-bottom-em-1 tns-overflow-show carousel-image-slide carousel-draggable">
918 <div class="tns-carousel tns-carousel-no-ctrl" data-tns-config="{"autoWidth":true,"items":2,"autoplay":false,
919 "responsive":{"768":{"items":3},"992":{"items":4}}}">
920 <#list descrizione_immagineFieldSet.getSiblings() as cur_immagine>
921 <div class="item-with-caption">
922 <#if ((cur_immagine.immagine.getData())!)?has_content>
923 <img class="slide-image" src="${cur_immagine.immagine.getData()}"
924 data-fileentryid="${(cur_immagine.immagine.getAttribute("fileEntryId"))!(cur_immagine.immagine.getAttribute("classPK"))!""}"
925 alt="${cur_immagine.testo_alternativo.getData()}">
926 </#if>
927 <#if ((cur_immagine.didascalia.getData())!)?has_content>
928 <p class="caption">${cur_immagine.didascalia.getData()}</p>
929 </#if>
930 </div>
931 </#list>
932 </div>
933 </div>
934</div>
935</#if>
936
937<#assign tomApi = serviceLocator.findService("it.inera.tom.api.TOMAPI")>
938<#assign offerResults = [] />
939<#attempt>
940 <#assign offerResults = (tomApi.getJsonOffersListResultByMunicipalities(municipalityNames, lang).getResponse().getResults())![] />
941<#recover>
942</#attempt>
943
944<#if offerResults?has_content>
945<aside class="bg-white" id="hideable">
946 <div class="container padding-top-em-3">
947 <div class="row">
948 <div class="col-12 col-md-10 offset-md-1 margin-bottom-lg-em-0 margin-bottom-em-2">
949 <div class="text-block text-block-center">
950 <div class="title-2">
951 <@liferay.language key="label.migliori.offerte" />
952 </div>
953 <div class="text">
954 <@liferay.language key="label.proposte.vivere.umbria" />
955 </div>
956 </div>
957 </div>
958 </div>
959
960 <div class="row">
961 <div class="col-12">
962 <div class="d-flex flex-justify-content-end">
963 <a class="link-showall" href="/offerte-luogo?municipality=${municipalityNamesString}&territory=${territoryNameString}"><@liferay.language key="label.vedi.tutte" />
964 <i class="fas fa-angle-right"></i>
965 </a>
966 </div>
967 </div>
968 <div class="col-12">
969 <div class="carousel-container transparent margin-top-em-1 margin-bottom-em-2">
970 <div class="tns-carousel tns-carousel-default">
971 <#list offerResults as offerResult>
972 <div>
973 <div class="card card-1 card-offerta has-info-commercial">
974 <a class="card-link"
975 href="/dettaglio-offerta/-/dettaglio/${offerResult.getSlug()}_${offerResult.getId()}_${offerResult.getType()}"
976 aria-label="${offerResult.getTitle()}"></a>
977 <div class="card-header">
978 <div class="hidden" id="tagmanager_item_card">
979 <span id="tagmanager_item_id">${offerResult.getId()}</span>
980 <span id="tagmanager_item_category_card">${offerResult.getType()}</span>
981 <span id="tagmanager_item_name">${offerResult.getTitle()}</span>
982 <span id="tagmanager_item_list_name_card">Le migliori offerte per te</span>
983 <span id="tagmanager_item_list_id"></span>
984 <span id="tagmanager_item_brand">${offerResult.getType()}</span>
985 <span id="tagmanager_index">${offerResult_index}</span>
986 </div>
987 <div class="card-header-bg aspect-ratio aspect-ratio-4-3">
988 <#assign firstImage = (offerResult.getGalleries().getImages()[0])!>
989 <#assign relativeImageUrl = firstImage.getFile()!/>
990 <#assign fullImageUrl = "/o/umbria-theme/images/loghi/logo_no_image.png"/>
991 <#assign alt = "logo_no_image"/>
992 <#if relativeImageUrl?has_content>
993 <#assign fullImageUrl = propsUtil.get("tom.base.image.url") + relativeImageUrl/>
994 <#assign alt ="Titolo: " + offerResult.getTitle()!/>
995
996 <#if (firstImage.getAlt()!)?has_content>
997 <#assign alt = offerResult.getGalleries().getImages()[0].getAlt()/>
998 </#if>
999 </#if>
1000 <img src="${fullImageUrl}" alt="${alt}">
1001 </div>
1002
1003
1004 <button class="link link-tripplanner link-tripplanner-1 link-tripplanner-top-right margin-top-em-2 margin-right-em-1"
1005 data-detail-type="${offerResult.getType()}<#if offerResult.getType()! != "accommodation">/offer</#if>"
1006 data-id="${offerResult.getId()}" data-tom="true"
1007 aria-label="<@liferay.language key="label.aggiungi.elimina.viaggio"/>">
1008 <i class="far fa-heart text-red"></i>
1009 <i class="fas fa-heart text-red" style="display:none;"></i>
1010 </button>
1011 <div class="card-header-info">
1012 <div class="card-badges">
1013 <div class="badge badge-light-blue">
1014 <#if offerResult.getType() == 'guide'>
1015 <@liferay.language key="label.guide" />
1016 </#if>
1017 <#if offerResult.getType() == 'travelagency'>
1018 <@liferay.language key="label.pacchetti.turistici" />
1019 </#if>
1020 <#if offerResult.getType() == 'consortium'>
1021 <@liferay.language key="label.pacchetti.turistici" />
1022 </#if>
1023 <#if offerResult.getType() == 'accommodation'>
1024 <@liferay.language key="label.accommodation" />
1025 </#if>
1026 <#if offerResult.getType() == 'service'>
1027 <@liferay.language key="label.esperienze.in.azienda" />
1028 </#if>
1029 <#if offerResult.getType() == 'educationalfarm'>
1030 <@liferay.language key="label.percorsi.didattici" />
1031 </#if>
1032 </div>
1033 </div>
1034 <div class="header-title title-5">${offerResult.getTitle()}</div>
1035 </div>
1036 </div>
1037 <div class="card-body">
1038 <div class="card-body-title title-4">
1039 ${offerResult.getTitle()}
1040 </div>
1041 <#if offerResult.getSubtitle()?has_content>
1042 <div class="card-body-subtitle">
1043 ${offerResult.getSubtitle()}
1044 </div>
1045 </#if>
1046 </div>
1047 <div class="card-info card-info-commercial">
1048 <div class="info info-commercial">
1049 <#if ((offerResult.getDuration().getCount())!)?has_content
1050 && ((offerResult.getDuration().getType())!)?has_content>
1051 <div class="label"><@liferay.language key="label.durata" /></div>
1052 <div class="title text-bold">
1053 ${offerResult.getDuration().getCount()} ${offerResult.getDuration().getType()}
1054 </div>
1055 </#if>
1056 </div>
1057 <div class="info info-commercial">
1058 <#if ((offerResult.getMinimumPrice()!0) > 0)>
1059 <div class="label">
1060 <@liferay.language key="label.a.partire.da" />
1061 </div>
1062 <div class="title text-bold">
1063 <@liferay.language key="label.euro" /> ${offerResult.getMinimumPrice()}
1064 </div>
1065 <#else>
1066 <div class="label">
1067 <@liferay.language key="label.prezzo.su.richiesta" />
1068 </div>
1069 </#if>
1070 </div>
1071 </div>
1072 </div>
1073 </div>
1074 </#list>
1075 </div>
1076 </div>
1077 </div>
1078 </div>
1079 </div>
1080</aside>
1081</#if>
1082
1083
1084<#if results?has_content>
1085<aside class="bg-gray">
1086 <div class="container padding-top-em-3 padding-bottom-em-5">
1087 <div class="row">
1088 <div class="col-12 col-md-10 offset-md-1 margin-bottom-em-2 margin-bottom-lg-em-0">
1089 <div class="text-block text-block-center">
1090 <div class="title-2">
1091 <@liferay.language key="label.potrebbe.interessarti.anche"/>
1092 </div>
1093 <div class="text">
1094 <@liferay.language key="label.scopri.proposte.uniche"/>
1095 </div>
1096 </div>
1097 </div>
1098
1099 <div class="col-12 same-heigh-cards">
1100 <div class="carousel-container transparent carousel-controls-bottom margin-top-em-1 margin-bottom-em-2 carousel-draggable">
1101 <div class="tns-carousel tns-carousel-default tns-nav-off">
1102 <#list results as related>
1103 <#assign contentByLocale = related.getContentByLocale(themeDisplay.getLanguageId()) />
1104 <#assign document = saxReaderUtil.read(contentByLocale) >
1105 <#assign rootElement = document.getRootElement()>
1106
1107 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")>
1108 <#assign relatedTitolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()>
1109
1110 <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")>
1111 <#assign relatedSottotitolo = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()>
1112
1113 <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='immagine_banner']")>
1114 <#assign relatedImmagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()>
1115 <#if relatedImmagineBanner?has_content >
1116 <#assign imgBannerJson = relatedImmagineBanner?eval_json />
1117 <#assign imgBannerId = (imgBannerJson.fileEntryId!imgBannerJson.classPK!0)?number />
1118 <#else>
1119 <#assign imgBannerId = 0 >
1120 </#if>
1121 <#assign xPathTestoAlternativoImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_banner']")>
1122 <#assign relatedTestoAlternativoImmagineBanner = xPathTestoAlternativoImmagineBanner.selectSingleNode(rootElement).getStringValue()>
1123
1124 <#assign resourcePrimKey = related.getResourcePrimKey() />
1125 <#assign categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey)![] />
1126
1127 <#assign categoryNames = [] >
1128
1129 <#list categories as category>
1130 <#if vocabularyIdUmbria == category.getVocabularyId() >
1131 <#assign categoryNames = categoryNames + [category.getTitle(themeDisplay.getLanguageId())] >
1132 </#if>
1133 </#list>
1134
1135 <#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)>
1136 <div>
1137 <a href="${detailBaseUrl}/-/${related.getUrlTitle(locale)}" aria-label="${related.getTitle()}"
1138 class="card card-1 card-1-styled">
1139 <div class="card-header">
1140 <div class="hidden" id="tagmanager_item_card_potrebbe_interessarti">
1141 <span id="tagmanager_item_id_potrebbe_interessarti">${related.getId()}</span>
1142 <span id="tagmanager_item_category_card_potrebbe_interessarti">${titleCategory}</span>
1143 <span id="tagmanager_item_name_potrebbe_interessarti">${related.getTitle()}</span>
1144 <span id="tagmanager_item_list_name_potrebbe_interessarti">Potrebbe interessarti</span>
1145 <span id="tagmanager_item_list_id_potrebbe_interessarti"></span>
1146 <span id="tagmanager_item_brand_potrebbe_interessarti">${titleCategory}</span>
1147 <span id="tagmanager_index_potrebbe_interessarti">${related_index}</span>
1148 </div>
1149
1150 <div class="card-header-bg aspect-ratio aspect-ratio-4-3">
1151 <#if imgBannerId gt 0>
1152 <@adaptive_media_image["img"]
1153 alt=relatedTestoAlternativoImmagineBanner
1154 fileVersion=dlAppServiceUtil.getFileEntry(imgBannerId).getFileVersion()/>
1155 </#if>
1156 </div>
1157 <button class="link link-tripplanner link-tripplanner-top-right margin-top-em-2 margin-right-em-1 link-tripplanner-styled" data-id="${related.getArticleId()}" data-tom="false" aria-label="<@liferay.language key="label.aggiungi.elimina.viaggio"/>">
1158 <i class="far fa-heart text-red" data-prefix="far"></i>
1159 <i class="fas fa-heart text-red" data-prefix="fas" style="display:none"></i>
1160 </button>
1161 <div class="card-header-info">
1162 <#list categoryNames as categoryName>
1163 <div class="badge btn-trasparent">
1164 ${categoryName}
1165 </div>
1166 </#list>
1167 </div>
1168 </div>
1169 <div class="card-body">
1170 <div class="card-body-title title-4">
1171 ${relatedTitolo}
1172 </div>
1173 <div class="card-body-subtitle">
1174 ${relatedSottotitolo}
1175 </div>
1176 </div>
1177 <div class="card-info mt-4"></div>
1178 </a>
1179 </div>
1180 </#list>
1181 </div>
1182 </div>
1183 </div>
1184 </div>
1185 </div>
1186</aside>
1187</#if>
1188
1189<script>
1190 $("#backLink").click(function(event) {
1191 event.preventDefault();
1192 history.back(1);
1193 });
1194</script>
1195
1196<script id="map-popup-1-template" type="text/x-handlebars-template">
1197 <div class="map-popup map-popup-1">
1198 {{#if (eq url '') }}
1199 <div class="border-0 p-0 m-0 title" id="itinerary-popup">{{title}}</div>
1200 {{else}}
1201 <a href="{{url}}" target="_blank"><div class="title">{{title}}</div></a>
1202 {{/if}}
1203 </div>
1204</script>
1205<script id="map-popup-2-template" type="text/x-handlebars-template">
1206 <div class="map-popup map-popup-1" style="width:301px">
1207 <a class="card card-5" href="#" aria-label="{{title}}">
1208 <div class="card-header">
1209 <div class="card-image"><img src="{{image}}" alt="{{alt}}"/></div>
1210 </div>
1211 <div class="card-body">
1212 <div class="card-info">{{type}}</div>
1213 <div class="card-title">{{title}}</div>
1214 <div class="card-text">{{text}}</div>
1215 </div>
1216 <div class="card-footer">
1217 <div class="card-info">
1218 <div class="button-container" style="text-align: right; margin-top: 1em;">
1219 <button id="button-popup" class="btn-transparent" data-href="{{href}}">Scopri di più</button>
1220 </div>
1221 </div>
1222 </div>
1223 </a>
1224 </div>
1225</script>
1226<script id="map-popup-3-template" type="text/x-handlebars-template">
1227 <div class="map-popup map-popup-1" style="width:301px">
1228 <a class="card card-5" href="#" aria-label="{{title}}">
1229 <div class="card-header">
1230 <div class="card-image"><img src="{{image}}" alt="{{alt}}"/></div>
1231 </div>
1232 <div class="card-body">
1233 <div class="card-info">{{type}}</div>
1234 <div class="card-title">{{title}}</div>
1235 <div class="card-text">{{text}}</div>
1236 </div>
1237 <div class="card-footer">
1238 <div class="card-info"></div>
1239 </div>
1240 </a>
1241 </div>
1242</script>
1243
1244<div class="modal bs-modal fade" id="modalvideocontainer" tabindex="-1" role="dialog" aria-label="Modal video" aria-hidden="true">
1245 <div class="modal-dialog" role="document">
1246 <div class="modal-content">
1247 <div class="modal-header">
1248 <button class="btn btn-close modalvidoe-close" type="button" data-dismiss="modal" aria-label="Chiudi finestra modale"><span aria-hidden="true">×</span></button>
1249 </div>
1250 <div class="modal-body">
1251 <div id="modalVideoView"></div>
1252 </div>
1253 </div>
1254 </div>
1255</div>
1256
1257<div class="modal bs-modal fade" id="filterModal" tabindex="-1" role="dialog" aria-label="Modal filtri" aria-hidden="true">
1258 <div class="modal-dialog modal-dialog-centered basic-modal">
1259 <div class="modal-content">
1260 <div class="modal-header">
1261 <h5 class="modal-title" data-asw-orgfontsize="20" style="font-size: 20px;"><@liferay.language key="label.filtri"/></h5>
1262 <div class="buttons-modal">
1263 <button class="btn" type="button" data-dismiss="modal" aria-label="Close"><@liferay.language key="label.cancella.filtri"/></button>
1264 <button class="close" type="button" data-dismiss="modal" aria-label="Close"><span aria-hidden="true" style="font-size:25px" data-asw-orgfontsize="25">×</span></button>
1265 </div>
1266 </div>
1267 <div class="modal-body" data-has-scroll-event="true">
1268 <div class="text-block pt-0 pb-3">
1269 <div class="text font-weight-bold"><@liferay.language key="label.informazioni.utili"/></div>
1270 <div class="points-container border p-3">
1271 <button class="badge badge-pill badge-light text-md" data-istype="fontane"><@liferay.language key="label.fontane"/></button>
1272 <button class="badge badge-pill badge-light text-md" data-istype="parcheggi"><@liferay.language key="label.parcheggi"/></button>
1273 <button class="badge badge-pill badge-light text-md" data-istype="bagni"><@liferay.language key="label.bagni"/></button>
1274 <button class="badge badge-pill badge-light text-md" data-istype="ristoranti"><@liferay.language key="label.for.Ristoranti"/></button>
1275 </div>
1276 </div>
1277 <div class="text-block pt-0 pb-3">
1278 <div class="text font-weight-bold"><@liferay.language key="label.punti.interesse"/></div>
1279 <div class="points-container border p-3">
1280 <button class="badge badge-pill badge-light text-1rem" data-istype="accommodation">Accommodation</button>
1281 <button class="badge badge-pill badge-light text-1rem" data-istype="rental">Rental</button>
1282 </div>
1283 </div>
1284 </div>
1285 </div>
1286 </div>
1287</div>
1288
1289<script id="template-imgs-tappa" type="text/x-handlebars-template">
1290 {{#each this.imgs}}
1291 <div>
1292 <a href="{{this.src}}" data-lightbox="gallery-slide-{{../this.tappaid}}" data-title="{{this.didascalia}}" data-alt="{{this.alt}}">
1293 <img class="image-mini m-0" src="{{this.src}}" alt="{{this.alt}}" loading="lazy">
1294 </a>
1295 </div>
1296 {{/each}}
1297</script>