From cbc36fe3a65f4713239611a0dffd8afa0de3c46e Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 22 Jul 2010 21:01:40 +0000 Subject: [PATCH] sorting ticket results by customer custnum or name, RT#8784 --- rt/lib/RT/Tickets_Overlay.pm | 103 ++++++++++++++++++++++++++- rt/share/html/Search/Elements/DisplayOptions | 2 + 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/rt/lib/RT/Tickets_Overlay.pm b/rt/lib/RT/Tickets_Overlay.pm index 0d3264c4b..8faf3f0b4 100644 --- a/rt/lib/RT/Tickets_Overlay.pm +++ b/rt/lib/RT/Tickets_Overlay.pm @@ -1724,6 +1724,7 @@ sub OrderByCols { next; } if ( $row->{FIELD} !~ /\./ ) { + my $meta = $self->FIELDS->{ $row->{FIELD} }; unless ( $meta ) { push @res, $row; @@ -1830,7 +1831,60 @@ sub OrderByCols { } push @res, { %$row, FIELD => "Priority", ORDER => $order } ; - } + + } elsif ( $field eq 'Customer' ) { #Freeside + + my $linkalias = $self->Join( + TYPE => 'LEFT', + ALIAS1 => 'main', + FIELD1 => 'id', + TABLE2 => 'Links', + FIELD2 => 'LocalBase' + ); + + $self->SUPER::Limit( + LEFTJOIN => $linkalias, + FIELD => 'Type', + OPERATOR => '=', + VALUE => 'MemberOf', + ); + $self->SUPER::Limit( + LEFTJOIN => $linkalias, + FIELD => 'Target', + OPERATOR => 'STARTSWITH', + VALUE => 'freeside://freeside/cust_main/', + ); + + if ( $subkey eq 'Number' ) { + + push @res, { %$row, + ALIAS => $linkalias, + FIELD => "CAST(SUBSTR(Target,31) AS INTEGER)", + #ORDER => ($row->{ORDER} || 'ASC') + }; + + } elsif ( $subkey eq 'Name' ) { + + my $custalias = $self->Join( + TYPE => 'LEFT', + #ALIAS1 => $linkalias, + #FIELD1 => 'CAST(SUBSTR(Target,31) AS INTEGER)', + EXPRESSION => "CAST(SUBSTR($linkalias.Target,31) AS INTEGER)", + TABLE2 => 'cust_main', + FIELD2 => 'custnum', + + ); + + my $field = "COALESCE( $custalias.company, + $custalias.last || ', ' || $custalias.first + )"; + + push @res, { %$row, ALIAS => '', FIELD => $field }; + + } + + } #Freeside + else { push @res, $row; } @@ -1840,6 +1894,53 @@ sub OrderByCols { # }}} +#this duplicates/ovverrides the DBIx::SearchBuilder version.. +# we need to fix the "handle FUNCTION(FIELD)" stuff and this is much easier +# than patching SB +# but does this have other terrible ramifications? maybe a flag to trigger +# this specific case? +sub _OrderClause { + my $self = shift; + + return '' unless $self->{'order_by'}; + + my $clause = ''; + foreach my $row ( @{$self->{'order_by'}} ) { + + my %rowhash = ( ALIAS => 'main', + FIELD => undef, + ORDER => 'ASC', + %$row + ); + if ($rowhash{'ORDER'} && $rowhash{'ORDER'} =~ /^des/i) { + $rowhash{'ORDER'} = "DESC"; + } + else { + $rowhash{'ORDER'} = "ASC"; + } + $rowhash{'ALIAS'} = 'main' unless defined $rowhash{'ALIAS'}; + + if ( defined $rowhash{'ALIAS'} and + $rowhash{'FIELD'} and + $rowhash{'ORDER'} ) { + + if ( length $rowhash{'ALIAS'} && $rowhash{'FIELD'} =~ /^((\w+\()+)(.*\)+)$/ ) { + # handle 'FUNCTION(FIELD)' formatted fields + $rowhash{'FIELD'} = $1. $rowhash{'ALIAS'}. '.'. $3; + $rowhash{'ALIAS'} = ''; + } + + $clause .= ($clause ? ", " : " "); + $clause .= $rowhash{'ALIAS'} . "." if length $rowhash{'ALIAS'}; + $clause .= $rowhash{'FIELD'} . " "; + $clause .= $rowhash{'ORDER'}; + } + } + $clause = " ORDER BY$clause " if $clause; + + return $clause; +} + # {{{ Limit the result set based on content # {{{ sub Limit diff --git a/rt/share/html/Search/Elements/DisplayOptions b/rt/share/html/Search/Elements/DisplayOptions index 40d976cfd..7464ae936 100644 --- a/rt/share/html/Search/Elements/DisplayOptions +++ b/rt/share/html/Search/Elements/DisplayOptions @@ -115,6 +115,8 @@ $fields{$_}=1 for @cfs; # Add PAW sort $fields{'Custom.Ownership'} = 1; +$fields{"Customer.$_"} = 1 foreach qw( Number Name ); #Freeside + my @Order = split /\|/, $Order; my @OrderBy = split /\|/, $OrderBy; if ($Order =~ /\|/) { -- 2.11.0