%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2026 Best Practical Solutions, LLC
%#                                          <sales@bestpractical.com>
%#
%# (Except where explicitly superseded by other copyright notices)
%#
%#
%# LICENSE:
%#
%# This work is made available to you under the terms of Version 2 of
%# the GNU General Public License. A copy of that license should have
%# been provided with this software, but in any event can be snarfed
%# from www.gnu.org.
%#
%# This work is distributed in the hope that it will be useful, but
%# WITHOUT ANY WARRANTY; without even the implied warranty of
%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%# General Public License for more details.
%#
%# You should have received a copy of the GNU General Public License
%# along with this program; if not, write to the Free Software
%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%# 02110-1301 or visit their web page on the internet at
%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
%#
%#
%# CONTRIBUTION SUBMISSION POLICY:
%#
%# (The following paragraph is not intended to limit the rights granted
%# to you to modify and distribute this software under the terms of
%# the GNU General Public License and is only of importance to you if
%# you choose to contribute your changes and enhancements to the
%# community by submitting them to Best Practical Solutions, LLC.)
%#
%# By intentionally submitting any modifications, corrections or
%# derivatives to this work, or any other work intended for use with
%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
%# you are the copyright holder for those contributions and you grant
%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
%# royalty-free, perpetual, license to use, copy, create derivative
%# works based on those contributions, and sublicense and distribute
%# those contributions and any derivatives thereof.
%#
%# END BPS TAGGED BLOCK }}}
<select name="<%$Name%>" <% ($OnChange) ? 'onchange="'.$OnChange.'"' : '' |n %> class="<%$Class%> selectpicker form-control">
%     if ($ShowNullOption) {
  <option value=""><% $DefaultLabel %></option>
%     }
%     for my $object (@{$session{$cache_key}{objects}}) {
  <option value="<%   ($NamedValues ? $object->{Name} : $object->{Id}) %>"\
% if ($object->{Id} eq ($Default||'') || $object->{Name} eq ($Default||'')) {
 selected="selected"\
% }
><%$object->{Name}%>\
</option>
%     }
</select>
<%args>
$NamedValues => 0
$CheckRight => 'CreateTicket'
$ShowNullOption => 0
$ShowAll => 1
$Name => undef
$DefaultLabel => "-"
$Default => 0
$OnChange => undef
$CacheNeedsUpdate => RT->System->QueueCacheNeedsUpdate
$Lifecycle => ''
$LimitToConstituency => 0
$Constituency => undef
$AutoSubmit   => 0
</%args>
<%init>
my $Class    = "select-rtir-queue-".$Lifecycle;
# XXX TODO This cache will need to take constituency into account
my $cache_key = join "---", "SelectObject", 'rtir-queue-'.$Lifecycle,$LimitToConstituency, ($Constituency ||""),$Default,
    $session{'CurrentUser'}->Id, $CheckRight || "", $ShowAll;

if ( defined $session{$cache_key} && ref $session{$cache_key} eq 'ARRAY') {
    delete $session{$cache_key};
}
if ( defined $session{$cache_key} && defined $CacheNeedsUpdate &&
     $session{$cache_key}{lastupdated} <= $CacheNeedsUpdate ) {
    delete $session{$cache_key};
}

if ( not defined $session{$cache_key} ) {

    if ($Default && $LimitToConstituency && !$Constituency) {
        my $default_queue= RT::Queue->new($session{'CurrentUser'});
        $default_queue->Load($Default);
        $Constituency = RT::IR->ConstituencyFor($default_queue);
    }

    my $collection = RT::Queues->new($session{'CurrentUser'});
    if ($Lifecycle) {
        $collection->Limit(FIELD => 'Lifecycle', VALUE => $Lifecycle);
    } else {
        $collection->Limit(
            FIELD => 'Lifecycle',
            OPERATOR => 'IN',
            VALUE => [RT::IR->Lifecycles],
        );
    }
    $m->callback( CallbackName => 'ModifyCollection', ARGSRef => \%ARGS,
                  Collection => $collection );

    if ( $Default ) {
        my $object = RT::Queue->new($session{'CurrentUser'});
        $object->Load( $Default );
        unless ( $ShowAll
                 or not $CheckRight
                 or $session{CurrentUser}->HasRight( Object => $object, Right => $CheckRight ) )
        {
            if ( $object->id ) {
                push @{$session{$cache_key}{objects}}, {
                    Id          => $object->id,
                    Name        => '#' . $object->id,
                    Description => '#' . $object->id,
                };
            }
        }
    }

    while (my $object = $collection->Next) {
        my $object_constituency = RT::IR->ConstituencyFor($object) || '';
        next if ($LimitToConstituency && 
            ($object_constituency ne ($Constituency||'')));
        if ($ShowAll
            or not $CheckRight
            or $session{CurrentUser}->HasRight( Object => $object, Right => $CheckRight ))
        {
            push @{$session{$cache_key}{objects}}, {
                Id          => $object->Id,
                Name        => $object->Name,
                Description => $object->_Accessible("Description" => "read") ? $object->Description : undef,
                Constituency => $object_constituency
            };
        }
    }
    if ($Constituency) {
       @{$session{$cache_key}{objects}} = sort { 
        ($b->{'Constituency'} eq $Constituency)
            cmp ( $a->{'Constituency'} eq $Constituency) } 
                            @{$session{$cache_key}{objects}};
    }
    $session{$cache_key}{lastupdated} = time();
}
$OnChange = "jQuery(this).closest('form').find('input[name=QueueChanged]').val(1);";
$OnChange .= "jQuery(this).closest('form').submit();" if $AutoSubmit;
</%init>
