# -- # Kernel/System/QueuesPanel.pm - logic for queues panel module # # Copyright (C) SeTIC - UFSC - http://setic.ufsc.br/ # Version 29/10/2015 - First version # # -- # This software comes with ABSOLUTELY NO WARRANTY. For details, see # the enclosed file COPYING for license information (AGPL). If you # did not receive this file, see http://www.gnu.org/licenses/agpl.txt. # -- package Kernel::System::QueuesPanel; use strict; use warnings; use Kernel::System::VariableCheck qw(:all); use Data::Dumper; use JSON; our @ObjectDependencies = ( "Kernel::System::DB", "KerneL::System::Log", "Kernel::System::Queue"); sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {%Param}; bless( $Self, $Type ); return $Self; } =head Builds the JavaScript for the Queues Panel component (jQuery hColumns) Params: IgnoreQueuesID - comma-separated list of queues to ignore ExtraQueues - line-break separated list of extra queues to include. Each line has a name for the queue and a link, separated by "||" - example: SeTIC|http://setic.ufsc.br =cut sub BuildQueuesJS { my ( $Self, %Param ) = @_; # Get queues my %Queues = (); my %ExtraQueuesLinks = (); my $DBObject = $Kernel::OM->Get("Kernel::System::DB"); if ($Param{IgnoreQueuesIDs}) { $DBObject->Prepare( SQL => "SELECT id, name FROM queue WHERE valid_id = 1 AND id NOT IN (" . $Param{IgnoreQueuesIDs} . ") ORDER BY name ASC", ); } else { $DBObject->Prepare( SQL => "SELECT id, name FROM queue WHERE valid_id = 1 ORDER BY name ASC", ); } while ( my @Row = $DBObject->FetchrowArray() ) { $Queues{ $Row[0] } = $Row[1]; } if ($Param{ExtraQueues}) { my @extraQueues = split('\n', $Param{ExtraQueues}); my $id = -1; foreach my $extraQueue (@extraQueues) { my @data = split('\|', $extraQueue); $Queues{$id} = $data[0]; $ExtraQueuesLinks{$id} = $data[1]; $id = $id - 1; } } my %result = (); for my $queue ( keys %Queues ) { $result{$queue} = $Self->BuildQueueJS( Queues => \%Queues, Queue => $Queues{$queue}, QueueID => $queue, ExtraQueuesLinks => \%ExtraQueuesLinks, URL => $Param{URL} ); } $result{-1} = $Self->BuildTopQueuesJS( Queues => \%Queues, ExtraQueuesLinks => \%ExtraQueuesLinks, URL => $Param{URL} ); my $json = encode_json \%result; $Self->Debug("Queue data: " . $json); return $json; } =head Builds the top level queues JavaScript Params: Queues - queues list ExtraQueuesLinks - links for custom (id < 0) queues =cut sub BuildTopQueuesJS { my ( $Self, %Param ) = @_; my %Queues = %{ $Param{"Queues"} }; my %ExtraQueuesLinks = %{ $Param{"ExtraQueuesLinks"} }; my @topQueues = grep { index( $Queues{$_}, '::' ) == -1 } keys %Queues; my @result = (); for my $queue (sort {$Queues{$a} cmp $Queues{$b}} @topQueues) { my %data = (); if ( grep { index( $Queues{$_}, $Queues{$queue} . "::" ) >= 0 } keys %Queues ) { $data{id} = $queue; $data{label} = $Self->LastQueue( $Queues{$queue} ); $data{type} = "folder"; } else { $data{id} = $queue; $data{label} = $Self->LastQueue( $Queues{$queue} ); $data{type} = "link"; $data{url} = ($queue < 0 ? $ExtraQueuesLinks{$queue} : $Param{"URL"} . $queue); } push @result, \%data; } return \@result; } =head Builds sub-queues JavaScript Params: Queues - queues list ExtraQueuesLinks - links for custom (id < 0) queues BaseQueue / BaseQueueID - which upper queue to generate subqueues =cut sub BuildQueueJS { my ( $Self, %Param ) = @_; my %Queues = %{ $Param{"Queues"} }; my $BaseQueue = $Param{"Queue"}; my $BaseQueueID = $Param{"QueueID"}; my %ExtraQueuesLinks = %{ $Param{"ExtraQueuesLinks"} }; # Get subqueues my @subqueues = grep { index( $Queues{$_}, $BaseQueue . "::" ) >= 0 } keys %Queues; my $level = () = $BaseQueue =~ /::/g; $level = $level + 1; # Remove subsubqueues @subqueues = grep { ( () = $Queues{$_} =~ /::/g ) == $level } @subqueues; # When there are no subqueues, there is no need to create a JS if ( !@subqueues ) { return ""; } my @result = (); for my $queue (sort {$Queues{$a} cmp $Queues{$b}} @subqueues) { my %data = (); if ( grep { index( $Queues{$_}, $Queues{$queue} . "::" ) >= 0 } keys %Queues ) { $data{id} = $queue; $data{label} = $Self->LastQueue( $Queues{$queue} ); $data{type} = "folder"; } else { $data{id} = $queue; $data{label} = $Self->LastQueue( $Queues{$queue} ); $data{type} = "link"; $data{url} = ($queue < 0 ? $ExtraQueuesLinks{$queue} : $Param{"URL"} . $queue); } push @result, \%data; } return \@result; } =head Returns last part of the queue name (strips parent queues) Params: QueueName =cut sub LastQueue { my $Self = shift; my $queue = shift; my @parts = split( "::", $queue ); return $parts[-1]; } sub Debug { my $Self = shift; my $msg = shift; $Kernel::OM->Get("Kernel::System::Log")->Log( Priority => 'debug', Message => $msg ); } 1;