From e301af9b99d4d56ccd16f1ddad5af352063185cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20H=C3=A4rter?= Date: Thu, 15 Feb 2024 16:53:16 +0100 Subject: [PATCH] Issue #2842: Copied code for DF Set ACLs to other masks which use GetFieldStates(). Fixed minor bug in CustomerTicketProcess. --- Kernel/Modules/AgentTicketActionCommon.pm | 62 +++++++++++++++++++++++ Kernel/Modules/AgentTicketEmail.pm | 62 +++++++++++++++++++++++ Kernel/Modules/AgentTicketProcess.pm | 57 +++++++++++++++++++++ Kernel/Modules/CustomerTicketMessage.pm | 62 +++++++++++++++++++++++ Kernel/Modules/CustomerTicketProcess.pm | 59 ++++++++++++++++++++- Kernel/Modules/CustomerTicketZoom.pm | 62 +++++++++++++++++++++++ 6 files changed, 363 insertions(+), 1 deletion(-) diff --git a/Kernel/Modules/AgentTicketActionCommon.pm b/Kernel/Modules/AgentTicketActionCommon.pm index 466ef846aa..7bea6312e1 100644 --- a/Kernel/Modules/AgentTicketActionCommon.pm +++ b/Kernel/Modules/AgentTicketActionCommon.pm @@ -1413,6 +1413,7 @@ sub Run { my %DynFieldStates = ( Visibility => {}, Fields => {}, + Sets => {}, ); until ( $Convergence{Fields} ) { @@ -1578,6 +1579,10 @@ sub Run { %{ $DynFieldStates{Visibility} }, %{ $CurFieldStates{Visibility} }, }; + $DynFieldStates{Sets} = { + %{ $DynFieldStates{Sets} }, + %{ $CurFieldStates{Sets} }, + }; # store new values $GetParam{DynamicField} = { @@ -1652,6 +1657,63 @@ sub Run { }; } + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + if ( IsHashRefWithData( $DynFieldStates{Visibility} ) ) { push @DynamicFieldAJAX, { Name => 'Restrictions_Visibility', diff --git a/Kernel/Modules/AgentTicketEmail.pm b/Kernel/Modules/AgentTicketEmail.pm index 42982584b9..3daaf7a192 100644 --- a/Kernel/Modules/AgentTicketEmail.pm +++ b/Kernel/Modules/AgentTicketEmail.pm @@ -2234,6 +2234,7 @@ sub Run { my %DynFieldStates = ( Visibility => {}, Fields => {}, + Sets => {}, ); until ( $Convergence{Fields} ) { @@ -2408,6 +2409,10 @@ sub Run { %{ $DynFieldStates{Visibility} }, %{ $CurFieldStates{Visibility} }, }; + $DynFieldStates{Sets} = { + %{ $DynFieldStates{Sets} }, + %{ $CurFieldStates{Sets} }, + }; # store new values $GetParam{DynamicField} = { @@ -2492,6 +2497,63 @@ sub Run { }; } + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + if ( IsHashRefWithData( $DynFieldStates{Visibility} ) ) { push @DynamicFieldAJAX, { Name => 'Restrictions_Visibility', diff --git a/Kernel/Modules/AgentTicketProcess.pm b/Kernel/Modules/AgentTicketProcess.pm index 379a9a8516..81c65c88b6 100644 --- a/Kernel/Modules/AgentTicketProcess.pm +++ b/Kernel/Modules/AgentTicketProcess.pm @@ -847,6 +847,63 @@ sub _RenderAjax { }; } + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @JSONCollector, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @JSONCollector, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + my $JSON = $LayoutObject->BuildSelectionJSON( [@JSONCollector] ); return $LayoutObject->Attachment( diff --git a/Kernel/Modules/CustomerTicketMessage.pm b/Kernel/Modules/CustomerTicketMessage.pm index 601cc635b3..ae322382ea 100644 --- a/Kernel/Modules/CustomerTicketMessage.pm +++ b/Kernel/Modules/CustomerTicketMessage.pm @@ -1136,6 +1136,7 @@ sub Run { my %DynFieldStates = ( Visibility => {}, Fields => {}, + Sets => {}, ); until ( $Convergence{Fields} ) { @@ -1305,6 +1306,10 @@ sub Run { %{ $DynFieldStates{Visibility} }, %{ $CurFieldStates{Visibility} }, }; + $DynFieldStates{Sets} = { + %{ $DynFieldStates{Sets} }, + %{ $CurFieldStates{Sets} }, + }; # store new values $GetParam{DynamicField} = { @@ -1381,6 +1386,63 @@ sub Run { }; } + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $BackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $BackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + if ( IsHashRefWithData( $DynFieldStates{Visibility} ) ) { push @DynamicFieldAJAX, { Name => 'Restrictions_Visibility', diff --git a/Kernel/Modules/CustomerTicketProcess.pm b/Kernel/Modules/CustomerTicketProcess.pm index b77bbcb93c..d47b7073c9 100644 --- a/Kernel/Modules/CustomerTicketProcess.pm +++ b/Kernel/Modules/CustomerTicketProcess.pm @@ -476,6 +476,63 @@ sub _RenderAjax { $DynFieldStates{NewValues}->%*, }; + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @JSONCollector, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $DynamicFieldBackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @JSONCollector, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + # attach process suffix to dynamic field names in visibility hash my %VisibilitySuffixed = map { $_ . $Self->{IDSuffix} => $DynFieldStates{Visibility}{$_} } keys $DynFieldStates{Visibility}->%*; @@ -3158,7 +3215,7 @@ sub _StoreActivityDialog { } # skip fields which are hidden by ACLs - elsif ( !$Visibility{ 'DynamicField_' . $DynamicFieldConfig->{Name} } ) { + elsif ( !$Visibility{ 'DynamicField_' . $DynamicFieldName } ) { next DYNAMICFIELD; } diff --git a/Kernel/Modules/CustomerTicketZoom.pm b/Kernel/Modules/CustomerTicketZoom.pm index 078daa9d40..baade4f8f5 100644 --- a/Kernel/Modules/CustomerTicketZoom.pm +++ b/Kernel/Modules/CustomerTicketZoom.pm @@ -434,6 +434,7 @@ sub Run { my %DynFieldStates = ( Visibility => {}, Fields => {}, + Sets => {}, ); until ( $Convergence{Fields} ) { @@ -597,6 +598,10 @@ sub Run { %{ $DynFieldStates{Visibility} }, %{ $CurFieldStates{Visibility} }, }; + $DynFieldStates{Sets} = { + %{ $DynFieldStates{Sets} }, + %{ $CurFieldStates{Sets} }, + }; # store new values $GetParam{DynamicField} = { @@ -673,6 +678,63 @@ sub Run { }; } + for my $SetField ( values $DynFieldStates{Sets}->%* ) { + my $DynamicFieldConfig = $SetField->{DynamicFieldConfig}; + + # the frontend name is the name of the inner field including its index or the '_Template' suffix + DYNAMICFIELD: + for my $FrontendName ( keys $SetField->{FieldStates}->%* ) { + + if ( $DynamicFieldConfig->{Config}{MultiValue} && ref $SetField->{Values}{$FrontendName} eq 'ARRAY' ) { + for my $i ( 0 .. $#{ $SetField->{Values}{$FrontendName} } ) { + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName}[$i] + : + ( + $BackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => [ $SetField->{Values}{$FrontendName}[$i] ], + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName . "_$i", + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}[$i], + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + + next DYNAMICFIELD; + } + + my $DataValues = $SetField->{FieldStates}{$FrontendName}{NotACLReducible} + ? $SetField->{Values}{$FrontendName} + : + ( + $BackendObject->BuildSelectionDataGet( + DynamicFieldConfig => $DynamicFieldConfig, + PossibleValues => $SetField->{FieldStates}{$FrontendName}{PossibleValues}, + Value => $SetField->{Values}{$FrontendName}, + ) + || $SetField->{FieldStates}{$FrontendName}{PossibleValues} + ); + + # add dynamic field to the list of fields to update + push @DynamicFieldAJAX, { + Name => 'DynamicField_' . $FrontendName, + Data => $DataValues, + SelectedID => $SetField->{Values}{$FrontendName}, + Translation => $DynamicFieldConfig->{Config}->{TranslatableValues} || 0, + Max => 100, + }; + } + } + if ( IsHashRefWithData( $DynFieldStates{Visibility} ) ) { push @DynamicFieldAJAX, { Name => 'Restrictions_Visibility',