[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> </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> </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