%# 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 }}} <& /Admin/Elements/Header, Title => $title, Focus => (($added_cfv or $ARGS{FocusAddValue}) ? "input[name=CustomField-$id-Value-new-Name]" : undef), &> <& /Elements/Tabs &> <& /Elements/ListActions, actions => \@results &>
% if ( $CustomFieldObj->Id and $CustomFieldObj->HasRenderTypes ) { % } % if ( $CustomFieldObj->Id and $CustomFieldObj->IsSelectionType and RT->Config->Get('CustomFieldValuesSources') and ( scalar(@{RT->Config->Get('CustomFieldValuesSources')}) > 0 ) ) { % } % if ( $CustomFieldObj->Id % and $CustomFieldObj->LookupType =~ /RT::Transaction/ ) { % } % if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType ) { % } % $m->callback(CallbackName => 'BeforeEnabled', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations); % $m->callback(CallbackName => 'EndOfTable', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations);
<&|/l&>Name
<&|/l&>Description
<&|/l&>Type <& /Admin/Elements/SelectCustomFieldType, Name => "TypeComposite", Default => $CustomFieldObj->TypeComposite, &>
<&|/l&>Render Type <& /Admin/Elements/SelectCustomFieldRenderType, Name => "RenderType", TypeComposite => $CustomFieldObj->TypeComposite, Default => $CustomFieldObj->RenderType, BasedOn => $CustomFieldObj->BasedOnObj->id, &>
<&|/l&>Field values source: <& /Admin/Elements/EditCustomFieldValuesSource, CustomField => $CustomFieldObj &>
<&|/l&>Applies to <& /Admin/Elements/SelectCustomFieldLookupType, Name => "LookupType", Default => $CustomFieldObj->LookupType || $LookupType, &>
<&|/l&>Display with <& /Admin/Elements/EditCustomFieldUILocation, CustomField => $CustomFieldObj &>
<&|/l&>Validation <& /Widgets/ComboBox, Name => 'Pattern', Default => $CustomFieldObj->Pattern || $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_unsafe, '__id__', '__CustomField__' &>RT will replace [_1] and [_2] with the record's id and the custom field's 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_unsafe, '__id__', '__CustomField__' &>RT will replace [_1] and [_2] with the record's id and the custom field's value, respectively. <&|/l&>Some browsers may only load content from the same domain as your RT server.
<&|/l&>Categories are based on <& /Admin/Elements/SelectCustomField, Name => "BasedOn", LookupType => $CustomFieldObj->LookupType, Default => $CustomFieldObj->BasedOnObj || $BasedOn, Not => $CustomFieldObj->id, &>
  /> <&|/l&>Required for ticket resolution
  /> <&|/l&>Copy this field to new tickets
  />
% 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') &>
% $m->callback(%ARGS, CallbackName => 'EndOfPage', CustomFieldObj => $CustomFieldObj); <%INIT> my ($title, @results, $added_cfv); my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} ); $m->callback(CallbackName => 'Initial', Pattern => \$Pattern, Results => \@results, 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, Disabled => ($Enabled ? 0 : 1), NoClone => !$YesClone, ); if (!$val) { push @results, loc("Could not create CustomField: [_1]", $msg); $title = loc( 'Create a CustomField'); } else { push @results, loc("Object created"); $title = loc( 'Created CustomField [_1]', $CustomFieldObj->Name ); } } else { push @results, loc('No CustomField') unless $CustomFieldObj->Load( $id ); $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'} = $Enabled? 0 : 1; # likewise $ARGS{'NoClone'} = $YesClone ? 0 : 1; $ARGS{'Required'} ||= 0; my @attribs = qw(Disabled Required Pattern Name TypeComposite LookupType Description LinkValueTo IncludeContentForValue NoClone); push @results, UpdateRecordObject( AttributesRef => \@attribs, Object => $CustomFieldObj, ARGSRef => \%ARGS ); if ( ($ValuesClass||'RT::CustomFieldValues') ne $CustomFieldObj->ValuesClass ) { my $original = $CustomFieldObj->ValuesClass; my ($good, $msg) = $CustomFieldObj->SetValuesClass( $ValuesClass ); if ( $good ) { $msg = loc("[_1] changed from '[_2]' to '[_3]'", loc("Field values source"), $original, $ValuesClass ); } push @results, $msg; } # 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 ); } if (($CustomFieldObj->BasedOn||'') ne ($BasedOn||'')) { my ($good, $msg) = $CustomFieldObj->SetBasedOn( $BasedOn ); push @results, $msg; } $CustomFieldObj->SetUILocation( $UILocation ); 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+)$/; my ($val, $msg) = $CustomFieldObj->DeleteValue( $1 ); push (@results, $msg); } # Clean up values foreach my $param (grep /^$paramtag-/, keys(%ARGS)) { for ($ARGS{$param}) { s/\r+\n/\n/g; s/^\s+//; s/\s+$//; } } # 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); $added_cfv = 1 if $id; my $cfv = RT::CustomFieldValue->new( $session{CurrentUser} ); $cfv->Load($id); $m->callback(CallbackName => 'AfterCreateCustomFieldValue', CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $cfv, ARGSRef => \%ARGS ); } } if ( $CustomFieldObj->id && $CustomFieldObj->IsOnlyGlobal ) { my ( $ret, $msg ); my $object = $CustomFieldObj->RecordClassFromLookupType->new( $session{'CurrentUser'} ); if ( $CustomFieldObj->Disabled && $CustomFieldObj->IsGlobal ) { ( $ret, $msg ) = $CustomFieldObj->RemoveFromObject($object); } elsif ( !$CustomFieldObj->Disabled && !$CustomFieldObj->IsGlobal ) { ( $ret, $msg ) = $CustomFieldObj->AddToObject($object); } # successful msg("object created" or "object deleted ) is useless here push @results, $msg unless $ret; } $id = $CustomFieldObj->id if $CustomFieldObj->id; # This code does automatic redirection if any updates happen. MaybeRedirectForResults( Actions => \@results, Arguments => { id => $id, FocusAddValue => ($added_cfv ? 1 : 0) }, ) if $CustomFieldObj->id; my $EnabledChecked = qq[checked="checked"]; $EnabledChecked = '' if $CustomFieldObj->Disabled; my $RequiredChecked = ''; $RequiredChecked = qq[checked="checked"] if $CustomFieldObj->Required; my $YesCloneChecked = qq[checked="checked"]; $YesCloneChecked = '' if $CustomFieldObj->NoClone; my @CFvalidations = ( '(?#Mandatory).', '(?#Digits)^[\d.]+$', '(?#Year)^[12]\d{3}$', ); $m->callback(CallbackName => 'ValidationPatterns', Values => \@CFvalidations); <%ARGS> $id => undef $TypeComposite => undef $LookupType => RT::Ticket->CustomFieldLookupType $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 $UILocation => undef $YesClone => undef