QueuesPanel.pm 4.85 KB
# --
# 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;