Fix: show recurring and multi-day events (#2451)

pull/2463/head
Denis Papec 5 months ago committed by GitHub
parent 0a3d552114
commit a72ccb6d27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

7
package-lock.json generated

@ -32,6 +32,7 @@
"react-i18next": "^11.18.6", "react-i18next": "^11.18.6",
"react-icons": "^4.4.0", "react-icons": "^4.4.0",
"recharts": "^2.7.2", "recharts": "^2.7.2",
"rrule": "^2.8.1",
"swr": "^1.3.0", "swr": "^1.3.0",
"systeminformation": "^5.17.12", "systeminformation": "^5.17.12",
"tough-cookie": "^4.1.2", "tough-cookie": "^4.1.2",
@ -5501,9 +5502,9 @@
} }
}, },
"node_modules/rrule": { "node_modules/rrule": {
"version": "2.7.2", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/rrule/-/rrule-2.7.2.tgz", "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.8.1.tgz",
"integrity": "sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==", "integrity": "sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==",
"dependencies": { "dependencies": {
"tslib": "^2.4.0" "tslib": "^2.4.0"
} }

@ -34,6 +34,7 @@
"react-i18next": "^11.18.6", "react-i18next": "^11.18.6",
"react-icons": "^4.4.0", "react-icons": "^4.4.0",
"recharts": "^2.7.2", "recharts": "^2.7.2",
"rrule": "^2.8.1",
"swr": "^1.3.0", "swr": "^1.3.0",
"systeminformation": "^5.17.12", "systeminformation": "^5.17.12",
"tough-cookie": "^4.1.2", "tough-cookie": "^4.1.2",

@ -77,6 +77,9 @@ dependencies:
recharts: recharts:
specifier: ^2.7.2 specifier: ^2.7.2
version: 2.7.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) version: 2.7.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0)
rrule:
specifier: ^2.8.1
version: 2.8.1
swr: swr:
specifier: ^1.3.0 specifier: ^1.3.0
version: 1.3.0(react@18.2.0) version: 1.3.0(react@18.2.0)
@ -871,7 +874,7 @@ packages:
resolution: {integrity: sha512-wlQwcF0fl4eLclyGdncF9rcNNq0ipRYZGagG6h3LVgRXvCWE1fdMUaCLXwfC9YWoz9jKKbjQAq7TpO2Y3yrvmA==} resolution: {integrity: sha512-wlQwcF0fl4eLclyGdncF9rcNNq0ipRYZGagG6h3LVgRXvCWE1fdMUaCLXwfC9YWoz9jKKbjQAq7TpO2Y3yrvmA==}
dependencies: dependencies:
ical-date-parser: 4.0.0 ical-date-parser: 4.0.0
rrule: 2.7.2 rrule: 2.8.1
dev: false dev: false
/call-bind@1.0.2: /call-bind@1.0.2:
@ -3552,8 +3555,8 @@ packages:
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
/rrule@2.7.2: /rrule@2.8.1:
resolution: {integrity: sha512-NkBsEEB6FIZOZ3T8frvEBOB243dm46SPufpDckY/Ap/YH24V1zLeMmDY8OA10lk452NdrF621+ynDThE7FQU2A==} resolution: {integrity: sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==}
dependencies: dependencies:
tslib: 2.5.0 tslib: 2.5.0
dev: false dev: false

@ -2,6 +2,7 @@ import { DateTime } from "luxon";
import { parseString } from "cal-parser"; import { parseString } from "cal-parser";
import { useEffect } from "react"; import { useEffect } from "react";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { RRule } from "rrule";
import useWidgetAPI from "../../../utils/proxy/use-widget-api"; import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error"; import Error from "../../../components/services/widget/error";
@ -22,15 +23,15 @@ export default function Integration({ config, params, setEvents, hideErrors }) {
} }
} }
if (icalError || !parsedIcal) { const startDate = DateTime.fromISO(params.start);
const endDate = DateTime.fromISO(params.end);
if (icalError || !parsedIcal || !startDate.isValid || !endDate.isValid) {
return; return;
} }
const eventsToAdd = {}; const eventsToAdd = {};
const events = parsedIcal?.getEventsBetweenDates( const events = parsedIcal?.getEventsBetweenDates(startDate.toJSDate(), endDate.toJSDate());
DateTime.fromISO(params.start).toJSDate(),
DateTime.fromISO(params.end).toJSDate(),
);
events?.forEach((event) => { events?.forEach((event) => {
let title = `${event?.summary?.value}`; let title = `${event?.summary?.value}`;
@ -38,16 +39,31 @@ export default function Integration({ config, params, setEvents, hideErrors }) {
title = `${config.name}: ${title}`; title = `${config.name}: ${title}`;
} }
event.matchingDates.forEach((date) => { const eventToAdd = (date, i, type) => {
eventsToAdd[event?.uid?.value] = { const duration = event.dtend.value - event.dtstart.value;
title, const days = duration / (1000 * 60 * 60 * 24);
date: DateTime.fromJSDate(date),
color: config?.color ?? "zinc", for (let j = 0; j < days; j += 1) {
isCompleted: DateTime.fromJSDate(date) < DateTime.now(), eventsToAdd[`${event?.uid?.value}${i}${j}${type}`] = {
additional: event.location?.value, title,
type: "ical", date: DateTime.fromJSDate(date).plus({ days: j }),
}; color: config?.color ?? "zinc",
}); isCompleted: DateTime.fromJSDate(date) < DateTime.now(),
additional: event.location?.value,
type: "ical",
};
}
};
if (event?.recurrenceRule?.options) {
const rule = new RRule(event.recurrenceRule.options);
const recurringEvents = rule.between(startDate.toJSDate(), endDate.toJSDate());
recurringEvents.forEach((date, i) => eventToAdd(date, i, "recurring"));
return;
}
event.matchingDates.forEach((date, i) => eventToAdd(date, i, "single"));
}); });
setEvents((prevEvents) => ({ ...prevEvents, ...eventsToAdd })); setEvents((prevEvents) => ({ ...prevEvents, ...eventsToAdd }));

Loading…
Cancel
Save