Gallery
Gallery
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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(), '—')}
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 —
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(), '—')}
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(), '—')}
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(), '—')}
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>