init III
This commit is contained in:
96
Perl OTRS/Kernel/Output/HTML/NavBar/AdminFavourites.pm
Normal file
96
Perl OTRS/Kernel/Output/HTML/NavBar/AdminFavourites.pm
Normal file
@@ -0,0 +1,96 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::AdminFavourites;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Kernel::System::VariableCheck qw(:all);
|
||||
use Unicode::Collate::Locale;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::Output::HTML::Layout',
|
||||
'Kernel::System::JSON',
|
||||
'Kernel::System::User',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# get process management configuration
|
||||
my $FrontendModuleConfig = $ConfigObject->Get('Frontend::Module')->{Admin};
|
||||
my $FrontendNavigationConfig = $ConfigObject->Get('Frontend::Navigation')->{Admin};
|
||||
|
||||
# check if the registration config is valid
|
||||
return if !IsHashRefWithData($FrontendModuleConfig);
|
||||
return if !IsHashRefWithData($FrontendNavigationConfig);
|
||||
return if !IsArrayRefWithData( $FrontendNavigationConfig->{'001-Framework'} );
|
||||
|
||||
my $NameForID = $FrontendNavigationConfig->{'001-Framework'}->[0]->{Name};
|
||||
$NameForID =~ s/[ &;]//ig;
|
||||
|
||||
# check if the module name is valid
|
||||
return if !$NameForID;
|
||||
|
||||
my %UserPreferences = $Kernel::OM->Get('Kernel::System::User')->GetPreferences(
|
||||
UserID => $Self->{UserID},
|
||||
);
|
||||
|
||||
my $PrefFavourites = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
|
||||
Data => $UserPreferences{AdminNavigationBarFavourites},
|
||||
) || [];
|
||||
|
||||
my %Return = %{ $Param{NavBar}->{Sub} || {} };
|
||||
|
||||
my @Favourites;
|
||||
MODULE:
|
||||
for my $Module ( sort @{$PrefFavourites} ) {
|
||||
my $ModuleConfig = $ConfigObject->Get('Frontend::NavigationModule')->{$Module};
|
||||
next MODULE if !$ModuleConfig;
|
||||
$ModuleConfig->{Link} //= "Action=$Module";
|
||||
push @Favourites, $ModuleConfig;
|
||||
}
|
||||
|
||||
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
||||
|
||||
# Create collator according to the user chosen language.
|
||||
my $Collator = Unicode::Collate::Locale->new(
|
||||
locale => $LayoutObject->{LanguageObject}->{UserLanguage},
|
||||
);
|
||||
|
||||
@Favourites = sort {
|
||||
$Collator->cmp(
|
||||
$LayoutObject->{LanguageObject}->Translate( $a->{Name} ),
|
||||
$LayoutObject->{LanguageObject}->Translate( $b->{Name} )
|
||||
)
|
||||
} @Favourites;
|
||||
|
||||
if (@Favourites) {
|
||||
my $AdminModuleConfig = $ConfigObject->Get('Frontend::NavigationModule')->{Admin};
|
||||
$AdminModuleConfig->{Name} = $LayoutObject->{LanguageObject}->Translate('Overview');
|
||||
$AdminModuleConfig->{Link} //= "Action=Admin";
|
||||
unshift @Favourites, $AdminModuleConfig;
|
||||
}
|
||||
|
||||
my $Counter = 0;
|
||||
for my $Favourite (@Favourites) {
|
||||
$Return{ $FrontendModuleConfig->{NavBarName} }->{$Counter} = $Favourite;
|
||||
$Counter++;
|
||||
}
|
||||
|
||||
return ( Sub => \%Return );
|
||||
}
|
||||
|
||||
1;
|
||||
139
Perl OTRS/Kernel/Output/HTML/NavBar/AgentTicketProcess.pm
Normal file
139
Perl OTRS/Kernel/Output/HTML/NavBar/AgentTicketProcess.pm
Normal file
@@ -0,0 +1,139 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::AgentTicketProcess;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Kernel::System::VariableCheck qw(:all);
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::System::Cache',
|
||||
'Kernel::System::Ticket',
|
||||
'Kernel::System::ProcessManagement::Process',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# get process management configuration
|
||||
my $FrontendModuleConfig = $ConfigObject->Get('Frontend::Module')->{AgentTicketProcess};
|
||||
my $FrontendNavigationConfig = $ConfigObject->Get('Frontend::Navigation')->{AgentTicketProcess};
|
||||
|
||||
# check if the registration config is valid
|
||||
return if !IsHashRefWithData($FrontendModuleConfig);
|
||||
return if !IsHashRefWithData($FrontendNavigationConfig);
|
||||
return if !IsArrayRefWithData( $FrontendNavigationConfig->{'002-ProcessManagement'} );
|
||||
|
||||
my $NameForID = $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Name};
|
||||
$NameForID =~ s/[ &;]//ig;
|
||||
|
||||
# check if the module name is valid
|
||||
return if !$NameForID;
|
||||
|
||||
my $DisplayMenuItem;
|
||||
|
||||
# check the cache
|
||||
my $CacheKey = 'ProcessManagement::UserID' . $Self->{UserID} . '::DisplayMenuItem';
|
||||
|
||||
# get cache object
|
||||
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
|
||||
|
||||
my $Cache = $CacheObject->Get(
|
||||
Type => 'ProcessManagement_Process',
|
||||
Key => $CacheKey,
|
||||
);
|
||||
|
||||
# set the cache value to show or hide the menu item (if value exists)
|
||||
if ( $Cache && ref $Cache eq 'SCALAR' ) {
|
||||
$DisplayMenuItem = ${$Cache};
|
||||
}
|
||||
|
||||
# otherwise determine the value by quering the process object
|
||||
else {
|
||||
|
||||
$DisplayMenuItem = 0;
|
||||
my $Processes = $ConfigObject->Get('Process');
|
||||
|
||||
# avoid error messages when there is no processes and call ProcessList
|
||||
if ( IsHashRefWithData($Processes) ) {
|
||||
|
||||
# get process list
|
||||
my $ProcessList = $Kernel::OM->Get('Kernel::System::ProcessManagement::Process')->ProcessList(
|
||||
ProcessState => ['Active'],
|
||||
Interface => ['AgentInterface'],
|
||||
);
|
||||
|
||||
# prepare process list for ACLs, use only entities instead of names, convert from
|
||||
# P1 => Name to P1 => P1. As ACLs should work only against entities
|
||||
my %ProcessListACL = map { $_ => $_ } sort keys %{$ProcessList};
|
||||
|
||||
# get ticket object
|
||||
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
|
||||
|
||||
# validate the ProcessList with stored ACLs
|
||||
my $ACL = $TicketObject->TicketAcl(
|
||||
ReturnType => 'Process',
|
||||
ReturnSubType => '-',
|
||||
Data => \%ProcessListACL,
|
||||
UserID => $Self->{UserID},
|
||||
);
|
||||
|
||||
if ( IsHashRefWithData($ProcessList) && $ACL ) {
|
||||
|
||||
# get ACL results
|
||||
my %ACLData = $TicketObject->TicketAclData();
|
||||
|
||||
# recover process names
|
||||
my %ReducedProcessList = map { $_ => $ProcessList->{$_} } sort keys %ACLData;
|
||||
|
||||
# replace original process list with the reduced one
|
||||
$ProcessList = \%ReducedProcessList;
|
||||
}
|
||||
|
||||
# set the value to show or hide the menu item (based in process list)
|
||||
if ( IsHashRefWithData($ProcessList) ) {
|
||||
$DisplayMenuItem = 1;
|
||||
}
|
||||
}
|
||||
|
||||
# get the cache TTL (in seconds)
|
||||
my $CacheTTL = int( $Kernel::OM->Get('Kernel::Config')->Get('Process::NavBar::CacheTTL') || 900 );
|
||||
|
||||
# set cache
|
||||
$CacheObject->Set(
|
||||
Type => 'ProcessManagement_Process',
|
||||
Key => $CacheKey,
|
||||
Value => \$DisplayMenuItem,
|
||||
TTL => $CacheTTL,
|
||||
);
|
||||
}
|
||||
|
||||
# return nothing to display the menu item
|
||||
return if $DisplayMenuItem;
|
||||
|
||||
# frontend module is enabled but there is no selectable process, then remove the menu entry
|
||||
my $NavBarName = $FrontendModuleConfig->{NavBarName};
|
||||
my $Priority = sprintf( '%07d', $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Prio} );
|
||||
|
||||
my %Return = %{ $Param{NavBar}->{Sub} || {} };
|
||||
|
||||
# remove AgentTicketProcess from the TicketMenu
|
||||
delete $Return{$NavBarName}->{$Priority};
|
||||
|
||||
return ( Sub => \%Return );
|
||||
}
|
||||
|
||||
1;
|
||||
51
Perl OTRS/Kernel/Output/HTML/NavBar/AgentTicketService.pm
Normal file
51
Perl OTRS/Kernel/Output/HTML/NavBar/AgentTicketService.pm
Normal file
@@ -0,0 +1,51 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::AgentTicketService;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Kernel::System::VariableCheck qw(:all);
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# check if frontend module is registered (otherwise return)
|
||||
my $Config = $ConfigObject->Get('Frontend::Module')->{AgentTicketService};
|
||||
my $Navigation = $ConfigObject->Get('Frontend::Navigation')->{AgentTicketService};
|
||||
|
||||
return if !IsHashRefWithData($Config);
|
||||
return if !IsHashRefWithData($Navigation);
|
||||
return if !IsArrayRefWithData( $Navigation->{'002-Ticket'} );
|
||||
|
||||
# check if ticket service feature is enabled, in such case there is nothing to do
|
||||
return if $ConfigObject->Get('Ticket::Service');
|
||||
|
||||
# frontend module is enabled but not ticket service, then remove the menu entry
|
||||
my $NavBarName = $Config->{NavBarName};
|
||||
my $Priority = sprintf( '%07d', $Navigation->{'002-Ticket'}->[0]->{Prio} );
|
||||
|
||||
my %Return = %{ $Param{NavBar}->{Sub} };
|
||||
|
||||
# remove AgentTicketService from the TicketMenu
|
||||
delete $Return{$NavBarName}->{$Priority};
|
||||
|
||||
return ( Sub => \%Return );
|
||||
}
|
||||
|
||||
1;
|
||||
50
Perl OTRS/Kernel/Output/HTML/NavBar/CustomerCompany.pm
Normal file
50
Perl OTRS/Kernel/Output/HTML/NavBar/CustomerCompany.pm
Normal file
@@ -0,0 +1,50 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::CustomerCompany;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# check if frontend module is registared
|
||||
my $Config = $ConfigObject->Get('Frontend::Module')->{AdminCustomerCompany};
|
||||
return if !$Config;
|
||||
|
||||
# check if customer company support feature is active
|
||||
SOURCE:
|
||||
for my $Item ( '', 1 .. 10 ) {
|
||||
my $CustomerMap = $ConfigObject->Get( 'CustomerUser' . $Item );
|
||||
next SOURCE if !$CustomerMap;
|
||||
|
||||
# return if CustomerCompany feature is used
|
||||
return if $CustomerMap->{CustomerCompanySupport};
|
||||
}
|
||||
|
||||
# frontend module is enabled but not customer company support feature, then remove the menu entry
|
||||
my $NavBarName = $Config->{NavBarName};
|
||||
my %Return = %{ $Param{NavBar}->{Sub} };
|
||||
|
||||
# remove CustomerCompany from the CustomerMenu
|
||||
delete $Return{$NavBarName}->{ItemArea0009100};
|
||||
|
||||
return ( Sub => \%Return );
|
||||
}
|
||||
|
||||
1;
|
||||
143
Perl OTRS/Kernel/Output/HTML/NavBar/CustomerTicketProcess.pm
Normal file
143
Perl OTRS/Kernel/Output/HTML/NavBar/CustomerTicketProcess.pm
Normal file
@@ -0,0 +1,143 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::CustomerTicketProcess;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Kernel::System::VariableCheck qw(:all);
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::System::Cache',
|
||||
'Kernel::System::Ticket',
|
||||
'Kernel::System::ProcessManagement::Process',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# get process management configuration
|
||||
my $FrontendModuleConfig = $ConfigObject->Get('CustomerFrontend::Module')->{CustomerTicketProcess};
|
||||
my $FrontendNavigationConfig = $ConfigObject->Get('CustomerFrontend::Navigation')->{CustomerTicketProcess};
|
||||
|
||||
# check if the registration config is valid
|
||||
return if !IsHashRefWithData($FrontendModuleConfig);
|
||||
return if !IsHashRefWithData($FrontendNavigationConfig);
|
||||
return if !IsArrayRefWithData( $FrontendNavigationConfig->{'002-ProcessManagement'} );
|
||||
|
||||
my $NameForID = $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Name};
|
||||
my $NameForHidden = $NameForID;
|
||||
$NameForID =~ s/[ &;]//ig;
|
||||
|
||||
# check if the module name is valid
|
||||
return if !$NameForID;
|
||||
|
||||
my $DisplayMenuItem;
|
||||
|
||||
# check the cache
|
||||
my $CacheKey = 'ProcessManagement::UserID' . $Self->{UserID} . '::DisplayMenuItem';
|
||||
|
||||
# get cache object
|
||||
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
|
||||
|
||||
my $Cache = $CacheObject->Get(
|
||||
Type => 'ProcessManagement_Process',
|
||||
Key => $CacheKey,
|
||||
);
|
||||
|
||||
# set the cache value to show or hide the menu item (if value exists)
|
||||
if ( $Cache && ref $Cache eq 'SCALAR' ) {
|
||||
$DisplayMenuItem = ${$Cache};
|
||||
}
|
||||
|
||||
# otherwise determine the value by quering the process object
|
||||
else {
|
||||
|
||||
$DisplayMenuItem = 0;
|
||||
my $Processes = $ConfigObject->Get('Process');
|
||||
|
||||
# avoid error messages when there is no processes and call ProcessList
|
||||
if ( IsHashRefWithData($Processes) ) {
|
||||
|
||||
# get process list
|
||||
my $ProcessList = $Kernel::OM->Get('Kernel::System::ProcessManagement::Process')->ProcessList(
|
||||
ProcessState => ['Active'],
|
||||
Interface => ['CustomerInterface'],
|
||||
);
|
||||
|
||||
# prepare process list for ACLs, use only entities instead of names, convert from
|
||||
# P1 => Name to P1 => P1. As ACLs should work only against entities
|
||||
my %ProcessListACL = map { $_ => $_ } sort keys %{$ProcessList};
|
||||
|
||||
# get ticket object
|
||||
my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
|
||||
|
||||
# validate the ProcessList with stored ACLs
|
||||
my $ACL = $TicketObject->TicketAcl(
|
||||
ReturnType => 'Process',
|
||||
ReturnSubType => '-',
|
||||
Data => \%ProcessListACL,
|
||||
CustomerUserID => $Self->{UserID},
|
||||
);
|
||||
|
||||
if ( IsHashRefWithData($ProcessList) && $ACL ) {
|
||||
|
||||
# get ACL results
|
||||
my %ACLData = $TicketObject->TicketAclData();
|
||||
|
||||
# recover process names
|
||||
my %ReducedProcessList = map { $_ => $ProcessList->{$_} } sort keys %ACLData;
|
||||
|
||||
# replace original process list with the reduced one
|
||||
$ProcessList = \%ReducedProcessList;
|
||||
}
|
||||
|
||||
# set the value to show or hide the menu item (based in process list)
|
||||
if ( IsHashRefWithData($ProcessList) ) {
|
||||
$DisplayMenuItem = 1;
|
||||
}
|
||||
}
|
||||
|
||||
# get the cache TTL (in seconds)
|
||||
my $CacheTTL = int( $Kernel::OM->Get('Kernel::Config')->Get('Process::NavBar::CacheTTL') || 900 );
|
||||
|
||||
# set cache
|
||||
$CacheObject->Set(
|
||||
Type => 'ProcessManagement_Process',
|
||||
Key => $CacheKey,
|
||||
Value => \$DisplayMenuItem,
|
||||
TTL => $CacheTTL,
|
||||
);
|
||||
}
|
||||
|
||||
# return nothing to display the menu item
|
||||
return if $DisplayMenuItem;
|
||||
|
||||
# frontend module is enabled but there is no selectable process, then remove the menu entry
|
||||
my $NavBarName = $FrontendModuleConfig->{NavBarName};
|
||||
my $Priority = sprintf( '%07d', $FrontendNavigationConfig->{'002-ProcessManagement'}->[0]->{Prio} );
|
||||
|
||||
my %Return = %{ $Param{NavBarModule}->{Sub} };
|
||||
|
||||
# remove CustomerTicketProcess from the TicketMenu
|
||||
delete $Return{$NavBarName}->{$Priority};
|
||||
|
||||
# remove CustomerTicketProcess from the Menu if set outside of the TicketMenu, see bug #11393
|
||||
delete $Param{NavBarModule}->{$Priority};
|
||||
|
||||
return ( Sub => \%Return );
|
||||
}
|
||||
|
||||
1;
|
||||
197
Perl OTRS/Kernel/Output/HTML/NavBar/ModuleAdmin.pm
Normal file
197
Perl OTRS/Kernel/Output/HTML/NavBar/ModuleAdmin.pm
Normal file
@@ -0,0 +1,197 @@
|
||||
# --
|
||||
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
||||
# --
|
||||
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
||||
# the enclosed file COPYING for license information (GPL). If you
|
||||
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
||||
# --
|
||||
|
||||
package Kernel::Output::HTML::NavBar::ModuleAdmin;
|
||||
|
||||
use parent 'Kernel::Output::HTML::Base';
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Unicode::Collate::Locale;
|
||||
|
||||
our @ObjectDependencies = (
|
||||
'Kernel::Config',
|
||||
'Kernel::Output::HTML::Layout',
|
||||
'Kernel::System::Group',
|
||||
'Kernel::System::JSON',
|
||||
'Kernel::System::User',
|
||||
);
|
||||
|
||||
sub Run {
|
||||
my ( $Self, %Param ) = @_;
|
||||
|
||||
# get layout object
|
||||
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
|
||||
|
||||
# only show it on admin start screen
|
||||
return '' if $LayoutObject->{Action} ne 'Admin';
|
||||
|
||||
# get config object
|
||||
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
|
||||
|
||||
# generate manual link
|
||||
my $ManualVersion = $ConfigObject->Get('Version');
|
||||
$ManualVersion =~ m{^(\d{1,2}).+};
|
||||
$ManualVersion = $1;
|
||||
|
||||
# get all Frontend::Module
|
||||
my %NavBarModule;
|
||||
|
||||
my $Config = $ConfigObject->Get('Frontend::Module') || {};
|
||||
my $NavigationModule = $ConfigObject->Get('Frontend::NavigationModule') || {};
|
||||
|
||||
MODULE:
|
||||
for my $Module ( sort keys %{$NavigationModule} ) {
|
||||
my %Hash = %{ $NavigationModule->{$Module} };
|
||||
|
||||
next MODULE if !$Hash{Name};
|
||||
next MODULE if !$Config->{$Module}; # If module is not registered, skip it.
|
||||
|
||||
if ( $Hash{Module} eq 'Kernel::Output::HTML::NavBar::ModuleAdmin' ) {
|
||||
|
||||
# check permissions (only show accessable modules)
|
||||
my $Shown = 0;
|
||||
my $GroupObject = $Kernel::OM->Get('Kernel::System::Group');
|
||||
|
||||
for my $Permission (qw(GroupRo Group)) {
|
||||
|
||||
# no access restriction
|
||||
if (
|
||||
ref $Hash{GroupRo} eq 'ARRAY'
|
||||
&& !scalar @{ $Hash{GroupRo} }
|
||||
&& ref $Hash{Group} eq 'ARRAY'
|
||||
&& !scalar @{ $Hash{Group} }
|
||||
)
|
||||
{
|
||||
$Shown = 1;
|
||||
}
|
||||
|
||||
# array access restriction
|
||||
elsif ( $Hash{$Permission} && ref $Hash{$Permission} eq 'ARRAY' ) {
|
||||
for my $Group ( @{ $Hash{$Permission} } ) {
|
||||
my $HasPermission = $GroupObject->PermissionCheck(
|
||||
UserID => $Self->{UserID},
|
||||
GroupName => $Group,
|
||||
Type => $Permission eq 'GroupRo' ? 'ro' : 'rw',
|
||||
);
|
||||
if ($HasPermission) {
|
||||
$Shown = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
next MODULE if !$Shown;
|
||||
|
||||
$NavBarModule{$Module} = {
|
||||
'Frontend::Module' => $Module,
|
||||
%Hash,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
# get modules which were marked as favorite by the current user
|
||||
my %UserPreferences = $Kernel::OM->Get('Kernel::System::User')->GetPreferences(
|
||||
UserID => $Self->{UserID},
|
||||
);
|
||||
my @Favourites;
|
||||
my @FavouriteModules;
|
||||
my $PrefFavourites = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
|
||||
Data => $UserPreferences{AdminNavigationBarFavourites},
|
||||
) || [];
|
||||
|
||||
@Favourites = sort {
|
||||
$LayoutObject->{LanguageObject}->Translate( $a->{Name} )
|
||||
cmp $LayoutObject->{LanguageObject}->Translate( $b->{Name} )
|
||||
} @Favourites;
|
||||
|
||||
my @ModuleGroups;
|
||||
my $ModuleGroupsConfig = $ConfigObject->Get('Frontend::AdminModuleGroups');
|
||||
|
||||
# get all registered groups
|
||||
for my $Group ( sort keys %{$ModuleGroupsConfig} ) {
|
||||
for my $Key ( sort keys %{ $ModuleGroupsConfig->{$Group} } ) {
|
||||
push @ModuleGroups, {
|
||||
'Key' => $Key,
|
||||
'Order' => $ModuleGroupsConfig->{$Group}->{$Key}->{Order},
|
||||
'Title' => $ModuleGroupsConfig->{$Group}->{$Key}->{Title},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
# sort groups by order number
|
||||
@ModuleGroups = sort { $a->{Order} <=> $b->{Order} } @ModuleGroups;
|
||||
|
||||
my %Modules;
|
||||
ITEMS:
|
||||
for my $Module ( sort keys %NavBarModule ) {
|
||||
|
||||
# dont show the admin overview as a tile
|
||||
next ITEMS if ( $NavBarModule{$Module}->{'Link'} && $NavBarModule{$Module}->{'Link'} eq 'Action=Admin' );
|
||||
|
||||
if ( grep { $_ eq $Module } @{$PrefFavourites} ) {
|
||||
push @Favourites, $NavBarModule{$Module};
|
||||
$NavBarModule{$Module}->{IsFavourite} = 1;
|
||||
}
|
||||
|
||||
# add the item to its Block
|
||||
my $Block = $NavBarModule{$Module}->{'Block'} || 'Miscellaneous';
|
||||
if ( !grep { $_->{Key} eq $Block } @ModuleGroups ) {
|
||||
$Block = 'Miscellaneous';
|
||||
}
|
||||
push @{ $Modules{$Block} }, $NavBarModule{$Module};
|
||||
}
|
||||
|
||||
# Create collator according to the user chosen language.
|
||||
my $Collator = Unicode::Collate::Locale->new(
|
||||
locale => $LayoutObject->{LanguageObject}->{UserLanguage},
|
||||
);
|
||||
|
||||
@Favourites = sort {
|
||||
$Collator->cmp(
|
||||
$LayoutObject->{LanguageObject}->Translate( $a->{Name} ),
|
||||
$LayoutObject->{LanguageObject}->Translate( $b->{Name} )
|
||||
)
|
||||
} @Favourites;
|
||||
|
||||
for my $Favourite (@Favourites) {
|
||||
push @FavouriteModules, $Favourite->{'Frontend::Module'};
|
||||
}
|
||||
|
||||
# Sort the items within the groups.
|
||||
for my $Block ( sort keys %Modules ) {
|
||||
for my $Entry ( @{ $Modules{$Block} } ) {
|
||||
$Entry->{NameTranslated} = $LayoutObject->{LanguageObject}->Translate( $Entry->{Name} );
|
||||
}
|
||||
@{ $Modules{$Block} }
|
||||
= sort { $Collator->cmp( $a->{NameTranslated}, $b->{NameTranslated} ) } @{ $Modules{$Block} };
|
||||
}
|
||||
|
||||
$LayoutObject->Block(
|
||||
Name => 'AdminNavBar',
|
||||
Data => {
|
||||
ManualVersion => $ManualVersion,
|
||||
Items => \%Modules,
|
||||
Groups => \@ModuleGroups,
|
||||
Favourites => \@Favourites,
|
||||
},
|
||||
);
|
||||
|
||||
$LayoutObject->AddJSData(
|
||||
Key => 'Favourites',
|
||||
Value => \@FavouriteModules,
|
||||
);
|
||||
|
||||
my $Output = $LayoutObject->Output(
|
||||
TemplateFile => 'AdminNavigationBar',
|
||||
Data => \%Param,
|
||||
);
|
||||
|
||||
return $Output;
|
||||
}
|
||||
|
||||
1;
|
||||
Reference in New Issue
Block a user