%# BEGIN BPS TAGGED BLOCK {{{ %# %# COPYRIGHT: %# %# This software is Copyright (c) 1996-2011 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 }}} <& /Admin/Elements/Header, Title => $title &> <& /Elements/Tabs &> <& /Elements/ListActions, actions => \@results &>

<&|/l&>Name |
<&|/l&>Description |
<&|/l&>Type | <& /Admin/Elements/SelectCustomFieldType, Name => "TypeComposite", Default => $CustomFieldObj->TypeComposite, &>
% if ( $CustomFieldObj->Id and $CustomFieldObj->HasRenderTypes ) {
<&|/l&>Render Type | <& /Admin/Elements/SelectCustomFieldRenderType, Name => "RenderType", TypeComposite => $CustomFieldObj->TypeComposite, Default => $CustomFieldObj->RenderType, BasedOn => $CustomFieldObj->BasedOnObj->id, &>
% } % if ( $CustomFieldObj->Id and $CustomFieldObj->IsSelectionType and RT->Config->Get('CustomFieldValuesSources') and ( scalar(@{RT->Config->Get('CustomFieldValuesSources')}) > 0 ) ) {
<&|/l&>Field values source: | <& /Admin/Elements/EditCustomFieldValuesSource, CustomField => $CustomFieldObj &>
% }
<&|/l&>Applies to | <& /Admin/Elements/SelectCustomFieldLookupType, Name => "LookupType", Default => $CustomFieldObj->LookupType || $LookupType, &>
<&|/l&>Validation | <& /Widgets/ComboBox, Name => 'Pattern', Default => $CustomFieldObj->Pattern, Size => 20, Values => \@CFvalidations, &>
<&|/l&>Link values to | <&|/l&>RT can make this custom field's values into hyperlinks to another service. <&|/l&>Fill in this field with a URL. <&|/l&>RT will replace `__id__` and `__CustomField__` with the record id and custom field value, respectively
<&|/l&>Include page | <&|/l&>RT can include content from another web service when showing this custom field. <&|/l&>Fill in this field with a URL. <&|/l&>RT will replace `__id__` and `__CustomField__` with the record id and custom field value, respectively <&|/l&>Some browsers may only load content from the same domain as your RT server.
% if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType && !$CustomFieldObj->IsExternalValues ) {
<&|/l&>Categories are based on | <& /Admin/Elements/SelectCustomField, Name => "BasedOn", LookupType => $CustomFieldObj->LookupType, Default => $CustomFieldObj->BasedOnObj, Not => $CustomFieldObj->id, &>
% } % $m->callback(CallbackName => 'BeforeEnabled', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations);
| /> <&|/l&>Enabled (Unchecking this box disables this custom field)
% $m->callback(CallbackName => 'EndOfTable', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations);

