From f59657947edb86426879ea6e6b29d9fd9d67f677 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 21 Jan 2011 00:35:52 +0000 Subject: [PATCH] interface to view/edit saved searches, RT#10746 --- rt/FREESIDE_MODIFIED | 6 +- rt/lib/RT/SavedSearches_Local.pm | 19 ++++++ rt/share/html/Elements/RT__SavedSearch/ColumnMap | 85 ++++++++++++++++++++++++ rt/share/html/Elements/SavedSearches | 70 +++++++++++++++++++ rt/share/html/Prefs/SavedSearches.html | 10 +++ rt/share/html/Ticket/Elements/Tabs | 5 ++ 6 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 rt/lib/RT/SavedSearches_Local.pm create mode 100644 rt/share/html/Elements/RT__SavedSearch/ColumnMap create mode 100644 rt/share/html/Elements/SavedSearches create mode 100644 rt/share/html/Prefs/SavedSearches.html 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 +%# +%# +%# (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 + +<%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)); + }, + } +}; + + +<%INIT> +$m->callback( COLUMN_MAP => $COLUMN_MAP, CallbackName => 'ColumnMap', CallbackOnce => 1 ); +return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr ); + 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 &> + +% foreach my $type ('Ticket', 'Chart') { + +% } #foreach $type +
+<&|/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{__Name__/TITLE:$title}, +% '__Query__', +% qq{[Edit] } . +% qq{[Delete]/TITLE:}, +% ); +% my $format = join(',', map { "'$_'" } @cols); +<& /Elements/CollectionList, + %ARGS, + Class => 'RT::SavedSearch', + Format => $format, + Collection => $SavedSearches, + PassArguments => [qw(Format Name id)], +&> +% } #foreach $Object + +
+<%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', +); + +<%ARGS> +$user_attrs => undef +$Delete => undef + 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"; + 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} ) { -- 2.11.0