Master to 4.2.8
[usit-rt.git] / share / html / Ticket / Display.html
1 %# BEGIN BPS TAGGED BLOCK {{{
2 %#
3 %# COPYRIGHT:
4 %#
5 %# This software is Copyright (c) 1996-2014 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 <& /Elements/Header, 
49     Title => $title,
50     LinkRel => \%link_rel &>
51 <& /Elements/Tabs &>
52
53 % $m->callback(CallbackName => 'BeforeActionList', %ARGS, Actions => \@Actions, ARGSRef => \%ARGS, Ticket => $TicketObj);
54
55 <& /Elements/ListActions, actions => \@Actions &>
56 <& Elements/ShowUpdateStatus, Ticket => $TicketObj &>
57 <& Elements/ShowDependencyStatus, Ticket => $TicketObj &>
58
59 % $m->callback( %ARGS, Ticket => $TicketObj, Transactions => $transactions, Attachments => $attachments, CallbackName => 'BeforeShowSummary' );
60 <div class="summary">
61 <&| /Widgets/TitleBox, title => loc('Ticket metadata') &>
62 <& /Ticket/Elements/ShowSummary,  Ticket => $TicketObj, Attachments => $attachments &>
63 </&>
64 </div>
65 <br />
66
67 % $m->callback( Ticket => $TicketObj, %ARGS, Transactions => $transactions, Attachments => $attachments, CallbackName => 'BeforeShowHistory' );
68
69 % my $ShowHistory = RT->Config->Get("ShowHistory", $session{'CurrentUser'});
70 % if ($ShowHistory eq "delay") {
71     <& /Ticket/Elements/DelayShowHistory,
72         Ticket => $TicketObj,
73         ShowHeaders => $ARGS{'ShowHeaders'},
74     &>
75 % } elsif (not $ForceShowHistory and $ShowHistory eq "click") {
76     <& /Ticket/Elements/ClickToShowHistory,
77         Ticket => $TicketObj,
78         ShowHeaders => $ARGS{'ShowHeaders'},
79     &>
80 % } else {
81     <& /Elements/ShowHistory ,
82           Object => $TicketObj,
83           Transactions => $transactions,
84           ShowHeaders => $ARGS{'ShowHeaders'},
85           Attachments => $attachments,
86           AttachmentContent => $attachment_content
87     &>
88 % }
89
90 % $m->callback( %ARGS,
91 %     Ticket       => $TicketObj,
92 %     Transactions => $transactions,
93 %     Attachments  => $attachments,
94 %     CallbackName => 'AfterShowHistory',
95 % );
96
97 <%ARGS>
98 $id => undef
99 $TicketObj => undef
100 $ShowHeaders => 0
101 $ForceShowHistory => 0
102 </%ARGS>
103
104 <%INIT>
105
106 $m->callback( TicketObj => $TicketObj, ARGSRef => \%ARGS, CallbackName => 'Initial' );
107
108 if ( ! $ARGS{'NoRedirect'} && RT::Interface::Web->MobileClient()) {
109     $id ||= $TicketObj->id if $TicketObj;
110     RT::Interface::Web::Redirect(RT->Config->Get('WebURL').'m/ticket/show?id='.$id);
111     $m->abort;
112 }
113
114
115 my (@Actions, $title);
116
117
118 unless ($id || $TicketObj) {
119     Abort('No ticket specified');
120 }
121
122 if ($ARGS{'id'} eq 'new') {
123     # Create a new ticket
124
125     my $Queue = RT::Queue->new( $session{'CurrentUser'} );
126     $Queue->Load($ARGS{'Queue'});
127     unless ( $Queue->id ) {
128         Abort('Queue not found');
129     }
130
131     unless ( $Queue->CurrentUserHasRight('CreateTicket') ) {
132         Abort('You have no permission to create tickets in that queue.');
133     }
134
135     ($TicketObj, @Actions) = CreateTicket( %ARGS );
136     unless ( $TicketObj->CurrentUserHasRight('ShowTicket') ) {
137         Abort("No permission to view newly created ticket #".$TicketObj->id.".");
138     }
139 } else { 
140     $TicketObj ||= LoadTicket($ARGS{'id'});
141
142     $TicketObj->CurrentUser->PrincipalObj->HasRights( Object => $TicketObj );
143
144     my $SkipProcessing;
145
146     $m->callback( CallbackName => 'BeforeProcessArguments',
147         TicketObj => $TicketObj,
148         ActionsRef => \@Actions, ARGSRef => \%ARGS,
149         SkipProcessing => \$SkipProcessing );
150
151     if ( !$SkipProcessing ) {
152         if ( defined $ARGS{'Action'} ) {
153             if ($ARGS{'Action'} =~ /^(Steal|Delete|Take|SetTold)$/) {
154                 my $action = $1;
155                 my ($res, $msg) = $TicketObj->$action();
156                 push(@Actions, $msg);
157             }
158         }
159
160         $m->callback(CallbackName => 'ProcessArguments', 
161                 Ticket => $TicketObj, 
162                 ARGSRef => \%ARGS, 
163                 Actions => \@Actions);
164         
165         push @Actions, ProcessUpdateMessage(
166             ARGSRef   => \%ARGS,
167             Actions   => \@Actions,
168             TicketObj => $TicketObj,
169         );
170
171         #Process status updates
172         push @Actions, ProcessTicketWatchers(ARGSRef => \%ARGS, TicketObj => $TicketObj );
173         push @Actions, ProcessTicketBasics(  ARGSRef => \%ARGS, TicketObj => $TicketObj );
174         push @Actions, ProcessTicketLinks(   ARGSRef => \%ARGS, TicketObj => $TicketObj );
175         push @Actions, ProcessTicketDates(   ARGSRef => \%ARGS, TicketObj => $TicketObj );
176         push @Actions, ProcessObjectCustomFieldUpdates(ARGSRef => \%ARGS, TicketObj => $TicketObj );
177         push @Actions, ProcessTicketReminders( ARGSRef => \%ARGS, TicketObj => $TicketObj );
178
179         unless ($TicketObj->CurrentUserHasRight('ShowTicket')) {
180             if (@Actions) {
181                 Abort("A change was applied successfully, but you no longer have permissions to view the ticket", Actions => \@Actions);
182             } else {
183                 Abort("No permission to view ticket");
184             }
185         }
186         if ( $ARGS{'MarkAsSeen'} ) {
187             $TicketObj->SetAttribute(
188                 Name => 'User-'. $TicketObj->CurrentUser->id .'-SeenUpTo',
189                 Content => $TicketObj->LastUpdated,
190             );
191             push @Actions, loc('Marked all messages as seen');
192         }
193     }
194 }
195
196
197 $title = loc("#[_1]: [_2]", $TicketObj->Id, $TicketObj->Subject || '');
198
199 $m->callback(
200     CallbackName => 'BeforeDisplay',
201     TicketObj => \$TicketObj,
202     Actions => \@Actions,
203     title => \$title,
204     ARGSRef => \%ARGS,
205 );
206
207 # This code does automatic redirection if any updates happen. 
208 MaybeRedirectForResults(
209     Actions   => \@Actions,
210     $TicketObj->Type eq 'approval' && RT->Config->Get('ForceApprovalsView')
211         ? (Path      => "/Approvals/Display.html", Force => 1)
212         : (Path      => "/Ticket/Display.html")
213     ,
214     Anchor    => $ARGS{'Anchor'},
215     Arguments => { id => $TicketObj->id },
216 );
217
218 my $transactions = $TicketObj->SortedTransactions;
219 my $attachments = $TicketObj->Attachments;
220 my $attachment_content = $TicketObj->TextAttachments;
221
222 my %link_rel;
223 if (defined $session{'tickets'} and ($ARGS{'Query'} or $session{'CurrentSearchHash'}->{'Query'})) {
224     my $item_map = $session{'tickets'}->ItemMap;
225     $link_rel{first} = "Ticket/Display.html?id=" . $item_map->{first}                if $item_map->{$TicketObj->Id}{prev};
226     $link_rel{prev}  = "Ticket/Display.html?id=" . $item_map->{$TicketObj->Id}{prev} if $item_map->{$TicketObj->Id}{prev};
227     $link_rel{next}  = "Ticket/Display.html?id=" . $item_map->{$TicketObj->Id}{next} if $item_map->{$TicketObj->Id}{next};
228     $link_rel{last}  = "Ticket/Display.html?id=" . $item_map->{last}                 if $item_map->{$TicketObj->Id}{next} && $item_map->{last};
229 }
230 </%INIT>