% if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType && !$CustomFieldObj->IsExternalValues ) {

## <&|/l&>Values

<& /Admin/Elements/EditCustomFieldValues, CustomField => $CustomFieldObj &> <& /Admin/Elements/AddCustomFieldValue, CustomField => $CustomFieldObj &>
% } <& /Elements/Submit, Name => 'Update', Label => $id eq 'new'? loc('Create'): loc('Save Changes') &> <%INIT> my ($title, @results, $Disabled); my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} ); $m->callback(CallbackName => 'Initial', Pattern => \$Pattern, ARGSRef => \%ARGS); unless ( $id ) { $title = loc("Create a CustomField"); $id = 'new'; } else { if ( $id eq 'new' ) { my ( $val, $msg ) = $CustomFieldObj->Create( Name => $Name, TypeComposite => $TypeComposite, LookupType => $LookupType, Description => $Description, Pattern => $Pattern, LinkValueTo => $LinkValueTo, IncludeContentForValue => $IncludeContentForValue, BasedOn => $BasedOn, ); $m->comp( "/Elements/Error", Why => loc( "Could not create CustomField", $msg ) ) unless $val; push @results, $msg; $title = loc( 'Created CustomField [_1]', $CustomFieldObj->Name ); } else { $CustomFieldObj->Load( $id ) || $m->comp("/Elements/Error", Why => loc('No CustomField') ); $title = loc( 'Editing CustomField [_1]', $CustomFieldObj->Name ); } } if ( $ARGS{'Update'} && $id ne 'new' ) { #we're asking about enabled on the web page but really care about disabled. $ARGS{'Disabled'} = $Disabled = $Enabled? 0 : 1; my @attribs = qw(Disabled Pattern Name TypeComposite LookupType Description LinkValueTo IncludeContentForValue); push @results, UpdateRecordObject( AttributesRef => \@attribs, Object => $CustomFieldObj, ARGSRef => \%ARGS ); $CustomFieldObj->SetValuesClass( $ValuesClass ); # Set the render type if we have it, but unset it if the new type doesn't # support render types if ( $CustomFieldObj->HasRenderTypes($TypeComposite) ) { my $original = $CustomFieldObj->RenderType; if ( defined $RenderType and $RenderType ne $original ) { # It's changed! Let's update it. my ($good, $msg) = $CustomFieldObj->SetRenderType( $RenderType ); if ( $good ) { $msg = loc("[_1] changed from '[_2]' to '[_3]'", loc("Render Type"), $original, $RenderType ); } push @results, $msg; } } else { # Delete it if we no longer support render types $CustomFieldObj->SetRenderType( undef ); } my ($good, $msg) = $CustomFieldObj->SetBasedOn( $BasedOn ); push @results, $msg unless $good or $msg =~ /No entry found/; my $paramtag = "CustomField-". $CustomFieldObj->Id ."-Value"; # Delete any fields that want to be deleted foreach my $key ( keys %ARGS ) { next unless $key =~ /^Delete-$paramtag-(\d+)$/o; my ($val, $msg) = $CustomFieldObj->DeleteValue( $1 ); push (@results, $msg); } # Update any existing values my $values = $CustomFieldObj->ValuesObj; while ( my $value = $values->Next ) { foreach my $attr (qw(Name Description SortOrder Category)) { my $param = join("-", $paramtag, $value->Id, $attr); next unless exists $ARGS{$param}; $ARGS{$param} =~ s/^\s+//; $ARGS{$param} =~ s/\s+$//; next if ($value->$attr()||'') eq ($ARGS{$param}||''); my $mutator = "Set$attr"; my ($id, $msg) = $value->$mutator( $ARGS{$param} ); push (@results, $msg); } $m->callback(CallbackName => 'AfterUpdateCustomFieldValue', CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $value, ARGSRef => \%ARGS ); } # Add any new values if ( defined $ARGS{ $paramtag ."-new-Name" } && length $ARGS{ $paramtag ."-new-Name" } ) { my ($id, $msg) = $CustomFieldObj->AddValue( map { $ARGS{$paramtag."-new-$_"} =~ s/^\s+//; $ARGS{$paramtag."-new-$_"} =~ s/\s+$//; $_ => $ARGS{ $paramtag ."-new-$_" } } qw/ Name Description SortOrder Category/ ); push (@results, $msg); my $cfv = RT::CustomFieldValue->new( $session{CurrentUser} ); $cfv->Load($id); $m->callback(CallbackName => 'AfterCreateCustomFieldValue', CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $cfv, ARGSRef => \%ARGS ); } } $id = $CustomFieldObj->id if $CustomFieldObj->id; # This code does automatic redirection if any updates happen. MaybeRedirectForResults( Actions => \@results, Arguments => { id => $id }, ); my $EnabledChecked = qq[checked="checked"]; $EnabledChecked = '' if $CustomFieldObj->Disabled; my @CFvalidations = ( '(?#Mandatory).', '(?#Digits)^[\d.]+$', '(?#Year)^[12]\d{3}$', ); $m->callback(CallbackName => 'ValidationPatterns', Values => \@CFvalidations); <%ARGS> $id => undef $TypeComposite => undef $LookupType => undef $MaxValues => undef $SortOrder => undef $Description => undef $Pattern => undef $Name => undef $SetEnabled => undef $Enabled => 0 $ValuesClass => 'RT::CustomFieldValues' $RenderType => undef $LinkValueTo => undef $IncludeContentForValue => undef $BasedOn => undef