Skip to content

Commit

Permalink
Issue #3186: Further progress.
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanhaerter committed Sep 26, 2024
1 parent ecd091c commit 0276927
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 18 deletions.
52 changes: 37 additions & 15 deletions Kernel/Modules/AgentReferenceSearch.pm
Original file line number Diff line number Diff line change
Expand Up @@ -108,24 +108,46 @@ sub Run {

# Get config for the dynamic field and check the sanity.
my $DynamicFieldBackendObject = $Kernel::OM->Get('Kernel::System::DynamicField::Backend');
my $DynamicFieldConfig = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldGet(
my $InitialDynamicFieldConfig = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldGet(
Name => $FieldName,
);
if (
!IsHashRefWithData($DynamicFieldConfig)
||
!$DynamicFieldBackendObject->HasBehavior(
DynamicFieldConfig => $DynamicFieldConfig,
Behavior => 'IsReferenceField',
)
)
{
return $LayoutObject->JSONReply(
Data => {
Success => 0,
Messsage => qq{Error reading the dynamic field '$FieldName'!},
return unless IsHashRefWithData($InitialDynamicFieldConfig);

# Check if we deal with a reference field
my $IsReferenceField = $DynamicFieldBackendObject->HasBehavior(
DynamicFieldConfig => $InitialDynamicFieldConfig,
Behavior => 'IsReferenceField',
);

my $DynamicFieldConfig;
if ( !$IsReferenceField ) {

# Check if we deal with a lens field with a reference attribute field
if ( $InitialDynamicFieldConfig->{FieldType} eq 'Lens' ) {

# TODO perhaps better use 'AttributeDFConfigGet'
$DynamicFieldConfig = $Kernel::OM->Get('Kernel::System::DynamicField')->DynamicFieldGet(
ID => $InitialDynamicFieldConfig->{Config}{AttributeDF},
);
return unless IsHashRefWithData($DynamicFieldConfig);

$IsReferenceField = $DynamicFieldBackendObject->HasBehavior(
DynamicFieldConfig => $DynamicFieldConfig,
Behavior => 'IsReferenceField',
);

if ( !$IsReferenceField ) {
return $LayoutObject->JSONReply(
Data => {
Success => 0,
Messsage => qq{Error reading the dynamic field '$FieldName'!},
}
);
}
);
}
}
else {
$DynamicFieldConfig = $InitialDynamicFieldConfig;
}

# search referenced object
Expand Down
6 changes: 5 additions & 1 deletion Kernel/System/DynamicField/Driver/BaseReference.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1068,7 +1068,11 @@ sub GetFieldState {
my $DynamicFieldConfig = $Param{DynamicFieldConfig};

return () if !IsArrayRefWithData( $DynamicFieldConfig->{Config}{ReferenceFilterList} );
return () if none { $Param{ChangedElements}->{ $_->{EqualsObjectAttribute} // '' } } $DynamicFieldConfig->{Config}{ReferenceFilterList}->@*;
return ()
if (
( none { $Param{ChangedElements}->{ $_->{EqualsObjectAttribute} // '' } } $DynamicFieldConfig->{Config}{ReferenceFilterList}->@* )
&& !$Param{Lens}
);

my $Value = $Param{GetParam}{DynamicField}{ 'DynamicField_' . $DynamicFieldConfig->{Name} };

Expand Down
20 changes: 19 additions & 1 deletion Kernel/System/DynamicField/Driver/Lens.pm
Original file line number Diff line number Diff line change
Expand Up @@ -734,8 +734,26 @@ sub GetFieldState {
$DFParam->{"DynamicField_$DynamicFieldConfig->{Name}"} = $AttributeFieldValue;
}

if ($SetsDynamicContent) {

my $AttributeDFConfig = $Self->_GetAttributeDFConfig(
LensDynamicFieldConfig => $DynamicFieldConfig,
);

my %GetFieldState = $Param{DynamicFieldBackendObject}->GetFieldState(
%Param,
Lens => 1,
DynamicFieldConfig => $AttributeDFConfig,
);

return (
%GetFieldState,
%Return,
);
}

# if this field is non ACL reducible, set the field values
return %Return if ( !$IsACLReducible && !$SetsDynamicContent );
return %Return unless $IsACLReducible;

# get possible values if ACLReducible
# this is what the FieldRestrictions object would do for other fields
Expand Down
1 change: 0 additions & 1 deletion Kernel/System/DynamicField/Driver/Ticket.pm
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,6 @@ sub SearchObjects {
}

# Support restriction by ticket type when the Ticket::Type feature is activated.
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
if ( $ConfigObject->Get('Ticket::Type') && !$Param{ExternalSource} ) {
if ( IsArrayRefWithData( $DynamicFieldConfig->{Config}{TicketType} ) ) {
if ( $SearchParams{TypeIDs} || $SearchParams{Types} ) {
Expand Down
27 changes: 27 additions & 0 deletions var/httpd/htdocs/js/Core.AJAX.js
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,33 @@ Core.AJAX = (function (TargetNS) {
$Element.val( '' );
$ReferenceElement.val( '' );
}

// trigger reference search if autocomplete
if ( $Element.is('input') ) {

var $AutocompleteElement = $Element.parent().find('.DynamicFieldReference');

// check for surrounding set and if so, send setindex as request param
var SetIndexStrg = '';
var SetOuterFieldList = $Element.parents('.DFSetOuterField');
if ( SetOuterFieldList.length ) {
var MultiValueClass = Array.from(SetOuterFieldList[0].parentElement.classList).find(c => c.startsWith('MultiValue'));
if (MultiValueClass !== undefined && MultiValueClass != '') {
var SetIndexRegExp = new RegExp(/^MultiValue_(\d+)$/);
var MatchResults = SetIndexRegExp.exec(MultiValueClass);
SetIndexStrg = ';SetIndex=' + MatchResults[1];
}
}

var URL = Core.Config.Get('Baselink'),
QueryString = "Action=AgentReferenceSearch;ObjectID=" + DataValue[0][0]
+ ";Field=" + $AutocompleteElement.attr('id')
+ SetIndexStrg + ';';

QueryString += Core.AJAX.SerializeForm($Element.closest('form'), {'Action': 1, 'Subaction': 1, 'Term': 1, 'Field': 1, 'MaxResults': 1});
TargetNS.FunctionCall(URL, QueryString, function (Result) {
});
}
return;
}

Expand Down

0 comments on commit 0276927

Please sign in to comment.