[Rt-commit] [svn] r1376 - in rt/branches/3.2-RELEASE: . html/Elements html/Elements/CollectionAsTable html/Elements/RT__Ticket html/Search html/Search/Elements lib/RT

jesse at pallas.eruditorum.org jesse at pallas.eruditorum.org
Tue Aug 31 00:22:50 EDT 2004


Author: jesse
Date: Tue Aug 31 00:22:49 2004
New Revision: 1376

Added:
   rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/
   rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Header
   rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/ParseFormat
   rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Row
   rt/branches/3.2-RELEASE/html/Elements/RT__Ticket/
   rt/branches/3.2-RELEASE/html/Elements/RT__Ticket/ColumnMap
Modified:
   rt/branches/3.2-RELEASE/   (props changed)
   rt/branches/3.2-RELEASE/html/Elements/TicketList
   rt/branches/3.2-RELEASE/html/Search/Elements/PickBasics
   rt/branches/3.2-RELEASE/html/Search/Results.html
   rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay.pm
   rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay_SQL.pm
Log:
 ----------------------------------------------------------------------
 r8457 at tinbook:  jesse | 2004-08-29T01:52:08.449173Z
 Refactored the TicketList compnent to be more reusable
 ----------------------------------------------------------------------
 r8458 at tinbook:  jesse | 2004-08-29T02:41:50.808026Z
 Adding a callback for a customer
 ----------------------------------------------------------------------
 r8471 at tinbook:  jesse | 2004-08-31T04:20:29.035587Z
 Fixed the callback in Results.html to not flake out when we've got interesting %ARGS coming into it.
 
 ----------------------------------------------------------------------
 r8472 at tinbook:  jesse | 2004-08-31T04:21:47.346418Z
 Added "DependedOnBy" to TicketSQL  to mean what it means elsewhere.
 
 Made TicketSQL let you search by ticket type
 
 ----------------------------------------------------------------------


Added: rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Header
==============================================================================
--- (empty file)
+++ rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Header	Tue Aug 31 00:22:49 2004
@@ -0,0 +1,91 @@
+%# BEGIN LICENSE BLOCK;
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# 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.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+
+<%ARGS>
+ at Format => undef
+$AllowSorting => undef
+$Order=>undef
+$BaseURL => undef
+$Query => undef
+$Rows => undef
+$Page => undef
+$maxitems => undef
+</%ARGS>
+<TR>
+<%perl>
+
+my %generic_query_args = ( Query => $Query, Rows => $Rows, Page => $Page );
+
+my $item = 0;
+$$maxitems = 0;
+foreach my $col (@Format) {
+    $item++;
+    $$maxitems = $item if $item > $$maxitems;
+    if ( $col->{title} eq 'NEWLINE' ) {
+        $m->out('</TR>       <TR>');
+	$item = 0;
+    }
+    else {
+        $m->out('<TH align="center">');
+        my $title = $col->{title};
+        $title =~ s/^__(.*)__$/$1/o;
+        $title = ( $m->comp('/Elements/RT__Ticket/ColumnMap', 
+                     Name => $title, 
+                     Attr => 'title' 
+                 )  
+                     || $title
+                 );
+        if (   $AllowSorting
+            && $col->{'attribute'}
+            && $m->comp('/Elements/RT__Ticket/ColumnMap',
+                          Name => $col->{'attribute'},
+                          Attr => 'attribute' ) 
+           )
+        {
+
+            $m->out(
+                '<a href="' . $BaseURL 
+                  . $m->comp(
+                    '/Elements/QueryString',
+                    %generic_query_args,
+                    OrderBy => (
+                        $m->comp('/Elements/RT__Ticket/ColumnMap',
+                          Name => $col->{'attribute'},
+                          Attr => 'attribute' 
+                    )
+                          || $col->{'attribute'}
+                    ),
+                    Order => ( $ARGS{'Order'} eq 'ASC' ? 'DESC' : 'ASC' )
+                  ).
+                  '">' . loc($title) . '</a>'
+            );
+        }
+        else {
+            $m->out( loc($title) );
+        }
+        $m->out('</TH>');
+    }
+}
+</%perl>
+</TR>

