fix calendar across timezone, showEnd/FullDay

This commit is contained in:
Sam Detweiler 2021-12-25 02:10:48 +11:00
parent 222a5f3779
commit b3ef4b40c5
2 changed files with 60 additions and 24 deletions

View File

@ -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² ❤️ **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 ## [2.17.1] - 2021-10-01
### Fixed ### Fixed
- Fixed error when accessing letsencrypt certificates - Fixed error when accessing letsencrypt certificates
- Fixed Calendar module enhancement: displaying full events without time (#2424)
## [2.17.0] - 2021-10-01 ## [2.17.0] - 2021-10-01

View File

@ -98,7 +98,7 @@ const CalendarUtils = {
if (h > 0 && h < Math.abs(current_offset) / 60) { if (h > 0 && h < Math.abs(current_offset) / 60) {
// if so, rrule created a wrong date (utc day, oops, with utc yesterday adjusted time) // if so, rrule created a wrong date (utc day, oops, with utc yesterday adjusted time)
// we need to fix that // we need to fix that
adjustHours = 24; //adjustHours = 24;
// Log.debug("adjusting date") // Log.debug("adjusting date")
} }
//-300 > -240 //-300 > -240
@ -160,7 +160,7 @@ const CalendarUtils = {
} }
if (event.type === "VEVENT") { if (event.type === "VEVENT") {
Log.debug("\nEvent: " + JSON.stringify(event)); Log.debug("Event:\n" + JSON.stringify(event));
let startDate = eventDate(event, "start"); let startDate = eventDate(event, "start");
let endDate; let endDate;
@ -177,8 +177,8 @@ const CalendarUtils = {
} }
} }
Log.debug("startDate (local): " + startDate.toDate()); Log.debug("start: " + startDate.toDate());
Log.debug("endDate (local): " + endDate.toDate()); Log.debug("end:: " + endDate.toDate());
// Calculate the duration of the event for use with recurring events. // Calculate the duration of the event for use with recurring events.
let duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x")); let duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x"));
@ -332,22 +332,20 @@ const CalendarUtils = {
Log.debug("Fullday"); Log.debug("Fullday");
// If the offset is negative (east of GMT), where the problem is // If the offset is negative (east of GMT), where the problem is
if (dateoffset < 0) { if (dateoffset < 0) {
// Remove the offset, independently of the comparison between the date hour and the offset, //if (dh <= Math.abs(dateoffset / 60)) {
// since in the case that *date houre < offset*, the *new Date* command will handle this by // reduce the time by the offset
// representing the day before.
// Reduce the time by the offset:
// Apply the correction to the date/time to get it UTC relative // 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.. // the duration was calculated way back at the top before we could correct the start time..
// fix it for this event entry // fix it for this event entry
//duration = 24 * 60 * 60 * 1000; //duration = 24 * 60 * 60 * 1000;
Log.debug("new recurring date1 is " + date); Log.debug("new recurring date1 is " + date);
//}
} else { } else {
// if the timezones are the same, correct date if needed // 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 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 // apply the correction to the date/time back to right day
date = new Date(date.getTime() + Math.abs(24 * 60) * 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.. // 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; //duration = 24 * 60 * 60 * 1000;
Log.debug("new recurring date2 is " + date); Log.debug("new recurring date2 is " + date);
} }
} //}
} }
} else { } else {
// not full day, but luxon can still screw up the date on the rule processing // 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 // we need to correct the date to get back to the right event for
if (dateoffset < 0) { if (dateoffset < 0) {
// if the date hour is less than the offset // 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: // Reduce the time by the offset:
// Apply the correction to the date/time to get it UTC relative // 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.. // the duration was calculated way back at the top before we could correct the start time..
// fix it for this event entry // fix it for this event entry
//duration = 24 * 60 * 60 * 1000; //duration = 24 * 60 * 60 * 1000;
@ -373,9 +371,9 @@ const CalendarUtils = {
} }
} else { } else {
// if the timezones are the same, correct date if needed // 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 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 // apply the correction to the date/time back to right day
date = new Date(date.getTime() + Math.abs(24 * 60) * 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.. // 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; //duration = 24 * 60 * 60 * 1000;
Log.debug("new recurring date2 is " + date); Log.debug("new recurring date2 is " + date);
} }
} //}
} }
} }
startDate = moment(date); startDate = moment(date);
Log.debug("Corrected startDate (local): " + startDate.toDate()); Log.debug("Corrected startDate: " + startDate.toDate());
let adjustDays = CalendarUtils.calculateTimezoneAdjustment(event, date); let adjustDays = CalendarUtils.calculateTimezoneAdjustment(event, date);