<%args> $Month => (localtime)[4] $Year => (localtime)[5] + 1900 $Query => undef $Format => undef $Order => undef $OrderBy => undef $RowsPerPage => undef $NewQuery => 0 $WeekDay => undef $WeekMonth => undef $WeekYear => undef $OrigMonth => undef $OrigYear => undef $Embed => undef $DayDisplay => undef @DayDisplayArgs => () % my $title; % if ( $WeekMonth ) { % if ( $start->month == $end->month ) { % $title = $rtdate->GetMonth( $start->month -1 ). ' '. % $start->day. '-'. $end->day. ', '. $start->year; % } elsif ( $start->year == $end->year ) { % $title = % $rtdate->GetMonth( $start->month -1 ). ' '. $start->day. ' - '. % $rtdate->GetMonth( $end->month -1 ). ' '. $end->day. ', '. $end->year; % } else { % $title = % $rtdate->GetMonth( $start->month -1 ).' '.$start->day.', '.$start->year. % ' - '. % $rtdate->GetMonth( $end->month -1 ). ' '.$end->day. ', '. $end->year; % } % } else { % $title = $rtdate->GetMonth($Month) . " $Year" % } % unless ( $Embed ) { <& /Elements/Header, Title => $title &> <& /Elements/Tabs &> % } <&| /Widgets/TitleBox, title => loc('Calendar for '). $title, title_class=> 'inverse', color => "#993333" &> % my($PMonth, $PYear, $NMonth, $NYear); % unless ( $WeekDay ) {
% ($PMonth, $PYear) = ($Month - 1, $Year); % if ($PMonth < 0) { % $PYear--; % $PMonth = 11; % } «<%$rtdate->GetMonth($PMonth)%> <% $rtdate->GetMonth($Month). " $Year" %> % ($NMonth, $NYear) = ($Month + 1, $Year); % if ($NMonth > 11) { % $NYear++; % $NMonth = 0; % } <%$rtdate->GetMonth($NMonth)%>»
% } % for ( @{$week{$weekstart}} ) { % } % if ( $WeekDay ) { % } else { <& td_week_expand, date=>$start, Month=>$Month, Year=>$Year, QueryString=>$QueryString, Embed=>$Embed, &> % } % if ( $WeekDay ) { % my $date = $start; % while ($date <= $end) { % % my $is_today = (DateTime->compare($today, $date) == 0); % my $is_yesterday = (DateTime->compare($yesterday, $date) == 0); % my $is_aweekago = (DateTime->compare($aweekago, $date) == 0); % $date = $set->next($date); % if ( $date->day_of_week == $startday_of_week ) { % if ( $date <= $end ) { #a second week? not going to work for week view yet % } % } % } #while ($date <= $end) % my $sday = 0; % my @slots = ( [], [], [], [], [], [], [] ); % foreach my $row ( @week_rows ) { <& td_time, $row &> % $date = $start; % $sday = 0; % while ($date <= $end) { % % my $is_today = (DateTime->compare($today, $date) == 0); % my $is_yesterday = (DateTime->compare($yesterday, $date) == 0); % my $is_aweekago = (DateTime->compare($aweekago, $date) == 0); %# % } else { % % foreach my $slot ( @{ $slots[$sday] } ) { % my( $id, $ticket ) = @$slot; % } % % if ( scalar(@{$slots[$sday]}) < $slots ) { % } % % } % $date = $set->next($date); % if ( $date->day_of_week == $startday_of_week ) { % if ( $date <= $end ) { #a second week? not going to work for week view yet % } % } % % $sday++; % } #while ($date <= $end) % } #foreach my $row ( @week_rows ) % % } else { % % my $date = $start; % while ($date <= $end) { % % my $offmonth = !$WeekDay && $date->month != ($Month + 1); % my $is_today = (DateTime->compare($today, $date) == 0); % my $is_yesterday = (DateTime->compare($yesterday, $date) == 0); % my $is_aweekago = (DateTime->compare($aweekago, $date) == 0); % $date = $set->next($date); % if ( $date->day_of_week == $startday_of_week ) { % if ( $date <= $end ) { <& td_week_expand, date=>$date, Month=>$Month, Year=>$Year, QueryString=>$QueryString, Embed=>$Embed, &> % } % } % } #while ($date <= $end) % }
>><%$rtdate->GetWeekday($_)%>
valign="middle"> <& week_collapse, date=>$start, Month=>$OrigMonth, Year=>$OrigYear, QueryString=>$QueryString, Embed=>$Embed, &> class="weekly <% $is_today ? 'today' : $is_yesterday ? 'yesterday' : $is_aweekago ? 'aweekago' : '' %>" >
<% $rtdate->GetMonth($date->month-1). ' '. $date->day %>
valign="middle"> <& week_collapse, date=>$date, Month=>$OrigMonth, Year=>$OrigYear, QueryString=>$QueryString, Embed=>$Embed, &>
%# class="<% $is_today ? 'today' %# : $is_yesterday ? 'yesterday' %# : $is_aweekago ? 'aweekago' %# : '' %# %>" %# > % #XXX display these in a time aware fashion %#% my $sp = 3; %#% for my $t ( @{ $Tickets{$date->strftime("%F")} } ) { %#% $sp--; %# <& /Elements/CalendarEvent, Object => $t, Date => $date, DateTypes => \%DateTypes &> %#% } %# <% ($sp>0) ? '
'x$sp : '' |n %> % for my $t ( @{ $Tickets{$date->strftime("%F")} } ) { % % #XXX off by 1h on daylight savings boundaries... two sundays a year % my $starts = ($t->StartsObj->Unix - $t->StartsObj->SetToMidnight(Timezone=>'user'))/60; % % if ( $starts >= $row && $starts < ($row + $timestep) ) { % #then we're a new entry, find a slot for us % my $s = 0; % while ( ref($slots[$sday]->[$s]) ) { $s++ } % $slots[$sday]->[$s] = [ $t->Id, $t ]; % } % % #XXX also off by 1h on daylight savings boundaries % my $due = $t->DueObj->Unix - $t->DueObj->SetToMidnight; % % if ( $due <= $row && $due > ($row + $timestep ) ) { % #then find our slot and remove us % @{ $slots[$sday] } = % map { (!ref($_) || $_->[0] != $t->Id) ? $_ : '' } % @{ $slots[$sday] }; % } % % } % % pop @{ $slots[$sday] } while @{ $slots[$sday] } && !ref($slots[$sday]->[-1]); % % #now display: % % if ( scalar(@{$slots[$sday]}) > $slots ) { % #overflow situation, eek... could be handled better, how?
class="weekly <% $is_today ? 'today' : $is_yesterday ? 'yesterday' : $is_aweekago ? 'aweekago' : '' %>" >MULTIPLE <% $id %> class="weekly <% $is_today ? 'today' : $is_yesterday ? 'yesterday' : $is_aweekago ? 'aweekago' : '' %>" >
valign="middle"> <& week_collapse, date=>$date, Month=>$OrigMonth, Year=>$OrigYear, QueryString=>$QueryString, Embed=>$Embed, &>
<% $date->day %>
% if ( defined($DayDisplay) && $DayDisplay =~ /^(\w+)$/ ) { % % my $el = "/Elements/CalendarDay$1"; <& $el, Tickets => $Tickets{$date->strftime("%F")}, Date => $date, DateTypes => \%DateTypes, @DayDisplayArgs, &> % % } else { % % my $sp = 3; % for my $t ( @{ $Tickets{$date->strftime("%F")} } ) { % $sp--; <& /Elements/CalendarEvent, Object => $t, Date => $date, DateTypes => \%DateTypes &> % } <% ($sp>0) ? '
'x$sp : '' |n %> % % }
% unless ( $WeekDay ) {
«<%$rtdate->GetMonth($PMonth)%>
% my $year = (localtime)[5] + 1900; %# <& /Elements/Submit&>
<%$rtdate->GetMonth($NMonth)%>»
% } % unless ( $Embed ) { % foreach my $legend (keys %legend) { % }

Calendar Preferences and Help
% my $more = 0; % foreach ( @{$legend{$legend}} ) { <% $more++ ? ', ' : '' %> <&|/l&><% $_ %> % }
% } <%ONCE> my %legend = ( 'created' => ['Created'], 'due' => ['Due'], 'resolved' => ['Resolved'], 'updated' => ['Last Updated'], 'created_due' => ['Created','Due'], 'reminder' => ['Reminders'], 'started' => ['Started'], 'starts_due' => ['Starts','Due'], ); my $stime = RT->Config->Get('CalendarWeeklyStartMin'); $stime = 480 unless $stime =~ /^\d+$/; #8am my $etime = RT->Config->Get('CalendarWeeklyEndMin'); $etime = 1080 unless $etime =~ /^\d+$/; #6pm my $timestep = RT->Config->Get('CalendarWeeklySizeMin') || 30; #1/2h my $rowspan = ($etime-$stime) / $timestep; my $slots = RT->Config->Get('CalendarWeeklySlots') || 5; my $wt = $stime; my @week_rows = (); while ( $wt < $etime ) { push @week_rows, $wt; $wt+=$timestep } <%INIT> use RTx::Calendar qw(FirstDay LastDay LastDayOfWeek); $Embed =~ /^[\w\.]+$/ or die 'xss'; my $title = loc("Calendar"); my @DateTypes = qw/Created Starts Started Due LastUpdated Resolved/; my $rtdate = RT::Date->new($session{'CurrentUser'}); my $time_zone = $session{'CurrentUser'}->UserObj->Timezone || RT->Config->Get('Timezone'); my $weekstart = 'Sunday'; #RT::SiteConfig? user pref? my %week = ( 'Saturday' => [6,0..5], 'Sunday' => [0..6], 'Monday' => [1..6,0], ); my $startday_of_week = ${$week{$weekstart}}[0] || 7; my $endday_of_week = ${$week{$weekstart}}[-1] || 7; my $today = DateTime->today( time_zone=>$time_zone ); my $yesterday = $today->clone->subtract( days=>1 ); my $aweekago = $today->clone->subtract( days=>7 ); my( $start, $end ); if ( $WeekDay ) { $start = DateTime->new( year => $WeekYear, month => $WeekMonth+1, day => $WeekDay, time_zone => $time_zone, ); $end = LastDayOfWeek( $WeekYear, $WeekMonth+1, $WeekDay, $endday_of_week ); } else { $start = FirstDay($Year, $Month + 1, $startday_of_week ); $end = LastDay ($Year, $Month + 1, $endday_of_week ); } # use this to loop over days until $end my $set = DateTime::Set->from_recurrence( next => sub { $_[0]->truncate( to => 'day' )->add( days => 1 ) } ); my $QueryString; if ($Query) { $QueryString = $m->comp( '/Elements/QueryString', Query => $Query, Format => $Format, Order => $Order, OrderBy => $OrderBy, Rows => $RowsPerPage, @DayDisplayArgs, ); } else { $QueryString = $m->comp( '/Elements/QueryString', NewQuery => 1, @DayDisplayArgs, ); } # Default Query and Format my $TempFormat = "__Starts__ __Due__"; my $TempQuery = "( Status = 'new' OR Status = 'open' OR Status = 'stalled') AND ( Owner = '" . $session{CurrentUser}->Id ."' OR Owner = 'Nobody' ) AND ( Type = 'reminder' OR 'Type' = 'ticket' )"; if ( my $Search = RTx::Calendar::SearchDefaultCalendar($session{CurrentUser}) ) { $TempFormat = $Search->SubValue('Format'); $TempQuery = $Search->SubValue('Query'); } # we overide them if needed $TempQuery = $Query if $Query; $TempFormat = $Format if $Format; # we search all date types in Format string my @Dates = grep { $TempFormat =~ m/__${_}(Relative)?__/ } @DateTypes; # used to display or not a date in Element/CalendarEvent my %DateTypes = map { $_ => 1 } @Dates; $TempQuery .= RTx::Calendar::DatesClauses(\@Dates, $start->strftime("%F"), $end->strftime("%F")); # print STDERR ("-" x 30), "\n", $TempQuery, "\n"; my %Tickets = RTx::Calendar::FindTickets($session{'CurrentUser'}, $TempQuery, \@Dates, $start->strftime("%F"), $end->strftime("%F")); <%def td_week_expand> <%args> $date => undef $Month => undef $Year => undef $QueryString => undef $Embed => undef <%def week_collapse> <%args> $date => undef $Month => undef $Year => undef $QueryString => undef $Embed => undef <%def td_time> % my( $min ) = shift; <% pretty_time($min) |n %> <%init> sub pretty_time { my $t = shift; return 'Midnight' if $t == 0 || $t == 1440; return 'Noon' if $t == 720; my $h = int( $t / 60 ); my $m = $t % 60; my $ap = 'AM'; if ( $h == 0 || $h == 24 ) { $h = 12; } elsif ( $h == 12 ) { $ap = 'PM'; } elsif ( $h > 12 ) { $ap = 'PM'; $h -= 12; } sprintf('%02d:%02d '.$ap, $h, $m); }