From 1405e8821cbdf84b5e11f29f821a4ab1e1778234 Mon Sep 17 00:00:00 2001 From: DarthBrento Date: Mon, 1 Jun 2020 00:38:05 +0200 Subject: [PATCH] Update calendar.js --- modules/default/calendar/calendar.js | 180 +++++++++++++++------------ 1 file changed, 97 insertions(+), 83 deletions(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index f8099269..a84b98e3 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -1,18 +1,20 @@ -/* global cloneObject */ +/* global Module */ /* Magic Mirror * Module: Calendar * - * By Michael Teeuw https://michaelteeuw.nl + * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. */ + Module.register("calendar", { + // Define module defaults defaults: { maximumEntries: 10, // Total Maximum Entries maximumNumberOfDays: 365, displaySymbol: true, - defaultSymbol: "calendar", // Fontawesome Symbol see https://fontawesome.com/cheatsheet?from=io + defaultSymbol: "calendar", // Fontawesome Symbol see http://fontawesome.io/cheatsheet/ showLocation: false, displayRepeatingCountTitle: false, defaultRepeatingCountTitle: "", @@ -38,8 +40,8 @@ Module.register("calendar", { calendars: [ { symbol: "calendar", - url: "https://www.calendarlabs.com/templates/ical/US-Holidays.ics" - } + url: "http://www.calendarlabs.com/templates/ical/US-Holidays.ics", + }, ], titleReplace: { "De verjaardag van ": "", @@ -84,7 +86,7 @@ Module.register("calendar", { var calendarConfig = { maximumEntries: calendar.maximumEntries, maximumNumberOfDays: calendar.maximumNumberOfDays, - broadcastPastEvents: calendar.broadcastPastEvents + broadcastPastEvents: calendar.broadcastPastEvents, }; if (calendar.symbolClass === "undefined" || calendar.symbolClass === null) { calendarConfig.symbolClass = ""; @@ -97,7 +99,7 @@ Module.register("calendar", { } // 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("https://github.com/MichMich/MagicMirror/tree/v2.1.2/modules/default/calendar#calendar-authentication-options"); calendar.auth = { @@ -111,7 +113,7 @@ Module.register("calendar", { // Trigger ADD_CALENDAR every fetchInterval to make sure there is always a calendar // fetcher running on the server side. var self = this; - setInterval(function () { + setInterval(function() { self.addCalendar(calendar.url, calendar.auth, calendarConfig); }, self.config.fetchInterval); } @@ -122,6 +124,9 @@ Module.register("calendar", { // Override socket notification handler. socketNotificationReceived: function (notification, payload) { + if (this.identifier != payload.id) + {return;} + if (notification === "CALENDAR_EVENTS") { if (this.hasCalendarURL(payload.url)) { this.calendarData[payload.url] = payload.events; @@ -143,12 +148,13 @@ Module.register("calendar", { // Override dom generator. getDom: function () { + var events = this.createEventList(); var wrapper = document.createElement("table"); wrapper.className = this.config.tableClass; 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"; return wrapper; } @@ -167,8 +173,8 @@ Module.register("calendar", { for (var e in events) { var event = events[e]; var dateAsString = moment(event.startDate, "x").format(this.config.dateFormat); - if (this.config.timeFormat === "dateheaders") { - if (lastSeenDate !== dateAsString) { + if(this.config.timeFormat === "dateheaders"){ + if(lastSeenDate !== dateAsString){ var dateRow = document.createElement("tr"); dateRow.className = "normal"; var dateCell = document.createElement("td"); @@ -179,10 +185,9 @@ Module.register("calendar", { dateRow.appendChild(dateCell); wrapper.appendChild(dateRow); - if (e >= startFade) { - //fading + if (e >= startFade) { //fading currentFadeStep = e - startFade; - dateRow.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; + dateRow.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); } lastSeenDate = dateAsString; @@ -208,20 +213,20 @@ Module.register("calendar", { symbolWrapper.className = "symbol align-right " + symbolClass; var symbols = this.symbolsForUrl(event.url); - if (typeof symbols === "string") { + if(typeof symbols === "string") { symbols = [symbols]; } - for (var i = 0; i < symbols.length; i++) { + for(var i = 0; i < symbols.length; i++) { var symbol = document.createElement("span"); symbol.className = "fa fa-fw fa-" + symbols[i]; - if (i > 0) { + if(i > 0){ symbol.style.paddingLeft = "5px"; } symbolWrapper.appendChild(symbol); } eventWrapper.appendChild(symbolWrapper); - } else if (this.config.timeFormat === "dateheaders") { + } else if(this.config.timeFormat === "dateheaders"){ var blankCell = document.createElement("td"); blankCell.innerHTML = "   "; eventWrapper.appendChild(blankCell); @@ -231,6 +236,7 @@ Module.register("calendar", { repeatingCountTitle = ""; if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { + repeatingCountTitle = this.countTitleForUrl(event.url); if (repeatingCountTitle !== "") { @@ -251,15 +257,17 @@ Module.register("calendar", { titleWrapper.className = "title " + titleClass; } - var timeWrapper; + if(this.config.timeFormat === "dateheaders"){ - if (this.config.timeFormat === "dateheaders") { if (event.fullDayEvent) { titleWrapper.colSpan = "2"; titleWrapper.align = "left"; + } 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.style.paddingLeft = "2px"; timeWrapper.innerHTML = moment(event.startDate, "x").format("LT"); @@ -269,7 +277,7 @@ Module.register("calendar", { eventWrapper.appendChild(titleWrapper); } else { - timeWrapper = document.createElement("td"); + var timeWrapper = document.createElement("td"); eventWrapper.appendChild(titleWrapper); //console.log(event.today); @@ -294,14 +302,14 @@ Module.register("calendar", { } } else { /* Check to see if the user displays absolute or relative dates with their events - * Also check to see if an event is happening within an 'urgency' time frameElement - * For example, if the user set an .urgency of 7 days, those events that fall within that - * time frame will be displayed with 'in xxx' time format or moment.fromNow() - * - * Note: this needs to be put in its own function, as the whole thing repeats again verbatim - */ + * Also check to see if an event is happening within an 'urgency' time frameElement + * For example, if the user set an .urgency of 7 days, those events that fall within that + * time frame will be displayed with 'in xxx' time format or moment.fromNow() + * + * 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.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 timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD"))); } else { @@ -311,9 +319,9 @@ Module.register("calendar", { timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD"))); } } - if (this.config.showEnd) { - timeWrapper.innerHTML += "-"; - timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.fullDayEventDateFormat)); + if(this.config.showEnd){ + timeWrapper.innerHTML += "-" ; + timeWrapper.innerHTML += this.capFirst(moment(event.endDate , "x").format(this.config.fullDayEventDateFormat)); } } else { 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() timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); } 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)); } else { // Otherwise just say 'Today/Tomorrow at such-n-such time' @@ -332,14 +340,14 @@ Module.register("calendar", { } } else { /* Check to see if the user displays absolute or relative dates with their events - * Also check to see if an event is happening within an 'urgency' time frameElement - * For example, if the user set an .urgency of 7 days, those events that fall within that - * time frame will be displayed with 'in xxx' time format or moment.fromNow() - * - * Note: this needs to be put in its own function, as the whole thing repeats again verbatim - */ + * Also check to see if an event is happening within an 'urgency' time frameElement + * For example, if the user set an .urgency of 7 days, those events that fall within that + * time frame will be displayed with 'in xxx' time format or moment.fromNow() + * + * 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.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 timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); } else { @@ -360,11 +368,13 @@ Module.register("calendar", { if (this.config.showEnd) { timeWrapper.innerHTML += "-"; timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.dateEndFormat)); + } } //timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll'); //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); } @@ -373,7 +383,7 @@ Module.register("calendar", { // Create fade effect. if (e >= startFade) { currentFadeStep = e - startFade; - eventWrapper.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; + eventWrapper.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); } if (this.config.showLocation) { @@ -396,7 +406,7 @@ Module.register("calendar", { if (e >= startFade) { currentFadeStep = e - startFade; - locationRow.style.opacity = 1 - (1 / fadeSteps) * currentFadeStep; + locationRow.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); } } } @@ -413,17 +423,20 @@ Module.register("calendar", { * @param {number} timeFormat Specifies either 12 or 24 hour time format * @returns {moment.LocaleSpecification} */ - getLocaleSpecification: function (timeFormat) { + getLocaleSpecification: function(timeFormat) { switch (timeFormat) { - case 12: { - return { longDateFormat: { LT: "h:mm A" } }; - } - case 24: { - return { longDateFormat: { LT: "HH:mm" } }; - } - default: { - return { longDateFormat: { LT: moment.localeData().longDateFormat("LT") } }; - } + case 12: { + return { longDateFormat: {LT: "h:mm A"} }; + break; + } + case 24: { + return { longDateFormat: {LT: "HH:mm"} }; + break; + } + default: { + return { longDateFormat: {LT: moment.localeData().longDateFormat("LT")} }; + break; + } } }, @@ -459,37 +472,37 @@ Module.register("calendar", { var calendar = this.calendarData[c]; for (var e in calendar) { var event = JSON.parse(JSON.stringify(calendar[e])); // clone object - if (event.endDate < now) { + if(event.endDate < now) { continue; } - if (this.config.hidePrivate) { - if (event.class === "PRIVATE") { - // do not add the current event, skip it + if(this.config.hidePrivate) { + if(event.class === "PRIVATE") { + // do not add the current event, skip it + continue; + } + } + if(this.config.hideOngoing) { + if(event.startDate < now) { continue; } } - if (this.config.hideOngoing) { - if (event.startDate < now) { - continue; - } - } - if (this.listContainsEvent(events, event)) { + if(this.listContainsEvent(events,event)){ continue; } 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, - * 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; + * 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; if (this.config.sliceMultiDayEvents && maxCount > 1) { var splitEvents = []; var midnight = moment(event.startDate, "x").clone().startOf("day").add(1, "day").format("x"); var count = 1; while (event.endDate > midnight) { 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.title += " (" + count + "/" + maxCount + ")"; splitEvents.push(thisEvent); @@ -499,11 +512,11 @@ Module.register("calendar", { midnight = moment(midnight, "x").add(1, "day").format("x"); // next day } // Last day - event.title += " (" + count + "/" + maxCount + ")"; + event.title += " ("+count+"/"+maxCount+")"; splitEvents.push(event); for (event of splitEvents) { - if (event.endDate > now && event.endDate <= future) { + if ((event.endDate > now) && (event.endDate <= future)) { events.push(event); } } @@ -519,9 +532,9 @@ Module.register("calendar", { return events.slice(0, this.config.maximumEntries); }, - listContainsEvent: function (eventList, event) { - for (var evt of eventList) { - if (evt.title === event.title && parseInt(evt.startDate) === parseInt(event.startDate)) { + listContainsEvent: function(eventList, event){ + for(var evt of eventList){ + if(evt.title === event.title && parseInt(evt.startDate) === parseInt(event.startDate)){ return true; } } @@ -544,7 +557,8 @@ Module.register("calendar", { titleClass: calendarConfig.titleClass, timeClass: calendarConfig.timeClass, 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++) { var word = words[i]; - if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { - // max - 1 to account for a space - currentLine += word + " "; + if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { // max - 1 to account for a space + currentLine += (word + " "); } else { line++; if (line > maxTitleLines - 1) { @@ -684,9 +697,9 @@ Module.register("calendar", { } if (currentLine.length > 0) { - temp += currentLine + "
" + word + " "; + temp += (currentLine + "
" + word + " "); } else { - temp += word + "
"; + temp += (word + "
"); } currentLine = ""; } @@ -725,8 +738,8 @@ Module.register("calendar", { var regParts = needle.match(/^\/(.+)\/([gim]*)$/); if (regParts) { - // the parsed pattern is a regexp. - needle = new RegExp(regParts[1], regParts[2]); + // the parsed pattern is a regexp. + needle = new RegExp(regParts[1], regParts[2]); } title = title.replace(needle, replacement); @@ -754,10 +767,11 @@ Module.register("calendar", { } } - eventList.sort(function (a, b) { + eventList.sort(function(a,b) { return a.startDate - b.startDate; }); this.sendNotification("CALENDAR_EVENTS", eventList); + } });