Data journal
Articoli e news per approfondire il mondo dei dati aperti e del lavoro del Comune di Milano, per comprendere meglio questo mondo e raccontare la città attraverso i dati.
Active filters:
An error occurred while processing the template.
Java method "com.liferay.portal.kernel.util.DateUtil_IW.parseDate(String, String, Locale)" threw an exception when invoked on com.liferay.portal.kernel.util.DateUtil_IW object "com.liferay.portal.kernel.util.DateUtil_IW@57a38f22"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign date_DateObj = dateUtil.parse... [in template "65777792077794#20120#250010" at line 74, column 33]
----
1<#-- instanceId -->
2<#assign instanceId = themeDisplay.getPortletDisplay().getId()?keep_after("INSTANCE_") />
3
4<#-- Servizio per ricavare i ddm field di una struttura -->
5<#assign ddmFieldLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMFieldLocalService")/>
6<#-- Servizio utile per ricavare i documenti della DM -->
7<#assign dlFileEntryLocalService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryLocalService') />
8<#-- Servizio per ricavare dati del journal article -->
9<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
10<#-- Servizio per ricavare l'oggetto layout -->
11<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
12<#-- Servizio per ricavare le categorie e relative properties -->
13<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
14
15<#-- Inclusione template con macros e relativi servizi -->
16<#include "${templatesPath}/CDM_RICERCA_COMMON_MACROS" />
17
18<#-- Categorie di tipo -->
19<#assign categorie = [] />
20<#assign assetCategories = ["APPROFONDIMENTO", "PROGETTO", "DATASET", "NEWS", "PAGINA"] />
21
22<#-- CTA Dataset: estensioni di file che fanno scattare la dicitura "Scarica" al posto di "Link" -->
23<#assign downloadFileExtensions = [".xlsx", ".xls", ".xlsm", ".xlsb", ".csv"] />
24
25<#-- html -->
26<div class="risultati-ricerca risultati-ricerca-servizi">
27 <div class="c-mb-4 c-mt-4 search-total-label">
28 <#if searchContainer.getTotal() == 1>
29 ${languageUtil.format(locale, "x-result-for-x", ["<strong class='number'>" +searchContainer.getTotal() + "</strong>" , htmlUtil.escape(searchResultsPortletDisplayContext.getKeywords()) ], false)}
30 <#else>
31 ${languageUtil.format(locale, "x-results-for-x", ["<strong class='number'>" +searchContainer.getTotal() + "</strong>", htmlUtil.escape(searchResultsPortletDisplayContext.getKeywords()) ], false)}
32 </#if>
33 </div>
34 <#if entries?size gt 0>
35 <div class="row">
36
37 <#-- inizio a ciclare sugli elementi e faccio controlli che l'entry sia un articolo -->
38 <#list entries as curEntry>
39 <#if curEntry.getClassName() == "com.liferay.journal.model.JournalArticle">
40 <#assign journalArticle = journalArticleLocalService.getLatestArticle(curEntry.getClassPK(), 0) />
41
42 <#if journalArticle?has_content>
43 <#-- valorizzo le variabili che uso in seguito -->
44 <#assign title = "", abstract = "", viewUrl = "#", date = "", isProgetto = false, isNews = false, fonte = "", isDownloadLink = false />
45
46 <#assign ddmStructureKey = journalArticle.getDDMStructureKey() />
47
48 <#-- primary key journal article -->
49 <#assign journalArticlePrimKey = journalArticle.resourcePrimKey/>
50
51 <#-- categorie -->
52 <#assign categorie = getListCategoryByArticlePrimKey( journalArticlePrimKey ) />
53
54 <#-- title journal article -->
55 <#assign journalArticleTitle = journalArticle.getTitle(locale)/>
56
57 <#-- ricavo dalla struttura i dati che mi servono per creare le card -->
58 <#-- ARTICOLO -->
59 <#if ddmStructureKey == "39724">
60 <#-- struttura: titolo -->
61 <#if getFieldValue(journalArticle, 'Titolo')??>
62 <#assign title = getFieldValue(journalArticle, 'Titolo') />
63 </#if>
64
65 <#-- struttura: descrizione -->
66 <#if getFieldValue(journalArticle, 'Descrizione')??>
67 <#assign abstract = getFieldValue(journalArticle, 'Descrizione') />
68 </#if>
69
70
71 <#-- struttura: data -->
72 <#assign date = curEntry.getModifiedDateString() />
73 <#if validator.isNotNull(date)>
74 <#assign date_DateObj = dateUtil.parseDate("dd MMM yy, HH:mm", date, locale) />
75 <#if "it_IT" == locale>
76 <#assign date = dateUtil.getDate(date_DateObj, "dd/MM/yyyy", locale) />
77 <#else>
78 <#assign date = dateUtil.getDate(date_DateObj, "yyyy/MM/dd", locale) />
79 </#if>
80 </#if>
81 <#assign viewUrl = curEntry.getViewURL()?keep_before('?p_l_back_url') />
82 </#if>
83
84 <#-- DATASET -->
85 <#if ddmStructureKey == "45631">
86 <#-- struttura: titolo -->
87 <#if getFieldValue(journalArticle, 'titoloField')??>
88 <#assign title = getFieldValue(journalArticle, 'titoloField') />
89 </#if>
90
91 <#-- struttura: descrizione -->
92 <#if getFieldValue(journalArticle, 'descrizioneField')??>
93 <#assign abstract = getFieldValue(journalArticle, 'descrizioneField') />
94 </#if>
95
96 <#-- struttura: data -->
97 <#if getFieldValue(journalArticle, 'DataCKANField')?? && validator.isNotNull(getFieldValue(journalArticle, 'DataCKANField')) && getFieldValue(journalArticle, 'DataCKANField')!="">
98 <#assign date = getFieldValue(journalArticle, 'DataCKANField') />
99 <#assign date_DateObj = dateUtil.parseDate("yyyy-MM-dd'T'HH:mm:ss.SSSZ", date, locale) />
100 <#elseif getFieldValue(journalArticle, 'dataField')?? && validator.isNotNull(getFieldValue(journalArticle, 'dataField')) && getFieldValue(journalArticle, 'dataField')!="">
101 <#assign date = getFieldValue(journalArticle, 'dataField') />
102 <#assign date_DateObj = dateUtil.parseDate("yyyy-MM-dd", date, locale) />
103 <#else>
104 <#assign date = curEntry.getModifiedDateString() />
105 <#assign date_DateObj = dateUtil.parseDate("dd MMM yy, HH:mm", date, locale) />
106 </#if>
107 <#if validator.isNotNull(date)>
108 <#if "it_IT" == locale>
109 <#assign date = dateUtil.getDate(date_DateObj, "dd/MM/yyyy", locale) />
110 <#else>
111 <#assign date = dateUtil.getDate(date_DateObj, "yyyy/MM/dd", locale) />
112 </#if>
113 </#if>
114
115
116 <#-- View URL-->
117 <#if getFieldValue(journalArticle, 'linkField')??>
118 <#assign viewUrl = getFieldValue(journalArticle, 'linkField') />
119 </#if>
120
121 <#-- CTA: riconosco se il link punta a un file scaricabile (Link -> Scarica) -->
122 <#assign viewUrlPath = viewUrl?keep_before("?")?keep_before("#")?lower_case />
123 <#list downloadFileExtensions as downloadExt>
124 <#if viewUrlPath?ends_with(downloadExt)>
125 <#assign isDownloadLink = true />
126 </#if>
127 </#list>
128 </#if>
129
130
131 <#-- html -->
132 <div class="col-lg-6">
133 <div class="card-wrapper pb-4 h-100">
134 <div class="card card-servizio h-100 no-after">
135 <div class="card-body p-4">
136
137 <#-- ciclo sulle categorie e visualizzo solo quelle padri -->
138 <div class="category-top">
139 <#if ddmStructureKey == "39724">
140 <#if categorie?? && (categorie?size > 0)>
141 <#list categorie as curCat>
142 <#if validator.isNotNull(curCat) && curCat != "">
143 <#attempt>
144 <#if curCat.getTitle(locale)?upper_case == "PROGETTO">
145 <#assign isProgetto = true />
146 <#elseif curCat.getTitle(locale)?upper_case == "NEWS">
147 <#assign isNews = true />
148 </#if>
149 <#recover>
150 <#-- in caso di problemi non visualizzo nulla -->
151 </#attempt>
152 </#if>
153 </#list>
154 </#if>
155 <#if isProgetto>
156 <span class="badge-cat-article" style="font-weight:600; color:hsl(350, 85.1851851852%, 35.1%);display: flex;gap: 8px;">
157 <img width="25" src="/documents/d/portale-del-dato/icona-progetto-speciale">PROGETTO
158 </span>
159 <#else>
160 <span class="badge-cat-article" style="font-weight:600; color:hsl(350, 85.1851851852%, 35.1%);display: flex;gap: 8px;">
161 <img width="25" src="/documents/d/portale-del-dato/icona-articolo">
162 <#if isNews>
163 NEWS
164 <#else>
165 APPROFONDIMENTO
166 </#if>
167 </span>
168 </#if>
169 </#if>
170 <#if ddmStructureKey == "45631">
171 <span class="badge-cat" style="font-weight:600; color:hsl(350, 85.1851851852%, 35.1%);display: flex;gap: 8px;">
172 <img width="25" src="/documents/d/portale-del-dato/icona-dataset">DATASET
173 </span>
174 </#if>
175 <#if !isProgetto><span class="date-article">${date}</span></#if>
176 </div>
177
178 <#-- titolo -->
179 <#if validator.isNotNull(title)>
180 <h3 class="card-title">
181 ${title}
182 </h3>
183 </#if>
184
185 <#-- abstract -->
186 <#if validator.isNotNull(abstract)>
187 <#assign abstractTooltip = htmlUtil.escape(htmlUtil.stripHtml(abstract)) />
188 <div class="abstract-tooltip-wrapper" data-tooltip="${abstractTooltip}">
189 <div class="card-text card-text-article font-sans-serif mb-6">${abstract}</div>
190 </div>
191 </#if>
192 <div class="pills-container-article">
193 <#if categorie?? && (categorie?size > 0)>
194 <#list categorie as curCat>
195 <#if validator.isNotNull(curCat) && curCat != "" && curCat.parentCategoryId == 0 && !assetCategories?seq_contains(curCat.getTitle(locale)?upper_case)>
196 <span class="badge-cat-article">${curCat.getTitle(locale)}</span>
197 </#if>
198 </#list>
199 </#if>
200 </div>
201 <div class="fonte-article">
202 <#if ddmStructureKey == "39724">
203 <#if getFieldValue(journalArticle, 'AutoreRef')??>
204 <#assign fonte = getFieldValue(journalArticle, 'AutoreRef') />
205 </#if>
206 </#if>
207 <#if ddmStructureKey == "45631">
208 <#if getFieldValue(journalArticle, 'fonteField')??>
209 <#assign fonte = getFieldValue(journalArticle, 'fonteField') />
210 </#if>
211 </#if>
212 <#if fonte?? && validator.isNotNull(fonte) && fonte!="">
213 <#if fonte?contains("Comune")>
214 Da: Open Data
215 <#else>
216 Da: ${fonte}
217 </#if>
218 <#else>
219 Da: Redazione
220 </#if>
221 </div>
222 </div>
223
224 <div class="card-footer p-4 pt-0 bg-white border-0">
225 <div class="d-grid gap-2">
226 <#if ddmStructureKey == "39724">
227 <a href="${viewUrl}" class="btn btn-primary btn-block col-lg-12" data-senna-off="true">Esplora</a>
228 </#if>
229 <#if ddmStructureKey == "45631">
230 <#if isDownloadLink>
231 <a href="${viewUrl}" target="_blank" class="btn btn-primary btn-block col-lg-12 linkBtn">Scarica
232 <svg width="20px" height="20px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#ffffff">
233 <path d="M12 3V16M12 16L7 11M12 16L17 11M5 21H19" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
234 </svg>
235 </a>
236 <#else>
237 <a href="${viewUrl}" target="_blank" class="btn btn-primary btn-block col-lg-12 linkBtn">Link
238 <svg width="20px" height="20px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="#ffffff">
239 <path d="M10 4H6C4.89543 4 4 4.89543 4 6V18C4 19.1046 4.89543 20 6 20H18C19.1046 20 20 19.1046 20 18V14M11 13L20 4M20 4V9M20 4H15" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
240 </svg>
241 </a>
242 </#if>
243 <#if getFieldValue(journalArticle, 'linkIncorporaField')??>
244 <#assign urlIncorpora = getFieldValue(journalArticle, 'linkIncorporaField') />
245 <#if validator.isNotNull(urlIncorpora) && urlIncorpora != "">
246 <a href="/web/portale-del-dato/anteprima?" class="btn btn-outline-primary btn-block col-lg-12 linkBtn" onclick="localStorage.setItem('anterpimaUrl', '${urlIncorpora}');" data-senna-off="true">Anteprima</a>
247 </#if>
248 </#if>
249 <#if getFieldValue(journalArticle, 'linkMappaField')??>
250 <#assign urlMappa = getFieldValue(journalArticle, 'linkMappaField') />
251 <#if validator.isNotNull(urlMappa) && urlMappa != "">
252 <a href="/web/portale-del-dato/anteprima?" class="btn btn-outline-primary btn-block col-lg-12 linkBtn" onclick="localStorage.setItem('anterpimaUrl', '${urlMappa}');" data-senna-off="true">Mappa</a>
253 </#if>
254 </#if>
255 </#if>
256 </div>
257 </div>
258
259 </div>
260 </div>
261 </div>
262
263 </#if>
264 </#if>
265 <#if curEntry.getClassName() == "com.liferay.portal.kernel.model.Layout">
266 <#assign layoutEntry = layoutLocalService.getLayout(curEntry.getClassPK()) />
267 <#assign title = layoutEntry.getHTMLTitle(locale) />
268 <#assign description = layoutEntry.getDescription(locale) />
269 <#assign viewUrl = layoutEntry.getFriendlyURL(locale) />
270 <#-- categorie -->
271 <#assign categorie = assetCategoryLocalService.getCategories("com.liferay.portal.kernel.model.Layout", curEntry.getClassPK()) />
272 <div class="col-lg-6">
273 <div class="card-wrapper pb-4 h-100">
274 <div class="card card-servizio h-100 no-after">
275 <div class="card-body p-4">
276 <#-- ciclo sulle categorie e visualizzo solo quelle padri -->
277 <div class="category-top">
278 <span class="badge-cat-article" style="font-weight:600; color:hsl(350, 85.1851851852%, 35.1%);display: flex;gap: 8px;">
279 <img width="25" src="/documents/d/portale-del-dato/icona-pagina-standard">Pagina
280 </span>
281 </div>
282 <#-- titolo -->
283 <#if validator.isNotNull(title)>
284 <h3 class="card-title">${title}</h3>
285 </#if>
286
287 <#-- description -->
288 <#if validator.isNotNull(description)>
289 <#assign descriptionTooltip = htmlUtil.escape(htmlUtil.stripHtml(description)) />
290 <div class="abstract-tooltip-wrapper" data-tooltip="${descriptionTooltip}">
291 <div class="card-text card-text-article font-sans-serif mb-6">${description}</div>
292 </div>
293 </#if>
294 <div class="pills-container-article">
295 <#if categorie?? && (categorie?size > 0)>
296 <#list categorie as curCat>
297 <#if validator.isNotNull(curCat) && curCat !="" && curCat.parentCategoryId==0 && !assetCategories?seq_contains(curCat.getTitle(locale)?upper_case)>
298 <span class="badge-cat-article">${curCat.getTitle(locale)}</span>
299 </#if>
300 </#list>
301 </#if>
302 </div>
303 <div class="fonte-article">Da: Redazione</div>
304 </div>
305 <div class="card-footer p-4 pt-0 bg-white border-0">
306 <div class="d-grid gap-2">
307 <a href="/web/portale-del-dato${viewUrl}" class="btn btn-primary btn-block col-lg-12" data-senna-off="true">Esplora</a>
308 </div>
309 </div>
310 </div>
311 </div>
312 </div>
313 </#if>
314 </#list>
315
316 </div>
317 </#if>
318</div>
319<style>
320 .number {
321 color: #A50D26;
322 }
323 .search-total-label {
324 padding-left: 12px;
325 position: absolute;
326 z-index: 2;
327 margin-top:-58px;
328 font-size: 1rem;
329 }
330 .pagination {
331 justify-content:center;
332 }
333 .pagination-items-per-page {
334 display:flex;
335 flex-direction:row-reverse;
336 }
337 .pagination-results{
338 position: absolute;
339 top: -32px;
340 padding-left: 12px;
341 display: flex;
342 font-size: 16px;
343 flex-direction: row-reverse;
344 }
345 @media (max-width: 600px) {
346 .search-total-label{
347 margin-top:-80px !important;
348 }
349 }
350 .category-top {
351 display: flex !important;
352 justify-content: space-between;
353 }
354 .card-text-article, .card-text-article p {
355 font-size: 14px !important;
356 }
357 .pills-container-article {
358 display: flex;
359 flex-wrap: wrap;
360 gap: 0.4rem;
361 margin-top: 0.5rem;
362 }
363 .pills-container-article .badge-cat-article {
364 background-color: white;
365 color: hsl(350, 85.1851851852%, 35.1%);
366 border: 1px solid hsl(350, 85.1851851852%, 35.1%);
367 padding: 0rem 0.65rem;
368 font-size: 0.75rem;
369 text-transform:uppercase;
370 border-radius: 9999px;
371 font-weight: 600;
372 white-space: nowrap;
373 max-width: 100%;
374 overflow: hidden;
375 text-overflow: ellipsis;
376 }
377 .pills-container-article .badge-cat-article:hover {
378 background-color: hsl(350, 85.1851851852%, 35.1%); /* colore più scuro al passaggio */
379 color: #fff;
380 }
381 .fonte-article {
382 font-style: italic;
383 font-size: 14px;
384 text-align: start;
385 margin-top: 0.75rem;
386 }
387 .abstract-tooltip-wrapper {
388 position: relative;
389 }
390 .abstract-tooltip-wrapper[data-tooltip]:hover::after {
391 content: attr(data-tooltip);
392 position: absolute;
393 left: 0;
394 top: 100%;
395 margin-top: 4px;
396 z-index: 10;
397 width: max-content;
398 max-width: 320px;
399 white-space: pre-line;
400 background-color: #333;
401 color: #fff;
402 font-style: normal;
403 font-size: 12px;
404 line-height: 1.4;
405 padding: 8px 12px;
406 border-radius: 6px;
407 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
408 pointer-events: none;
409 }
410</style>