From d08078d372873bb1aeca80132d7e96a8eb14d305 Mon Sep 17 00:00:00 2001 From: Brad Embree Date: Sun, 12 Nov 2023 20:04:32 -0800 Subject: [PATCH] Use LinkTargets autocomplete excluding existing links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit is partially based on code in pull request 203 created by: Gérald SÉDRATI gibus See https://github.com/bestpractical/rt/pull/203 --- share/html/Elements/AddLinks | 60 +++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/share/html/Elements/AddLinks b/share/html/Elements/AddLinks index 4fd52791688..32cbf9c8fe7 100644 --- a/share/html/Elements/AddLinks +++ b/share/html/Elements/AddLinks @@ -55,8 +55,52 @@ my $id = ($Object and $Object->id) ? $Object->id : "new"; -my $exclude = qq| data-autocomplete="Tickets" data-autocomplete-multiple="1"|; -$exclude .= qq| data-autocomplete-exclude="$id"| if $Object->id; +my $exclude = qq| data-autocomplete="LinkTargets" data-autocomplete-multiple="1"|; +my @excludes; +push @excludes, ( $Object->isa('RT::Asset') ? 'asset:' : '' ) . $id + if $id ne 'new'; + +my %exclude_links = ( + Depend => [ qw( DependsOn DependedOnBy ) ], + Member => [ qw( MemberOf Members ) ], + Refer => [ qw( RefersTo ReferredToBy ) ], +); +foreach my $exclude_type ( keys %exclude_links ) { + my @ids; + if ( $id ne 'new' ) { + foreach my $link_type ( @{ $exclude_links{$exclude_type} } ) { + my $links = $Object->$link_type; + while ( my $link = $links->Next ) { + my $LinkedObj = $link->TargetObj; + # if $LinkedObj is same as $Object we want the BaseObj + $LinkedObj = $link->BaseObj + if ( + ( ref($Object) eq ref($LinkedObj) ) + && + ( $id == $LinkedObj->id ) + ); + if ( $LinkedObj ) { + my $prefix = ''; + if ( $LinkedObj->isa('RT::Asset') ) { + $prefix = 'asset:'; + } + elsif ( $LinkedObj->isa('RT::Article') ) { + $prefix = 'a:'; + } + elsif ( $LinkedObj->isa('RT::Group') ) { + $prefix = 'group:'; + } + elsif ( $LinkedObj->isa('RT::User') ) { + $prefix = 'user:'; + } + push @ids, $prefix . $LinkedObj->id; + } + } + } + } + $exclude_links{$exclude_type} = $exclude . ' data-autocomplete-exclude="' . join( ' ', @excludes, @ids ) . '"' + if @excludes || @ids; +} % if (ref($Object) eq 'RT::Ticket') { <&|/l&>Enter tickets or URIs to link tickets to. Separate multiple entries with spaces. @@ -76,24 +120,24 @@ $exclude .= qq| data-autocomplete-exclude="$id"| if $Object->id; <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Depends on'), Relation => 'DependsOn') &> - " <% $exclude |n%>/> + " <% $exclude_links{Depend} |n%>/> <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Depended on by'), Relation => 'DependedOnBy') &> - " <% $exclude |n%>/> + " <% $exclude_links{Depend} |n%>/> <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Parents'), Relation => 'Parents') &> - " <% $exclude |n%>/> + " <% $exclude_links{Member} |n%>/> <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Children'), Relation => 'Children') &> - " <% $exclude |n%>/> + " <% $exclude_links{Member} |n%>/> <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Refers to'), Relation => 'RefersTo') &> - " <% $exclude |n%>/> + " <% $exclude_links{Refer} |n%>/> <&| /Elements/LabeledValue, RawLabel => $m->scomp('ShowRelationLabel', Object => $Object, Label => loc('Referred to by'), Relation => 'ReferredToBy') &> - " <% $exclude |n%>/> + " <% $exclude_links{Refer} |n%>/> <& /Elements/EditCustomFields,