%# BEGIN LICENSE BLOCK; %# %# Copyright (c) 1996-2003 Jesse Vincent %# %# (Except where explictly superceded by other copyright notices) %# %# This work is made available to you under the terms of Version 2 of %# the GNU General Public License. A copy of that license should have %# been provided with this software, but in any event can be snarfed %# from www.gnu.org. %# %# This work is distributed in the hope that it will be useful, but %# WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU %# General Public License for more details. %# %# Unless otherwise specified, all modifications, corrections or %# extensions to this work which alter its source code become the %# property of Best Practical Solutions, LLC when submitted for %# inclusion in the work. %# %# %# END LICENSE BLOCK <%ARGS> $Name => undef $Attr => undef <%perl> return ColumnMap($Name, $Attr); <%INIT> our ( $COLUMN_MAP, $CUSTOM_FIELD_MAP ); sub ColumnMap { my $name = shift; my $attr = shift; # First deal with the simple things from the map if ( $COLUMN_MAP->{$name} ) { return ( $COLUMN_MAP->{$name}->{$attr} ); } # now, let's deal with harder things, like Custom Fields elsif ( $name =~ /^(?:CF|CustomField).(.*)$/ ) { my $field = $1; my $cf; if ( $CUSTOM_FIELD_MAP->{$field} ) { $cf = $CUSTOM_FIELD_MAP->{$field}; } else { $cf = RT::CustomField->new( $session{'CurrentUser'} ); if ( $field =~ /^(.+?)\.{(.+)}$/ ) { $cf->LoadByNameAndQueue( Queue => $1, Name => $2 ); } else { $field = $1 if $field =~ /^{(.+)}$/; # trim { } $cf->LoadByNameAndQueue( Queue => "0", Name => $field ); } $CUSTOM_FIELD_MAP->{$field} = $cf if ( $cf->id ); } unless ( $cf->id ) { return undef; } if ( $attr eq 'attribute' ) { return (undef); } elsif ( $attr eq 'title' ) { return ( $cf->Name ); } elsif ( $attr eq 'value' ) { my $value = eval "sub { my \$values = \$_[0]->CustomFieldValues('" . $cf->id . "'); return ( join( ', ', map { \$_->Content } \@{ \$values->ItemsArrayRef } )) }" || die $@; return ($value); } } } $COLUMN_MAP = { QueueName => { attribute => 'Queue', title => 'Queue', value => sub { return $_[0]->QueueObj->Name } }, OwnerName => { title => 'Owner', attribute => 'Owner', value => sub { return $_[0]->OwnerObj->Name } }, id => { attribute => 'id', align => 'right', value => sub { return $_[0]->id } }, Status => { attribute => 'Status', value => sub { return $_[0]->Status } }, Subject => { attribute => 'Subject', value => sub { return $_[0]->Subject || "(" . loc('No subject') . ")" } }, ExtendedStatus => { title => 'Status', attribute => 'Status', value => sub { my $Ticket = shift; if ( $Ticket->HasUnresolvedDependencies ) { if ( $Ticket->HasUnresolvedDependencies( Type => 'approval' ) or $Ticket->HasUnresolvedDependencies( Type => 'code' ) ) { return "" . loc('(pending approval)') . ""; } else { return "" . loc('(pending other Collection)') . ""; } } else { return loc( $Ticket->Status ); } } }, Priority => { attribute => 'Priority', value => sub { return $_[0]->Priority } }, InitialPriority => { attribute => 'InitialPriority', value => sub { return $_[0]->InitialPriority } }, FinalPriority => { attribute => 'FinalPriority', value => sub { return $_[0]->FinalPriority } }, EffectiveId => { attribute => 'EffectiveId', value => sub { return $_[0]->EffectiveId } }, Type => { attribute => 'Type', value => sub { return $_[0]->Type } }, TimeWorked => { attribute => 'TimeWorked', value => sub { return $_[0]->TimeWorked } }, TimeLeft => { attribute => 'TimeLeft', value => sub { return $_[0]->TimeLeft } }, TimeEstimated => { attribute => 'TimeEstimated', value => sub { return $_[0]->TimeEstimated } }, Requestors => { value => sub { return $_[0]->Requestors->MemberEmailAddressesAsString } }, Cc => { value => sub { return $_[0]->Cc->MemberEmailAddressesAsString } }, AdminCc => { value => sub { return $_[0]->AdminCc->MemberEmailAddressesAsString } }, StartsRelative => { title => 'Starts', attribute => 'Starts', value => sub { return $_[0]->StartsObj->AgeAsString } }, StartedRelative => { title => 'Started', attribute => 'Started', value => sub { return $_[0]->StartedObj->AgeAsString } }, CreatedRelative => { title => 'Created', attribute => 'Created', value => sub { return $_[0]->CreatedObj->AgeAsString } }, LastUpdatedRelative => { title => 'LastUpdated', attribute => 'LastUpdated', value => sub { return $_[0]->LastUpdatedObj->AgeAsString } }, ToldRelative => { title => 'Told', attribute => 'Told', value => sub { return $_[0]->ToldObj->AgeAsString } }, DueRelative => { title => 'Due', attribute => 'Due', value => sub { my $date = $_[0]->DueObj; if ($date && $date->Unix > 0 && $date->Unix < time()) { return '' . $date->AgeAsString . ''; } else { return $date->AgeAsString; } } }, ResolvedRelative => { title => 'Resolved', attribute => 'Resolved', value => sub { return $_[0]->ResolvedObj->AgeAsString } }, Starts => { attribute => 'Starts', value => sub { return $_[0]->StartsObj->AsString } }, Started => { attribute => 'Started', value => sub { return $_[0]->StartedObj->AsString } }, Created => { attribute => 'Created', value => sub { return $_[0]->CreatedObj->AsString } }, CreatedBy => { attribute => 'CreatedBy', value => sub { return $_[0]->CreatorObj->Name } }, LastUpdated => { attribute => 'LastUpdated', value => sub { return $_[0]->LastUpdatedObj->AsString } }, LastUpdatedBy => { attribute => 'LastUpdatedBy', value => sub { return $_[0]->LastUpdatedByObj->Name } }, Told => { attribute => 'Told', value => sub { return $_[0]->ToldObj->AsString } }, Due => { attribute => 'Due', value => sub { return $_[0]->DueObj->AsString } }, Resolved => { attribute => 'Resolved', value => sub { return $_[0]->ResolvedObj->AsString } }, DependedOnBy => { value => sub { my $links = $_[0]->DependedOnBy; return ( join( "
", map { '' . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base ) . '' } @{ $links->ItemsArrayRef } ) ); } }, Members => { value => sub { my $links = $_[0]->Members; return ( join( "
", map { '' . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base ) . '' } @{ $links->ItemsArrayRef } ) ); } }, Children => { value => sub { my $links = $_[0]->Members; return ( join( "
", map { '' . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base ) . '' } @{ $links->ItemsArrayRef } ) ); } }, ReferredToBy => { value => sub { my $links = $_[0]->ReferredToBy; return ( join( "
", map { '' . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base ) . '' } @{ $links->ItemsArrayRef } ) ); } }, DependsOn => { value => sub { my $links = $_[0]->DependsOn; return ( join( "
", map { '' . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target ) . '' } @{ $links->ItemsArrayRef } ) ); } }, MemberOf => { value => sub { my $links = $_[0]->MemberOf; return ( join( "
", map { '' . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target ) . '' } @{ $links->ItemsArrayRef } ) ); } }, Parents => { value => sub { my $links = $_[0]->MemberOf; return ( join( "
", map { '' . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target ) . '' } @{ $links->ItemsArrayRef } ) ); } }, RefersTo => { value => sub { my $links = $_[0]->RefersTo; return ( join( "
", map { '' . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target ) . '' } @{ $links->ItemsArrayRef } ) ); } }, '_CLASS' => { value => sub { return $_[1] % 2 ? 'oddline' : 'evenline' } }, }; # }}} $m->comp( '/Elements/Callback', COLUMN_MAP => $COLUMN_MAP, _CallbackName => 'ColumnMap');