Files
scripts/Perl OTRS/Kernel/Output/HTML/NavBar/ModuleAdmin.pm
2024-10-14 00:08:40 +02:00

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;