const MONTHNAME = [ "gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"]; function fetch_calendar() { const class_prefix = 'zerocalcare-' let ul = document.getElementById(class_prefix+"latest-events"); fetch("https://golem.linux.it/cgi/zerocalcare-test/main.py?interval=4weeks") .then(response => response.json()) .then(json => { for (let i = 0; i < Math.min(3, json.length) ; ++i) { // Do not display private events if (typeof json[i]['CLASS'] === 'string' && json[i]['CLASS'] == 'PRIVATE') { continue; } // Future improvements needed for a better backend output date in ISO format // Now we have to parse the string :( very very ugly let date = new Date(json[i]['DATETIME']); let m = new moment(date); m.locale('it'); let eventElement = document.createElement('li'); let titleElement = document.createElement('div'); titleElement.appendChild(document.createTextNode(decodeURI(json[i]['SUMMARY']))); titleElement.classList.add(class_prefix+'title'); eventElement.appendChild(titleElement); let contentEventElement = document.createElement('div'); contentEventElement.classList.add(class_prefix+'details') eventElement.appendChild(contentEventElement); // Check if event is not confirmed if (typeof json[i]['STATUS'] === 'string') { if (json[i]['STATUS'] == 'TENTATIVE') { // Make the text a bit lighter and italic contentEventElement.style.fontStyle = 'italic'; contentEventElement.style.color = 'gray'; // Add note let unconfirmedElement = document.createElement('div'); unconfirmedElement.style.fontWeight = 'bold'; unconfirmedElement.appendChild(document.createTextNode('⚠️ Non confermato!')); contentEventElement.appendChild(unconfirmedElement); } else if (json[i]['STATUS'] == 'CANCELLED') { // Strike time, date and location to remark this concept dateText.style.textDecoration = 'line-through'; timeText.style.textDecoration = 'line-through'; locationText.style.textDecoration = 'line-through'; // Add note let unconfirmedElement = document.createElement('div'); unconfirmedElement.style.fontWeight = 'bold'; unconfirmedElement.appendChild(document.createTextNode('⚠️ Cancellato!')); contentEventElement.appendChild(unconfirmedElement); } } let dateElement = document.createElement('div'); let dateText = document.createElement('time'); dateText.appendChild(document.createTextNode(m.format('dddd D MMMM YYYY'))); dateElement.appendChild(document.createTextNode('📅 ')); dateElement.appendChild(dateText); contentEventElement.appendChild(dateElement); let timeElement = document.createElement('div'); let timeText = document.createElement('time'); let timeString = (json[i]['ALLDAY'] == true) ? 'Tutto il giorno' : ('ore ' + m.format('HH:mm')); timeText.appendChild(document.createTextNode(timeString)); timeElement.appendChild(document.createTextNode('⏰ ')); timeElement.appendChild(timeText); contentEventElement.appendChild(timeElement); // add if location is not empty -- default location should be selected by backend let locationElement = document.createElement('div'); let locationText = document.createElement('span'); if (json[i]['LOCATION'] !== undefined && json[i]['LOCATION'] != '') { let text = decodeURI(json[i]['LOCATION']); let textNode = document.createTextNode(text); if (text.match("^(http|https):\\/\\/.*$")) { let anchorElement = document.createElement('a'); anchorElement.href = text; anchorElement.appendChild(textNode); locationText.appendChild(anchorElement); } else { locationText.appendChild(textNode); } } else { locationText.appendChild(document.createTextNode('Officina Informatica')); } locationElement.appendChild(document.createTextNode('📍 ')); locationElement.appendChild(locationText); contentEventElement.appendChild(locationElement); if (json[i]['DESCRIPTION'] !== undefined && json[i]['DESCRIPTION'] != '') { let descriptionElement = document.createElement('div'); let descriptionText = document.createElement('span'); descriptionText.appendChild(document.createTextNode(decodeURI(json[i]['DESCRIPTION']))); descriptionElement.appendChild(document.createTextNode('📝 ')); descriptionElement.appendChild(descriptionText); descriptionElement.style.display = "none"; // Display a clickable "..." button. let moreElement = document.createElement('div'); let moreShowText = document.createElement('a'); let moreHideText = document.createElement('a'); moreShowText.appendChild(document.createTextNode('⬇️ Più informazioni...')); moreElement.appendChild(moreShowText); moreHideText.appendChild(document.createTextNode('⬆️ Nascondi informazioni...')); moreHideText.style.display = "none"; moreElement.appendChild(moreHideText); moreElement.onclick = () => { if (descriptionElement.style.display == "none") { descriptionElement.style.display = moreHideText.style.display = "block"; moreShowText.style.display = "none"; } else { descriptionElement.style.display = moreHideText.style.display = "none"; moreShowText.style.display = "block"; } }; contentEventElement.appendChild(moreElement); contentEventElement.appendChild(descriptionElement); } ul.appendChild(eventElement); atLeastOne = true; } if (atLeastOne == false) { let warn = document.createElement('span'); warn.textContent = 'Nessun appuntamento in programma'; ul.appendChild(warn); } }) .catch(err => { let warn = document.createElement('span'); warn.textContent = 'Errore nella connessione alle API zerocalcare.'; console.log(class_prefix+"error: "+err); ul.appendChild(warn); });; } function counters() { fetch_calendar(); fetch("https://golem.linux.it/wp/wp-json/wp/v2/posts") .then(response => response.json()) .then(json => { let ul = document.getElementById("wp-latest-posts"); for (let i = 0; i < 3; ++i) { let post = json[i]; let li = document.createElement("li"); let a = document.createElement("a"); a.href = post.link; a.appendChild(document.createTextNode(post.title.rendered)); li.appendChild(a); li.appendChild(document.createElement("br")); let datespan = document.createElement("span"); datespan.style.fontSize = "smaller"; let dateobj = new Date(post.date); datespan.appendChild(document.createTextNode(dateobj.getDate() + " " + MONTHNAME[dateobj.getMonth()] + " " + dateobj.getFullYear())); li.appendChild(datespan); ul.appendChild(li); } }) .catch(err => console.error(err)); fetch("https://golem.linux.it/wiki/api.php?action=query&list=recentchanges&rcprop=title&rclimit=50&format=json&origin=*") .then(response => response.json()) .then(json => { let recentchanges = json.query.recentchanges; let rcs = new Set(); for (let i = 0; i < recentchanges.length; ++i) { rcs.add(recentchanges[i].title); } let rca = Array.from(rcs); let ul = document.getElementById("mw-recent-changes"); for (let i = 0; i < rca.length; ++i) { let title = rca[i]; let li = document.createElement("li"); let a = document.createElement("a"); a.href = "https://golem.linux.it/wiki/" + title; a.appendChild(document.createTextNode(title)); li.appendChild(a); ul.appendChild(li); if (i >= 4) break; } }) .catch(function(error){console.log(error);}); fetch("https://golem.linux.it/wp/wp-json/wp/v2/posts") .then(response => { let articles = response.headers.get("X-WP-Total"); let p = document.getElementById("wordpress-articles"); p.appendChild(document.createTextNode(articles + " articoli")); }) .catch(err => console.error(err)); fetch("https://golem.linux.it/wiki/api.php?action=query&meta=siteinfo&siprop=statistics&format=json&origin=*") .then(response => response.json()) .then(json => { let pages = json.query.statistics.articles; let p = document.getElementById("mediawiki-pages"); p.appendChild(document.createTextNode(pages + " pagine")); }) .catch(err => console.error(err)); fetch("https://git.golem.linux.it/api/v1/repos/search") .then(response => response.json()) .then(response => { let repos = response.data.length; let p = document.getElementById("gitea-repos"); p.appendChild(document.createTextNode(repos + " repository")); }) .catch(err => console.error(err)); }