198 lines
6.2 KiB
Perl
198 lines
6.2 KiB
Perl
# --
|
|
# 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;
|