summaryrefslogtreecommitdiff
path: root/rt
diff options
context:
space:
mode:
Diffstat (limited to 'rt')
-rw-r--r--rt/FREESIDE_MODIFIED6
-rw-r--r--rt/lib/RT/SavedSearches_Local.pm19
-rw-r--r--rt/share/html/Elements/RT__SavedSearch/ColumnMap85
-rw-r--r--rt/share/html/Elements/SavedSearches70
-rw-r--r--rt/share/html/Prefs/SavedSearches.html10
-rwxr-xr-xrt/share/html/Ticket/Elements/Tabs5
6 files changed, 194 insertions, 1 deletions
diff --git a/rt/FREESIDE_MODIFIED b/rt/FREESIDE_MODIFIED
index 4d5bb29d8..70801d50b 100644
--- a/rt/FREESIDE_MODIFIED
+++ b/rt/FREESIDE_MODIFIED
@@ -22,6 +22,7 @@ lib/RT/Condition/CustomFieldChange.pm #create ticket on custom field change
lib/RT/Interface/Web_Vendor.pm
lib/RT/Interface/Web/Handler.pm #freeside comp_root for dashboard emails
lib/RT/Record.pm #and customfield date patch
+lib/RT/SavedSearches_Local.pm #saved searches
lib/RT/SearchBuilder.pm #need DBIx::SearchBuilder >= 1.36 for Pg 8.1+
lib/RT/Transaction_Overlay.pm
lib/RT/Tickets_Overlay.pm #customfield date patch #SearchCustomerFields
@@ -60,6 +61,8 @@ share/html/Elements/EditCustomFieldDate #customfield date patch (NEW)
share/html/Elements/PageLayout
#html/Elements/QuickCreate
share/html/Elements/RT__Ticket/ColumnMap
+share/html/Elements/RT__SavedSearch/ColumnMap #saved searches
+share/html/Elements/SavedSearches #saved searches
share/html/Elements/ShowCustomFieldDate #customfield date patch (NEW)
share/html/Elements/SelectDate
share/html/Elements/ShowLink_Checklist
@@ -68,6 +71,7 @@ share/html/Elements/ShowLink_Checklist
share/html/Elements/SelectCustomerAgent #SearchCustomerFields
share/html/Elements/SelectCustomerClass #SearchCustomerFields
share/html/Elements/SelectCustomerTag #SearchCustomerFields
+share/html/Prefs/SavedSearches.html #saved searches
share/html/Search/Build.html
share/html/Search/Results.tsv #content-type bug fix
share/html/Search/Elements/BuildFormatString
@@ -82,7 +86,7 @@ share/html/Ticket/Elements/ShowMembers_Checklist
share/html/Ticket/Elements/BulkLinks
share/html/Ticket/Elements/ShowSummary
share/html/Ticket/Elements/ShowTransactionAttachments
- share/html/Ticket/Elements/Tabs
+ share/html/Ticket/Elements/Tabs #saved searches
share/html/Ticket/ModifyCustomers.html
html/NoAuth/css/3.5-default/main.css
html/NoAuth/css/3.5-default/misc.css
diff --git a/rt/lib/RT/SavedSearches_Local.pm b/rt/lib/RT/SavedSearches_Local.pm
new file mode 100644
index 000000000..7159bc912
--- /dev/null
+++ b/rt/lib/RT/SavedSearches_Local.pm
@@ -0,0 +1,19 @@
+# backport from RT4 RT::SharedSettings
+
+package RT::SavedSearches;
+
+use strict;
+no warnings 'redefine';
+
+sub CountAll {
+ my $self = shift;
+ return $self->Count;
+}
+
+sub GotoPage {
+ my $self = shift;
+ $self->{idx} = shift;
+}
+
+1;
+
diff --git a/rt/share/html/Elements/RT__SavedSearch/ColumnMap b/rt/share/html/Elements/RT__SavedSearch/ColumnMap
new file mode 100644
index 000000000..780ee838a
--- /dev/null
+++ b/rt/share/html/Elements/RT__SavedSearch/ColumnMap
@@ -0,0 +1,85 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2010 Best Practical Solutions, LLC
+%# <jesse@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 }}}
+<%ARGS>
+$Name
+$Attr => undef
+</%ARGS>
+<%ONCE>
+my $COLUMN_MAP = {
+ id => {
+ title => '#', # loc
+ attribute => 'id',
+ align => 'right',
+ value => sub { return $_[0]->Id },
+ },
+ Name => {
+ title => sub { return "foo" }, #'Name', # loc
+ attribute => 'Name',
+ value => sub { return $_[0]->Name()||loc("Unnamed search") },
+ },
+ Query => {
+ title => 'Query', # loc
+ attribute => 'Query',
+ value => sub { return $_[0]->GetParameter('Query') },
+ },
+ ResultsURL => {
+ title => '',
+ attribute => 'ResultsURL',
+ value => sub { my $search = shift;
+ return $m->comp('/Elements/QueryString',
+ map { $_ => $search->GetParameter($_) }
+ qw(Query Format Rows Order OrderBy PrimaryGroupBy SecondaryGroupBy ChartStyle));
+ },
+ }
+};
+
+</%ONCE>
+<%INIT>
+$m->callback( COLUMN_MAP => $COLUMN_MAP, CallbackName => 'ColumnMap', CallbackOnce => 1 );
+return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr );
+</%INIT>
diff --git a/rt/share/html/Elements/SavedSearches b/rt/share/html/Elements/SavedSearches
new file mode 100644
index 000000000..96d589fc1
--- /dev/null
+++ b/rt/share/html/Elements/SavedSearches
@@ -0,0 +1,70 @@
+<& /Elements/ListActions, actions => \@results &>
+<table width="100%"><tr>
+% foreach my $type ('Ticket', 'Chart') {
+<td width="50%">
+<&|/Widgets/TitleBox, title => loc('Saved '.$titles{$type}) &>
+% foreach my $Object (@Objects) {
+% $SavedSearches = RT::SavedSearches->new($session{CurrentUser});
+% $SavedSearches->LimitToPrivacy(join('-',ref($Object),$Object->Id), $type);
+% my $title = $titles{$type};
+% if (ref $Object eq 'RT::User' && $Object->Id == $session{CurrentUser}->Id) {
+% $title = loc("My saved ".lc($title));
+% } else {
+% $title = loc("[_1]'s saved ".lc($title),$Object->Name);
+% }
+% $title = $m->interp->apply_escapes($title, 'h');
+%
+% my $oid = join('-', ref($Object), $Object->Id, 'SavedSearch', '__id__');
+% my $resultpath = $paths{$type};
+% my @cols = (
+% qq{<a href="__WebPath__/$resultpath?__ResultsURL__">__Name__</a>/TITLE:$title},
+% '__Query__',
+% qq{<a href="__WebPath__/Search/Build.html?SavedSearchLoad=$oid">[Edit]</a>&nbsp;} .
+% qq{<a href="$uri?Delete=$oid">[Delete]</a>/TITLE:},
+% );
+% my $format = join(',', map { "'$_'" } @cols);
+<& /Elements/CollectionList,
+ %ARGS,
+ Class => 'RT::SavedSearch',
+ Format => $format,
+ Collection => $SavedSearches,
+ PassArguments => [qw(Format Name id)],
+&>
+% } #foreach $Object
+</&>
+</td>
+% } #foreach $type
+</tr></table>
+<%init>
+my @Objects;
+my $SavedSearches = RT::SavedSearches->new($session{'CurrentUser'});
+push @Objects, $SavedSearches->_PrivacyObjects;
+push @Objects, RT::System->new( $session{'CurrentUser'} )
+ if $session{'CurrentUser'}->HasRight( Object=> $RT::System,
+ Right => 'SuperUser' );
+
+my $uri = '__WebPath__'.$m->request_path;
+
+my @results;
+if ( $Delete =~ /(.*)-SavedSearch-(\d+)/) {
+ my ($privacy, $id) = ($1, $2);
+ my $record = RT::SavedSearch->new($session{'CurrentUser'});
+ $record->Load($privacy, $id);
+ if ( $record->Id ) {
+ my ($status, $msg) = $record->Delete;
+ push @results, $msg;
+ }
+ else {
+ push @results, "Saved search #$Delete not found";
+ }
+}
+
+my %titles = ( 'Ticket' => 'Searches', 'Chart' => 'Charts' );
+my %paths = ( 'Ticket' => 'Search/Results.html',
+ 'Chart' => 'Search/Chart.html',
+);
+</%init>
+<%ARGS>
+$user_attrs => undef
+$Delete => undef
+</%ARGS>
diff --git a/rt/share/html/Prefs/SavedSearches.html b/rt/share/html/Prefs/SavedSearches.html
new file mode 100644
index 000000000..fe9859ca4
--- /dev/null
+++ b/rt/share/html/Prefs/SavedSearches.html
@@ -0,0 +1,10 @@
+<& /Elements/Header, Title => $title, &>
+<& /Ticket/Elements/Tabs,
+ current_tab => "Prefs/SavedSearches.html",
+ Title => $title,
+&>
+<& /Elements/SavedSearches, %ARGS &>
+
+<%INIT>
+my $title = "Saved Searches";
+</%INIT>
diff --git a/rt/share/html/Ticket/Elements/Tabs b/rt/share/html/Ticket/Elements/Tabs
index 6943a2703..d4725fa50 100755
--- a/rt/share/html/Ticket/Elements/Tabs
+++ b/rt/share/html/Ticket/Elements/Tabs
@@ -332,6 +332,11 @@ if ($has_query) {
title => loc('Graph'),
};
+ $tabs->{"l"} = {
+ path => "Prefs/SavedSearches.html",
+ title => 'Saved Searches',
+ };
+
}
foreach my $searchtab ( keys %{$searchtabs} ) {