Putting 4.2.0 on top of 4.0.17
[usit-rt.git] / share / html / Elements / SelectStatus
1 %# BEGIN BPS TAGGED BLOCK {{{
2 %#
3 %# COPYRIGHT:
4 %#
5 %# This software is Copyright (c) 1996-2013 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 <select name="<%$Name%>" <% $Multiple ? qq{multiple="multiple" size="$Size"} : '' |n %>>
49 % if ( $DefaultValue ) {
50 <option value=""<% !$Default && qq[ selected="selected"] |n %>><% $DefaultLabel %></option>
51 % }
52 % for my $lifecycle (sort keys %statuses_by_lifecycle) {
53 %     if ($group_by_lifecycle) {
54 <optgroup label="<% $lifecycle %>">
55 %     }
56 %     foreach my $status (@{$statuses_by_lifecycle{$lifecycle}}) {
57 %         next if ($SkipDeleted && lc $status eq 'deleted');
58 %         my $selected = defined $Default && $status eq $Default ? 'selected="selected"' : '';
59 <option value="<% $status %>" <% $selected |n %>><% loc($status) %></option>
60 %     }
61 %     if ($group_by_lifecycle) {
62 </optgroup>
63 %     }
64 % }
65 </select>
66 <%INIT>
67 ### XXX: no cover for Tools/MyDay.html
68
69 my %statuses_by_lifecycle;
70 if ( @Statuses ) {
71     $statuses_by_lifecycle{''} = \@Statuses;
72 } else {
73     if ( $Object ) {
74         my $lifecycle = $Object->LifecycleObj;
75         if ($Object->_Accessible("Status", "read")) {
76             my $current = $Object->Status;
77             my @status;
78             push @status, $current;
79
80             my %has = ();
81             foreach my $next ( $lifecycle->Transitions( $current ) ) {
82                 my $check = $lifecycle->CheckRight( $current => $next );
83                 $has{ $check } = $Object->CurrentUserHasRight( $check )
84                     unless exists $has{ $check };
85                 push @status, $next if $has{ $check };
86             }
87             $statuses_by_lifecycle{$lifecycle->Name} = \@status;
88         } else {
89             $statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Transitions('') ];
90         }
91     }
92     for my $lifecycle ( @Lifecycles ) {
93         $statuses_by_lifecycle{$lifecycle->Name} ||= [ $lifecycle->Valid ];
94     }
95
96     if (not keys %statuses_by_lifecycle) {
97         for my $lifecycle (map { RT::Lifecycle->Load($_) } RT::Lifecycle->List($Type)) {
98             $statuses_by_lifecycle{$lifecycle->Name} = [ $lifecycle->Valid ];
99         }
100     }
101 }
102
103 if (keys %statuses_by_lifecycle) {
104     my %simplified;
105     my $key = sub {
106         join "\0", sort @{$_[0]};
107     };
108     for my $name (sort keys %statuses_by_lifecycle) {
109         my $matched;
110         my $statuses = $statuses_by_lifecycle{$name};
111         for my $simple (sort keys %simplified) {
112             if ($key->($statuses) eq $key->($simplified{$simple})) {
113                 # Statuses are the same, join 'em!
114                 $simplified{"$simple, $name"} = delete $simplified{$simple};
115                 $matched++;
116                 last;
117             }
118         }
119         unless ($matched) {
120             $simplified{$name} = $statuses;
121         }
122     }
123     %statuses_by_lifecycle = %simplified;
124 }
125
126 my $group_by_lifecycle = keys %statuses_by_lifecycle > 1;
127 </%INIT>
128 <%ARGS>
129 $Name => undef
130 $Type => undef,
131
132 @Statuses => ()
133 $Object => undef,
134 @Lifecycles => (),
135
136 $Default => ''
137 $SkipDeleted => 0
138 $DefaultValue => 1
139 $DefaultLabel => "-"
140
141 $Multiple => 0
142 $Size => 6
143 </%ARGS>