@@ -59,6 +59,16 @@ Per proporre un talk o un laboratorio, visita la nostra Call for Papers (CFP) su
5959 <div class="room">Sala: ${ roomName} </div>
6060 <div class="persons">Relatori: ${ persons} </div>
6161 <a class="link" href="${ url} " target="_blank">Dettagli</a>
62+ <a class="ical-link" href="#" onclick="downloadICS(event, {
63+ title: \` ${ title .replace (/ `/ g , " \\ `" )} \` ,
64+ date: \` ${ date} \` ,
65+ start: \` ${ start} \` ,
66+ duration: \` ${ duration} \` ,
67+ room: \` ${ roomName .replace (/ `/ g , " \\ `" )} \` ,
68+ persons: \` ${ persons .replace (/ `/ g , " \\ `" )} \` ,
69+ url: \` ${ url} \` ,
70+ description: \` ${ abstract .replace (/ `/ g , " \\ `" )} \`
71+ })">Scarica iCal</a>
6272 </div>
6373 ` ;
6474 if (track === ' Talk' ) tracks[' Talk' ].push (eventHtml);
@@ -76,6 +86,41 @@ Per proporre un talk o un laboratorio, visita la nostra Call for Papers (CFP) su
7686 .catch (() => {
7787 document .getElementById (' schedule' ).innerHTML = ' <p>Impossibile caricare il programma.</p>' ;
7888 });
89+
90+ function downloadICS (e , data ) {
91+ e .preventDefault ();
92+ // Calcola orario di fine
93+ function addDuration (start , duration ) {
94+ const [h , m ] = duration .split (' :' ).map (Number );
95+ const date = new Date (` ${ data .date } T${ data .start } ` );
96+ date .setHours (date .getHours () + h);
97+ date .setMinutes (date .getMinutes () + m);
98+ return date .toISOString ().replace (/ [-:] / g , ' ' ).slice (0 ,15 ) + ' Z' ;
99+ }
100+ const dtStart = ` ${ data .date .replace (/ -/ g , ' ' )} T${ data .start .replace (/ :/ g , ' ' )} 00Z` ;
101+ const dtEnd = addDuration (data .start , data .duration );
102+ const icsContent = [
103+ ' BEGIN:VCALENDAR' ,
104+ ' VERSION:2.0' ,
105+ ' PRODID:-//endsummercamp//ESC21//IT' ,
106+ ' BEGIN:VEVENT' ,
107+ ` SUMMARY:${ data .title } ` ,
108+ ` DESCRIPTION:${ data .description } \\ nRelatori: ${ data .persons } \\ nDettagli: ${ data .url } ` ,
109+ ` LOCATION:${ data .room } ` ,
110+ ` DTSTART:${ dtStart} ` ,
111+ ` DTEND:${ dtEnd} ` ,
112+ ` URL:${ data .url } ` ,
113+ ' END:VEVENT' ,
114+ ' END:VCALENDAR'
115+ ].join (' \r\n ' );
116+ const blob = new Blob ([icsContent], { type: ' text/calendar' });
117+ const link = document .createElement (' a' );
118+ link .href = URL .createObjectURL (blob);
119+ link .download = ` ${ data .title .replace (/ [^ a-z0-9 ] / gi , ' _' ).toLowerCase ()} .ics` ;
120+ document .body .appendChild (link);
121+ link .click ();
122+ document .body .removeChild (link);
123+ }
79124< / script>
80125< noscript>
81126 < p> Per visualizzare il programma, abilita JavaScript nel tuo browser o vai < a href= " https://pretalx.endsummer.camp/2K25/schedule/nojs" > sul calendario di Pretalx< / a> .< / p>
0 commit comments