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