Files
2024-10-14 00:08:40 +02:00

430 lines
15 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::FAQOverview::Small;
use strict;
use warnings;
use Kernel::System::VariableCheck qw(:all);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::Output::HTML::Layout',
'Kernel::System::DynamicField',
'Kernel::System::DynamicField::Backend',
'Kernel::System::FAQ',
'Kernel::System::Log',
);
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {%Param};
bless( $Self, $Type );
# get UserID param
$Self->{UserID} = $Param{UserID} || die "Got no UserID!";
return $Self;
}
sub Run {
my ( $Self, %Param ) = @_;
for my $Needed (qw(PageShown StartHit)) {
if ( !$Param{$Needed} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Need $Needed!",
);
return;
}
}
if ( !$Param{FAQIDs} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => 'Need the FAQIDs!',
);
return;
}
# store the FAQIDs
my @IDs;
if ( $Param{FAQIDs} && ref $Param{FAQIDs} eq 'ARRAY' ) {
@IDs = @{ $Param{FAQIDs} };
}
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
my $MultiLanguage = $ConfigObject->Get('FAQ::MultiLanguage');
# get dynamic field config for frontend module
my $DynamicFieldFilter = $ConfigObject->Get("FAQ::Frontend::OverviewSmall")->{DynamicField};
# get the dynamic fields for this screen
my $DynamicField = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldListGet(
Valid => 1,
ObjectType => ['FAQ'],
FieldFilter => $DynamicFieldFilter || {},
);
my @ShowColumns;
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
if (@IDs) {
# check ShowColumns parameter
if ( $Param{ShowColumns} && ref $Param{ShowColumns} eq 'ARRAY' ) {
@ShowColumns = @{ $Param{ShowColumns} };
}
# get dynamic field backend object
my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
# build column header blocks
if (@ShowColumns) {
# call main block
$LayoutObject->Block( Name => 'RecordForm' );
COLUMN:
for my $Column (@ShowColumns) {
next COLUMN if ( $Column eq 'Language' && !$MultiLanguage );
# create needed variables
my $CSS = 'OverviewHeader';
my $OrderBy;
# remove ID if necessary
if ( $Param{SortBy} ) {
$Param{SortBy} = $Param{SortBy} eq 'PriorityID'
? 'Priority'
: $Param{SortBy} eq 'CategoryID' ? 'Category'
: $Param{SortBy} eq 'LanguageID' ? 'Language'
: $Param{SortBy} eq 'StateID' ? 'State'
: $Param{SortBy} eq 'FAQID' ? 'Number'
: $Param{SortBy};
}
# set the correct Set CSS class and order by link
if ( $Param{SortBy} && ( $Param{SortBy} eq $Column ) ) {
if ( $Param{OrderBy} && ( $Param{OrderBy} eq 'Up' ) ) {
$OrderBy = 'Down';
$CSS .= ' SortDescendingLarge';
}
else {
$OrderBy = 'Up';
$CSS .= ' SortAscendingLarge';
}
}
else {
$OrderBy = 'Up';
}
$LayoutObject->Block(
Name => 'Record' . $Column . 'Header',
Data => {
%Param,
CSS => $CSS,
OrderBy => $OrderBy,
},
);
}
# Dynamic fields
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{$DynamicField} ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
my $Label = $DynamicFieldConfig->{Label};
# get field sortable condition
my $IsSortable = $DynamicFieldBackendObject->HasBehavior(
DynamicFieldConfig => $DynamicFieldConfig,
Behavior => 'IsSortable',
);
if ($IsSortable) {
my $CSS = 'OverviewHeader';
my $OrderBy;
if (
$Param{SortBy}
&& ( $Param{SortBy} eq ( 'DynamicField_' . $DynamicFieldConfig->{Name} ) )
)
{
if ( $Param{OrderBy} && ( $Param{OrderBy} eq 'Up' ) ) {
$OrderBy = 'Down';
$CSS .= ' SortDescendingLarge';
}
else {
$OrderBy = 'Up';
$CSS .= ' SortAscendingLarge';
}
}
else {
$OrderBy = 'Up';
}
$LayoutObject->Block(
Name => 'RecordDynamicFieldHeader',
Data => {
%Param,
CSS => $CSS,
},
);
$LayoutObject->Block(
Name => 'RecordDynamicFieldHeaderSortable',
Data => {
%Param,
OrderBy => $OrderBy,
Label => $Label,
DynamicFieldName => $DynamicFieldConfig->{Name},
},
);
# example of dynamic fields order customization
$LayoutObject->Block(
Name => 'RecordDynamicField_' . $DynamicFieldConfig->{Name} . 'Header',
Data => {
%Param,
CSS => $CSS,
},
);
$LayoutObject->Block(
Name => 'RecordDynamicField_'
. $DynamicFieldConfig->{Name}
. 'HeaderSortable',
Data => {
%Param,
OrderBy => $OrderBy,
Label => $Label,
DynamicFieldName => $DynamicFieldConfig->{Name},
},
);
}
else {
$LayoutObject->Block(
Name => 'RecordDynamicFieldHeader',
Data => {
%Param,
},
);
$LayoutObject->Block(
Name => 'RecordDynamicFieldHeaderNotSortable',
Data => {
%Param,
Label => $Label,
},
);
# example of dynamic fields order customization
$LayoutObject->Block(
Name => 'RecordDynamicField_' . $DynamicFieldConfig->{Name} . 'Header',
Data => {
%Param,
},
);
$LayoutObject->Block(
Name => 'RecordDynamicField_'
. $DynamicFieldConfig->{Name}
. 'HeaderNotSortable',
Data => {
%Param,
Label => $Label,
},
);
}
}
}
my $Counter = 0;
ID:
for my $ID (@IDs) {
$Counter++;
if (
$Counter >= $Param{StartHit}
&& $Counter < ( $Param{PageShown} + $Param{StartHit} )
)
{
# to store all data
my %Data;
my $FAQObject = $Kernel::OM->Get('Kernel::System::FAQ');
my %FAQ = $FAQObject->FAQGet(
ItemID => $ID,
ItemFields => 0,
UserID => $Self->{UserID},
);
$FAQ{CleanTitle} = $FAQObject->FAQArticleTitleClean(
Title => $FAQ{Title},
Size => $Param{TitleSize},
);
next ID if !%FAQ;
# add FAQ data
%Data = ( %Data, %FAQ );
# build record block
$LayoutObject->Block(
Name => 'Record',
Data => {
%Param,
%Data,
},
);
# build column record blocks
if (@ShowColumns) {
COLUMN:
for my $Column (@ShowColumns) {
# do not show language column if FAQ does not support multiple languages
next COLUMN if ( $Column eq 'Language' && !$MultiLanguage );
$LayoutObject->Block(
Name => 'Record' . $Column,
Data => {
%Param,
%Data,
},
);
# do not display columns as links in the customer frontend
next COLUMN if $Param{Frontend} eq 'Customer';
# show links if available
$LayoutObject->Block(
Name => 'Record' . $Column . 'LinkStart',
Data => {
%Param,
%Data,
},
);
$LayoutObject->Block(
Name => 'Record' . $Column . 'LinkEnd',
Data => {
%Param,
%Data,
},
);
}
}
# Dynamic fields
DYNAMICFIELD:
for my $DynamicFieldConfig ( @{$DynamicField} ) {
next DYNAMICFIELD if !IsHashRefWithData($DynamicFieldConfig);
# get field value
my $Value = $DynamicFieldBackendObject->ValueGet(
DynamicFieldConfig => $DynamicFieldConfig,
ObjectID => $ID,
);
my $ValueStrg = $DynamicFieldBackendObject->DisplayValueRender(
DynamicFieldConfig => $DynamicFieldConfig,
Value => $Value,
ValueMaxChars => 20,
LayoutObject => $LayoutObject,
);
$LayoutObject->Block(
Name => 'RecordDynamicField',
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
},
);
if ( $ValueStrg->{Link} ) {
$LayoutObject->Block(
Name => 'RecordDynamicFieldLink',
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
Link => $ValueStrg->{Link},
$DynamicFieldConfig->{Name} => $ValueStrg->{Title},
},
);
}
else {
$LayoutObject->Block(
Name => 'RecordDynamicFieldPlain',
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
},
);
}
# example of dynamic fields order customization
$LayoutObject->Block(
Name => 'RecordDynamicField_' . $DynamicFieldConfig->{Name},
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
},
);
if ( $ValueStrg->{Link} ) {
$LayoutObject->Block(
Name => 'RecordDynamicField_' . $DynamicFieldConfig->{Name} . '_Link',
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
Link => $ValueStrg->{Link},
$DynamicFieldConfig->{Name} => $ValueStrg->{Title},
},
);
}
else {
$LayoutObject->Block(
Name => 'RecordDynamicField_' . $DynamicFieldConfig->{Name} . '_Plain',
Data => {
Value => $ValueStrg->{Value},
Title => $ValueStrg->{Title},
},
);
}
}
}
}
}
else {
$LayoutObject->Block( Name => 'NoFAQFound' );
}
my $Output = $LayoutObject->Output(
TemplateFile => 'AgentFAQOverviewSmall',
Data => {
%Param,
Type => $Self->{ViewType},
ColumnCount => scalar @ShowColumns,
},
);
return $Output;
}
1;