An error occurred while processing the template.
The following has evaluated to null or missing:
==> serviceLocator.findService("es.gob.exteriores.aecid.lcl.base.util.CustomPermissionUtil")  [in template "5931966#5932007#PROYECTO-DETALLE-FTL" at line 4, column 33]

----
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 customPermissionUtil = servic...  [in template "5931966#5932007#PROYECTO-DETALLE-FTL" at line 4, column 1]
----
1<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") >
 
2<#assign assetEntryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
 
3<#assign assetCategoryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") >
 
4<#assign customPermissionUtil = serviceLocator.findService("es.gob.exteriores.aecid.lcl.base.util.CustomPermissionUtil") >
 
5
 
6<#assign cities_vocabulary_id = layout.getGroup().getExpandoBridge().getAttribute("cities_vocabulary_id")>
 
7<#assign cities_vocabulary_id = cities_vocabulary_id?number>
 
8<#assign areas_vocabulary_id = layout.getGroup().getExpandoBridge().getAttribute("areas_vocabulary_id")>
 
9<#assign areas_vocabulary_id = areas_vocabulary_id?number>
 
10
 
11<#assign articleId = .vars['reserved-article-id'].data >
 
12<#assign classPK = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, articleId) >
 
13<#assign categories = assetCategoryService.getCategories("com.liferay.journal.model.JournalArticle", classPK) >
 
14
 
15<#assign rolGestion = customPermissionUtil.hasRole(themeDisplay,"Gestión de proyectos CdC") >
 
16<#assign rolView = customPermissionUtil.hasRole(themeDisplay,"Visualización de actas de proyectos CdC") >
 
17
 
18<div class="cabecera-pagina-interior cabecera-pagina-interior--volver">
 
19	<div class="global-container">
 
20		<div class="cabecera-pagina-interior--volver__inner">
 
21			<div class="cabecera-pagina-interior--volver__col">
 
22				<button type="button" id="go-back-btn" class="header-bg-color--link">${languageUtil.get(locale, "es.gob.exteriores.aecid.lcl.volver.atras")}</button>
 
23			</div>
 
24			<div class="cabecera-pagina-interior--volver__col">
 
25				<h2 class="cabecera-pagina-interior--title cabecera-pagina-interior--title--volver">${title.getData()}</h2>
 
26			</div>
 
27		</div>
 
28	</div>
 
29</div>
 
30<div class="project-detail">
 
31	<div class="global-container">
 
32		<h3 class="project-detail__title">${languageUtil.get(locale, 'formulario.proyecto.datos.basicos')}</h3>
 
33		<#list categories as category>
 
34			<#if (category.getVocabularyId() == areas_vocabulary_id)>
 
35				<p class="project-detail__subtitle project-detail__subtitle"><strong>${category.getTitle(locale)?substring(2)}</strong></p>
 
36			</#if>
 
37		</#list>
 
38	<!--       <p class="project-detail__intro">Proyectos que rehabilitan cuerpos de agua y sistemas de áreas verdes en zonas urbanas, conectando y dando accesibilidad a frentes ribereños y marinos, parques lineales y otros espacios públicos con soluciones multifuncionales basadas en la naturaleza, para que contribuyan mitigar la vulnerabilidad de las ciudades a las inundaciones y otros efectos del cambio climático, y mejorar la biodiversidad.</p>
 
39		<h4 class="project-detail__subtitle project-detail__subtitle--azul-verde">Infraestructura azul y verde</h4>
 
40		<p class="project-detail__intro-area">Proyectos que rehabilitan cuerpos de agua y sistemas de áreas verdes en zonas urbanas, conectando y dando accesibilidad a frentes ribereños y marinos, parques lineales y otros espacios públicos con soluciones multifuncionales basadas en la naturaleza, para que contribuyan mitigar la vulnerabilidad de las ciudades a las inundaciones y otros efectos del cambio climático, y mejorar la biodiversidad.</p>
 
41	-->       
 
42		<div class="area-proyecto--proyecto--data">
 
43			<#if categories?has_content>
 
44				<div class="area-proyecto--proyecto--country">
 
45				<#list categories as category>
 
46					<#if (urlPais.getData())??>
 
47						<#if (category.getVocabularyId() == cities_vocabulary_id)>
 
48							<a href="${urlPais.getData()}" title="Ir al mapa" class="area-proyecto--proyecto--country--item" target="_blank">${category.getName()}</a>
 
49						</#if>
 
50					</#if>
 
51				</#list>
 
52				</div>
 
53			</#if>
 
54			<#if (government_url.getData())?? && government_url.getData() != "">
 
55				<div class="area-proyecto--proyecto--gov-link">
 
56					<a href="${government_url.getData()}" title="${languageUtil.get(locale, 'es.gob.exteriores.aecid.lcl.proyecto.title.gobierno')}">${languageUtil.get(locale, 'es.gob.exteriores.aecid.lcl.proyecto.gobierno')}</a>
 
57				</div>
 
58			</#if>
 
59		</div>
 
60		<#if image.getSiblings()?has_content>
 
61			<div id="proyecto-item_${articleId}" class="area-proyecto--proyecto--carrusel">
 
62				<#list image.getSiblings() as cur_image>
 
63					<#if (cur_image.getData())?? && cur_image.getData() != "">
 
64						<div class="area-proyecto--proyecto--carrusel--item">
 
65							<div class="area-proyecto--proyecto--carrusel--item--inner" style="background-image: url('${cur_image.getData()}')">
 
