Update calendar.js

This commit is contained in:
DarthBrento 2020-06-01 00:38:05 +02:00 committed by GitHub
parent 37e31bac5b
commit 1405e8821c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,18 +1,20 @@
/* global cloneObject */ /* global Module */
/* Magic Mirror /* Magic Mirror
* Module: Calendar * Module: Calendar
* *
* By Michael Teeuw https://michaelteeuw.nl * By Michael Teeuw http://michaelteeuw.nl
* MIT Licensed. * MIT Licensed.
*/ */
Module.register("calendar", { Module.register("calendar", {
// Define module defaults // Define module defaults
defaults: { defaults: {
maximumEntries: 10, // Total Maximum Entries maximumEntries: 10, // Total Maximum Entries
maximumNumberOfDays: 365, maximumNumberOfDays: 365,
displaySymbol: true, displaySymbol: true,
defaultSymbol: "calendar", // Fontawesome Symbol see https://fontawesome.com/cheatsheet?from=io defaultSymbol: "calendar", // Fontawesome Symbol see http://fontawesome.io/cheatsheet/
showLocation: false, showLocation: false,
displayRepeatingCountTitle: false, displayRepeatingCountTitle: false,
defaultRepeatingCountTitle: "", defaultRepeatingCountTitle: "",
@ -38,8 +40,8 @@ Module.register("calendar", {
calendars: [ calendars: [
{ {
symbol: "calendar", symbol: "calendar",
url: "https://www.calendarlabs.com/templates/ical/US-Holidays.ics" url: "http://www.calendarlabs.com/templates/ical/US-Holidays.ics",
} },
], ],
titleReplace: { titleReplace: {
"De verjaardag van ": "", "De verjaardag van ": "",
@ -84,7 +86,7 @@ Module.register("calendar", {
var calendarConfig = { var calendarConfig = {
maximumEntries: calendar.maximumEntries, maximumEntries: calendar.maximumEntries,
maximumNumberOfDays: calendar.maximumNumberOfDays, maximumNumberOfDays: calendar.maximumNumberOfDays,
broadcastPastEvents: calendar.broadcastPastEvents broadcastPastEvents: calendar.broadcastPastEvents,
}; };
if (calendar.symbolClass === "undefined" || calendar.symbolClass === null) { if (calendar.symbolClass === "undefined" || calendar.symbolClass === null) {
calendarConfig.symbolClass = ""; calendarConfig.symbolClass = "";
@ -97,7 +99,7 @@ Module.register("calendar", {
} }
// we check user and password here for backwards compatibility with old configs // we check user and password here for backwards compatibility with old configs
if (calendar.user && calendar.pass) { if(calendar.user && calendar.pass) {
Log.warn("Deprecation warning: Please update your calendar authentication configuration."); Log.warn("Deprecation warning: Please update your calendar authentication configuration.");
Log.warn("https://github.com/MichMich/MagicMirror/tree/v2.1.2/modules/default/calendar#calendar-authentication-options"); Log.warn("https://github.com/MichMich/MagicMirror/tree/v2.1.2/modules/default/calendar#calendar-authentication-options");
calendar.auth = { calendar.auth = {
@ -111,7 +113,7 @@ Module.register("calendar", {
// Trigger ADD_CALENDAR every fetchInterval to make sure there is always a calendar // Trigger ADD_CALENDAR every fetchInterval to make sure there is always a calendar
// fetcher running on the server side. // fetcher running on the server side.
var self = this; var self = this;
setInterval(function () { setInterval(function() {
self.addCalendar(calendar.url, calendar.auth, calendarConfig); self.addCalendar(calendar.url, calendar.auth, calendarConfig);
}, self.config.fetchInterval); }, self.config.fetchInterval);
} }
@ -122,6 +124,9 @@ Module.register("calendar", {
// Override socket notification handler. // Override socket notification handler.
socketNotificationReceived: function (notification, payload) { socketNotificationReceived: function (notification, payload) {
if (this.identifier != payload.id)
{return;}
if (notification === "CALENDAR_EVENTS") { if (notification === "CALENDAR_EVENTS") {
if (this.hasCalendarURL(payload.url)) { if (this.hasCalendarURL(payload.url)) {
this.calendarData[payload.url] = payload.events; this.calendarData[payload.url] = payload.events;
@ -143,12 +148,13 @@ Module.register("calendar", {
// Override dom generator. // Override dom generator.
getDom: function () { getDom: function () {
var events = this.createEventList(); var events = this.createEventList();
var wrapper = document.createElement("table"); var wrapper = document.createElement("table");
wrapper.className = this.config.tableClass; wrapper.className = this.config.tableClass;
if (events.length === 0) { if (events.length === 0) {
wrapper.innerHTML = this.loaded ? this.translate("EMPTY") : this.translate("LOADING"); wrapper.innerHTML = (this.loaded) ? this.translate("EMPTY") : this.translate("LOADING");
wrapper.className = this.config.tableClass + " dimmed"; wrapper.className = this.config.tableClass + " dimmed";
return wrapper; return wrapper;
} }
@ -167,8 +173,8 @@ Module.register("calendar", {
for (var e in events) { for (var e in events) {
var event = events[e]; var event = events[e];
var dateAsString = moment(event.startDate, "x").format(this.config.dateFormat); var dateAsString = moment(event.startDate, "x").format(this.config.dateFormat);
if (this.config.timeFormat === "dateheaders") { if(this.config.timeFormat === "dateheaders"){
if (lastSeenDate !== dateAsString) { if(lastSeenDate !== dateAsString){
var dateRow = document.createElement("tr"); var dateRow = document.createElement("tr");
dateRow.className = "normal"; dateRow.className = "normal";
var dateCell = document.createElement("td"); var dateCell = document.createElement("td");
@ -179,10 +185,9 @@ Module.register("calendar", {
dateRow.appendChild(dateCell); dateRow.appendChild(dateCell);
wrapper.appendChild(dateRow); wrapper.appendChild(dateRow);
if (e >= startFade) { if (e >= startFade) { //fading
//fading
currentFadeStep = e - startFade; currentFadeStep = e - startFade;
dateRow.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; dateRow.style.opacity = 1 - (1 / fadeSteps * currentFadeStep);
} }
lastSeenDate = dateAsString; lastSeenDate = dateAsString;
@ -208,20 +213,20 @@ Module.register("calendar", {
symbolWrapper.className = "symbol align-right " + symbolClass; symbolWrapper.className = "symbol align-right " + symbolClass;
var symbols = this.symbolsForUrl(event.url); var symbols = this.symbolsForUrl(event.url);
if (typeof symbols === "string") { if(typeof symbols === "string") {
symbols = [symbols]; symbols = [symbols];
} }
for (var i = 0; i < symbols.length; i++) { for(var i = 0; i < symbols.length; i++) {
var symbol = document.createElement("span"); var symbol = document.createElement("span");
symbol.className = "fa fa-fw fa-" + symbols[i]; symbol.className = "fa fa-fw fa-" + symbols[i];
if (i > 0) { if(i > 0){
symbol.style.paddingLeft = "5px"; symbol.style.paddingLeft = "5px";
} }
symbolWrapper.appendChild(symbol); symbolWrapper.appendChild(symbol);
} }
eventWrapper.appendChild(symbolWrapper); eventWrapper.appendChild(symbolWrapper);
} else if (this.config.timeFormat === "dateheaders") { } else if(this.config.timeFormat === "dateheaders"){
var blankCell = document.createElement("td"); var blankCell = document.createElement("td");
blankCell.innerHTML = "&nbsp;&nbsp;&nbsp;"; blankCell.innerHTML = "&nbsp;&nbsp;&nbsp;";
eventWrapper.appendChild(blankCell); eventWrapper.appendChild(blankCell);
@ -231,6 +236,7 @@ Module.register("calendar", {
repeatingCountTitle = ""; repeatingCountTitle = "";
if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) {
repeatingCountTitle = this.countTitleForUrl(event.url); repeatingCountTitle = this.countTitleForUrl(event.url);
if (repeatingCountTitle !== "") { if (repeatingCountTitle !== "") {
@ -251,15 +257,17 @@ Module.register("calendar", {
titleWrapper.className = "title " + titleClass; titleWrapper.className = "title " + titleClass;
} }
var timeWrapper; if(this.config.timeFormat === "dateheaders"){
if (this.config.timeFormat === "dateheaders") {
if (event.fullDayEvent) { if (event.fullDayEvent) {
titleWrapper.colSpan = "2"; titleWrapper.colSpan = "2";
titleWrapper.align = "left"; titleWrapper.align = "left";
} else { } else {
timeWrapper = document.createElement("td");
timeWrapper.className = "time light " + this.timeClassForUrl(event.url); var timeClass = this.timeClassForUrl(event.url);
var timeWrapper = document.createElement("td");
timeWrapper.className = "time light " + timeClass;
timeWrapper.align = "left"; timeWrapper.align = "left";
timeWrapper.style.paddingLeft = "2px"; timeWrapper.style.paddingLeft = "2px";
timeWrapper.innerHTML = moment(event.startDate, "x").format("LT"); timeWrapper.innerHTML = moment(event.startDate, "x").format("LT");
@ -269,7 +277,7 @@ Module.register("calendar", {
eventWrapper.appendChild(titleWrapper); eventWrapper.appendChild(titleWrapper);
} else { } else {
timeWrapper = document.createElement("td"); var timeWrapper = document.createElement("td");
eventWrapper.appendChild(titleWrapper); eventWrapper.appendChild(titleWrapper);
//console.log(event.today); //console.log(event.today);
@ -301,7 +309,7 @@ Module.register("calendar", {
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim * Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/ */
if (this.config.timeFormat === "absolute") { if (this.config.timeFormat === "absolute") {
if (this.config.urgency > 1 && event.startDate - now < this.config.urgency * oneDay) { if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set // This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD"))); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD")));
} else { } else {
@ -311,9 +319,9 @@ Module.register("calendar", {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD"))); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD")));
} }
} }
if (this.config.showEnd) { if(this.config.showEnd){
timeWrapper.innerHTML += "-"; timeWrapper.innerHTML += "-" ;
timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.fullDayEventDateFormat)); timeWrapper.innerHTML += this.capFirst(moment(event.endDate , "x").format(this.config.fullDayEventDateFormat));
} }
} else { } else {
if (event.startDate >= new Date()) { if (event.startDate >= new Date()) {
@ -323,7 +331,7 @@ Module.register("calendar", {
// If event is within 6 hour, display 'in xxx' time format or moment.fromNow() // If event is within 6 hour, display 'in xxx' time format or moment.fromNow()
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else { } else {
if (this.config.timeFormat === "absolute" && !this.config.nextDaysRelative) { if(this.config.timeFormat === "absolute" && !this.config.nextDaysRelative) {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat)); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
} else { } else {
// Otherwise just say 'Today/Tomorrow at such-n-such time' // Otherwise just say 'Today/Tomorrow at such-n-such time'
@ -339,7 +347,7 @@ Module.register("calendar", {
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim * Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/ */
if (this.config.timeFormat === "absolute") { if (this.config.timeFormat === "absolute") {
if (this.config.urgency > 1 && event.startDate - now < this.config.urgency * oneDay) { if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set // This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else { } else {
@ -360,11 +368,13 @@ Module.register("calendar", {
if (this.config.showEnd) { if (this.config.showEnd) {
timeWrapper.innerHTML += "-"; timeWrapper.innerHTML += "-";
timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.dateEndFormat)); timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.dateEndFormat));
} }
} }
//timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll'); //timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
//console.log(event); //console.log(event);
timeWrapper.className = "time light " + this.timeClassForUrl(event.url); var timeClass = this.timeClassForUrl(event.url);
timeWrapper.className = "time light " + timeClass;
eventWrapper.appendChild(timeWrapper); eventWrapper.appendChild(timeWrapper);
} }
@ -373,7 +383,7 @@ Module.register("calendar", {
// Create fade effect. // Create fade effect.
if (e >= startFade) { if (e >= startFade) {
currentFadeStep = e - startFade; currentFadeStep = e - startFade;
eventWrapper.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; eventWrapper.style.opacity = 1 - (1 / fadeSteps * currentFadeStep);
} }
if (this.config.showLocation) { if (this.config.showLocation) {
@ -396,7 +406,7 @@ Module.register("calendar", {
if (e >= startFade) { if (e >= startFade) {
currentFadeStep = e - startFade; currentFadeStep = e - startFade;
locationRow.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; locationRow.style.opacity = 1 - (1 / fadeSteps * currentFadeStep);
} }
} }
} }
@ -413,16 +423,19 @@ Module.register("calendar", {
* @param {number} timeFormat Specifies either 12 or 24 hour time format * @param {number} timeFormat Specifies either 12 or 24 hour time format
* @returns {moment.LocaleSpecification} * @returns {moment.LocaleSpecification}
*/ */
getLocaleSpecification: function (timeFormat) { getLocaleSpecification: function(timeFormat) {
switch (timeFormat) { switch (timeFormat) {
case 12: { case 12: {
return { longDateFormat: { LT: "h:mm A" } }; return { longDateFormat: {LT: "h:mm A"} };
break;
} }
case 24: { case 24: {
return { longDateFormat: { LT: "HH:mm" } }; return { longDateFormat: {LT: "HH:mm"} };
break;
} }
default: { default: {
return { longDateFormat: { LT: moment.localeData().longDateFormat("LT") } }; return { longDateFormat: {LT: moment.localeData().longDateFormat("LT")} };
break;
} }
} }
}, },
@ -459,37 +472,37 @@ Module.register("calendar", {
var calendar = this.calendarData[c]; var calendar = this.calendarData[c];
for (var e in calendar) { for (var e in calendar) {
var event = JSON.parse(JSON.stringify(calendar[e])); // clone object var event = JSON.parse(JSON.stringify(calendar[e])); // clone object
if (event.endDate < now) { if(event.endDate < now) {
continue; continue;
} }
if (this.config.hidePrivate) { if(this.config.hidePrivate) {
if (event.class === "PRIVATE") { if(event.class === "PRIVATE") {
// do not add the current event, skip it // do not add the current event, skip it
continue; continue;
} }
} }
if (this.config.hideOngoing) { if(this.config.hideOngoing) {
if (event.startDate < now) { if(event.startDate < now) {
continue; continue;
} }
} }
if (this.listContainsEvent(events, event)) { if(this.listContainsEvent(events,event)){
continue; continue;
} }
event.url = c; event.url = c;
event.today = event.startDate >= today && event.startDate < today + 24 * 60 * 60 * 1000; event.today = event.startDate >= today && event.startDate < (today + 24 * 60 * 60 * 1000);
/* if sliceMultiDayEvents is set to true, multiday events (events exceeding at least one midnight) are sliced into days, /* if sliceMultiDayEvents is set to true, multiday events (events exceeding at least one midnight) are sliced into days,
* otherwise, esp. in dateheaders mode it is not clear how long these events are. * otherwise, esp. in dateheaders mode it is not clear how long these events are.
*/ */
var maxCount = Math.ceil((event.endDate - 1 - moment(event.startDate, "x").endOf("day").format("x")) / (1000 * 60 * 60 * 24)) + 1; var maxCount = Math.ceil(((event.endDate - 1) - moment(event.startDate, "x").endOf("day").format("x"))/(1000*60*60*24)) + 1;
if (this.config.sliceMultiDayEvents && maxCount > 1) { if (this.config.sliceMultiDayEvents && maxCount > 1) {
var splitEvents = []; var splitEvents = [];
var midnight = moment(event.startDate, "x").clone().startOf("day").add(1, "day").format("x"); var midnight = moment(event.startDate, "x").clone().startOf("day").add(1, "day").format("x");
var count = 1; var count = 1;
while (event.endDate > midnight) { while (event.endDate > midnight) {
var thisEvent = JSON.parse(JSON.stringify(event)); // clone object var thisEvent = JSON.parse(JSON.stringify(event)); // clone object
thisEvent.today = thisEvent.startDate >= today && thisEvent.startDate < today + 24 * 60 * 60 * 1000; thisEvent.today = thisEvent.startDate >= today && thisEvent.startDate < (today + 24 * 60 * 60 * 1000);
thisEvent.endDate = midnight; thisEvent.endDate = midnight;
thisEvent.title += " (" + count + "/" + maxCount + ")"; thisEvent.title += " (" + count + "/" + maxCount + ")";
splitEvents.push(thisEvent); splitEvents.push(thisEvent);
@ -499,11 +512,11 @@ Module.register("calendar", {
midnight = moment(midnight, "x").add(1, "day").format("x"); // next day midnight = moment(midnight, "x").add(1, "day").format("x"); // next day
} }
// Last day // Last day
event.title += " (" + count + "/" + maxCount + ")"; event.title += " ("+count+"/"+maxCount+")";
splitEvents.push(event); splitEvents.push(event);
for (event of splitEvents) { for (event of splitEvents) {
if (event.endDate > now && event.endDate <= future) { if ((event.endDate > now) && (event.endDate <= future)) {
events.push(event); events.push(event);
} }
} }
@ -519,9 +532,9 @@ Module.register("calendar", {
return events.slice(0, this.config.maximumEntries); return events.slice(0, this.config.maximumEntries);
}, },
listContainsEvent: function (eventList, event) { listContainsEvent: function(eventList, event){
for (var evt of eventList) { for(var evt of eventList){
if (evt.title === event.title && parseInt(evt.startDate) === parseInt(event.startDate)) { if(evt.title === event.title && parseInt(evt.startDate) === parseInt(event.startDate)){
return true; return true;
} }
} }
@ -544,7 +557,8 @@ Module.register("calendar", {
titleClass: calendarConfig.titleClass, titleClass: calendarConfig.titleClass,
timeClass: calendarConfig.timeClass, timeClass: calendarConfig.timeClass,
auth: auth, auth: auth,
broadcastPastEvents: calendarConfig.broadcastPastEvents || this.config.broadcastPastEvents broadcastPastEvents: calendarConfig.broadcastPastEvents || this.config.broadcastPastEvents,
id: this.identifier,
}); });
}, },
@ -671,9 +685,8 @@ Module.register("calendar", {
for (var i = 0; i < words.length; i++) { for (var i = 0; i < words.length; i++) {
var word = words[i]; var word = words[i];
if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { // max - 1 to account for a space
// max - 1 to account for a space currentLine += (word + " ");
currentLine += word + " ";
} else { } else {
line++; line++;
if (line > maxTitleLines - 1) { if (line > maxTitleLines - 1) {
@ -684,9 +697,9 @@ Module.register("calendar", {
} }
if (currentLine.length > 0) { if (currentLine.length > 0) {
temp += currentLine + "<br>" + word + " "; temp += (currentLine + "<br>" + word + " ");
} else { } else {
temp += word + "<br>"; temp += (word + "<br>");
} }
currentLine = ""; currentLine = "";
} }
@ -754,10 +767,11 @@ Module.register("calendar", {
} }
} }
eventList.sort(function (a, b) { eventList.sort(function(a,b) {
return a.startDate - b.startDate; return a.startDate - b.startDate;
}); });
this.sendNotification("CALENDAR_EVENTS", eventList); this.sendNotification("CALENDAR_EVENTS", eventList);
} }
}); });