Skip to content

Commit

Permalink
recur_expansion: EXDATE can be DATE and DTSTART can be DATE-TIME
Browse files Browse the repository at this point in the history
When EXDATE is in DATE format and DTSTART is DATE-TIME, then
to determine whether a ocurrence shall be excluded, the
occurence shall be converted to DATE and then compared to EXDATE.

This applies also for the very first EXDATE, when it coincides with
DTSTART.
  • Loading branch information
dilyanpalauzov committed Sep 13, 2022
1 parent b1e572e commit 0fe55fd
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions lib/ical/recur_expansion.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,21 @@ ICAL.RecurExpansion = (function() {
}
},

/**
* Compare two ICAL.Time objects. When the second parameter is a timeless date
* and the first parameter is date-with-time, strip the time and compare only
* the days.
*
* @private
* @param {ICAL.Time} a The one object to compare
* @param {ICAL.Time} b The other object to compare
*/
_compare_special: function(a, b) {
if (!a.isDate && b.isDate)
return new ICAL.Time({year:a.year, month:a.month, day:a.day}).compare(b);
else return a.compare(b);
},

/**
* Retrieve the next occurrence in the series.
* @return {ICAL.Time}
Expand Down Expand Up @@ -264,9 +279,10 @@ ICAL.RecurExpansion = (function() {

// check the negative rules
if (this.exDate) {
compare = this.exDate.compare(this.last);
//EXDATE can be in DATE format, but DTSTART is in DATE-TIME format
compare = this._compare_special(this.last, this.exDate);

if (compare < 0) {
if (compare > 0) {
this._nextExDay();
}

Expand Down Expand Up @@ -418,10 +434,12 @@ ICAL.RecurExpansion = (function() {
if (component.hasProperty('exdate')) {
this.exDates = this._extractDates(component, 'exdate');
// if we have a .last day we increment the index to beyond it.
// When DTSTART is in DATE-TIME format, EXDATE is in DATE format and EXDATE is
// the date of DTSTART, _compare_special finds this out and compareTime fails.
this.exDateInc = ICAL.helpers.binsearchInsert(
this.exDates,
this.last,
compareTime
this._compare_special
);

this.exDate = this.exDates[this.exDateInc];
Expand Down

0 comments on commit 0fe55fd

Please sign in to comment.