66								<img class="sr-only" alt="${cur_image.getAttribute('alt')}" data-fileentryid="${cur_image.getAttribute('fileEntryId')}" src="${cur_image.getData()}" />
 
67							</div>
 
68						</div>
 
69					</#if>
 
70				</#list>
 
71			</div>
 
72		</#if>
 
73		<#if (description.getData())??>
 
74			<div class="project-detail__intro-photos">
 
75				${description.getData()}
 
76			</div>
 
77		</#if>
 
78		
 
79		<#if documentosList.getSiblings()?has_content && !(documentosList.getSiblings()?size == 1 && validator.isNull(documentosList.getSiblings()[0].archivo.getData()))>
 
80			<div class="documentos-lista">
 
81				<h4 class="documentos-lista__description">${languageUtil.get(locale, 'es.gob.exteriores.aecid.lcl.proyecto.documentacion')}</h4>
 
82				<div class="documentos-lista__docs-info">
 
83					<#assign nameDoc="">
 
84					<ul>
 
85						<#list documentosList.getSiblings() as cur_documentosList>
 
86							<#list cur_documentosList.archivo.getData()?split("/") as x>
 
87								<#if x?counter==5>
 
88									<#assign nameDoc=x>
 
89									<#assign extension = nameDoc?keep_after_last(".")>
 
90								</#if>
 
91							</#list>
 
92							<#assign titleData=nameDoc>
 
93							<#if (cur_documentosList.docName.getData())?? && cur_documentosList.docName.getData() !="">
 
94								<#assign nameDoc=cur_documentosList.docName.getData()>
 
95							</#if>
 
96							<#if (cur_documentosList.archivo.getData())?? && cur_documentosList.archivo.getData() !="">
 
97								<li>
 
98									<a title="${titleData}" href="${cur_documentosList.archivo.getData()}" target="_blank">
 
99										<img src="https://laifcitylife.aecid.es/o/laif-theme/images/ico/ico-${extension}.svg"><span>${nameDoc}</span>
 
100									</a>
 
101									<a href="${cur_documentosList.archivo.getData()}&download=true" title="" class="documentos-lista__docs-info__link documentos-lista__docs-info__link--download">
 
102										<span class="sr-only">Descargar</span>
 
103									</a>
 
104								</li>
 
105							</#if>
 
106							<#if (cur_documentosList.linkToExternalPage.getData())?? && cur_documentosList.linkToExternalPage.getData() != "">
 
107								<li>
 
108									<a title="${titleData}" href="${cur_documentosList.linkToExternalPage.getData()}" target="_blank">
 
109										<img src="https://laifcitylife.aecid.es/o/laif-theme/images/ico/ico-web.svg"><span>${nameDoc}</span>
 
110									</a>
 
111								</li>
 
112							</#if>
 
113						</#list>
 
114					</ul>
 
115				</div>
 
116			</div>
 
117		</#if>
 
118	</div>
 
119</div>
 
120
 
121
 
122<#if dataAditional?? && dataAditional.getData()??>
 
123	<#assign webContentData = jsonFactoryUtil.createJSONObject(dataAditional.getData()) />
 
124	<#if webContentData?? && webContentData.className?? && webContentData.classPK?? >
 
125
 
126		<#assign
 
127			className = webContentData.className
 
128			classPK = webContentData.classPK
 
129			asset = assetEntryService.getEntry(className, classPK?number)
 
130			assetRenderer = asset.getAssetRenderer()
 
131			journalArticle = assetRenderer.getAssetObject()
 
132		/>
 
133		<div class="">
 
134			<div class="">
 
135				<#assign void = request.setAttribute("projectId", articleId) />
 
136				<@liferay_journal["journal-article"]
 
137					articleId=journalArticle.getArticleId()
 
138					ddmTemplateKey="PROYECTO-DATOS-ADICIONALES-DETALLE-FTL"
 
139					groupId=journalArticle.getGroupId()
 
140				/>
 
141			</div>
 
142		</div>
 
143	</#if>
 
144</#if>
 
145
 
146<#-- /.area-proyecto--proyecto -->
 
147
 
148<script>
 
149
 
150	document.getElementById('go-back-btn').addEventListener('click', () => history.back());
 
151
 
152	$(function() {
 
153		// Slider proyectos imagenes
 
154		$('#proyecto-item_${articleId}').slick({
 
155			slidesToShow: 2,
 
156			slidesToScroll: 1,
 
157			arrows: true,
 
158			dots: true,
 
159			autoplay: false,
 
160			autoplaySpeed: 5000,
 
161			infinite: false,
 
162			responsive: [
 
163				{
 
164					breakpoint: 992,
 
165					settings: {
 
166						slidesToShow: 2,
 
167						arrows: false,
 
168						infinite: true,
 
169					}
 
170				},
 
171				{
 
172					breakpoint: 768,
 
173					settings: {
 
174						slidesToShow: 1,
 
175						arrows: false,
 
176						infinite: true,
 
177					}
 
178				},
 
179			]
 
180		});
 
181
 
182		// Check if slick track has more than one item
 
183		jQuery('.slick-track').each(
 
184			function () {
 
185				let itemsLength = this.children.length
 
186				if (itemsLength === 1) {
 
187					jQuery(this).addClass('unique-item')
 
188					jQuery(this).parent('.slick-list').addClass('two-or-less')
 
189				} else if (itemsLength === 2) {
 
190					jQuery(this).addClass('two-items')
 
191					jQuery(this).parent('.slick-list').addClass('two-or-less')
 
192				}
 
193			}
 
194		)
 
195	});
 
196</script>