%# BEGIN BPS TAGGED BLOCK {{{ %# %# COPYRIGHT: %# %# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC %# %# %# (Except where explicitly superseded by other copyright notices) %# %# %# LICENSE: %# %# 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. %# %# You should have received a copy of the GNU General Public License %# along with this program; if not, write to the Free Software %# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA %# 02110-1301 or visit their web page on the internet at %# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. %# %# %# CONTRIBUTION SUBMISSION POLICY: %# %# (The following paragraph is not intended to limit the rights granted %# to you to modify and distribute this software under the terms of %# the GNU General Public License and is only of importance to you if %# you choose to contribute your changes and enhancements to the %# community by submitting them to Best Practical Solutions, LLC.) %# %# By intentionally submitting any modifications, corrections or %# derivatives to this work, or any other work intended for use with %# Request Tracker, to Best Practical Solutions, LLC, you confirm that %# you are the copyright holder for those contributions and you grant %# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, %# royalty-free, perpetual, license to use, copy, create derivative %# works based on those contributions, and sublicense and distribute %# those contributions and any derivatives thereof. %# %# END BPS TAGGED BLOCK }}} <%ARGS> $Name => undef $Attr => undef $GenericMap => {} <%ONCE> my $COLUMN_MAP; my $LinkCallback = sub { my $method = shift; my $mode = $RT::Link::TYPEMAP{$method}{Mode}; my $type = $RT::Link::TYPEMAP{$method}{Type}; my $other_mode = ($mode eq "Target" ? "Base" : "Target"); my $mode_uri = $mode.'URI'; return sub { my $ObjectType = $_[2]||''; map { \'', ( $_->$mode_uri->AsString ), \'
', } # if someone says __RefersTo.{Ticket}__ filter for only local links that are tickets grep { $ObjectType ? ( $_->$mode_uri->IsLocal && ( $_->$mode_uri->Object->RecordType eq $ObjectType )) : 1 } @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef } } }; my $trustSub = sub { my $user = shift; my %key = RT::Crypt->GetKeyInfo( Key => $user->EmailAddress ); if (!defined $key{'info'}) { return $m->interp->apply_escapes(' ' . loc("(no pubkey!)"), "h"); } elsif ($key{'info'}{'TrustLevel'} == 0) { return $m->interp->apply_escapes(' ' . loc("(untrusted!)"), "h"); } }; $COLUMN_MAP = { Queue => { attribute => 'Queue', title => 'Queue id', # loc value => sub { return $_[0]->Queue } }, QueueName => { attribute => 'Queue', title => 'Queue', # loc value => sub { return $_[0]->QueueObj->Name } }, OwnerName => { title => 'Owner', # loc attribute => 'Owner', value => sub { return $_[0]->OwnerObj->Name } }, Status => { title => 'Status', # loc attribute => 'Status', value => sub { return loc($_[0]->Status) } }, Subject => { title => 'Subject', # loc attribute => 'Subject', value => sub { return $_[0]->Subject || "(" . loc('No subject') . ")" } }, ExtendedStatus => { title => 'Status', # loc attribute => 'Status', value => sub { my $Ticket = shift; if ( my $count = $Ticket->HasUnresolvedDependencies ) { if ( $Ticket->HasUnresolvedDependencies( Type => 'approval' ) or $Ticket->HasUnresolvedDependencies( Type => 'code' ) ) { return \'', loc('(pending approval)'), \''; } else { my $Query = "DependedOnBy = " . $Ticket->id; $Query .= " AND (" . join(" OR ", map { "Status = '$_'" } RT::Queue->ActiveStatusArray) . ")"; my $SearchURL = RT->Config->Get('WebPath') . '/Search/Results.html?' . $m->comp('/Elements/QueryString', Query => $Query); return \'', loc('(pending [quant,_1,other ticket,other tickets])',$count), \''; } } else { return loc( $Ticket->Status ); } } }, Priority => { title => 'Priority', # loc attribute => 'Priority', value => sub { return $_[0]->Priority } }, InitialPriority => { title => 'InitialPriority', # loc attribute => 'InitialPriority', name => 'Initial Priority', value => sub { return $_[0]->InitialPriority } }, FinalPriority => { title => 'FinalPriority', # loc attribute => 'FinalPriority', name => 'Final Priority', value => sub { return $_[0]->FinalPriority } }, EffectiveId => { title => 'EffectiveId', # loc attribute => 'EffectiveId', value => sub { return $_[0]->EffectiveId } }, Type => { title => 'Type', # loc attribute => 'Type', value => sub { return $_[0]->Type } }, TimeWorked => { attribute => 'TimeWorked', title => 'Time Worked', # loc value => sub { return $_[0]->TimeWorked } }, TimeLeft => { attribute => 'TimeLeft', title => 'Time Left', # loc value => sub { return $_[0]->TimeLeftAsString } }, TimeEstimated => { attribute => 'TimeEstimated', title => 'Time Estimated', # loc value => sub { return $_[0]->TimeEstimated } }, StartsRelative => { title => 'Starts', # loc attribute => 'Starts', value => sub { return $_[0]->StartsObj->AgeAsString } }, StartedRelative => { title => 'Started', # loc attribute => 'Started', value => sub { return $_[0]->StartedObj->AgeAsString } }, ToldRelative => { title => 'Told', # loc attribute => 'Told', value => sub { return $_[0]->ToldObj->AgeAsString } }, DueRelative => { title => 'Due', # loc attribute => 'Due', value => sub { my $date = $_[0]->DueObj; # Highlight the date if it was due in the past, and it's still active if ( $date && $date->IsSet && $date->Diff < 0 && $_[0]->QueueObj->IsActiveStatus($_[0]->Status)) { return (\'' , $date->AgeAsString , \''); } else { return $date->AgeAsString; } } }, WillResolveRelative => { title => 'Will Resolve', attribute => 'WillResolve', value => sub { return $_[0]->WillResolveObj->AgeAsString }, }, ResolvedRelative => { title => 'Resolved', # loc attribute => 'Resolved', value => sub { return $_[0]->ResolvedObj->AgeAsString } }, Starts => { title => 'Starts', # loc attribute => 'Starts', value => sub { return $_[0]->StartsObj } }, Started => { title => 'Started', # loc attribute => 'Started', value => sub { return $_[0]->StartedObj }, }, Told => { title => 'Told', # loc attribute => 'Told', value => sub { return $_[0]->ToldObj }, }, Due => { title => 'Due', # loc attribute => 'Due', value => sub { return $_[0]->DueObj }, }, WillResolve => { title => 'Will Resolve', attribute => 'WillResolve', value => sub { return $_[0]->WillResolveObj }, }, Resolved => { title => 'Resolved', # loc attribute => 'Resolved', value => sub { return $_[0]->ResolvedObj } }, UpdateStatus => { title => 'New messages', # loc value => sub { my $txn = $_[0]->SeenUpTo or return $_[0]->loc('No'); return \(''), $_[0]->loc('New'), \''; }, }, KeyRequestors => { title => 'Requestors', # loc attribute => 'Requestor.EmailAddress', value => sub { return \($m->scomp("/Elements/ShowPrincipal", Object => $_[0]->Requestor, PostUser => $trustSub ) ) } }, KeyOwnerName => { title => 'Owner', # loc attribute => 'Owner', value => sub { my $t = shift; my $name = $t->OwnerObj->Name; my %key = RT::Crypt->GetKeyInfo( Key => $t->OwnerObj->EmailAddress ); if (!defined $key{'info'}) { $name .= ' '. loc("(no pubkey!)"); } elsif ($key{'info'}{'TrustLevel'} == 0) { $name .= ' '. loc("(untrusted!)"); } return $name; } }, KeyOwner => { title => 'Owner', # loc attribute => 'Owner', value => sub { return \($m->scomp("/Elements/ShowPrincipal", Object => $_[0]->OwnerObj, PostUser => $trustSub ) ) } }, # Everything from LINKTYPEMAP (map { $_ => { value => $LinkCallback->( $_ ) } } keys %RT::Link::TYPEMAP), '_CLASS' => { value => sub { return $_[1] % 2 ? 'oddline' : 'evenline' } }, '_CHECKBOX' => { attribute => 'checkbox', title => 'Update', # loc align => 'right', value => sub { return \('') } }, Bookmark => { title => ' ', value => sub { my $bookmark = $m->scomp( '/Ticket/Elements/Bookmark', id => $_[0]->id ); # the CollectionAsTable/Row template replaces newlines with
$bookmark =~ s/\n//g; return \$bookmark; }, }, #freeside $m->comp('/Elements/CustomerFields', 'ColumnMap'), $m->comp('/Elements/ServiceFields', 'ColumnMap'), }; <%init> # if no encryption support, then KeyOwnerName and KeyRequestors fall back to the regular # versions unless (RT->Config->Get('Crypt')->{'Enable'}) { $COLUMN_MAP->{KeyOwnerName} = $COLUMN_MAP->{OwnerName}; $COLUMN_MAP->{KeyRequestors} = $GenericMap->{Requestors}; } $m->callback( GenericMap => $GenericMap, COLUMN_MAP => $COLUMN_MAP, CallbackName => 'Once', CallbackOnce => 1 ); return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr );