This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View 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;

View 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;

View 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;

View 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;

View 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;

View 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;