Skip to content

Commit 9ef6bda

Browse files
authored
Merge pull request #199 from cloud-atlas-ai/muness/issue198
Fix Multi-day Ongoing
2 parents 887fdf1 + 5af3d31 commit 9ef6bda

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/icalUtils.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,26 @@ function processRecurringRules(event: any, sortedDaysToMatch: string[], excluded
169169
}
170170

171171
function shouldIncludeOngoing(event: any, dayToMatch: string): boolean {
172-
return moment(dayToMatch).isBetween(moment(event.start), moment(event.end), "day");
172+
const day = moment(dayToMatch, 'YYYY-MM-DD').startOf('day');
173+
const eventStartDay = moment(event.start).startOf('day');
174+
const eventEndDay = moment(event.end).startOf('day');
175+
176+
// Avoid duplicating the initial occurrence; it's already included elsewhere.
177+
if (day.isSame(eventStartDay, 'day')) {
178+
return false;
179+
}
180+
181+
// Include full days between start and end.
182+
if (day.isBetween(eventStartDay, eventEndDay, 'day', '()')) {
183+
return true;
184+
}
185+
186+
// Include the ending day when the event continues past its start.
187+
if (day.isSame(eventEndDay, 'day')) {
188+
return moment(event.end).diff(eventEndDay, 'minutes') > 0;
189+
}
190+
191+
return false;
173192
}
174193

175194
export function filterMatchingEvents(icsArray: any[], daysToMatch: string[], showOngoing: boolean) {

tests/icalUtils.test.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,34 @@ END:VCALENDAR`;
8181
expect(withOngoing[0].summary).toBe('Multi-day Event');
8282
});
8383

84+
it('should show multi-day events on all spanned days only when showOngoing is enabled', () => {
85+
const events = [{
86+
summary: 'Spanning Event',
87+
start: new Date('2025-10-09T09:00:00Z'),
88+
end: new Date('2025-10-11T17:00:00Z'),
89+
uid: 'spanning-event-uid'
90+
}];
91+
92+
const dates = ['2025-10-09', '2025-10-10', '2025-10-11'];
93+
94+
// With showOngoing OFF: only the start date should include the event
95+
const eventsOnDatesWithOngoingOff = dates.map(date => filterMatchingEvents(events, [date], false));
96+
expect(eventsOnDatesWithOngoingOff[0]).toHaveLength(1); // 2025-10-09 (start)
97+
expect(eventsOnDatesWithOngoingOff[1]).toHaveLength(0); // 2025-10-10 (middle)
98+
expect(eventsOnDatesWithOngoingOff[2]).toHaveLength(0); // 2025-10-11 (end)
99+
100+
// With showOngoing ON: all dates from start to end should include the event
101+
const eventsOnDatesWithOngoingOn = dates.map(date => filterMatchingEvents(events, [date], true));
102+
expect(eventsOnDatesWithOngoingOn[0]).toHaveLength(1); // 2025-10-09 (start)
103+
expect(eventsOnDatesWithOngoingOn[1]).toHaveLength(1); // 2025-10-10 (middle)
104+
expect(eventsOnDatesWithOngoingOn[2]).toHaveLength(1); // 2025-10-11 (end)
105+
106+
// Sanity: verify correct event is returned
107+
eventsOnDatesWithOngoingOn.forEach((res) => {
108+
expect(res[0].summary).toBe('Spanning Event');
109+
});
110+
});
111+
84112
it('should skip cancelled events', () => {
85113
const events = [{
86114
summary: 'Cancelled Event',
@@ -227,7 +255,7 @@ END:VCALENDAR`;
227255
];
228256

229257
const results = testDates.map(date => filterMatchingEvents(events, [date], false));
230-
258+
231259
expect(results[0]).toHaveLength(1); // Original
232260
expect(results[1]).toHaveLength(1); // First recurrence
233261
expect(results[2]).toHaveLength(0); // Excluded

0 commit comments

Comments
 (0)