Dev to 4.0.11
[usit-rt.git] / share / html / Admin / CustomFields / Modify.html
CommitLineData
84fb5b46
MKG
1%# BEGIN BPS TAGGED BLOCK {{{
2%#
3%# COPYRIGHT:
4%#
403d7b0b 5%# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
84fb5b46
MKG
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<& /Admin/Elements/Header, Title => $title &>
49<& /Elements/Tabs &>
50<& /Elements/ListActions, actions => \@results &>
51
52
53<form method="post" action="Modify.html" name="ModifyCustomField" id="ModifyCustomField">
54<input type="hidden" class="hidden" name="id" value="<% $id %>" />
55
56<table>
57
58<tr><td class="label"><&|/l&>Name</&></td>
59<td><input name="Name" value="<% $CustomFieldObj->Name || $Name || '' %>" size="20" /></td></tr>
60
61<tr><td class="label"><&|/l&>Description</&></td>
62<td><input name="Description" value="<% $CustomFieldObj->Description || $Description || '' %>" size="80" /></td></tr>
63
64<tr><td class="label"><&|/l&>Type</&></td>
65<td><& /Admin/Elements/SelectCustomFieldType,
66 Name => "TypeComposite",
67 Default => $CustomFieldObj->TypeComposite, &>
68</td></tr>
69
70% if ( $CustomFieldObj->Id and $CustomFieldObj->HasRenderTypes ) {
71<tr>
72 <td class="label"><&|/l&>Render Type</&></td>
73 <td>
74 <& /Admin/Elements/SelectCustomFieldRenderType,
75 Name => "RenderType",
76 TypeComposite => $CustomFieldObj->TypeComposite,
77 Default => $CustomFieldObj->RenderType,
78 BasedOn => $CustomFieldObj->BasedOnObj->id, &>
79 </td>
80</tr>
81% }
82
83% if ( $CustomFieldObj->Id and $CustomFieldObj->IsSelectionType and RT->Config->Get('CustomFieldValuesSources') and ( scalar(@{RT->Config->Get('CustomFieldValuesSources')}) > 0 ) ) {
84<tr><td class="label"><&|/l&>Field values source:</&></td><td>
85<& /Admin/Elements/EditCustomFieldValuesSource, CustomField => $CustomFieldObj &>
86</td></tr>
87% }
88
89<tr><td class="label"><&|/l&>Applies to</&></td>
90<td><& /Admin/Elements/SelectCustomFieldLookupType,
91 Name => "LookupType",
92 Default => $CustomFieldObj->LookupType || $LookupType, &>
93</td></tr>
94
95<tr class="edit_validation"><td class="label"><&|/l&>Validation</&></td>
96<td><& /Widgets/ComboBox,
97 Name => 'Pattern',
98 Default => $CustomFieldObj->Pattern || $Pattern,
99 Size => 20,
100 Values => \@CFvalidations,
101&></td></tr>
102
103<tr><td class="label"><&|/l&>Link values to</&></td><td>
104<input size="60" name="LinkValueTo" value="<% $CustomFieldObj->LinkValueTo || $LinkValueTo || '' %>" />
105<div class="hints">
106<&|/l&>RT can make this custom field's values into hyperlinks to another service.</&>
107<&|/l&>Fill in this field with a URL.</&>
108<&|/l_unsafe, '<tt>__id__</tt>', '<tt>__CustomField__</tt>' &>RT will replace [_1] and [_2] with the record's id and the custom field's value, respectively.</&>
109</div></td></tr>
110
111<tr><td class="label"><&|/l&>Include page</&></td><td>
112<input size="60" name="IncludeContentForValue" value="<% $CustomFieldObj->IncludeContentForValue || $IncludeContentForValue || '' %>" />
113<div class="hints">
114<&|/l&>RT can include content from another web service when showing this custom field.</&>
115<&|/l&>Fill in this field with a URL.</&>
116<&|/l_unsafe, '<tt>__id__</tt>', '<tt>__CustomField__</tt>' &>RT will replace [_1] and [_2] with the record's id and the custom field's value, respectively.</&>
117<i><&|/l&>Some browsers may only load content from the same domain as your RT server.</&></i>
118</div></td></tr>
119
120% if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType && !$CustomFieldObj->IsExternalValues ) {
121<tr class="categoriesbasedon"><td class="label"><&|/l&>Categories are based on</&></td><td>
122<& /Admin/Elements/SelectCustomField,
123 Name => "BasedOn",
124 LookupType => $CustomFieldObj->LookupType,
125 Default => $CustomFieldObj->BasedOnObj || $BasedOn,
126 Not => $CustomFieldObj->id,
127&>
128</td></tr>
129% }
130
131% $m->callback(CallbackName => 'BeforeEnabled', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations);
132
133<tr><td class="label">&nbsp;</td><td>
134<input type="hidden" class="hidden" name="SetEnabled" value="1" />
135<input type="checkbox" class="checkbox" name="Enabled" value="1" <% $EnabledChecked |n%> />
136<&|/l&>Enabled (Unchecking this box disables this custom field)</&>
137</td></tr>
138
139% $m->callback(CallbackName => 'EndOfTable', CustomField => $CustomFieldObj, CFvalidations => \@CFvalidations);
140
141</table>
142
143% if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType && !$CustomFieldObj->IsExternalValues ) {
144<h2><&|/l&>Values</&></h2>
145<div>
146<& /Admin/Elements/EditCustomFieldValues, CustomField => $CustomFieldObj &>
147<& /Admin/Elements/AddCustomFieldValue, CustomField => $CustomFieldObj &>
148</div>
149% }
150
151<& /Elements/Submit, Name => 'Update', Label => $id eq 'new'? loc('Create'): loc('Save Changes') &>
152
153</form>
154<%INIT>
155my ($title, @results);
156
157my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} );
158
159$m->callback(CallbackName => 'Initial', Pattern => \$Pattern, ARGSRef => \%ARGS);
160
161unless ( $id ) {
162 $title = loc("Create a CustomField");
163 $id = 'new';
164}
165else {
166 if ( $id eq 'new' ) {
167 my ( $val, $msg ) = $CustomFieldObj->Create(
168 Name => $Name,
169 TypeComposite => $TypeComposite,
170 LookupType => $LookupType,
171 Description => $Description,
172 Pattern => $Pattern,
173 LinkValueTo => $LinkValueTo,
174 IncludeContentForValue => $IncludeContentForValue,
175 BasedOn => $BasedOn,
176 Disabled => !$Enabled,
177 );
178 if (!$val) {
179 push @results, loc("Could not create CustomField: [_1]", $msg);
180 $title = loc( 'Create a CustomField');
181 }
182 else {
183 push @results, loc("Object created");
184 $title = loc( 'Created CustomField [_1]', $CustomFieldObj->Name );
185 }
186 } else {
187 push @results, loc('No CustomField')
188 unless $CustomFieldObj->Load( $id );
189
190 $title = loc( 'Editing CustomField [_1]', $CustomFieldObj->Name );
191 }
192}
193
194if ( $ARGS{'Update'} && $id ne 'new' ) {
195
196 #we're asking about enabled on the web page but really care about disabled.
197 $ARGS{'Disabled'} = $Enabled? 0 : 1;
198
199 my @attribs = qw(Disabled Pattern Name TypeComposite LookupType Description LinkValueTo IncludeContentForValue);
200 push @results, UpdateRecordObject(
201 AttributesRef => \@attribs,
202 Object => $CustomFieldObj,
203 ARGSRef => \%ARGS
204 );
c36a7e1d
MKG
205 if ( ($ValuesClass||'RT::CustomFieldValues') ne $CustomFieldObj->ValuesClass ) {
206 my $original = $CustomFieldObj->ValuesClass;
207 my ($good, $msg) = $CustomFieldObj->SetValuesClass( $ValuesClass );
208 if ( $good ) {
209 $msg = loc("[_1] changed from '[_2]' to '[_3]'",
210 loc("Field values source"), $original, $ValuesClass );
211 }
212 push @results, $msg;
213 }
84fb5b46
MKG
214
215 # Set the render type if we have it, but unset it if the new type doesn't
216 # support render types
217 if ( $CustomFieldObj->HasRenderTypes($TypeComposite) ) {
218 my $original = $CustomFieldObj->RenderType;
219
220 if ( defined $RenderType and $RenderType ne $original ) {
221 # It's changed! Let's update it.
222 my ($good, $msg) = $CustomFieldObj->SetRenderType( $RenderType );
223
224 if ( $good ) {
225 $msg = loc("[_1] changed from '[_2]' to '[_3]'",
226 loc("Render Type"), $original, $RenderType );
227 }
228
229 push @results, $msg;
230 }
231 }
232 else {
233 # Delete it if we no longer support render types
234 $CustomFieldObj->SetRenderType( undef );
235 }
236
237 if (($CustomFieldObj->BasedOn||'') ne ($BasedOn||'')) {
238 my ($good, $msg) = $CustomFieldObj->SetBasedOn( $BasedOn );
239 push @results, $msg;
240 }
241
242 my $paramtag = "CustomField-". $CustomFieldObj->Id ."-Value";
243 # Delete any fields that want to be deleted
244 foreach my $key ( keys %ARGS ) {
403d7b0b 245 next unless $key =~ /^Delete-$paramtag-(\d+)$/;
84fb5b46
MKG
246 my ($val, $msg) = $CustomFieldObj->DeleteValue( $1 );
247 push (@results, $msg);
248 }
249
250 # Update any existing values
251 my $values = $CustomFieldObj->ValuesObj;
252 while ( my $value = $values->Next ) {
253 foreach my $attr (qw(Name Description SortOrder Category)) {
254 my $param = join("-", $paramtag, $value->Id, $attr);
255 next unless exists $ARGS{$param};
256 $ARGS{$param} =~ s/^\s+//;
257 $ARGS{$param} =~ s/\s+$//;
258 next if ($value->$attr()||'') eq ($ARGS{$param}||'');
259
260 my $mutator = "Set$attr";
261 my ($id, $msg) = $value->$mutator( $ARGS{$param} );
262 push (@results, $msg);
263 }
264 $m->callback(CallbackName => 'AfterUpdateCustomFieldValue', CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $value, ARGSRef => \%ARGS );
265 }
266
267 # Add any new values
268 if ( defined $ARGS{ $paramtag ."-new-Name" } && length $ARGS{ $paramtag ."-new-Name" } ) {
269 my ($id, $msg) = $CustomFieldObj->AddValue(
270 map {
271 $ARGS{$paramtag."-new-$_"} =~ s/^\s+//;
272 $ARGS{$paramtag."-new-$_"} =~ s/\s+$//;
273 $_ => $ARGS{ $paramtag ."-new-$_" } } qw/ Name Description SortOrder Category/
274 );
275 push (@results, $msg);
276
277 my $cfv = RT::CustomFieldValue->new( $session{CurrentUser} );
278 $cfv->Load($id);
279 $m->callback(CallbackName => 'AfterCreateCustomFieldValue',
280CustomFieldObj => $CustomFieldObj, CustomFieldValueObj => $cfv, ARGSRef => \%ARGS );
281 }
282}
283
284$id = $CustomFieldObj->id if $CustomFieldObj->id;
285
286# This code does automatic redirection if any updates happen.
287MaybeRedirectForResults(
288 Actions => \@results,
289 Arguments => { id => $id },
290) if $CustomFieldObj->id;
291
292
293my $EnabledChecked = qq[checked="checked"];
294$EnabledChecked = '' if $CustomFieldObj->Disabled;
295
296my @CFvalidations = (
297 '(?#Mandatory).',
298 '(?#Digits)^[\d.]+$',
299 '(?#Year)^[12]\d{3}$',
300);
301
302$m->callback(CallbackName => 'ValidationPatterns', Values => \@CFvalidations);
303
304</%INIT>
305<%ARGS>
306$id => undef
307$TypeComposite => undef
308$LookupType => undef
309$MaxValues => undef
310$SortOrder => undef
311$Description => undef
312$Pattern => undef
313$Name => undef
314$SetEnabled => undef
315$Enabled => 0
316$ValuesClass => 'RT::CustomFieldValues'
317$RenderType => undef
318$LinkValueTo => undef
319$IncludeContentForValue => undef
320$BasedOn => undef
321</%ARGS>