Si è verificato un errore nell'elaborarazione del modello.
Can't convert this string to number: "10;00" The blamed expression: ==> sValue?number [in template "20099#20135#131031611" at line 235, column 115] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign podcastStartHH = sValue?number [in template "20099#20135#131031611" at line 235, column 89] ----
1<#assign instanceid = themeDisplay.getPortletDisplay().getId()?keep_after("INSTANCE_") />
2
3<#-- Ricavo servizi utili in seguito -->
4<#-- Servizio utile per ricavare le categorie -->
5<#assign catLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
6
7<#-- Servizi utili pe ricavare le immagini dalla D&M -->
8<#assign dlFileEntryLocalService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryLocalService') />
9<#assign dlUtil = serviceLocator.findService('com.liferay.document.library.kernel.util.DLUtil') />
10<#assign dlAppService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLAppService') />
11
12<#-- Se il carattere indicato è il prefisso della categoria, indica che la stessa non deve essere mostrata a video, ma viene solo usata per scopi funzionali -->
13<#assign PREFIX_SERVICE_CATEGORY = "_" />
14<#-- Funzioni utilita -->
15<#-- Ripulisco stringa da caratteri speciali -->
16<#function escapeExtraChar text>
17 <#return text?replace("\"",""", "r")?replace("'","’", "r")>
18</#function>
19
20<#-- Verifico se il primo elemento di una lista esiste -->
21<#function firstOfListNotEmpty list>
22 <#assign result = false />
23 <#if list?? && list?has_content && list.getSiblings()?has_content && list.getSiblings()?first.getData()?has_content>
24 <#assign result = true />
25 </#if>
26 <#return result>
27</#function>
28
29<#-- Ricavo tutte le categorie associate ad un articolo a meno di quelle che hanno un prefisso "_" -->
30<#function getCategoryByArticlePrimKey articlePrimKey>
31 <#assign tmp = "" />
32 <#assign articleCatNames = catLocalService.getCategories("com.liferay.journal.model.JournalArticle", getterUtil.getLong(articlePrimKey)) />
33 <#if (articleCatNames?size > 0)>
34 <#list articleCatNames as category>
35 <#if category.name?substring(0,1) != PREFIX_SERVICE_CATEGORY >
36 <#assign tmp = tmp + category.name + ", " />
37 </#if>
38 </#list>
39 <#assign tmp = tmp?keep_before_last(",") />
40 </#if>
41 <#return tmp>
42</#function>
43<#-- Verifico che la lista di elementi dell'asset siano journal article -->
44<#function isJournalArticle renderer>
45 <#return ("com.liferay.journal.model.JournalArticle" == renderer.getClassName() ) >
46</#function>
47<#function getElements renderer>
48 <#assign journalArticle = renderer.getArticle() />
49 <#assign document = saxReaderUtil.read(journalArticle.getContent()) />
50 <#assign rootElement = document.getRootElement() />
51 <#return rootElement.elements() >
52</#function>
53
54<#assign userTimeZone = themeDisplay.getUser().getTimeZone() />
55<#assign today = dateUtil.getCurrentDate("dd-MM-yyyy", locale) />
56<#assign now = dateUtil.getCurrentDate("HH:mm", locale) />
57<#assign hour = dateUtil.getCurrentDate("HH", locale, userTimeZone) />
58<#assign minute = dateUtil.getCurrentDate("mm", locale, userTimeZone) />
59
60<script src="https://www-cdn.comune.milano.it/o/cdm-theme/js/jquery.selectric.min.js"></script>
61<link rel="stylesheet" href="/documents/91069258/0/custom_radio.css/6b70391a-376d-d014-7354-7efe3767da68">
62
63<script>
64 function filtra() {
65 var listaAudio = $("#palinsesto .item-audio");
66 listaAudio.show();
67
68 var listaVideo = $("#palinsesto .item-video");
69 listaVideo.show();
70
71 var tagTextSelected = $("#tipologia input[type='radio']:checked").val();
72
73 if(tagTextSelected == "video") {
74 listaAudio.hide();
75 } else if (tagTextSelected == "audio") {
76 listaVideo.hide();
77 }
78 }
79
80 var height = "0px";
81
82 function closePlayer() {
83 $("#player").css({"height":height,"min-height":0});
84 height = "0px";
85 $("#player-content").hide();
86 $("#close-button").hide();
87 $("#player").animate({"height":height}, 300).fadeOut();
88 $(".item").css('color', '#555');
89 $(".play-icon").css('color', '#555');
90 }
91
92 function openPlayer(title, diffDate, desc, type, url) {
93 if (height === "0px") {
94 height = "150px";
95 $("#player").animate({"height":height}, 150).show();
96 }
97 if (type == "audio") {
98 $("#video-content").hide();
99 $("#audio-content").attr('src', url).show();
100 $("#audio-download").attr('href', url);
101 $("#audio-download-text").show();
102 } else {
103 $("#audio-download-text").hide();
104 $("#audio-content").hide();
105 $("#video-content").attr('src', url).show();
106 }
107 $("#player-content-title").html(title);
108 $("#player-content-date").html(diffDate);
109 $("#player-content-description").html(desc);
110 $("#player-content").show();
111 $("#close-button").show();
112 $("html, body").animate({scrollTop: $("#player").offset().top -250 }, "slow");
113 height = ($("#player-content").height()+10) + "px";
114 $("#player").animate({"height":height}, 300).show();
115 }
116
117 function colorChange(elemId1, elemId2) {
118 $(".item").css('color', '#555');
119 $(".play-icon").css('color', '#555');
120 $("#"+elemId1).css('color', '#d6012e');
121 $("#"+elemId2).css('color', '#d6012e');
122 }
123</script>
124
125<h2>Archivio</h2>
126
127<div id="player" style="height: 0px; background: rgb(238, 238, 238); border-radius: 2em; display:none;">
128 <div class="row px-4 pt-2" id="player-content" style="">
129 <div class="col-10 align-self-center">
130 <p class="font-weight-bold" id="player-content-title" style="font-size: 1.2em; color: #d6012e;"> </p>
131 </div>
132
133 <div class="col-2 text-right">
134 <p id="close-button" style="font-size: 2em; color: rgb(214, 1, 46);"><a href="javascript: closePlayer();"><i aria-hidden="true" class="fa fa-times" style="color: #d6012e;"></i> </a></p>
135 </div>
136
137 <div class="col-12 col-lg-4 pl-3 text-center">
138 <audio controls="" id="audio-content" src="" style="
139 -moz-box-shadow: 0px 0px 5px 1.5px #adadad;
140 -webkit-box-shadow: 0px 0px 5px 1.5px #adadad;
141 box-shadow: 0px 0px 5px 1.5px #adadad;
142 -moz-border-radius: 30px;
143 -webkit-border-radius: 30px;
144 border-radius: 30px;width: 100%;"> Player non supportato.</audio>
145
146 <p class="font-weight-bold pt-1" id="audio-download-text"><i aria-hidden="true" class="fa fa-download"></i> <a href="" id="audio-download">Salva il podcast</a></p>
147
148 <p><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="200" id="video-content" src="" style="display: none;
149 -moz-box-shadow: 4px 4px 3px 1px #adadad;
150 -webkit-box-shadow: 4px 4px 3px 1px #adadad;
151 box-shadow: 4px 4px 3px 1px #adadad;" width="100%"></iframe></p>
152 </div>
153
154 <div class="col-12 col-lg-8 pr-3">
155 <p style="font-size: 1.1em;"><i aria-hidden="true" class="fa fa-calendar"></i> <span id="player-content-date"></span></p>
156
157 <p style="font-size: 1.1em; overflow: auto;"><span id="player-content-description"></span></p>
158 </div>
159 </div>
160</div>
161
162
163<#if entries?has_content>
164 <#assign count = 0 />
165
166 <section id="palinsesto">
167 <div class="row">
168 <div class="col mt-4">
169 <form id="tipologia" class="ricercacontestuale" onclick="filtra()">
170 <fieldset class="filtri">
171 <legend>Filtra per tipologia</legend>
172 <p class="form-check form-check-inline custom_radio">
173 <input class="form-check-input" type="radio" id="tutte" name="inlineRadiobox" value="tutte" checked>
174 <label class="form-check-label" for="tutte">Tutti</label>
175 </p>
176 <p class="form-check form-check-inline custom_radio">
177 <input class="form-check-input" type="radio" id="audio" name="inlineRadiobox" value="audio">
178 <label class="form-check-label" for="audio">Audio</label>
179 </p>
180 <p class="form-check form-check-inline custom_radio">
181 <input class="form-check-input" type="radio" id="video" name="inlineRadiobox" value="video">
182 <label class="form-check-label" for="video">Video</label>
183 </p>
184 </fieldset>
185 </form>
186 </div>
187 </div>
188
189 <#assign currentDate = "01/01/2000" />
190 <div class="row mt-2" style="padding-left: 0.8em; padding-bottom: 1em;">
191 <#list entries as curEntry>
192 <#assign entryIndex = curEntry?index />
193 <#assign renderer = curEntry.getAssetRenderer() />
194
195 <#-- verifico che sia un journal article -->
196 <#if isJournalArticle(renderer)>
197
198 <#-- ricavo il primekey -->
199 <#assign articlePrimKey = renderer.getArticle().getResourcePrimKey() />
200
201 <#-- ricavo il titolo -->
202 <#assign titolo = escapeExtraChar(curEntry.getTitle(locale)) />
203
204 <#-- ricavo la view url -->
205 <#assign viewUrl = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, curEntry) />
206 <#if assetLinkBehavior != "showFullContent">
207 <#assign viewUrl = renderer.getURLViewInContext(renderRequest, renderResponse, viewUrl) />
208 </#if>
209
210 <#-- inizializzo le variabili che uso -->
211 <#assign categoria = "", podcastTitle = "", description = "", image = "", podcastFile = "#", youtube_link = "#", past = "false", podcastStartHH = 0, podcastStartMM = 0, podcastEndHH = 0, podcastEndMM = 0/>
212
213 <#-- recupero l'elenco delle categorie da visualizzare -->
214 <#assign categoria = getCategoryByArticlePrimKey( articlePrimKey ) />
215
216 <#-- recupero i dati dalla struttura dell'articolo -->
217 <#list getElements(renderer) as dynamicElement>
218 <#if "podcastTitle" == dynamicElement.attributeValue("name")>
219 <#assign podcastTitle = escapeExtraChar(dynamicElement.element("dynamic-content").getData()) />
220 <#elseif "checkbox_podcast" == dynamicElement.attributeValue("name")>
221 <#assign checkbox_podcast = dynamicElement.element("dynamic-content").getText() />
222 <#elseif "checkbox_archive" == dynamicElement.attributeValue("name")>
223 <#assign checkbox_archive = dynamicElement.element("dynamic-content").getText() />
224 <#elseif "podcastDate" == dynamicElement.attributeValue("name")>
225 <#assign podcastDate = dynamicElement.element("dynamic-content").getText() />
226 <#assign podcastDate = podcastDate?trim />
227 <#assign podcastDate = htmlUtil.extractText(podcastDate) />
228 <#assign podcastDateObj = dateUtil.parseDate("yyyy-MM-dd", podcastDate, locale)>
229 <#elseif "podcastOrarioInizio" == dynamicElement.attributeValue("name")>
230 <#assign podcastStart = dynamicElement.element("dynamic-content").getData() />
231 <#assign c = 0/>
232 <#list podcastStart?split(":") as sValue>
233 <#if sValue != "">
234 <#if (c % 2 == 0)>
235 <#assign podcastStartHH = sValue?number/>
236 <#else>
237 <#assign podcastStartMM = sValue?number/>
238 </#if>
239 <#assign c = c+1/>
240 </#if>
241 </#list>
242 <#if podcastStart != "">
243 <#assign podcastStart = " alle ore <strong>" + podcastStart + "</strong>"/>
244 <#else>
245 <#assign podcastStart = " "/>
246 </#if>
247 <#elseif "podcastOrarioFine" == dynamicElement.attributeValue("name")>
248 <#assign podcastEnd = dynamicElement.element("dynamic-content").getData() />
249 <#assign c = 0/>
250 <#list podcastEnd?split(":") as sValue>
251 <#if sValue != "">
252 <#if (c % 2 == 0)>
253 <#assign podcastEndHH = sValue?number/>
254 <#else>
255 <#assign podcastEndMM = sValue?number/>
256 </#if>
257 <#assign c = c+1/>
258 </#if>
259 </#list>
260 <#elseif "podcastDesc" == dynamicElement.attributeValue("name")>
261 <#assign podcastDesc = escapeExtraChar(dynamicElement.element("dynamic-content").getText()) />
262 <#elseif "youtube_link" == dynamicElement.attributeValue("name")>
263 <#assign youtube_link = dynamicElement.element("dynamic-content").getText() />
264 <#elseif "podcastTipologia" == dynamicElement.attributeValue("name")>
265 <#assign podcastTipologia = dynamicElement.element("dynamic-content").getData() />
266 <#if podcastTipologia == "audio">
267 <#assign icona = "<i class='fas fa-podcast'></i>">
268 <#else>
269 <#assign icona = "<i class='fas fa-video'></i>">
270 </#if>
271 <#elseif "podcastFile" == dynamicElement.attributeValue("name")>
272 <#assign podcastJString = dynamicElement.element("dynamic-content").getText() />
273 <#if podcastJString?? && podcastJString?has_content>
274 <#assign fileJson = podcastJString?eval />
275 <#assign dlFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(fileJson.uuid, fileJson.groupId?number) />
276 <#assign fileEntry = dlAppService.getFileEntry(dlFileEntry.fileEntryId) />
277 <#assign dlFile = dlUtil.getPreviewURL(fileEntry, fileEntry.getFileVersion(), themeDisplay, "") />
278 <#assign podcastFile = dlFile />
279 </#if>
280 <#elseif "podcastImage" == dynamicElement.attributeValue("name")>
281 <#assign imageJString = dynamicElement.element("dynamic-content").getText() />
282 <#if imageJString?? && imageJString?has_content>
283 <#assign imageJson = imageJString?eval />
284 <#assign dlFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(imageJson.uuid, imageJson.groupId?number) />
285 <#assign fileEntry = dlAppService.getFileEntry(dlFileEntry.fileEntryId) />
286 <#assign dlFile = dlUtil.getPreviewURL(fileEntry, fileEntry.getFileVersion(), themeDisplay, "") />
287 <#assign podcastImage = dlFile />
288 </#if>
289 </#if>
290 </#list>
291
292 <#if podcastTipologia == "audio">
293 <#assign link = podcastFile />
294 <#else>
295 <#assign link = youtube_link />
296 </#if>
297
298 <#-- CONTROLLO DIRETTA -->
299 <#if (checkbox_podcast != "true")>
300 <#if (dateUtil.getDaysBetween(dateUtil.newDate(), podcastDateObj) == 0)>
301 <#-- oggi -->
302 <#if (stringUtil.equals(podcastDateObj?date?string('MMM dd, yyyy'), dateUtil.newDate()?string('MMM dd, yyyy'))) == true>
303 <#-- oggi -->
304 <#assign startTime = podcastStartHH*60 + podcastStartMM/>
305 <#assign endTime = podcastEndHH*60 + podcastEndMM/>
306 <#assign currentTime = hour?number*60 + minute?number/>
307 <#if (startTime < currentTime) && (currentTime < endTime)>
308 <#-- diretta -->
309 <#assign on_air = "on_air"/>
310 <#assign icona_info = "<i class='far fa-play-circle ${on_air}'></i>"/>
311 <#else>
312 <#-- evento passato o futuro -->
313 <#if (startTime > currentTime)>
314 <#-- evento futuro -->
315 <#assign past = "false"/>
316 <#else>
317 <#if (currentTime > endTime)>
318 <#-- evento già passato -->
319 <#assign past = "true"/>
320 </#if>
321 </#if>
322 </#if>
323 <#else>
324 <#-- evento futuro -->
325 <#assign past = "false"/>
326 </#if>
327 <#else>
328 <#-- evento passato o futuro -->
329 <#if (dateUtil.compareTo(dateUtil.newDate(), podcastDateObj) < 0)>
330 <#-- evento futuro -->
331 <#assign past = "false"/>
332 <#else>
333 <#-- evento già passato -->
334 <#assign past = "true"/>
335 </#if>
336 </#if>
337 <#else>
338 <#-- evento podcast - da non inserire -->
339 </#if>
340
341 <#-- HTML -->
342 <#assign count = count+1/>
343 <#assign textDate = dateUtil.getDate(podcastDateObj, "dd/MM/yyyy", locale) />
344
345 <#if checkbox_archive == "true" && past == "true">
346 <div class="col-12 col-md-4 mb-1 item-${podcastTipologia}" style="margin-bottom: 10px !important;">
347 <div class="row rounded-top" style="background: #d6012e; margin-right: 0em; color: white; border-bottom: #d6012e 2px solid;">
348 <div class="col-10">
349 <p class="text-truncate" style="max-width:100%; font-weight: bold; font-size: 1.2em; padding: 5px; margin-bottom: 0;">${podcastTitle}</p>
350 </div>
351 <div class="col-2">
352 <p class="text-right" style="font-weight: bold; font-size: 1.2em; padding-top:5px; margin-bottom: 0;"> ${icona}</p>
353 </div>
354 </div>
355 <div class="row rounded" style=" background: #eee; margin-right: 0;">
356 <div class="col-2 pl-3 p-0 align-self-center text-center">
357 <a title="${podcastTitle}" href="javascript:void(0);" onclick="javascript:openPlayer('${podcastTitle?js_string}','Andato in onda il ${textDate} ${podcastStart}', '${podcastDesc?js_string}', '${podcastTipologia}', '${link}');colorChange('play-icon-${count}');">
358 <i id="play-icon-${count}" class="play-icon far fa-play-circle" style="font-size: 2em;"></i>
359 </a>
360 </div>
361 <div class="col-10 pt-3 align-self-center">
362 <p>In onda il <strong>${textDate}</strong><br/>
363 ${podcastStart}</p>
364 </div>
365 </div>
366 </div>
367 </#if>
368
369 </#if>
370 </#list>
371 </div>
372 <#if count==0>
373 <div style="margin-bottom: 30px;">
374 <p>Non ci sono eventi</p>
375 </div>
376 </#if>
377 </section>
378<#else>
379 <div style="margin-bottom: 30px;">
380 <p>Non ci sono eventi</p>
381 </div>
382</#if>