feat(calendarUtil): simplify event property copying
This commit is contained in:
parent
2bd5c967af
commit
1706b9cad3
|
@ -112,12 +112,12 @@ export function createCalendarComponent(name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add events to the calendar component
|
// Add events to the calendar component
|
||||||
export function addEventsToCalendar(calendarComponent, results, overrideFlag = false) {
|
export function addEventsToCalendar(calendarComponent, calendars, overrideFlag = false) {
|
||||||
let defaultTimeZone = null; // To store the first found X-WR-TIMEZONE
|
let defaultTimeZone = null; // To store the first found X-WR-TIMEZONE
|
||||||
|
|
||||||
results.forEach((result) => {
|
calendars.forEach((calendar) => {
|
||||||
try {
|
try {
|
||||||
const parsed = ICAL.parse(result.data);
|
const parsed = ICAL.parse(calendar.data);
|
||||||
const component = new ICAL.Component(parsed);
|
const component = new ICAL.Component(parsed);
|
||||||
|
|
||||||
// Extract METHOD from the parsed data (if available)
|
// Extract METHOD from the parsed data (if available)
|
||||||
|
@ -153,53 +153,36 @@ export function addEventsToCalendar(calendarComponent, results, overrideFlag = f
|
||||||
// Process VEVENT components
|
// Process VEVENT components
|
||||||
component.getAllSubcomponents('vevent').forEach((event) => {
|
component.getAllSubcomponents('vevent').forEach((event) => {
|
||||||
const vevent = new ICAL.Event(event);
|
const vevent = new ICAL.Event(event);
|
||||||
const newEvent = new ICAL.Component('vevent');
|
const newEvent = new ICAL.Event(newEvent);
|
||||||
|
|
||||||
// 1. Add DTSTART
|
newEvent.startDate = vevent.startDate
|
||||||
processDateTimeProperty(event, 'dtstart', newEvent);
|
newEvent.endDate = vevent.endDate
|
||||||
|
|
||||||
// 2. Add DTEND
|
|
||||||
processDateTimeProperty(event, 'dtend', newEvent);
|
|
||||||
|
|
||||||
// 3. Copy DTSTAMP
|
// 3. Copy DTSTAMP
|
||||||
const dtstamp = event.getFirstPropertyValue('dtstamp');
|
const dtstamp = event.getFirstPropertyValue('dtstamp');
|
||||||
if (dtstamp) newEvent.updatePropertyWithValue('dtstamp', dtstamp);
|
if (dtstamp) newEvent.component.updatePropertyWithValue('dtstamp', dtstamp);
|
||||||
|
|
||||||
// 4. Copy UID
|
// 4. Copy UID
|
||||||
newEvent.updatePropertyWithValue('uid', vevent.uid);
|
newEvent.uid = vevent.uid;
|
||||||
|
|
||||||
// 5. Add LOCATION (conditionally included)
|
// 5. Add LOCATION (conditionally included)
|
||||||
if (!overrideFlag && vevent.location) {
|
if (overrideFlag) {
|
||||||
newEvent.updatePropertyWithValue('location', vevent.location);
|
newEvent.summary = 'Busy'
|
||||||
} else if (overrideFlag && vevent.location) {
|
|
||||||
// Modify SUMMARY if override is set
|
|
||||||
const modifiedSummary = `${vevent.summary.trim()} (Location omitted)`;
|
|
||||||
newEvent.updatePropertyWithValue('summary', modifiedSummary);
|
|
||||||
} else {
|
} else {
|
||||||
newEvent.updatePropertyWithValue('summary', vevent.summary.trim());
|
newEvent.summary = vevent.summary;
|
||||||
|
if (vevent.location) newEvent.location = vevent.location;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. Copy Recurrence Rules (RRULE) and Recurrence ID
|
|
||||||
const rrule = event.getFirstPropertyValue('rrule');
|
const rrule = event.getFirstPropertyValue('rrule');
|
||||||
if (rrule) newEvent.updatePropertyWithValue('rrule', rrule);
|
if (rrule) newEvent.component.updatePropertyWithValue('rrule', rrule);
|
||||||
|
|
||||||
const recurrenceId = event.getFirstPropertyValue('recurrence-id');
|
|
||||||
if (recurrenceId) newEvent.updatePropertyWithValue('recurrence-id', recurrenceId);
|
|
||||||
|
|
||||||
// 7. Copy SUMMARY
|
|
||||||
newEvent.updatePropertyWithValue('summary', vevent.summary.trim());
|
|
||||||
|
|
||||||
// 8. Add SEQUENCE (if available or default to 0)
|
|
||||||
const sequence = event.getFirstPropertyValue('sequence') || 0;
|
|
||||||
newEvent.updatePropertyWithValue('sequence', sequence);
|
|
||||||
|
|
||||||
// Add the VEVENT to the calendar
|
// Add the VEVENT to the calendar
|
||||||
calendarComponent.addSubcomponent(newEvent);
|
calendarComponent.addSubcomponent(newEvent.component);
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`Processed VEVENT components for calendar: ${result.name}`);
|
console.log(`Processed VEVENT components for calendar: ${calendar.name}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error processing calendar data:', error.message);
|
console.error(`Error processing calendar:`, calendar, error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,9 +47,9 @@ async function refreshCalendarData(calendarName) {
|
||||||
// Read the JSON file to get the source URL and other details
|
// Read the JSON file to get the source URL and other details
|
||||||
const { calendars } = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8'));
|
const { calendars } = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8'));
|
||||||
|
|
||||||
const results = await Promise.all(calendars.map(fetchCalendarData));
|
const calendarResults = await Promise.all(calendars.map(fetchCalendarData));
|
||||||
const calendarComponent = createCalendarComponent(calendarName);
|
const calendarComponent = createCalendarComponent(calendarName);
|
||||||
addEventsToCalendar(calendarComponent, results);
|
addEventsToCalendar(calendarComponent, calendarResults);
|
||||||
|
|
||||||
saveCalendarFile(`${calendarName}.ics`, calendarComponent.toString());
|
saveCalendarFile(`${calendarName}.ics`, calendarComponent.toString());
|
||||||
console.log('Calendar data refreshed and saved.');
|
console.log('Calendar data refreshed and saved.');
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
BEGIN:VCALENDAR
|
BEGIN:VCALENDAR
|
||||||
NAME:US Holidays
|
NAME:US Holidays
|
||||||
|
PRODID:-//CalMerge//Calendar Merger 1.0//EN
|
||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
|
CALSCALE:GREGORIAN
|
||||||
BEGIN:VEVENT
|
BEGIN:VEVENT
|
||||||
UID:20231225T000000-001@example.com
|
|
||||||
DTSTAMP:20231225T000000Z
|
|
||||||
DTSTART;VALUE=DATE:20231225
|
DTSTART;VALUE=DATE:20231225
|
||||||
DTEND;VALUE=DATE:20231226
|
DTEND;VALUE=DATE:20231226
|
||||||
|
DTSTAMP:20231225T000000Z
|
||||||
|
UID:20231225T000000-001@example.com
|
||||||
SUMMARY:Christmas Day
|
SUMMARY:Christmas Day
|
||||||
END:VEVENT
|
END:VEVENT
|
||||||
END:VCALENDAR
|
END:VCALENDAR
|
|
@ -11,6 +11,5 @@ DTEND:20241003T200000Z
|
||||||
DTSTAMP:20241119T115316Z
|
DTSTAMP:20241119T115316Z
|
||||||
UID:6tbrvsitniuu72li7kk15gou2b@google.com
|
UID:6tbrvsitniuu72li7kk15gou2b@google.com
|
||||||
SUMMARY:progodessey
|
SUMMARY:progodessey
|
||||||
SEQUENCE:0
|
|
||||||
END:VEVENT
|
END:VEVENT
|
||||||
END:VCALENDAR
|
END:VCALENDAR
|
|
@ -25,9 +25,8 @@ DTSTART;TZID=Europe/Berlin:20241120T211500
|
||||||
DTEND;TZID=Europe/Berlin:20241120T215000
|
DTEND;TZID=Europe/Berlin:20241120T215000
|
||||||
DTSTAMP:20241113T212909Z
|
DTSTAMP:20241113T212909Z
|
||||||
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
|
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
|
||||||
|
SUMMARY:JR Weekly Check-In
|
||||||
LOCATION:FaceTime
|
LOCATION:FaceTime
|
||||||
RRULE:FREQ=WEEKLY;BYDAY=WE
|
RRULE:FREQ=WEEKLY;BYDAY=WE
|
||||||
SUMMARY:JR Weekly Check-In
|
|
||||||
SEQUENCE:0
|
|
||||||
END:VEVENT
|
END:VEVENT
|
||||||
END:VCALENDAR
|
END:VCALENDAR
|
Loading…
Reference in New Issue