diff --git a/CHANGELOG.md b/CHANGELOG.md index 218de23b..71c1282c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ _This release is scheduled to be released on 2021-01-01._ - Fix calendar when no DTEND record found in event, startDate overlay when endDate set (#2177) - Fix console.debug not having timestamps (#2199) - Fix calendar full day event east of UTC start time (#2200) +- Fix non-fullday recurring rule processing (#2216) - Catch errors when parsing calendar data with ical (#2022) - Corrected logic for timeFormat "relative" and "absolute" diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index c5c8901d..6c268c46 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -86,6 +86,8 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn return; } + Log.debug(" parsed data=" + JSON.stringify(data)); + const newEvents = []; // limitFunction doesn't do much limiting, see comment re: the dates array in rrule section below as to why we need to do the filtering ourselves @@ -96,13 +98,13 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn const eventDate = function (event, time) { return isFullDayEvent(event) ? moment(event[time], "YYYYMMDD") : moment(new Date(event[time])); }; - + Log.debug("there are " + Object.entries(data).length + " calendar entries"); Object.entries(data).forEach(([key, event]) => { const now = new Date(); const today = moment().startOf("day").toDate(); const future = moment().startOf("day").add(maximumNumberOfDays, "days").subtract(1, "seconds").toDate(); // Subtract 1 second so that events that start on the middle of the night will not repeat. let past = today; - + Log.debug("have entries "); if (includePastEvents) { past = moment().startOf("day").subtract(maximumNumberOfDays, "days").toDate(); } @@ -119,7 +121,8 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn if (event.type === "VEVENT") { let startDate = eventDate(event, "start"); let endDate; - // Log.debug("\nevent="+JSON.stringify(event)) + + Log.debug("\nevent=" + JSON.stringify(event)); if (typeof event.end !== "undefined") { endDate = eventDate(event, "end"); } else if (typeof event.duration !== "undefined") { @@ -221,8 +224,15 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn pastLocal = pastMoment.toDate(); futureLocal = futureMoment.toDate(); } else { - pastLocal = pastMoment.subtract(past.getTimezoneOffset(), "minutes").toDate(); - futureLocal = futureMoment.subtract(future.getTimezoneOffset(), "minutes").toDate(); + // if we want past events + if (includePastEvents) { + // use the calculated past time for the between from + pastLocal = pastMoment.toDate(); + } else { + // otherwise use NOW.. cause we shouldnt use any before now + pastLocal = moment().toDate(); //now + } + futureLocal = futureMoment.toDate(); // future } Log.debug(" between=" + pastLocal + " to " + futureLocal); const dates = rule.between(pastLocal, futureLocal, true, limitFunction); @@ -308,6 +318,7 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn } if (showRecurrence === true) { + Log.debug("saving event =" + description); addedEvents++; newEvents.push({ title: recurrenceTitle, @@ -361,7 +372,6 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn } // if the start and end are the same, then make end the 'end of day' value (start is at 00:00:00) if (fullDayEvent && startDate.format("x") === endDate.format("x")) { - //Log.debug("end same as start") endDate = endDate.endOf("day"); } // get correction for date saving and dst change between now and then