angle-left null Software service - structure, test
An error occurred while processing the template.
The following has evaluated to null or missing:
==> journalArticleUtil.getJournalArticleByArticleId(journalArticleId) [in template "20099#20135#98826" at line 16, column 22]
----
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: journalArticle = journalArticleUtil.g... [in template "20099#20135#98826" at line 16, column 5]
- Reached through: #assign-container [in template "20099#20135#98826" at line 7, column 1]
----
1<link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css" 
2 integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin=""/> 
3 
4<script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js" 
5 integrity="sha512-QVftwZFqvtRNi0ZyCtsznlKSWOStnDORoefr1enyq5mVL4tmKB3S/EnC3rRJcxCPavG10IcrVGSmPh6Qw5lwrg==" crossorigin=""></script> 
6 
7<#assign 
8 defaultImage = themeDisplay.getPathThemeImages() + '/default_image.png' 
9 TAXONOMIES_DISPLAY_COUNT = 6 
10 journalArticleId = .vars['reserved-article-id'].data 
11 journalArticleTitle = .vars['reserved-article-title'].data 
12 servicePrice = '0.0' 
13 servicePriceCurrency = 'EUR' 
14 groupId = themeDisplay.getLayout().getGroupId() 
15 journalArticleUtil = serviceLocator.findService("com.eversis.esa.eomall.eomall.core.api.util.JournalArticleUtils") 
16 journalArticle = journalArticleUtil.getJournalArticleByArticleId(journalArticleId) 
17 resourceprimKey = journalArticle.getResourcePrimKey() 
18 assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") 
19 assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourceprimKey) 
20 assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") 
21 organizationUtils = serviceLocator.findService("com.eversis.esa.eomall.eomall.core.api.util.OrganizationUtils") 
22 organizationId = journalArticleUtil.getOrganizationIdByJournalArticle(journalArticle) 
23 taxonomies = [] 
24 schemaCategories = [] 
25 mainCategories = [] 
26 is_signed_in = themeDisplay.isSignedIn() 
27 ddmStructureKey = journalArticle.getDDMStructureKey() 
28/> 
29 
30<#if organizationId != 0> 
31 <#assign organization = organizationUtils.getOrganizationById(organizationId) /> 
32 <#assign organizationName = organization.getName() /> 
33 <#assign organizationLogo = organizationUtils.getOrganizationLogoImageURL(organizationId) /> 
34 <#assign organizationPhoneNumber = organizationUtils.getOrganizationPrimaryPhoneNumber(organizationId) /> 
35 <#assign organizationFaxNumber = organizationUtils.getOrganizationFaxNumber(organizationId) /> 
36 <#assign organizationEmailAddress = organizationUtils.getOrganizationPrimaryEmailAddress(organizationId) /> 
37 <#assign organizationURL = organizationUtils.getOrganizationPrimaryWebsiteURL(organizationId) /> 
38 <#assign organizationTaxonomies = organizationUtils.getOrganizationTaxonomies(organizationId) /> 
39</#if> 
40<#list assetEntry.getCategories() as category> 
41 <#assign vocabulary = assetVocabularyLocalService.getVocabulary(category.vocabularyId) /> 
42 <#if vocabulary.getName() == 'Market Sector' || vocabulary.getName() == 'Thematic'> 
43 <#assign taxonomies = taxonomies + [category.getName()] /> 
44 </#if> 
45</#list> 
46<#if service_price.getData()?? && service_price.getData() != ""> 
47 <#assign servicePrice = service_price.getData()> 
48</#if> 
49 
50<#list service_subcategory.getOptions() as subcategory> 
51 <#if (subcategory?has_content)> 
52 <#assign schemaCategories = schemaCategories + [subcategory] /> 
53 <#assign mainCategories = mainCategories + [subcategory] /> 
54 </#if> 
55</#list> 
56<#list taxonomies as taxonomy> 
57 <#assign schemaCategories = schemaCategories + [taxonomy] /> 
58</#list> 
59<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
60 
61<script type="application/ld+json"> 
62
63 "@context": "https://schema.org", 
64 "@type": "Service", 
65 "name": "${journalArticleTitle}", 
66 "description": "${service_abstract.getData()}", 
67 "logo": { 
68 "@type": "ImageObject", 
69 "url": "${themeDisplay.getPortalURL()}${organizationLogo}" 
70 }, 
71 "image": "${themeDisplay.getPortalURL()}${header_image.getData()}", 
72 "sameAs": "${link_to_service_page.service_page_link_url.getData()}", 
73 "url": "${currentUrl}", 
74 "areaServed": [ 
75 <#if service_place.geoname??> 
76 <#list service_place.geoname.getSiblings() as geoname> 
77 <#if geoname?has_content> 
78 "${geoname.getData()}"<#if geoname?has_next>,</#if> 
79 </#if> 
80 </#list> 
81 </#if> 
82 ], 
83 "availableChannel": { 
84 "@type": "ServiceChannel", 
85 <#if delivery_mode.delivery_mode_entry.getSiblings()?has_content> 
86 "serviceLocation": [ 
87 <#list delivery_mode.delivery_mode_entry.getSiblings() as delivery_mode> 
88 "${delivery_mode.getData()?has_content?then(delivery_mode.getData(), '—')}"<#if delivery_mode?has_next>,</#if> 
89 </#list> 
90 ], 
91 </#if> 
92 "availableLanguage": { 
93 "@type": "Language", 
94 "name": "${service_language.getData()}" 
95
96 }, 
97 <#if organizationId != 0> 
98 "brand": { 
99 "@type": "Organization", 
100 "legalName": "${organizationName}", 
101 "logo": { 
102 "@type": "ImageObject", 
103 "url": "${themeDisplay.getPortalURL()}${organizationLogo}" 
104 }, 
105 "telephone": "${organizationPhoneNumber}", 
106 "faxNumber": "${organizationFaxNumber}", 
107 "email": "${organizationEmailAddress}", 
108 "url": "${organizationURL}" 
109 }, 
110 </#if> 
111 "category": [ 
112 <#list schemaCategories as schemaCategory> 
113 "${schemaCategory}"<#if schemaCategory?has_next>,</#if> 
114 </#list> 
115 ], 
116 "offers": { 
117 "@type": "Offer", 
118 "acceptedPaymentMethod": "${service_payment_model.getData()}", 
119 "areaServed": [ 
120 <#if service_place.geoname??> 
121 <#list service_place.geoname.getSiblings() as geoname> 
122 <#if geoname?has_content> 
123 "${geoname.getData()}"<#if geoname?has_next>,</#if> 
124 </#if> 
125 </#list> 
126 </#if>  
127 ], 
128 "category": [ 
129 <#list schemaCategories as schemaCategory> 
130 "${schemaCategory}"<#if schemaCategory?has_next>,</#if> 
131 </#list> 
132 ], 
133 <#if organizationId != 0> 
134 "offeredBy":{ 
135 "@type": "Organization", 
136 "legalName": "${organizationName}", 
137 "logo": { 
138 "@type": "ImageObject", 
139 "url": "${themeDisplay.getPortalURL()}${organizationLogo}" 
140 }, 
141 "telephone": "${organizationPhoneNumber}", 
142 "faxNumber": "${organizationFaxNumber}", 
143 "email": "${organizationEmailAddress}", 
144 "url": "${organizationURL}" 
145 }, 
146 "seller": { 
147 "@type": "Organization", 
148 "legalName": "${organizationName}", 
149 "logo": { 
150 "@type": "ImageObject", 
151 "url": "${themeDisplay.getPortalURL()}${organizationLogo}" 
152 }, 
153 "telephone": "${organizationPhoneNumber}", 
154 "faxNumber": "${organizationFaxNumber}", 
155 "email": "${organizationEmailAddress}", 
156 "url": "${organizationURL}" 
157 }, 
158 </#if> 
159 <#if servicePrice != '0.0'> 
160 "price": "${servicePrice}", 
161 "priceCurrency": "${servicePriceCurrency}", 
162 </#if> 
163 "eligibleRegion": [ 
164 <#if service_place.geoname??> 
165 <#list service_place.geoname.getSiblings() as geoname> 
166 <#if geoname?has_content> 
167 "${geoname.getData()}"<#if geoname?has_next>,</#if> 
168 </#if> 
169 </#list> 
170 </#if> 
171
172 }, 
173 <#if organizationId != 0> 
174 "provider": { 
175 "@type": "Organization", 
176 "legalName": "${organizationName}", 
177 "logo": { 
178 "@type": "ImageObject", 
179 "url": "${themeDisplay.getPortalURL()}${organizationLogo}" 
180 }, 
181 "telephone": "${organizationPhoneNumber}", 
182 "faxNumber": "${organizationFaxNumber}", 
183 "email": "${organizationEmailAddress}", 
184 "url": "${organizationURL}" 
185 }, 
186 </#if> 
187 "serviceType": [ 
188 <#list mainCategories as mainCategory> 
189 "${mainCategory}"<#if mainCategory?has_next>,</#if> 
190 </#list> 
191 ], 
192 "termsOfService": "${terms_and_conditions.terms_and_conditions_link_url.getData()}" 
193
194</script> 
195 
196<#compress> 
197 <div class="row"> 
198 <div class="service col-sm-12 service-${journalArticleId} article" id="service" data-service-id="${journalArticleId}" data-ddm-structure-key="${ddmStructureKey}"> 
199 <div class="row page__section section__header service__header background--section"> 
200 <div class="col-12"> 
201 <div class="margin-top-30 margin-bottom-30 row"> 
202 <h5 class="col-12 text-center margin-bottom-0 section__subcategories service__subcategories" data-property="serviceSubcategory" data-information-type="main"> 
203 <#assign subcategories = [] /> 
204 <#list service_subcategory.getOptions() as subcategory> 
205 <#if (subcategory?has_content)> 
206 <#assign subcategories = subcategories + [subcategory] /> 
207 </#if> 
208 </#list> 
209 <span>${subcategories?join(', ')}</span> 
210 </h5> 
211 <h1 class="col-12 text-center margin-bottom-10 section__name service__name" data-property="serviceName" data-information-type="main">${journalArticleTitle}</h1> 
212 <p class="col-12 col-sm-10 offset-sm-1 col-md-8 offset-md-2 col-lg-6 offset-lg-3 text-center margin-bottom-10 section__description service__description" 
213 data-property="serviceAbstract" data-information-type="main">${service_abstract.getData()}</p> 
214 <p class="col-12 text-center text-uppercase d-none d-md-block section__taxonomies service__taxonomies" data-property="serviceTaxonomies" data-information-type="main">${taxonomies[0..*TAXONOMIES_DISPLAY_COUNT]?join('; ')}</p> 
215 </div> 
216 <div class="links links--service row"> 
217 <!--Service links--> 
218 <a class="link__item service__logo col-sm-12 col-md-2" href="${organizationURL}" target="_blank"> 
219 <img alt="${organizationName}" title="${organizationName}" src="${organizationLogo}" onerror="this.src='${defaultImage}'" /> 
220 </a> 
221 <#if is_signed_in> 
222 <a class="link__item text-center service__page_link" href="${link_to_service_page.service_page_link_url.getData()}" target="_blank">${link_to_service_page.service_page_link_text.getData()}</a> 
223 </#if> 
224 <div class="link__item service__sample_link"> 
225 <#if sample_service_link.service_sample_link_text.getData() != ''> 
226 <a href="${sample_service_link.service_sample_link_url.getData()}" target="_blank" class="button button--light"><@liferay.language key='sample-button-label' /></a> 
227 </#if> 
228 </div> 
229 </div> 
230 <div class="section__main_image service__main_image"> 
231 <div class="border w-100"> 
232 <div class="ratio-box ratio-box--16-9"> 
233 <#if header_image.getData()?? && header_image.getData() !=""> 
234 <img alt="${header_image.getAttribute("alt")}" data-fileentryid="${header_image.getAttribute("fileEntryId")}" src="${header_image.getData()}" onerror='this.src="${defaultImage}"' /> 
235 <#else> 
236 <picture> 
237 <img src="${defaultImage}"> 
238 </picture> 
239 </#if> 
240 </div> 
241 </div> 
242 </div> 
243 </div> 
244 </div> 
245 <div class="row page__section section__content"> 
246 <div class="col-12"> 
247 <div class="row"> 
248 <div class="col-12 col-md-6 border-right"> 
249 <div class="d-flex"> 
250 <h4 data-property-label="productDescriptionHeader"><@liferay.language key="Service.Product-Description" /></h4> 
251 <div class="margin-left-30 d-flex extra-options"> 
252 <button class="generate-pdf margin-right-15"> 
253 <i class="icon eo-icon-pdf"></i> 
254 </button> 
255 <div class="margin-right-35 product__share_trigger relative"> 
256 <i class="icon eo-icon-share"></i> 
257 <div class="product__share"> 
258 <span data-link="#share-facebook" data-title="${journalArticleTitle}" data-description="${service_abstract.getData()}" class="padding-right-15"><i class="eo-icon-facebook"></i></span> 
259 <span data-link="#share-linkedin" data-title="${journalArticleTitle}" data-description="${service_abstract.getData()}" class="padding-right-15"><i class="eo-icon-linkedin"></i></span> 
260 <span data-link="#share-twitter" data-title="${journalArticleTitle}" data-description="${service_abstract.getData()}"><i class="eo-icon-twitter"></i></span> 
261 </div> 
262 </div> 
263 </div> 
264 </div> 
265 <p data-property="productDescription">${service_description.getData()}</p> 
266 <div class="margin-top-20 product__details layout-grid"> 
267 <div class="row layout-grid__row"> 
268 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="serviceLanguage"><@liferay.language key="Service.Service-Language" /></div> </div> 
269 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="serviceLanguage"> 
270 ${service_language.getData()?has_content?then(service_language.getData(), '&mdash;')} 
271 </div></div> 
272 </div> 
273 <div class="row layout-grid__row"> 
274 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="metadataLanguage"><@liferay.language key="Service.Metadata-Language" /></div></div> 
275 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="metadataLanguage"> 
276 ${metadata_language.getData()?has_content?then(metadata_language.getData(), '&mdash;')} 
277 </div></div> 
278 </div> 
279 <div class="row layout-grid__row"> 
280 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="levelAgreement"><@liferay.language key="Service.Service-Level-Agreement" /></div> </div> 
281 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="levelAgreement"> 
282 ${service_level_agreement.getData()?has_content?then(service_level_agreement.getData(), '&mdash;')} 
283 </div></div> 
284 </div> 
285 <div class="row layout-grid__row"> 
286 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="termsAndConditions"><@liferay.language key="Service.Terms-Conditions" /></div> </div> 
287 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="termsAndConditions"> 
288 <a class="font-bold" href="${terms_and_conditions.terms_and_conditions_link_url.getData()}" target="_blank"> 
289 ${terms_and_conditions.terms_and_conditions_link_text.getData()?has_content?then(terms_and_conditions.terms_and_conditions_link_text.getData(), '&mdash;')} 
290 </a>  
291 </div></div> 
292 </div> 
293 <div class="row layout-grid__row"> 
294 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="licence"><@liferay.language key="Service.Licence" /></div> </div> 
295 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="licence"> 
296 <a class="font-bold" href="${licence.licence_url.getData()}" target="_blank"> 
297 ${licence.licence_link_text.getData()?has_content?then(licence.licence_link_text.getData(), '&mdash;')} 
298 </a>  
299 </div></div> 
300 </div> 
301 <div class="row layout-grid__row"> 
302 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="deliveryMode"><@liferay.language key="Service.Delivery-Mode" /></div> </div> 
303 <div class="col-6 padding-right-0 font-bold layout-grid__column"> 
304 <div class="layout-grid__cell relative" data-property="deliveryMode"> 
305 <#if delivery_mode.delivery_mode_entry.getSiblings()?has_content> 
306 <#if (delivery_mode.delivery_mode_entry.getSiblings()?size > 1)> 
307 <div class="list-toggle-expand"></div> 
308 </#if> 
309 <ul class="list list--expandable"> 
310 <#list delivery_mode.delivery_mode_entry.getSiblings() as delivery_mode> 
311 <li class="list__item"> 
312 ${delivery_mode.getData()?has_content?then(delivery_mode.getData(), '&mdash;')} 
313 </li> 
314 </#list> 
315 </ul> 
316 </#if> 
317 </div> 
318 </div> 
319 </div> 
320 <div class="row layout-grid__row"> 
321 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="commercialLevel"><@liferay.language key="Service.Commercial-level" /></div> </div> 
322 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="commercialLevel"> 
323 ${commercial_level.getData()?has_content?then(commercial_level.getData(), '&mdash;')} 
324 </div></div> 
325 </div> 
326 <div class="row layout-grid__row"> 
327 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="lifecycleStatus"><@liferay.language key="Service.Service-Life-Cycle-Status" /></div> </div> 
328 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="lifecycleStatus"> 
329 ${service_lifecycle_status.getData()?has_content?then(service_lifecycle_status.getData(), '&mdash;')} 
330 </div></div> 
331 </div> 
332 <div class="row layout-grid__row"> 
333 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="scale"><@liferay.language key="Service.Scale" /></div> </div> 
334 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="scale"> 
335 ${service_scale.getData()?has_content?then(service_scale.getData(), '&mdash;')} 
336 </div></div> 
337 </div> 
338 <div class="row layout-grid__row"> 
339 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="serviceLocator"><@liferay.language key="Service.Service-Locator" /></div> </div> 
340 <div class="col-6 padding-right-0 font-bold layout-grid__column"> 
341 <div class="flex-column align-items-start justify-content-center relative layout-grid__cell" data-property="serviceLocator"> 
342 <#if service_locator.link.getSiblings()?has_content> 
343 <#if (service_locator.link.getSiblings()?size > 1)> 
344 <div class="list-toggle-expand"></div> 
345 </#if> 
346 <ul class="list list--expandable"> 
347 <#list service_locator.link.getSiblings() as link> 
348 <li class="list__item"> 
349 <a class="font-bold" href="${link.url.getData()}" target="_blank"> 
350 ${link.link_text.getData()?has_content?then(link.link_text.getData(), '&mdash;')} 
351 </a> 
352 </li> 
353 </#list> 
354 </ul> 
355 </#if> 
356 </div> 
357 </div> 
358 </div> 
359 <div class="row layout-grid__row"> 
360 <div class="col-6 font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="dateOfPublication"><@liferay.language key="Service.Date-of-Publication" /></div> </div> 
361 <div class="col-6 padding-right-0 font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="dateOfPublication"> 
362 <#assign date_of_publication_Data=getterUtil.getString(date_of_publication.getData())> 
363 <#if validator.isNotNull(date_of_publication_Data)> 
364 <#assign date_of_publication_DateObj=dateUtil.parseDate("yyyy-MM-dd", date_of_publication_Data, locale)> 
365 ${dateUtil.getDate(date_of_publication_DateObj, "dd MMM yyyy", locale)} 
366 <#else> 
367 #mdash; 
368 </#if> 
369 </div></div> 
370 </div> 
371 </div> 
372 <div class="text-left margin-top-30"></div> 
373 <button class="button button--favourite button--save-product d-none"> 
374 <i class="icon eo-icon-star"></i> 
375 <span class="button__text"><@liferay.language key="Service.Save-to-list" /></span> 
376 </button> 
377 </div> 
378 <div class="col-12 col-md-6 service__benefits"> 
379 <div> 
380 <h4 data-property="benefitsDescriptionHeader"><@liferay.language key="Service.Benefits" /></h4> 
381 <div class="margin-bottom-20" data-property="benefitsDescription"><p>${service_benefits.getData()}</p> 
382 <#if service_benefits.service_benefit_entry.getSiblings()?has_content> 
383 <ul class="benefits" data-property="benefitsList" data-list="true"> 
384 <#list service_benefits.service_benefit_entry.getSiblings() as benefit> 
385 <#if benefit.getData()?has_content><li data-property-items="benefitsList">${benefit.getData()}</li></#if> 
386 </#list> 
387 </ul> 
388 </#if> 
389 </div> 
390 <div class="layout-grid"> 
391 <div class="row benefits__details layout-grid__row" data-details> 
392 <div class="col-6 benefit__label font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="paymentModel"><@liferay.language key="Service.Payment-Model" /></div> </div> 
393 <div class="col-6 padding-right-0 benefit__value font-bold layout-grid__column"> <div class="layout-grid__cell" data-property="paymentModel"> 
394 ${service_payment_model.getData()?has_content?then(service_payment_model.getData(), '&mdash;')} 
395 </div></div> 
396 </div> 
397 <div class="row benefits__details layout-grid__row" data-details> 
398 <div class="col-6 benefit__label font-light layout-grid__column"> <div class="layout-grid__cell" data-property-label="price"><@liferay.language key="Service.Price-starting-from" /></div> </div> 
399 <div class="col-6 padding-right-0 benefit__value font-bold layout-grid__column"> 
400 <div class="layout-grid__cell flex-wrap" data-property="price"> 
401 <span class="font-bold w-100"> 
402 <#if service_price.service_price_displayed?has_content && service_price.service_price_displayed.getData() != ''> 
403 ${service_price.service_price_displayed.getData()} 
404 <#elseif service_price.getData()?has_content> 
405 ${service_price.getData()} 
406 <#else> 
407 &mdash; 
408 </#if> 
409 </span> 
410 <#if service_price.service_price_description?has_content> 
411 <#if service_price.service_price_description.getData() != ''>  
412 <span class="w-100">${service_price.service_price_description.getData()}</span> 
413 </#if> 
414 </#if> 
415 </div> 
416 </div> 
417 </div> 
418 </div> 
419 </div> 
420 <#if is_signed_in && link_to_service_page.service_page_link_url.getData() != ''> 
421 <div class="text-right margin-top-30"> 
422 <#if link_to_service_page.service_page_link_text.getData() != ''> 
423 <a href="${link_to_service_page.service_page_link_url.getData()}" class="button text-uppercase" 
424 onclick="gaOutboundLink('${link_to_service_page.service_page_link_url.getData()}', 'Take me to store', false); return false;">${link_to_service_page.service_page_link_text.getData()}</a> 
425 <#else> 
426 <a href="${link_to_service_page.service_page_link_url.getData()}" class="button text-uppercase" 
427 onclick="gaOutboundLink('${link_to_service_page.service_page_link_url.getData()}', 'Take me to store', false); return false;"><@liferay.language key="Service.Take-me-to-store" /></a> 
428 </#if> 
429 </div> 
430 <#elseif is_signed_in && organizationURL != ''> 
431 <div class="text-right margin-top-30"> 
432 <a href="${organizationURL}" class="button text-uppercase" 
433 onclick="gaOutboundLink('${link_to_service_page.service_page_link_url.getData()}', 'Take me to store', false); return false;"><@liferay.language key="Service.Take-me-to-store" /></a> 
434 </div> 
435 <#else> 
436 <div class="text-right margin-top-30"> 
437 <a class="button button--disabled"><@liferay.language key="Service.Take-me-to-store" /></a> 
438 </div> 
439 </#if> 
440 </div> 
441 </div> 
442 <div class="row"> 
443 <div class="col-12 col-md-6"> 
444 <div> 
445 </div> 
446 <div class="margin-top-40 d-lg-flex flex-wrap justify-content-between"> 
447 <h4 class="margin-bottom-25 margin-bottom-md-20"><@liferay.language key="Service.Technical-Specification" /></h4> 
448 <button class="margin-bottom-25 margin-bottom-md-20 button button--add-to-compare text-uppercase font-bold text-left"><@liferay.language key="Service.Add-to-compare" /></button> 
449 </div> 
450 <div class="service__specification layout-grid"> 
451 <div class="specification__item layout-grid__row"> 
452 <div class="specification__label font-bold layout-grid__column"> <div class="layout-grid__cell" data-property-label="openSource">OpenSource</div> </div> 
453 <div class="specification__value font-light layout-grid__column"> <div class="layout-grid__cell" data-property="openSource"> 
454 <a class="font-light" href="${opensource_licence_link.opensource_licence_link_url.getData()}" target="_blank"> 
455 ${opensource_licence_link.opensource_licence_link_text.getData()?has_content?then(opensource_licence_link.opensource_licence_link_text.getData(), '&mdash;')} 
456 </a> 
457 </div> </div> 
458 </div> 
459 <div class="specification__item layout-grid__row"> 
460 <div class="specification__label font-bold layout-grid__column"> <div class="layout-grid__cell" data-property-label="licenceType"><@liferay.language key="Service.Licence-type" /></div> </div> 
461 <div class="specification__value font-light layout-grid__column"> <div class="layout-grid__cell" data-property="licenceType"> 
462 ${licence_type.getData()?has_content?then(licence_type.getData(), '&mdash;')} 
463 </div> </div> 
464 </div> 
465 <div class="specification__item layout-grid__row"> 
466 <div class="specification__label font-bold layout-grid__column"> <div class="layout-grid__cell" data-property-label="licenceDuration"><@liferay.language key="Service.Licence-duration" /></div> </div> 
467 <div class="specification__value font-light layout-grid__column"> <div class="layout-grid__cell" data-property="licenceDuration"> 
468 ${licence_duration.getData()?has_content?then(licence_duration.getData(), '&mdash;')} 
469 </div> </div> 
470 </div> 
471 </div> 
472 </div> 
473 <#if service_place.geoname?? && service_place.geoname.getSiblings()?has_content> 
474 <div class="service-place col-12 col-md-6"> 
475 <h4 class="service-place__title margin-top-40 margin-bottom-25"><@liferay.language key="Service.Service-place" /></h4> 
476 <p>${service_place.getData()}</p> 
477 <div class="service-place col-12 padding-0 text-capitalize"> 
478 <#list service_place.geoname.getSiblings() as geoname> 
479 <#if geoname?has_content> 
480 ${geoname.getData()}<#if geoname?has_next>,</#if> 
481 </#if> 
482 </#list> 
483 <#list service_place.geoname.getSiblings() as geoname> 
484 <#if geoname.location_center_point?? && geoname.location_center_point.getData() !=""> 
485 <#assign geolocationJSONObject = jsonFactoryUtil.createJSONObject(geoname.location_center_point.getData())> 
486 <#assign latitude = geolocationJSONObject.getDouble("latitude")> 
487 <#assign longitude = geolocationJSONObject.getDouble("longitude")> 
488 <div class="coordinates d-none">${latitude},${longitude}</div> 
489 </#if> 
490 </#list> 
491 <div id="service-map"></div> 
492 </div> 
493 </div> 
494 </#if> 
495 </div> 
496 </div> 
497 </div> 
498 </div> 
499 </div> 
500</#compress> 
501 
502<script type="text/javascript"> 
503$(document).ready(function() { 
504 if (!$('.service-place .coordinates').length) return false; 
505 $('#service-map').css('height', 400); 
506 var serviceMap = L.map('service-map'); 
507 L.tileLayer('https://a.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18}).addTo(serviceMap); 
508 var marker = []; 
509 $('.service-place .coordinates').each(function () { 
510 var latLon = $(this).text().split(','); 
511 marker.push(L.marker([latLon[0], latLon[1]])); 
512 }); 
513 var group = new L.featureGroup(marker).addTo(serviceMap); 
514 serviceMap.fitBounds(group.getBounds()); 
515 
516 var extentControl = L.Control.extend({ 
517 options: { 
518 position: 'bottomright' 
519 }, 
520 onAdd: function (serviceMap) { 
521 var llBounds = serviceMap.getBounds(); 
522 var container = L.DomUtil.create('button', 'extentControl btn btn-default home-button'); 
523 $(container).html('<i class="glyphicon glyphicon-screenshot"></i>'); 
524 $(container).on('click', function () { 
525 serviceMap.fitBounds(llBounds); 
526 }); 
527 return container; 
528
529 }) 
530 serviceMap.addControl(new extentControl()); 
531}); 
532</script>