From b3ef4b40c55de17782ba44b0729b37e5fc710151 Mon Sep 17 00:00:00 2001 From: Sam Detweiler Date: Sat, 25 Dec 2021 02:10:48 +1100 Subject: [PATCH] fix calendar across timezone, showEnd/FullDay --- CHANGELOG.md | 38 +++++++++++++++++++ modules/default/calendar/calendarutils.js | 46 +++++++++++------------ 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a1639db..5ab200cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,49 @@ This project adheres to [Semantic Versioning](https://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² +## [2.18.0] - Unreleased (Develop Branch) + +_This release is scheduled to be released on 2022-01-01._ + +### Added + +### Updated + +- ESLint version supports now ECMAScript 2018 +- Cleaned up `updatenotification` module and switched to nunjuck template. +- Moved calendar tests from category `electron` to `e2e`. +- Update missed translations for Korean language (ko.json) +- Update missed translations for Dutch language (nl.json) +- Cleaned up `alert` module and switched to nunjuck template. +- Moved weather tests from category `electron` to `e2e`. +- Updated github actions. +- Replace spectron with playwright, update dependencies including electron update to v16. +- Added lithuanian language to translations.js +- Show info message if newsfeed is empty (fixes #2731) +- Added dangerouslyDisableAutoEscaping config option for newsfeed templates (fixes #2712) +- Added missing shebang to `installers/mm.sh`. +- Node versions in templates and github workflows. + +### Fixed + +- Fixed wrong file `kr.json` to `ko.json`. Use language code 'ko' instead of 'kr' for Korean language. +- Fixed `feels_like` data from openweathermaps current weather being ignored (#2678). +- Fixed chaotic newsfeed display after network connection loss thanks to @jalibu (#2638). +- Fixed incorrect time zone correction of recurring full day events (#2632 and #2634). +- Fixed e2e tests by increasing testTimeout. +- Revert node-ical update due to missing luxon package. +- Fixed User-Agent-Header for newsfeed and calendar module (#2729). +- Replace broken shields in Readme and use https for links. +- Fixed electron tests with retry. +- Fixed Calendar recurring cross timezone error (add/subtract a day, not just offset hours) (#2632) +- Fixed Calendar showEnd and Full Date overlay (#2629) + ## [2.17.1] - 2021-10-01 ### Fixed - Fixed error when accessing letsencrypt certificates +- Fixed Calendar module enhancement: displaying full events without time (#2424) ## [2.17.0] - 2021-10-01 diff --git a/modules/default/calendar/calendarutils.js b/modules/default/calendar/calendarutils.js index 91679f13..eca2fab0 100644 --- a/modules/default/calendar/calendarutils.js +++ b/modules/default/calendar/calendarutils.js @@ -98,7 +98,7 @@ const CalendarUtils = { if (h > 0 && h < Math.abs(current_offset) / 60) { // if so, rrule created a wrong date (utc day, oops, with utc yesterday adjusted time) // we need to fix that - adjustHours = 24; + //adjustHours = 24; // Log.debug("adjusting date") } //-300 > -240 @@ -160,7 +160,7 @@ const CalendarUtils = { } if (event.type === "VEVENT") { - Log.debug("\nEvent: " + JSON.stringify(event)); + Log.debug("Event:\n" + JSON.stringify(event)); let startDate = eventDate(event, "start"); let endDate; @@ -177,8 +177,8 @@ const CalendarUtils = { } } - Log.debug("startDate (local): " + startDate.toDate()); - Log.debug("endDate (local): " + endDate.toDate()); + Log.debug("start: " + startDate.toDate()); + Log.debug("end:: " + endDate.toDate()); // Calculate the duration of the event for use with recurring events. let duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x")); @@ -332,22 +332,20 @@ const CalendarUtils = { Log.debug("Fullday"); // If the offset is negative (east of GMT), where the problem is if (dateoffset < 0) { - // Remove the offset, independently of the comparison between the date hour and the offset, - // since in the case that *date houre < offset*, the *new Date* command will handle this by - // representing the day before. - - // Reduce the time by the offset: - // Apply the correction to the date/time to get it UTC relative - date = new Date(date.getTime() - Math.abs(nowOffset) * 60000); - // the duration was calculated way back at the top before we could correct the start time.. - // fix it for this event entry - //duration = 24 * 60 * 60 * 1000; - Log.debug("new recurring date1 is " + date); + //if (dh <= Math.abs(dateoffset / 60)) { + // reduce the time by the offset + // Apply the correction to the date/time to get it UTC relative + date = new Date(date.getTime() - Math.abs(24 * 60) * 60000); + // the duration was calculated way back at the top before we could correct the start time.. + // fix it for this event entry + //duration = 24 * 60 * 60 * 1000; + Log.debug("new recurring date1 is " + date); + //} } else { // if the timezones are the same, correct date if needed - if (event.start.tz === moment.tz.guess()) { + //if (event.start.tz === moment.tz.guess()) { // if the date hour is less than the offset - if (24 - dh < Math.abs(dateoffset / 60)) { + if (24 - dh <= Math.abs(dateoffset / 60)) { // apply the correction to the date/time back to right day date = new Date(date.getTime() + Math.abs(24 * 60) * 60000); // the duration was calculated way back at the top before we could correct the start time.. @@ -355,17 +353,17 @@ const CalendarUtils = { //duration = 24 * 60 * 60 * 1000; Log.debug("new recurring date2 is " + date); } - } + //} } } else { // not full day, but luxon can still screw up the date on the rule processing // we need to correct the date to get back to the right event for if (dateoffset < 0) { // if the date hour is less than the offset - if (dh < Math.abs(dateoffset / 60)) { + if (dh <= Math.abs(dateoffset / 60)) { // Reduce the time by the offset: // Apply the correction to the date/time to get it UTC relative - date = new Date(date.getTime() - Math.abs(nowOffset) * 60000); + date = new Date(date.getTime() - Math.abs(24 * 60) * 60000); // the duration was calculated way back at the top before we could correct the start time.. // fix it for this event entry //duration = 24 * 60 * 60 * 1000; @@ -373,9 +371,9 @@ const CalendarUtils = { } } else { // if the timezones are the same, correct date if needed - if (event.start.tz === moment.tz.guess()) { + //if (event.start.tz === moment.tz.guess()) { // if the date hour is less than the offset - if (24 - dh < Math.abs(dateoffset / 60)) { + if (24 - dh <= Math.abs(dateoffset / 60)) { // apply the correction to the date/time back to right day date = new Date(date.getTime() + Math.abs(24 * 60) * 60000); // the duration was calculated way back at the top before we could correct the start time.. @@ -383,11 +381,11 @@ const CalendarUtils = { //duration = 24 * 60 * 60 * 1000; Log.debug("new recurring date2 is " + date); } - } + //} } } startDate = moment(date); - Log.debug("Corrected startDate (local): " + startDate.toDate()); + Log.debug("Corrected startDate: " + startDate.toDate()); let adjustDays = CalendarUtils.calculateTimezoneAdjustment(event, date);