diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index c578fd619..a9fcfb92f 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -4,6 +4,7 @@ - fix: SQL Report: Paginate After (Still) (William McKee / Knowmad Technologies) - fix: Bug in thumbnailer.pl + - fix: Events userDefined fields now work. 7.3.12 diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 63a0e02da..c5f9e2a0e 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -15,6 +15,7 @@ $VERSION = "0.0.0"; use strict; use Tie::IxHash; +use Carp qw(cluck confess); use Storable qw(nfreeze thaw); use WebGUI::International; @@ -49,7 +50,6 @@ sub definition { my $definition = shift; my $i18n = WebGUI::International->new($session, 'Asset_Event'); - my $dt = WebGUI::DateTime->new($session, time); ### Set up list options ### @@ -109,7 +109,7 @@ sub definition { ### Add user defined fields for my $num (1..5) { - $properties{"UserDefined".$num} = { + $properties{"userDefined".$num} = { fieldType => "text", defaultValue => "", }; @@ -173,65 +173,45 @@ sub canEdit { #################################################################### -=head2 generateRecurringEvents ( [ \%recurrence_data ] ) +=head2 generateRecurringEvents ( ) -Generate a series of events. +Generates Events according to this Event's recurrence pattern. -If given a hashref of recurrence data, will create a new recurrence row in the -database and set the event to this new recurrence pattern. Will return undef if -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) +Will croak on failure. =cut sub generateRecurringEvents { my $self = shift; - my $recur = shift; my $parent = $self->getParent; my $session = $self->session; - my $recurId; - if ($recur) { - $recurId = $self->setRecurrence($recur); - return () unless $recurId; + my $properties = $self->get; + my $recurId = $self->get("recurId"); + my $recur = {$self->getRecurrence}; + + # This method only works on events that have recurrence patterns + if (!$recurId) { + croak("Cannot generate recurring events: Event has no recurrence pattern."); } - else { - $recurId = $self->get("recurId"); - $recur = {$self->getRecurrence}; - } - - $self->update({ recurId => $recurId }); - 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 # the time. - my $duration_days = 0; + # TODO: Allow recurrence patterns of less than a single day. + my $duration_days = 0; my $event_start - = WebGUI::DateTime->new($self->session, delete($properties->{startDate})." 00:00:00"); + = WebGUI::DateTime->new($session, $properties->{startDate}." 00:00:00"); my $event_end - = WebGUI::DateTime->new($self->session, delete($properties->{endDate})." 00:00:00"); + = WebGUI::DateTime->new($session, $properties->{endDate}." 00:00:00"); $duration_days = $event_end->subtract_datetime($event_start)->days; - my @dates = $self->getRecurrenceDates($recur); + my @dates = $self->getRecurrenceDates; for my $date (@dates) { # Only generate if the recurId does not exist on this day - use Data::Dumper; - warn "COMPARING $date TO $properties->{startDate}"; - warn Dumper $session->db->quickArray( - "select count(*) from Event where recurId=? and startDate=?", - [$properties->{recurId}, $date], - ); - my ($exists) = $session->db->quickArray( "select count(*) from Event where recurId=? and startDate=?", @@ -239,11 +219,11 @@ sub generateRecurringEvents { ); if (!$exists) { - warn "Making event on $date"; my $dt = WebGUI::DateTime->new($self->session, $date." 00:00:00"); - $properties->{startDate} = $dt->toDatabaseDate; - $properties->{endDate} = $dt->clone->add(days => $duration_days)->toDatabaseDate; + $properties->{startDate} = $dt->toDatabaseDate; + $properties->{endDate} + = $dt->clone->add(days => $duration_days)->toDatabaseDate; my $newEvent = $parent->addChild($properties); $newEvent->requestAutoCommit; @@ -295,7 +275,7 @@ sub getDateTimeStart { #$self->session->errorHandler->warn($self->getId.":: Date: $date -- Time: $time"); if (!$date) { - $self->session->errorHandler->warn("This event (".$self->get("assetId").") has no date."); + $self->session->errorHandler->warn("Event::getDateTimeStart -- This event (".$self->get("assetId").") has no start date."); return; } @@ -334,11 +314,10 @@ sub getDateTimeEnd { #$self->session->errorHandler->warn($self->getId.":: Date: $date -- Time: $time"); if (!$date) { - $self->session->errorHandler->warn("This event (".$self->get("assetId").") has no date."); + $self->session->errorHandler->warn("Event::getDateTimeEnd -- This event (".$self->get("assetId").") has no end date."); return; } - if ($time) { my $dt = WebGUI::DateTime->new($self->session, $date." ".$time); $dt->set_time_zone($tz); @@ -377,8 +356,7 @@ sub getEventNext { . "|| Event.startTime >= '00:00:00')"; } # Non all-day events must look for greater than time - else - { + else { $where .= "((Event.startTime = '".$self->get("startTime")."' " . "&& assetData.title > ".$db->quote($self->get("title")).")" . "|| Event.startTime > '".$self->get("startTime")."')"; @@ -693,21 +671,21 @@ sub getRecurrence { #################################################################### -=head2 getRecurrenceDates +=head2 getRecurrenceDates ( endDate ) -Gets a series of dates in the specified recurrence pattern. +Gets a series of dates in this event's recurrence pattern, up to the +calendar's configured "maintainRecurrenceOffset". -This is quite possibly the worst algorithm I've ever created. We should be using -DateTime::Event::ICal instead. +This is quite possibly the worst algorithm I've ever created. We should be +using DateTime::Event::ICal instead. =cut sub getRecurrenceDates { - my $self = shift; - my $recur = shift; + my $self = shift; my %date; - + my $recur = {$self->getRecurrence}; return undef unless $recur->{recurType}; my %dayNames = ( @@ -736,17 +714,15 @@ sub getRecurrenceDates { $dt_end = WebGUI::DateTime->new($self->session, $recur->{endDate}." 00:00:00"); } # Set an end for events with no end - #!!! TODO !!! - Get the appropriate configuration + # TODO: Get the maintainRecurrenceOffset value elsif (!$recur->{endDate} && !$recur->{endAfter}) { $dt_end = $dt->clone->add(years=>2); } - RECURRENCE: while (1) - { + RECURRENCE: while (1) { ####### daily - if ($recur->{recurType} eq "daily") - { + if ($recur->{recurType} eq "daily") { ### Add date $date{$dt->strftime('%F')}++; @@ -754,8 +730,7 @@ sub getRecurrenceDates { $dt->add(days => $recur->{every}); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -763,35 +738,30 @@ sub getRecurrenceDates { next RECURRENCE; } ####### weekday - elsif ($recur->{recurType} eq "weekday") - { + elsif ($recur->{recurType} eq "weekday") { my $today = $dt->day_name; # If today is not a weekday - unless (grep /$today/i,qw(monday tuesday wednesday thursday friday)) - { + unless (grep /$today/i,qw(monday tuesday wednesday thursday friday)) { # Add a day $dt->add(days => 1); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } # next next RECURRENCE; } - else - { + else { ### Add date $date{$dt->strftime('%F')}++; $dt->add(days => $recur->{every}); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -800,10 +770,8 @@ sub getRecurrenceDates { } } ####### weekly - elsif ($recur->{recurType} eq "weekly") - { - for (0..6) # Work through the week - { + elsif ($recur->{recurType} eq "weekly") { + for (0..6) { # Work through the week my $dt_day = $dt->clone->add(days => $_); # If today is past the endDate, quit. @@ -812,8 +780,7 @@ sub getRecurrenceDates { my $today = $dayNames{lc $dt_day->day_name}; - if (grep /$today/i, @{$recur->{dayNames}}) - { + if (grep /$today/i, @{$recur->{dayNames}}) { ### Add date $date{$dt_day->strftime('%F')}++; } @@ -827,8 +794,7 @@ sub getRecurrenceDates { $dt->add(weeks => $recur->{every}); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -837,16 +803,14 @@ sub getRecurrenceDates { } ####### monthday - elsif ($recur->{recurType} eq "monthDay") - { + elsif ($recur->{recurType} eq "monthDay") { # Pick out the correct day my $startDate = $dt->year."-".$dt->month."-".$recur->{dayNumber}; my $dt_day = WebGUI::DateTime->new($self->session, $startDate." 00:00:00"); # Only if today is not before the recurrence start - if ($dt_day->clone->truncate(to => "day") >= $dt_start->clone->truncate(to=>"day")) - { + if ($dt_day->clone->truncate(to => "day") >= $dt_start->clone->truncate(to=>"day")) { # If today is past the endDate, quit. last RECURRENCE if ($recur->{endDate} && $dt_day > $dt_end); @@ -859,8 +823,7 @@ sub getRecurrenceDates { $dt->add(months => $recur->{every})->truncate(to => "month"); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -868,19 +831,15 @@ sub getRecurrenceDates { next RECURRENCE; } ###### monthweek - elsif ($recur->{recurType} eq "monthWeek") - { + elsif ($recur->{recurType} eq "monthWeek") { # For each week remaining in this month my $dt_week = $dt->clone; - while ($dt->month eq $dt_week->month) - { + while ($dt->month eq $dt_week->month) { my $week = int($dt_week->day_of_month / 7); - if (grep /$weeks{$week}/i, @{$recur->{weeks}}) - { + if (grep /$weeks{$week}/i, @{$recur->{weeks}}) { # Pick out the correct days - for (0..6) # Work through the week - { + for (0..6) { # Work through the week my $dt_day = $dt_week->clone->add(days => $_); # If today is past the endDate, quit. @@ -909,13 +868,11 @@ sub getRecurrenceDates { } ### If last is selected - if (grep /last/, @{$recur->{weeks}}) - { + if (grep /last/, @{$recur->{weeks}}) { my $dt_last = $dt->clone->truncate(to => "month") ->add(months => 1)->subtract(days => 1); - for (0..6) - { + for (0..6) { my $dt_day = $dt_last->clone->subtract(days => $_); # If today is before the startDate, don't even bother @@ -925,11 +882,9 @@ sub getRecurrenceDates { my $today = $dayNames{lc $dt_day->day_name}; - if (grep /$today/i, @{$recur->{dayNames}}) - { + if (grep /$today/i, @{$recur->{dayNames}}) { ### Add date $date{$dt_day->strftime('%F')}++; - } # If occurrences is past the endAfter, quit @@ -943,8 +898,7 @@ sub getRecurrenceDates { $dt->add(months => $recur->{every})->truncate(to => "month"); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -952,23 +906,19 @@ sub getRecurrenceDates { next RECURRENCE; } ####### yearday - elsif ($recur->{recurType} eq "yearDay") - { + elsif ($recur->{recurType} eq "yearDay") { # For each month my $dt_month = $dt->clone; - while ($dt->year eq $dt_month->year) - { + while ($dt->year eq $dt_month->year) { my $mon = $dt_month->month_abbr; - if (grep /$mon/i, @{$recur->{months}}) - { + if (grep /$mon/i, @{$recur->{months}}) { # Pick out the correct day my $startDate = $dt_month->year."-".$dt_month->month."-".$recur->{dayNumber}; my $dt_day = WebGUI::DateTime->new($self->session, $startDate." 00:00:00"); # Only if today is not before the recurrence start - if ($dt_day->clone->truncate(to => "day") >= $dt_start->clone->truncate(to=>"day")) - { + if ($dt_day->clone->truncate(to => "day") >= $dt_start->clone->truncate(to=>"day")) { # If today is past the endDate, quit. last RECURRENCE if ($recur->{endDate} && $dt_day > $dt_end); @@ -990,8 +940,7 @@ sub getRecurrenceDates { $dt->add(years => $recur->{every})->truncate(to => "year"); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -999,25 +948,19 @@ sub getRecurrenceDates { next RECURRENCE; } ####### yearweek - elsif ($recur->{recurType} eq "yearWeek") - { + elsif ($recur->{recurType} eq "yearWeek") { # For each month my $dt_month = $dt->clone; - while ($dt->year eq $dt_month->year) - { + while ($dt->year eq $dt_month->year) { my $mon = $dt_month->month_abbr; - if (grep /$mon/i, @{$recur->{months}}) - { + if (grep /$mon/i, @{$recur->{months}}) { # For each week remaining in this month my $dt_week = $dt_month->clone; - while ($dt_month->month eq $dt_week->month) - { + while ($dt_month->month eq $dt_week->month) { my $week = int($dt_week->day_of_month / 7); - if (grep /$weeks{$week}/i, @{$recur->{weeks}}) - { - for (0..6) # Work through the week - { + if (grep /$weeks{$week}/i, @{$recur->{weeks}}) { + for (0..6) { # Work through the week my $dt_day = $dt_week->clone->add(days => $_); # If today is past the endDate, quit. @@ -1029,8 +972,7 @@ sub getRecurrenceDates { my $today = $dayNames{lc $dt_day->day_name}; - if (grep /$today/i, @{$recur->{dayNames}}) - { + if (grep /$today/i, @{$recur->{dayNames}}) { ### Add date $date{$dt_day->strftime('%F')}++; } @@ -1046,12 +988,10 @@ sub getRecurrenceDates { } ### If last is selected - if (grep /last/, @{$recur->{weeks}}) - { + if (grep /last/, @{$recur->{weeks}}) { my $dt_last = $dt_month->clone->add(months => 1)->subtract(days => 1); - for (0..6) - { + for (0..6) { my $dt_day = $dt_last->clone->subtract(days => $_); # If today is past the endDate, try the next one @@ -1060,11 +1000,9 @@ sub getRecurrenceDates { my $today = $dayNames{lc $dt_day->day_name}; - if (grep /$today/i, @{$recur->{dayNames}}) - { + if (grep /$today/i, @{$recur->{dayNames}}) { ### Add date $date{$dt_day->strftime('%F')}++; - } # If occurrences is past the endAfter, quit @@ -1083,8 +1021,7 @@ sub getRecurrenceDates { $dt->add(years => $recur->{every})->truncate(to => "year"); # Test for quit - if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) - { + if (($recur->{endAfter} && keys %date >= $recur->{endAfter}) || ($dt_end && $dt > $dt_end)) { last RECURRENCE; } @@ -1120,52 +1057,42 @@ sub getRecurrenceFromForm { return () unless ($type && $type !~ /none/i); - if ($type eq "daily") - { - if (lc($form->param("recurSubType")) eq "weekday") - { + if ($type eq "daily") { + if (lc($form->param("recurSubType")) eq "weekday") { $recurrence{recurType} = "weekday"; } - else - { + else { $recurrence{recurType} = "daily"; } $recurrence{every} = $form->param("recurDay"); } - elsif ($type eq "weekly") - { + elsif ($type eq "weekly") { $recurrence{recurType} = "weekly"; $recurrence{dayNames} = [$form->param("recurWeekDay")]; $recurrence{every} = $form->param("recurWeek"); } - elsif ($type eq "monthly") - { - if (lc($form->param("recurSubType")) eq "monthweek") - { + elsif ($type eq "monthly") { + if (lc($form->param("recurSubType")) eq "monthweek") { $recurrence{recurType} = "monthWeek"; $recurrence{weeks} = [$form->param("recurMonthWeekNumber")]; $recurrence{dayNames} = [$form->param("recurMonthWeekDay")]; } - elsif (lc($form->param("recurSubType")) eq "monthday") - { + elsif (lc($form->param("recurSubType")) eq "monthday") { $recurrence{recurType} = "monthDay"; $recurrence{dayNumber} = $form->param("recurMonthDay"); } $recurrence{every} = $form->param("recurMonth"); } - elsif ($type eq "yearly") - { - if (lc($form->param("recurSubType")) eq "yearweek") - { + elsif ($type eq "yearly") { + if (lc($form->param("recurSubType")) eq "yearweek") { $recurrence{recurType} = "yearWeek"; $recurrence{weeks} = [$form->param("recurYearWeekNumber")]; $recurrence{dayNames} = [$form->param("recurYearWeekDay")]; $recurrence{months} = [$form->param("recurYearWeekMonth")]; } - elsif (lc($form->param("recurSubType")) eq "yearday") - { + elsif (lc($form->param("recurSubType")) eq "yearday") { $recurrence{recurType} = "yearDay"; $recurrence{dayNumber} = $form->param("recurYearDay"); $recurrence{months} = [$form->param("recurYearDayMonth")]; @@ -1177,12 +1104,10 @@ sub getRecurrenceFromForm { $recurrence{every} ||= 1; $recurrence{startDate} = $form->param("recurStart"); - if (lc $form->param("recurEndType") eq "date") - { + if (lc $form->param("recurEndType") eq "date") { $recurrence{endDate} = $form->param("recurEndDate"); } - elsif (lc $form->param("recurEndType") eq "after") - { + elsif (lc $form->param("recurEndType") eq "after") { $recurrence{endAfter} = $form->param("recurEndAfter"); } @@ -1201,8 +1126,7 @@ Gets the related links. =cut -sub getRelatedLinks -{ +sub getRelatedLinks { my $self = shift; return () unless $self->get("relatedLinks"); return split /\n+/, $self->get("relatedLinks"); @@ -1229,85 +1153,83 @@ sub getTemplateVars { my %var; # Some miscellaneous stuff - $var{"isPublic"} = 1 + $var{"isPublic"} = 1 if $self->get("groupIdView") eq "7"; - $var{"groupToView"} = $self->get("groupIdView"); # Todo: Remove this? + $var{"groupToView"} = $self->get("groupIdView"); # Todo: Remove this? # Start date/time my $dtStart = $self->getDateTimeStart; - $dtStart->set_locale($i18n->get("locale") || "en_US"); - $var{"startDateSecond"} = sprintf "%02d", $dtStart->second; - $var{"startDateMinute"} = sprintf "%02d", $dtStart->minute; - $var{"startDateHour24"} = $dtStart->hour; - $var{"startDateHour"} = $dtStart->hour_12; - $var{"startDateM"} = ( $dtStart->hour < 12 ? "AM" : "PM" ); - $var{"startDateDayName"} = $dtStart->day_name; - $var{"startDateDayAbbr"} = $dtStart->day_abbr; - $var{"startDateDayOfMonth"} = $dtStart->day_of_month; - $var{"startDateDayOfWeek"} = $dtStart->day_of_week; - $var{"startDateMonthName"} = $dtStart->month_name; - $var{"startDateMonthAbbr"} = $dtStart->month_abbr; - $var{"startDateYear"} = $dtStart->year; - $var{"startDateYmd"} = $dtStart->ymd; - $var{"startDateMdy"} = $dtStart->mdy; - $var{"startDateDmy"} = $dtStart->dmy; - $var{"startDateHms"} = $dtStart->hms; - $var{"startDateEpoch"} = $dtStart->epoch; + $var{ "startDateSecond" } = sprintf "%02d", $dtStart->second; + $var{ "startDateMinute" } = sprintf "%02d", $dtStart->minute; + $var{ "startDateHour24" } = $dtStart->hour; + $var{ "startDateHour" } = $dtStart->hour_12; + $var{ "startDateM" } = ( $dtStart->hour < 12 ? "AM" : "PM" ); + $var{ "startDateDayName" } = $dtStart->day_name; + $var{ "startDateDayAbbr" } = $dtStart->day_abbr; + $var{ "startDateDayOfMonth" } = $dtStart->day_of_month; + $var{ "startDateDayOfWeek" } = $dtStart->day_of_week; + $var{ "startDateMonthName" } = $dtStart->month_name; + $var{ "startDateMonthAbbr" } = $dtStart->month_abbr; + $var{ "startDateYear" } = $dtStart->year; + $var{ "startDateYmd" } = $dtStart->ymd; + $var{ "startDateMdy" } = $dtStart->mdy; + $var{ "startDateDmy" } = $dtStart->dmy; + $var{ "startDateHms" } = $dtStart->hms; + $var{ "startDateEpoch" } = $dtStart->epoch; # End date/time - my $dtEnd = $self->getDateTimeEnd; - $dtEnd->set_locale($i18n->get("locale") || "en_US"); + my $dtEnd = $self->getDateTimeEnd; - $var{"endDateSecond"} = sprintf "%02d", $dtEnd->second; - $var{"endDateMinute"} = sprintf "%02d", $dtEnd->minute; - $var{"endDateHour24"} = $dtEnd->hour; - $var{"endDateHour"} = $dtEnd->hour_12; - $var{"endDateM"} = ( $dtEnd->hour < 12 ? "AM" : "PM" ); - $var{"endDateDayName"} = $dtEnd->day_name; - $var{"endDateDayAbbr"} = $dtEnd->day_abbr; - $var{"endDateDayOfMonth"} = $dtEnd->day_of_month; - $var{"endDateDayOfWeek"} = $dtEnd->day_of_week; - $var{"endDateMonthName"} = $dtEnd->month_name; - $var{"endDateMonthAbbr"} = $dtEnd->month_abbr; - $var{"endDateYear"} = $dtEnd->year; - $var{"endDateYmd"} = $dtEnd->ymd; - $var{"endDateMdy"} = $dtEnd->mdy; - $var{"endDateDmy"} = $dtEnd->dmy; - $var{"endDateHms"} = $dtEnd->hms; - $var{"endDateEpoch"} = $dtEnd->epoch; - - - - $var{isAllDay} = $self->isAllDay; - $var{isOneDay} = 1 if ($var{isAllDay} && $var{startDateDmy} eq $var{endDateDmy}); + $var{ "endDateSecond" } = sprintf "%02d", $dtEnd->second; + $var{ "endDateMinute" } = sprintf "%02d", $dtEnd->minute; + $var{ "endDateHour24" } = $dtEnd->hour; + $var{ "endDateHour" } = $dtEnd->hour_12; + $var{ "endDateM" } = ( $dtEnd->hour < 12 ? "AM" : "PM" ); + $var{ "endDateDayName" } = $dtEnd->day_name; + $var{ "endDateDayAbbr" } = $dtEnd->day_abbr; + $var{ "endDateDayOfMonth" } = $dtEnd->day_of_month; + $var{ "endDateDayOfWeek" } = $dtEnd->day_of_week; + $var{ "endDateMonthName" } = $dtEnd->month_name; + $var{ "endDateMonthAbbr" } = $dtEnd->month_abbr; + $var{ "endDateYear" } = $dtEnd->year; + $var{ "endDateYmd" } = $dtEnd->ymd; + $var{ "endDateMdy" } = $dtEnd->mdy; + $var{ "endDateDmy" } = $dtEnd->dmy; + $var{ "endDateHms" } = $dtEnd->hms; + $var{ "endDateEpoch" } = $dtEnd->epoch; + $var{ "isAllDay" } = $self->isAllDay; + $var{ "isOneDay" } = $var{isAllDay} && $var{startDateDmy} eq $var{endDateDmy} + ? 1 : 0 + ; # Make a Friendly date span - $var{dateSpan} = $var{startDateDayName}.", " - . $var{startDateMonthName}." " - . $var{startDateDayOfMonth}." " - . ( !$var{isAllDay} ? $var{startDateHour}.":".$var{startDateMinute}." ".$var{startDateM} : "" ) - . ( !$var{isOneDay} ? - ' • ' - . $var{endDateDayName}.", " - .$var{endDateMonthName}." " - .$var{endDateDayOfMonth}." " - . ( !$var{isAllDay} ? $var{endDateHour}.":".$var{endDateMinute}." ".$var{endDateM} : "") - : ""); + $var{dateSpan} + = $var{startDateDayName}.", " + . $var{startDateMonthName}." " + . $var{startDateDayOfMonth}." " + . ( !$var{isAllDay} ? $var{startDateHour}.":".$var{startDateMinute}." ".$var{startDateM} : "" ) + . ( !$var{isOneDay} ? + ' • ' + . $var{endDateDayName}.", " + .$var{endDateMonthName}." " + .$var{endDateDayOfMonth}." " + . ( !$var{isAllDay} ? $var{endDateHour}.":".$var{endDateMinute}." ".$var{endDateM} : "") + : ""); # Make some friendly URLs - $var{"url"} = $self->getUrl; - $dtStart->truncate(to=>"day"); - $var{"urlDay"} = $self->getParent->getUrl("type=day;start=".$dtStart->toMysql); - $var{"urlWeek"} = $self->getParent->getUrl("type=week;start=".$dtStart->toMysql); - $var{"urlMonth"} = $self->getParent->getUrl("type=month;start=".$dtStart->toMysql); - $var{"urlParent"} = $self->getParent->getUrl; + my $urlStartParam = $dtStart->cloneToUserTimeZone->truncate(to => "day"); + $var{ "url" } = $self->getUrl; + $var{ "urlDay" } = $self->getParent->getUrl("type=day;start=".$urlStartParam); + $var{ "urlWeek" } = $self->getParent->getUrl("type=week;start=".$urlStartParam); + $var{ "urlMonth" } = $self->getParent->getUrl("type=month;start=".$urlStartParam); + $var{ "urlParent" } = $self->getParent->getUrl; $var{"urlSearch"} = $self->getParent->getSearchUrl; # Related links - $var{"relatedLinks"} = []; + $var{ "relatedLinks" } = []; push @{$var{"relatedLinks"}}, { "linkUrl" => $_ } for ($self->getRelatedLinks); @@ -1348,30 +1270,25 @@ If the "print" form parameter is set, will prepare the print template. =cut -sub prepareView -{ +sub prepareView { my $self = shift; - my $parent = $self->getParent; + my $parent = $self->getParent; my $templateId; - if ($parent) - { - if ($self->session->form->param("print")) - { - $templateId = $parent->get("templateIdPrintEvent"); + if ($parent) { + if ($self->session->form->param("print")) { + $templateId = $parent->get("templateIdPrintEvent"); $self->session->style->makePrintable(1); } - else - { - $templateId = $parent->get("templateIdEvent"); + else { + $templateId = $parent->get("templateIdEvent"); } } - else - { - $templateId = "CalendarEvent000000001"; + else { + $templateId = "CalendarEvent000000001"; } - my $template = WebGUI::Asset::Template->new($self->session,$templateId); + my $template = WebGUI::Asset::Template->new($self->session,$templateId); $template->prepare; $self->{_viewTemplate} = $template; @@ -1427,7 +1344,7 @@ sub processPropertiesFromFormPost { } - ### Form is verified, fix properties + ### Form is verified # Events are always hidden from navigation $self->update({ isHidden => 1 }); @@ -1446,16 +1363,17 @@ sub processPropertiesFromFormPost { groupIdEdit => $groupIdEdit, }); } - + # Fix times according to input (allday, timezone) + # All day events have no time if ($form->param("allday")) { $self->update({ startTime => undef, endTime => undef, }); } + # Non-allday events need timezone conversion else { - # Convert timezone my $tz = $self->session->user->profileField("timeZone"); my $dtStart @@ -1495,11 +1413,15 @@ sub processPropertiesFromFormPost { # Delete all old events and create new ones my $old_id = $self->get("recurId"); - my $new_id = $self->generateRecurringEvents(\%recurrence_new); + # Set the new recurrence pattern + my $new_id = $self->setRecurrence(\%recurrence_new); return ["There is something wrong with your recurrence pattern."] unless $new_id; - - ## Delete old events + + # Generate the new recurring events + $self->generateRecurringEvents(); + + # Delete old events my $events = $self->getLineage(["siblings"], { returnObjects => 1, includeOnlyClasses => ['WebGUI::Asset::Event'], @@ -1509,14 +1431,10 @@ sub processPropertiesFromFormPost { $_->purge for @$events; } - # Include / exclude keys - #elsif () - #{ - # # Delete / create necessary events - # - #} - # No change else { + # TODO: Give users a form property to decide what events to update + # TODO: Make a workflow activity to do this, so that updating + # 1 million events doesn't kill the server. # Just update related events my %properties = %{ $self->get }; delete $properties{startDate}; @@ -1534,8 +1452,8 @@ sub processPropertiesFromFormPost { my $event = WebGUI::Asset->newByDynamicClass($session,$eventId); # Add a revision - $properties{startDate} = $event->get("startDate"); - $properties{endDate} = $event->get("endDate"); + $properties{ startDate } = $event->get("startDate"); + $properties{ endDate } = $event->get("endDate"); # addRevision returns the new revision $event = $event->addRevision(\%properties); @@ -1566,46 +1484,39 @@ Returns the ID of the row if success, otherwise returns 0. =cut -sub setRecurrence -{ +sub setRecurrence { my $self = shift; my $vars = shift; my $type = $vars->{recurType} || return; my $pattern; - if ($type eq "daily" || $type eq "weekday") - { + if ($type eq "daily" || $type eq "weekday") { return 0 unless ($vars->{every}); #(\d+) $pattern = $vars->{every}; } - elsif ($type eq "weekly") - { + elsif ($type eq "weekly") { return 0 unless ($vars->{every} && $vars->{dayNames}); #(\d+) ([umtwrfs]+) $pattern = $vars->{every}." ".join("",@{$vars->{dayNames}}); } - elsif ($type eq "monthWeek") - { + elsif ($type eq "monthWeek") { return 0 unless ($vars->{every} && $vars->{weeks} && $vars->{dayNames}); #(\d+) (first,second,third,fourth,last) ([umtwrfs]+) $pattern = $vars->{every}." ".join(",",@{$vars->{weeks}})." ".join("",@{$vars->{dayNames}}); } - elsif ($type eq "monthDay") - { + elsif ($type eq "monthDay") { return 0 unless ($vars->{every} && $vars->{dayNumber}); #(\d+) on (\d+) $pattern = $vars->{every}." ".$vars->{dayNumber}; } - elsif ($type eq "yearWeek") - { + elsif ($type eq "yearWeek") { return 0 unless ($vars->{every} && $vars->{weeks} && $vars->{dayNames} && $vars->{months}); #(\d+) (first,second,third,fourth,last) ([umtwrfs]+)? (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec) $pattern = $vars->{every}." ".join(",",@{$vars->{weeks}})." ".join("",@{$vars->{dayNames}})." ".join(",",@{$vars->{months}}); } - elsif ($type eq "yearDay") - { + elsif ($type eq "yearDay") { return 0 unless ($vars->{every} && $vars->{dayNumber} && $vars->{months}); #(\d+) on (\d+) (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec) $pattern = $vars->{every}." ".$vars->{dayNumber}." ".join(",",@{$vars->{months}}); @@ -1613,22 +1524,20 @@ sub setRecurrence my $end = undef; - if ($vars->{endAfter}) - { + if ($vars->{endAfter}) { $end = "after ".$vars->{endAfter}; } - elsif ($vars->{endDate}) - { + elsif ($vars->{endDate}) { $end = $vars->{endDate}; } my $data = { - recurId => "new", - recurType => $type, - pattern => $pattern, - startDate => $vars->{startDate}, - endDate => $end, + recurId => "new", + recurType => $type, + pattern => $pattern, + startDate => $vars->{startDate}, + endDate => $end, }; ## Set to the database @@ -1648,10 +1557,9 @@ Sets the event's related links. =cut -sub setRelatedLinks -{ +sub setRelatedLinks { my $self = shift; - my @links = @_; + my @links = @_; $self->update({ relatedLinks => join("\n", @links), @@ -1670,27 +1578,26 @@ Returns the template to be viewed. =cut -sub view -{ - my $self = shift; - my $session = $self->session; +sub view { + my $self = shift; + my $session = $self->session; # Get, of course, the event data - my $var = $self->get; + my $var = $self->get; # Get some more template vars - my %dates = $self->getTemplateVars; - $var->{$_} = $dates{$_} for keys %dates; + my %dates = $self->getTemplateVars; + $var->{$_} = $dates{$_} for keys %dates; # Next and previous events - my $next = $self->getEventNext; - $var->{"nextUrl"} = $next->getUrl + my $next = $self->getEventNext; + $var->{"nextUrl"} = $next->getUrl if ($next); - my $prev = $self->getEventPrev; - $var->{"prevUrl"} = $prev->getUrl + my $prev = $self->getEventPrev; + $var->{"prevUrl"} = $prev->getUrl if ($prev); @@ -1710,8 +1617,7 @@ Edit the event. =cut # Author's note: This sub is ugly and should be reformatted according to PBP -sub www_edit -{ +sub www_edit { my $self = shift; my $session = $self->session; my $form = $self->session->form; @@ -1721,22 +1627,19 @@ sub www_edit return $self->session->privilege->noAccess() unless $self->getParent->canAddEvent(); - if ($func eq "add" || $form->param("assetId") eq "new") - { - $var->{"formHeader"} = WebGUI::Form::formHeader($session, - { - action => $self->getParent->getUrl, - }) - . WebGUI::Form::hidden($self->session, - { - name =>"assetId", - value =>"new", - }) - . WebGUI::Form::hidden($self->session, - { - name =>"class", - value =>$self->session->form->process("class","className") - }); + if ($func eq "add" || $form->param("assetId") eq "new") { + $var->{"formHeader"} + = WebGUI::Form::formHeader($session, { + action => $self->getParent->getUrl, + }) + . WebGUI::Form::hidden($self->session, { + name => "assetId", + value => "new", + }) + . WebGUI::Form::hidden($self->session, { + name => "class", + value => $self->session->form->process("class","className"), + }); } else { $var->{"formHeader"} @@ -1745,27 +1648,26 @@ sub www_edit }); } - $var->{"formHeader"} .= WebGUI::Form::hidden($self->session, - { - name => "func", - value => "editSave" - }) - . WebGUI::Form::hidden($self->session, - { - name => "recurId", - value => $self->get("recurId"), - }); + $var->{"formHeader"} + .= WebGUI::Form::hidden($self->session, { + name => "func", + value => "editSave" + }) + . WebGUI::Form::hidden($self->session, { + name => "recurId", + value => $self->get("recurId"), + }); - $var->{"formFooter"} = WebGUI::Form::formFooter($session); + $var->{"formFooter"} = WebGUI::Form::formFooter($session); ###### Event Tab # title AS long title - $var->{"formTitle"} = WebGUI::Form::text($session, - { - name => "title", - value => $form->process("title") || $self->get("title"), - }); + $var->{"formTitle"} + = WebGUI::Form::text($session, { + name => "title", + value => $form->process("title") || $self->get("title"), + }); # menu title AS short title $var->{"formMenuTitle"} @@ -1779,16 +1681,16 @@ sub www_edit # location $var->{"formLocation"} = WebGUI::Form::text($session, { - name => "location", - value => $form->process("location") || $self->get("location"), + name => "location", + value => $form->process("location") || $self->get("location"), }); # description - $var->{"formDescription"}= WebGUI::Form::HTMLArea($session, - { - name => "description", - value => $form->process("description") || $self->get("description"), - }); + $var->{"formDescription"} + = WebGUI::Form::HTMLArea($session, { + name => "description", + value => $form->process("description") || $self->get("description"), + }); ### Start date my $default_start; @@ -1865,38 +1767,38 @@ sub www_edit : $self->isAllDay ; - $var->{"formTime"} = - q| + $var->{"formTime"} + = q|
+ . (!$allday ? 'checked="checked"' : '') + . q| />
| - .q|Start: |.$var->{"formStartTime"} - .q|
End: |.$var->{"formEndTime"} - .q|
|; + . q|Start: |.$var->{"formStartTime"} + . q|
End: |.$var->{"formEndTime"} + . q||; # related links - $var->{"formRelatedLinks"} = WebGUI::Form::textarea($session, - { - name => "relatedLinks", - value => $form->process("relatedLinks") || $self->get("relatedLinks"), - }); + $var->{"formRelatedLinks"} + = WebGUI::Form::textarea($session, { + name => "relatedLinks", + value => $form->process("relatedLinks") || $self->get("relatedLinks"), + }); ###### Recurrence tab # Pattern - my %recur = $self->getRecurrenceFromForm || $self->getRecurrence; - $recur{every} ||= 1; + my %recur = $self->getRecurrenceFromForm || $self->getRecurrence; + $recur{every} ||= 1; - $var->{"formRecurPattern"} = - q| + $var->{"formRecurPattern"} + = q|

@@ -2026,15 +1928,16 @@ sub www_edit # Start - $var->{"formRecurStart"} = WebGUI::Form::date($session, - { - name => "recurStart", - value => $recur{startDate}, - defaultValue => $self->get("startDate"), - }); + $var->{"formRecurStart"} + = WebGUI::Form::date($session, { + name => "recurStart", + value => $recur{startDate}, + defaultValue => $self->get("startDate"), + }); # End - $var->{"formRecurEnd"} = q| + $var->{"formRecurEnd"} + = q|

@@ -2060,30 +1963,28 @@ sub www_edit # Add button - $var->{"formSave"} = WebGUI::Form::submit($session, - { - name => "save", - value => "save", - }); + $var->{"formSave"} + = WebGUI::Form::submit($session, { + name => "save", + value => "save", + }); + # Cancel button - $var->{"formCancel"} = WebGUI::Form::button($session, - { - name => "cancel", - value => "cancel", - extras => 'onClick="window.history.go(-1)"', - }); + $var->{"formCancel"} + = WebGUI::Form::button($session, { + name => "cancel", + value => "cancel", + extras => 'onClick="window.history.go(-1)"', + }); $var->{"formFooter"} .= <<'ENDJS';