@@ -42,7 +42,7 @@ function isExcluded(recurrenceDate: moment.Moment, exdateArray: moment.Moment[])
42
42
return exdateArray . some ( exDate => exDate . isSame ( recurrenceDate , 'day' ) ) ;
43
43
}
44
44
45
- function processRecurrenceOverrides ( event : any , dayToMatch : string , excludedDates : moment . Moment [ ] , matchingEvents : any [ ] ) {
45
+ function processRecurrenceOverrides ( event : any , sortedDaysToMatch : string [ ] , excludedDates : moment . Moment [ ] , matchingEvents : any [ ] ) {
46
46
for ( const date in event . recurrences ) {
47
47
const recurrence = event . recurrences [ date ] ;
48
48
const recurrenceMoment = moment ( date ) . startOf ( 'day' ) ;
@@ -56,20 +56,20 @@ function processRecurrenceOverrides(event: any, dayToMatch: string, excludedDate
56
56
recurrence . recurrent = true ;
57
57
58
58
// Check if this override matches the dayToMatch
59
- if ( moment ( recurrence . start ) . isSame ( dayToMatch , "day" ) ) {
59
+ if ( moment ( recurrence . start ) . isBetween ( sortedDaysToMatch . first ( ) , sortedDaysToMatch . last ( ) , "day" ) ) {
60
60
console . debug ( `Adding recurring event with override: ${ recurrence . summary } on ${ recurrenceMoment . format ( 'YYYY-MM-DD' ) } ` ) ;
61
61
recurrence . eventType = "recurring override" ;
62
62
matchingEvents . push ( recurrence ) ;
63
63
}
64
64
}
65
65
}
66
66
67
- function processRecurringRules ( event : any , dayToMatch : string , excludedDates : moment . Moment [ ] , matchingEvents : any [ ] ) {
68
- const localStartOfYesterday = moment ( dayToMatch ) . subtract ( 1 , 'day' ) . startOf ( 'day' ) . toDate ( ) ;
69
- const localEndOfTomorrow = moment ( dayToMatch ) . add ( 1 , 'day' ) . endOf ( 'day' ) . toDate ( ) ;
67
+ function processRecurringRules ( event : any , sortedDaysToMatch : string [ ] , excludedDates : moment . Moment [ ] , matchingEvents : any [ ] ) {
68
+ const localStartOfRange = moment ( sortedDaysToMatch . first ( ) ) . subtract ( 1 , 'day' ) . startOf ( 'day' ) . toDate ( ) ;
69
+ const localEndOfRange = moment ( sortedDaysToMatch . last ( ) ) . add ( 1 , 'day' ) . endOf ( 'day' ) . toDate ( ) ;
70
70
71
71
// Get recurrence dates within the range
72
- const recurrenceDates = event . rrule . between ( localStartOfYesterday , localEndOfTomorrow , true ) ;
72
+ const recurrenceDates = event . rrule . between ( localStartOfRange , localEndOfRange , true ) ;
73
73
74
74
recurrenceDates . forEach ( recurrenceDate => {
75
75
const recurrenceMoment = tz ( recurrenceDate , event . rrule . origOptions . tzid || 'UTC' ) ;
@@ -87,7 +87,7 @@ function processRecurringRules(event: any, dayToMatch: string, excludedDates: mo
87
87
delete clonedEvent . rrule ;
88
88
clonedEvent . recurrent = true ;
89
89
90
- if ( moment ( clonedEvent . start ) . isSame ( dayToMatch , 'day' ) ) {
90
+ if ( moment ( clonedEvent . start ) . isBetween ( sortedDaysToMatch . first ( ) , sortedDaysToMatch . last ( ) , 'day' ) ) {
91
91
console . debug ( `Adding recurring event: ${ clonedEvent . summary } ${ clonedEvent . start } - ${ clonedEvent . end } ` ) ;
92
92
console . debug ( "Excluded dates:" , excludedDates . map ( date => date . format ( 'YYYY-MM-DD' ) ) ) ;
93
93
@@ -102,7 +102,8 @@ function shouldIncludeOngoing(event: any, dayToMatch: string): boolean {
102
102
return moment ( dayToMatch ) . isBetween ( moment ( event . start ) , moment ( event . end ) , "day" ) ;
103
103
}
104
104
105
- export function filterMatchingEvents ( icsArray : any [ ] , dayToMatch : string , showOngoing : boolean ) {
105
+ export function filterMatchingEvents ( icsArray : any [ ] , daysToMatch : string [ ] , showOngoing : boolean ) {
106
+ const sortedDaysToMatch = daysToMatch . sort ( ) ;
106
107
return icsArray . reduce ( ( matchingEvents , event ) => {
107
108
// Skip canceled parent events
108
109
if ( event . status && event . status . toUpperCase ( ) === "CANCELLED" ) {
@@ -127,16 +128,16 @@ export function filterMatchingEvents(icsArray: any[], dayToMatch: string, showOn
127
128
128
129
// Process recurrence overrides to populate matching events and excluded dates
129
130
if ( event . recurrences ) {
130
- processRecurrenceOverrides ( event , dayToMatch , excludedDates , matchingEvents ) ;
131
+ processRecurrenceOverrides ( event , sortedDaysToMatch , excludedDates , matchingEvents ) ;
131
132
}
132
133
133
134
// Process recurring rules, skipping overridden dates
134
135
if ( event . rrule ) {
135
- processRecurringRules ( event , dayToMatch , excludedDates , matchingEvents ) ;
136
+ processRecurringRules ( event , sortedDaysToMatch , excludedDates , matchingEvents )
136
137
}
137
138
138
139
// Process non-recurring events
139
- if ( ! event . recurrences && ! event . rrule && moment ( event . start ) . isSame ( dayToMatch , "day" ) ) {
140
+ if ( ! event . recurrences && ! event . rrule && moment ( event . start ) . isBetween ( sortedDaysToMatch . first ( ) , sortedDaysToMatch . last ( ) , "day" ) ) {
140
141
console . debug ( "Adding one-off event:" , {
141
142
summary : event . summary ,
142
143
start : event . start ,
@@ -149,7 +150,7 @@ export function filterMatchingEvents(icsArray: any[], dayToMatch: string, showOn
149
150
}
150
151
151
152
// Include ongoing events
152
- if ( showOngoing && shouldIncludeOngoing ( event , dayToMatch ) ) {
153
+ if ( showOngoing && daysToMatch . some ( dayToMatch => shouldIncludeOngoing ( event , dayToMatch ) ) ) {
153
154
matchingEvents . push ( event ) ;
154
155
}
155
156
0 commit comments