diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index e5320a989..10e1cf5ff 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -7,6 +7,7 @@ - fixed #11028: IOB: Not choosing status causes Problem With Request - fixed #11029: enableStreamingUploads - fixed #11018: no lowercase typing possible in addressbook + - fixed #11033: Calendar, recurring dates 7.8.0 - upgraded YUI to 2.8.0r4 diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm index 10af735a1..3c978c0d6 100644 --- a/lib/WebGUI/Asset/Wobject/Calendar.pm +++ b/lib/WebGUI/Asset/Wobject/Calendar.pm @@ -787,17 +787,17 @@ sub getEventsIn { && !( Event.startDate >= '$endDate' - || Event.endDate < '$startDate' + || Event.endDate <= '$startDate' ) ) - || ( - CONCAT(Event.startDate,' ',Event.startTime) >= '$start' - && CONCAT(Event.startDate,' ',Event.startTime) < '$end' + || !( + CONCAT(Event.startDate,' ',Event.startTime) >= '$end' + || CONCAT(Event.endDate, ' ',Event.endTime ) <= '$start' ) }; my @order_priority - = ( 'Event.startDate', + = ( 'Event.startDate', 'Event.startTime', 'Event.endDate', 'Event.endTime', diff --git a/t/Asset/Wobject/Calendar.t b/t/Asset/Wobject/Calendar.t index 93259c667..b691061b2 100644 --- a/t/Asset/Wobject/Calendar.t +++ b/t/Asset/Wobject/Calendar.t @@ -137,7 +137,7 @@ my $inside = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); -my $inside2 = $windowCal->addChild({ +my $insidewt = $windowCal->addChild({ className => 'WebGUI::Asset::Event', title => 'Inside window, with times', startDate => $bday->toDatabaseDate, @@ -171,7 +171,17 @@ my $straddle = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); -my $straddleLow = $windowCal->addChild({ +my $straddlewt = $windowCal->addChild({ + className => 'WebGUI::Asset::Event', + title => 'Straddles the window with times, inclusive', + startDate => $startDt->clone->subtract(hours => 12)->toDatabaseDate, + endDate => $endDt->clone->add(hours => 12)->toDatabaseDate, + startTime => $startDt->clone->subtract(hours => 12)->toDatabaseTime, + endTime => $endDt->clone->add(hours => 12)->toDatabaseTime, + timeZone => $tz, +}, undef, undef, {skipAutoCommitWorkflows => 1}); + +my $straddleLowwt = $windowCal->addChild({ className => 'WebGUI::Asset::Event', title => 'Straddles the window, lower side', startDate => $startDt->clone->subtract(hours => 12)->toDatabaseDate, @@ -181,7 +191,7 @@ my $straddleLow = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); -my $straddleHigh = $windowCal->addChild({ +my $straddleHighwt = $windowCal->addChild({ className => 'WebGUI::Asset::Event', title => 'Straddles the window, higher side', startDate => $endDt->clone->subtract(hours => 12)->toDatabaseDate, @@ -191,7 +201,7 @@ my $straddleHigh = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); -my $justBefore = $windowCal->addChild({ +my $justBeforewt = $windowCal->addChild({ className => 'WebGUI::Asset::Event', title => 'Just before the window. Ending time coincident with window start', startDate => $startDt->clone->subtract(hours => 1)->toDatabaseDate, @@ -201,7 +211,7 @@ my $justBefore = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); -my $justAfter = $windowCal->addChild({ +my $justAfterwt = $windowCal->addChild({ className => 'WebGUI::Asset::Event', title => 'Just after the window. Start time coincident with window end', startDate => $endDt->toDatabaseDate, @@ -211,11 +221,25 @@ my $justAfter = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); +# wt suffix = with times +# inside +# insidewt +# |-------------straddle-----------------| +# |-------------straddlewt---------------| +# straddleLowwt +# straddleHighwt +# window: |-------------------------------| +# justBeforewt justAfterwt +# outside high +# outside low +# +# Everything above the window should be included in the set of events returned. + my $tag2 = WebGUI::VersionTag->getWorking($session); $tag2->commit; WebGUI::Test->tagsToRollback($tag2); -is(scalar @{ $windowCal->getLineage(['children'])}, 9, 'added events to the window calendar'); +is(scalar @{ $windowCal->getLineage(['children'])}, 10, 'added events to the window calendar'); my @window = $windowCal->getEventsIn($startDt->toDatabase, $endDt->toDatabase); @@ -223,11 +247,11 @@ my @window = $windowCal->getEventsIn($startDt->toDatabase, $endDt->toDatabase); #note join "\n", map { join ' ', $_->get('title'), $_->get('startDate'), $_->get('startTime')} @window; #note $endDt->toDatabase; -is(scalar @window, 4, 'getEventsIn returned 4 events'); +is(scalar @window, 6, 'getEventsIn returned 6 events'); cmp_bag( [ map { $_->get('title') } @window ], - [ map { $_->get('title') } ($inside, $inside2, $straddle, $straddleHigh)], - '..returns correct 4 events' + [ map { $_->get('title') } ($inside, $insidewt, $straddle, $straddleHighwt, $straddleLowwt, $straddlewt)], + '..returns correct 6 events' ); ######################################################################