From 426ffce9e34616adfa62a178d3ec077822e47998 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Thu, 1 Feb 2007 22:15:47 +0000 Subject: [PATCH] fix - Couple Calendar bugs --- docs/changelog/7.x.x.txt | 4 ++ lib/WebGUI/Asset/Event.pm | 93 +++++++++++++++++++++++++++------------ 2 files changed, 68 insertions(+), 29 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 2a93bf9a6..41f262c8e 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -45,6 +45,10 @@ gotchas.txt for details. - fix: AssetExportHtml now handles periods in URLs more gracefully. - fix: Calendar Event Details template now uses nice dateSpan variable + - fix: Calendar Recurring Event Duplication (when the original event + occurs on a day that ALSO has a recurrence of that event). + - fix: Calendar Event Edit erroneously apply time zone changes to all day + events. 7.3.8 - Fixed a template variable rewriting problem with HTML::Template::Expr diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 1fb41c57b..1d3f68d8f 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -166,6 +166,9 @@ there is an error creating the recurrence pattern. If not given recurrence data, will use the event's existing recurrence. This is used for generating future occurrences of events that don't end. +Returns the new recurrence pattern's ID, or undef if failure. (NOTE: This +should probably use croak instead) + =cut sub generateRecurringEvents { @@ -173,19 +176,19 @@ sub generateRecurringEvents { my $recur = shift; my $parent = $self->getParent; my $session = $self->session; - my $id; + my $recurId; if ($recur) { - $id = $self->setRecurrence($recur); - return () unless $id; + $recurId = $self->setRecurrence($recur); + return () unless $recurId; } else { - $id = $self->get("recurId"); - $recur = {$self->getRecurrence}; + $recurId = $self->get("recurId"); + $recur = {$self->getRecurrence}; } - my $properties = {%{$self->get}}; - $properties->{recurId} = $id; + my $properties = {%{$self->get}}; + $properties->{recurId} = $recurId; # Get the distance between the event startDate and endDate # Only days, since event recurrence only changes the Date the event occurs, not @@ -220,7 +223,7 @@ sub generateRecurringEvents { } } - return 1; + return $recurId; } @@ -1446,11 +1449,14 @@ sub processPropertiesFromFormPost { # Pattern keys if (nfreeze(\%recurrence_new) ne nfreeze(\%recurrence_old)) { # Delete all old events and create new ones - my $old_id = $self->get("recurId"); + my $old_id = $self->get("recurId"); - return ["There's something wrong with your recurrence pattern."] - unless $self->generateRecurringEvents(\%recurrence_new); + my $new_id = $self->generateRecurringEvents(\%recurrence_new); + return ["There is something wrong with your recurrence pattern."] + unless $new_id; + ## Update with the new recurId + $self->update({ recurId => $new_id }); ## Delete old events my $events = $self->getLineage(["siblings"], { @@ -1662,6 +1668,7 @@ Edit the event. =cut +# Author's note: This sub is ugly and should be refactored according to PBP sub www_edit { my $self = shift; @@ -1743,28 +1750,56 @@ sub www_edit }); # start date - my $default_start = WebGUI::DateTime->new($self->session, $session->form->param("start") || time) - ->set_time_zone($tz); - my ($startDate,$startTime) = split / /, $self->getDateTimeStart->toUserTimeZone - unless $func eq "add" || $self->get("assetId") eq "new"; + my $default_start; + if ($session->form->param("start")) { + $default_start + = WebGUI::DateTime->new($session, $session->form->param("start")); + } + else { + $default_start = WebGUI::DateTime->new($session, time); + } - $var->{"formStartDate"}= WebGUI::Form::date($session, - { - name => "startDate", - value => $form->process("startDate") || $startDate, - defaultValue => $default_start->toUserTimeZoneDate, - }); - $var->{"formStartTime"} = WebGUI::Form::timeField($session, - { - name => "startTime", - value => $form->process("startTime") || $startTime, - defaultValue => $default_start->toUserTimeZoneTime, - }); + my ($startDate, $startTime); + if ($form->param("func") ne "add") { + my $dtStart = $self->getDateTimeStart; + if ($self->isAllDay) { + $startDate = $dtStart->toUserTimeZoneDate; + $startTime = $dtStart->toUserTimeZoneTime; + } + else { + $startDate = $dtStart->toDatabaseDate; + } + } + + $var->{"formStartDate"} + = WebGUI::Form::date($session, { + name => "startDate", + value => $form->process("startDate") || $startDate, + defaultValue => $default_start->toUserTimeZoneDate, + }); + $var->{"formStartTime"} + = WebGUI::Form::timeField($session, { + name => "startTime", + value => $form->process("startTime") || $startTime, + defaultValue => $default_start->toUserTimeZoneTime, + }); # end date + # By default, it's the default start date plus an hour $default_start->add(hours => 1); - my ($endDate,$endTime) = split / /, $self->getDateTimeEnd->toUserTimeZone - unless $func eq "add" || $self->get("assetId") eq "new"; + + my ($endDate, $endTime); + if ($form->process("func") ne "add") { + my $dtEnd = $self->getDateTimeEnd; + if ($self->isAllDay) { + $endDate = $dtEnd->toUserTimeZoneDate; + $endTime = $dtEnd->toUserTimeZoneTime; + } + else { + $endDate = $dtEnd->toDatabaseDate; + } + } + $var->{"formEndDate"} = WebGUI::Form::date($session, { name => "endDate",