1%# BEGIN BPS TAGGED BLOCK {{{ 2%# 3%# COPYRIGHT: 4%# 5%# This software is Copyright (c) 1996-2021 Best Practical Solutions, LLC 6%# <sales@bestpractical.com> 7%# 8%# (Except where explicitly superseded by other copyright notices) 9%# 10%# 11%# LICENSE: 12%# 13%# This work is made available to you under the terms of Version 2 of 14%# the GNU General Public License. A copy of that license should have 15%# been provided with this software, but in any event can be snarfed 16%# from www.gnu.org. 17%# 18%# This work is distributed in the hope that it will be useful, but 19%# WITHOUT ANY WARRANTY; without even the implied warranty of 20%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21%# General Public License for more details. 22%# 23%# You should have received a copy of the GNU General Public License 24%# along with this program; if not, write to the Free Software 25%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26%# 02110-1301 or visit their web page on the internet at 27%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. 28%# 29%# 30%# CONTRIBUTION SUBMISSION POLICY: 31%# 32%# (The following paragraph is not intended to limit the rights granted 33%# to you to modify and distribute this software under the terms of 34%# the GNU General Public License and is only of importance to you if 35%# you choose to contribute your changes and enhancements to the 36%# community by submitting them to Best Practical Solutions, LLC.) 37%# 38%# By intentionally submitting any modifications, corrections or 39%# derivatives to this work, or any other work intended for use with 40%# Request Tracker, to Best Practical Solutions, LLC, you confirm that 41%# you are the copyright holder for those contributions and you grant 42%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, 43%# royalty-free, perpetual, license to use, copy, create derivative 44%# works based on those contributions, and sublicense and distribute 45%# those contributions and any derivatives thereof. 46%# 47%# END BPS TAGGED BLOCK }}} 48<%ARGS> 49$Name => undef 50$Attr => undef 51$GenericMap => {} 52</%ARGS> 53<%ONCE> 54my $COLUMN_MAP = { 55 Disabled => { 56 title => 'Status', # loc 57 attribute => 'Disabled', 58 value => sub { return $_[0]->Disabled? $_[0]->loc('Disabled'): $_[0]->loc('Enabled') }, 59 }, 60 61 map( 62 { my $c = $_; $c => { 63 title => $c, attribute => $c, 64 value => sub { return $_[0]->$c() }, 65 } } 66 qw(Name Description Type LookupType Pattern EntryHint RenderType ValuesClass CanonicalizeClass) 67 ), 68 map( 69 { my $c = $_; my $short = $c; $short =~ s/^Friendly//; 70 $c => { 71 title => $short, attribute => $short, 72 value => sub { return $_[0]->$c() }, 73 } } 74 qw(FriendlyLookupType FriendlyType FriendlyPattern) 75 ), 76 BasedOn => { 77 title => 'Based On', 78 attribute => 'BasedOn', 79 value => sub { return $_[0]->BasedOnObj->Name }, 80 }, 81 MaxValues => { 82 title => 'MaxValues', # loc 83 attribute => 'MaxValues', 84 value => sub { 85 my $v = $_[0]->MaxValues; 86 return !$v ? $_[0]->loc('unlimited') : $v == 0 ? $_[0]->loc('one') : $v; 87 }, 88 }, 89 UniqueValues => { 90 title => 'UniqueValues', # loc 91 attribute => 'UniqueValues', 92 value => sub { return $_[0]->UniqueValues ? $_[0]->loc('Unique values') : '' }, 93 }, 94 AddedTo => { 95 title => 'Added', # loc 96 value => sub { 97 if ( $_[0]->IsGlobal ) { 98 return $_[0]->loc('Global'); 99 } 100 101 my $collection = $_[0]->AddedTo; 102 return '' unless $collection; 103 104 $collection->RowsPerPage(10); 105 106 my $found = 0; 107 my $res = ''; 108 while ( my $record = $collection->Next ) { 109 $res .= ', ' if $res; 110 111 my $id = ''; 112 $id = $record->Name if $record->_Accessible('Name','read'); 113 $id ||= "#". $record->id; 114 $res .= $id; 115 116 $found++; 117 } 118 $res .= ', ...' if $found >= 10; 119 return $res; 120 }, 121 122 }, 123 RemoveCheckBox => { 124 title => sub { 125 my $name = 'RemoveCustomField'; 126 my $checked = $DECODED_ARGS->{ $name .'All' }? 'checked="checked"': ''; 127 128 return \qq{<input type="checkbox" name="}, $name, \qq{All" value="1" $checked 129 onclick="setCheckbox(this, }, 130 $m->interp->apply_escapes($name,'j'), 131 \qq{)" />}; 132 }, 133 value => sub { 134 my $id = $_[0]->id; 135 return '' if $_[0]->IsGlobal; 136 137 my $name = 'RemoveCustomField'; 138 my $arg = $DECODED_ARGS->{ $name }; 139 140 my $checked = ''; 141 if ( $arg && ref $arg ) { 142 $checked = 'checked="checked"' if grep $_ == $id, @$arg; 143 } 144 elsif ( $arg ) { 145 $checked = 'checked="checked"' if $arg == $id; 146 } 147 return \qq{<input type="checkbox" name="}, $name, \qq{" value="$id" $checked />} 148 }, 149 }, 150 MoveCF => { 151 title => 'Move', 152 value => sub { 153 my $id = $_[0]->id; 154 155 my $context = $_[2] || 0; 156 return '' unless $_[0]->IsAdded( $context ); 157 158 my $name = 'MoveCustomField'; 159 my $args = $m->caller_args( 1 ); 160 my @pass = ref $args->{'PassArguments'} 161 ? @{$args->{'PassArguments'}} 162 : ($args->{'PassArguments'}); 163 my %pass = map { $_ => $args->{$_} } grep exists $args->{$_}, @pass; 164 165 my $uri = RT->Config->Get('WebPath') . $m->request_path; 166 167 my @res = ( 168 \'<a href="', 169 $uri .'?'. $m->comp("/Elements/QueryString", %pass, MoveCustomFieldUp => $id ), 170 \'">', loc('~[Up~]'), \'</a>', 171 \' <a href="', 172 $uri .'?'. $m->comp("/Elements/QueryString", %pass, MoveCustomFieldDown => $id ), 173 \'">', loc('~[Down~]'), \'</a>' 174 ); 175 176 return @res; 177 }, 178 }, 179}; 180 181$COLUMN_MAP->{'AppliedTo'} = $COLUMN_MAP->{'AddedTo'}; 182 183</%ONCE> 184<%INIT> 185$m->callback( GenericMap => $GenericMap, COLUMN_MAP => $COLUMN_MAP, CallbackName => 'ColumnMap', CallbackOnce => 1 ); 186return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr ); 187</%INIT> 188