Errorea gertatu da txantiloia prozesatzerakoan.
The following has evaluated to null or missing:
==> sede  [in template "387440#387480#1070294" at line 73, column 34]

----
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: @liferay.language key=sede.tramites.d...  [in template "387440#387480#1070294" at line 73, column 11]
----
1<#assign DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
 
2
 
3<#assign themeImagesPath    = themeDisplay.getPathThemeImages()>
 
4<#assign dniSvgPath         = themeImagesPath + "/iconos_acceso/dni_electronico.svg">
 
5<#assign certificadoSvgPath = themeImagesPath + "/iconos_acceso/certificado_electronico.svg">
 
6<#assign claveSvgPath       = themeImagesPath + "/iconos_acceso/clave.svg">
 
7<#assign autofirmaSvgPath   = themeImagesPath + "/iconos_acceso/autofirma.svg">
 
8
 
9<#assign DNIe        = getterUtil.getBoolean(modoAccesoTramite.checkDNIe.getData())>
 
10<#assign certificado = getterUtil.getBoolean(modoAccesoTramite.certificadoElectronico.getData())>
 
11<#assign clave       = getterUtil.getBoolean(modoAccesoTramite.checkClave.getData())>
 
12<#assign autofirma   = getterUtil.getBoolean(modoAccesoTramite.checkAutofirma.getData())>
 
13
 
14<#assign hermanosAviso = avisosTramite.getSiblings()>
 
15
 
16<#assign summaryFields = [
 
17  { "field": plazosTramite.getData(), "labelKey": "tramites.detalles.plazos" },
 
18  { "field": tramiteDescripcion.getData(), "labelKey": "sede.tramites.detalles.descripcion" },
 
19  { "field": tramiteRequisitos.getData(), "labelKey": "sede.tramites.detalles.requisitos" },
 
20  { "field": tramiteSolicitud.getData(), "labelKey": "sede.tramites.detalles.solicitud" },
 
21  { "field": tramiteDocumentacionSolicitudInscripcion.getData(), "labelKey": "sede.tramites.detalles.documentacionSolicitudInscripcion" },
 
22  { "field": tramiteOtraDocumentacion.getData(), "labelKey": "sede.tramites.detalles.otraDocumentacion" },
 
23  { "field": modoAccesoTramite.getData(), "labelKey": "sede.tramites.detalles.acceso" },
 
24  { "field": tramiteUnidadGestion.getData(), "labelKey": "sede.tramites.detalles.unidad.gestion" },
 
25  { "field": tramiteCodigoSIA.getData(), "labelKey": "sede.tramites.detalles.codigo.SIA" },
 
26  { "field": avisoProcedim.getData(), "labelKey": "sede.tramites.detalles.avisos" }
 
27] />
 
28
 
29
 
30<article class="sede-ficha m-vertical-content">
 
31  <#if tramiteTitulo.getData()?has_content>
 
32    <h2>${tramiteTitulo.getData()}</h2>
 
33  </#if>
 
34
 
35    <!-- Avisos y plazos -->
 
36  <#assign warningsHasData = false>
 
37  <#list hermanosAviso as cur_aviso>
 
38    <#if cur_aviso.tituloAvisosTramite.getData()?has_content || cur_aviso.contenidoAvisosTramite.getData()?has_content>
 
39      <#assign warningsHasData = true>
 
40      <#break>
 
41    </#if>
 
42  </#list>
 
43		
 
44  <#assign deadlinesHasData = false>
 
45  <#list plazosTramite.getSiblings() as cur_plazo>
 
46    <#if cur_plazo.getData()?has_content>
 
47      <#assign deadlinesHasData = true>
 
48      <#break>
 
49    </#if>
 
50  </#list>
 
51					
 
52  <#if warningsHasData || deadlinesHasData>
 
53    <#if hermanosAviso?? && hermanosAviso?has_content>
 
54      <#list hermanosAviso as cur>
 
55        <#if cur.tituloAvisosTramite.getData()?has_content || cur.contenidoAvisosTramite.getData()?has_content>
 
56          <div class="sede-alert">
 
57            <span class="sede-icon sede-icon--alert sede-icon--size-48" aria-hidden="true"></span>
 
58
 
59            <div class="sede-alert__body">
 
60              <#if cur.tituloAvisosTramite.getData()?has_content><h4 class="sede-alert__title">${cur.tituloAvisosTramite.getData()}</h4></#if>
 
61              <#if cur.contenidoAvisosTramite.getData()??><div>${cur.contenidoAvisosTramite.getData()}</div></#if>
 
62            </div>
 
63          </div>
 
64        </#if>
 
65      </#list>
 
66    <#else>
 
67      <p><@liferay.language key="sede.tramites.detalles.avisos.vacio" /></p>
 
68    </#if>
 
69
 
70    <section class="sede-ficha__resumen">
 
71      <section class="sede-ficha__fila">
 
72        <h3 class="h5 sede-ficha__fila-label">
 
73          <@liferay.language key=sede.tramites.detalles.plazos />
 
74        </h3>
 
75
 
76        <div class="sede-ficha__fila-valor">
 
77          <#if plazosTramite.getData()?has_content>
 
78            <#list plazosTramite.getSiblings() as cur_plazo>
 
79              <#if cur_plazo.getData()?has_content>
 
80                <div>${cur_plazo.getData()}</div>
 
81              </#if>
 
82            </#list>
 
83          <#else>
 
84            <p><@liferay.language key="sede.tramites.detalles.plazos.vacio" /></p>
 
85          </#if>
 
86        </div>
 
87      </section>
 
88    </section>
 
89
 
90  </#if>
 
91 
 
92  <!-- Tabla resumen -->
 
93  <section class="sede-ficha__resumen">
 
94    <#list summaryFields as item>
 
95      <#if item.field?has_content || item.labelKey == "sede.tramites.detalles.acceso">
 
96        <section class="sede-ficha__fila">
 
97          <h3 class="h5 sede-ficha__fila-label">
 
98            <@liferay.language key=item.labelKey />
 
99          </h5>
 
100
 
101          <div class="sede-ficha__fila-valor">
 
102            <#if item.labelKey == "sede.tramites.detalles.acceso">
 
103              <#if item.field?has_content><p>${item.field}</p></#if>
 
104
 
105              <div class="iconos-acceso">
 
106                <#if DNIe><img src="${dniSvgPath}" alt="${languageUtil.get(locale,'es.gob.inclusion.img.alt.dni.electronico','Icono del DNI electrónico')}"></#if>
 
107                <#if certificado><img src="${certificadoSvgPath}" alt="${languageUtil.get(locale,'es.gob.inclusion.img.alt.certificado.electronico','Icono del certificado electrónico')}"></#if>
 
108                <#if clave><img src="${claveSvgPath}" alt="${languageUtil.get(locale,'es.gob.inclusion.img.alt.clave','Icono de Cl@ve')}"></#if>
 
109                <#if autofirma><img src="${autofirmaSvgPath}" alt="${languageUtil.get(locale,'es.gob.inclusion.img.alt.autofirma','Icono de Autofirma')}"></#if>
 
110              </div>
 
111            <#else>
 
112              ${item.field}
 
113            </#if>
 
114          </div>
 
115        </section>
 
116      </#if>
 
117    </#list>
 
118
 
119    <#if tramiteAccesoTramite.getData()?has_content>
 
120      <section class="sede-ficha__cta">
 
121        <a class="sede-button noicon" href="${tramiteAccesoTramite.getData()}" <#if tramiteAccesoTramite.getData()?starts_with("http")>target="_blank" rel="noopener"</#if>>
 
122          <span><@liferay.language key="sede.tramites.detalles.accede.tramite" /></span>
 
123          <i class="sede-icon sede-icon--arrow-forward-long sede-icon--size-16" aria-hidden="true"></i>
 
124        </a>
 
125      </section>
 
126    </#if>
 
127  </section>
 
128
 
129  <!-- Paso a paso -->
 
130  <#if tramitePasoAPaso.getData()?has_content>
 
131      <section>
 
132        <h3><@liferay.language key="sede.tramites.detalles.paso.a.paso" /></h3>
 
133          
 
134        <#if tramitePasoAPaso.getSiblings()?has_content>
 
135          <ol>
 
136            <#list tramitePasoAPaso.getSiblings() as paso>
 
137              <li>${paso.getData()}</li> 
 
138            </#list>
 
139          </ol>	
 
140        </#if> 
 
141      </section>
 
142  </#if>
 
143		
 
144  <!-- Requisitos y documentación -->
 
145  <#if tramiteRequisitosDocumentacion.getData()?has_content || tramiteRequisitosDocumentacion.tramiteTituloDocumento.tramiteDocumento.getData()?has_content>
 
146      <section>
 
147        <h3><@liferay.language key="sede.tramites.detalles.requisitos.documentacion" /></h3>
 
