Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> response.data.docs.getJSONObject(0) [in template "3572636#3572671#4339473" at line 24, column 24]
----
Tip: If the failing expression is known to be 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 doc = response.data.docs.getJ... [in template "3572636#3572671#4339473" at line 24, column 9]
---- 1<#import "_TEMPLATE_CONTEXT_/3572636/3574130/23609/3793037" as d40> 2 3<#setting url_escaping_charset="UTF-8"> 4 5<#assign 6 PUTIL = objectUtil("com.liferay.portal.kernel.util.PortalUtil") 7 uuid = themeDisplay.getURLCurrent()?keep_after("-/c/n/")?keep_before("?")?keep_after_last("_") 8 langId = locale?keep_before("_") 9 contentType = "poi" 10 vueActions = "" 11 doc = "" 12 lat = "0" 13 lng = "0" 14 hasCoords = false 15/> 16 17<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 18<#assign z=request.setAttribute("ogUrl","${currentUrl}")> 19 20<#if uuid?has_content> 21 <#assign response = d40.fetchData("https://guestapp.d40.it/v1/search/apt-trento/${contentType}/?uuid=${uuid}")> 22 23 <#if !response.error && response.data.docs?has_content> 24 <#assign doc = response.data.docs.getJSONObject(0)> 25 26 ${request.session.removeAttribute("circularCategories")} 27 ${request.session.setAttribute("circularCategories", doc.details.assetCategoryIds)} 28 </#if> 29</#if> 30 31<#if doc?has_content> 32 <#if doc.details?? && doc.details.name[langId]?has_content> 33 ${PUTIL.setPageTitle(doc.details.name[langId], request)} 34 </#if> 35 36 <#assign vueActions = "getFavorites();"> 37 38 <#if doc.details.location.geoCoords.lat?has_content && doc.details.location.geoCoords.lon?has_content> 39 <#assign 40 hasCoords = true 41 lat = doc.details.location.geoCoords.lat 42 lng = doc.details.location.geoCoords.lon 43 vueActions = "getFavorites();buildMap(${lat}, ${lng})" 44 /> 45 </#if> 46</#if> 47 48<style> 49 .swiper-button-next:after{ 50 content: ""; 51 } 52 .swiper-button-prev:after{ 53 content: ""; 54 } 55 .bg-darkgray{ 56 background-color: #e5e5e5 !important; 57 } 58 .min-h-12{ 59 min-height: 3rem; 60 } 61 .-ml-5{ 62 margin-left: -5%; 63 } 64</style> 65 66<div v-scope id="${d40.portletNamespace}" @vue:mounted="${vueActions}" v-cloak> 67 <#if doc?has_content> 68 <#if themeDisplay.getLayout().getAncestors()?has_content> 69 <section id="breadcrumb" class="z-15 mt-25"> 70 <div class="container"> 71 <ol class="breadcrumb flex lg:justify-center"> 72 <li class="pl-1 text-sm mr-2 relative">${d40.getLabel("sei_in")}:</li> 73 74 <li class="breadcrumb-item"> 75 <a href="/" class="breadcrumb-link" title="Home"> 76 <span class="breadcrumb-text-truncate text-dark underline">Home</span> 77 </a> 78 </li> 79 80 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor> 81 <li class="breadcrumb-item"> 82 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${d40.escape(ancestor.getHTMLTitle(locale))}"> 83 <span class="breadcrumb-text-truncate text-dark underline"> 84 ${d40.escape(ancestor.getHTMLTitle(locale))} 85 </span> 86 </a> 87 </li> 88 </#list> 89 90 <li class="breadcrumb-item active"> 91 <span class="breadcrumb-text-truncate text-dark"> 92 ${doc.details.name[langId]} 93 </span> 94 </li> 95 </ol> 96 </div> 97 </section> 98 </#if> 99 100 <section class="relative mt-20"> 101 <div class="container"> 102 <div class="row"> 103 <div class="col-12 col-lg-7"> 104 <div class="card-row flex-col lg:flex-row mb-10"> 105 <div class="autofit-col autofit-col-expand order-2 lg:order-1"> 106 <div class="autofit-section"> 107 <p class="text-dark font-semibold font-heading text-3xl lg:text-4xl uppercase"> 108 ${doc.details.name[langId]} 109 <#assign z=request.setAttribute("ogTitle","${doc.details.name[langId]}")> 110 </p> 111 </div> 112 </div> 113 <div class="autofit-col justify-start order-1 lg:order-2 mb-3 lg:mb-0"> 114 <div class="autofit-section"> 115 <div class="flex space-x-4"> 116 <button type="button" v-if="isFavorite('${doc.uuid}')" @click="removeFavorite($event, '${doc.uuid}')" class="btn btn-link px-2"> 117 <i class="fas fa-heart text-dark fa-2x"></i> 118 </button> 119 <button type="button" v-else @click="setFavorite($event, {id: '${doc.uuid}', contentJSON: {title: '${doc.details.name[langId]?js_string}', previewDescription: '', description: '', geoRef: '', previewPicture: '${d40.getDTNPreview(doc)}', viewUrl: '${d40.getDTNUrl(doc.details.name[langId], doc.uuid, contentType)}'}})" class="btn btn-link px-2"> 120 <i class="fal fa-heart text-dark fa-2x"></i> 121 </button> 122 123 <button type="button" @click="share('${doc.details.name[langId]}', '')" class="btn btn-link px-2"> 124 <i class="fas fa-share-alt text-dark fa-2x"></i> 125 </button> 126 </div> 127 </div> 128 </div> 129 </div> 130 131 <#if doc.timetables.timeDescription[langId]?has_content> 132 <div class="text-dark text-lg font-light mb-15 mt-5"> 133 ${doc.timetables.timeDescription[langId]} 134 </div> 135 </#if> 136 137 <#if doc.details.description[langId]?has_content> 138 <div class="underline-grow text-dark font-light lg:text-lg leading-loose"> 139 ${doc.details.description[langId]} 140 141 <#attempt> 142 <#if doc.details.description[langId]?length lt 160> 143 <#assign 144 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}") 145 /> 146 <#else> 147 <#assign 148 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])?substring(0,160)}") 149 /> 150 </#if> 151 <#recover> 152 <#assign 153 z=request.setAttribute("ogDesc","${htmlUtil.stripHtml(doc.details.description[langId])}") 154 /> 155 </#attempt> 156 </div> 157 </#if> 158 </div> 159 160 <div class="xl:absolute col-12 col-lg-5 xl:max-w-xl lg:right-0"> 161 <div class="bg-light"> 162 <div class="card-body px-5 pt-5 lg:px-10 lg:pt-10 pb-0"> 163 <p class="text-dark font-bold uppercase text-lg mb-0"> 164 ${d40.getLabel("informazioni_contatti")} 165 </p> 166 <#if doc.details.townLabel != "{}"> 167 <p class="text-dark text-lg mb-0"> 168 ${d40.getLabel("localita")}: <span class="text-capitalize">${doc.details.townLabel[langId]}</span> 169 </p> 170 </#if> 171 <#if doc.timetables.time_infos?has_content> 172 <p class="text-dark font-bold text-lg mb-0 mt-3"> 173 ${d40.getLabel("date_apertura")} 174 </p> 175 </#if> 176 </div> 177 178 <#if doc.timetables.time_infos?has_content> 179 <div class="flex min-h-12"> 180 <details class="bg-darkgray w-full lg:w-105% right-0 -ml-5"> 181 <summary class="btn btn-link text-dark no-underline my-1 ml-12"> 182 <i class="fal fa-calendar-alt"></i> 183 <span>${doc.timetables.time_infos.getJSONObject(0).date_from} - ${doc.timetables.time_infos.getJSONObject(0).time_from} - ${doc.timetables.time_infos.getJSONObject(0).time_to}</span> 184 <i class="fal fa-chevron-down fa-lg ml-5"></i> 185 </summary> 186 187 <div class="card-body px-5 lg:px-10"> 188 <ul> 189 <#list doc.timetables.time_infos.iterator() as datetime> 190 <li class="text-dark mb-1"> 191 ${d40.getLabel("dal")} ${datetime.date_from} 192 ${d40.getLabel("al")} ${datetime.date_to} 193 ${d40.getLabel("dalle")} ${datetime.time_from} 194 ${d40.getLabel("alle")} ${datetime.time_to} 195 </li> 196 </#list> 197 </ul> 198 </div> 199 </details> 200 </div> 201 </#if> 202 <div class="card-body px-5 lg:px-10"> 203 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 204 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 205 <p class="text-dark text-lg mb-0"> 206 Tel: ${phone} 207 </p> 208 </#list> 209 </#if> 210 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 211 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="block no-underline text-dark text-lg space-x-2 mb-0"> 212 <i class="far fa-envelope text-dark"></i> 213 <u>${doc.contacts.getJSONObject(0).mail}</u> 214 </a> 215 </#if> 216 <#if doc.contacts.getJSONObject(0).websiteUrl[langId]?? && doc.contacts.getJSONObject(0).websiteUrl[langId]?has_content> 217 <a href="${doc.contacts.getJSONObject(0).websiteUrl[langId]}" class="block no-underline text-dark text-lg space-x-2 mb-0" target="_blank"> 218 <i class="far fa-external-link text-dark"></i> 219 <u>${d40.getLabel("sito_web")}</u> 220 </a> 221 </#if> 222 223 <#if langId == 'en'> 224 <#assign ri_url = "/contact-tourist-office-trento" /> 225 <#elseif langId == 'de'> 226 <#assign ri_url = "/kontakt-info-anfrage-trento" /> 227 <#else> 228 <#assign ri_url = "/richiesta-informazioni" /> 229 </#if> 230 231 <a href="#contact-form" class="d-none btn bg-green text-white font-bold uppercase px-4 py-2 rounded-0 mt-10"> 232 ${d40.getLabel("richiedi_info")} 233 </a> 234 </div> 235 236 <#if hasCoords> 237 <div class="relative flex h-70"> 238 <div class="absolute w-full lg:w-105% h-full right-0"> 239 <div id="suggesto-map" class="monochrome-map size-full border-0"></div> 240 </div> 241 </div> 242 <div class="card-body p-5 lg:px-10"> 243 <!-- https://www.google.com/maps/@${lat},${lng},14z --> 244 <a href="https://www.google.com/maps/dir/?api=1&travelmode=driving&destination=${lat},${lng}" class="d-block no-underline space-x-5" target="_blank"> 245 <span class="font-bold text-dark uppercase"> 246 ${d40.getLabel("indicazioni_stradali")} 247 </span> 248 <img src="${d40.icons_folder}/arrow_circle-dark.svg" class="w-20" /> 249 </a> 250 </div> 251 </#if> 252 </div> 253 </div> 254 </div> 255 </div> 256 </section> 257 258 <#if doc.details.images?has_content> 259 <#assign usePreview = false> 260 261 <section id="gallery" class="relative overflow-x-hidden mt-20 lg:mt-40"> 262 <div class="container"> 263 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> 264 ${d40.getLabel("galleria_immagini")} 265 </p> 266 267 <div class="swiper-container"> 268 <div class="swiper-wrapper"> 269 <#if doc.details.cover != "[]"> 270 <#assign usePreview = true> 271 272 <#list doc.details.cover.iterator() as pic> 273 <div class="swiper-slide"> 274 <a href="javascript:void(0);" class="card shadow-none border-0 bg-transparent no-underline" data-toggle="modal" data-target="#lightbox-modal" data-slider="${pic?index}" data-senna-off="true"> 275 <div class="relative"> 276 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 277 </div> 278 </a> 279 </div> 280 <#-- assign z=request.setAttribute("ogImage","${pic[langId]}")--> 281 <#assign z=request.setAttribute("ogImage","${d40.getKitPrefix(pic[langId], 'n-preview_h')}")> 282 283 <#break> 284 </#list> 285 </#if> 286 287 <#list doc.details.images.iterator() as pic> 288 <#if usePreview> 289 <#assign counter = pic?counter> 290 <#else> 291 <#assign counter = pic?index> 292 </#if> 293 294 <div class="swiper-slide"> 295 <a href="javascript:void(0);" class="card shadow-none border-0 bg-transparent no-underline" data-toggle="modal" data-target="#lightbox-modal" data-slider="${counter}" data-senna-off="true"> 296 <div class="relative"> 297 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload rounded-custom size-full fit-cover" alt="" /> 298 </div> 299 </a> 300 </div> 301 </#list> 302 </div> 303 </div> 304 </div> 305 <div class="btn-square absolute btn-prev bg-white left-0"> 306 <span class="sr-only">${d40.getLabel("precedente")}</span> 307 <i class="fas fa-chevron-left text-dark w-6 h-6"></i> 308 </div> 309 <div class="btn-square absolute btn-next bg-white right-0"> 310 <span class="sr-only">${d40.getLabel("successivo")}</span> 311 <i class="fas fa-chevron-right text-dark w-6 h-6"></i> 312 </div> 313 </section> 314 315 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade"> 316 <div class="modal-dialog modal-full-screen inset-0 border-0 shadow-none"> 317 <div class="modal-content bg-transparent"> 318 <div class="modal-body overflow-hidden"> 319 <div class="absolute top-0 right-0 z-5"> 320 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3"> 321 <span class="sr-only">${d40.getLabel("chiudi")}</span> 322 <i class="fal fa-times fa-lg"></i> 323 </button> 324 </div> 325 326 <#-- lightbox --> 327 <div id="lightbox-swiper" class="swiper-container h-75 my-auto"> 328 <div class="swiper-button-prev w-12 h-12"> 329 <span class="sticker sticker-circle bg-green size-full"> 330 <span class="sticker-overlay"> 331 <i class="fas fa-chevron-left fa-2x text-white"></i> 332 </span> 333 </span> 334 </div> 335 336 <div class="swiper-button-next w-12 h-12"> 337 <span class="sticker sticker-circle bg-green size-full"> 338 <span class="sticker-overlay"> 339 <i class="fas fa-chevron-right fa-2x text-white"></i> 340 </span> 341 </span> 342 </div> 343 344 <div class="swiper-wrapper h-full"> 345 <#if doc.details.cover != "[]"> 346 <#list doc.details.cover.iterator() as pic> 347 <div class="swiper-slide h-full"> 348 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 349 </div> 350 <#break> 351 </#list> 352 </#if> 353 354 <#list doc.details.images.iterator() as pic> 355 <div class="swiper-slide h-full"> 356 <img data-src="${d40.getKitPrefix(pic[langId], 'n-full_hd')}" loading="lazy" class="lazyload flex h-full object-contain mx-auto" alt=""> 357 </div> 358 </#list> 359 </div> 360 </div> 361 362 <#-- thumbnails --> 363 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider=""> 364 <div class="swiper-wrapper"> 365 <#if doc.details.cover != "[]"> 366 <#list doc.details.cover.iterator() as pic> 367 <div class="swiper-slide"> 368 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 369 </div> 370 <#break> 371 </#list> 372 </#if> 373 374 <#list doc.details.images.iterator() as pic> 375 <div class="swiper-slide"> 376 <img data-src="${d40.getKitPrefix(pic[langId], 'n-preview_h')}" loading="lazy" class="lazyload object-cover cursor-pointer size-full" alt=""> 377 </div> 378 </#list> 379 </div> 380 </div> 381 </div> 382 </div> 383 </div> 384 </div> 385 </#if> 386 387 <#-- SEZIONE NON USATA 388 <section class="mt-20"> 389 <div class="container"> 390 <div class="bg-light max-w-xl p-5 lg:p-10"> 391 <div class="card-row space-x-5"> 392 <div class="autofit-col"> 393 <div class="autofit-section"> 394 <i class="fas fa-download text-dark w-7 h-7"></i> 395 </div> 396 </div> 397 <div class="autofit-col autofit-col-expand"> 398 <div class="autofit-section"> 399 <p class="text-dark font-bold text-lg lg:text-xl uppercase mb-0"> Programma completo </p> 400 </div> 401 </div> 402 </div> 403 </div> 404 405 <div class="row mt-10 lg:mt-20"> 406 <div class="col-12 col-lg-8"> 407 <div class="space-y-10"> 408 <p class="text-dark uppercase text-lg lg:text-3xl"> 409 ${d40.getLabel("dettagli")} 410 </p> 411 <div class="space-y-5"> 412 <div class="row"> 413 <div class="col-12 col-md-3 col-lg-2"> 414 <p class="text-dark font-bold uppercase">Data</p> 415 </div> 416 <div class="col-12 col-md-9 col-lg-10"> 417 <div class="text-dark font-light text-lg"> 418 Dettagli 419 </div> 420 </div> 421 </div> 422 </div> 423 </div> 424 </div> 425 </div> 426 </div> 427 </section> 428 --> 429 430 <section class="mt-20"> 431 <div class="container"> 432 <div class="bg-light"> 433 <div class="space-y-10 p-5 lg:p-10"> 434 <p class="text-dark uppercase text-lg lg:text-3xl mb-0"> 435 ${d40.getLabel("organizzazione")} 436 </p> 437 <div class="space-y-2"> 438 <#if doc.contacts.getJSONObject(0).address.fulltext?? && doc.contacts.getJSONObject(0).address.fulltext?has_content> 439 <p class="text-dark mb-0"> 440 ${doc.contacts.getJSONObject(0).address.fulltext} 441 </p> 442 </#if> 443 444 <#if doc.contacts.getJSONObject(0).mail?? && doc.contacts.getJSONObject(0).mail?has_content> 445 <a href="mailto:${doc.contacts.getJSONObject(0).mail}" class="d-block text-dark underline"> 446 ${doc.contacts.getJSONObject(0).mail} 447 </a> 448 </#if> 449 450 <#if doc.contacts.getJSONObject(0).telephone?? && doc.contacts.getJSONObject(0).telephone?has_content> 451 <#list doc.contacts.getJSONObject(0).telephone.iterator() as phone> 452 <p class="text-dark mb-0"> 453 <span class="font-bold">${d40.getLabel("telefono")}:</span> 454 ${phone} 455 </p> 456 </#list> 457 </#if> 458 </div> 459 </div> 460 </div> 461 </div> 462 </section> 463 464 <#-- 465 <section class="mt-10"> 466 <div class="container"> 467 <p class="text-dark uppercase text-lg lg:text-3xl mb-7"> Info sezione </p> 468 <p class="text-dark text-lg font-light mb-0"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> 469 </div> 470 </section> 471 --> 472 <#else> 473 <div class="text-center mt-35"> 474 <p class="text-dark"> 475 ${d40.getLabel("errore_caricamento_contenuto")} 476 </p> 477 </div> 478 </#if> 479</div> 480 481<script type="module"> 482 import { createApp } from "https://cdnjs.cloudflare.com/ajax/libs/petite-vue/0.4.1/petite-vue.es.min.js"; 483 484 createApp({ 485 isMobile: window.innerWidth < 768, 486 favorites: [], 487 getFavorites() { 488 if(localStorage.getItem("favorites") !== null) { 489 this.favorites = JSON.parse(localStorage.getItem("favorites")); 490 } 491 }, 492 setFavorite(e, item) { 493 e.preventDefault(); 494 this.getFavorites(); 495 496 var newFavorite = { 497 id: item.id, 498 contentJSON: { 499 title: item.contentJSON.title, 500 previewDescription: item.contentJSON.previewDescription, 501 description: item.contentJSON.description, 502 geoRef: item.contentJSON.geoRef, 503 previewPicture: item.contentJSON.previewPicture, 504 viewUrl: item.contentJSON.viewUrl, 505 type: "lfr", 506 } 507 }; 508 509 this.favorites.push(newFavorite); 510 this.saveFavorites(); 511 }, 512 removeFavorite(e, itemId) { 513 e.preventDefault(); 514 this.favorites = this.favorites.filter((obj) => obj.id !== itemId); 515 this.saveFavorites(); 516 }, 517 saveFavorites() { 518 localStorage.setItem("favorites", JSON.stringify(this.favorites)); 519 }, 520 isFavorite(itemId) { 521 if (this.favorites.some((e) => e.id == itemId)) { 522 return true; 523 } 524 525 return false; 526 }, 527 buildMap(lat, lng) { 528 var map = new SuggestoMap("suggesto-map"), 529 location = [parseFloat(lat), parseFloat(lng)]; 530 531 var svgIcon = L.divIcon({ 532 html: ` 533 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44.537 64.343"> 534 <path d="M32.952,68c-4.491-5.935-9.221-11.692-12.837-18.251-3.4-6.175-5.892-12.453-4.094-19.725,2.422-9.787,12.253-17.363,22.112-16.878,11.322.558,20.189,8.638,21.649,19.385.8,5.867-1.25,10.892-3.84,15.837A105.38,105.38,0,0,1,43.958,65.889c-.687.844-1.309,1.739-1.96,2.611-.953,1.06-1.971,2.068-2.841,3.191-.965,1.245-1.729,1.629-2.844.1A50.506,50.506,0,0,0,32.952,68m4.722-46.328A14.156,14.156,0,0,0,23.76,35.59c-.168,7.053,6.542,13.748,13.813,13.783A14.234,14.234,0,0,0,51.46,35.693,14.138,14.138,0,0,0,37.674,21.676" transform="translate(-15.419 -13.129)" fill="#5098c6"/> 535 <path d="M31.941,63.206A50.288,50.288,0,0,1,35.3,67c1.116,1.526,1.878,1.142,2.844-.1.87-1.123,1.889-2.132,2.841-3.191a8.579,8.579,0,0,1,5.414,2.22c1.659,1.642,1.586,3.631-.455,4.627a21.209,21.209,0,0,1-16.871.723c-1.611-.565-3.293-1.51-3.092-3.645.19-2.018,1.855-2.718,3.511-3.342.833-.315,1.791-.363,2.447-1.079" transform="translate(-14.408 -8.331)" fill="#222"/> 536 <path d="M36.946,20.929A14.137,14.137,0,0,1,50.732,34.944,14.236,14.236,0,0,1,36.844,48.626c-7.27-.036-13.98-6.732-13.813-13.783A14.157,14.157,0,0,1,36.946,20.929m-.023,5.445a8.4,8.4,0,1,0,8.394,8.22,8.5,8.5,0,0,0-8.394-8.22" transform="translate(-14.69 -12.381)" fill="#fdfcf9"/> 537 <path d="M36.45,25.9a8.4,8.4,0,0,1,.077,16.809A8.405,8.405,0,1,1,36.45,25.9" transform="translate(-14.218 -11.905)" fill="#222"/> 538 </svg>`, 539 className: "", 540 iconSize: [44.537, 64.343], 541 iconAnchor: [22.287, 64.343], 542 }); 543 544 var mapData = { 545 tilelayer: "osm", 546 gestureHandling: true, 547 fitBounds: false, 548 mapcenter: location, 549 zoom: 15, 550 markersFilter: "*", 551 markers: [], 552 layers: [] 553 }; 554 555 map.sm.createMap(mapData); 556 557 L.circleMarker(location, { 558 radius: 0, 559 color: "#000", 560 fillOpacity: 0, 561 weight: 0 562 }).addTo(map.sm.lmap); 563 564 L.marker(location, { 565 icon: svgIcon 566 }).addTo(map.sm.lmap); 567 }, 568 share(title, desc, mode = "legacy") { 569 if (this.isMobile) { 570 var shareData = { 571 title: title, 572 text: desc, 573 url: window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D") 574 }; 575 576 try { 577 navigator.share(shareData); 578 } catch (err) { 579 console.error("Error sharing: " + err); 580 581 if (mode == "legacy") { 582 this.legacyShare(); 583 } else if (mode == "social") { 584 this.socialShare(title, desc); 585 } 586 } 587 } else { 588 if (mode == "legacy") { 589 this.legacyShare(); 590 } else if (mode == "social") { 591 this.socialShare(title, desc); 592 } 593 } 594 }, 595 legacyShare() { 596 var clip = document.createElement("input"), 597 toCopy = window.location.href.replaceAll("{", "%7B").replaceAll("}", "%7D"); 598 599 document.body.appendChild(clip); 600 clip.value = toCopy; 601 clip.select(); 602 clip.setSelectionRange(0, 999999); 603 604 navigator.clipboard.writeText(clip.value); 605 document.body.removeChild(clip); 606 607 alert("Link copiato"); 608 }, 609 socialShare(title, desc, image = "") { 610 var link = "#", 611 winHeight = 450, 612 winWidth = 600, 613 winTop = window.screen.height / 2 - winHeight / 2, 614 winLeft = window.screen.width / 2 - winWidth / 2, 615 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop; 616 617 link = "http://www.facebook.com/sharer.php?s=100&p[title]=" + encodeURIComponent(title) + "&p[summary]=" + encodeURIComponent(desc) + "&p[url]=" + window.location.href + "&p[images][0]=" + image; 618 619 window.open(link, "Facebook", params); 620 } 621 }).mount("#${d40.portletNamespace}"); 622</script> 623 624<#if doc?has_content> 625 <script> 626 document.addEventListener("DOMContentLoaded", function(){ 627 628 document.querySelectorAll('a[href^="#contact"]').forEach(anchor => { 629 anchor.addEventListener('click', function (e) { 630 e.preventDefault(); 631 632 document.querySelector(this.getAttribute('href')).scrollIntoView({ 633 behavior: 'smooth' 634 }); 635 }); 636 }); 637 638 var form_title = "${d40.getLabel('contatta_ufficio_apt')}"; 639 640 $("<div class='container-fluid bg-light-green'><div class='container'><h3 class='text-light font-semibold font-heading text-3xl lg:text-4xl uppercase pt-4 mb-0'>" + form_title + "</h3></div></div>").insertBefore('#contact-form'); 641 642 if(${(doc.details.images?has_content)?c}){ 643 new Swiper("#gallery .swiper-container", { 644 slidesPerView: 1, 645 spaceBetween: 50, 646 centerSlides: true, 647 centerInsufficientSlides: true, 648 breakpoints: { 649 768: { 650 slidesPerView: 2, 651 spaceBetween: 25 652 }, 653 992: { 654 slidesPerView: 3, 655 spaceBetween: 25 656 } 657 }, 658 navigation: { 659 prevEl: "#gallery .btn-prev", 660 nextEl: "#gallery .btn-next" 661 } 662 }); 663 664 var thumbnails = new Swiper("#thumbnail-swiper", { 665 spaceBetween: 10, 666 slidesPerView: 2, 667 centerInsufficientSlides: true, 668 freeMode: true, 669 watchSlidesVisibility: true, 670 watchSlidesProgress: true, 671 breakpoints: { 672 768: { 673 slidesPerView: 3 674 }, 675 992: { 676 slidesPerView: 4 677 }, 678 1200: { 679 slidesPerView: 5 680 } 681 }, 682 }); 683 684 var lightbox = new Swiper("#lightbox-swiper", { 685 spaceBetween: 10, 686 autoHeight: true, 687 observer: true, 688 observeSlideChildren: true, 689 keyboard: { 690 enabled: true 691 }, 692 navigation: { 693 nextEl: ".swiper-button-next", 694 prevEl: ".swiper-button-prev" 695 }, 696 thumbs: { 697 swiper: thumbnails 698 } 699 }); 700 701 $("#lightbox-modal").on("shown.bs.modal", function(e){ 702 lightbox.update(); 703 thumbnails.update(); 704 lightbox.slideTo($(e.relatedTarget).data("slider")); 705 lightbox.update(); 706 }); 707 708 $("#lightbox-modal .swiper-wrapper").on("click", function(e){ 709 if($(e.target).attr("class").includes("swiper-slide")){ 710 $("#lightbox-modal").modal("hide"); 711 } 712 }); 713 714 715 if ($(window).width() > 991) { 716 var left_col_h = $(".relative.mt-20 > .container > .row > .col-lg-7").outerHeight(); 717 var right_col_h = $(".relative.mt-20 > .container > .row > .col-lg-5").outerHeight(); 718 var marg_h = right_col_h - left_col_h + 40; 719 720 if(right_col_h > left_col_h) 721 { 722 $('#gallery').removeClass('lg:mt-40 mt-20'); 723 $('#gallery').css({'margin-top':marg_h+'px'}); 724 } 725 } 726 } 727 }); 728 </script> 729</#if> L'invio della richiesta è andata a buon fine
L'invio della richiesta non è andata a buon fine
Acconsento al passaggio dei miei dati personali al destinatario della mia richiesta per l'invio delle informazioni richieste (privacy policy)