Added: rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/ParseFormat
==============================================================================
--- (empty file)
+++ rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/ParseFormat	Tue Aug 31 00:22:49 2004
@@ -0,0 +1,81 @@
+%# BEGIN LICENSE BLOCK;
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# 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.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+
+<%ARGS>
+$Format
+</%ARGS>
+
+<%init>
+use Regexp::Common qw(delimited);
+my @Columns;
+#my $quoted = qr[$RE{delimited}{-delim=>qq{\'\"}}|(?:\{|\}|\w|\.)+];
+my $justquoted = qr[$RE{delimited}{-delim=>qq{\'\"}}];
+#my $quoted =        $RE{quoted}{-esc};
+my $word = qr [(?:\{|\}|\w|\.)+];
+
+while ($Format =~ /($justquoted|$word)/igx) {
+    my $col = $1;
+
+    if ($col =~ /^$RE{quoted}{-esc}$/) {
+        substr($col,0,1) = "";
+        substr($col,-1,1) = "";
+    }
+
+    my $colref;
+    if ( $col =~ s/\/STYLE:(.*?)$//io ) {
+        $colref->{'style'} = $1;
+    }
+    if ( $col =~ s/\/CLASS:(.*?)$//io ) {
+        $colref->{'class'} = $1;
+    }
+    if ( $col =~ s/\/TITLE:(.*?)$//io ) {
+        $colref->{'title'} = $1;
+    }
+    if ( $col =~ /__(.*?)__/gio ) {
+        my @subcols;
+        while ( $col =~ s/^(.*?)__(.*?)__//o ) {
+            push ( @subcols, $1 ) if ($1);
+            push ( @subcols, "__$2__" );
+            $colref->{'attribute'} = $2;
+        }
+        push ( @subcols, $col );
+        @{ $colref->{'output'} } = @subcols;
+    }
+    else {
+        @{ $colref->{'output'} } = ( "__" . $col . "__" );
+        $colref->{'attribute'} = $col;
+    }
+    
+    if ( !$colref->{'title'} && grep { /^__(.*?)__$/io }
+        @{ $colref->{'output'} } )
+    {   
+        $colref->{'title'}     = $1;
+        $colref->{'attribute'} = $1;
+    }
+
+
+    push @Columns, $colref;
+}
+    return(@Columns);
+</%init>

Added: rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Row
==============================================================================
--- (empty file)
+++ rt/branches/3.2-RELEASE/html/Elements/CollectionAsTable/Row	Tue Aug 31 00:22:49 2004
@@ -0,0 +1,69 @@
+%# BEGIN LICENSE BLOCK;
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# 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.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+
+<%ARGS>
+$i => undef
+ at Format => undef
+$record => undef
+$maxitems => undef
+$Depth => undef
+$Warning => undef
+</%ARGS>
+
+<%PERL>
+$m->out( '<TR class="' . ( $Warning ? 'warnline' : $i % 2 ? 'oddline' : 'evenline' ) . '" >' );
+my $item;
+foreach my $column (@Format) {
+    if ( $column->{title} eq 'NEWLINE' ) {
+	while ($item < $maxitems) {
+	    $m->out("<td>&nbsp;</td>\n");
+	    $item++;
+	}
+	$item = 0;
+        $m->out('</TR>');
+        $m->out( '<TR class="' . 
+               ( $Warning ? 'warnline' : $i % 2 ? 'oddline' : 'evenline' ) . '" >' );
+        next;
+    }
+    $item++;
+    $m->out('<td align="left">');
+    foreach my $subcol ( @{ $column->{output} } ) {
+        if ( $subcol =~ /^__(.*?)__$/o ) {
+            my $col = $1;
+            my $value = $m->comp('/Elements/RT__Ticket/ColumnMap', Name => $col, Attr => 'value');
+
+            if ( $value && ref($value)) {
+                $m->out( &{ $value } ( $record, $i ) );
+            } else {
+                $m->out($value );
+            }
+        }
+        else {
+            $m->out( Encode::decode_utf8($subcol) );
+        }
+    }
+    $m->out('</td>');
+}
+$m->out('</TR>');
+</%PERL>

Added: rt/branches/3.2-RELEASE/html/Elements/RT__Ticket/ColumnMap
==============================================================================
--- (empty file)
+++ rt/branches/3.2-RELEASE/html/Elements/RT__Ticket/ColumnMap	Tue Aug 31 00:22:49 2004
@@ -0,0 +1,387 @@
+%# BEGIN LICENSE BLOCK;
+%# 
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
+%# 
+%# (Except where explictly superceded by other copyright notices)
+%# 
+%# 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.
+%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
+%# 
+%# 
+%# END LICENSE BLOCK
+
+<%ARGS>
+$Name => undef
+$Attr => undef
+</%ARGS>
+
+<%perl>
+return ColumnMap($Name, $Attr);
+</%perl>
+
+<%INIT>
+our ( $COLUMN_MAP, $CUSTOM_FIELD_MAP );
+
+sub ColumnMap {
+    my $name = shift;
+    my $attr = shift;
+
+    # First deal with the simple things from the map
+    if ( $COLUMN_MAP->{$name} ) {
+        return ( $COLUMN_MAP->{$name}->{$attr} );
+    }
+
+    # now, let's deal with harder things, like Custom Fields
+
+    elsif ( $name =~ /^(?:CF|CustomField).(.*)$/ ) {
+        my $field = $1;
+        my $cf;
+        if ( $CUSTOM_FIELD_MAP->{$field} ) {
+            $cf = $CUSTOM_FIELD_MAP->{$field};
+        }
+        else {
+
+            $cf = RT::CustomField->new( $session{'CurrentUser'} );
+
+            if ( $field =~ /^(.+?)\.{(.+)}$/ ) {
+                $cf->LoadByNameAndQueue( Queue => $1, Name => $2 );
+            }
+            else {
+                $field = $1 if $field =~ /^{(.+)}$/;    # trim { }
+                $cf->LoadByNameAndQueue( Queue => "0", Name => $field );
+            }
+            $CUSTOM_FIELD_MAP->{$field} = $cf if ( $cf->id );
+        }
+
+        unless ( $cf->id ) {
+            return undef;
+        }
+
+        if ( $attr eq 'attribute' ) {
+            return (undef);
+        }
+        elsif ( $attr eq 'title' ) {
+            return ( $cf->Name );
+        }
+        elsif ( $attr eq 'value' ) {
+            my $value = eval "sub {
+                    my \$values = \$_[0]->CustomFieldValues('" . $cf->id . "');
+                    return ( join( ', ', map { \$_->Content } \@{ \$values->ItemsArrayRef } ))
+                  }" || die $@;
+            return ($value);
+        }
+    }
+}
+
+$COLUMN_MAP = {
+    QueueName => {
+        attribute => 'Queue',
+        title     => 'Queue',
+        value     => sub { return $_[0]->QueueObj->Name }
+    },
+    OwnerName => {
+        title     => 'Owner',
+        attribute => 'Owner',
+        value     => sub { return $_[0]->OwnerObj->Name }
+    },
+    id => {
+        attribute => 'id',
+        align     => 'right',
+        value     => sub { return $_[0]->id }
+    },
+    Status => {
+        attribute => 'Status',
+        value     => sub { return $_[0]->Status }
+    },
+    Subject => {
+        attribute => 'Subject',
+        value => sub { return $_[0]->Subject || "(" . loc('No subject') . ")" }
+    },
+    ExtendedStatus => {
+        title     => 'Status',
+        attribute => 'Status',
+        value     => sub {
+            my $Ticket = shift;
+
+            if ( $Ticket->HasUnresolvedDependencies ) {
+                if (   $Ticket->HasUnresolvedDependencies( Type => 'approval' )
+                    or $Ticket->HasUnresolvedDependencies( Type => 'code' ) )
+                {
+                    return "<em>" . loc('(pending approval)') . "</em>";
+                }
+                else {
+                    return "<em>" . loc('(pending other Collection)') . "</em>";
+                }
+            }
+            else {
+                return loc( $Ticket->Status );
+            }
+
+          }
+    },
+    Priority => {
+        attribute => 'Priority',
+        value     => sub { return $_[0]->Priority }
+    },
+    InitialPriority => {
+        attribute => 'InitialPriority',
+        value     => sub { return $_[0]->InitialPriority }
+    },
+    FinalPriority => {
+        attribute => 'FinalPriority',
+        value     => sub { return $_[0]->FinalPriority }
+    },
+    EffectiveId => {
+        attribute => 'EffectiveId',
+        value     => sub { return $_[0]->EffectiveId }
+    },
+    Type => {
+        attribute => 'Type',
+        value     => sub { return $_[0]->Type }
+    },
+    TimeWorked => {
+        attribute => 'TimeWorked',
+        value     => sub { return $_[0]->TimeWorked }
+    },
+    TimeLeft => {
+        attribute => 'TimeLeft',
+        value     => sub { return $_[0]->TimeLeft }
+    },
+    TimeEstimated => {
+        attribute => 'TimeEstimated',
+        value     => sub { return $_[0]->TimeEstimated }
+    },
+    Requestors => {
+        value => sub { return $_[0]->Requestors->MemberEmailAddressesAsString }
+    },
+    Cc => {
+        value => sub { return $_[0]->Cc->MemberEmailAddressesAsString }
+    },
+    AdminCc => {
+        value => sub { return $_[0]->AdminCc->MemberEmailAddressesAsString }
+    },
+    StartsRelative => {
+        title     => 'Starts',
+        attribute => 'Starts',
+        value     => sub { return $_[0]->StartsObj->AgeAsString }
+    },
+    StartedRelative => {
+        title     => 'Started',
+        attribute => 'Started',
+        value     => sub { return $_[0]->StartedObj->AgeAsString }
+    },
+    CreatedRelative => {
+        title     => 'Created',
+        attribute => 'Created',
+        value     => sub { return $_[0]->CreatedObj->AgeAsString }
+    },
+    LastUpdatedRelative => {
+        title     => 'LastUpdated',
+        attribute => 'LastUpdated',
+        value     => sub { return $_[0]->LastUpdatedObj->AgeAsString }
+    },
+    ToldRelative => {
+        title     => 'Told',
+        attribute => 'Told',
+        value     => sub { return $_[0]->ToldObj->AgeAsString }
+    },
+    DueRelative => {
+        title     => 'Due',
+        attribute => 'Due',
+        value     => sub { return $_[0]->DueObj->AgeAsString }
+    },
+    ResolvedRelative => {
+        title     => 'Resolved',
+        attribute => 'Resolved',
+        value     => sub { return $_[0]->ResolvedObj->AgeAsString }
+    },
+    Starts => {
+        attribute => 'Starts',
+        value     => sub { return $_[0]->StartsObj->AsString }
+    },
+    Started => {
+        attribute => 'Started',
+        value     => sub { return $_[0]->StartedObj->AsString }
+    },
+    Created => {
+        attribute => 'Created',
+        value     => sub { return $_[0]->CreatedObj->AsString }
+    },
+    CreatedBy => {
+        attribute => 'CreatedBy',
+        value     => sub { return $_[0]->CreatorObj->Name }
+    },
+    LastUpdated => {
+        attribute => 'LastUpdated',
+        value     => sub { return $_[0]->LastUpdatedObj->AsString }
+    },
+    LastUpdatedBy => {
+        attribute => 'LastUpdatedBy',
+        value     => sub { return $_[0]->LastUpdatedByObj->Name }
+    },
+    Told => {
+        attribute => 'Told',
+        value     => sub { return $_[0]->ToldObj->AsString }
+    },
+    Due => {
+        attribute => 'Due',
+        value     => sub { return $_[0]->DueObj->AsString }
+    },
+    Resolved => {
+        attribute => 'Resolved',
+        value     => sub { return $_[0]->ResolvedObj->AsString }
+    },
+
+    DependedOnBy => {
+        value => sub {
+            my $links = $_[0]->DependedOnBy;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->BaseURI->Resolver->HREF . '">'
+                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    Members => {
+        value => sub {
+            my $links = $_[0]->Members;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->BaseURI->Resolver->HREF . '">'
+                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    Children => {
+        value => sub {
+            my $links = $_[0]->Members;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->BaseURI->Resolver->HREF . '">'
+                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    ReferredToBy => {
+        value => sub {
+            my $links = $_[0]->ReferredToBy;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->BaseURI->Resolver->HREF . '">'
+                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+
+    DependsOn => {
+        value => sub {
+            my $links = $_[0]->DependsOn;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->TargetURI->Resolver->HREF . '">'
+                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    MemberOf => {
+        value => sub {
+            my $links = $_[0]->MemberOf;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->TargetURI->Resolver->HREF . '">'
+                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    Parents => {
+        value => sub {
+            my $links = $_[0]->MemberOf;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->TargetURI->Resolver->HREF . '">'
+                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+    RefersTo => {
+        value => sub {
+            my $links = $_[0]->RefersTo;
+            return (
+                join(
+                    "<br>",
+                    map {
+                            '<A HREF="'
+                          . $_->TargetURI->Resolver->HREF . '">'
+                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
+                          . '</A>'
+                      } @{ $links->ItemsArrayRef }
+                )
+            );
+          }
+    },
+
+    '_CLASS' => {
+        value => sub { return $_[1] % 2 ? 'oddline' : 'evenline' }
+    },
+
+};
+
+
+
+# }}}
+$m->comp( '/Elements/Callback', COLUMN_MAP    => $COLUMN_MAP, _CallbackName => 'ColumnMap');
+</%INIT>

Modified: rt/branches/3.2-RELEASE/html/Elements/TicketList
==============================================================================
--- rt/branches/3.2-RELEASE/html/Elements/TicketList	(original)
+++ rt/branches/3.2-RELEASE/html/Elements/TicketList	Tue Aug 31 00:22:49 2004
@@ -1,14 +1,8 @@
-%# {{{ BEGIN BPS TAGGED BLOCK
+%# BEGIN LICENSE BLOCK;
 %# 
-%# COPYRIGHT:
-%#  
-%# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
-%#                                          <jesse at bestpractical.com>
+%# Copyright (c) 1996-2003 Jesse Vincent <jesse at bestpractical.com>
 %# 
-%# (Except where explicitly superseded by other copyright notices)
-%# 
-%# 
-%# LICENSE:
+%# (Except where explictly superceded by other copyright notices)
 %# 
 %# 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
@@ -20,31 +14,22 @@
 %# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-%# 
+%# Unless otherwise specified, all modifications, corrections or
+%# extensions to this work which alter its source code become the
+%# property of Best Practical Solutions, LLC when submitted for
+%# inclusion in the work.
 %# 
-%# 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
+%# END LICENSE BLOCK
+
+%# If you're having TicketList display a single record, you need
+%# to wrap the calls in your own table(s).
+% unless (defined $SingleRecord) {
 <TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%>
-<& .Header, 
+% }
+
+% if ($ShowHeader) {
+<& /Elements/CollectionAsTable/Header, 
     Format => \@Format, 
     AllowSorting => $AllowSorting, 
     Order => $Order, 
@@ -54,14 +39,23 @@
     OrderBy => $OrderBy , 
     BaseURL => $BaseURL,
     maxitems => \$maxitems &> 
+% }
 
-% my $i;
-% while (my $record = $Collection->Next) {
-% $i++;
-<& .Row, Format => \@Format, i => $i, record => $record, maxitems => $maxitems &>
+% if (defined $SingleRecord) {
+<&   /Elements/CollectionAsTable/Row, Format => \@Format, i => 0, record => $SingleRecord, maxitems => $maxitems &>
+% } else {
+%   my $i;
+%   while (my $record = $Collection->Next) {
+%   $i++;
+<&   /Elements/CollectionAsTable/Row, Format => \@Format, i => $i, record => $record, maxitems => $maxitems &>
+%   }
 % }
+
+% unless (defined $SingleRecord) {
 </TABLE>
-% if ($Rows && $ShowNavigation) {
+% }
+
+% if ($ShowNavigation) {
 <hr>
 <&|/l, $Page, int($TotalFound/$Rows)+1&>Page [_1] of [_2]</&>
 
@@ -91,551 +85,37 @@
 <%INIT>
 my $maxitems;
 
-use vars qw($COLUMN_MAP $CUSTOM_FIELD_MAP);
-
 $Format ||= $RT::DefaultSearchResultFormat;
 # Scrub the html of the format string to remove any potential nasties.
 $Format = $m->comp('/Elements/ScrubHTML', Content => $Format);
 
-
-# {{{ item map
-
-sub ColumnMap {
-    my $name = shift;
-    my $attr = shift;
-
-    # First deal with the simple things from the map
-    if ( $COLUMN_MAP->{$name} ) {
-        return ( $COLUMN_MAP->{$name}->{$attr} );
-    }
-
-    # now, let's deal with harder things, like Custom Fields
-
-    elsif ( $name =~ /^(?:CF|CustomField).(.*)$/ ) {
-        my $field = $1;
-        my $cf;
-        if ( $CUSTOM_FIELD_MAP->{$field} ) {
-            $cf = $CUSTOM_FIELD_MAP->{$field};
-        }
-        else {
-
-            $cf = RT::CustomField->new( $session{'CurrentUser'} );
-
-            if ( $field =~ /^(.+?)\.{(.+)}$/ ) {
-                $cf->LoadByNameAndQueue( Queue => $1, Name => $2 );
-            }
-            else {
-                $field = $1 if $field =~ /^{(.+)}$/;    # trim { }
-                $cf->LoadByNameAndQueue( Queue => "0", Name => $field );
-            }
-            $CUSTOM_FIELD_MAP->{$field} = $cf if ( $cf->id );
-        }
-
-        unless ( $cf->id ) {
-            return undef;
-        }
-
-        if ( $attr eq 'attribute' ) {
-            return (undef);
-        }
-        elsif ( $attr eq 'title' ) {
-            return ( $cf->Name );
-        }
-        elsif ( $attr eq 'value' ) {
-	    my $value = eval "sub {
-                    my \$values = \$_[0]->CustomFieldValues('".$cf->id."');
-                    return ( join( ', ', map { \$_->Content } \@{ \$values->ItemsArrayRef } ))
-                  }" || die $@;
-            return($value);
-	}
-    }
-}
-$COLUMN_MAP = {
-    QueueName => {
-        attribute => 'Queue',
-        title => 'Queue',
-        value => sub { return $_[0]->QueueObj->Name }
-    },
-    OwnerName => {
-        title => 'Owner',
-        attribute => 'Owner',
-        value => sub { return $_[0]->OwnerObj->Name }
-    },
-    id => {
-        attribute => 'id',
-        align => 'right',
-        value => sub { return $_[0]->id }
-    },
-    Status => {
-        attribute => 'Status',
-        value => sub { return $_[0]->Status }
-    },
-    Subject => {
-        attribute => 'Subject',
-        value => sub { length( $_[0]->Subject) ? $_[0]->Subject : "(".loc('No subject').")" }
-    },
-    ExtendedStatus => {
-        title => 'Status',
-        attribute => 'Status',
-        value => sub {
-            my $Ticket = shift;
-
-            if ( $Ticket->HasUnresolvedDependencies ) {
-                if ( $Ticket->HasUnresolvedDependencies( Type => 'approval' )
-                    or $Ticket->HasUnresolvedDependencies( Type => 'code' ) )
-                {
-                    return "<em>" . loc('(pending approval)') . "</em>";
-                }
-                else {
-                    return "<em>" . loc('(pending other Collection)') . "</em>";
-                }
-            }
-            else {
-                return loc( $Ticket->Status );
-            }
-
-        }
-    }, Priority => {
-        attribute => 'Priority',
-        value => sub { return $_[0]->Priority }
-    },
-    InitialPriority => {
-        attribute => 'InitialPriority',
-        value => sub { return $_[0]->InitialPriority }
-    },
-    FinalPriority => {
-        attribute => 'FinalPriority',
-        value => sub { return $_[0]->FinalPriority }
-    },
-    EffectiveId => {
-        attribute => 'EffectiveId',
-        value => sub { return $_[0]->EffectiveId }
-    },
-    Type => {
-        attribute => 'Type',
-        value => sub { return $_[0]->Type }
-    },
-    TimeWorked => {
-        attribute => 'TimeWorked',
-        value => sub { return $_[0]->TimeWorked }
-    },
-    TimeLeft => {
-        attribute => 'TimeLeft',
-        value => sub { return $_[0]->TimeLeft }
-    },
-    TimeEstimated => {
-        attribute => 'TimeEstimated',
-        value => sub { return $_[0]->TimeEstimated }
-    },
-    Requestors => {
-        value => sub { return $_[0]->Requestors->MemberEmailAddressesAsString }
-    },
-    Cc => {
-        value => sub { return $_[0]->Cc->MemberEmailAddressesAsString }
-    },
-    AdminCc => {
-        value => sub { return $_[0]->AdminCc->MemberEmailAddressesAsString }
-    },
-    StartsRelative => {
-        title => 'Starts',
-        attribute => 'Starts',
-        value => sub { return $_[0]->StartsObj->AgeAsString }
-    },
-    StartedRelative => {
-        title => 'Started',
-        attribute => 'Started',
-        value => sub { return $_[0]->StartedObj->AgeAsString }
-    },
-    CreatedRelative => {
-        title => 'Created',
-        attribute => 'Created',
-        value => sub { return $_[0]->CreatedObj->AgeAsString }
-    },
-    LastUpdatedRelative => {
-        title => 'LastUpdated',
-        attribute => 'LastUpdated',
-        value => sub { return $_[0]->LastUpdatedObj->AgeAsString }
-    },
-    ToldRelative => {
-        title => 'Told',
-        attribute => 'Told',
-        value => sub { return $_[0]->ToldObj->AgeAsString }
-    },
-    DueRelative => {
-        title => 'Due',
-        attribute => 'Due',
-        value => sub { return $_[0]->DueObj->AgeAsString }
-    },
-    ResolvedRelative => {
-        title => 'Resolved',
-        attribute => 'Resolved',
-        value => sub { return $_[0]->ResolvedObj->AgeAsString }
-    },
-    Starts => {
-        attribute => 'Starts',
-        value => sub { return $_[0]->StartsObj->AsString }
-    },
-    Started => {
-        attribute => 'Started',
-        value => sub { return $_[0]->StartedObj->AsString }
-    },
-    Created => {
-        attribute => 'Created',
-        value => sub { return $_[0]->CreatedObj->AsString }
-    },
-    CreatedBy => {
-	attribute => 'CreatedBy',
-        value => sub { return $_[0]->CreatorObj->Name }
-    },
-    LastUpdated => {
-        attribute => 'LastUpdated',
-        value => sub { return $_[0]->LastUpdatedObj->AsString }
-    },
-    LastUpdatedBy => {
-        attribute => 'LastUpdatedBy',
-        value => sub { return $_[0]->LastUpdatedByObj->Name }
-    },
-    Told => {
-        attribute => 'Told',
-        value => sub { return $_[0]->ToldObj->AsString }
-    },
-    Due => {
-        attribute => 'Due',
-        value => sub { return $_[0]->DueObj->AsString }
-    },
-    Resolved => {
-        attribute => 'Resolved',
-        value => sub { return $_[0]->ResolvedObj->AsString }
-    },
-
-    DependedOnBy => {
-        value => sub {
-            my $links = $_[0]->DependedOnBy;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->BaseURI->Resolver->HREF . '">'
-                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    Members => {
-        value => sub {
-            my $links = $_[0]->Members;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->BaseURI->Resolver->HREF . '">'
-                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    Children => {
-        value => sub {
-            my $links = $_[0]->Members;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->BaseURI->Resolver->HREF . '">'
-                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    ReferredToBy => {
-        value => sub {
-            my $links = $_[0]->ReferredToBy;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->BaseURI->Resolver->HREF . '">'
-                          . ( $_->BaseIsLocal ? $_->LocalBase : $_->Base )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-
-    DependsOn => {
-        value => sub {
-            my $links = $_[0]->DependsOn;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->TargetURI->Resolver->HREF . '">'
-                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    MemberOf => {
-        value => sub {
-            my $links = $_[0]->MemberOf;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->TargetURI->Resolver->HREF . '">'
-                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    Parents => {
-        value => sub {
-            my $links = $_[0]->MemberOf;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->TargetURI->Resolver->HREF . '">'
-                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-    RefersTo => {
-        value => sub {
-            my $links = $_[0]->RefersTo;
-            return (
-                join(
-                    "<br>",
-                    map {
-                            '<A HREF="'
-                          . $_->TargetURI->Resolver->HREF . '">'
-                          . ( $_->TargetIsLocal ? $_->LocalTarget : $_->Target )
-                          . '</A>'
-                      } @{ $links->ItemsArrayRef } ) );
-          }
-    },
-
-
-
-
-    '_CLASS' => {
-        value => sub { return  $_[1] %2 ? 'oddline' : 'evenline' } 
-        },
-
-};
-
-# }}}
+$Rows ||= '25'; # we need a positive value
 
 unless ($Collection) {
         $Collection = RT::Tickets->new($session{'CurrentUser'});
         $Collection->FromSQL($Query);
 }
 
-my (@Format) = $m->comp('.ParseColumnDefinitions', Format => $Format);
-    
+my (@Format) = $m->comp('/Elements/CollectionAsTable/ParseFormat', Format => $Format);
 
 $Collection->OrderBy(FIELD => $OrderBy, ORDER => $Order); 
-$Collection->RowsPerPage($Rows) if ($Rows);
+$Collection->RowsPerPage($Rows);
 $Collection->GotoPage($Page-1); # SB uses page 0 as the first page
 my $TotalFound =  $Collection->CountAll();
 
-
-
-
-
 </%INIT>
 <%ARGS>
 $Query => undef
-$Rows => 50
+$Rows => 10
 $Page => 1
 $Title => 'Ticket Search'
 $Collection => undef
+$SingleRecord => undef
 $AllowSorting => undef
 $Order => undef
 $OrderBy => undef
 $BaseURL => undef
 $Format => $RT::DefaultSearchResultFormat
 $ShowNavigation => 1
+$ShowHeader => 1
 </%ARGS>
-%#### SUB COMPONENTS
-%#
-%#
-%# {{{ Header
-<%DEF .Header>
-<%ARGS>
- at Format => undef
-$AllowSorting => undef
-$Order=>undef
-$BaseURL => undef
-$Query => undef
-$Rows => undef
-$Page => undef
-$maxitems => undef
-</%ARGS>
-<TR>
-<%perl>
-
-
-
-my %generic_query_args = ( Query => $Query, Rows => $Rows, Page => $Page );
-
-my $item = 0;
-$$maxitems = 0;
-foreach my $col (@Format) {
-    $item++;
-    $$maxitems = $item if $item > $$maxitems;
-    if ( $col->{title} eq 'NEWLINE' ) {
-        $m->out('</TR>       <TR>');
-	$item = 0;
-    }
-    else {
-        $m->out('<TH align="center">');
-        my $title = $col->{title};
-        $title =~ s/^__(.*)__$/$1/o;
-        $title = ( ColumnMap( $title, 'title' ) || $title );
-        if (   $AllowSorting
-            && $col->{'attribute'}
-            && ColumnMap( $col->{'attribute'}, 'attribute' ) )
-        {
-
-            $m->out(
-                '<a href="' . $BaseURL 
-                  . $m->comp(
-                    '/Elements/QueryString',
-                    %generic_query_args,
-                    OrderBy => (
-                        ColumnMap( $col->{'attribute'}, 'attribute' )
-                          || $col->{'attribute'}
-                    ),
-                    Order => ( $ARGS{'Order'} eq 'ASC' ? 'DESC' : 'ASC' )
-                  ).
-                  '">' . loc($title) . '</a>'
-            );
-        }
-        else {
-            $m->out( loc($title) );
-        }
-        $m->out('</TH>');
-    }
-}
-</%perl>
-</TR>
-</%DEF>
-%# }}}
-%# {{{ Row
-<%DEF .Row>
-<%ARGS>
-$i => undef
- at Format => undef
-$record => undef
-$maxitems => undef
-</%ARGS>
-<%PERL>
-$m->out( '<TR class="' . ( $i % 2 ? 'oddline' : 'evenline' ) . '" >' );
-my $item;
-foreach my $column (@Format) {
-    if ( $column->{title} eq 'NEWLINE' ) {
-	while ($item < $maxitems) {
-	    $m->out("<td>&nbsp;</td>\n");
-	    $item++;
-	}
-	$item = 0;
-        $m->out('</TR>');
-        $m->out( '<TR class="' . ( $i % 2 ? 'oddline' : 'evenline' ) . '" >' );
-        next;
-    }
-    $item++;
-    $m->out('<td align="left">');
-    foreach my $subcol ( @{ $column->{output} } ) {
-        if ( $subcol =~ /^__(.*?)__$/o ) {
-            my $col = $1;
-            my $value = ColumnMap($col, 'value');
-
-            if ( $value && ref($value)) {
-                $m->out( &{ $value } ( $record, $i ) );
-            } else {
-                $m->out($value );
-            }
-        }
-        else {
-            $m->out( Encode::decode_utf8($subcol) );
-        }
-    }
-    $m->out('</td>');
-}
-$m->out('</TR>');
-</%PERL>
-
-
-</%DEF>
-%# }}}
-%# {{{ ParseColumnDefinitions
-
-<%DEF .ParseColumnDefinitions >
-<%ARGS>
-$Format => "id, Subject"
-</%ARGS>
-
-<%init>
-
-use Regexp::Common qw(delimited);
-my @Columns;
-#my $quoted = qr[$RE{delimited}{-delim=>qq{\'\"}}|(?:\{|\}|\w|\.)+];
-my $justquoted = qr[$RE{delimited}{-delim=>qq{\'\"}}];
-#my $quoted =        $RE{quoted}{-esc};
-my $word = qr [(?:\{|\}|\w|\.)+];
-
-while ($Format =~ /($justquoted|$word)/igx) {
-    my $col = $1;
-
-    if ($col =~ /^$RE{quoted}{-esc}$/) {
-        substr($col,0,1) = "";
-        substr($col,-1,1) = "";
-    }
-
-    my $colref;
-    if ( $col =~ s/\/STYLE:(.*?)$//io ) {
-        $colref->{'style'} = $1;
-    }
-    if ( $col =~ s/\/CLASS:(.*?)$//io ) {
-        $colref->{'class'} = $1;
-    }
-    if ( $col =~ s/\/TITLE:(.*?)$//io ) {
-        $colref->{'title'} = $1;
-    }
-    if ( $col =~ /__(.*?)__/gio ) {
-        my @subcols;
-        while ( $col =~ s/^(.*?)__(.*?)__//o ) {
-            push ( @subcols, $1 ) if ($1);
-            push ( @subcols, "__$2__" );
-            $colref->{'attribute'} = $2;
-        }
-        push ( @subcols, $col );
-        @{ $colref->{'output'} } = @subcols;
-    }
-    else {
-        @{ $colref->{'output'} } = ( "__" . $col . "__" );
-        $colref->{'attribute'} = $col;
-    }
-    
-    if ( !$colref->{'title'} && grep { /^__(.*?)__$/io }
-        @{ $colref->{'output'} } )
-    {   
-        $colref->{'title'}     = $1;
-        $colref->{'attribute'} = $1;
-    }
-
-
-    push @Columns, $colref;
-}
-    return(@Columns);
-</%init>
-</%DEF>
-%# }}}

Modified: rt/branches/3.2-RELEASE/html/Search/Elements/PickBasics
==============================================================================
--- rt/branches/3.2-RELEASE/html/Search/Elements/PickBasics	(original)
+++ rt/branches/3.2-RELEASE/html/Search/Elements/PickBasics	Tue Aug 31 00:22:49 2004
@@ -165,7 +165,7 @@
 % }
 </td></tr>
 % }
-
+<& '/Elements/Callback', _CallbackName => 'EndOfList' &>
 <%INIT>
 my @fields = ('Attachment',
     'Queue',

Modified: rt/branches/3.2-RELEASE/html/Search/Results.html
==============================================================================
--- rt/branches/3.2-RELEASE/html/Search/Results.html	(original)
+++ rt/branches/3.2-RELEASE/html/Search/Results.html	Tue Aug 31 00:22:49 2004
@@ -70,7 +70,7 @@
 <a href="<%$RT::WebPath%>/Search/Results.tsv<%$QueryString%>"><&|/l&>spreadsheet</&></a> |
 <a href="<%$RT::WebPath%>/Search/Results.rdf<%$QueryString%>"><&|/l&>RSS</&></a> |
 <a href="<%$RT::WebPath%>/Tools/Offline.html<%$QueryString%>"><&|/l&>Work offline</&></a><br>
-<& /Elements/Callback, %ARGS, _CallbackName => 'SearchActions', QueryString => $QueryString&>
+<& /Elements/Callback, _CallbackName => 'SearchActions', QueryString => $QueryString&>
 </div>
 <%INIT>
 my ($title, $ticketcount);

Modified: rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay.pm	(original)
+++ rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay.pm	Tue Aug 31 00:22:49 2004
@@ -107,6 +107,7 @@
     RefersTo        => ['LINK' => To => 'RefersTo',],
     HasMember	    => ['LINK' => From => 'MemberOf',],
     DependentOn     => ['LINK' => From => 'DependsOn',],
+    DependedOnBy     => ['LINK' => From => 'DependsOn',],
     ReferredToBy    => ['LINK' => From => 'RefersTo',],
 #   HasDepender	    => ['LINK',],
 #   RelatedTo	    => ['LINK',],
@@ -118,7 +119,6 @@
     LastUpdated	    => ['DATE' => 'LastUpdated',],
     Created	    => ['DATE' => 'Created',],
     Subject	    => ['STRING',],
-    Type	    => ['STRING',],
     Content	    => ['TRANSFIELD',],
     ContentType	    => ['TRANSFIELD',],
     Filename        => ['TRANSFIELD',],
@@ -864,6 +864,7 @@
     }
 
     if ($args{'FIELD'} eq 'Type') {
+    warn "We're loooking at the type";
         $self->{'looking_at_type'} = 1;
     }
 

Modified: rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay_SQL.pm
==============================================================================
--- rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay_SQL.pm	(original)
+++ rt/branches/3.2-RELEASE/lib/RT/Tickets_Overlay_SQL.pm	Tue Aug 31 00:22:49 2004
@@ -83,11 +83,19 @@
 }
 
 sub _SQLLimit {
+  my $self = shift;
+    my %args = (@_);
+    if ($args{'FIELD'} eq 'EffectiveId') {
+        $self->{'looking_at_effective_id'} = 1;
+    }      
+    
+    if ($args{'FIELD'} eq 'Type') {
+        $self->{'looking_at_type'} = 1;
+    }
+
   # All SQL stuff goes into one SB subclause so we can deal with all
   # the aggregation
-  my $this = shift;
-
-  $this->SUPER::Limit(@_,
+  $self->SUPER::Limit(%args,
                       SUBCLAUSE => 'ticketsql');
 }
 


More information about the Rt-commit mailing list