148        <#if tramiteRequisitosDocumentacion.getData()?has_content><p>${tramiteRequisitosDocumentacion.getData()}</p></#if>
 
149
 
150        <#if tramiteRequisitosDocumentacion.tramiteTituloDocumento.getSiblings()?has_content>
 
151            <ul>
 
152                <#list tramiteRequisitosDocumentacion.tramiteTituloDocumento.getSiblings() as cur_tramiteRequisitosDocumentacion_tramiteTituloDocumento>
 
153                    <#if cur_tramiteRequisitosDocumentacion_tramiteTituloDocumento.tramiteDocumento.getData()?has_content>
 
154                    <#assign curDocFile = cur_tramiteRequisitosDocumentacion_tramiteTituloDocumento.tramiteDocumento.getData() />
 
155                      <li>
 
156                        <a data-senna-off="true" href="${cur_tramiteRequisitosDocumentacion_tramiteTituloDocumento.tramiteDocumento.getData()}" <#if curDocFile?lower_case?contains(".pdf")>target="_blank"</#if>>
 
157                          ${cur_tramiteRequisitosDocumentacion_tramiteTituloDocumento.getData()}
 
158                        </a>
 
159                      </li>
 
160                    </#if>
 
161                </#list>
 
162            </ul>
 
163        </#if>
 
164      </section>
 
165  </#if>
 
166    
 
167  <!-- Normativa básica -->
 
168  <#if tramiteNormativaBasica.getData()?has_content>
 
169    <section>
 
170      <h3><@liferay.language key="sede.tramites.detalles.normativa" /></h3>
 
171      <p>${tramiteNormativaBasica.getData()}</p>
 
172
 
173      <#if tramiteNormativaBasica.TituloNormativa.getSiblings()?has_content>
 
174        <ul>
 
175          <#list tramiteNormativaBasica.TituloNormativa.getSiblings() as cur_tramiteNormativaBasica_TituloNormativa>
 
176            <#if cur_tramiteNormativaBasica_TituloNormativa.getData()?has_content && cur_tramiteNormativaBasica_TituloNormativa.UrlNormativa.getData()?has_content>
 
177              <li>
 
178                <a href="${cur_tramiteNormativaBasica_TituloNormativa.UrlNormativa.getData()}">${cur_tramiteNormativaBasica_TituloNormativa.getData()}</a>
 
179              </li>
 
180            </#if>
 
181          </#list>
 
182        </ul>
 
183      </#if>
 
184    </section>
 
185  </#if>
 
186
 
187
 
188
 
189</article>
 
190
 
191<script>
 
192  document.addEventListener('DOMContentLoaded', () => {
 
193    const tabs = document.querySelectorAll('.sede-tabs__btn');
 
194    const panels = document.querySelectorAll('.sede-tabs__panel');
 
195
 
196    function activateTab(tab) {
 
197      tabs.forEach(t => {
 
198        t.classList.remove('is-active');
 
199        t.setAttribute('aria-selected', 'false');
 
200        t.setAttribute('tabindex', '-1');
 
201      });
 
202
 
203      panels.forEach(p => {
 
204        p.classList.remove('is-active');
 
205        p.setAttribute('hidden', 'true');
 
206      });
 
207
 
208      tab.classList.add('is-active');
 
209      tab.setAttribute('aria-selected', 'true');
 
210      tab.setAttribute('tabindex', '0');
 
211
 
212      const panel = document.getElementById(tab.getAttribute('aria-controls'));
 
213      panel.classList.add('is-active');
 
214      panel.removeAttribute('hidden');
 
215    }
 
216
 
217    tabs.forEach(tab => {
 
218      tab.addEventListener('click', () => activateTab(tab));
 
219
 
220      tab.addEventListener('keydown', e => {
 
221        let index = Array.prototype.indexOf.call(tabs, tab);
 
222        if (e.key === 'ArrowRight') {
 
223          index = (index + 1) % tabs.length;
 
224          tabs[index].focus();
 
225        } else if (e.key === 'ArrowLeft') {
 
226          index = (index - 1 + tabs.length) % tabs.length;
 
227          tabs[index].focus();
 
228        } else if (e.key === 'Home') {
 
229          tabs[0].focus();
 
230        } else if (e.key === 'End') {
 
231          tabs[tabs.length - 1].focus();
 
232        } else if (e.key === 'Enter' || e.key === ' ') {
 
233          e.preventDefault();
 
234          activateTab(tab);
 
235        }
 
236      });
 
237    });
 
238  });
 
239</script>