[Rt-commit] rt branch, 4.2/link-api-refactoring, updated. rt-4.0.6-460-g5522995

Thomas Sibley trs at bestpractical.com
Thu Nov 8 14:12:50 EST 2012


The branch, 4.2/link-api-refactoring has been updated
       via  55229951d8f426912f0cf226d1e739a3994c19e0 (commit)
       via  15920f5eec0339e54d2e17a03265c51920dbafe8 (commit)
       via  141df84702a2995c16a2bbedd7e6993da97015e4 (commit)
       via  8eedf72ac4345d1c8da5e27c00f97796da740b53 (commit)
       via  8be2f819c894dc04e312b43c67bfe2b04a27cd2c (commit)
       via  b77a99316916734a058c1c53aac4f06a47183b74 (commit)
      from  5efbb007a16a965f8bdef997ce5028c3dba63c5f (commit)

Summary of changes:
 share/html/Elements/ShowLinks                      | 154 ++++++---------------
 .../ShowAttachments => Elements/ShowLinksOfType}   | 117 +++++++++-------
 share/html/Ticket/Elements/ShowMembers             |  74 ----------
 share/html/Ticket/Elements/ShowParents             |  63 ---------
 share/html/Ticket/Elements/ShowSummary             |   2 +-
 share/html/m/ticket/show                           |   4 +-
 6 files changed, 108 insertions(+), 306 deletions(-)
 copy share/html/{Ticket/Elements/ShowAttachments => Elements/ShowLinksOfType} (56%)
 mode change 100755 => 100644
 delete mode 100755 share/html/Ticket/Elements/ShowMembers
 delete mode 100644 share/html/Ticket/Elements/ShowParents

- Log -----------------------------------------------------------------
commit b77a99316916734a058c1c53aac4f06a47183b74
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Tue Nov 6 15:18:14 2012 -0800

    ShowLinks: Consolidate generation of Clone links and use RT::Link API

diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index 5e2ae1d..3585afc 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -154,25 +154,20 @@ my $path
     . $id;
 my $can_create = $Ticket->QueueObj->CurrentUserHasRight('CreateTicket');
 
-for my $relation (
-    qw(RefersTo ReferredToBy)) {
+for my $relation (grep { $_ ne "MergedInto" } RT::Link->DisplayTypes) {
     my $mode  = $RT::Link::TYPEMAP{$relation}->{Mode};
     my $type  = $RT::Link::TYPEMAP{$relation}->{Type};
-    my $other = "Local" . $mode;
     my $field = $mode eq 'Base' ? 'new-' . $type : $type . '-new';
-    $clone->{$field} 
-        = $path . "&$field="
-        . join( '%20',
-        ( map { $_->$other() } @{ $Ticket->$relation->ItemsArrayRef } ), $id );
-}
+    my @copy  = ($id);
 
-for my $relation ( qw(MemberOf Members DependsOn DependedOnBy)) {
-    my $mode  = $RT::Link::TYPEMAP{$relation}->{Mode};
-    my $type  = $RT::Link::TYPEMAP{$relation}->{Type};
-    my $field = $mode eq 'Base' ? 'new-' . $type : $type . '-new';
-    $clone->{$field} = $path . "&$field=$id";
-}
+    # Canonicalized type captures both directions
+    if ($type eq "RefersTo") {
+        my $other = "Local" . $mode;
+        push @copy, map { $_->$other() } @{ $Ticket->$relation->ItemsArrayRef };
+    }
 
+    $clone->{$field} = "$path&$field=" . join('%20', @copy);
+}
 </%INIT>
 <%ARGS>
 $Ticket => undef

commit 8be2f819c894dc04e312b43c67bfe2b04a27cd2c
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Tue Nov 6 15:28:45 2012 -0800

    ShowLinks: Construct clone links only if the current user can CreateTicket
    
    Instead of separating the CreateTicket check from the URL construction,
    simply skip constructing any clone URLs if the user can't CreateTicket
    and conditionalize the display of clone links on the presence of the
    constructed URLs themselves.
    
    A cleaner separation of concerns is useful in preparation for ShowLinks
    working on other objects other than Tickets.

diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index 3585afc..73a8120 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -48,8 +48,8 @@
 <table>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Depends on'), Relation => 'DependsOn' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'DependsOn-new'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'DependsOn-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
@@ -81,8 +81,8 @@ while ( my $link = $depends_on->Next ) {
   </tr>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'new-DependsOn'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'new-DependsOn'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
@@ -95,24 +95,24 @@ while ( my $link = $depends_on->Next ) {
   </tr>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Parents'), Relation => 'Parents' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'MemberOf-new'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'MemberOf-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value"><& /Ticket/Elements/ShowParents, Ticket => $Ticket &></td>
   </tr>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Children'), Relation => 'Children' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'new-MemberOf'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'new-MemberOf'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></td>
   </tr>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Refers to'), Relation => 'RefersTo' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'RefersTo-new'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'RefersTo-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
@@ -125,8 +125,8 @@ while ( my $link = $depends_on->Next ) {
   </tr>
   <tr>
     <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:\
-% if ($can_create) {
-        <span class="create">(<a href="<%$clone->{'new-RefersTo'}%>"><% loc('Create') %></a>)</span>
+% if (%clone) {
+        <span class="create">(<a href="<%$clone{'new-RefersTo'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
@@ -142,31 +142,31 @@ while ( my $link = $depends_on->Next ) {
 % $m->callback( %ARGS );
 </table>
 <%INIT>
+my %clone;
 
-my $id = $Ticket->id;
+if ($Ticket->QueueObj->CurrentUserHasRight('CreateTicket')) {
+    my $id = $Ticket->id;
+    my $path
+        = RT->Config->Get('WebPath')
+        . '/Ticket/Create.html?Queue='
+        . $Ticket->Queue
+        . '&CloneTicket='
+        . $id;
 
-my $clone = {};
-my $path
-    = RT->Config->Get('WebPath')
-    . '/Ticket/Create.html?Queue='
-    . $Ticket->Queue
-    . '&CloneTicket='
-    . $id;
-my $can_create = $Ticket->QueueObj->CurrentUserHasRight('CreateTicket');
+    for my $relation (grep { $_ ne "MergedInto" } RT::Link->DisplayTypes) {
+        my $mode  = $RT::Link::TYPEMAP{$relation}->{Mode};
+        my $type  = $RT::Link::TYPEMAP{$relation}->{Type};
+        my $field = $mode eq 'Base' ? 'new-' . $type : $type . '-new';
+        my @copy  = ($id);
 
-for my $relation (grep { $_ ne "MergedInto" } RT::Link->DisplayTypes) {
-    my $mode  = $RT::Link::TYPEMAP{$relation}->{Mode};
-    my $type  = $RT::Link::TYPEMAP{$relation}->{Type};
-    my $field = $mode eq 'Base' ? 'new-' . $type : $type . '-new';
-    my @copy  = ($id);
+        # Canonicalized type captures both directions
+        if ($type eq "RefersTo") {
+            my $other = "Local" . $mode;
+            push @copy, map { $_->$other() } @{ $Ticket->$relation->ItemsArrayRef };
+        }
 
-    # Canonicalized type captures both directions
-    if ($type eq "RefersTo") {
-        my $other = "Local" . $mode;
-        push @copy, map { $_->$other() } @{ $Ticket->$relation->ItemsArrayRef };
+        $clone{$field} = "$path&$field=" . join('%20', @copy);
     }
-
-    $clone->{$field} = "$path&$field=" . join('%20', @copy);
 }
 </%INIT>
 <%ARGS>

commit 8eedf72ac4345d1c8da5e27c00f97796da740b53
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Wed Nov 7 14:22:53 2012 -0800

    ShowLinks: Work with any object that isa RT::Record, not just RT::Ticket
    
    One less not-actually-generic component in the top-level /Elements/ tree.
    
    There is still a lot of room for more refactoring, simplification, and
    consistency.

diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index 73a8120..a3b2395 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -47,7 +47,7 @@
 %# END BPS TAGGED BLOCK }}}
 <table>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Depends on'), Relation => 'DependsOn' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Depends on'), Relation => 'DependsOn' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'DependsOn-new'}%>"><% loc('Create') %></a>)</span>
 % }
@@ -55,7 +55,7 @@
     <td class="value">
 <%PERL>
 my ( $depends_on, @active, @inactive, @not_tickets );
-$depends_on = $Ticket->DependsOn;
+$depends_on = $Object->DependsOn;
 
 while ( my $link = $depends_on->Next ) {
     my $target = $link->TargetObj;
@@ -80,58 +80,58 @@ while ( my $link = $depends_on->Next ) {
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'new-DependsOn'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
 <ul>
-% while (my $Link = $Ticket->DependedOnBy->Next) {
+% while (my $Link = $Object->DependedOnBy->Next) {
 <li><& ShowLink, URI => $Link->BaseURI &></li>
 % }
 </ul>
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Parents'), Relation => 'Parents' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Parents'), Relation => 'Parents' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'MemberOf-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
-    <td class="value"><& /Ticket/Elements/ShowParents, Ticket => $Ticket &></td>
+    <td class="value"><& /Elements/ShowParents, Object => $Object &></td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Children'), Relation => 'Children' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Children'), Relation => 'Children' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'new-MemberOf'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
-    <td class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></td>
+    <td class="value"><& /Elements/ShowMembers, Object => $Object &></td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Refers to'), Relation => 'RefersTo' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Refers to'), Relation => 'RefersTo' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'RefersTo-new'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
 <ul>
-% while (my $Link = $Ticket->RefersTo->Next) {
+% while (my $Link = $Object->RefersTo->Next) {
 <li><& ShowLink, URI => $Link->TargetURI &></li>
 % }
 </ul>
     </td>
   </tr>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Ticket, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:\
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:\
 % if (%clone) {
         <span class="create">(<a href="<%$clone{'new-RefersTo'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
     <ul>
-% while (my $Link = $Ticket->ReferredToBy->Next) {
+% while (my $Link = $Object->ReferredToBy->Next) {
 % next if (UNIVERSAL::isa($Link->BaseObj, 'RT::Ticket')  && $Link->BaseObj->Type eq 'reminder');
 <li><& ShowLink, URI => $Link->BaseURI &></li>
 % }
@@ -144,12 +144,14 @@ while ( my $link = $depends_on->Next ) {
 <%INIT>
 my %clone;
 
-if ($Ticket->QueueObj->CurrentUserHasRight('CreateTicket')) {
-    my $id = $Ticket->id;
+if (    $Object->isa("RT::Ticket")
+    and $Object->QueueObj->CurrentUserHasRight('CreateTicket'))
+{
+    my $id = $Object->id;
     my $path
         = RT->Config->Get('WebPath')
         . '/Ticket/Create.html?Queue='
-        . $Ticket->Queue
+        . $Object->Queue
         . '&CloneTicket='
         . $id;
 
@@ -162,7 +164,7 @@ if ($Ticket->QueueObj->CurrentUserHasRight('CreateTicket')) {
         # Canonicalized type captures both directions
         if ($type eq "RefersTo") {
             my $other = "Local" . $mode;
-            push @copy, map { $_->$other() } @{ $Ticket->$relation->ItemsArrayRef };
+            push @copy, map { $_->$other() } @{ $Object->$relation->ItemsArrayRef };
         }
 
         $clone{$field} = "$path&$field=" . join('%20', @copy);
@@ -170,5 +172,5 @@ if ($Ticket->QueueObj->CurrentUserHasRight('CreateTicket')) {
 }
 </%INIT>
 <%ARGS>
-$Ticket => undef
+$Object
 </%ARGS>
diff --git a/share/html/Ticket/Elements/ShowMembers b/share/html/Elements/ShowMembers
old mode 100755
new mode 100644
similarity index 88%
rename from share/html/Ticket/Elements/ShowMembers
rename to share/html/Elements/ShowMembers
index 1ffbda2..e6da7db
--- a/share/html/Ticket/Elements/ShowMembers
+++ b/share/html/Elements/ShowMembers
@@ -47,10 +47,10 @@
 %# END BPS TAGGED BLOCK }}}
 <ul>
 % while (my $link = $members->Next) {
-<li><& /Elements/ShowLink, URI => $link->BaseURI &><br />
+<li><& ShowLink, URI => $link->BaseURI &>
 % next if $link->BaseObj and $checked->{$link->BaseObj->id};
 % if ($depth < 8) {
-<& /Ticket/Elements/ShowMembers, Ticket => $link->BaseObj, depth => ($depth+1), checked => $checked &> 
+<& ShowMembers, Object => $link->BaseObj, depth => ($depth+1), checked => $checked &>
 % }
 </li>
 % }
@@ -58,17 +58,17 @@
 
 <%INIT>
 
-return unless $Ticket;
-my $members = $Ticket->Members;
+return unless $Object;
+my $members = $Object->Members;
 return unless $members->Count;
 
-return if $checked->{$Ticket->id};
+return if $checked->{$Object->id};
 
-$checked->{$Ticket->id} = 1;
+$checked->{$Object->id} = 1;
 </%INIT>
 
 <%ARGS>
-$Ticket => undef
+$Object => undef
 $depth => 1
 $checked => {}
 </%ARGS>
diff --git a/share/html/Ticket/Elements/ShowParents b/share/html/Elements/ShowParents
similarity index 94%
rename from share/html/Ticket/Elements/ShowParents
rename to share/html/Elements/ShowParents
index 6dd3d0d..ddc2919 100644
--- a/share/html/Ticket/Elements/ShowParents
+++ b/share/html/Elements/ShowParents
@@ -47,17 +47,17 @@
 %# END BPS TAGGED BLOCK }}}
 <ul>
 % while (my $link = $member_of->Next) {
-<li><& /Elements/ShowLink, URI => $link->TargetURI &><br />
+<li><& ShowLink, URI => $link->TargetURI &></li>
 % }
 </ul>
 <%INIT>
 
-return unless $Ticket;
-my $member_of = $Ticket->MemberOf;
+return unless $Object;
+my $member_of = $Object->MemberOf;
 return unless $member_of->Count;
 
 </%INIT>
 
 <%ARGS>
-$Ticket => undef
+$Object => undef
 </%ARGS>
diff --git a/share/html/Ticket/Elements/ShowSummary b/share/html/Ticket/Elements/ShowSummary
index 421dd9a..0f0a0a6 100755
--- a/share/html/Ticket/Elements/ShowSummary
+++ b/share/html/Ticket/Elements/ShowSummary
@@ -92,7 +92,7 @@
         ($can_modify ? (title_href => RT->Config->Get('WebPath')."/Ticket/ModifyLinks.html?id=".$Ticket->Id) : ()),
         class => 'ticket-info-links',
         @extra,
-    &><& /Elements/ShowLinks, Ticket => $Ticket &></&>
+    &><& /Elements/ShowLinks, Object => $Ticket &></&>
 % $m->callback( %ARGS, CallbackName => 'RightColumn' );
   </td>
 </tr>
diff --git a/share/html/m/ticket/show b/share/html/m/ticket/show
index f6ffe88..fa6eb14 100644
--- a/share/html/m/ticket/show
+++ b/share/html/m/ticket/show
@@ -450,11 +450,11 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
   </div>
  <div class="entry">
     <div class="label"><% loc('Parents') %>:</div>
-    <div class="value"><& /Ticket/Elements/ShowParents, Ticket => $Ticket &></div>
+    <div class="value"><& /Elements/ShowParents, Object => $Ticket &></div>
   </div>
  <div class="entry">
     <div class="label"><% loc('Children')%>:</div>
-    <div class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></div>
+    <div class="value"><& /Elements/ShowMembers, Object => $Ticket &></div>
   </div>
  <div class="entry">
     <div class="label"><% loc('Refers to')%>:</div>

commit 141df84702a2995c16a2bbedd7e6993da97015e4
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Wed Nov 7 19:28:14 2012 -0800

    ShowLinks: Refactor to remove a lot of repetition
    
    Removes the useless ShowParents element.  Moves most RT::Link loop and
    display logic into a separate component, ShowLinksOfType, where it's
    easier to make consistent changes.

diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index a3b2395..37070e3 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -47,9 +47,9 @@
 %# END BPS TAGGED BLOCK }}}
 <table>
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Depends on'), Relation => 'DependsOn' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'DependsOn-new'}%>"><% loc('Create') %></a>)</span>
+    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => $labels{'DependsOn'}, Relation => 'DependsOn' &>:\
+% if ($clone{'DependsOn'}) {
+        <span class="create">(<a href="<%$clone{'DependsOn'}%>"><% loc('Create') %></a>)</span>
 % }
     </td>
     <td class="value">
@@ -79,69 +79,34 @@ while ( my $link = $depends_on->Next ) {
 </ul>
     </td>
   </tr>
+
+% for my $type (grep { $_ ne "DependsOn" } @display) {
   <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Depended on by'), Relation => 'DependedOnBy' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'new-DependsOn'}%>"><% loc('Create') %></a>)</span>
-% }
-    </td>
-    <td class="value">
-<ul>
-% while (my $Link = $Object->DependedOnBy->Next) {
-<li><& ShowLink, URI => $Link->BaseURI &></li>
-% }
-</ul>
-    </td>
-  </tr>
-  <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Parents'), Relation => 'Parents' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'MemberOf-new'}%>"><% loc('Create') %></a>)</span>
-% }
-    </td>
-    <td class="value"><& /Elements/ShowParents, Object => $Object &></td>
-  </tr>
-  <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Children'), Relation => 'Children' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'new-MemberOf'}%>"><% loc('Create') %></a>)</span>
-% }
-    </td>
-    <td class="value"><& /Elements/ShowMembers, Object => $Object &></td>
-  </tr>
-  <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Refers to'), Relation => 'RefersTo' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'RefersTo-new'}%>"><% loc('Create') %></a>)</span>
-% }
+    <td class="labeltop">
+      <& ShowRelationLabel, Object => $Object, Label => $labels{$type}, Relation => $type &>:\
+%     if ($clone{$type}) {
+        <span class="create">(<a href="<% $clone{$type} %>"><% loc('Create') %></a>)</span>
+%     }
     </td>
     <td class="value">
-<ul>
-% while (my $Link = $Object->RefersTo->Next) {
-<li><& ShowLink, URI => $Link->TargetURI &></li>
-% }
-</ul>
+      <& ShowLinksOfType, Object => $Object, Type => $type, Recurse => ($type eq 'Members') &>
     </td>
   </tr>
-  <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => loc('Referred to by'), Relation => 'ReferredToBy' &>:\
-% if (%clone) {
-        <span class="create">(<a href="<%$clone{'new-RefersTo'}%>"><% loc('Create') %></a>)</span>
 % }
-    </td>
-    <td class="value">
-    <ul>
-% while (my $Link = $Object->ReferredToBy->Next) {
-% next if (UNIVERSAL::isa($Link->BaseObj, 'RT::Ticket')  && $Link->BaseObj->Type eq 'reminder');
-<li><& ShowLink, URI => $Link->BaseURI &></li>
-% }
-</ul>
-    </td>
-  </tr>
+
 % # Allow people to add more rows to the table
 % $m->callback( %ARGS );
 </table>
 <%INIT>
+my @display = qw(DependsOn DependedOnBy MemberOf Members RefersTo ReferredToBy);
+my %labels  = (
+    DependsOn       => loc('Depends on'),
+    DependedOnBy    => loc('Depended on by'),
+    MemberOf        => loc('Parents'),
+    Members         => loc('Children'),
+    RefersTo        => loc('Refers to'),
+    ReferredToBy    => loc('Referred to by'),
+);
 my %clone;
 
 if (    $Object->isa("RT::Ticket")
@@ -155,7 +120,7 @@ if (    $Object->isa("RT::Ticket")
         . '&CloneTicket='
         . $id;
 
-    for my $relation (grep { $_ ne "MergedInto" } RT::Link->DisplayTypes) {
+    for my $relation (@display) {
         my $mode  = $RT::Link::TYPEMAP{$relation}->{Mode};
         my $type  = $RT::Link::TYPEMAP{$relation}->{Type};
         my $field = $mode eq 'Base' ? 'new-' . $type : $type . '-new';
@@ -167,7 +132,7 @@ if (    $Object->isa("RT::Ticket")
             push @copy, map { $_->$other() } @{ $Object->$relation->ItemsArrayRef };
         }
 
-        $clone{$field} = "$path&$field=" . join('%20', @copy);
+        $clone{$relation} = "$path&$field=" . join('%20', grep { $_ } @copy);
     }
 }
 </%INIT>
diff --git a/share/html/Elements/ShowMembers b/share/html/Elements/ShowLinksOfType
similarity index 68%
rename from share/html/Elements/ShowMembers
rename to share/html/Elements/ShowLinksOfType
index e6da7db..940d9f8 100644
--- a/share/html/Elements/ShowMembers
+++ b/share/html/Elements/ShowLinksOfType
@@ -46,29 +46,56 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <ul>
-% while (my $link = $members->Next) {
-<li><& ShowLink, URI => $link->BaseURI &>
-% next if $link->BaseObj and $checked->{$link->BaseObj->id};
-% if ($depth < 8) {
-<& ShowMembers, Object => $link->BaseObj, depth => ($depth+1), checked => $checked &>
-% }
+<%perl>
+while (my $link = $links->Next) {
+    next if $Type eq "ReferredToBy"
+        and UNIVERSAL::isa($link->BaseObj, 'RT::Ticket')
+        and $link->BaseObj->Type eq 'reminder';
+
+    my $ModeURI = "${mode}URI";
+</%perl>
+<li><& ShowLink, URI => $link->$ModeURI &>
+<%perl>
+    next unless $Recurse;
+
+    my $ModeObj = "${mode}Obj";
+    my $ToObj   = $link->$ModeObj;
+
+    next if $ToObj and $checked->{$ToObj->id};
+    if ($depth <= $MaxDepth) {
+</%perl>
+<& ShowLinksOfType, %ARGS, Object => $ToObj, depth => ($depth + 1), checked => $checked &>
+%   }
 </li>
 % }
 </ul>
-
 <%INIT>
-
 return unless $Object;
-my $members = $Object->Members;
-return unless $members->Count;
+
+unless ($RT::Link::TYPEMAP{$Type}) {
+    RT->Logger->error("Unknown link Type '$ARGS{Type}'");
+    return;
+}
+
+unless ($Object->can($Type)) {
+    RT->Logger->error("Don't know how to fetch links of '$Type' for object '$Object'");
+    return;
+}
+
+my $links = $Object->$Type;
+return unless $links->Count;
 
 return if $checked->{$Object->id};
 
 $checked->{$Object->id} = 1;
-</%INIT>
 
+my $mode = $RT::Link::TYPEMAP{$Type}->{'Mode'};
+</%INIT>
 <%ARGS>
-$Object => undef
-$depth => 1
-$checked => {}
+$Object     => undef
+$Type
+$Recurse    => 0
+$MaxDepth   => 7
+$depth      => 1
+$checked    => {}
 </%ARGS>
diff --git a/share/html/Elements/ShowParents b/share/html/Elements/ShowParents
deleted file mode 100644
index ddc2919..0000000
--- a/share/html/Elements/ShowParents
+++ /dev/null
@@ -1,63 +0,0 @@
-%# BEGIN BPS TAGGED BLOCK {{{
-%#
-%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC
-%#                                          <sales at bestpractical.com>
-%#
-%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
-%# LICENSE:
-%#
-%# This work is made available to you under the terms of Version 2 of
-%# the GNU General Public License. A copy of that license should have
-%# been provided with this software, but in any event can be snarfed
-%# from www.gnu.org.
-%#
-%# This work is distributed in the hope that it will be useful, but
-%# WITHOUT ANY WARRANTY; without even the implied warranty of
-%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-%# General Public License for more details.
-%#
-%# You should have received a copy of the GNU General Public License
-%# along with this program; if not, write to the Free Software
-%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-%# 02110-1301 or visit their web page on the internet at
-%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
-%# CONTRIBUTION SUBMISSION POLICY:
-%#
-%# (The following paragraph is not intended to limit the rights granted
-%# to you to modify and distribute this software under the terms of
-%# the GNU General Public License and is only of importance to you if
-%# you choose to contribute your changes and enhancements to the
-%# community by submitting them to Best Practical Solutions, LLC.)
-%#
-%# By intentionally submitting any modifications, corrections or
-%# derivatives to this work, or any other work intended for use with
-%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
-%# you are the copyright holder for those contributions and you grant
-%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
-%# royalty-free, perpetual, license to use, copy, create derivative
-%# works based on those contributions, and sublicense and distribute
-%# those contributions and any derivatives thereof.
-%#
-%# END BPS TAGGED BLOCK }}}
-<ul>
-% while (my $link = $member_of->Next) {
-<li><& ShowLink, URI => $link->TargetURI &></li>
-% }
-</ul>
-<%INIT>
-
-return unless $Object;
-my $member_of = $Object->MemberOf;
-return unless $member_of->Count;
-
-</%INIT>
-
-<%ARGS>
-$Object => undef
-</%ARGS>
diff --git a/share/html/m/ticket/show b/share/html/m/ticket/show
index fa6eb14..db5f93a 100644
--- a/share/html/m/ticket/show
+++ b/share/html/m/ticket/show
@@ -450,11 +450,11 @@ for my $link ( @{ $Ticket->DependsOn->ItemsArrayRef } ) {
   </div>
  <div class="entry">
     <div class="label"><% loc('Parents') %>:</div>
-    <div class="value"><& /Elements/ShowParents, Object => $Ticket &></div>
+    <div class="value"><& /Elements/ShowLinksOfType, Object => $Ticket, Type => 'MemberOf' &></div>
   </div>
  <div class="entry">
     <div class="label"><% loc('Children')%>:</div>
-    <div class="value"><& /Elements/ShowMembers, Object => $Ticket &></div>
+    <div class="value"><& /Elements/ShowLinksOfType, Object => $Ticket, Type => 'Members' &></div>
   </div>
  <div class="entry">
     <div class="label"><% loc('Refers to')%>:</div>

commit 15920f5eec0339e54d2e17a03265c51920dbafe8
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Wed Nov 7 19:47:33 2012 -0800

    ShowLinksOfType: Add a callback to allow changing $Recurse and $MaxDepth
    
    It is sometimes useful to recurse on link types other than just
    Children.

diff --git a/share/html/Elements/ShowLinksOfType b/share/html/Elements/ShowLinksOfType
index 940d9f8..12e9559 100644
--- a/share/html/Elements/ShowLinksOfType
+++ b/share/html/Elements/ShowLinksOfType
@@ -90,6 +90,15 @@ return if $checked->{$Object->id};
 $checked->{$Object->id} = 1;
 
 my $mode = $RT::Link::TYPEMAP{$Type}->{'Mode'};
+
+$m->callback(
+    CallbackName => "Init",
+    ARGSRef      => \%ARGS,
+    Object       => $Object,
+    $Type        => $Type,
+    $Recurse     => \$Recurse,
+    $MaxDepth    => \$MaxDepth,
+);
 </%INIT>
 <%ARGS>
 $Object     => undef

commit 55229951d8f426912f0cf226d1e739a3994c19e0
Author: Thomas Sibley <trs at bestpractical.com>
Date:   Wed Nov 7 20:00:08 2012 -0800

    ShowLinks: Sort links in all relationship types as not tickets, active, or inactive
    
    It's useful to see inactive linked tickets last as well as to have an
    overall consistent ordering.

diff --git a/share/html/Elements/ShowLinks b/share/html/Elements/ShowLinks
index 37070e3..1f3501a 100755
--- a/share/html/Elements/ShowLinks
+++ b/share/html/Elements/ShowLinks
@@ -46,41 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <table>
-  <tr>
-    <td class="labeltop"><& ShowRelationLabel, Object => $Object, Label => $labels{'DependsOn'}, Relation => 'DependsOn' &>:\
-% if ($clone{'DependsOn'}) {
-        <span class="create">(<a href="<%$clone{'DependsOn'}%>"><% loc('Create') %></a>)</span>
-% }
-    </td>
-    <td class="value">
-<%PERL>
-my ( $depends_on, @active, @inactive, @not_tickets );
-$depends_on = $Object->DependsOn;
-
-while ( my $link = $depends_on->Next ) {
-    my $target = $link->TargetObj;
-    if ( $target && $target->isa('RT::Ticket') ) {
-        if ( $target->QueueObj->IsInactiveStatus( $target->Status ) ) {
-            push( @inactive, $link->TargetURI );
-        }
-        else {
-            push( @active, $link->TargetURI );
-        }
-    }
-    else {
-        push( @not_tickets, $link->TargetURI );
-    }
-}
-</%PERL>
-<ul>
-% for my $Link (@not_tickets, @active, @inactive) {
-<li><& ShowLink, URI => $Link &></li>
-% }
-</ul>
-    </td>
-  </tr>
-
-% for my $type (grep { $_ ne "DependsOn" } @display) {
+% for my $type (@display) {
   <tr>
     <td class="labeltop">
       <& ShowRelationLabel, Object => $Object, Label => $labels{$type}, Relation => $type &>:\
diff --git a/share/html/Elements/ShowLinksOfType b/share/html/Elements/ShowLinksOfType
index 12e9559..7ad08d2 100644
--- a/share/html/Elements/ShowLinksOfType
+++ b/share/html/Elements/ShowLinksOfType
@@ -46,22 +46,14 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <ul>
-<%perl>
-while (my $link = $links->Next) {
-    next if $Type eq "ReferredToBy"
-        and UNIVERSAL::isa($link->BaseObj, 'RT::Ticket')
-        and $link->BaseObj->Type eq 'reminder';
-
-    my $ModeURI = "${mode}URI";
-</%perl>
+% for my $link (@not_tickets, @active, @inactive) {
 <li><& ShowLink, URI => $link->$ModeURI &>
 <%perl>
     next unless $Recurse;
 
-    my $ModeObj = "${mode}Obj";
-    my $ToObj   = $link->$ModeObj;
-
+    my $ToObj = $link->$ModeObj;
     next if $ToObj and $checked->{$ToObj->id};
+
     if ($depth <= $MaxDepth) {
 </%perl>
 <& ShowLinksOfType, %ARGS, Object => $ToObj, depth => ($depth + 1), checked => $checked &>
@@ -89,7 +81,29 @@ return if $checked->{$Object->id};
 
 $checked->{$Object->id} = 1;
 
-my $mode = $RT::Link::TYPEMAP{$Type}->{'Mode'};
+my $mode    = $RT::Link::TYPEMAP{$Type}->{'Mode'};
+my $ModeURI = "${mode}URI";
+my $ModeObj = "${mode}Obj";
+
+# Filter and bucket
+my (@active, @inactive, @not_tickets);
+while (my $link = $links->Next) {
+    my $ToObj = $link->$ModeObj;
+    if ($ToObj and $ToObj->isa('RT::Ticket')) {
+        next if $Type eq "ReferredToBy"
+            and $ToObj->Type eq 'reminder';
+
+        if ( $ToObj->QueueObj->IsInactiveStatus( $ToObj->Status ) ) {
+            push @inactive, $link;
+        }
+        else {
+            push @active, $link;
+        }
+    }
+    else {
+        push @not_tickets, $link;
+    }
+}
 
 $m->callback(
     CallbackName => "Init",
@@ -98,6 +112,9 @@ $m->callback(
     $Type        => $Type,
     $Recurse     => \$Recurse,
     $MaxDepth    => \$MaxDepth,
+    active       => \@active,
+    inactive     => \@inactive,
+    not_tickets  => \@not_tickets,
 );
 </%INIT>
 <%ARGS>

-----------------------------------------------------------------------


More information about the Rt-commit mailing list