%#
%# COPYRIGHT:
%#
-%# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC
+%# This software is Copyright (c) 1996-2019 Best Practical Solutions, LLC
%# <sales@bestpractical.com>
%#
%# (Except where explicitly superseded by other copyright notices)
% $m->callback( CallbackName => 'FormStart', ARGSRef => \%ARGS, Ticket => $TicketObj, CanRespond => $CanRespond, CanComment => $CanComment, ResponseDefault => $ResponseDefault, CommentDefault => $CommentDefault );
<input type="hidden" class="hidden" name="QuoteTransaction" value="<% $ARGS{QuoteTransaction}||'' %>" />
<input type="hidden" class="hidden" name="DefaultStatus" value="<% $DefaultStatus ||''%>" />
-<input type="hidden" class="hidden" name="Action" value="<% $ARGS{Action}||'' %>" />
+<input type="hidden" class="hidden" name="Action" value="<% $Action %>" />
+<input type="hidden" class="hidden" name="Token" value="<% $ARGS{'Token'} %>" />
-<& /Elements/GnuPG/SignEncryptWidget:ShowIssues, self => $gnupg_widget &>
+<& /Elements/Crypt/SignEncryptWidget:ShowIssues, self => $gnupg_widget &>
<div id="ticket-update-metadata">
<&|/Widgets/TitleBox, title => loc('Ticket and Transaction') &>
</select>
<script type="text/javascript">
- jQuery(function() {
- jQuery("#UpdateType").change(function(ev) {
- jQuery(".messagebox-container")
- .removeClass("action-response action-private")
- .addClass("action-"+ev.target.value);
- });
- });
jQuery(function() {
jQuery("input[name=TxnSendMailTo]").change(function(ev) {
- jQuery("input[name=TxnSendMailTo][value="+ev.target.value+"]")
- .attr("checked",jQuery(ev.target).attr('checked'));
+ jQuery("input[name=TxnSendMailTo]").filter( function() { return this.value == ev.target.value; } ).prop("checked",jQuery(ev.target).prop('checked'));
});
});
</script>
InTable => 1,
fields => [
{ name => 'Status',
- comp => '/Elements/SelectStatus',
+ comp => '/Ticket/Elements/SelectStatus',
args => {
Name => 'Status',
- DefaultLabel => loc("[_1] (Unchanged)", loc($TicketObj->Status)),
- Default => $ARGS{'Status'} || ($TicketObj->Status eq $DefaultStatus ? undef : $DefaultStatus),
+ Default => $DefaultStatus,
TicketObj => $TicketObj,
- QueueObj => $TicketObj->QueueObj,
onchange => 'changeStatus()'
},
},
Name => "Owner",
TicketObj => $TicketObj,
QueueObj => $TicketObj->QueueObj,
- DefaultLabel => loc("[_1] (Unchanged)", $m->scomp('/Elements/ShowUser', User => $TicketObj->OwnerObj)),
+ DefaultLabel => loc("[_1] (Unchanged)", $TicketObj->OwnerObj->Format),
Default => $ARGS{'Owner'}
}
},
args => {
Name => 'UpdateTimeWorked',
Default => $ARGS{UpdateTimeWorked}||'',
- InUnits => $ARGS{'UpdateTimeWorked-TimeUnits'}||'minutes',
}
},
]
% $m->callback( %ARGS, CallbackName => 'AfterWorked', Ticket => $TicketObj );
-<& /Ticket/Elements/EditTransactionCustomFields, %ARGS, TicketObj => $TicketObj, AsTable => 1 &>
+<& /Ticket/Elements/EditTransactionCustomFields, %ARGS, TicketObj => $TicketObj, InTable => 1, KeepValue => 1, &>
- <!--</table>-->
+ </table>
</&>
+
+% $m->callback( %ARGS, CallbackName => 'RightColumnBottom', Ticket => $TicketObj );
+
</div>
<div id="ticket-update-message">
% if ( $gnupg_widget ) {
<tr><td> </td><td>
-<& /Elements/GnuPG/SignEncryptWidget,
+<& /Elements/Crypt/SignEncryptWidget,
self => $gnupg_widget,
TicketObj => $TicketObj,
&>
</table>
</&>
+% $m->callback( %ARGS, CallbackName => 'BeforeSubmit', Ticket => $TicketObj );
+
<& /Elements/Submit, Label => loc('Update Ticket'), Name => 'SubmitTicket', id => 'SubmitTicket' &>
+% $m->callback( %ARGS, CallbackName => 'BeforeScrips', Ticket => $TicketObj );
+
% if ($TicketObj->CurrentUserHasRight('ShowOutgoingEmail')) {
<&|/Widgets/TitleBox, title => loc('Scrips and Recipients'), id => 'previewscrips', rolledup => RT->Config->Get('SimplifiedRecipients', $session{'CurrentUser'}) &>
<& /Ticket/Elements/PreviewScrips, TicketObj => $TicketObj, %ARGS &>
% }
</div>
+% $m->callback( %ARGS, CallbackName => 'AfterScrips', Ticket => $TicketObj );
+
% if (my $recips = $m->notes("DryRun-Recipients-".$TicketObj->Id)) {
<input type="hidden" name="TxnRecipients" value="<% join ",",sort keys %{$recips} %>" />
% }
</form>
<hr class="clear" />
+
+% $m->callback( %ARGS, CallbackName => 'AfterForm', Ticket => $TicketObj );
+
<%INIT>
my $CanRespond = 0;
my $CanComment = 0;
my @results;
$m->callback( Ticket => $TicketObj, ARGSRef => \%ARGS, checks_failure => \$checks_failure, results => \@results, CallbackName => 'Initial' );
+$m->scomp( '/Articles/Elements/SubjectOverride', Ticket => $TicketObj, ARGSRef => \%ARGS, results => \@results );
unless($DefaultStatus){
$DefaultStatus=($ARGS{'Status'} ||$TicketObj->Status());
}
-my $title = loc("Update ticket #[_1] ([_2])", $TicketObj->id, $TicketObj->Subject||'');
+my $title = loc("Update ticket #[_1]: [_2]", $TicketObj->id, $TicketObj->Subject);
# Things needed in the template - we'll do the processing here, just
# for the convenience:
}
my $type = $ARGS{'UpdateType'} ? $ARGS{'UpdateType'} :
- lc $ARGS{'Action'} eq 'respond' ? 'response' :
- lc $ARGS{'Action'} eq 'comment' ? 'private' :
+ lc $Action eq 'respond' ? 'response' :
+ lc $Action eq 'comment' ? 'private' :
'none' ;
$CanComment = 1 if ( $TicketObj->CurrentUserHasRight('CommentOnTicket') or
$TicketObj->CurrentUserHasRight('ModifyTicket') );
+ProcessAttachments(ARGSRef => \%ARGS);
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
- if ($key =~ m/^DeleteAttach-(.+)$/) {
- delete $session{'Attachments'}{$1};
- }
- $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ( defined $ARGS{'Attach'} && length $ARGS{'Attach'} ) { # attachment?
- my $attachment = MakeMIMEEntity(
- AttachmentFieldName => 'Attach'
- );
+my %squelched = ProcessTransactionSquelching( \%ARGS );
+$ARGS{'SquelchMailTo'} = [keys %squelched] if keys %squelched;
- my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
- $session{'Attachments'} = {
- %{$session{'Attachments'} || {}},
- $file_path => $attachment,
- };
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) {
- delete $session{'Attachments'};
-}
-
-my $gnupg_widget = $m->comp('/Elements/GnuPG/SignEncryptWidget:new', Arguments => \%ARGS );
-$m->comp( '/Elements/GnuPG/SignEncryptWidget:Process',
+my $gnupg_widget = $m->comp('/Elements/Crypt/SignEncryptWidget:new', Arguments => \%ARGS );
+$m->comp( '/Elements/Crypt/SignEncryptWidget:Process',
self => $gnupg_widget,
TicketObj => $TicketObj,
);
if ( $ARGS{'SubmitTicket'} ) {
- my %checked = map {$_ => 1} grep {defined}
- (ref $ARGS{'TxnSendMailTo'} eq "ARRAY" ? @{$ARGS{'TxnSendMailTo'}}
- : defined $ARGS{'TxnSendMailTo'} ? ($ARGS{'TxnSendMailTo'}) : ());
-
- my @squelchlist = grep {not $checked{$_}} split /,/, ($ARGS{'TxnRecipients'}||'');
- $ARGS{'SquelchMailTo'} = \@squelchlist if @squelchlist;
-
- my $CFs = $TicketObj->TransactionCustomFields;
- my $ValidCFs = $m->comp(
+ my ($status, @msg) = $m->comp(
'/Elements/ValidateCustomFields',
- CustomFields => $CFs,
- NamePrefix => "Object-RT::Transaction--CustomField-",
+ CustomFields => $TicketObj->TransactionCustomFields,
+ Object => RT::Transaction->new( $session{'CurrentUser'} ),
ARGSRef => \%ARGS
);
- unless ( $ValidCFs ) {
+ unless ( $status ) {
+ push @results, @msg;
$checks_failure = 1;
- while (my $CF = $CFs->Next) {
- my $msg = $m->notes('InvalidField-' . $CF->Id) or next;
- push @results, loc($CF->Name) . ': ' . $msg;
- }
}
- my $status = $m->comp('/Elements/GnuPG/SignEncryptWidget:Check',
+ $status = $m->comp('/Elements/Crypt/SignEncryptWidget:Check',
self => $gnupg_widget,
TicketObj => $TicketObj,
);
$ARGS{ $field } = join ', ', map $_->format, grep defined, @emails;
}
}
+
+# $skip_update is provided below by reference to allow a final check to stop
+# the update and print a message for the user to fix something.
my $skip_update = 0;
$m->callback( CallbackName => 'BeforeUpdate', ARGSRef => \%ARGS, skip_update => \$skip_update,
checks_failure => $checks_failure, results => \@results, TicketObj => $TicketObj );
<%ARGS>
$id => undef
-$Action => undef
+$Action => ''
$DefaultStatus => undef
</%ARGS>